No public description

PiperOrigin-RevId: 590720690
Change-Id: Ie6278c1f06064e2ee64cf68eb82a3e0f21368673
diff --git a/LICENSE b/LICENSE
index d244392..e4499b0 100644
--- a/LICENSE
+++ b/LICENSE
@@ -340,10 +340,7 @@
 THE SOFTWARE.
 
 -----------------------------------------------------------
-GNU General Public License, version 2,
-with the Classpath Exception
-
-The GNU General Public License (GPL)
+GNU General Public License
 
 Version 2, June 1991
 
@@ -1851,8 +1848,7 @@
 Copyright (c) 1997, 1998, 1999, 2004 The NetBSD Foundation, Inc.
 All rights reserved.
 
-This code is derived from software contributed to The NetBSD Foundation
-by Luke Mewburn.
+This code is derived from software contributed to The NetBSD Foundation by
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions
@@ -1887,10 +1883,6 @@
 -------------------------------------------------------------------
 Unlicense
 
-Code written by Trevor Perrin, Kees Bos, Sam Rushing, Dimitris Moraitis,
-Marcelo Fernandez, Martin von Loewis, Dave Baggett, and Yngve Pettersen is 
-available under the following terms:
-
 This is free and unencumbered software released into the public domain.
 
 Anyone is free to copy, modify, publish, use, compile, sell, or distribute
@@ -1911,6 +1903,8 @@
 ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
+For more information, please refer to <https://unlicense.org>
+
 -------------------------------------------------------------------
 University of Illinois/NCSA
 Open Source License
@@ -2521,3 +2515,4038 @@
 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.
+-------------------------------------------------------------------
+Mozilla Public License, version 2.0
+
+1. Definitions
+
+1.1. "Contributor"
+
+     means each individual or legal entity that creates, contributes to the
+     creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+
+     means the combination of the Contributions of others (if any) used by a
+     Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+
+     means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+
+     means Source Code Form to which the initial Contributor has attached the
+     notice in Exhibit A, the Executable Form of such Source Code Form, and
+     Modifications of such Source Code Form, in each case including portions
+     thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+     means
+
+     a. that the initial Contributor has attached the notice described in
+        Exhibit B to the Covered Software; or
+
+     b. that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the terms of
+        a Secondary License.
+
+1.6. "Executable Form"
+
+     means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+
+     means a work that combines Covered Software with other material, in a
+     separate file or files, that is not Covered Software.
+
+1.8. "License"
+
+     means this document.
+
+1.9. "Licensable"
+
+     means having the right to grant, to the maximum extent possible, whether
+     at the time of the initial grant or subsequently, any and all of the
+     rights conveyed by this License.
+
+1.10. "Modifications"
+
+     means any of the following:
+
+     a. any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered Software; or
+
+     b. any new file in Source Code Form that contains any Covered Software.
+
+1.11. "Patent Claims" of a Contributor
+
+      means any patent claim(s), including without limitation, method,
+      process, and apparatus claims, in any patent Licensable by such
+      Contributor that would be infringed, but for the grant of the License,
+      by the making, using, selling, offering for sale, having made, import,
+      or transfer of either its Contributions or its Contributor Version.
+
+1.12. "Secondary License"
+
+      means either the GNU General Public License, Version 2.0, the GNU Lesser
+      General Public License, Version 2.1, the GNU Affero General Public
+      License, Version 3.0, or any later versions of those licenses.
+
+1.13. "Source Code Form"
+
+      means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+
+      means an individual or a legal entity exercising rights under this
+      License. For legal entities, "You" includes any entity that controls, is
+      controlled by, or is under common control with You. For purposes of this
+      definition, "control" means (a) the power, direct or indirect, to cause
+      the direction or management of such entity, whether by contract or
+      otherwise, or (b) ownership of more than fifty percent (50%) of the
+      outstanding shares or beneficial ownership of such entity.
+
+
+2. License Grants and Conditions
+
+2.1. Grants
+
+     Each Contributor hereby grants You a world-wide, royalty-free,
+     non-exclusive license:
+
+     a. under intellectual property rights (other than patent or trademark)
+        Licensable by such Contributor to use, reproduce, make available,
+        modify, display, perform, distribute, and otherwise exploit its
+        Contributions, either on an unmodified basis, with Modifications, or
+        as part of a Larger Work; and
+
+     b. under Patent Claims of such Contributor to make, use, sell, offer for
+        sale, have made, import, and otherwise transfer either its
+        Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+     The licenses granted in Section 2.1 with respect to any Contribution
+     become effective for each Contribution on the date the Contributor first
+     distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+     The licenses granted in this Section 2 are the only rights granted under
+     this License. No additional rights or licenses will be implied from the
+     distribution or licensing of Covered Software under this License.
+     Notwithstanding Section 2.1(b) above, no patent license is granted by a
+     Contributor:
+
+     a. for any code that a Contributor has removed from Covered Software; or
+
+     b. for infringements caused by: (i) Your and any other third party's
+        modifications of Covered Software, or (ii) the combination of its
+        Contributions with other software (except as part of its Contributor
+        Version); or
+
+     c. under Patent Claims infringed by Covered Software in the absence of
+        its Contributions.
+
+     This License does not grant any rights in the trademarks, service marks,
+     or logos of any Contributor (except as may be necessary to comply with
+     the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+     No Contributor makes additional grants as a result of Your choice to
+     distribute the Covered Software under a subsequent version of this
+     License (see Section 10.2) or under the terms of a Secondary License (if
+     permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+     Each Contributor represents that the Contributor believes its
+     Contributions are its original creation(s) or it has sufficient rights to
+     grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+     This License is not intended to limit any rights You have under
+     applicable copyright doctrines of fair use, fair dealing, or other
+     equivalents.
+
+2.7. Conditions
+
+     Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
+     Section 2.1.
+
+
+3. Responsibilities
+
+3.1. Distribution of Source Form
+
+     All distribution of Covered Software in Source Code Form, including any
+     Modifications that You create or to which You contribute, must be under
+     the terms of this License. You must inform recipients that the Source
+     Code Form of the Covered Software is governed by the terms of this
+     License, and how they can obtain a copy of this License. You may not
+     attempt to alter or restrict the recipients' rights in the Source Code
+     Form.
+
+3.2. Distribution of Executable Form
+
+     If You distribute Covered Software in Executable Form then:
+
+     a. such Covered Software must also be made available in Source Code Form,
+        as described in Section 3.1, and You must inform recipients of the
+        Executable Form how they can obtain a copy of such Source Code Form by
+        reasonable means in a timely manner, at a charge no more than the cost
+        of distribution to the recipient; and
+
+     b. You may distribute such Executable Form under the terms of this
+        License, or sublicense it under different terms, provided that the
+        license for the Executable Form does not attempt to limit or alter the
+        recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+     You may create and distribute a Larger Work under terms of Your choice,
+     provided that You also comply with the requirements of this License for
+     the Covered Software. If the Larger Work is a combination of Covered
+     Software with a work governed by one or more Secondary Licenses, and the
+     Covered Software is not Incompatible With Secondary Licenses, this
+     License permits You to additionally distribute such Covered Software
+     under the terms of such Secondary License(s), so that the recipient of
+     the Larger Work may, at their option, further distribute the Covered
+     Software under the terms of either this License or such Secondary
+     License(s).
+
+3.4. Notices
+
+     You may not remove or alter the substance of any license notices
+     (including copyright notices, patent notices, disclaimers of warranty, or
+     limitations of liability) contained within the Source Code Form of the
+     Covered Software, except that You may alter any license notices to the
+     extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+     You may choose to offer, and to charge a fee for, warranty, support,
+     indemnity or liability obligations to one or more recipients of Covered
+     Software. However, You may do so only on Your own behalf, and not on
+     behalf of any Contributor. You must make it absolutely clear that any
+     such warranty, support, indemnity, or liability obligation is offered by
+     You alone, and You hereby agree to indemnify every Contributor for any
+     liability incurred by such Contributor as a result of warranty, support,
+     indemnity or liability terms You offer. You may include additional
+     disclaimers of warranty and limitations of liability specific to any
+     jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+
+   If it is impossible for You to comply with any of the terms of this License
+   with respect to some or all of the Covered Software due to statute,
+   judicial order, or regulation then You must: (a) comply with the terms of
+   this License to the maximum extent possible; and (b) describe the
+   limitations and the code they affect. Such description must be placed in a
+   text file included with all distributions of the Covered Software under
+   this License. Except to the extent prohibited by statute or regulation,
+   such description must be sufficiently detailed for a recipient of ordinary
+   skill to be able to understand it.
+
+5. Termination
+
+5.1. The rights granted under this License will terminate automatically if You
+     fail to comply with any of its terms. However, if You become compliant,
+     then the rights granted under this License from a particular Contributor
+     are reinstated (a) provisionally, unless and until such Contributor
+     explicitly and finally terminates Your grants, and (b) on an ongoing
+     basis, if such Contributor fails to notify You of the non-compliance by
+     some reasonable means prior to 60 days after You have come back into
+     compliance. Moreover, Your grants from a particular Contributor are
+     reinstated on an ongoing basis if such Contributor notifies You of the
+     non-compliance by some reasonable means, this is the first time You have
+     received notice of non-compliance with this License from such
+     Contributor, and You become compliant prior to 30 days after Your receipt
+     of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+     infringement claim (excluding declaratory judgment actions,
+     counter-claims, and cross-claims) alleging that a Contributor Version
+     directly or indirectly infringes any patent, then the rights granted to
+     You by any and all Contributors for the Covered Software under Section
+     2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user
+     license agreements (excluding distributors and resellers) which have been
+     validly granted by You or Your distributors under this License prior to
+     termination shall survive termination.
+
+6. Disclaimer of Warranty
+
+   Covered Software is provided under this License on an "as is" basis,
+   without warranty of any kind, either expressed, implied, or statutory,
+   including, without limitation, warranties that the Covered Software is free
+   of defects, merchantable, fit for a particular purpose or non-infringing.
+   The entire risk as to the quality and performance of the Covered Software
+   is with You. Should any Covered Software prove defective in any respect,
+   You (not any Contributor) assume the cost of any necessary servicing,
+   repair, or correction. This disclaimer of warranty constitutes an essential
+   part of this License. No use of  any Covered Software is authorized under
+   this License except under this disclaimer.
+
+7. Limitation of Liability
+
+   Under no circumstances and under no legal theory, whether tort (including
+   negligence), contract, or otherwise, shall any Contributor, or anyone who
+   distributes Covered Software as permitted above, be liable to You for any
+   direct, indirect, special, incidental, or consequential damages of any
+   character including, without limitation, damages for lost profits, loss of
+   goodwill, work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses, even if such party shall have been
+   informed of the possibility of such damages. This limitation of liability
+   shall not apply to liability for death or personal injury resulting from
+   such party's negligence to the extent applicable law prohibits such
+   limitation. Some jurisdictions do not allow the exclusion or limitation of
+   incidental or consequential damages, so this exclusion and limitation may
+   not apply to You.
+
+8. Litigation
+
+   Any litigation relating to this License may be brought only in the courts
+   of a jurisdiction where the defendant maintains its principal place of
+   business and such litigation shall be governed by laws of that
+   jurisdiction, without reference to its conflict-of-law provisions. Nothing
+   in this Section shall prevent a party's ability to bring cross-claims or
+   counter-claims.
+
+9. Miscellaneous
+
+   This License represents the complete agreement concerning the subject
+   matter hereof. If any provision of this License is held to be
+   unenforceable, such provision shall be reformed only to the extent
+   necessary to make it enforceable. Any law or regulation which provides that
+   the language of a contract shall be construed against the drafter shall not
+   be used to construe this License against a Contributor.
+
+
+10. Versions of the License
+
+10.1. New Versions
+
+      Mozilla Foundation is the license steward. Except as provided in Section
+      10.3, no one other than the license steward has the right to modify or
+      publish new versions of this License. Each version will be given a
+      distinguishing version number.
+
+10.2. Effect of New Versions
+
+      You may distribute the Covered Software under the terms of the version
+      of the License under which You originally received the Covered Software,
+      or under the terms of any subsequent version published by the license
+      steward.
+
+10.3. Modified Versions
+
+      If you create software not governed by this License, and you want to
+      create a new license for such software, you may create and use a
+      modified version of this License if you rename the license and remove
+      any references to the name of the license steward (except to note that
+      such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+      Licenses If You choose to distribute Source Code Form that is
+      Incompatible With Secondary Licenses under the terms of this version of
+      the License, the notice described in Exhibit B of this License must be
+      attached.
+
+Exhibit A - Source Code Form License Notice
+
+      This Source Code Form is subject to the
+      terms of the Mozilla Public License, v.
+      2.0. If a copy of the MPL was not
+      distributed with this file, You can
+      obtain one at
+      http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular file,
+then You may include the notice in a location (such as a LICENSE file in a
+relevant directory) where a recipient would be likely to look for such a
+notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+
+      This Source Code Form is "Incompatible
+      With Secondary Licenses", as defined by
+      the Mozilla Public License, v. 2.0.
+-------------------------------------------------------------------
+BoringSSL is a fork of OpenSSL. As such, large parts of it fall under OpenSSL
+licensing. Files that are completely new have a Google copyright and an ISC
+license. This license is reproduced at the bottom of this file.
+
+Contributors to BoringSSL are required to follow the CLA rules for Chromium:
+https://cla.developers.google.com/clas
+
+Files in third_party/ have their own licenses, as described therein. The MIT
+license, for third_party/fiat, which, unlike other third_party directories, is
+compiled into non-test libraries, is included below.
+
+The OpenSSL toolkit stays under a dual license, i.e. both the conditions of the
+OpenSSL License and the original SSLeay license apply to the toolkit. See below
+for the actual license texts. Actually both licenses are BSD-style Open Source
+licenses. In case of any license issues related to OpenSSL please contact
+openssl-core@openssl.org.
+
+The following are Google-internal bug numbers where explicit permission from
+some authors is recorded for use of their work. (This is purely for our own
+record keeping.)
+  27287199
+  27287880
+  27287883
+
+  OpenSSL License
+  ---------------
+
+/* ====================================================================
+ * Copyright (c) 1998-2011 The OpenSSL Project.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ *    software must display the following acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ *    endorse or promote products derived from this software without
+ *    prior written permission. For written permission, please contact
+ *    openssl-core@openssl.org.
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ *    nor may "OpenSSL" appear in their names without prior written
+ *    permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ *    acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 OpenSSL PROJECT OR
+ * ITS 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 product includes cryptographic software written by Eric Young
+ * (eay@cryptsoft.com).  This product includes software written by Tim
+ * Hudson (tjh@cryptsoft.com).
+ *
+ */
+
+ Original SSLeay License
+ -----------------------
+
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ *
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ *
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. 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.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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 AUTHOR 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.
+ *
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+-------------------------------------------------------------------
+                    The FreeType Project LICENSE
+                    ----------------------------
+
+                            2006-Jan-27
+
+                    Copyright 1996-2002, 2006 by
+          David Turner, Robert Wilhelm, and Werner Lemberg
+
+
+
+Introduction
+============
+
+  The FreeType  Project is distributed in  several archive packages;
+  some of them may contain, in addition to the FreeType font engine,
+  various tools and  contributions which rely on, or  relate to, the
+  FreeType Project.
+
+  This  license applies  to all  files found  in such  packages, and
+  which do not  fall under their own explicit  license.  The license
+  affects  thus  the  FreeType   font  engine,  the  test  programs,
+  documentation and makefiles, at the very least.
+
+  This  license   was  inspired  by  the  BSD,   Artistic,  and  IJG
+  (Independent JPEG  Group) licenses, which  all encourage inclusion
+  and  use of  free  software in  commercial  and freeware  products
+  alike.  As a consequence, its main points are that:
+
+    o We don't promise that this software works. However, we will be
+      interested in any kind of bug reports. (`as is' distribution)
+
+    o You can  use this software for whatever you  want, in parts or
+      full form, without having to pay us. (`royalty-free' usage)
+
+    o You may not pretend that  you wrote this software.  If you use
+      it, or  only parts of it,  in a program,  you must acknowledge
+      somewhere  in  your  documentation  that  you  have  used  the
+      FreeType code. (`credits')
+
+  We  specifically  permit  and  encourage  the  inclusion  of  this
+  software, with  or without modifications,  in commercial products.
+  We  disclaim  all warranties  covering  The  FreeType Project  and
+  assume no liability related to The FreeType Project.
+
+
+  Finally,  many  people  asked  us  for  a  preferred  form  for  a
+  credit/disclaimer to use in compliance with this license.  We thus
+  encourage you to use the following text:
+
+   """
+    Portions of this software are copyright © &lt;year&gt; The FreeType
+    Project (www.freetype.org).  All rights reserved.
+   """
+
+  Please replace &lt;year&gt; with the value from the FreeType version you
+  actually use.
+
+
+Legal Terms
+===========
+
+0. Definitions
+--------------
+
+  Throughout this license,  the terms `package', `FreeType Project',
+  and  `FreeType  archive' refer  to  the  set  of files  originally
+  distributed  by the  authors  (David Turner,  Robert Wilhelm,  and
+  Werner Lemberg) as the `FreeType Project', be they named as alpha,
+  beta or final release.
+
+  `You' refers to  the licensee, or person using  the project, where
+  `using' is a generic term including compiling the project's source
+  code as  well as linking it  to form a  `program' or `executable'.
+  This  program is  referred to  as  `a program  using the  FreeType
+  engine'.
+
+  This  license applies  to all  files distributed  in  the original
+  FreeType  Project,   including  all  source   code,  binaries  and
+  documentation,  unless  otherwise  stated   in  the  file  in  its
+  original, unmodified form as  distributed in the original archive.
+  If you are  unsure whether or not a particular  file is covered by
+  this license, you must contact us to verify this.
+
+  The FreeType  Project is copyright (C) 1996-2000  by David Turner,
+  Robert Wilhelm, and Werner Lemberg.  All rights reserved except as
+  specified below.
+
+1. No Warranty
+--------------
+
+  THE FREETYPE PROJECT  IS PROVIDED `AS IS' WITHOUT  WARRANTY OF ANY
+  KIND, EITHER  EXPRESS OR IMPLIED,  INCLUDING, BUT NOT  LIMITED TO,
+  WARRANTIES  OF  MERCHANTABILITY   AND  FITNESS  FOR  A  PARTICULAR
+  PURPOSE.  IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS
+  BE LIABLE  FOR ANY DAMAGES CAUSED  BY THE USE OR  THE INABILITY TO
+  USE, OF THE FREETYPE PROJECT.
+
+2. Redistribution
+-----------------
+
+  This  license  grants  a  worldwide, royalty-free,  perpetual  and
+  irrevocable right  and license to use,  execute, perform, compile,
+  display,  copy,   create  derivative  works   of,  distribute  and
+  sublicense the  FreeType Project (in  both source and  object code
+  forms)  and  derivative works  thereof  for  any  purpose; and  to
+  authorize others  to exercise  some or all  of the  rights granted
+  herein, subject to the following conditions:
+
+    o Redistribution of  source code  must retain this  license file
+      (`FTL.TXT') unaltered; any  additions, deletions or changes to
+      the original  files must be clearly  indicated in accompanying
+      documentation.   The  copyright   notices  of  the  unaltered,
+      original  files must  be  preserved in  all  copies of  source
+      files.
+
+    o Redistribution in binary form must provide a  disclaimer  that
+      states  that  the software is based in part of the work of the
+      FreeType Team,  in  the  distribution  documentation.  We also
+      encourage you to put an URL to the FreeType web page  in  your
+      documentation, though this isn't mandatory.
+
+  These conditions  apply to any  software derived from or  based on
+  the FreeType Project,  not just the unmodified files.   If you use
+  our work, you  must acknowledge us.  However, no  fee need be paid
+  to us.
+
+3. Advertising
+--------------
+
+  Neither the  FreeType authors and  contributors nor you  shall use
+  the name of the  other for commercial, advertising, or promotional
+  purposes without specific prior written permission.
+
+  We suggest,  but do not require, that  you use one or  more of the
+  following phrases to refer  to this software in your documentation
+  or advertising  materials: `FreeType Project',  `FreeType Engine',
+  `FreeType library', or `FreeType Distribution'.
+
+  As  you have  not signed  this license,  you are  not  required to
+  accept  it.   However,  as  the FreeType  Project  is  copyrighted
+  material, only  this license, or  another one contracted  with the
+  authors, grants you  the right to use, distribute,  and modify it.
+  Therefore,  by  using,  distributing,  or modifying  the  FreeType
+  Project, you indicate that you understand and accept all the terms
+  of this license.
+
+4. Contacts
+-----------
+
+  There are two mailing lists related to FreeType:
+
+    o freetype@nongnu.org
+
+      Discusses general use and applications of FreeType, as well as
+      future and  wanted additions to the  library and distribution.
+      If  you are looking  for support,  start in  this list  if you
+      haven't found anything to help you in the documentation.
+
+    o freetype-devel@nongnu.org
+
+      Discusses bugs,  as well  as engine internals,  design issues,
+      specific licenses, porting, etc.
+
+  Our home page can be found at
+
+    https://www.freetype.org
+-------------------------------------------------------------------
+COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later)
+
+Copyright © 1991-2020 Unicode, Inc. All rights reserved.
+Distributed under the Terms of Use in https://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Unicode data files and any associated documentation
+(the "Data Files") or Unicode software and any associated documentation
+(the "Software") to deal in the Data Files or Software
+without restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, and/or sell copies of
+the Data Files or Software, and to permit persons to whom the Data Files
+or Software are furnished to do so, provided that either
+(a) this copyright and permission notice appear with all copies
+of the Data Files or Software, or
+(b) this copyright and permission notice appear in associated
+Documentation.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale,
+use or other dealings in these Data Files or Software without prior
+written authorization of the copyright holder.
+-------------------------------------------------------------------
+The 'UnicodeData-9.0.0.txt' file is from the Unicode Character Database.
+It is available at http://www.unicode.org/Public/zipped/9.0.0/UCD.zip and
+is made available under the following license by Unicode, Inc:
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright © 1991-2016 Unicode, Inc. All rights reserved.
+Distributed under the Terms of Use in
+http://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Unicode data files and any associated documentation
+(the "Data Files") or Unicode software and any associated documentation
+(the "Software") to deal in the Data Files or Software
+without restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, and/or sell copies of
+the Data Files or Software, and to permit persons to whom the Data Files
+or Software are furnished to do so, provided that
+(a) this copyright and permission notice appear with all copies
+of the Data Files or Software,
+(b) this copyright and permission notice appear in associated
+documentation, and
+(c) there is clear notice in each modified Data File or in the Software
+as well as in the documentation associated with the Data File(s) or
+Software that the data or software has been modified.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale,
+use or other dealings in these Data Files or Software without prior
+written authorization of the copyright holder.
+-------------------------------------------------------------------
+SGI FREE SOFTWARE LICENSE B
+(Version 2.0, Sept. 18, 2008)
+
+Copyright (C) [dates of first publication] Silicon Graphics, Inc. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice including the dates of first publication and either this permission notice or a reference to http://oss.sgi.com/projects/FreeB/ shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Silicon Graphics, Inc. shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Silicon Graphics, Inc.
+-------------------------------------------------------------------
+Copyright (c) 2013  Julien Pommier ( pommier@modartt.com )
+
+Based on original fortran 77 code from FFTPACKv4 from NETLIB,
+authored by Dr Paul Swarztrauber of NCAR, in 1985.
+
+As confirmed by the NCAR fftpack software curators, the following
+FFTPACKv5 license applies to FFTPACKv4 sources. My changes are
+released under the same terms.
+
+FFTPACK license:
+
+http://www.cisl.ucar.edu/css/software/fftpack5/ftpk.html
+
+Copyright (c) 2004 the University Corporation for Atmospheric
+Research ("UCAR"). All rights reserved. Developed by NCAR's
+Computational and Information Systems Laboratory, UCAR,
+www.cisl.ucar.edu.
+
+Redistribution and use of the Software in source and binary forms,
+with or without modification, is permitted provided that the
+following conditions are met:
+
+- Neither the names of NCAR's Computational and Information Systems
+Laboratory, the University Corporation for Atmospheric Research,
+nor the names of its sponsors or contributors may be used to
+endorse or promote products derived from this Software without
+specific prior written permission.
+
+- Redistributions of source code must retain the above copyright
+notices, this list of conditions, and the disclaimer below.
+
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions, and the disclaimer below in the
+documentation and/or other materials provided with the
+distribution.
+
+THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
+-------------------------------------------------------------------
+APPLE PUBLIC SOURCE LICENSE
+Version 2.0 -  August 6, 2003
+
+Please read this License carefully before downloading this software.  By downloading or using this software, you are agreeing to be bound by the terms of this License.  If you do not or cannot agree to the terms of this License, please do not download or use the software.
+
+Apple Note:  In January 2007, Apple changed its corporate name from "Apple Computer, Inc." to "Apple Inc."  This change has been reflected below and copyright years updated, but no other changes have been made to the APSL 2.0.
+
+1.	General; Definitions.  This License applies to any program or other work which Apple Inc. ("Apple") makes publicly available and which contains a notice placed by Apple identifying such program or work as "Original Code" and stating that it is subject to the terms of this Apple Public Source License version 2.0 ("License").  As used in this License:
+
+1.1	 "Applicable Patent Rights" mean:  (a) in the case where Apple is the grantor of rights, (i) claims of patents that are now or hereafter acquired, owned by or assigned to Apple and (ii) that cover subject matter contained in the Original Code, but only to the extent necessary to use, reproduce and/or distribute the Original Code without infringement; and (b) in the case where You are the grantor of rights, (i) claims of patents that are now or hereafter acquired, owned by or assigned to You and (ii) that cover subject matter in Your Modifications, taken alone or in combination with Original Code.
+
+1.2	"Contributor" means any person or entity that creates or contributes to the creation of Modifications.
+
+1.3	 "Covered Code" means the Original Code, Modifications, the combination of Original Code and any Modifications, and/or any respective portions thereof.
+
+1.4	"Externally Deploy" means: (a) to sublicense, distribute or otherwise make Covered Code available, directly or indirectly, to anyone other than You; and/or (b) to use Covered Code, alone or as part of a Larger Work, in any way to provide a service, including but not limited to delivery of content, through electronic communication with a client other than You.
+
+1.5	"Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License.
+
+1.6	"Modifications" mean any addition to, deletion from, and/or change to, the substance and/or structure of the Original Code, any previous Modifications, the combination of Original Code and any previous Modifications, and/or any respective portions thereof.  When code is released as a series of files, a Modification is:  (a) any addition to or deletion from the contents of a file containing Covered Code; and/or (b) any new file or other representation of computer program statements that contains any part of Covered Code.
+
+1.7	"Original Code" means (a) the Source Code of a program or other work as originally made available by Apple under this License, including the Source Code of any updates or upgrades to such programs or works made available by Apple under this License, and that has been expressly identified by Apple as such in the header file(s) of such work; and (b) the object code compiled from such Source Code and originally made available by Apple under this License
+
+1.8	"Source Code" means the human readable form of a program or other work that is suitable for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an executable (object code).
+
+1.9	"You" or "Your" means an individual or a legal entity exercising rights under this License.  For legal entities, "You" or "Your" includes any entity which controls, is controlled by, or is under common control with, You, where "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity.
+
+2.	Permitted Uses; Conditions & Restrictions.   Subject to the terms and conditions of this License, Apple hereby grants You, effective on the date You accept this License and download the Original Code, a world-wide, royalty-free, non-exclusive license, to the extent of Apple's Applicable Patent Rights and copyrights covering the Original Code, to do the following:
+
+2.1	Unmodified Code.  You may use, reproduce, display, perform, internally distribute within Your organization, and Externally Deploy verbatim, unmodified copies of the Original Code, for commercial or non-commercial purposes, provided that in each instance:
+
+(a)	You must retain and reproduce in all copies of Original Code the copyright and other proprietary notices and disclaimers of Apple as they appear in the Original Code, and keep intact all notices in the Original Code that refer to this License; and
+
+(b) 	You must include a copy of this License with every copy of Source Code of Covered Code and documentation You distribute or Externally Deploy, and You may not offer or impose any terms on such Source Code that alter or restrict this License or the recipients' rights hereunder, except as permitted under Section 6.
+
+2.2	Modified Code.  You may modify Covered Code and use, reproduce, display, perform, internally distribute within Your organization, and Externally Deploy Your Modifications and Covered Code, for commercial or non-commercial purposes, provided that in each instance You also meet all of these conditions:
+
+(a)	You must satisfy all the conditions of Section 2.1 with respect to the Source Code of the Covered Code;
+
+(b)	You must duplicate, to the extent it does not already exist, the notice in Exhibit A in each file of the Source Code of all Your Modifications, and cause the modified files to carry prominent notices stating that You changed the files and the date of any change; and
+
+(c)	If You Externally Deploy Your Modifications, You must make Source Code of all Your Externally Deployed Modifications either available to those to whom You have Externally Deployed Your Modifications, or publicly available.  Source Code of Your Externally Deployed Modifications must be released under the terms set forth in this License, including the license grants set forth in Section 3 below, for as long as you Externally Deploy the Covered Code or twelve (12) months from the date of initial External Deployment, whichever is longer. You should preferably distribute the Source Code of Your Externally Deployed Modifications electronically (e.g. download from a web site).
+
+2.3	Distribution of Executable Versions.  In addition, if You Externally Deploy Covered Code (Original Code and/or Modifications) in object code, executable form only, You must include a prominent notice, in the code itself as well as in related documentation, stating that Source Code of the Covered Code is available under the terms of this License with information on how and where to obtain such Source Code.
+
+2.4	Third Party Rights.  You expressly acknowledge and agree that although Apple and each Contributor grants the licenses to their respective portions of the Covered Code set forth herein, no assurances are provided by Apple or any Contributor that the Covered Code does not infringe the patent or other intellectual property rights of any other entity. Apple and each Contributor disclaim any liability to You for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, You hereby assume sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow You to distribute the Covered Code, it is Your responsibility to acquire that license before distributing the Covered Code.
+
+3.	Your Grants.  In consideration of, and as a condition to, the licenses granted to You under this License, You hereby grant to any person or entity receiving or distributing Covered Code under this License a non-exclusive, royalty-free, perpetual, irrevocable license, under Your Applicable Patent Rights and other intellectual property rights (other than patent) owned or controlled by You, to use, reproduce, display, perform, modify, sublicense, distribute and Externally Deploy Your Modifications of the same scope and extent as Apple's licenses under Sections 2.1 and 2.2 above.
+
+4.	Larger Works.  You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product.  In each such instance, You must make sure the requirements of this License are fulfilled for the Covered Code or any portion thereof.
+
+5.	Limitations on Patent License.   Except as expressly stated in Section 2, no other patent rights, express or implied, are granted by Apple herein.  Modifications and/or Larger Works may require additional patent licenses from Apple which Apple may grant in its sole discretion.
+
+6.	Additional Terms.  You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations and/or other rights consistent with the scope of the license granted herein ("Additional Terms") to one or more recipients of Covered Code. However, You may do so only on Your own behalf and as Your sole responsibility, and not on behalf of Apple or any Contributor. You must obtain the recipient's agreement that any such Additional Terms are offered by You alone, and You hereby agree to indemnify, defend and hold Apple and every Contributor harmless for any liability incurred by or claims asserted against Apple or such Contributor by reason of any such Additional Terms.
+
+7.	Versions of the License.  Apple may publish revised and/or new versions of this License from time to time.  Each version will be given a distinguishing version number.  Once Original Code has been published under a particular version of this License, You may continue to use it under the terms of that version. You may also choose to use such Original Code under the terms of any subsequent version of this License published by Apple.  No one other than Apple has the right to modify the terms applicable to Covered Code created under this License.
+
+8.	NO WARRANTY OR SUPPORT.  The Covered Code may contain in whole or in part pre-release, untested, or not fully tested works.  The Covered Code may contain errors that could cause failures or loss of data, and may be incomplete or contain inaccuracies.  You expressly acknowledge and agree that use of the Covered Code, or any portion thereof, is at Your sole and entire risk.  THE COVERED CODE IS PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF ANY KIND AND APPLE AND APPLE'S LICENSOR(S) (COLLECTIVELY REFERRED TO AS "APPLE" FOR THE PURPOSES OF SECTIONS 8 AND 9) AND ALL CONTRIBUTORS EXPRESSLY DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET ENJOYMENT, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.  APPLE AND EACH CONTRIBUTOR DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE COVERED CODE, THAT THE FUNCTIONS CONTAINED IN THE COVERED CODE WILL MEET YOUR REQUIREMENTS, THAT THE OPERATION OF THE COVERED CODE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT DEFECTS IN THE COVERED CODE WILL BE CORRECTED.  NO ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY APPLE, AN APPLE AUTHORIZED REPRESENTATIVE OR ANY CONTRIBUTOR SHALL CREATE A WARRANTY.  You acknowledge that the Covered Code is not intended for use in the operation of nuclear facilities, aircraft navigation, communication systems, or air traffic control machines in which case the failure of the Covered Code could lead to death, personal injury, or severe physical or environmental damage.
+
+9.	LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT SHALL APPLE OR ANY CONTRIBUTOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO THIS LICENSE OR YOUR USE OR INABILITY TO USE THE COVERED CODE, OR ANY PORTION THEREOF, WHETHER UNDER A THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF APPLE OR SUCH CONTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event shall Apple's total liability to You for all damages (other than as may be required by applicable law) under this License exceed the amount of fifty dollars ($50.00).
+
+10.	Trademarks.  This License does not grant any rights to use the trademarks or trade names  "Apple", "Mac", "Mac OS", "QuickTime", "QuickTime Streaming Server" or any other trademarks, service marks, logos or trade names belonging to Apple (collectively "Apple Marks") or to any trademark, service mark, logo or trade name belonging to any Contributor.  You agree not to use any Apple Marks in or as part of the name of products derived from the Original Code or to endorse or promote products derived from the Original Code other than as expressly permitted by and in strict compliance at all times with Apple's third party trademark usage guidelines which are posted at http://www.apple.com/legal/guidelinesfor3rdparties.html.
+
+11.	Ownership. Subject to the licenses granted under this License, each Contributor retains all rights, title and interest in and to any Modifications made by such Contributor.  Apple retains all rights, title and interest in and to the Original Code and any Modifications made by or on behalf of Apple ("Apple Modifications"), and such Apple Modifications will not be automatically subject to this License.  Apple may, at its sole discretion, choose to license such Apple Modifications under this License, or on different terms from those contained in this License or may choose not to license them at all.
+
+12.	Termination.
+
+12.1	Termination.  This License and the rights granted hereunder will terminate:
+
+(a)	automatically without notice from Apple if You fail to comply with any term(s) of this License and fail to cure such breach within 30 days of becoming aware of such breach;
+(b)	immediately in the event of the circumstances described in Section 13.5(b); or
+(c)	automatically without notice from Apple if You, at any time during the term of this License, commence an action for patent infringement against Apple; provided that Apple did not first commence an action for patent infringement against You in that instance.
+
+12.2	Effect of Termination.  Upon termination, You agree to immediately stop any further use, reproduction, modification, sublicensing and distribution of the Covered Code.  All sublicenses to the Covered Code which have been properly granted prior to termination shall survive any termination of this License.  Provisions which, by their nature, should remain in effect beyond the termination of this License shall survive, including but not limited to Sections 3, 5, 8, 9, 10, 11, 12.2 and 13.  No party will be liable to any other for compensation, indemnity or damages of any sort solely as a result of terminating this License in accordance with its terms, and termination of this License will be without prejudice to any other right or remedy of any party.
+
+13. 	Miscellaneous.
+
+13.1	Government End Users.   The Covered Code is a "commercial item" as defined in FAR 2.101.  Government software and technical data rights in the Covered Code include only those rights customarily provided to the public as defined in this License. This customary commercial license in technical data and software is provided in accordance with FAR 12.211 (Technical Data) and 12.212 (Computer Software) and, for Department of Defense purchases, DFAR 252.227-7015 (Technical Data -- Commercial Items) and 227.7202-3 (Rights in Commercial Computer Software or Computer Software Documentation).  Accordingly, all U.S. Government End Users acquire Covered Code with only those rights set forth herein.
+
+13.2	Relationship of Parties.  This License will not be construed as creating an agency, partnership, joint venture or any other form of legal association between or among You, Apple or any Contributor, and You will not represent to the contrary, whether expressly, by implication, appearance or otherwise.
+
+13.3	Independent Development.   Nothing in this License will impair Apple's right to acquire, license, develop, have others develop for it, market and/or distribute technology or products that perform the same or similar functions as, or otherwise compete with, Modifications, Larger Works, technology or products that You may develop, produce, market or distribute.
+
+13.4	Waiver; Construction.  Failure by Apple or any Contributor to enforce any provision of this License will not be deemed a waiver of future enforcement of that or any other provision.  Any law or regulation which provides that the language of a contract shall be construed against the drafter will not apply to this License.
+
+13.5	Severability.  (a) If for any reason a court of competent jurisdiction finds any provision of this License, or portion thereof, to be unenforceable, that provision of the License will be enforced to the maximum extent permissible so as to effect the economic benefits and intent of the parties, and the remainder of this License will continue in full force and effect.  (b) Notwithstanding the foregoing, if applicable law prohibits or restricts You from fully and/or specifically complying with Sections 2 and/or 3 or prevents the enforceability of either of those Sections, this License will immediately terminate and You must immediately discontinue any use of the Covered Code and destroy all copies of it that are in your possession or control.
+
+13.6	Dispute Resolution.  Any litigation or other dispute resolution between You and Apple relating to this License shall take place in the Northern District of California, and You and Apple hereby consent to the personal jurisdiction of, and venue in, the state and federal courts within that District with respect to this License. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded.
+
+13.7	Entire Agreement; Governing Law.  This License constitutes the entire agreement between the parties with respect to the subject matter hereof.  This License shall be governed by the laws of the United States and the State of California, except that body of California law concerning conflicts of law.
+
+Where You are located in the province of Quebec, Canada, the following clause applies:  The parties hereby confirm that they have requested that this License and all related documents be drafted in English.  Les parties ont exigé que le présent contrat et tous les documents connexes soient rédigés en anglais.
+
+EXHIBIT A.
+
+"Portions Copyright (c) 1999-2007 Apple Inc.  All Rights Reserved.
+
+This file contains Original Code and/or Modifications of Original Code as defined in and that are subject to the Apple Public Source License Version 2.0 (the 'License').  You may not use this file except in compliance with the License.  Please obtain a copy of the License at http://www.opensource.apple.com/apsl/ and read it before using this file.
+
+The Original Code and all software distributed under the License are distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.  Please see the License for the specific language governing rights and limitations under the License."
+-------------------------------------------------------------------
+MOZILLA PUBLIC LICENSE
+Version 1.1
+
+---------------
+
+1. Definitions.
+
+1.0.1. "Commercial Use" means distribution or otherwise making the
+Covered Code available to a third party.
+
+1.1. "Contributor" means each entity that creates or contributes to
+the creation of Modifications.
+
+1.2. "Contributor Version" means the combination of the Original
+Code, prior Modifications used by a Contributor, and the Modifications
+made by that particular Contributor.
+
+1.3. "Covered Code" means the Original Code or Modifications or the
+combination of the Original Code and Modifications, in each case
+including portions thereof.
+
+1.4. "Electronic Distribution Mechanism" means a mechanism generally
+accepted in the software development community for the electronic
+transfer of data.
+
+1.5. "Executable" means Covered Code in any form other than Source
+Code.
+
+1.6. "Initial Developer" means the individual or entity identified
+as the Initial Developer in the Source Code notice required by Exhibit
+A.
+
+1.7. "Larger Work" means a work which combines Covered Code or
+portions thereof with code not governed by the terms of this License.
+
+1.8. "License" means this document.
+
+1.8.1. "Licensable" means having the right to grant, to the maximum
+extent possible, whether at the time of the initial grant or
+subsequently acquired, any and all of the rights conveyed herein.
+
+1.9. "Modifications" means any addition to or deletion from the
+substance or structure of either the Original Code or any previous
+Modifications. When Covered Code is released as a series of files, a
+Modification is:
+A. Any addition to or deletion from the contents of a file
+containing Original Code or previous Modifications.
+
+B. Any new file that contains any part of the Original Code or
+previous Modifications.
+
+1.10. "Original Code" means Source Code of computer software code
+which is described in the Source Code notice required by Exhibit A as
+Original Code, and which, at the time of its release under this
+License is not already Covered Code governed by this License.
+
+1.10.1. "Patent Claims" means any patent claim(s), now owned or
+hereafter acquired, including without limitation,  method, process,
+and apparatus claims, in any patent Licensable by grantor.
+
+1.11. "Source Code" means the preferred form of the Covered Code for
+making modifications to it, including all modules it contains, plus
+any associated interface definition files, scripts used to control
+compilation and installation of an Executable, or source code
+differential comparisons against either the Original Code or another
+well known, available Covered Code of the Contributor's choice. The
+Source Code can be in a compressed or archival form, provided the
+appropriate decompression or de-archiving software is widely available
+for no charge.
+
+1.12. "You" (or "Your")  means an individual or a legal entity
+exercising rights under, and complying with all of the terms of, this
+License or a future version of this License issued under Section 6.1.
+For legal entities, "You" includes any entity which controls, is
+controlled by, or is under common control with You. For purposes of
+this definition, "control" means (a) the power, direct or indirect,
+to cause the direction or management of such entity, whether by
+contract or otherwise, or (b) ownership of more than fifty percent
+(50%) of the outstanding shares or beneficial ownership of such
+entity.
+
+2. Source Code License.
+
+2.1. The Initial Developer Grant.
+The Initial Developer hereby grants You a world-wide, royalty-free,
+non-exclusive license, subject to third party intellectual property
+claims:
+(a)  under intellectual property rights (other than patent or
+trademark) Licensable by Initial Developer to use, reproduce,
+modify, display, perform, sublicense and distribute the Original
+Code (or portions thereof) with or without Modifications, and/or
+as part of a Larger Work; and
+
+(b) under Patents Claims infringed by the making, using or
+selling of Original Code, to make, have made, use, practice,
+sell, and offer for sale, and/or otherwise dispose of the
+Original Code (or portions thereof).
+
+(c) the licenses granted in this Section 2.1(a) and (b) are
+effective on the date Initial Developer first distributes
+Original Code under the terms of this License.
+
+(d) Notwithstanding Section 2.1(b) above, no patent license is
+granted: 1) for code that You delete from the Original Code; 2)
+separate from the Original Code;  or 3) for infringements caused
+by: i) the modification of the Original Code or ii) the
+combination of the Original Code with other software or devices.
+
+2.2. Contributor Grant.
+Subject to third party intellectual property claims, each Contributor
+hereby grants You a world-wide, royalty-free, non-exclusive license
+
+(a)  under intellectual property rights (other than patent or
+trademark) Licensable by Contributor, to use, reproduce, modify,
+display, perform, sublicense and distribute the Modifications
+created by such Contributor (or portions thereof) either on an
+unmodified basis, with other Modifications, as Covered Code
+and/or as part of a Larger Work; and
+
+(b) under Patent Claims infringed by the making, using, or
+selling of  Modifications made by that Contributor either alone
+and/or in combination with its Contributor Version (or portions
+of such combination), to make, use, sell, offer for sale, have
+made, and/or otherwise dispose of: 1) Modifications made by that
+Contributor (or portions thereof); and 2) the combination of
+Modifications made by that Contributor with its Contributor
+Version (or portions of such combination).
+
+(c) the licenses granted in Sections 2.2(a) and 2.2(b) are
+effective on the date Contributor first makes Commercial Use of
+the Covered Code.
+
+(d)    Notwithstanding Section 2.2(b) above, no patent license is
+granted: 1) for any code that Contributor has deleted from the
+Contributor Version; 2)  separate from the Contributor Version;
+3)  for infringements caused by: i) third party modifications of
+Contributor Version or ii)  the combination of Modifications made
+by that Contributor with other software  (except as part of the
+Contributor Version) or other devices; or 4) under Patent Claims
+infringed by Covered Code in the absence of Modifications made by
+that Contributor.
+
+3. Distribution Obligations.
+
+3.1. Application of License.
+The Modifications which You create or to which You contribute are
+governed by the terms of this License, including without limitation
+Section 2.2. The Source Code version of Covered Code may be
+distributed only under the terms of this License or a future version
+of this License released under Section 6.1, and You must include a
+copy of this License with every copy of the Source Code You
+distribute. You may not offer or impose any terms on any Source Code
+version that alters or restricts the applicable version of this
+License or the recipients' rights hereunder. However, You may include
+an additional document offering the additional rights described in
+Section 3.5.
+
+3.2. Availability of Source Code.
+Any Modification which You create or to which You contribute must be
+made available in Source Code form under the terms of this License
+either on the same media as an Executable version or via an accepted
+Electronic Distribution Mechanism to anyone to whom you made an
+Executable version available; and if made available via Electronic
+Distribution Mechanism, must remain available for at least twelve (12)
+months after the date it initially became available, or at least six
+(6) months after a subsequent version of that particular Modification
+has been made available to such recipients. You are responsible for
+ensuring that the Source Code version remains available even if the
+Electronic Distribution Mechanism is maintained by a third party.
+
+3.3. Description of Modifications.
+You must cause all Covered Code to which You contribute to contain a
+file documenting the changes You made to create that Covered Code and
+the date of any change. You must include a prominent statement that
+the Modification is derived, directly or indirectly, from Original
+Code provided by the Initial Developer and including the name of the
+Initial Developer in (a) the Source Code, and (b) in any notice in an
+Executable version or related documentation in which You describe the
+origin or ownership of the Covered Code.
+
+3.4. Intellectual Property Matters
+(a) Third Party Claims.
+If Contributor has knowledge that a license under a third party's
+intellectual property rights is required to exercise the rights
+granted by such Contributor under Sections 2.1 or 2.2,
+Contributor must include a text file with the Source Code
+distribution titled "LEGAL" which describes the claim and the
+party making the claim in sufficient detail that a recipient will
+know whom to contact. If Contributor obtains such knowledge after
+the Modification is made available as described in Section 3.2,
+Contributor shall promptly modify the LEGAL file in all copies
+Contributor makes available thereafter and shall take other steps
+(such as notifying appropriate mailing lists or newsgroups)
+reasonably calculated to inform those who received the Covered
+Code that new knowledge has been obtained.
+
+(b) Contributor APIs.
+If Contributor's Modifications include an application programming
+interface and Contributor has knowledge of patent licenses which
+are reasonably necessary to implement that API, Contributor must
+also include this information in the LEGAL file.
+
+(c)    Representations.
+Contributor represents that, except as disclosed pursuant to
+Section 3.4(a) above, Contributor believes that Contributor's
+Modifications are Contributor's original creation(s) and/or
+Contributor has sufficient rights to grant the rights conveyed by
+this License.
+
+3.5. Required Notices.
+You must duplicate the notice in Exhibit A in each file of the Source
+Code.  If it is not possible to put such notice in a particular Source
+Code file due to its structure, then You must include such notice in a
+location (such as a relevant directory) where a user would be likely
+to look for such a notice.  If You created one or more Modification(s)
+You may add your name as a Contributor to the notice described in
+Exhibit A.  You must also duplicate this License in any documentation
+for the Source Code where You describe recipients' rights or ownership
+rights relating to Covered Code.  You may choose to offer, and to
+charge a fee for, warranty, support, indemnity or liability
+obligations to one or more recipients of Covered Code. However, You
+may do so only on Your own behalf, and not on behalf of the Initial
+Developer or any Contributor. You must make it absolutely clear than
+any such warranty, support, indemnity or liability obligation is
+offered by You alone, and You hereby agree to indemnify the Initial
+Developer and every Contributor for any liability incurred by the
+Initial Developer or such Contributor as a result of warranty,
+support, indemnity or liability terms You offer.
+
+3.6. Distribution of Executable Versions.
+You may distribute Covered Code in Executable form only if the
+requirements of Section 3.1-3.5 have been met for that Covered Code,
+and if You include a notice stating that the Source Code version of
+the Covered Code is available under the terms of this License,
+including a description of how and where You have fulfilled the
+obligations of Section 3.2. The notice must be conspicuously included
+in any notice in an Executable version, related documentation or
+collateral in which You describe recipients' rights relating to the
+Covered Code. You may distribute the Executable version of Covered
+Code or ownership rights under a license of Your choice, which may
+contain terms different from this License, provided that You are in
+compliance with the terms of this License and that the license for the
+Executable version does not attempt to limit or alter the recipient's
+rights in the Source Code version from the rights set forth in this
+License. If You distribute the Executable version under a different
+license You must make it absolutely clear that any terms which differ
+from this License are offered by You alone, not by the Initial
+Developer or any Contributor. You hereby agree to indemnify the
+Initial Developer and every Contributor for any liability incurred by
+the Initial Developer or such Contributor as a result of any such
+terms You offer.
+
+3.7. Larger Works.
+You may create a Larger Work by combining Covered Code with other code
+not governed by the terms of this License and distribute the Larger
+Work as a single product. In such a case, You must make sure the
+requirements of this License are fulfilled for the Covered Code.
+
+4. Inability to Comply Due to Statute or Regulation.
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Code due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description
+must be included in the LEGAL file described in Section 3.4 and must
+be included with all distributions of the Source Code. Except to the
+extent prohibited by statute or regulation, such description must be
+sufficiently detailed for a recipient of ordinary skill to be able to
+understand it.
+
+5. Application of this License.
+
+This License applies to code to which the Initial Developer has
+attached the notice in Exhibit A and to related Covered Code.
+
+6. Versions of the License.
+
+6.1. New Versions.
+Netscape Communications Corporation ("Netscape") may publish revised
+and/or new versions of the License from time to time. Each version
+will be given a distinguishing version number.
+
+6.2. Effect of New Versions.
+Once Covered Code has been published under a particular version of the
+License, You may always continue to use it under the terms of that
+version. You may also choose to use such Covered Code under the terms
+of any subsequent version of the License published by Netscape. No one
+other than Netscape has the right to modify the terms applicable to
+Covered Code created under this License.
+
+6.3. Derivative Works.
+If You create or use a modified version of this License (which you may
+only do in order to apply it to code which is not already Covered Code
+governed by this License), You must (a) rename Your license so that
+the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
+"MPL", "NPL" or any confusingly similar phrase do not appear in your
+license (except to note that your license differs from this License)
+and (b) otherwise make it clear that Your version of the license
+contains terms which differ from the Mozilla Public License and
+Netscape Public License. (Filling in the name of the Initial
+Developer, Original Code or Contributor in the notice described in
+Exhibit A shall not of themselves be deemed to be modifications of
+this License.)
+
+7. DISCLAIMER OF WARRANTY.
+
+COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
+DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
+THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
+IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
+YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
+COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
+OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+8. TERMINATION.
+
+8.1.  This License and the rights granted hereunder will terminate
+automatically if You fail to comply with terms herein and fail to cure
+such breach within 30 days of becoming aware of the breach. All
+sublicenses to the Covered Code which are properly granted shall
+survive any termination of this License. Provisions which, by their
+nature, must remain in effect beyond the termination of this License
+shall survive.
+
+8.2.  If You initiate litigation by asserting a patent infringement
+claim (excluding declatory judgment actions) against Initial Developer
+or a Contributor (the Initial Developer or Contributor against whom
+You file such action is referred to as "Participant")  alleging that:
+
+(a)  such Participant's Contributor Version directly or indirectly
+infringes any patent, then any and all rights granted by such
+Participant to You under Sections 2.1 and/or 2.2 of this License
+shall, upon 60 days notice from Participant terminate prospectively,
+unless if within 60 days after receipt of notice You either: (i)
+agree in writing to pay Participant a mutually agreeable reasonable
+royalty for Your past and future use of Modifications made by such
+Participant, or (ii) withdraw Your litigation claim with respect to
+the Contributor Version against such Participant.  If within 60 days
+of notice, a reasonable royalty and payment arrangement are not
+mutually agreed upon in writing by the parties or the litigation claim
+is not withdrawn, the rights granted by Participant to You under
+Sections 2.1 and/or 2.2 automatically terminate at the expiration of
+the 60 day notice period specified above.
+
+(b)  any software, hardware, or device, other than such Participant's
+Contributor Version, directly or indirectly infringes any patent, then
+any rights granted to You by such Participant under Sections 2.1(b)
+and 2.2(b) are revoked effective as of the date You first made, used,
+sold, distributed, or had made, Modifications made by that
+Participant.
+
+8.3.  If You assert a patent infringement claim against Participant
+alleging that such Participant's Contributor Version directly or
+indirectly infringes any patent where such claim is resolved (such as
+by license or settlement) prior to the initiation of patent
+infringement litigation, then the reasonable value of the licenses
+granted by such Participant under Sections 2.1 or 2.2 shall be taken
+into account in determining the amount or value of any payment or
+license.
+
+8.4.  In the event of termination under Sections 8.1 or 8.2 above,
+all end user license agreements (excluding distributors and resellers)
+which have been validly granted by You or any distributor hereunder
+prior to termination shall survive termination.
+
+9. LIMITATION OF LIABILITY.
+
+UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
+DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
+OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
+ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
+CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
+WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
+RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
+PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
+THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+10. U.S. GOVERNMENT END USERS.
+
+The Covered Code is a "commercial item," as that term is defined in
+48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
+software" and "commercial computer software documentation," as such
+terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
+C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
+all U.S. Government End Users acquire Covered Code with only those
+rights set forth herein.
+
+11. MISCELLANEOUS.
+
+This License represents the complete agreement concerning subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. This License shall be governed by
+California law provisions (except to the extent applicable law, if
+any, provides otherwise), excluding its conflict-of-law provisions.
+With respect to disputes in which at least one party is a citizen of,
+or an entity chartered or registered to do business in the United
+States of America, any litigation relating to this License shall be
+subject to the jurisdiction of the Federal Courts of the Northern
+District of California, with venue lying in Santa Clara County,
+California, with the losing party responsible for costs, including
+without limitation, court costs and reasonable attorneys' fees and
+expenses. The application of the United Nations Convention on
+Contracts for the International Sale of Goods is expressly excluded.
+Any law or regulation which provides that the language of a contract
+shall be construed against the drafter shall not apply to this
+License.
+
+12. RESPONSIBILITY FOR CLAIMS.
+
+As between Initial Developer and the Contributors, each party is
+responsible for claims and damages arising, directly or indirectly,
+out of its utilization of rights under this License and You agree to
+work with Initial Developer and Contributors to distribute such
+responsibility on an equitable basis. Nothing herein is intended or
+shall be deemed to constitute any admission of liability.
+
+13. MULTIPLE-LICENSED CODE.
+
+Initial Developer may designate portions of the Covered Code as
+"Multiple-Licensed".  "Multiple-Licensed" means that the Initial
+Developer permits you to utilize portions of the Covered Code under
+Your choice of the NPL or the alternative licenses, if any, specified
+by the Initial Developer in the file described in Exhibit A.
+
+EXHIBIT A -Mozilla Public License.
+The contents of this file are subject to the Mozilla Public License Version
+1.1 (the "License"); you may not use this file except in compliance with
+the License. You may obtain a copy of the License at
+http://www.mozilla.org/MPL/
+
+Software distributed under the License is distributed on an "AS IS" basis,
+WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+for the specific language governing rights and limitations under the
+License.
+
+The Original Code is the Netscape Portable Runtime (NSPR).
+
+The Initial Developer of the Original Code is
+Netscape Communications Corporation.
+Portions created by the Initial Developer are Copyright (C) 1998-2000
+the Initial Developer. All Rights Reserved.
+
+Contributor(s):
+
+Alternatively, the contents of this file may be used under the terms of
+either the GNU General Public License Version 2 or later (the "GPL"), or
+the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+in which case the provisions of the GPL or the LGPL are applicable instead
+of those above. If you wish to allow use of your version of this file only
+under the terms of either the GPL or the LGPL, and not to allow others to
+use your version of this file under the terms of the MPL, indicate your
+decision by deleting the provisions above and replace them with the notice
+and other provisions required by the GPL or the LGPL. If you do not delete
+the provisions above, a recipient may use your version of this file under
+the terms of any one of the MPL, the GPL or the LGPL.
+
+-------------------------------------------------------------------
+1. ICU License - ICU 1.8.1 to ICU 57.1
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright (c) 1995-2016 International Business Machines Corporation and others
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, and/or sell copies of the Software, and to permit persons
+to whom the Software is furnished to do so, provided that the above
+copyright notice(s) and this permission notice appear in all copies of
+the Software and that both the above copyright notice(s) and this
+permission notice appear in supporting documentation.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY
+SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+of the copyright holder.
+
+All trademarks and registered trademarks mentioned herein are the
+property of their respective owners.
+-------------------------------------------------------------------
+2-dim General Purpose FFT (Fast Fourier/Cosine/Sine Transform) Package
+
+Copyright(C) 1997,2001 Takuya OOURA (email: ooura@kurims.kyoto-u.ac.jp).
+You may use, copy, modify this code for any purpose and
+without fee. You may distribute this ORIGINAL package.
+-------------------------------------------------------------------
+ARM_NEON_2_x86_SSE
+
+<pre>created by Victoria Zhislina, the Senior Application Engineer, Intel Corporation,  victoria.zhislina@intel.com
+
+*** Copyright (C) 2012-2020 Intel Corporation.  All rights reserved.
+
+IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
+
+By downloading, copying, installing or using the software you agree to this license.
+If you do not agree to this license, do not download, install, copy or use the software.
+
+                             License Agreement
+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.
+
+ * The name of the copyright holders may not 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 &quot;as is&quot; 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 Intel Corporation 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.
+</pre>
+
+-------------------------------------------------------------------
+Breakpad, An open-source multi-platform crash reporting system
+
+Copyright (c) 2006, 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 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
+&quot;AS IS&quot; 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.
+
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright (c) 1996 - 2011, Daniel Stenberg, &lt;daniel@haxx.se&gt;.
+
+All rights reserved.
+
+Permission to use, copy, modify, and distribute this software for any purpose
+with or without fee is hereby granted, provided that the above copyright
+notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN
+NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
+OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder shall not
+be used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization of the copyright holder.
+
+
+Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+
+@APPLE_LICENSE_HEADER_START@
+
+This file contains Original Code and/or Modifications of Original Code
+as defined in and that are subject to the Apple Public Source License
+Version 2.0 (the &#x27;License&#x27;). You may not use this file except in
+compliance with the License. Please obtain a copy of the License at
+http://www.opensource.apple.com/apsl/ and read it before using this
+file.
+
+The Original Code and all software distributed under the License are
+distributed on an &#x27;AS IS&#x27; basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+Please see the License for the specific language governing rights and
+limitations under the License.
+
+@APPLE_LICENSE_HEADER_END@
+
+
+Copyright 2007-2008 Google Inc.
+
+Licensed under the Apache License, Version 2.0 (the &quot;License&quot;); you may not
+use this file except in compliance with the License.  You may obtain a copy
+of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an &quot;AS IS&quot; BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+License for the specific language governing permissions and limitations under
+the License.
+-------------------------------------------------------------------
+harfbuzz-ng
+
+HarfBuzz is licensed under the so-called &quot;Old MIT&quot; license.  Details follow.
+For parts of HarfBuzz that are licensed under different licenses see individual
+files names COPYING in subdirectories where applicable.
+
+Copyright © 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020  Google, Inc.
+Copyright © 2018,2019,2020  Ebrahim Byagowi
+Copyright © 2019,2020  Facebook, Inc.
+Copyright © 2012  Mozilla Foundation
+Copyright © 2011  Codethink Limited
+Copyright © 2008,2010  Nokia Corporation and/or its subsidiary(-ies)
+Copyright © 2009  Keith Stribley
+Copyright © 2009  Martin Hosken and SIL International
+Copyright © 2007  Chris Wilson
+Copyright © 2005,2006,2020,2021  Behdad Esfahbod
+Copyright © 2005  David Turner
+Copyright © 2004,2007,2008,2009,2010  Red Hat, Inc.
+Copyright © 1998-2004  David Turner and Werner Lemberg
+
+For full copyright notices consult the individual files in the package.
+
+
+Permission is hereby granted, without written agreement and without
+license or royalty fees, to use, copy, modify, and distribute this
+software and its documentation for any purpose, provided that the
+above copyright notice and the following two paragraphs appear in
+all copies of this software.
+
+IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
+THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ON AN &quot;AS IS&quot; BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+-------------------------------------------------------------------
+icu
+
+UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
+
+See Terms of Use <https://www.unicode.org/copyright.html>
+for definitions of Unicode Inc.’s Data Files and Software.
+
+NOTICE TO USER: Carefully read the following legal agreement.
+BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S
+DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"),
+YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE
+TERMS AND CONDITIONS OF THIS AGREEMENT.
+IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE
+THE DATA FILES OR SOFTWARE.
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright © 1991-2022 Unicode, Inc. All rights reserved.
+Distributed under the Terms of Use in https://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Unicode data files and any associated documentation
+(the "Data Files") or Unicode software and any associated documentation
+(the "Software") to deal in the Data Files or Software
+without restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, and/or sell copies of
+the Data Files or Software, and to permit persons to whom the Data Files
+or Software are furnished to do so, provided that either
+(a) this copyright and permission notice appear with all copies
+of the Data Files or Software, or
+(b) this copyright and permission notice appear in associated
+Documentation.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale,
+use or other dealings in these Data Files or Software without prior
+written authorization of the copyright holder.
+
+----------------------------------------------------------------------
+
+Third-Party Software Licenses
+
+This section contains third-party software notices and/or additional
+terms for licensed third-party software components included within ICU
+libraries.
+
+----------------------------------------------------------------------
+
+ICU License - ICU 1.8.1 to ICU 57.1
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright (c) 1995-2016 International Business Machines Corporation and others
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, and/or sell copies of the Software, and to permit persons
+to whom the Software is furnished to do so, provided that the above
+copyright notice(s) and this permission notice appear in all copies of
+the Software and that both the above copyright notice(s) and this
+permission notice appear in supporting documentation.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY
+SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+of the copyright holder.
+
+All trademarks and registered trademarks mentioned herein are the
+property of their respective owners.
+
+----------------------------------------------------------------------
+
+Chinese/Japanese Word Break Dictionary Data (cjdict.txt)
+
+ #     The Google Chrome software developed by Google is licensed under
+ # the BSD license. Other software included in this distribution is
+ # provided under other licenses, as set forth below.
+ #
+ #  The BSD License
+ #  http://opensource.org/licenses/bsd-license.php
+ #  Copyright (C) 2006-2008, 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 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.
+ #
+ #
+ #  The word list in cjdict.txt are generated by combining three word lists
+ # listed below with further processing for compound word breaking. The
+ # frequency is generated with an iterative training against Google web
+ # corpora.
+ #
+ #  * Libtabe (Chinese)
+ #    - https://sourceforge.net/project/?group_id=1519
+ #    - Its license terms and conditions are shown below.
+ #
+ #  * IPADIC (Japanese)
+ #    - http://chasen.aist-nara.ac.jp/chasen/distribution.html
+ #    - Its license terms and conditions are shown below.
+ #
+ #  ---------COPYING.libtabe ---- BEGIN--------------------
+ #
+ #  /*
+ #   * Copyright (c) 1999 TaBE Project.
+ #   * Copyright (c) 1999 Pai-Hsiang Hsiao.
+ #   * 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 the TaBE Project 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
+ #   * REGENTS 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.
+ #   */
+ #
+ #  /*
+ #   * Copyright (c) 1999 Computer Systems and Communication Lab,
+ #   *                    Institute of Information Science, Academia
+ #       *                    Sinica. 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 the Computer Systems and Communication Lab
+ #   *   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
+ #   * REGENTS 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.
+ #   */
+ #
+ #  Copyright 1996 Chih-Hao Tsai @ Beckman Institute,
+ #      University of Illinois
+ #  c-tsai4@uiuc.edu  http://casper.beckman.uiuc.edu/~c-tsai4
+ #
+ #  ---------------COPYING.libtabe-----END--------------------------------
+ #
+ #
+ #  ---------------COPYING.ipadic-----BEGIN-------------------------------
+ #
+ #  Copyright 2000, 2001, 2002, 2003 Nara Institute of Science
+ #  and Technology.  All Rights Reserved.
+ #
+ #  Use, reproduction, and distribution of this software is permitted.
+ #  Any copy of this software, whether in its original form or modified,
+ #  must include both the above copyright notice and the following
+ #  paragraphs.
+ #
+ #  Nara Institute of Science and Technology (NAIST),
+ #  the copyright holders, disclaims all warranties with regard to this
+ #  software, including all implied warranties of merchantability and
+ #  fitness, in no event shall NAIST be liable for
+ #  any special, indirect or consequential damages or any damages
+ #  whatsoever resulting from loss of use, data or profits, whether in an
+ #  action of contract, negligence or other tortuous action, arising out
+ #  of or in connection with the use or performance of this software.
+ #
+ #  A large portion of the dictionary entries
+ #  originate from ICOT Free Software.  The following conditions for ICOT
+ #  Free Software applies to the current dictionary as well.
+ #
+ #  Each User may also freely distribute the Program, whether in its
+ #  original form or modified, to any third party or parties, PROVIDED
+ #  that the provisions of Section 3 ("NO WARRANTY") will ALWAYS appear
+ #  on, or be attached to, the Program, which is distributed substantially
+ #  in the same form as set out herein and that such intended
+ #  distribution, if actually made, will neither violate or otherwise
+ #  contravene any of the laws and regulations of the countries having
+ #  jurisdiction over the User or the intended distribution itself.
+ #
+ #  NO WARRANTY
+ #
+ #  The program was produced on an experimental basis in the course of the
+ #  research and development conducted during the project and is provided
+ #  to users as so produced on an experimental basis.  Accordingly, the
+ #  program is provided without any warranty whatsoever, whether express,
+ #  implied, statutory or otherwise.  The term "warranty" used herein
+ #  includes, but is not limited to, any warranty of the quality,
+ #  performance, merchantability and fitness for a particular purpose of
+ #  the program and the nonexistence of any infringement or violation of
+ #  any right of any third party.
+ #
+ #  Each user of the program will agree and understand, and be deemed to
+ #  have agreed and understood, that there is no warranty whatsoever for
+ #  the program and, accordingly, the entire risk arising from or
+ #  otherwise connected with the program is assumed by the user.
+ #
+ #  Therefore, neither ICOT, the copyright holder, or any other
+ #  organization that participated in or was otherwise related to the
+ #  development of the program and their respective officials, directors,
+ #  officers and other employees shall be held liable for any and all
+ #  damages, including, without limitation, general, special, incidental
+ #  and consequential damages, arising out of or otherwise in connection
+ #  with the use or inability to use the program or any product, material
+ #  or result produced or otherwise obtained by using the program,
+ #  regardless of whether they have been advised of, or otherwise had
+ #  knowledge of, the possibility of such damages at any time during the
+ #  project or thereafter.  Each user will be deemed to have agreed to the
+ #  foregoing by his or her commencement of use of the program.  The term
+ #  "use" as used herein includes, but is not limited to, the use,
+ #  modification, copying and distribution of the program and the
+ #  production of secondary products from the program.
+ #
+ #  In the case where the program, whether in its original form or
+ #  modified, was distributed or delivered to or received by a user from
+ #  any person, organization or entity other than ICOT, unless it makes or
+ #  grants independently of ICOT any specific warranty to the user in
+ #  writing, such person, organization or entity, will also be exempted
+ #  from and not be held liable to the user for any such damages as noted
+ #  above as far as the program is concerned.
+ #
+ #  ---------------COPYING.ipadic-----END----------------------------------
+
+----------------------------------------------------------------------
+
+Lao Word Break Dictionary Data (laodict.txt)
+
+ # Copyright (C) 2016 and later: Unicode, Inc. and others.
+ # License & terms of use: http://www.unicode.org/copyright.html
+ # Copyright (c) 2015 International Business Machines Corporation
+ # and others. All Rights Reserved.
+ #
+ # Project: https://github.com/rober42539/lao-dictionary
+ # Dictionary: https://github.com/rober42539/lao-dictionary/laodict.txt
+ # License: https://github.com/rober42539/lao-dictionary/LICENSE.txt
+ #          (copied below)
+ #
+ #	This file is derived from the above dictionary version of Nov 22, 2020
+ #  ----------------------------------------------------------------------
+ #  Copyright (C) 2013 Brian Eugene Wilson, Robert Martin Campbell.
+ #  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.
+ #
+ # 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 HOLDER 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.
+ #  --------------------------------------------------------------------------
+
+----------------------------------------------------------------------
+
+Burmese Word Break Dictionary Data (burmesedict.txt)
+
+ #  Copyright (c) 2014 International Business Machines Corporation
+ #  and others. All Rights Reserved.
+ #
+ #  This list is part of a project hosted at:
+ #    github.com/kanyawtech/myanmar-karen-word-lists
+ #
+ #  --------------------------------------------------------------------------
+ #  Copyright (c) 2013, LeRoy Benjamin Sharon
+ #  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 Myanmar Karen Word Lists, 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 HOLDER 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.
+ #  --------------------------------------------------------------------------
+
+----------------------------------------------------------------------
+
+Time Zone Database
+
+  ICU uses the public domain data and code derived from Time Zone
+Database for its time zone support. The ownership of the TZ database
+is explained in BCP 175: Procedure for Maintaining the Time Zone
+Database section 7.
+
+ # 7.  Database Ownership
+ #
+ #    The TZ database itself is not an IETF Contribution or an IETF
+ #    document.  Rather it is a pre-existing and regularly updated work
+ #    that is in the public domain, and is intended to remain in the
+ #    public domain.  Therefore, BCPs 78 [RFC5378] and 79 [RFC3979] do
+ #    not apply to the TZ Database or contributions that individuals make
+ #    to it.  Should any claims be made and substantiated against the TZ
+ #    Database, the organization that is providing the IANA
+ #    Considerations defined in this RFC, under the memorandum of
+ #    understanding with the IETF, currently ICANN, may act in accordance
+ #    with all competent court orders.  No ownership claims will be made
+ #    by ICANN or the IETF Trust on the database or the code.  Any person
+ #    making a contribution to the database or code waives all rights to
+ #    future claims in that contribution or in the TZ Database.
+
+----------------------------------------------------------------------
+
+Google double-conversion
+
+Copyright 2006-2011, the V8 project authors. 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 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.
+
+----------------------------------------------------------------------
+
+File: aclocal.m4 (only for ICU4C)
+Section: pkg.m4 - Macros to locate and utilise pkg-config.
+
+
+Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
+Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.
+
+As a special exception to the GNU General Public License, if you
+distribute this file as part of a program that contains a
+configuration script generated by Autoconf, you may include it under
+the same distribution terms that you use for the rest of that
+program.
+
+
+(The condition for the exception is fulfilled because
+ICU4C includes a configuration script generated by Autoconf,
+namely the `configure` script.)
+
+----------------------------------------------------------------------
+
+File: config.guess (only for ICU4C)
+
+
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+AUTOCONF CONFIGURE SCRIPT EXCEPTION
+
+Version 3.0, 18 August 2009
+
+Copyright © 2009 Free Software Foundation, Inc. <http://fsf.org/>
+
+Everyone is permitted to copy and distribute verbatim copies of this license
+document, but changing it is not allowed.
+
+This Exception is an additional permission under section 7 of the GNU General
+Public License, version 3 ("GPLv3"). It applies to a given file that bears a
+notice placed by the copyright holder of the file stating that the file is
+governed by GPLv3 along with this Exception.
+
+The purpose of this Exception is to allow distribution of Autoconf&apos;s
+typical output under terms of the recipient&apos;s choice (including
+proprietary).
+
+0. Definitions.   
+"Covered Code" is the source or object code of a version of Autoconf that is a
+covered work under this License.
+
+"Normally Copied Code" for a version of Autoconf means all parts of its
+Covered Code which that version can copy from its code (i.e., not from its
+input file) into its minimally verbose, non-debugging and non-tracing output.
+
+"Ineligible Code" is Covered Code that is not Normally Copied Code.
+
+1. Grant of Additional Permission.   
+You have permission to propagate output of Autoconf, even if such propagation
+would otherwise violate the terms of GPLv3. However, if by modifying Autoconf
+you cause any Ineligible Code of the version you received to become Normally
+Copied Code of your modified version, then you void this Exception for the
+resulting covered work. If you convey that resulting covered work, you must
+remove this Exception in accordance with the second paragraph of Section 7 of
+GPLv3.
+
+2. No Weakening of Autoconf Copyleft.   
+The availability of this Exception does not imply any general presumption that
+third-party software is unaffected by the copyleft requirements of the license
+of Autoconf.
+
+
+(The condition for the exception is fulfilled because
+ICU4C includes a configuration script generated by Autoconf,
+namely the `configure` script.)
+
+----------------------------------------------------------------------
+
+File: install-sh (only for ICU4C)
+
+
+Copyright 1991 by the Massachusetts Institute of Technology
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation, and that the name of M.I.T. not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.  M.I.T. makes no representations about the
+suitability of this software for any purpose.  It is provided "as is"
+without express or implied warranty.
+-------------------------------------------------------------------
+libcxx
+
+==============================================================================
+The LLVM Project is under the Apache License v2.0 with LLVM Exceptions:
+==============================================================================
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+    1. Definitions.
+
+      &quot;License&quot; shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      &quot;Licensor&quot; shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      &quot;Legal Entity&quot; shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      &quot;control&quot; means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      &quot;You&quot; (or &quot;Your&quot;) shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      &quot;Source&quot; form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      &quot;Object&quot; form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      &quot;Work&quot; shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      &quot;Derivative Works&quot; shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      &quot;Contribution&quot; shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, &quot;submitted&quot;
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as &quot;Not a Contribution.&quot;
+
+      &quot;Contributor&quot; shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+    2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+    3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+    4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a &quot;NOTICE&quot; text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+    5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+    6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+    7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an &quot;AS IS&quot; BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+    8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+    9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+    END OF TERMS AND CONDITIONS
+
+    APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets &quot;[]&quot;
+      replaced with your own identifying information. (Don&#x27;t include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same &quot;printed page&quot; as the copyright notice for easier
+      identification within third-party archives.
+
+    Copyright [yyyy] [name of copyright owner]
+
+    Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+
+---- LLVM Exceptions to the Apache 2.0 License ----
+
+As an exception, if, as a result of your compiling your source code, portions
+of this Software are embedded into an Object form of such source code, you
+may redistribute such embedded portions in such Object form without complying
+with the conditions of Sections 4(a), 4(b) and 4(d) of the License.
+
+In addition, if you combine or link compiled forms of this Software with
+software that is licensed under the GPLv2 (&quot;Combined Software&quot;) and if a
+court of competent jurisdiction determines that the patent provision (Section
+3), the indemnity provision (Section 9) or other Section of the License
+conflicts with the conditions of the GPLv2, you may retroactively and
+prospectively choose to deem waived or otherwise exclude such Section(s) of
+the License, but only in their entirety and only with respect to the Combined
+Software.
+
+==============================================================================
+Software from third parties included in the LLVM Project:
+==============================================================================
+The LLVM Project contains third party software which is under different license
+terms. All such code will be identified clearly using at least one of two
+mechanisms:
+1) It will be in a separate directory tree with its own `LICENSE.txt` or
+   `LICENSE` file at the top containing the specific license and restrictions
+   which apply to that software, or
+2) It will contain specific license and restriction terms at the top of every
+   file.
+
+==============================================================================
+Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy):
+==============================================================================
+
+The libc++ library is dual licensed under both the University of Illinois
+&quot;BSD-Like&quot; license and the MIT license.  As a user of this code you may choose
+to use it under either license.  As a contributor, you agree to allow your code
+to be used under both.
+
+Full text of the relevant licenses is included below.
+
+==============================================================================
+
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT
+
+All rights reserved.
+
+Developed by:
+
+    LLVM Team
+
+    University of Illinois at Urbana-Champaign
+
+    http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the &quot;Software&quot;), to deal with
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimers.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimers in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the names of the LLVM Team, University of Illinois at
+      Urbana-Champaign, nor the names of its contributors may be used to
+      endorse or promote products derived from this Software without specific
+      prior written permission.
+
+THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
+
+==============================================================================
+
+Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the &quot;Software&quot;), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+-------------------------------------------------------------------
+libpng
+
+COPYRIGHT NOTICE, DISCLAIMER, and LICENSE
+=========================================
+
+PNG Reference Library License version 2
+---------------------------------------
+
+ * Copyright (c) 1995-2019 The PNG Reference Library Authors.
+ * Copyright (c) 2018-2019 Cosmin Truta.
+ * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson.
+ * Copyright (c) 1996-1997 Andreas Dilger.
+ * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
+
+The software is supplied &quot;as is&quot;, without warranty of any kind,
+express or implied, including, without limitation, the warranties
+of merchantability, fitness for a particular purpose, title, and
+non-infringement.  In no event shall the Copyright owners, or
+anyone distributing the software, be liable for any damages or
+other liability, whether in contract, tort or otherwise, arising
+from, out of, or in connection with the software, or the use or
+other dealings in the software, even if advised of the possibility
+of such damage.
+
+Permission is hereby granted to use, copy, modify, and distribute
+this software, or portions hereof, for any purpose, without fee,
+subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you
+    must not claim that you wrote the original software.  If you
+    use this software in a product, an acknowledgment in the product
+    documentation would be appreciated, but is not required.
+
+ 2. Altered source versions must be plainly marked as such, and must
+    not be misrepresented as being the original software.
+
+ 3. This Copyright notice may not be removed or altered from any
+    source or altered source distribution.
+
+
+PNG Reference Library License version 1 (for libpng 0.5 through 1.6.35)
+-----------------------------------------------------------------------
+
+libpng versions 1.0.7, July 1, 2000, through 1.6.35, July 15, 2018 are
+Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are
+derived from libpng-1.0.6, and are distributed according to the same
+disclaimer and license as libpng-1.0.6 with the following individuals
+added to the list of Contributing Authors:
+
+    Simon-Pierre Cadieux
+    Eric S. Raymond
+    Mans Rullgard
+    Cosmin Truta
+    Gilles Vollant
+    James Yu
+    Mandar Sahastrabuddhe
+    Google Inc.
+    Vadim Barkov
+
+and with the following additions to the disclaimer:
+
+    There is no warranty against interference with your enjoyment of
+    the library or against infringement.  There is no warranty that our
+    efforts or the library will fulfill any of your particular purposes
+    or needs.  This library is provided with all faults, and the entire
+    risk of satisfactory quality, performance, accuracy, and effort is
+    with the user.
+
+Some files in the &quot;contrib&quot; directory and some configure-generated
+files that are distributed with libpng have other copyright owners, and
+are released under other open source licenses.
+
+libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
+Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
+libpng-0.96, and are distributed according to the same disclaimer and
+license as libpng-0.96, with the following individuals added to the
+list of Contributing Authors:
+
+    Tom Lane
+    Glenn Randers-Pehrson
+    Willem van Schaik
+
+libpng versions 0.89, June 1996, through 0.96, May 1997, are
+Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88,
+and are distributed according to the same disclaimer and license as
+libpng-0.88, with the following individuals added to the list of
+Contributing Authors:
+
+    John Bowler
+    Kevin Bracey
+    Sam Bushell
+    Magnus Holmgren
+    Greg Roelofs
+    Tom Tanner
+
+Some files in the &quot;scripts&quot; directory have other copyright owners,
+but are released under this license.
+
+libpng versions 0.5, May 1995, through 0.88, January 1996, are
+Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
+
+For the purposes of this copyright and license, &quot;Contributing Authors&quot;
+is defined as the following set of individuals:
+
+    Andreas Dilger
+    Dave Martindale
+    Guy Eric Schalnat
+    Paul Schmidt
+    Tim Wegner
+
+The PNG Reference Library is supplied &quot;AS IS&quot;.  The Contributing
+Authors and Group 42, Inc. disclaim all warranties, expressed or
+implied, including, without limitation, the warranties of
+merchantability and of fitness for any purpose.  The Contributing
+Authors and Group 42, Inc. assume no liability for direct, indirect,
+incidental, special, exemplary, or consequential damages, which may
+result from the use of the PNG Reference Library, even if advised of
+the possibility of such damage.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+source code, or portions hereof, for any purpose, without fee, subject
+to the following restrictions:
+
+ 1. The origin of this source code must not be misrepresented.
+
+ 2. Altered versions must be plainly marked as such and must not
+    be misrepresented as being the original source.
+
+ 3. This Copyright notice may not be removed or altered from any
+    source or altered source distribution.
+
+The Contributing Authors and Group 42, Inc. specifically permit,
+without fee, and encourage the use of this source code as a component
+to supporting the PNG file format in commercial products.  If you use
+this source code in a product, acknowledgment is not required but would
+be appreciated.
+-------------------------------------------------------------------
+SPIRV-Headers
+
+Copyright (c) 2015-2018 The Khronos Group Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and/or associated documentation files (the
+&quot;Materials&quot;), to deal in the Materials without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Materials, and to
+permit persons to whom the Materials are furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Materials.
+
+MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS
+KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS
+SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT
+   https://www.khronos.org/registry/
+
+THE MATERIALS ARE PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+-------------------------------------------------------------------
+V8 fork of fdlibm
+
+Copyright (C) 1993-2004 by Sun Microsystems, Inc. All rights reserved.
+
+Developed at SunSoft, a Sun Microsystems, Inc. business.
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+-------------------------------------------------------------------
+Blackmagic DeckLink SDK - Mac
+
+Extracted from mac/include/DeckLinkAPI.h:
+
+** Copyright (c) 2014 Blackmagic Design
+**
+** Permission is hereby granted, free of charge, to any person or organization
+** obtaining a copy of the software and accompanying documentation covered by
+** this license (the &quot;Software&quot;) to use, reproduce, display, distribute,
+** execute, and transmit the Software, and to prepare derivative works of the
+** Software, and to permit third-parties to whom the Software is furnished to
+** do so, all subject to the following:
+**
+** The copyright notices in the Software and this entire statement, including
+** the above license grant, this restriction and the following disclaimer,
+** must be included in all copies of the Software, in whole or in part, and
+** all derivative works of the Software, unless such copies or derivative
+** works are solely in the form of machine-executable object code generated by
+** a source language processor.
+**
+** THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+** DEALINGS IN THE SOFTWARE.
+-------------------------------------------------------------------
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+Autoconf Exception
+
+As a special exception, the Free Software Foundation gives unlimited
+permission to copy, distribute and modify the configure scripts that are the
+output of Autoconf. You need not follow the terms of the GNU General Public
+License when using or distributing such scripts, even though portions of the
+text of Autoconf appear in them. The GNU General Public License (GPL) does
+govern all other use of the material that constitutes the Autoconf program.
+
+Certain portions of the Autoconf source text are designed to be copied (in
+certain cases, depending on the input) into the output of Autoconf. We call
+these the "data" portions. The rest of the Autoconf source text consists of
+comments plus executable code that decides which of the data portions to
+output in any given case. We call these comments and executable code the "non-
+data" portions. Autoconf never copies any of the non-data portions into its
+output.
+
+This special exception to the GPL applies to versions of Autoconf released by
+the Free Software Foundation. When you make and distribute a modified version
+of Autoconf, you may extend this special exception to the GPL to apply to your
+modified version as well, *unless* your modified version has the potential to
+copy into its output some of the text that was the non-data portion of the
+version that you started with. (In other words, unless your change moves or
+copies text from the non-data portions to the data portions.) If your
+modification has such potential, you must delete any notice of this special
+exception to the GPL from your modified version.
+
+                     END OF TERMS AND CONDITIONS
+-------------------------------------------------------------------
+AUTOCONF CONFIGURE SCRIPT EXCEPTION
+
+Version 3.0, 18 August 2009
+
+Copyright © 2009 Free Software Foundation, Inc. <http://fsf.org/>
+
+Everyone is permitted to copy and distribute verbatim copies of this license
+document, but changing it is not allowed.
+
+This Exception is an additional permission under section 7 of the GNU General
+Public License, version 3 ("GPLv3"). It applies to a given file that bears a
+notice placed by the copyright holder of the file stating that the file is
+governed by GPLv3 along with this Exception.
+
+The purpose of this Exception is to allow distribution of Autoconf&apos;s
+typical output under terms of the recipient&apos;s choice (including
+proprietary).
+
+0. Definitions.
+"Covered Code" is the source or object code of a version of Autoconf that is a
+covered work under this License.
+
+"Normally Copied Code" for a version of Autoconf means all parts of its
+Covered Code which that version can copy from its code (i.e., not from its
+input file) into its minimally verbose, non-debugging and non-tracing output.
+
+"Ineligible Code" is Covered Code that is not Normally Copied Code.
+
+1. Grant of Additional Permission.
+You have permission to propagate output of Autoconf, even if such propagation
+would otherwise violate the terms of GPLv3. However, if by modifying Autoconf
+you cause any Ineligible Code of the version you received to become Normally
+Copied Code of your modified version, then you void this Exception for the
+resulting covered work. If you convey that resulting covered work, you must
+remove this Exception in accordance with the second paragraph of Section 7 of
+GPLv3.
+
+2. No Weakening of Autoconf Copyleft.
+The availability of this Exception does not imply any general presumption that
+third-party software is unaffected by the copyleft requirements of the license
+of Autoconf.
+-------------------------------------------------------------------
+iccjpeg
+
+(Copied from the README.)
+
+--------------------------------------------------------------------------------
+
+LICENSE extracted from IJG&#x27;s jpeg distribution:
+-----------------------------------------------
+
+In plain English:
+
+1. We don&#x27;t promise that this software works.  (But if you find any bugs,
+   please let us know!)
+2. You can use this software for whatever you want.  You don&#x27;t have to pay us.
+3. You may not pretend that you wrote this software.  If you use it in a
+   program, you must acknowledge somewhere in your documentation that
+   you&#x27;ve used the IJG code.
+
+In legalese:
+
+The authors make NO WARRANTY or representation, either express or implied,
+with respect to this software, its quality, accuracy, merchantability, or
+fitness for a particular purpose.  This software is provided &quot;AS IS&quot;, and you,
+its user, assume the entire risk as to its quality and accuracy.
+
+This software is copyright (C) 1991-1998, Thomas G. Lane.
+All Rights Reserved except as specified below.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+software (or portions thereof) for any purpose, without fee, subject to these
+conditions:
+(1) If any part of the source code for this software is distributed, then this
+README file must be included, with this copyright and no-warranty notice
+unaltered; and any additions, deletions, or changes to the original files
+must be clearly indicated in accompanying documentation.
+(2) If only executable code is distributed, then the accompanying
+documentation must state that &quot;this software is based in part on the work of
+the Independent JPEG Group&quot;.
+(3) Permission for use of this software is granted only if the user accepts
+full responsibility for any undesirable consequences; the authors accept
+NO LIABILITY for damages of any kind.
+
+These conditions apply to any software derived from or based on the IJG code,
+not just to the unmodified library.  If you use our work, you ought to
+acknowledge us.
+
+Permission is NOT granted for the use of any IJG author&#x27;s name or company name
+in advertising or publicity relating to this software or products derived from
+it.  This software may be referred to only as &quot;the Independent JPEG Group&#x27;s
+software&quot;.
+
+We specifically permit and encourage the use of this software as the basis of
+commercial products, provided that all warranty or liability claims are
+assumed by the product vendor.
+-------------------------------------------------------------------
+The JsonCpp library&#x27;s source code, including accompanying documentation, 
+tests and demonstration applications, are licensed under the following
+conditions...
+
+The author (Baptiste Lepilleur) explicitly disclaims copyright in all 
+jurisdictions which recognize such a disclaimer. In such jurisdictions, 
+this software is released into the Public Domain.
+
+In jurisdictions which do not recognize Public Domain property (e.g. Germany as of
+2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is
+released under the terms of the MIT License (see below).
+
+In jurisdictions which recognize Public Domain property, the user of this 
+software may choose to accept it either as 1) Public Domain, 2) under the 
+conditions of the MIT License (see below), or 3) under the terms of dual 
+Public Domain/MIT License conditions described here, as they choose.
+
+The MIT License is about as close to Public Domain as a license can get, and is
+described in clear, concise terms at:
+
+   http://en.wikipedia.org/wiki/MIT_License
+   
+The full text of the MIT License follows:
+
+========================================================================
+Copyright (c) 2007-2010 Baptiste Lepilleur
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the &quot;Software&quot;), to deal in the Software without
+restriction, including without limitation the rights to use, copy,
+modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+========================================================================
+(END LICENSE TEXT)
+
+The MIT license is compatible with both the GPL and commercial
+software, affording one all of the rights of Public Domain with the
+minor nuisance of being required to keep the above copyright notice
+and license text in the source code. Note also that by accepting the
+Public Domain &quot;license&quot; you can re-license your copy using whatever
+license you like.
+-------------------------------------------------------------------
+libjpeg-turbo Licenses
+======================
+
+libjpeg-turbo is covered by three compatible BSD-style open source licenses:
+
+- The IJG (Independent JPEG Group) License, which is listed in
+  [README.ijg](README.ijg)
+
+  This license applies to the libjpeg API library and associated programs
+  (any code inherited from libjpeg, and any modifications to that code.)
+
+- The Modified (3-clause) BSD License, which is listed below
+
+  This license covers the TurboJPEG API library and associated programs, as
+  well as the build system.
+
+- The [zlib License](https://opensource.org/licenses/Zlib)
+
+  This license is a subset of the other two, and it covers the libjpeg-turbo
+  SIMD extensions.
+
+
+Complying with the libjpeg-turbo Licenses
+=========================================
+
+This section provides a roll-up of the libjpeg-turbo licensing terms, to the
+best of our understanding.
+
+1.  If you are distributing a modified version of the libjpeg-turbo source,
+    then:
+
+    1.  You cannot alter or remove any existing copyright or license notices
+        from the source.
+
+        **Origin**
+        - Clause 1 of the IJG License
+        - Clause 1 of the Modified BSD License
+        - Clauses 1 and 3 of the zlib License
+
+    2.  You must add your own copyright notice to the header of each source
+        file you modified, so others can tell that you modified that file (if
+        there is not an existing copyright header in that file, then you can
+        simply add a notice stating that you modified the file.)
+
+        **Origin**
+        - Clause 1 of the IJG License
+        - Clause 2 of the zlib License
+
+    3.  You must include the IJG README file, and you must not alter any of the
+        copyright or license text in that file.
+
+        **Origin**
+        - Clause 1 of the IJG License
+
+2.  If you are distributing only libjpeg-turbo binaries without the source, or
+    if you are distributing an application that statically links with
+    libjpeg-turbo, then:
+
+    1.  Your product documentation must include a message stating:
+
+        This software is based in part on the work of the Independent JPEG
+        Group.
+
+        **Origin**
+        - Clause 2 of the IJG license
+
+    2.  If your binary distribution includes or uses the TurboJPEG API, then
+        your product documentation must include the text of the Modified BSD
+        License (see below.)
+
+        **Origin**
+        - Clause 2 of the Modified BSD License
+
+3.  You cannot use the name of the IJG or The libjpeg-turbo Project or the
+    contributors thereof in advertising, publicity, etc.
+
+    **Origin**
+    - IJG License
+    - Clause 3 of the Modified BSD License
+
+4.  The IJG and The libjpeg-turbo Project do not warrant libjpeg-turbo to be
+    free of defects, nor do we accept any liability for undesirable
+    consequences resulting from your use of the software.
+
+    **Origin**
+    - IJG License
+    - Modified BSD License
+    - zlib License
+-------------------------------------------------------------------
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the &quot;Software&quot;), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is fur-
+nished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
+NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
+NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Daniel Veillard shall not
+be used in advertising or otherwise to promote the sale, use or other deal-
+ings in this Software without prior written authorization from him.
+-------------------------------------------------------------------
+LZMA SDK is placed in the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or distribute the
+original LZMA SDK code, either in source code form or as a compiled binary,
+for any purpose, commercial or non-commercial, and by any means.
+-------------------------------------------------------------------
+ ******    *****   ******   UnRAR - free utility for RAR archives
+ **   **  **   **  **   **  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ******   *******  ******    License for use and distribution of
+ **   **  **   **  **   **   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ **   **  **   **  **   **         FREE portable version
+                                   ~~~~~~~~~~~~~~~~~~~~~
+
+      The source code of UnRAR utility is freeware. This means:
+
+   1. All copyrights to RAR and the utility UnRAR are exclusively
+      owned by the author - Alexander Roshal.
+
+   2. UnRAR source code may be used in any software to handle
+      RAR archives without limitations free of charge, but cannot be
+      used to develop RAR (WinRAR) compatible archiver and to
+      re-create RAR compression algorithm, which is proprietary.
+      Distribution of modified UnRAR source code in separate form
+      or as a part of other software is permitted, provided that
+      full text of this paragraph, starting from &quot;UnRAR source code&quot;
+      words, is included in license, or in documentation if license
+      is not available, and in source code comments of resulting package.
+
+   3. The UnRAR utility may be freely distributed. It is allowed
+      to distribute UnRAR inside of other software packages.
+
+   4. THE RAR ARCHIVER AND THE UnRAR UTILITY ARE DISTRIBUTED &quot;AS IS&quot;.
+      NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED.  YOU USE AT 
+      YOUR OWN RISK. THE AUTHOR WILL NOT BE LIABLE FOR DATA LOSS, 
+      DAMAGES, LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING
+      OR MISUSING THIS SOFTWARE.
+
+   5. Installing and using the UnRAR utility signifies acceptance of
+      these terms and conditions of the license.
+
+   6. If you don&#x27;t agree with terms of the license you must remove
+      UnRAR files from your storage devices and cease to use the
+      utility.
+
+      Thank you for your interest in RAR and UnRAR.
+
+
+                                            Alexander L. Roshal
+-------------------------------------------------------------------
+Additional IP Rights Grant (Patents)
+------------------------------------
+
+&quot;These implementations&quot; means the copyrightable works that implement the WebM
+codecs distributed by Google as part of the WebM Project.
+
+Google hereby grants to you a perpetual, worldwide, non-exclusive, no-charge,
+royalty-free, irrevocable (except as stated in this section) patent license to
+make, have made, use, offer to sell, sell, import, transfer, and otherwise
+run, modify and propagate the contents of these implementations of WebM, where
+such license applies only to those patent claims, both currently owned by
+Google and acquired in the future, licensable by Google that are necessarily
+infringed by these implementations of WebM. This grant does not include claims
+that would be infringed only as a consequence of further modification of these
+implementations. If you or your agent or exclusive licensee institute or order
+or agree to the institution of patent litigation or any other patent
+enforcement activity against any entity (including a cross-claim or
+counterclaim in a lawsuit) alleging that any of these implementations of WebM
+or any code incorporated within any of these implementations of WebM
+constitute direct or contributory patent infringement, or inducement of
+patent infringement, then any patent rights granted to you under this License
+for these implementations of WebM shall terminate as of the date such
+litigation is filed.
+-------------------------------------------------------------------
+
+Copyright (C) 1997 Gregory Pietsch
+
+[These files] are hereby placed in the public domain without restrictions. Just
+give the author credit, don&#x27;t claim you wrote it or prevent anyone else from
+using it.
+
+-------------------------------------------------------------------
+
+Copyright 2001-2011 Xiph.Org, Skype Limited, Octasic,
+                    Jean-Marc Valin, Timothy B. Terriberry,
+                    CSIRO, Gregory Maxwell, Mark Borgerding,
+                    Erik de Castro Lopo
+
+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 Internet Society, IETF or IETF Trust, nor the
+names of specific 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&#x27;&#x27; 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.
+
+Opus is subject to the royalty-free patent licenses which are
+specified at:
+
+Xiph.Org Foundation:
+https://datatracker.ietf.org/ipr/1524/
+
+Microsoft Corporation:
+https://datatracker.ietf.org/ipr/1914/
+
+Broadcom Corporation:
+https://datatracker.ietf.org/ipr/1526/
+
+-------------------------------------------------------------------
+
+(WebKit doesn&#x27;t distribute an explicit license.  This LICENSE is derived from
+license text in the source.)
+
+Copyright (c) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+2006, 2007 Alexander Kellett, Alexey Proskuryakov, Alex Mathews, Allan
+Sandfeld Jensen, Alp Toker, Anders Carlsson, Andrew Wellington, Antti
+Koivisto, Apple Inc., Arthur Langereis, Baron Schwartz, Bjoern Graf,
+Brent Fulgham, Cameron Zwarich, Charles Samuels, Christian Dywan,
+Collabora Ltd., Cyrus Patel, Daniel Molkentin, Dave Maclachlan, David
+Smith, Dawit Alemayehu, Dirk Mueller, Dirk Schulze, Don Gibson, Enrico
+Ros, Eric Seidel, Frederik Holljen, Frerich Raabe, Friedmann Kleint,
+George Staikos, Google Inc., Graham Dennis, Harri Porten, Henry Mason,
+Hiroyuki Ikezoe, Holger Hans Peter Freyther, IBM, James G. Speth, Jan
+Alonzo, Jean-Loup Gailly, John Reis, Jonas Witt, Jon Shier, Jonas
+Witt, Julien Chaffraix, Justin Haygood, Kevin Ollivier, Kevin Watters,
+Kimmo Kinnunen, Kouhei Sutou, Krzysztof Kowalczyk, Lars Knoll, Luca
+Bruno, Maks Orlovich, Malte Starostik, Mark Adler, Martin Jones,
+Marvin Decker, Matt Lilek, Michael Emmel, Mitz Pettel, mozilla.org,
+Netscape Communications Corporation, Nicholas Shanks, Nikolas
+Zimmermann, Nokia, Oliver Hunt, Opened Hand, Paul Johnston, Peter
+Kelly, Pioneer Research Center USA, Rich Moore, Rob Buis, Robin Dunn,
+Ronald Tschalär, Samuel Weinig, Simon Hausmann, Staikos Computing
+Services Inc., Stefan Schimanski, Symantec Corporation, The Dojo
+Foundation, The Karbon Developers, Thomas Boyer, Tim Copperfield,
+Tobias Anton, Torben Weis, Trolltech, University of Cambridge, Vaclav
+Slavik, Waldo Bastian, Xan Lopez, Zack Rusin
+
+The terms and conditions vary from file to file, but are one of:
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. 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.
+
+*OR*
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. 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.
+3. Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) 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 APPLE COMPUTER, INC. ``AS IS&#x27;&#x27; 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 APPLE COMPUTER, INC. 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.
+
+-------------------------------------------------------------------
+
diff --git a/patch/METADATA b/patch/METADATA
new file mode 100644
index 0000000..f4da3b2
--- /dev/null
+++ b/patch/METADATA
@@ -0,0 +1,9 @@
+# go/google3metadata
+# proto-file: devtools/metadata/metadata.proto
+# proto-message: MetaData
+name: "cef/patch"
+description: "Patches used to build CEF"
+
+third_party: {
+  type: GOOGLE_INTERNAL
+}
diff --git a/patch/patch.cfg b/patch/patch.cfg
index 635abaa..4221df5 100755
--- a/patch/patch.cfg
+++ b/patch/patch.cfg
@@ -91,11 +91,29 @@
     'path': 'cef',
   },
   {
-    # Disregard the preprocessor symbol limits included in the CEF build. We hit
-    # this limit in our Windows sandbox build starting on the 4280 branch, but
-    # don't know why.
+    # Allow early git checkout cleanup to reduce local disk consumption, taking
+    # the checkout information from make_distrib.py's caller instead.
     #
     # Bug: b/175682493
-    'name': 'symbol_limit'
+    'name': 'allow_git_cleanup',
+    'path': 'cef',
   },
+  {
+    # Skip installing python-numpy
+    #
+    # Bug: b/197539635
+    'name': 'skip_numpy',
+  },
+  {
+    # Skip installing snapcraft
+    #
+    # Bug: b/261616949
+    'name': 'skip_snapcraft',
+  },
+  {
+    # Build the credits file based on the GN target we consume.
+    #
+    # Bug: b/204770246
+    'name': 'credits_target',
+  }
 )
diff --git a/patch/patches/allow_git_cleanup.patch b/patch/patches/allow_git_cleanup.patch
new file mode 100644
index 0000000..2e9ceed
--- /dev/null
+++ b/patch/patches/allow_git_cleanup.patch
@@ -0,0 +1,41 @@
+diff --git tools/make_distrib.py tools/make_distrib.py
+--- tools/make_distrib.py
++++ tools/make_distrib.py
+@@ -542,6 +542,18 @@
+     dest='quiet',
+     default=False,
+     help='do not output detailed status information')
++parser.add_option(
++    '--chromium-url',
++    dest='chromium_url',
++    metavar='URL',
++    help='Chromium checkout URL',
++    default='Unknown')
++parser.add_option(
++    '--chromium-rev',
++    dest='chromium_rev',
++    metavar='REVISION',
++    help='Chromium checkout revision',
++    default='Unknown')
+ (options, args) = parser.parse_args()
+ 
+ # Test the operating system.
+@@ -599,12 +611,13 @@
+ cef_rev = git.get_hash(cef_dir)
+ cef_commit_number = git.get_commit_number(cef_dir)
+ 
++# retrieve information for Chromium
+ if not git.is_checkout(src_dir):
+-  raise Exception('Not a valid checkout: %s' % (src_dir))
+-
+-# retrieve information for Chromium
+-chromium_url = git.get_url(src_dir)
+-chromium_rev = git.get_hash(src_dir)
++  chromium_url = options.chromium_url
++  chromium_rev = options.chromium_rev
++else:
++  chromium_url = git.get_url(src_dir)
++  chromium_rev = git.get_hash(src_dir)
+ 
+ date = get_date()
+ 
diff --git a/patch/patches/credits_target.patch b/patch/patches/credits_target.patch
new file mode 100644
index 0000000..a9895df
--- /dev/null
+++ b/patch/patches/credits_target.patch
@@ -0,0 +1,12 @@
+diff --git components/resources/BUILD.gn components/resources/BUILD.gn
+--- components/resources/BUILD.gn
++++ components/resources/BUILD.gn
+@@ -96,6 +96,8 @@ action("about_credits") {
+ 
+   args = [
+     "--target-os=$target_os",
++    "--gn-target=//cef:libcef_static",
++    "--gn-out-dir=.",
+     "--depfile",
+     rebase_path(depfile, root_build_dir),
+     "credits",
diff --git a/patch/patches/google3_compatibility.patch b/patch/patches/google3_compatibility.patch
index 7886668..c508a3d 100644
--- a/patch/patches/google3_compatibility.patch
+++ b/patch/patches/google3_compatibility.patch
@@ -1,108 +1,8 @@
-diff --git include/base/cef_atomicops.h include/base/cef_atomicops.h
-index 96aebab..501788f 100644
---- include/base/cef_atomicops.h
-+++ include/base/cef_atomicops.h
-@@ -54,7 +54,7 @@
- #define CEF_INCLUDE_BASE_CEF_ATOMICOPS_H_
- #pragma once
- 
--#if defined(BASE_ATOMICOPS_H_)
-+#if defined(BASE_ATOMICOPS_H_) && !defined(USING_GOOGLE3_INCLUDES)
- // 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
-@@ -92,9 +92,13 @@
- // http://code.google.com/p/nativeclient/issues/detail?id=1162
- typedef int64_t Atomic64;
- #else
-+#if defined(USING_GOOGLE3_INCLUDES)
-+typedef int64_t Atomic64;
-+#else
- typedef intptr_t Atomic64;
- #endif
- #endif
-+#endif
- 
- // Use AtomicWord for a machine-sized pointer.  It will use the Atomic32 or
- // Atomic64 routines below, depending on your architecture.
-diff --git include/base/cef_basictypes.h include/base/cef_basictypes.h
-index e38f4f729..fcb0a5916 100644
---- include/base/cef_basictypes.h
-+++ include/base/cef_basictypes.h
-@@ -37,6 +37,11 @@
- 
- #include "include/base/cef_build.h"
- 
-+#if defined(USING_GOOGLE3_INCLUDES)
-+// When building CEF in google3, use the google3 header directly.
-+#include "base/integral_types.h"
-+#else  // !USING_GOOGLE3_INCLUDES
-+
- // 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.
- //
-@@ -74,6 +79,8 @@ typedef short int16;
- typedef unsigned short uint16;
- #endif
- 
-+#endif  // !USING_GOOGLE3_INCLUDES
-+
- // UTF-16 character type.
- // This should be kept synchronized with base/strings/string16.h
- #ifndef char16
-diff --git include/base/cef_bind.h include/base/cef_bind.h
-index 77c9c5573..a917a1887 100644
---- include/base/cef_bind.h
-+++ include/base/cef_bind.h
-@@ -32,7 +32,7 @@
- #define CEF_INCLUDE_BASE_CEF_BIND_H_
- #pragma once
- 
--#if defined(BASE_BIND_H_)
-+#if defined(BASE_BIND_H_) && !defined(USING_GOOGLE3_INCLUDES)
- // 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
-diff --git include/base/cef_bind_helpers.h include/base/cef_bind_helpers.h
-index 2b4798b2c..b220b9934 100644
---- include/base/cef_bind_helpers.h
-+++ include/base/cef_bind_helpers.h
-@@ -170,7 +170,7 @@
- #define CEF_INCLUDE_BASE_CEF_BIND_HELPERS_H_
- #pragma once
- 
--#if defined(BASE_BIND_HELPERS_H_)
-+#if defined(BASE_BIND_HELPERS_H_) && !defined(USING_GOOGLE3_INCLUDES)
- // 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
-diff --git include/base/cef_callback.h include/base/cef_callback.h
-index 16e238a97..83cb0ebe4 100644
---- include/base/cef_callback.h
-+++ include/base/cef_callback.h
-@@ -32,7 +32,7 @@
- #define CEF_INCLUDE_BASE_CEF_CALLBACK_H_
- #pragma once
- 
--#if defined(BASE_CALLBACK_H_)
-+#if defined(BASE_CALLBACK_H_) && !defined(USING_GOOGLE3_INCLUDES)
- // 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
 diff --git include/base/cef_callback_forward.h include/base/cef_callback_forward.h
-index d604d7cfa..e434bd12f 100644
+index 2d2277433..efd45fd0a 100644
 --- include/base/cef_callback_forward.h
 +++ include/base/cef_callback_forward.h
-@@ -32,7 +32,7 @@
- #define INCLUDE_BASE_CEF_CALLBACK_FORWARD_H_
- #pragma once
- 
--#if defined(BASE_CALLBACK_FORWARD_H_)
-+#if defined(BASE_CALLBACK_FORWARD_H_) && !defined(USING_GOOGLE3_INCLUDES)
- // 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
-@@ -54,6 +54,27 @@ typedef Callback<void(void)> Closure;
+@@ -58,6 +58,27 @@ using RepeatingClosure = RepeatingCallback<void()>;
  
  }  // namespace base
  
@@ -130,63 +30,12 @@
  #endif  // !!USING_CHROMIUM_INCLUDES
  
  #endif  // INCLUDE_BASE_CEF_CALLBACK_FORWARD_H_
-diff --git include/base/cef_callback_helpers.h include/base/cef_callback_helpers.h
-index ebe074a1f..1692cfde5 100644
---- include/base/cef_callback_helpers.h
-+++ include/base/cef_callback_helpers.h
-@@ -41,7 +41,7 @@
- #define CEF_INCLUDE_BASE_CEF_CALLBACK_HELPERS_H_
- #pragma once
- 
--#if defined(BASE_CALLBACK_HELPERS_H_)
-+#if defined(BASE_CALLBACK_HELPERS_H_) && !defined(USING_GOOGLE3_INCLUDES)
- // 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
-diff --git include/base/cef_callback_list.h include/base/cef_callback_list.h
-index e0ef3665b..8e0a5d6e5 100644
---- include/base/cef_callback_list.h
-+++ include/base/cef_callback_list.h
-@@ -32,7 +32,7 @@
- #define CEF_INCLUDE_BASE_CEF_CALLBACK_LIST_H_
- #pragma once
- 
--#if defined(BASE_CALLBACK_LIST_H_)
-+#if defined(BASE_CALLBACK_LIST_H_) && !defined(USING_GOOGLE3_INCLUDES)
- // 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
-diff --git include/base/cef_cancelable_callback.h include/base/cef_cancelable_callback.h
-index febce3a32..c1cfbf03d 100644
---- include/base/cef_cancelable_callback.h
-+++ include/base/cef_cancelable_callback.h
-@@ -69,7 +69,7 @@
- #define CEF_INCLUDE_BASE_CEF_CANCELABLE_CALLBACK_H_
- #pragma once
- 
--#if defined(BASE_CANCELABLE_CALLBACK_H_)
-+#if defined(BASE_CANCELABLE_CALLBACK_H_) && !defined(USING_GOOGLE3_INCLUDES)
- // 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
-diff --git include/base/cef_lock.h include/base/cef_lock.h
-index 6909bd6f2..cc122cafd 100644
---- include/base/cef_lock.h
-+++ include/base/cef_lock.h
-@@ -32,7 +32,7 @@
- #define CEF_INCLUDE_BASE_CEF_LOCK_H_
- #pragma once
- 
--#if defined(BASE_SYNCHRONIZATION_LOCK_H_)
-+#if defined(BASE_SYNCHRONIZATION_LOCK_H_) && !defined(USING_GOOGLE3_INCLUDES)
- // 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
 diff --git include/base/cef_logging.h include/base/cef_logging.h
-index 8d8bb889e..fef75d78b 100644
+diff --git include/base/cef_logging.h include/base/cef_logging.h
+index 31adf2151..8b40bd876 100644
 --- include/base/cef_logging.h
 +++ include/base/cef_logging.h
-@@ -140,7 +140,7 @@
+@@ -160,7 +160,7 @@
  // When building CEF include the Chromium header directly.
  #include "base/logging.h"
  #include "base/notreached.h"
@@ -195,7 +44,7 @@
  // Do nothing if the macros provided by this header already exist.
  // This can happen in cases where Chromium code is used directly by the
  // client application. When using Chromium code directly always include
-@@ -163,6 +163,12 @@
+@@ -183,6 +183,12 @@
  #include <sstream>
  #include <string>
  
@@ -206,9 +55,9 @@
 +#endif  // USING_GOOGLE3_INCLUDES
 +
  #include "include/base/cef_build.h"
- #include "include/base/cef_macros.h"
  #include "include/internal/cef_logging_internal.h"
-@@ -199,6 +205,8 @@
+ 
+@@ -218,6 +224,8 @@ const LogSeverity LOG_DFATAL = LOG_ERROR;
  const LogSeverity LOG_DFATAL = LOG_FATAL;
  #endif
  
@@ -217,7 +66,7 @@
  // A few definitions of macros that don't generate much code. These are used
  // by LOG() and LOG_IF, etc. Since these are used all over our code, it's
  // better to have compact code for these operations.
-@@ -356,6 +364,8 @@
+@@ -375,6 +383,8 @@ const LogSeverity LOG_0 = LOG_ERROR;
            (val1), (val2), #val1 " " #op " " #val2))           \
    cef::logging::LogMessage(__FILE__, __LINE__, _result).stream()
  
@@ -226,7 +75,7 @@
  // Build the error message string.  This is separate from the "Impl"
  // function template because it is not performance critical and so can
  // be out of line, while the "Impl" code should be inline.  Caller
-@@ -393,6 +403,8 @@
+@@ -412,6 +422,8 @@ extern template std::string* MakeCheckOpString<std::string, std::string>(
      const char* name);
  #endif
  
@@ -235,7 +84,7 @@
  // Helper functions for CHECK_OP macro.
  // The (int, int) specialization works around the issue that the compiler
  // will not instantiate the template version of the function on values of
-@@ -433,12 +445,16 @@
+@@ -452,12 +464,16 @@ DEFINE_CHECK_OP_IMPL(GT, >)
  #define ENABLE_DLOG 1
  #endif
  
@@ -252,18 +101,13 @@
  // Definitions for DLOG et al.
  
  #if ENABLE_DLOG
-@@ -554,6 +570,8 @@
+@@ -573,12 +589,18 @@ const LogSeverity LOG_DCHECK = LOG_INFO;
  #define DCHECK_GE(val1, val2) DCHECK_OP(GE, >=, val1, val2)
  #define DCHECK_GT(val1, val2) DCHECK_OP(GT, >, val1, val2)
  
 +#endif  // !USING_GOOGLE3_INCLUDES
 +
- #if defined(NDEBUG) && defined(OS_CHROMEOS)
- #define NOTREACHED() \
-   LOG(ERROR) << "NOTREACHED() hit in " << __FUNCTION__ << ". "
-@@ -561,10 +579,14 @@
  #define NOTREACHED() DCHECK(false)
- #endif
  
 +#if !defined(USING_GOOGLE3_INCLUDES)
 +
@@ -276,16 +120,16 @@
  // This class more or less represents a particular log message.  You
  // create an instance of LogMessage and then stream stuff to it.
  // When you finish streaming to it, ~LogMessage is called and the
-@@ -707,6 +729,8 @@
-   return out << wstr.c_str();
+@@ -731,6 +753,8 @@ inline std::ostream& operator<<(std::ostream& out, const char16_t* wstr) {
  }
+ #endif
  
 +#if !defined(USING_GOOGLE3_INCLUDES)
 +
  // The NOTIMPLEMENTED() macro annotates codepaths which have
  // not been implemented yet.
  //
-@@ -756,6 +780,8 @@
+@@ -780,6 +804,8 @@ inline std::ostream& operator<<(std::ostream& out, const char16_t* wstr) {
    EAT_STREAM_PARAMETERS
  #endif
  
@@ -295,123 +139,27 @@
  
  #endif  // CEF_INCLUDE_BASE_CEF_LOGGING_H_
 diff --git include/base/cef_macros.h include/base/cef_macros.h
-index e714529cd..67588c615 100644
+index f5517f9cb..64adf3132 100644
 --- include/base/cef_macros.h
 +++ include/base/cef_macros.h
-@@ -35,8 +35,10 @@
- #if defined(USING_CHROMIUM_INCLUDES)
- // When building CEF include the Chromium header directly.
- #include "base/macros.h"
--
--#else  // !USING_CHROMIUM_INCLUDES
-+#elif defined(USING_GOOGLE3_INCLUDES)
+@@ -33,6 +33,11 @@
+ #pragma once
+ 
+ #if !defined(USING_CHROMIUM_INCLUDES)
++#if defined(USING_GOOGLE3_INCLUDES)
 +// When building CEF in google3, use the google3 header directly.
 +#include "base/macros.h"
 +#else  // !USING_GOOGLE3_INCLUDES
++
  // The following is substantially similar to the Chromium implementation.
  // If the Chromium implementation diverges the below implementation should be
  // updated to match.
-diff --git include/base/cef_platform_thread.h include/base/cef_platform_thread.h
-index d3fdd798e..15cb0951b 100644
---- include/base/cef_platform_thread.h
-+++ include/base/cef_platform_thread.h
-@@ -35,7 +35,7 @@
- #ifndef CEF_INCLUDE_BASE_PLATFORM_THREAD_H_
- #define CEF_INCLUDE_BASE_PLATFORM_THREAD_H_
+@@ -58,6 +63,8 @@
+   TypeName() = delete;                           \
+   DISALLOW_COPY_AND_ASSIGN(TypeName)
  
--#if defined(BASE_THREADING_PLATFORM_THREAD_H_)
-+#if defined(BASE_THREADING_PLATFORM_THREAD_H_) && !defined(USING_GOOGLE3_INCLUDES)
- // 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
-diff --git include/base/cef_ref_counted.h include/base/cef_ref_counted.h
-index 7a687070c..93d8cbeaa 100644
---- include/base/cef_ref_counted.h
-+++ include/base/cef_ref_counted.h
-@@ -33,7 +33,7 @@
- #define CEF_INCLUDE_BASE_CEF_REF_COUNTED_H_
- #pragma once
++#endif  // !USING_GOOGLE3_INCLUDES
++
+ #endif  // !USING_CHROMIUM_INCLUDES
  
--#if defined(BASE_MEMORY_REF_COUNTED_H_)
-+#if defined(BASE_MEMORY_REF_COUNTED_H_) && !defined(USING_GOOGLE3_INCLUDES)
- // 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
-diff --git include/base/cef_scoped_ptr.h include/base/cef_scoped_ptr.h
-index eb9e0e29b..6efc7ca85 100644
---- include/base/cef_scoped_ptr.h
-+++ include/base/cef_scoped_ptr.h
-@@ -114,7 +114,7 @@
- #define CEF_INCLUDE_BASE_CEF_MEMORY_SCOPED_PTR_H_
- #pragma once
- 
--#if defined(BASE_MEMORY_SCOPED_PTR_H_)
-+#if defined(BASE_MEMORY_SCOPED_PTR_H_) && !defined(USING_GOOGLE3_INCLUDES)
- // 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
-diff --git include/base/cef_string16.h include/base/cef_string16.h
-index 6afcb79bd..e5cbaa861 100644
---- include/base/cef_string16.h
-+++ include/base/cef_string16.h
-@@ -32,7 +32,7 @@
- #define CEF_INCLUDE_BASE_CEF_STRING16_H_
- #pragma once
- 
--#if defined(BASE_STRINGS_STRING16_H_)
-+#if defined(BASE_STRINGS_STRING16_H_) && !defined(USING_GOOGLE3_INCLUDES)
- // 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
-diff --git include/base/cef_template_util.h include/base/cef_template_util.h
-index 38fa5839c..6c70dd2ac 100644
---- include/base/cef_template_util.h
-+++ include/base/cef_template_util.h
-@@ -32,7 +32,7 @@
- #define CEF_INCLUDE_BASE_CEF_TEMPLATE_UTIL_H_
- #pragma once
- 
--#if defined(BASE_TEMPLATE_UTIL_H_)
-+#if defined(BASE_TEMPLATE_UTIL_H_) && !defined(USING_GOOGLE3_INCLUDES)
- // 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
-diff --git include/base/cef_thread_checker.h include/base/cef_thread_checker.h
-index e48c8d033..c582e1377 100644
---- include/base/cef_thread_checker.h
-+++ include/base/cef_thread_checker.h
-@@ -32,7 +32,7 @@
- #define CEF_INCLUDE_BASE_THREAD_CHECKER_H_
- #pragma once
- 
--#if defined(BASE_THREADING_THREAD_CHECKER_H_)
-+#if defined(BASE_THREADING_THREAD_CHECKER_H_) && !defined(USING_GOOGLE3_INCLUDES)
- // 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
-diff --git include/base/cef_tuple.h include/base/cef_tuple.h
-index aeb6e9cea..f6b86167f 100644
---- include/base/cef_tuple.h
-+++ include/base/cef_tuple.h
-@@ -56,7 +56,7 @@
- #define CEF_INCLUDE_BASE_CEF_TUPLE_H_
- #pragma once
- 
--#if defined(BASE_TUPLE_H_)
-+#if defined(BASE_TUPLE_H_) && !defined(USING_GOOGLE3_INCLUDES)
- // 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
-diff --git include/base/cef_weak_ptr.h include/base/cef_weak_ptr.h
-index 1ba34b9db..2cf2f1787 100644
---- include/base/cef_weak_ptr.h
-+++ include/base/cef_weak_ptr.h
-@@ -96,7 +96,7 @@
- #define CEF_INCLUDE_BASE_CEF_WEAK_PTR_H_
- #pragma once
- 
--#if defined(BASE_MEMORY_WEAK_PTR_H_)
-+#if defined(BASE_MEMORY_WEAK_PTR_H_) && !defined(USING_GOOGLE3_INCLUDES)
- // 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
+ #endif  // CEF_INCLUDE_BASE_CEF_MACROS_H_
diff --git a/patch/patches/mac_toolchain_creds.patch b/patch/patches/mac_toolchain_creds.patch
index c6a53bb..25f76f0 100644
--- a/patch/patches/mac_toolchain_creds.patch
+++ b/patch/patches/mac_toolchain_creds.patch
@@ -1,11 +1,11 @@
 diff --git build/mac_toolchain.py build/mac_toolchain.py
-index 866b5f8..56f640c 100755
+index 43d336cf2f0b7..b029b66da2e6a 100755
 --- build/mac_toolchain.py
 +++ build/mac_toolchain.py
-@@ -107,6 +107,13 @@
-       'cipd', 'ensure', '-root', binaries_root, '-ensure-file', '-'
-   ]
- 
+@@ -119,6 +119,13 @@ def InstallXcodeBinaries():
+   # 'cipd ensure' is idempotent.
+   args = ['cipd', 'ensure', '-root', binaries_root, '-ensure-file', '-']
+
 +  # Buildbot slaves need to use explicit credentials. LUCI bots should NOT set
 +  # this variable. This is temporary code used to make official Xcode bots
 +  # happy. https://crbug.com/986488
@@ -13,6 +13,6 @@
 +  if creds:
 +    args.extend(['--service-account-json', creds])
 +
-   p = subprocess.Popen(
-       args, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
-       stderr=subprocess.PIPE)
+   p = subprocess.Popen(args,
+                        universal_newlines=True,
+                        stdin=subprocess.PIPE,
diff --git a/patch/patches/skip_numpy.patch b/patch/patches/skip_numpy.patch
new file mode 100644
index 0000000..35aa7d1
--- /dev/null
+++ b/patch/patches/skip_numpy.patch
@@ -0,0 +1,14 @@
+diff --git build/install-build-deps.py build/install-build-deps.py
+index 9d927e6320b78..e5e9d5ce80047 100755
+--- build/install-build-deps.py
++++ build/install-build-deps.py
+@@ -550,9 +550,6 @@ def backwards_compatible_list(options):
+   if package_exists("python-crypto"):
+     packages.append("python-crypto")
+ 
+-  if package_exists("python-numpy"):
+-    packages.append("python-numpy")
+-
+   if package_exists("python-openssl"):
+     packages.append("python-openssl")
+ 
diff --git a/patch/patches/skip_snapcraft.patch b/patch/patches/skip_snapcraft.patch
new file mode 100644
index 0000000..ac97c46
--- /dev/null
+++ b/patch/patches/skip_snapcraft.patch
@@ -0,0 +1,13 @@
+diff --git build/install-build-deps.py build/install-build-deps.py
+index 9d927e6320..ce1e435764 100755
+--- build/install-build-deps.py
++++ build/install-build-deps.py
+@@ -533,7 +533,6 @@ def backwards_compatible_list(options):
+       "msttcorefonts",
+       "python-dev",
+       "python-setuptools",
+-      "snapcraft",
+       "ttf-dejavu-core",
+       "ttf-indic-fonts",
+       "ttf-kochi-gothic",
+ 
\ No newline at end of file
diff --git a/patch/patches/symbol_limit.patch b/patch/patches/symbol_limit.patch
deleted file mode 100644
index 2068e57..0000000
--- a/patch/patches/symbol_limit.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-diff --git build/config/compiler/BUILD.gn build/config/compiler/BUILD.gn
---- build/config/compiler/BUILD.gn
-+++ build/config/compiler/BUILD.gn
-@@ -1566,12 +1566,7 @@
-           "-Wno-implicit-fallthrough",
-         ]
- 
-+        cflags += [ "-Wno-max-tokens" ]
--        if (enable_wmax_tokens) {
--          cflags += [ "-Wmax-tokens" ]
--        } else {
--          # TODO(https://crbug.com/1049569): Remove after Clang 87b235db.
--          cflags += [ "-Wno-max-tokens" ]
--        }
-       }
-     }
-   }
diff --git a/src/.github/ISSUE_TEMPLATE/bug_report.md b/src/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..b66ff24
--- /dev/null
+++ b/src/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,35 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: ''
+labels: bug
+assignees: ''
+
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+1. Go to '...'
+2. Click on '....'
+3. Scroll down to '....'
+4. See error
+
+**Expected behavior**
+A clear and concise description of what you expected to happen and what happened instead.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+**Versions (please complete the following information):**
+ - OS: [e.g. Windows 10, MacOS 13.2, Ubuntu 22.10]
+ - CEF Version: [e.g. 111.2.2]
+
+**Additional context**
+Does the problem reproduce with the cefclient or cefsimple sample application at the same version?
+
+Does the problem reproduce with Google Chrome at the same version?
+
+Add any other context about the problem here.
diff --git a/src/.github/ISSUE_TEMPLATE/feature_request.md b/src/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000..11fc491
--- /dev/null
+++ b/src/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,20 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ''
+labels: enhancement
+assignees: ''
+
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've considered.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.
diff --git a/src/BUILD.gn b/src/BUILD.gn
index 2722b23..b2c95fa 100644
--- a/src/BUILD.gn
+++ b/src/BUILD.gn
@@ -96,9 +96,9 @@
 import("//base/allocator/allocator.gni")
 import("//build/config/features.gni")
 import("//build/config/locales.gni")
+import("//build/config/ozone.gni")
 import("//build/config/sanitizers/sanitizers.gni")
 import("//build/config/ui.gni")
-import("//cef/cef_repack_locales.gni")
 import("//chrome/common/features.gni")
 import("//content/public/app/mac_helpers.gni")
 import("//extensions/buildflags/buildflags.gni")
@@ -106,6 +106,7 @@
 import("//mojo/public/tools/bindings/mojom.gni")
 import("//ppapi/buildflags/buildflags.gni")
 import("//printing/buildflags/buildflags.gni")
+import("//rlz/buildflags/buildflags.gni")
 import("//testing/test.gni")
 import("//third_party/icu/config.gni")
 import("//third_party/widevine/cdm/widevine.gni")
@@ -122,11 +123,10 @@
   import("//third_party/fontconfig/fontconfig.gni")
 }
 if (is_mac) {
+  import("//build/apple/tweak_info_plist.gni")
   import("//build/config/mac/rules.gni")
-  import("//build/mac/tweak_info_plist.gni")
-  import("//build/util/version.gni")
+  import("//chrome/version.gni")
   import("//media/cdm/library_cdm/cdm_paths.gni")
-  import("//build/config/mac/base_rules.gni")
 
   # Template to compile .xib and .storyboard files.
   #
@@ -258,17 +258,22 @@
 # Enable support for Widevine CDM.
 assert(enable_widevine)
 
+if (is_mac || is_win) {
+  # Enable Widevine CDM host verification and storage ID.
+  assert(enable_cdm_host_verification)
+  assert(enable_cdm_storage_id)
+  assert(alternate_cdm_storage_id_key != "")
+  assert(enable_rlz)
+}
+
+# Enable Views UI framework.
+assert(toolkit_views)
+
 if (is_clang) {
   # Don't use the chrome style plugin.
   assert(!clang_use_chrome_plugins)
 }
 
-if (is_mac) {
-  # Always generate dSYM files. The make_distrib script will fail if
-  # enable_dsyms=true is not explicitly set when is_official_build=false.
-  assert(enable_dsyms)
-}
-
 
 #
 # Local variables.
@@ -314,16 +319,12 @@
     ":libcef_static_unittests",
   ]
 
-  if (!is_linux || use_x11) {
+  if (!is_linux || ozone_platform_x11) {
     deps += [ ":cefclient" ]
   }
 }
 
 
-#
-# libcef static target.
-#
-
 if (is_win) {
   # Target for building code that accesses chrome_elf internals. Included from
   # the //chrome_elf:crash target. Defined as a static_library instead of a
@@ -365,19 +366,32 @@
 
       # Required by content_switches.cc
       "//media:media_buildflags",
+
+      # Required by crash_keys.cc (from base/stl_util.h)
+      "//third_party/abseil-cpp:absl",
     ]
   }
 }
 
-# libcef_static source files that have unit tests.
+
+#
+# Test support targets.
+#
+
+# Source files that are linked into libcef and cef_framework and tested by
+# libcef_static_unittests. These sources provide libcef-internal functionality
+# that is limited in scope (e.g. utility classes/methods).
 source_set("libcef_static_unittested") {
   sources = [
     "libcef/browser/devtools/devtools_util.cc",
     "libcef/browser/devtools/devtools_util.h",
+    "libcef/browser/geometry_util.h",
+    "libcef/browser/geometry_util.cc",
   ]
 
   deps = [
     "//base",
+    "//ui/gfx/geometry",
   ]
 
   configs += [
@@ -386,10 +400,14 @@
   ]
 }
 
-# Executable target for libcef_static unit tests.
+# Executable target that provides test coverage for libcef_static_unittested
+# source files.
 test("libcef_static_unittests") {
+  testonly = true
+
   sources = [
     "libcef/browser/devtools/devtools_util_unittest.cc",
+    "libcef/browser/geometry_util_unittest.cc",
   ]
 
   deps = [
@@ -404,25 +422,84 @@
   ]
 }
 
-static_library("libcef_static") {
+# Source files that are linked into libcef and cef_framework and implement
+# interfaces exposed to ceftests via the include/test directory. These sources
+# may access Chromium/CEF internals. This is defined as a separate target from
+# libcef_static to avoid introducing testonly dependencies there.
+source_set("libcef_test_support") {
+  testonly = true
+
+  sources = [
+    "libcef/browser/test/test_helpers_impl.cc",
+    "libcef/browser/test/test_server_impl.cc",
+    "libcef/browser/test/test_server_impl.h",
+    "libcef/common/test/translator_test_impl.cc",
+  ]
+
+  deps = [
+    ":libcef_static",
+    "//net:test_support",
+
+    # Support for UI input events.
+    "//ui/views:test_support",
+  ]
+}
+
+
+#
+# libcef_static target.
+#
+
+source_set("libcef_static") {
   sources = includes_common +
             gypi_paths.autogen_cpp_includes + [
+    "libcef/browser/alloy/alloy_browser_context.cc",
+    "libcef/browser/alloy/alloy_browser_context.h",
+    "libcef/browser/alloy/alloy_browser_host_impl.cc",
+    "libcef/browser/alloy/alloy_browser_host_impl.h",
+    "libcef/browser/alloy/alloy_browser_main.cc",
+    "libcef/browser/alloy/alloy_browser_main.h",
+    "libcef/browser/alloy/alloy_content_browser_client.cc",
+    "libcef/browser/alloy/alloy_content_browser_client.h",
+    "libcef/browser/alloy/alloy_download_util.cc",
+    "libcef/browser/alloy/alloy_download_util.h",
+    "libcef/browser/alloy/alloy_web_contents_view_delegate.cc",
+    "libcef/browser/alloy/alloy_web_contents_view_delegate.h",
+    "libcef/browser/alloy/browser_platform_delegate_alloy.cc",
+    "libcef/browser/alloy/browser_platform_delegate_alloy.h",
+    "libcef/browser/alloy/dialogs/alloy_constrained_window_views_client.cc",
+    "libcef/browser/alloy/dialogs/alloy_constrained_window_views_client.h",
+    "libcef/browser/alloy/dialogs/alloy_javascript_dialog_manager_delegate.cc",
+    "libcef/browser/alloy/dialogs/alloy_javascript_dialog_manager_delegate.h",
+    "libcef/browser/alloy/dialogs/alloy_web_contents_dialog_helper.cc",
+    "libcef/browser/alloy/dialogs/alloy_web_contents_dialog_helper.h",
+    "libcef/browser/alloy/chrome_browser_process_alloy.cc",
+    "libcef/browser/alloy/chrome_browser_process_alloy.h",
+    "libcef/browser/alloy/chrome_profile_manager_alloy.cc",
+    "libcef/browser/alloy/chrome_profile_manager_alloy.h",
+    "libcef/browser/alloy/chrome_profile_alloy.cc",
+    "libcef/browser/alloy/chrome_profile_alloy.h",
     "libcef/browser/audio_capturer.cc",
     "libcef/browser/audio_capturer.h",
+    "libcef/browser/audio_loopback_stream_creator.cc",
+    "libcef/browser/audio_loopback_stream_creator.h",
+    "libcef/browser/browser_contents_delegate.cc",
+    "libcef/browser/browser_contents_delegate.h",
     "libcef/browser/browser_context.cc",
     "libcef/browser/browser_context.h",
     "libcef/browser/browser_context_keyed_service_factories.cc",
     "libcef/browser/browser_context_keyed_service_factories.h",
-    "libcef/browser/browser_host_impl.cc",
-    "libcef/browser/browser_host_impl.h",
+    "libcef/browser/browser_frame.cc",
+    "libcef/browser/browser_frame.h",
+    "libcef/browser/browser_host_base.cc",
+    "libcef/browser/browser_host_base.h",
+    "libcef/browser/browser_host_create.cc",
     "libcef/browser/browser_info.cc",
     "libcef/browser/browser_info.h",
     "libcef/browser/browser_info_manager.cc",
     "libcef/browser/browser_info_manager.h",
-    "libcef/browser/browser_main.cc",
-    "libcef/browser/browser_main.h",
-    "libcef/browser/browser_message_filter.cc",
-    "libcef/browser/browser_message_filter.h",
+    "libcef/browser/browser_manager.cc",
+    "libcef/browser/browser_manager.h",
     "libcef/browser/browser_message_loop.cc",
     "libcef/browser/browser_message_loop.h",
     "libcef/browser/browser_platform_delegate.cc",
@@ -430,15 +507,42 @@
     "libcef/browser/browser_platform_delegate_create.cc",
     "libcef/browser/browser_util.cc",
     "libcef/browser/browser_util.h",
-    "libcef/browser/chrome_browser_process_stub.cc",
-    "libcef/browser/chrome_browser_process_stub.h",
+    "libcef/browser/certificate_query.cc",
+    "libcef/browser/certificate_query.h",
+    "libcef/browser/chrome/browser_delegate.h",
+    "libcef/browser/chrome/browser_platform_delegate_chrome.cc",
+    "libcef/browser/chrome/browser_platform_delegate_chrome.h",
+    "libcef/browser/chrome/chrome_browser_context.cc",
+    "libcef/browser/chrome/chrome_browser_context.h",
+    "libcef/browser/chrome/chrome_browser_delegate.cc",
+    "libcef/browser/chrome/chrome_browser_delegate.h",
+    "libcef/browser/chrome/chrome_browser_host_impl.cc",
+    "libcef/browser/chrome/chrome_browser_host_impl.h",
+    "libcef/browser/chrome/chrome_browser_main_extra_parts_cef.cc",
+    "libcef/browser/chrome/chrome_browser_main_extra_parts_cef.h",
+    "libcef/browser/chrome/chrome_content_browser_client_cef.cc",
+    "libcef/browser/chrome/chrome_content_browser_client_cef.h",
+    "libcef/browser/chrome/chrome_context_menu_handler.cc",
+    "libcef/browser/chrome/chrome_context_menu_handler.h",
     "libcef/browser/chrome_crash_reporter_client_stub.cc",
-    "libcef/browser/chrome_profile_manager_stub.cc",
-    "libcef/browser/chrome_profile_manager_stub.h",
-    "libcef/browser/chrome_profile_stub.cc",
-    "libcef/browser/chrome_profile_stub.h",
-    "libcef/browser/content_browser_client.cc",
-    "libcef/browser/content_browser_client.h",
+    "libcef/browser/chrome/extensions/chrome_mime_handler_view_guest_delegate_cef.cc",
+    "libcef/browser/chrome/extensions/chrome_mime_handler_view_guest_delegate_cef.h",
+    "libcef/browser/chrome/views/browser_platform_delegate_chrome_child_window.cc",
+    "libcef/browser/chrome/views/browser_platform_delegate_chrome_child_window.h",
+    "libcef/browser/chrome/views/browser_platform_delegate_chrome_views.cc",
+    "libcef/browser/chrome/views/browser_platform_delegate_chrome_views.h",
+    "libcef/browser/chrome/views/chrome_browser_frame.cc",
+    "libcef/browser/chrome/views/chrome_browser_frame.h",
+    "libcef/browser/chrome/views/chrome_browser_view.cc",
+    "libcef/browser/chrome/views/chrome_browser_view.h",
+    "libcef/browser/chrome/views/chrome_child_window.cc",
+    "libcef/browser/chrome/views/chrome_child_window.h",
+    "libcef/browser/chrome/views/chrome_views_util.cc",
+    "libcef/browser/chrome/views/chrome_views_util.h",
+    "libcef/browser/chrome/views/toolbar_view_impl.cc",
+    "libcef/browser/chrome/views/toolbar_view_impl.h",
+    "libcef/browser/chrome/views/toolbar_view_view.cc",
+    "libcef/browser/chrome/views/toolbar_view_view.h",
     "libcef/browser/context.cc",
     "libcef/browser/context.h",
     "libcef/browser/context_menu_params_impl.cc",
@@ -459,10 +563,14 @@
     "libcef/browser/download_manager_delegate.h",
     "libcef/browser/extension_impl.cc",
     "libcef/browser/extension_impl.h",
+    "libcef/browser/extensions/api/file_system/cef_file_system_delegate.cc",
+    "libcef/browser/extensions/api/file_system/cef_file_system_delegate.h",
     "libcef/browser/extensions/api/storage/sync_value_store_cache.cc",
     "libcef/browser/extensions/api/storage/sync_value_store_cache.h",
     "libcef/browser/extensions/api/tabs/tabs_api.cc",
     "libcef/browser/extensions/api/tabs/tabs_api.h",
+    "libcef/browser/extensions/alloy_extensions_util.cc",
+    "libcef/browser/extensions/alloy_extensions_util.h",
     "libcef/browser/extensions/browser_extensions_util.cc",
     "libcef/browser/extensions/browser_extensions_util.h",
     "libcef/browser/extensions/browser_platform_delegate_background.cc",
@@ -493,24 +601,30 @@
     "libcef/browser/extensions/extension_web_contents_observer.h",
     "libcef/browser/extensions/mime_handler_view_guest_delegate.cc",
     "libcef/browser/extensions/mime_handler_view_guest_delegate.h",
-    "libcef/browser/extensions/pdf_extension_util.cc",
-    "libcef/browser/extensions/pdf_extension_util.h",
-    "libcef/browser/extensions/pdf_web_contents_helper_client.cc",
-    "libcef/browser/extensions/pdf_web_contents_helper_client.h",
     "libcef/browser/extensions/value_store/cef_value_store.cc",
     "libcef/browser/extensions/value_store/cef_value_store.h",
     "libcef/browser/extensions/value_store/cef_value_store_factory.cc",
     "libcef/browser/extensions/value_store/cef_value_store_factory.h",
-    "libcef/browser/file_dialog_runner.h",
     "libcef/browser/file_dialog_manager.cc",
     "libcef/browser/file_dialog_manager.h",
+    "libcef/browser/file_dialog_runner.cc",
+    "libcef/browser/file_dialog_runner.h",
     "libcef/browser/frame_host_impl.cc",
     "libcef/browser/frame_host_impl.h",
+    "libcef/browser/frame_service_base.h",
+    "libcef/browser/global_preference_manager_impl.cc",
+    "libcef/browser/global_preference_manager_impl.h",
     "libcef/browser/image_impl.cc",
     "libcef/browser/image_impl.h",
+    "libcef/browser/iothread_state.cc",
+    "libcef/browser/iothread_state.h",
     "libcef/browser/javascript_dialog_runner.h",
     "libcef/browser/javascript_dialog_manager.cc",
     "libcef/browser/javascript_dialog_manager.h",
+    "libcef/browser/main_runner.cc",
+    "libcef/browser/main_runner.h",
+    "libcef/browser/media_access_query.cc",
+    "libcef/browser/media_access_query.h",
     "libcef/browser/media_capture_devices_dispatcher.cc",
     "libcef/browser/media_capture_devices_dispatcher.h",
     "libcef/browser/media_router/media_route_impl.cc",
@@ -523,6 +637,8 @@
     "libcef/browser/media_router/media_sink_impl.h",
     "libcef/browser/media_router/media_source_impl.cc",
     "libcef/browser/media_router/media_source_impl.h",
+    "libcef/browser/media_stream_registrar.cc",
+    "libcef/browser/media_stream_registrar.h",
     "libcef/browser/menu_manager.cc",
     "libcef/browser/menu_manager.h",
     "libcef/browser/menu_model_impl.cc",
@@ -530,8 +646,10 @@
     "libcef/browser/menu_runner.h",
     "libcef/browser/native/browser_platform_delegate_native.cc",
     "libcef/browser/native/browser_platform_delegate_native.h",
-    "libcef/browser/navigate_params.cc",
-    "libcef/browser/navigate_params.h",
+    "libcef/browser/native/cursor_util.h",
+    "libcef/browser/native/cursor_util.cc",
+    "libcef/browser/native/window_delegate_view.cc",
+    "libcef/browser/native/window_delegate_view.h",
     "libcef/browser/navigation_entry_impl.cc",
     "libcef/browser/navigation_entry_impl.h",
     "libcef/browser/net/chrome_scheme_handler.cc",
@@ -543,6 +661,8 @@
     "libcef/browser/net/internal_scheme_handler.h",
     "libcef/browser/net/scheme_handler.cc",
     "libcef/browser/net/scheme_handler.h",
+    "libcef/browser/net/throttle_handler.cc",
+    "libcef/browser/net/throttle_handler.h",
     "libcef/browser/net_service/browser_urlrequest_impl.cc",
     "libcef/browser/net_service/browser_urlrequest_impl.h",
     "libcef/browser/net_service/cookie_helper.cc",
@@ -579,30 +699,32 @@
     "libcef/browser/osr/render_widget_host_view_osr.h",
     "libcef/browser/osr/synthetic_gesture_target_osr.cc",
     "libcef/browser/osr/synthetic_gesture_target_osr.h",
+    "libcef/browser/osr/touch_handle_drawable_osr.cc",
+    "libcef/browser/osr/touch_handle_drawable_osr.h",
+    "libcef/browser/osr/touch_selection_controller_client_osr.cc",
+    "libcef/browser/osr/touch_selection_controller_client_osr.h",
     "libcef/browser/osr/video_consumer_osr.cc",
     "libcef/browser/osr/video_consumer_osr.h",
     "libcef/browser/osr/web_contents_view_osr.cc",
     "libcef/browser/osr/web_contents_view_osr.h",
     "libcef/browser/path_util_impl.cc",
-    "libcef/browser/plugins/plugin_service_filter.cc",
-    "libcef/browser/plugins/plugin_service_filter.h",
+    "libcef/browser/permission_prompt.cc",
+    "libcef/browser/permission_prompt.h",
     "libcef/browser/prefs/browser_prefs.cc",
     "libcef/browser/prefs/browser_prefs.h",
+    "libcef/browser/prefs/pref_helper.cc",
+    "libcef/browser/prefs/pref_helper.h",
+    "libcef/browser/prefs/pref_registrar.cc",
+    "libcef/browser/prefs/pref_registrar.h",
     "libcef/browser/prefs/pref_store.cc",
     "libcef/browser/prefs/pref_store.h",
     "libcef/browser/prefs/renderer_prefs.cc",
     "libcef/browser/prefs/renderer_prefs.h",
     "libcef/browser/print_settings_impl.cc",
     "libcef/browser/print_settings_impl.h",
-    "libcef/browser/printing/constrained_window_views_client.cc",
-    "libcef/browser/printing/constrained_window_views_client.h",
-    "libcef/browser/printing/printing_message_filter.cc",
-    "libcef/browser/printing/printing_message_filter.h",
-    "libcef/browser/printing/print_view_manager.cc",
-    "libcef/browser/printing/print_view_manager.h",
+    "libcef/browser/printing/print_util.cc",
+    "libcef/browser/printing/print_util.h",
     "libcef/browser/process_util_impl.cc",
-    "libcef/browser/resource_context.cc",
-    "libcef/browser/resource_context.h",
     "libcef/browser/request_context_handler_map.cc",
     "libcef/browser/request_context_handler_map.h",
     "libcef/browser/request_context_impl.cc",
@@ -610,6 +732,8 @@
     "libcef/browser/scheme_impl.cc",
     "libcef/browser/server_impl.cc",
     "libcef/browser/server_impl.h",
+    "libcef/browser/simple_menu_model_impl.cc",
+    "libcef/browser/simple_menu_model_impl.h",
     "libcef/browser/speech_recognition_manager_delegate.cc",
     "libcef/browser/speech_recognition_manager_delegate.h",
     "libcef/browser/ssl_host_state_delegate.cc",
@@ -624,10 +748,64 @@
     "libcef/browser/trace_subscriber.cc",
     "libcef/browser/trace_subscriber.h",
     "libcef/browser/thread_util.h",
-    "libcef/browser/web_contents_dialog_helper.cc",
-    "libcef/browser/web_contents_dialog_helper.h",
-    "libcef/browser/web_plugin_impl.cc",
-    "libcef/browser/web_plugin_impl.h",
+    "libcef/browser/views/basic_label_button_impl.cc",
+    "libcef/browser/views/basic_label_button_impl.h",
+    "libcef/browser/views/basic_label_button_view.cc",
+    "libcef/browser/views/basic_label_button_view.h",
+    "libcef/browser/views/basic_panel_impl.cc",
+    "libcef/browser/views/basic_panel_impl.h",
+    "libcef/browser/views/basic_panel_view.cc",
+    "libcef/browser/views/basic_panel_view.h",
+    "libcef/browser/views/box_layout_impl.cc",
+    "libcef/browser/views/box_layout_impl.h",
+    "libcef/browser/views/browser_platform_delegate_views.cc",
+    "libcef/browser/views/browser_platform_delegate_views.h",
+    "libcef/browser/views/browser_view_impl.cc",
+    "libcef/browser/views/browser_view_impl.h",
+    "libcef/browser/views/browser_view_view.cc",
+    "libcef/browser/views/browser_view_view.h",
+    "libcef/browser/views/button_impl.h",
+    "libcef/browser/views/button_view.h",
+    "libcef/browser/views/display_impl.cc",
+    "libcef/browser/views/display_impl.h",
+    "libcef/browser/views/fill_layout_impl.cc",
+    "libcef/browser/views/fill_layout_impl.h",
+    "libcef/browser/views/label_button_impl.h",
+    "libcef/browser/views/label_button_view.h",
+    "libcef/browser/views/layout_impl.h",
+    "libcef/browser/views/layout_adapter.cc",
+    "libcef/browser/views/layout_adapter.h",
+    "libcef/browser/views/layout_util.cc",
+    "libcef/browser/views/layout_util.h",
+    "libcef/browser/views/menu_button_impl.cc",
+    "libcef/browser/views/menu_button_impl.h",
+    "libcef/browser/views/menu_button_view.cc",
+    "libcef/browser/views/menu_button_view.h",
+    "libcef/browser/views/menu_runner_views.cc",
+    "libcef/browser/views/menu_runner_views.h",
+    "libcef/browser/views/overlay_view_host.cc",
+    "libcef/browser/views/overlay_view_host.h",
+    "libcef/browser/views/panel_impl.h",
+    "libcef/browser/views/panel_view.h",
+    "libcef/browser/views/scroll_view_impl.cc",
+    "libcef/browser/views/scroll_view_impl.h",
+    "libcef/browser/views/scroll_view_view.cc",
+    "libcef/browser/views/scroll_view_view.h",
+    "libcef/browser/views/textfield_impl.cc",
+    "libcef/browser/views/textfield_impl.h",
+    "libcef/browser/views/textfield_view.cc",
+    "libcef/browser/views/textfield_view.h",
+    "libcef/browser/views/view_adapter.cc",
+    "libcef/browser/views/view_adapter.h",
+    "libcef/browser/views/view_impl.h",
+    "libcef/browser/views/view_util.cc",
+    "libcef/browser/views/view_util.h",
+    "libcef/browser/views/view_view.h",
+    "libcef/browser/views/widget_destruction_observer.h",
+    "libcef/browser/views/window_impl.cc",
+    "libcef/browser/views/window_impl.h",
+    "libcef/browser/views/window_view.cc",
+    "libcef/browser/views/window_view.h",
     "libcef/browser/x509_certificate_impl.cc",
     "libcef/browser/x509_certificate_impl.h",
     "libcef/browser/x509_cert_principal_impl.cc",
@@ -636,17 +814,25 @@
     "libcef/browser/xml_reader_impl.h",
     "libcef/browser/zip_reader_impl.cc",
     "libcef/browser/zip_reader_impl.h",
+    "libcef/common/alloy/alloy_content_client.cc",
+    "libcef/common/alloy/alloy_content_client.h",
+    "libcef/common/alloy/alloy_main_delegate.cc",
+    "libcef/common/alloy/alloy_main_delegate.h",
+    "libcef/common/alloy/alloy_main_runner_delegate.cc",
+    "libcef/common/alloy/alloy_main_runner_delegate.h",
+    "libcef/common/app_manager.cc",
+    "libcef/common/app_manager.h",
     "libcef/common/base_impl.cc",
-    "libcef/common/cef_message_generator.cc",
-    "libcef/common/cef_message_generator.h",
-    "libcef/common/cef_messages.cc",
-    "libcef/common/cef_messages.h",
     "libcef/common/cef_switches.cc",
     "libcef/common/cef_switches.h",
+    "libcef/common/chrome/chrome_content_client_cef.cc",
+    "libcef/common/chrome/chrome_content_client_cef.h",
+    "libcef/common/chrome/chrome_main_delegate_cef.cc",
+    "libcef/common/chrome/chrome_main_delegate_cef.h",
+    "libcef/common/chrome/chrome_main_runner_delegate.cc",
+    "libcef/common/chrome/chrome_main_runner_delegate.h",
     "libcef/common/command_line_impl.cc",
     "libcef/common/command_line_impl.h",
-    "libcef/common/content_client.cc",
-    "libcef/common/content_client.h",
     "libcef/common/crash_reporter_client.cc",
     "libcef/common/crash_reporter_client.h",
     "libcef/common/crash_reporting.cc",
@@ -664,44 +850,48 @@
     "libcef/common/file_util_impl.cc",
     "libcef/common/frame_util.cc",
     "libcef/common/frame_util.h",
+    "libcef/common/i18n_util_impl.cc",
     "libcef/common/json_impl.cc",
-    "libcef/common/main_delegate.cc",
-    "libcef/common/main_delegate.h",
+    "libcef/common/main_runner_delegate.h",
+    "libcef/common/main_runner_handler.h",
     "libcef/common/net/http_header_utils.cc",
     "libcef/common/net/http_header_utils.h",
     "libcef/common/net/net_resource_provider.cc",
     "libcef/common/net/net_resource_provider.h",
     "libcef/common/net/scheme_registration.cc",
     "libcef/common/net/scheme_registration.h",
-    "libcef/common/net/upload_data.cc",
-    "libcef/common/net/upload_data.h",
-    "libcef/common/net/upload_element.cc",
-    "libcef/common/net/upload_element.h",
+    "libcef/common/net/url_util.cc",
+    "libcef/common/net/url_util.h",
     "libcef/common/net_service/net_service_util.cc",
     "libcef/common/net_service/net_service_util.h",
     "libcef/common/parser_impl.cc",
     "libcef/common/process_message_impl.cc",
     "libcef/common/process_message_impl.h",
+    "libcef/common/process_message_smr_impl.cc",
+    "libcef/common/process_message_smr_impl.h",
     "libcef/common/request_impl.cc",
     "libcef/common/request_impl.h",
     "libcef/common/resource_bundle_delegate.cc",
     "libcef/common/resource_bundle_delegate.h",
     "libcef/common/resource_bundle_impl.cc",
     "libcef/common/resource_bundle_impl.h",
+    "libcef/common/resource_util.cc",
+    "libcef/common/resource_util.h",
     "libcef/common/response_impl.cc",
     "libcef/common/response_impl.h",
-    "libcef/common/response_manager.cc",
-    "libcef/common/response_manager.h",
     "libcef/common/scheme_registrar_impl.cc",
     "libcef/common/scheme_registrar_impl.h",
     "libcef/common/string_list_impl.cc",
     "libcef/common/string_map_impl.cc",
     "libcef/common/string_multimap_impl.cc",
     "libcef/common/string_types_impl.cc",
+    "libcef/common/string_util.cc",
+    "libcef/common/string_util.h",
     "libcef/common/task_impl.cc",
     "libcef/common/task_runner_impl.cc",
     "libcef/common/task_runner_impl.h",
-    "libcef/common/test/translator_test_impl.cc",
+    "libcef/common/task_runner_manager.cc",
+    "libcef/common/task_runner_manager.h",
     "libcef/common/thread_impl.cc",
     "libcef/common/thread_impl.h",
     "libcef/common/time_impl.cc",
@@ -715,12 +905,18 @@
     "libcef/common/values_impl.h",
     "libcef/common/waitable_event_impl.cc",
     "libcef/common/waitable_event_impl.h",
-    "libcef/common/widevine_loader.cc",
-    "libcef/common/widevine_loader.h",
+    "libcef/features/runtime.h",
+    "libcef/features/runtime_checks.h",
+    "libcef/renderer/alloy/alloy_content_renderer_client.cc",
+    "libcef/renderer/alloy/alloy_content_renderer_client.h",
+    "libcef/renderer/alloy/alloy_render_thread_observer.cc",
+    "libcef/renderer/alloy/alloy_render_thread_observer.h",
+    "libcef/renderer/alloy/url_loader_throttle_provider_impl.cc",
+    "libcef/renderer/alloy/url_loader_throttle_provider_impl.h",
     "libcef/renderer/browser_impl.cc",
     "libcef/renderer/browser_impl.h",
-    "libcef/renderer/content_renderer_client.cc",
-    "libcef/renderer/content_renderer_client.h",
+    "libcef/renderer/chrome/chrome_content_renderer_client_cef.cc",
+    "libcef/renderer/chrome/chrome_content_renderer_client_cef.h",
     "libcef/renderer/dom_document_impl.cc",
     "libcef/renderer/dom_document_impl.h",
     "libcef/renderer/dom_node_impl.cc",
@@ -737,23 +933,20 @@
     "libcef/renderer/render_frame_observer.h",
     "libcef/renderer/render_frame_util.cc",
     "libcef/renderer/render_frame_util.h",
-    "libcef/renderer/render_thread_observer.cc",
-    "libcef/renderer/render_thread_observer.h",
-    "libcef/renderer/render_urlrequest_impl.cc",
-    "libcef/renderer/render_urlrequest_impl.h",
+    "libcef/renderer/render_manager.cc",
+    "libcef/renderer/render_manager.h",
     "libcef/renderer/thread_util.h",
-    "libcef/renderer/url_loader_throttle_provider_impl.cc",
-    "libcef/renderer/url_loader_throttle_provider_impl.h",
     "libcef/renderer/v8_impl.cc",
     "libcef/renderer/v8_impl.h",
+
+    # For Chrome runtime support.
+    "//chrome/app/chrome_main_delegate.cc",
+    "//chrome/app/chrome_main_delegate.h",
   ]
 
   configs += [
     "libcef/features:config",
     "//build/config:precompiled_headers",
-
-    # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
-    "//build/config/compiler:no_size_t_to_int_warning",
   ]
 
   public_configs = [
@@ -768,11 +961,13 @@
   public_deps = [
     # Bring in feature flag defines.
     "//cef/libcef/features",
+    # Support relative include paths.
+    "//third_party/abseil-cpp:absl",
   ]
 
   deps = [
     ":cef_make_headers",
-    ":cef_service_manifests",
+    "libcef/common/mojom",
 
     ":libcef_static_unittested",
 
@@ -788,23 +983,24 @@
     "//base:base_static",
     "//base/third_party/dynamic_annotations",
     "//cc",
-    "//chrome/browser",
-    "//chrome/child",
-    "//chrome/common",
-    "//chrome/renderer",
+    "//chrome:dependencies",
+    "//chrome:packed_resources",
+    "//chrome:resources",
+    "//chrome:strings",
+    "//chrome/common:buildflags",
     "//chrome/services/printing:lib",
-    "//chrome/utility",
     "//components/cdm/renderer",
     "//components/certificate_transparency",
+    "//components/component_updater",
     "//components/content_settings/core/browser",
     "//components/content_settings/core/common",
     "//components/crx_file",
-    "//components/data_use_measurement/core",
     "//components/google/core/common",
     "//components/keyed_service/content:content",
     "//components/keyed_service/core:core",
+    "//components/media_router/common/mojom:media_router",
     "//components/navigation_interception",
-    "//components/network_session_configurator/browser",
+    "//components/network_session_configurator/common",
     "//components/pdf/browser",
     "//components/pdf/renderer",
     "//components/plugins/renderer",
@@ -813,7 +1009,6 @@
     "//components/printing/common",
     "//components/printing/renderer",
     "//components/proxy_config",
-    "//components/safe_browsing/core/db:test_database_manager",
     "//components/services/print_compositor/public/cpp",
     "//components/services/print_compositor/public/mojom",
     "//components/update_client",
@@ -825,7 +1020,7 @@
     "//components/visitedlink/renderer",
     "//components/viz/service",
     "//components/web_cache/renderer",
-    "//content/public/app:both",
+    "//content/public/app",
     "//content/public/browser",
     "//content/public/child",
     "//content/public/common",
@@ -835,7 +1030,6 @@
     "//crypto",
     "//device/base",
     "//extensions/browser",
-    "//extensions/browser:core_api_provider",
     "//extensions/buildflags",
     "//extensions/common/api",
     "//extensions/common:core_api_provider",
@@ -843,20 +1037,19 @@
     "//gpu",
     "//ipc",
     "//media",
-    "//media/blink",
     "//net",
     "//pdf",
     "//ppapi/buildflags",
     "//printing/buildflags",
     "//services/network:network_service",
     "//services/network/public/cpp",
-    "//services/service_manager/embedder",
     "//services/service_manager/public/cpp",
     "//skia",
     "//storage/browser",
     "//third_party/blink/public:blink",
     "//third_party/brotli:dec",
     "//third_party/cld_3/src/src:cld_3",
+    "//third_party/crashpad/crashpad/handler",
     "//third_party/hunspell",
     "//third_party/leveldatabase",
     "//third_party/libxml:libxml",
@@ -866,6 +1059,7 @@
     "//third_party/zlib:minizip",
     "//ui/base",
     "//ui/base/ime",
+    "//ui/events",
     "//ui/events:events_base",
     "//ui/gfx",
     "//ui/gfx/geometry",
@@ -873,33 +1067,20 @@
     "//ui/gfx/ipc/geometry",
     "//ui/gfx/ipc/skia",
     "//ui/gl",
+    "//ui/strings",
+    "//ui/views",
+    "//ui/views/controls/webview",
     "//url",
     "//v8",
   ]
 
   if (is_win) {
     sources += includes_win + [
-      "libcef/browser/browser_main_win.cc",
+      "libcef/browser/alloy/alloy_browser_main_win.cc",
       "libcef/browser/native/browser_platform_delegate_native_win.cc",
       "libcef/browser/native/browser_platform_delegate_native_win.h",
-      "libcef/browser/native/file_dialog_runner_win.cc",
-      "libcef/browser/native/file_dialog_runner_win.h",
-      "libcef/browser/native/javascript_dialog_runner_win.cc",
-      "libcef/browser/native/javascript_dialog_runner_win.h",
-      "libcef/browser/native/menu_2.cc",
-      "libcef/browser/native/menu_2.h",
-      "libcef/browser/native/menu_runner_win.cc",
-      "libcef/browser/native/menu_runner_win.h",
-      "libcef/browser/native/menu_wrapper.h",
-      "libcef/browser/native/native_menu_win.cc",
-      "libcef/browser/native/native_menu_win.h",
       "libcef/browser/osr/browser_platform_delegate_osr_win.cc",
       "libcef/browser/osr/browser_platform_delegate_osr_win.h",
-      "libcef/browser/osr/render_widget_host_view_osr_win.cc",
-
-      # Part of //chrome/utility.
-      "//chrome/utility/printing_handler.cc",
-      "//chrome/utility/printing_handler.h",
     ]
 
     deps += [
@@ -926,16 +1107,15 @@
     sources += includes_linux + [
       "libcef/browser/native/browser_platform_delegate_native_linux.cc",
       "libcef/browser/native/browser_platform_delegate_native_linux.h",
-      "libcef/browser/native/menu_runner_linux.cc",
-      "libcef/browser/native/menu_runner_linux.h",
       "libcef/browser/osr/browser_platform_delegate_osr_linux.cc",
       "libcef/browser/osr/browser_platform_delegate_osr_linux.h",
-      "libcef/browser/osr/render_widget_host_view_osr_linux.cc",
       "libcef/browser/printing/print_dialog_linux.cc",
       "libcef/browser/printing/print_dialog_linux.h",
+      "libcef/common/util_linux.h",
+      "libcef/common/util_linux.cc",
     ]
 
-    if (use_x11) {
+    if (ozone_platform_x11) {
       sources += [
         "libcef/browser/native/window_x11.cc",
         "libcef/browser/native/window_x11.h",
@@ -947,7 +1127,7 @@
       "//third_party/fontconfig",
     ]
 
-    if (is_linux && !use_x11) {
+    if (is_linux && !ozone_platform_x11) {
       deps += [
         "//third_party/angle:libEGL",
       ]
@@ -958,194 +1138,56 @@
     sources += includes_mac + [
       "libcef/browser/native/browser_platform_delegate_native_mac.h",
       "libcef/browser/native/browser_platform_delegate_native_mac.mm",
-      "libcef/browser/native/file_dialog_runner_mac.h",
-      "libcef/browser/native/file_dialog_runner_mac.mm",
+      "libcef/browser/native/cursor_util_mac.mm",
       "libcef/browser/native/javascript_dialog_runner_mac.h",
       "libcef/browser/native/javascript_dialog_runner_mac.mm",
       "libcef/browser/native/menu_runner_mac.h",
       "libcef/browser/native/menu_runner_mac.mm",
       "libcef/browser/osr/browser_platform_delegate_osr_mac.h",
       "libcef/browser/osr/browser_platform_delegate_osr_mac.mm",
+      "libcef/browser/views/native_widget_mac.h",
+      "libcef/browser/views/native_widget_mac.mm",
+      "libcef/browser/views/ns_window.h",
+      "libcef/browser/views/ns_window.mm",
+      "libcef/browser/views/view_util_mac.mm",
       "libcef/common/util_mac.h",
       "libcef/common/util_mac.mm",
+
+      # For Chrome runtime support.
+      "//chrome/app/chrome_main_mac.h",
+      "//chrome/app/chrome_main_mac.mm",
     ]
   }
 
-  if (is_win || is_mac) {
-    deps += [ "//third_party/crashpad/crashpad/handler" ]
-  }
-
-  if (use_x11) {
+  if (ozone_platform_x11) {
     deps += [ "//ui/events/devices/x11" ]
   }
 
-  if (is_posix && !is_mac) {
-    sources += [
-      "libcef/common/cef_crash_report_utils.cc",
-      "libcef/common/cef_crash_report_utils.h",
-    ]
-
-    deps += [
-      "//components/crash/core/app",
-      "//components/crash/content/browser",
-    ]
-  }
-
   if (v8_use_external_startup_data && use_v8_context_snapshot) {
     deps += [ "//tools/v8_context_snapshot" ]
   }
 
-  if (toolkit_views) {
-    deps += [
-      "//ui/views",
-    ]
-  }
-
   if (use_aura) {
     sources += [
-      "libcef/browser/native/window_delegate_view.cc",
-      "libcef/browser/native/window_delegate_view.h",
-      "libcef/browser/views/basic_label_button_impl.cc",
-      "libcef/browser/views/basic_label_button_impl.h",
-      "libcef/browser/views/basic_label_button_view.cc",
-      "libcef/browser/views/basic_label_button_view.h",
-      "libcef/browser/views/basic_panel_impl.cc",
-      "libcef/browser/views/basic_panel_impl.h",
-      "libcef/browser/views/basic_panel_view.cc",
-      "libcef/browser/views/basic_panel_view.h",
-      "libcef/browser/views/box_layout_impl.cc",
-      "libcef/browser/views/box_layout_impl.h",
-      "libcef/browser/views/browser_platform_delegate_views.cc",
-      "libcef/browser/views/browser_platform_delegate_views.h",
-      "libcef/browser/views/browser_view_impl.cc",
-      "libcef/browser/views/browser_view_impl.h",
-      "libcef/browser/views/browser_view_view.cc",
-      "libcef/browser/views/browser_view_view.h",
-      "libcef/browser/views/button_impl.h",
-      "libcef/browser/views/button_view.h",
-      "libcef/browser/views/display_impl.cc",
-      "libcef/browser/views/display_impl.h",
-      "libcef/browser/views/fill_layout_impl.cc",
-      "libcef/browser/views/fill_layout_impl.h",
-      "libcef/browser/views/label_button_impl.h",
-      "libcef/browser/views/label_button_view.h",
-      "libcef/browser/views/layout_impl.h",
-      "libcef/browser/views/layout_adapter.cc",
-      "libcef/browser/views/layout_adapter.h",
-      "libcef/browser/views/layout_util.cc",
-      "libcef/browser/views/layout_util.h",
-      "libcef/browser/views/menu_button_impl.cc",
-      "libcef/browser/views/menu_button_impl.h",
-      "libcef/browser/views/menu_button_view.cc",
-      "libcef/browser/views/menu_button_view.h",
-      "libcef/browser/views/menu_runner_views.cc",
-      "libcef/browser/views/menu_runner_views.h",
-      "libcef/browser/views/panel_impl.h",
-      "libcef/browser/views/panel_view.h",
-      "libcef/browser/views/scroll_view_impl.cc",
-      "libcef/browser/views/scroll_view_impl.h",
-      "libcef/browser/views/scroll_view_view.cc",
-      "libcef/browser/views/scroll_view_view.h",
-      "libcef/browser/views/textfield_impl.cc",
-      "libcef/browser/views/textfield_impl.h",
-      "libcef/browser/views/textfield_view.cc",
-      "libcef/browser/views/textfield_view.h",
-      "libcef/browser/views/view_adapter.cc",
-      "libcef/browser/views/view_adapter.h",
-      "libcef/browser/views/view_impl.h",
-      "libcef/browser/views/view_util.cc",
-      "libcef/browser/views/view_util.h",
-      "libcef/browser/views/view_view.h",
-      "libcef/browser/views/window_impl.cc",
-      "libcef/browser/views/window_impl.h",
-      "libcef/browser/views/window_view.cc",
-      "libcef/browser/views/window_view.h",
-
-      # Part of //ui/views:test_support which is testingonly.
-      "//ui/views/test/desktop_test_views_delegate.h",
-      "//ui/views/test/desktop_test_views_delegate_aura.cc",
-      "//ui/views/test/test_views_delegate.h",
-      "//ui/views/test/test_views_delegate_aura.cc",
-
-      # Support for UI input events.
-      # Part of //ui/base:test_support which is testingonly.
-      "//ui/base/test/ui_controls.h",
-      "//ui/base/test/ui_controls_aura.cc",
-      "//ui/aura/test/ui_controls_factory_aura.h",
+      "libcef/browser/native/browser_platform_delegate_native_aura.cc",
+      "libcef/browser/native/browser_platform_delegate_native_aura.h",
+      "libcef/browser/native/cursor_util_aura.cc",
+      "libcef/browser/native/menu_runner_views_aura.cc",
+      "libcef/browser/native/menu_runner_views_aura.h",
+      "libcef/browser/views/view_util_aura.cc",
     ]
 
-    if (is_linux && !use_x11) {
-      sources += [
-        "//ui/aura/test/ui_controls_factory_ozone.cc",
-        "//ui/events/test/events_test_utils.cc"
-      ]
-    }
-
     deps += [
       "//ui/aura",
-      "//ui/events",
-      "//ui/strings",
       "//ui/wm",
       "//ui/wm/public",
     ]
+  }
 
-    if (toolkit_views) {
-      deps += [
-        "//ui/views/controls/webview",
-      ]
-    }
-    
-    if (is_win) {
-      sources += [
-        # Support for UI input events.
-        # Part of //base/test:test_config which is testingonly.
-        "//base/test/test_switches.cc",
-        "//base/test/test_switches.h",
-        "//base/test/test_timeouts.cc",
-        "//base/test/test_timeouts.h",
-        # Part of //ui/aura:test_support which is testingonly.
-        "//ui/aura/test/ui_controls_factory_aurawin.cc",
-        # Part of //ui/base:test_support which is testingonly.
-        "//ui/base/test/ui_controls_internal_win.cc",
-        "//ui/base/test/ui_controls_internal_win.h",
-      ]
-    }
-
-    if (is_linux) {
-      sources += [
-        # Support for UI input events.
-        # Part of //ui/aura:test_support which is testingonly.
-        "//ui/aura/test/aura_test_utils.cc",
-        "//ui/aura/test/aura_test_utils.h",
-        # Part of //ui/events:test_support which is testingonly.
-        "//ui/events/test/x11_event_waiter.cc",
-        "//ui/events/test/x11_event_waiter.h",
-      ]
-
-      if (use_x11) {
-        sources += [
-          # Support for UI input events.
-          # Part of //ui/aura:test_support which is testingonly.
-          "//ui/aura/test/ui_controls_factory_aurax11.cc",
-          "//ui/aura/test/x11_event_sender.cc",
-          "//ui/aura/test/x11_event_sender.h",
-          # Part of //ui/views:test_support which is testingonly.
-          "//ui/views/test/ui_controls_factory_desktop_aurax11.cc",
-          "//ui/views/test/ui_controls_factory_desktop_aurax11.h",
-        ]
-      }
-    }
-
-    if (is_win || is_linux) {
-      sources += [
-        "libcef/browser/native/browser_platform_delegate_native_aura.cc",
-        "libcef/browser/native/browser_platform_delegate_native_aura.h",
-      ]
-    }
-  } else {
+  if (enable_cdm_host_verification) {
     sources += [
-      # Provides stub implementations for the views static methods.
-      "libcef_dll/views_stub.cc",
+      "libcef/common/cdm_host_file_path.cc",
+      "libcef/common/cdm_host_file_path.h",
     ]
   }
 }
@@ -1155,6 +1197,16 @@
 # libcef_dll_wrapper static targets.
 #
 
+# Configuration that will be applied to all targets that build autogen files.
+config("libcef_autogen_config") {
+  if (is_clang) {
+    cflags = [
+      # Disable clang warnings related to CEF's translation layer templates.
+      "-Wno-undefined-var-template",
+    ]
+  }
+}
+
 # Configuration that will be applied to all targets that depend on
 # libcef_dll_wrapper.
 config("libcef_dll_wrapper_config") {
@@ -1165,6 +1217,23 @@
     # They will be copied to the include/ directory in the binary distribution.
     "$root_out_dir/includes",
   ]
+
+  configs = [ ":libcef_autogen_config" ]
+
+  if (is_win) {
+    if (current_cpu == "x86") {
+      # Set the initial stack size to 0.5MiB, instead of the 1.5MiB minimum
+      # needed by CEF's main thread. This saves significant memory on threads
+      # (like those in the Windows thread pool, and others) whose stack size we
+      # can only control through this setting. The main thread (in 32-bit builds
+      # only) uses fibers to switch to a 4MiB stack at runtime via
+      # CefRunWinMainWithPreferredStackSize().
+      ldflags = [ "/STACK:0x80000" ]
+    } else {
+      # Increase the initial stack size to 8MiB from the default 1MiB.
+      ldflags = [ "/STACK:0x800000" ]
+    }
+  }
 }
 
 # libcef_dll_wrapper target.
@@ -1186,6 +1255,8 @@
 
   configs += [ ":libcef_dll_wrapper_config" ]
   public_configs = [ ":libcef_dll_wrapper_config" ]
+
+  deps = [ ":cef_make_headers" ]
 }
 
 
@@ -1198,7 +1269,7 @@
     sources = [ "libcef_dll/sandbox/sandbox_win.cc" ]
     # CEF sources use include paths relative to the CEF root directory.
     include_dirs = [ "." ]
-    deps = [ "//sandbox" ]
+    deps = [ "libcef/features", "//sandbox" ]
   }
 }
 
@@ -1207,199 +1278,31 @@
     sources = [ "libcef_dll/sandbox/sandbox_mac.mm" ]
     # CEF sources use include paths relative to the CEF root directory.
     include_dirs = [ "." ]
-    deps = [ "//sandbox/mac:seatbelt" ]
+    deps = [
+      "//build/config:executable_deps",
+      "//sandbox/mac:seatbelt"
+    ]
   }
 }
 
 #
-# Service manifests.
-#
-
-source_set("cef_content_browser_overlay_manifest") {
-  sources = [
-    "libcef/common/service_manifests/cef_content_browser_overlay_manifest.cc",
-    "libcef/common/service_manifests/cef_content_browser_overlay_manifest.h",
-  ]
-
-  configs += [
-    "libcef/features:config"
-  ]
-
-  deps = [
-    "//base",
-    "//extensions/buildflags",
-    "//extensions/common:mojom",
-    "//extensions/common/api:mojom",
-    "//services/service_manager/public/cpp",
-    "//third_party/blink/public/common",
-  ]
-}
-
-source_set("cef_content_renderer_overlay_manifest") {
-  sources = [
-    "libcef/common/service_manifests/cef_content_renderer_overlay_manifest.h",
-  ]
-
-  configs += [
-    "libcef/features:config"
-  ]
-
-  deps = [
-    "//base",
-    "//components/subresource_filter/content/mojom",
-    "//extensions/buildflags",
-    "//extensions/common:mojom",
-    "//services/service_manager/public/cpp",
-    "//third_party/blink/public/common",
-  ]
-}
-
-source_set("cef_service_manifests") {
-  public_deps = [
-    ":cef_content_browser_overlay_manifest",
-    ":cef_content_renderer_overlay_manifest",
-  ]
-}
-
-#
 # Resource grit/pack targets.
 #
 
-# Helper for generating scaled resource packs.
-template("cef_pak_scaled") {
-  percent = invoker.percent
-
-  repack("pak_${target_name}") {
-    # Each input pak file should also have a deps line for completeness.
-    # Add associated .h files in the make_pack_header("resources") target.
-    sources = [
-      "$root_gen_dir/chrome/renderer_resources_${percent}_percent.pak",
-      "$root_gen_dir/components/components_resources_${percent}_percent.pak",
-      "$root_gen_dir/content/app/resources/content_resources_${percent}_percent.pak",
-      "$root_gen_dir/extensions/extensions_browser_resources_${percent}_percent.pak",
-      "$root_gen_dir/third_party/blink/public/resources/blink_scaled_resources_${percent}_percent.pak",
-      "$root_gen_dir/ui/resources/ui_resources_${percent}_percent.pak",
-    ]
-
-    # Use public_deps so that generated grit headers are discoverable from
-    # the libcef_static target. Grit deps that generate .cc files must be
-    # listed both here and in the libcef_static target.
-    public_deps = [
-      "//chrome/renderer:resources",
-      "//components/resources:components_scaled_resources",
-      "//content/app/resources",
-      "//extensions:extensions_browser_resources",
-      "//third_party/blink/public:scaled_resources",
-      "//ui/resources:ui_resources_grd",
-    ]
-
-    deps = [
-      # This repack target generates the blink_scaled_resources_*_percent.pak
-      # file but doesn't expose the public_deps required by make_pack_header.
-      "//third_party/blink/public:scaled_resources_${percent}_percent",
-    ]
-
-    if (toolkit_views) {
-      sources += [
-        "$root_gen_dir/ui/views/resources/views_resources_${percent}_percent.pak"
-      ]
-
-      public_deps += [
-        "//ui/views/resources:resources_grd"
-      ]
-    }
-
-    output = "$root_out_dir/cef_${percent}_percent.pak"
-  }
-}
-
-# Generate cef_100_percent.pak.
-cef_pak_scaled("100_percent") {
-  percent = "100"
-}
-
-# Generate cef_200_percent.pak.
-cef_pak_scaled("200_percent") {
-  percent = "200"
-}
-
-# Generate devtools_resources.pak.
-repack("pak_devtools") {
-  # Each input pak file should also have a deps line for completeness.
-  # Add associated .h files in the make_pack_header("resources") target.
-  sources = [
-    "$root_gen_dir/content/browser/devtools/devtools_resources.pak",
-  ]
-
-  # Use public_deps so that generated grit headers are discoverable from
-  # the libcef_static target. Grit deps that generate .cc files must be
-  # listed both here and in the libcef_static target.
-  public_deps = [
-    "//content/browser/devtools:resources",
-  ]
-
-  output = "$root_out_dir/devtools_resources.pak"
-}
-
-# Generate cef_extensions.pak.
-repack("pak_extensions") {
-  # Each input pak file should also have a deps line for completeness.
-  # Add associated .h files in the make_pack_header("resources") target.
-  sources = [
-    "$root_gen_dir/chrome/component_extension_resources.pak",
-    "$root_gen_dir/content/browser/resources/media/media_internals_resources.pak",
-    "$root_gen_dir/content/browser/webrtc/resources/webrtc_internals_resources.pak",
-    "$root_gen_dir/extensions/extensions_renderer_resources.pak",
-    "$root_gen_dir/extensions/extensions_resources.pak",
-    "$root_gen_dir/mojo/public/js/mojo_bindings_resources.pak",
-    "$root_gen_dir/ui/resources/webui_resources.pak",
-  ]
-
-  # Use public_deps so that generated grit headers are discoverable from
-  # the libcef_static target. Grit deps that generate .cc files must be
-  # listed both here and in the libcef_static target.
-  public_deps = [
-    "//chrome/browser/resources:component_extension_resources",
-    "//content/browser/resources/media:media_internals_resources",
-    "//content/browser/webrtc/resources",
-    "//extensions:extensions_renderer_resources",
-    "//extensions:extensions_resources_grd",
-    "//mojo/public/js:resources",
-    "//ui/resources:webui_resources_grd",
-  ]
-
-  output = "$root_out_dir/cef_extensions.pak"
-}
-
+# Included in locales/*.pak via //chrome/chrome_repack_locales.gni.
 grit("cef_strings") {
-  visibility = [ ":*" ]
-
   source = "libcef/resources/cef_strings.grd"
   outputs = [
     "grit/cef_strings.h",
   ]
-  all_locales = locales + [ "fake-bidi" ]
+  all_locales = platform_pak_locales + [ "fake-bidi" ]
   foreach(locale, all_locales) {
     outputs += [ "cef_strings_${locale}.pak" ]
   }
 }
 
-# Generate locales/<locale>.pak.
-# See cef_repack_locales.gni for the list of input pak files and deps.
-cef_repack_locales("repack_locales_pack") {
-  visibility = [ ":*" ]
-
-  input_locales = locales
-
-  if (is_mac) {
-    output_locales = locales_as_mac_outputs
-  } else {
-    output_locales = locales
-  }
-}
-
+# Included in resources.pak via //chrome/chrome_paks.gni.
 grit("cef_resources") {
-  visibility = [ ":*" ]
   source = "libcef/resources/cef_resources.grd"
   outputs = [
     "grit/cef_resources.h",
@@ -1411,48 +1314,6 @@
   ]
 }
 
-# Generate cef.pak.
-repack("pak") {
-  # Each input pak file should also have a deps line for completeness.
-  # Add associated .h files in the make_pack_header("resources") target.
-  sources = [
-    "$root_gen_dir/chrome/browser_resources.pak",
-    "$root_gen_dir/chrome/dev_ui_browser_resources.pak",
-    "$root_gen_dir/chrome/net_internals_resources.pak",
-    "$root_gen_dir/chrome/print_preview_resources.pak",
-    "$root_gen_dir/chrome/common_resources.pak",
-    "$root_gen_dir/components/components_resources.pak",
-    "$root_gen_dir/components/dev_ui_components_resources.pak",
-    "$root_gen_dir/cef/cef_resources.pak",
-    "$root_gen_dir/content/browser/tracing/tracing_resources.pak",
-    "$root_gen_dir/content/content_resources.pak",
-    "$root_gen_dir/content/dev_ui_content_resources.pak",
-    "$root_gen_dir/net/net_resources.pak",
-    "$root_gen_dir/third_party/blink/public/resources/blink_resources.pak",
-  ]
-
-  # Use public_deps so that generated grit headers are discoverable from
-  # the libcef_static target. Grit deps that generate .cc files must be
-  # listed both here and in the libcef_static target.
-  public_deps = [
-    "//chrome/browser:dev_ui_browser_resources",
-    "//chrome/browser:resources",
-    "//chrome/browser/resources/net_internals:net_internals_resources",
-    "//chrome/browser/resources:print_preview_resources",
-    "//chrome/common:resources",
-    "//components/resources:components_resources",
-    "//components/resources:dev_ui_components_resources",
-    ":cef_resources",
-    "//content/browser/tracing:resources",
-    "//content:content_resources",
-    "//content:dev_ui_content_resources",
-    "//net:net_resources",
-    "//third_party/blink/public:resources",
-  ]
-
-  output = "$root_out_dir/cef.pak"
-}
-
 # Helper for generating pack header files.
 template("make_pack_header") {
   assert(defined(invoker.header))
@@ -1467,16 +1328,9 @@
     args = rebase_path(outputs, root_build_dir) +
            rebase_path(inputs, root_build_dir)
 
-    deps = [
-      # List all targets that generate pack files here. The grit targets that
-      # generate |inputs| will be picked up via public_deps.
-      ":pak",
-      ":pak_100_percent",
-      ":pak_200_percent",
-      ":pak_devtools",
-      ":pak_extensions",
-      ":repack_locales_pack",
-    ]
+    if (defined(invoker.deps)) {
+      deps = invoker.deps
+    }
   }
 }
 
@@ -1484,28 +1338,64 @@
 make_pack_header("resources") {
   header = "$root_out_dir/includes/include/cef_pack_resources.h"
   inputs = [
+    "$root_gen_dir/base/tracing/protos/grit/tracing_proto_resources.h",
     "$root_gen_dir/cef/grit/cef_resources.h",
     "$root_gen_dir/chrome/grit/browser_resources.h",
     "$root_gen_dir/chrome/grit/common_resources.h",
     "$root_gen_dir/chrome/grit/component_extension_resources.h",
     "$root_gen_dir/chrome/grit/dev_ui_browser_resources.h",
-    "$root_gen_dir/chrome/grit/net_internals_resources.h",
+    "$root_gen_dir/chrome/grit/pdf_resources.h",
     "$root_gen_dir/chrome/grit/renderer_resources.h",
     "$root_gen_dir/components/grit/components_resources.h",
     "$root_gen_dir/components/grit/dev_ui_components_resources.h",
     "$root_gen_dir/content/browser/devtools/grit/devtools_resources.h",
     "$root_gen_dir/content/browser/tracing/grit/tracing_resources.h",
+    "$root_gen_dir/content/browser/webrtc/resources/grit/webrtc_internals_resources.h",
     "$root_gen_dir/content/grit/content_resources.h",
-    "$root_gen_dir/content/grit/dev_ui_content_resources.h",
+    "$root_gen_dir/content/grit/gpu_resources.h",
+    "$root_gen_dir/content/grit/histograms_resources.h",
+    "$root_gen_dir/content/grit/process_resources.h",
+    "$root_gen_dir/content/grit/service_worker_resources.h",
     "$root_gen_dir/extensions/grit/extensions_browser_resources.h",
     "$root_gen_dir/extensions/grit/extensions_renderer_resources.h",
     "$root_gen_dir/extensions/grit/extensions_resources.h",
+    "$root_gen_dir/mojo/public/js/grit/mojo_bindings_resources.h",
     "$root_gen_dir/net/grit/net_resources.h",
     "$root_gen_dir/third_party/blink/public/resources/grit/blink_resources.h",
     "$root_gen_dir/ui/resources/grit/ui_resources.h",
     "$root_gen_dir/ui/resources/grit/webui_resources.h",
     "$root_gen_dir/ui/views/resources/grit/views_resources.h",
   ]
+
+  deps = [
+    ":cef_resources",
+    "//base/tracing/protos:chrome_track_event_resources",
+    "//chrome/browser:dev_ui_browser_resources",
+    "//chrome/browser:resources",
+    "//chrome/browser/resources:component_extension_resources",
+    "//chrome/browser/resources/pdf:resources",
+    "//chrome/common:resources",
+    "//chrome/renderer:resources",
+    "//components/resources:components_resources",
+    "//components/resources:dev_ui_components_resources",
+    "//content/browser/devtools:devtools_resources",
+    "//content/browser/resources/gpu:resources",
+    "//content/browser/resources/histograms:resources",
+    "//content/browser/resources/process:resources",
+    "//content/browser/resources/service_worker:resources",
+    "//content/browser/tracing:resources",
+    "//content/browser/webrtc/resources",
+    "//content:content_resources",
+    "//extensions:extensions_browser_resources",
+    "//extensions:extensions_renderer_resources",
+    "//extensions:extensions_resources_grd",
+    "//mojo/public/js:resources",
+    "//net:net_resources",
+    "//third_party/blink/public:resources",
+    "//ui/resources:ui_resources_grd",
+    "//ui/resources:webui_resources_grd",
+    "//ui/views/resources:resources_grd",
+  ]
 }
 
 # Generate cef_pack_strings.h.
@@ -1513,16 +1403,45 @@
   header = "$root_out_dir/includes/include/cef_pack_strings.h"
   inputs = [
     "$root_gen_dir/cef/grit/cef_strings.h",
-    "$root_gen_dir/chrome/grit/chromium_strings.h",
+    "$root_gen_dir/chrome/grit/branded_strings.h",
     "$root_gen_dir/chrome/grit/generated_resources.h",
     "$root_gen_dir/chrome/grit/locale_settings.h",
     "$root_gen_dir/chrome/grit/platform_locale_settings.h",
+    "$root_gen_dir/components/omnibox/resources/grit/omnibox_pedal_synonyms.h",
+    "$root_gen_dir/components/strings/grit/components_branded_strings.h",
     "$root_gen_dir/components/strings/grit/components_strings.h",
     "$root_gen_dir/extensions/strings/grit/extensions_strings.h",
     "$root_gen_dir/services/strings/grit/services_strings.h",
+    "$root_gen_dir/third_party/blink/public/strings/grit/blink_accessibility_strings.h",
     "$root_gen_dir/third_party/blink/public/strings/grit/blink_strings.h",
     "$root_gen_dir/ui/strings/grit/ui_strings.h",
   ]
+
+  deps = [
+    ":cef_strings",
+    "//chrome/app:branded_strings",
+    "//chrome/app:generated_resources",
+    "//chrome/app/resources:locale_settings",
+    "//chrome/app/resources:platform_locale_settings",
+    "//components/omnibox/resources:omnibox_pedal_synonyms",
+    "//components/strings:components_branded_strings",
+    "//components/strings:components_locale_settings",
+    "//components/strings:components_strings",
+    "//extensions/strings",
+    "//services/strings",
+    "//third_party/blink/public/strings",
+    "//third_party/blink/public/strings:accessibility_strings",
+    "//ui/strings:app_locale_settings",
+    "//ui/strings:ui_strings",
+  ]
+}
+
+# Generate cef_command_ids.h.
+make_pack_header("command_ids") {
+  header = "$root_out_dir/includes/include/cef_command_ids.h"
+  inputs = [
+    "//chrome/app/chrome_command_ids.h",
+  ]
 }
 
 # Generate cef_api_hash.h.
@@ -1542,12 +1461,23 @@
   args = rebase_path(outputs + include_dir, root_build_dir)
 }
 
+# Generate cef_config.h.
+action("make_config_header") {
+  script = "tools/make_config_header.py"
+
+  outputs = [ "$root_out_dir/includes/include/cef_config.h" ]
+
+  args = rebase_path(outputs + [ "$root_out_dir/args.gn" ], root_build_dir)
+}
+
 # Generate pack files and associated CEF header files.
 group("cef_make_headers") {
   deps = [
     ":make_pack_header_resources",
     ":make_pack_header_strings",
+    ":make_pack_header_command_ids",
     ":make_api_hash_header",
+    ":make_config_header",
   ]
 }
 
@@ -1572,50 +1502,24 @@
     ]
   }
 
-  bundle_data("cef_framework_locales") {
-    sources = []
-    foreach(locale, locales_as_mac_outputs) {
-      sources += [ "$root_gen_dir/repack/locales/$locale.pak" ]
-    }
-
-    public_deps = [
-      ":repack_locales_pack",
-    ]
-
-    outputs = [
-      "{{bundle_resources_dir}}/{{source_name_part}}.lproj/locale.pak",
-    ]
-  }
-
   bundle_data("cef_framework_resources") {
-    sources = [
-      "$root_out_dir/cef.pak",
-      "$root_out_dir/cef_100_percent.pak",
-      "$root_out_dir/cef_200_percent.pak",
-      "$root_out_dir/cef_extensions.pak",
-      "$root_out_dir/devtools_resources.pak",
-    ]
-
-    public_deps = [
-      ":pak",
-      ":pak_100_percent",
-      ":pak_200_percent",
-      ":pak_devtools",
-      ":pak_extensions",
-    ]
+    sources = []
+    public_deps = []
 
     if (icu_use_data_file) {
       sources += [ "$root_out_dir/icudtl.dat" ]
       public_deps += [ "//third_party/icu:icudata", ]
     }
 
+    sources += [ "//ui/gl/resources/angle-metal/gpu_shader_cache.bin" ]
+
     if (v8_use_external_startup_data) {
       sources += [
         "$root_out_dir/snapshot_blob.bin",
       ]
       public_deps += [ "//v8" ]
       if (use_v8_context_snapshot) {
-        sources += [ "$root_out_dir/v8_context_snapshot.bin" ]
+        sources += [ "$root_out_dir/$v8_context_snapshot_filename" ]
         public_deps += [ "//tools/v8_context_snapshot" ]
       }
     }
@@ -1643,8 +1547,6 @@
     # Add the SwiftShader .dylibs in the MODULE_DIR of the Framework app bundle.
     bundle_data("cef_framework_swiftshader_binaries") {
       sources = [
-        "$root_out_dir/egl_intermediates/libswiftshader_libEGL.dylib",
-        "$root_out_dir/egl_intermediates/libswiftshader_libGLESv2.dylib",
         "$root_out_dir/vk_intermediates/libvk_swiftshader.dylib",
         "$root_out_dir/vk_intermediates/vk_swiftshader_icd.json",
       ]
@@ -1652,7 +1554,6 @@
         "{{bundle_contents_dir}}/Libraries/{{source_file_part}}",
       ]
       public_deps = [
-        "//ui/gl:swiftshader_egl_library_copy",
         "//ui/gl:swiftshader_vk_library_copy",
       ]
     }
@@ -1675,6 +1576,9 @@
   }
 
   mac_framework_bundle("cef_framework") {
+    # Necessary because the libcef_test_support target is testonly.
+    testonly = true
+
     output_name = cef_framework_name
 
     framework_version = "A"
@@ -1691,16 +1595,16 @@
               gypi_paths2.libcef_sources_common +
               gypi_paths.autogen_library_side
 
-    # TODO(rsesek): Handle these missing pieces:
-    #   - crash_inspector
-    #   - crash_report_sender.app
-
     deps = [
       ":cef_framework_angle_library",
-      ":cef_framework_locales",
       ":cef_framework_resources",
       ":cef_framework_swiftshader_library",
       ":libcef_static",
+      ":libcef_test_support",
+    ]
+
+    configs += [
+      ":libcef_autogen_config",
     ]
 
     # We don't link the framework so just use the path from the main executable.
@@ -1726,7 +1630,19 @@
     info_plist_target = ":cef_framework_plist"
   }
 } else {
+  config("pdb_larger_than_4gb") {
+    if (is_win && symbol_level == 2) {
+      # These binaries create PDBs larger than 4 GiB. Increasing the PDB page
+      # size allows larger PDBs, but not all tools can handle such large PDBs
+      # yet.
+      ldflags = [ "/pdbpagesize:8192" ]
+    }
+  }
+
   shared_library("libcef") {
+    # Necessary because the libcef_test_support target is testonly.
+    testonly = true
+
     sources = includes_common +
               gypi_paths.autogen_cpp_includes +
               gypi_paths2.includes_capi +
@@ -1736,6 +1652,12 @@
 
     deps = [
       ":libcef_static",
+      ":libcef_test_support",
+    ]
+
+    configs += [
+      ":libcef_autogen_config",
+      ":pdb_larger_than_4gb",
     ]
 
     if (is_win) {
@@ -1743,15 +1665,19 @@
         "libcef_dll/libcef_dll.rc",
       ]
 
-      deps += [ 
+      deps += [
         # Bring in ui_unscaled_resources.rc which contains custom cursors.
         # TODO(cef): Remove this once custom cursors can be loaded via
         # ResourceBundle. See crbug.com/147663.
         "//ui/resources:ui_unscaled_resources_grd",
       ]
+
+      # Delay-load as many DLLs as possible for sandbox and startup perf
+      # improvements.
+      configs += [ "//build/config/win:delayloads" ]
     }
 
-    if (is_linux && !is_debug && use_allocator=="none") {
+    if (is_linux && !is_debug && !use_partition_alloc_as_malloc) {
       # Only export necessary symbols from libcef.so.
       # Don't do this in Debug builds because it causes the resulting
       # application to crash.
@@ -1768,6 +1694,29 @@
 # Executable/app targets.
 #
 
+# Source files for TeamCity GTest integration.
+# See tests/gtest/teamcity/README.cef for details.
+source_set("gtest_teamcity") {
+  testonly = true
+
+  sources = [
+    "tests/gtest/teamcity/include/teamcity_gtest.h",
+    "tests/gtest/teamcity/src/teamcity_gtest.cpp",
+    "tests/gtest/teamcity/src/teamcity_gtest.h",
+    "tests/gtest/teamcity/src/teamcity_messages.cpp",
+    "tests/gtest/teamcity/src/teamcity_messages.h",
+  ]
+
+  deps = [
+    "//testing/gtest",
+  ]
+
+  configs += [
+    "libcef/features:config",
+    "//build/config:precompiled_headers",
+  ]
+}
+
 if (is_mac) {
   # Helper for generating the CEF app bundle.
   template("cef_app") {
@@ -1825,13 +1774,30 @@
 
         info_plist_target = ":${app_name}_helper_plist"
 
+        if (defined(invoker.helper_frameworks)) {
+          frameworks = invoker.helper_frameworks
+        }
+
         if (defined(invoker.helper_defines)) {
           defines = invoker.helper_defines
         }
       }
     }
 
-    foreach(helper_params, content_mac_helpers) {
+    # From //chrome/BUILD.gn:
+    # Helper app to display alert notifications. This is necessary as an app can
+    # only display either banner or alert style notifications and the main app
+    # will display banners.
+    alert_helper_params = [
+      "alerts",
+      ".alerts",
+      " (Alerts)",
+    ]
+
+    # Merge all helper apps needed by //content and //chrome.
+    chrome_mac_helpers = content_mac_helpers + [ alert_helper_params ]
+
+    foreach(helper_params, chrome_mac_helpers) {
       _helper_target = helper_params[0]
       _helper_bundle_id = helper_params[1]
       _helper_suffix = helper_params[2]
@@ -1840,6 +1806,9 @@
         if (defined(invoker.helper_deps)) {
           helper_deps = invoker.helper_deps
         }
+        if (defined(invoker.helper_frameworks)) {
+          helper_frameworks = invoker.helper_frameworks
+        }
         if (defined(invoker.helper_defines)) {
           helper_defines = invoker.helper_defines
         }
@@ -1859,7 +1828,7 @@
         ":cef_framework",
       ]
 
-      foreach(helper_params, content_mac_helpers) {
+      foreach(helper_params, chrome_mac_helpers) {
         sources += [
           "$root_out_dir/${app_helper_name}${helper_params[2]}.app",
         ]
@@ -1887,7 +1856,9 @@
 
       sources = invoker.sources
 
+      public_deps = [ ":libcef_dll_wrapper" ]
       deps = [
+        ":cef_make_headers",
         ":libcef_dll_wrapper",
         ":${app_name}_framework_bundle_data",
       ]
@@ -1895,8 +1866,8 @@
         deps += invoker.deps
       }
 
-      if (defined(invoker.libs)) {
-        libs = invoker.libs
+      if (defined(invoker.frameworks)) {
+        frameworks = invoker.frameworks
       }
 
       if (defined(invoker.defines)) {
@@ -1949,6 +1920,9 @@
   }
 
   cef_app("cefclient") {
+    # Necessary because the cef_framework target is testonly.
+    testonly = true
+
     helper_info_plist = "tests/cefclient/resources/mac/helper-Info.plist"
     helper_sources = includes_common +
                      includes_mac +
@@ -1980,7 +1954,7 @@
       ":cefclient_resources_bundle_data_english",
       ":cefclient_xibs",
     ]
-    libs = [
+    frameworks = [
       "AppKit.framework",
       "OpenGL.framework",
     ]
@@ -2022,6 +1996,9 @@
   }
 
   cef_app("cefsimple") {
+    # Necessary because the cef_framework target is testonly.
+    testonly = true
+
     helper_info_plist = "tests/cefsimple/mac/helper-Info.plist"
     helper_sources = includes_common +
                      includes_mac +
@@ -2044,7 +2021,7 @@
       ":cefsimple_resources_bundle_data_english",
       ":cefsimple_xibs",
     ]
-    libs = [
+    frameworks = [
       "AppKit.framework",
     ]
     defines = [
@@ -2093,10 +2070,15 @@
                      gypi_paths2.shared_sources_mac_helper +
                      gypi_paths2.ceftests_sources_mac_helper
     helper_deps = [
+      ":gtest_teamcity",
       "//testing/gtest",
     ]
+    helper_frameworks = [
+      "AppKit.framework",
+    ]
     helper_defines = [
       "CEF_USE_SANDBOX",
+      "CEF_TESTS_IN_SRC_DIRECTORY",
     ]
 
     info_plist = "tests/ceftests/resources/mac/Info.plist"
@@ -2113,13 +2095,15 @@
       ":ceftests_resources_bundle_data",
       ":ceftests_resources_bundle_data_english",
       ":ceftests_xibs",
+      ":gtest_teamcity",
       "//testing/gtest",
     ]
-    libs = [
+    frameworks = [
       "AppKit.framework",
     ]
     defines = [
       "CEF_USE_SANDBOX",
+      "CEF_TESTS_IN_SRC_DIRECTORY",
     ]
   }
 } else {
@@ -2141,18 +2125,12 @@
     pkg_config("gtk") {
       packages = [
         "gmodule-2.0",
-        "gtk+-2.0",
+        "gtk+-3.0",
         "gthread-2.0",
-        "gtk+-unix-print-2.0",
+        "gtk+-unix-print-3.0",
         "xi",
       ]
     }
-
-    pkg_config("gtkglext") {
-      packages = [
-        "gtkglext-1.0",
-      ]
-    }
   }
 
   if (is_linux) {
@@ -2169,6 +2147,9 @@
   }
 
   executable("cefclient") {
+    # Necessary because the libcef target is testonly.
+    testonly = true
+
     sources = includes_common +
               gypi_paths2.includes_wrapper +
               gypi_paths2.shared_sources_browser +
@@ -2196,6 +2177,10 @@
       configs -= [ "//build/config/win:console" ]
       configs += [ "//build/config/win:windowed" ]
 
+      # Delay-load as many DLLs as possible for sandbox and startup perf
+      # improvements.
+      configs += [ "//build/config/win:delayloads" ]
+
       defines += [
         "CEF_USE_ATL",
       ]
@@ -2233,23 +2218,21 @@
       ]
 
       libs = [
+        "GL",
         "X11",
       ]
 
       if (cef_use_gtk) {
         configs += [
           ":gtk",
-          ":gtkglext",
+        ]
+        cflags = [
+          # Don't warn about deprecated GDK/GTK functions.
+          "-Wno-deprecated-declarations",
         ]
       }
 
-      if (is_component_build) {
-        if (use_allocator=="tcmalloc") {
-          # Link to base to initialize tcmalloc allocator shims, otherwise
-          # base::allocator::IsAllocatorInitialized check fails
-          deps += [ "//base" ]
-        }
-      } else {
+      if (!is_component_build) {
         # Set rpath to find our own libfreetype even in a non-component build.
         configs += [ "//build/config/gcc:rpath_for_built_shared_libraries" ]
       }
@@ -2262,6 +2245,9 @@
   #
 
   executable("cefsimple") {
+    # Necessary because the libcef target is testonly.
+    testonly = true
+
     sources = includes_common +
               gypi_paths2.includes_wrapper +
               gypi_paths2.cefsimple_sources_common
@@ -2283,6 +2269,10 @@
       configs -= [ "//build/config/win:console" ]
       configs += [ "//build/config/win:windowed" ]
 
+      # Delay-load as many DLLs as possible for sandbox and startup perf
+      # improvements.
+      configs += [ "//build/config/win:delayloads" ]
+
       deps += [
         ":cef_sandbox",
         "//build/win:default_exe_manifest",
@@ -2299,7 +2289,7 @@
       sources += includes_linux +
                  gypi_paths2.cefsimple_sources_linux
 
-      if (use_x11) {
+      if (ozone_platform_x11) {
         libs = [
           "X11",
         ]
@@ -2316,7 +2306,7 @@
   #
   # ceftests targets.
   #
-  
+
   if (is_linux) {
     copy("copy_ceftests_files") {
       sources = gypi_paths2.shared_sources_resources
@@ -2332,23 +2322,28 @@
               gypi_paths2.shared_sources_browser +
               gypi_paths2.shared_sources_common +
               gypi_paths2.shared_sources_renderer +
-              gypi_paths2.ceftests_sources_common +
-              gypi_paths2.ceftests_sources_views
+              gypi_paths2.ceftests_sources_common
 
     deps = [
       ":libcef",
       ":libcef_dll_wrapper",
+      ":gtest_teamcity",
       "//testing/gtest",
     ]
 
     defines = [
       "CEF_USE_SANDBOX",
+      "CEF_TESTS_IN_SRC_DIRECTORY",
     ]
 
     if (is_win) {
       sources += gypi_paths2.shared_sources_win +
                  gypi_paths2.ceftests_sources_win
 
+      # Delay-load as many DLLs as possible for sandbox and startup perf
+      # improvements.
+      configs += [ "//build/config/win:delayloads" ]
+
       deps += [
         ":cef_sandbox",
         "//build/win:default_exe_manifest",
@@ -2359,7 +2354,7 @@
       sources += gypi_paths2.shared_sources_linux +
                  gypi_paths2.ceftests_sources_linux
 
-      if (use_x11) {
+      if (ozone_platform_x11) {
         libs = [
           "X11",
         ]
diff --git a/src/CHROMIUM_BUILD_COMPATIBILITY.txt b/src/CHROMIUM_BUILD_COMPATIBILITY.txt
index a9d0b66..212d6c6 100644
--- a/src/CHROMIUM_BUILD_COMPATIBILITY.txt
+++ b/src/CHROMIUM_BUILD_COMPATIBILITY.txt
@@ -7,6 +7,6 @@
 # https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding
 
 {
-  'chromium_checkout': 'refs/tags/83.0.4103.106',
-  'depot_tools_checkout': 'fc5e103221'
+  'chromium_checkout': 'refs/tags/119.0.6045.199',
+  'depot_tools_checkout': '744bfd2a7b'
 }
diff --git a/src/CHROMIUM_UPDATE.txt b/src/CHROMIUM_UPDATE.txt
index 4c31f4e..5bac2ff 100644
--- a/src/CHROMIUM_UPDATE.txt
+++ b/src/CHROMIUM_UPDATE.txt
@@ -27,16 +27,12 @@
   # Files in the chromium/src directory that should be evaluated for changes.
   # Similar changes may need to be applied to the CEF source code.
   'files': [
-    'chrome/app/chrome_*_manifest.*',
-    'chrome/app/chrome_*_manifests.*',
     'chrome/browser/browser_process.h',
     'chrome/browser/extensions/api/tabs/tabs_api.*',
     'chrome/browser/extensions/chrome_component_extension_resource_manager.*',
     'chrome/browser/extensions/chrome_extension_web_contents_observer.*',
     'chrome/browser/extensions/component_loader.*',
     'chrome/browser/extensions/extension_service.*',
-    'chrome/browser/printing/print_view_manager*',
-    'chrome/browser/printing/printing_message_filter*',
     'chrome/browser/profiles/profile.h',
     'chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.*',
     'chrome/common/extensions/api/*_features.json',
@@ -45,7 +41,6 @@
     'content/browser/renderer_host/render_widget_host_view_base.*',
     'content/public/browser/content_browser_client.*',
     'content/public/browser/render_widget_host_view.h',
-    'content/public/browser/storage_partition.h',
     'content/public/browser/web_contents_delegate.h',
     'content/public/common/content_features.cc',
     'content/shell/BUILD.gn',
diff --git a/src/CMakeLists.txt.in b/src/CMakeLists.txt.in
index 120db2b..93b5f3e 100644
--- a/src/CMakeLists.txt.in
+++ b/src/CMakeLists.txt.in
@@ -11,9 +11,9 @@
 # CMake-generated project formats that have been tested with this CEF binary
 # distribution include:
 #
-# Linux:      Ninja, Unix Makefiles
-# Mac OS X:   Ninja, Xcode 5+
-# Windows:    Ninja, Visual Studio 2010+
+# Linux:      Ninja, GCC 7.5.0+, Unix Makefiles
+# MacOS:      Ninja, Xcode 12.2 to 15.0
+# Windows:    Ninja, Visual Studio 2022
 #
 # Ninja is a cross-platform open-source tool for running fast builds using
 # pre-installed platform toolchains (GNU, clang, Xcode or MSVC). It can be
@@ -36,25 +36,27 @@
 #
 # The below requirements must be met to build this CEF binary distribution.
 #
-# - CMake version 2.8.12.1 or newer.
+# - CMake version 3.21 or newer.
 #
 # - Linux requirements:
-#   Currently supported distributions include Debian Wheezy, Ubuntu Precise, and
-#   related. Ubuntu 14.04 64-bit is recommended. Newer versions will likely also
-#   work but may not have been tested.
+#   Currently supported distributions include Debian 10 (Buster), Ubuntu 18
+#   (Bionic Beaver), and related. Ubuntu 18.04 64-bit with GCC 7.5.0+ is
+#   recommended. Newer versions will likely also work but may not have been
+#   tested.
 #   Required packages include:
 #     build-essential
-#     libgtk2.0-dev     (required by the cefclient target only)
-#     libgtkglext1-dev  (required by the cefclient target only)
+#     libgtk3.0-dev     (required by the cefclient target only)
 #
-# - Mac OS X requirements:
-#   Xcode 5 or newer building on Mac OS X 10.9 (Mavericks) or newer. Xcode 8.3
-#   and OS X 10.12 are recommended. The Xcode command-line tools must also be
-#   installed. Only 64-bit builds are supported on OS X.
+# - MacOS requirements:
+#   Xcode 12.2 to 15.0 building on MacOS 10.15.4 (Catalina) or newer. Only
+#   64-bit builds are supported. The Xcode command-line tools must also be
+#   installed. Newer Xcode versions may not have been been tested and are not
+#   recommended.
 #
 # - Windows requirements:
-#   Visual Studio 2010 or newer building on Windows 7 or newer. Visual Studio
-#   2015 Update 3 and Windows 10 64-bit are recommended.
+#   Visual Studio 2022 building on Windows 10 or newer. Windows 10/11 64-bit is
+#   recommended. Newer versions will likely also work but may not have been
+#   tested.
 #
 # BUILD EXAMPLES
 #
@@ -75,7 +77,7 @@
 #     > cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug ..
 #     > ninja cefclient cefsimple
 #
-# To perform a Mac OS X build using a 64-bit CEF binary distribution:
+# To perform a MacOS build using a 64-bit CEF binary distribution:
 #   Using the Xcode IDE:
 #     > cmake -G "Xcode" -DPROJECT_ARCH="x86_64" ..
 #     Open build\cef.xcodeproj in Xcode and select Product > Build.
@@ -84,33 +86,54 @@
 #     > cmake -G "Ninja" -DPROJECT_ARCH="x86_64" -DCMAKE_BUILD_TYPE=Debug ..
 #     > ninja cefclient cefsimple
 #
+# To perform a MacOS build using an ARM64 CEF binary distribution:
+#   Using the Xcode IDE:
+#     > cmake -G "Xcode" -DPROJECT_ARCH="arm64" ..
+#     Open build\cef.xcodeproj in Xcode and select Product > Build.
+#
+#   Using Ninja:
+#     > cmake -G "Ninja" -DPROJECT_ARCH="arm64" -DCMAKE_BUILD_TYPE=Debug ..
+#     > ninja cefclient cefsimple
+#
 # To perform a Windows build using a 32-bit CEF binary distribution:
-#   Using the Visual Studio 2015 IDE:
-#     > cmake -G "Visual Studio 14" ..
+#   Using the Visual Studio 2022 IDE:
+#     > cmake -G "Visual Studio 17" -A Win32 ..
 #     Open build\cef.sln in Visual Studio and select Build > Build Solution.
 #
-#   Using Ninja with Visual Studio 2015 command-line tools:
+#   Using Ninja with Visual Studio 2022 command-line tools:
 #     (this path may be different depending on your Visual Studio installation)
-#     > "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat"
+#     > "C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Auxiliary\Build\vcvars32.bat"
 #     > cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug ..
 #     > ninja cefclient cefsimple
 #
 # To perform a Windows build using a 64-bit CEF binary distribution:
-#   Using the Visual Studio 2015 IDE:
-#     > cmake -G "Visual Studio 14 Win64" ..
+#   Using the Visual Studio 2022 IDE:
+#     > cmake -G "Visual Studio 17" -A x64 ..
 #     Open build\cef.sln in Visual Studio and select Build > Build Solution.
 #
-#   Using Ninja with Visual Studio 2015 command-line tools:
+#   Using Ninja with Visual Studio 2022 command-line tools:
 #     (this path may be different depending on your Visual Studio installation)
-#     > "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat"
+#     > "C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Auxiliary\Build\vcvars64.bat"
 #     > cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug ..
 #     > ninja cefclient cefsimple
+#
+# To perform a Windows build using an ARM64 CEF binary distribution:
+#   Using the Visual Studio 2022 IDE:
+#     > cmake -G "Visual Studio 17" -A arm64 ..
+#     Open build\cef.sln in Visual Studio and select Build > Build Solution.
+#
+#   Using Ninja with Visual Studio 2022 command-line tools:
+#     (this path may be different depending on your Visual Studio installation)
+#     > "C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Auxiliary\Build\vcvarsamd64_arm64.bat"
+#     > cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug ..
+#     > ninja cefsimple
 
 #
 # Global setup.
 #
 
-cmake_minimum_required(VERSION 2.8.12.1)
+# For VS2022 and Xcode 12+ support.
+cmake_minimum_required(VERSION 3.21)
 
 # Only generate Debug and Release configuration types.
 set(CMAKE_CONFIGURATION_TYPES Debug Release)
@@ -211,3 +234,22 @@
 
 # Display configuration settings.
 PRINT_CEF_CONFIG()
+
+
+#
+# Define the API documentation target.
+#
+
+find_package(Doxygen)
+if(DOXYGEN_FOUND)
+  add_custom_target(apidocs ALL
+    # Generate documentation in the docs/html directory.
+    COMMAND "${DOXYGEN_EXECUTABLE}" Doxyfile
+    # Write a docs/index.html file.
+    COMMAND ${CMAKE_COMMAND} -E echo "<html><head><meta http-equiv=\"refresh\" content=\"0;URL='html/index.html'\"/></head></html>" > docs/index.html
+    WORKING_DIRECTORY "${CEF_ROOT}"
+    COMMENT "Generating API documentation with Doxygen..."
+    VERBATIM )
+else()
+  message(WARNING "Doxygen must be installed to generate API documentation.")
+endif()
diff --git a/src/Doxyfile b/src/Doxyfile
new file mode 100644
index 0000000..affddfb
--- /dev/null
+++ b/src/Doxyfile
@@ -0,0 +1,2782 @@
+# Doxyfile 1.9.5
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+#
+# Note:
+#
+# Use doxygen to compare the used configuration file with the template
+# configuration file:
+# doxygen -x [configFile]
+# Use doxygen to compare the used configuration file with the template
+# configuration file without replacing the environment variables or CMake type
+# replacement variables:
+# doxygen -x_noenv [configFile]
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the configuration
+# file that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = "Chromium Embedded Framework (CEF)"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         = $(PROJECT_NUMBER)
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          =
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = docs
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096
+# sub-directories (in 2 levels) under the output directory of each output format
+# and will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to
+# control the number of sub-directories.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# Controls the number of sub-directories that will be created when
+# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every
+# level increment doubles the number of directories, resulting in 4096
+# directories at level 8 which is the default and also the maximum value. The
+# sub-directories are organized in 2 levels, the first level always has a fixed
+# numer of 16 directories.
+# Minimum value: 0, maximum value: 8, default value: 8.
+# This tag requires that the tag CREATE_SUBDIRS is set to YES.
+
+CREATE_SUBDIRS_LEVEL   = 8
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian,
+# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English
+# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek,
+# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with
+# English messages), Korean, Korean-en (Korean with English messages), Latvian,
+# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese,
+# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish,
+# Swedish, Turkish, Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    = .
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = YES
+
+# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line
+# such as
+# /***************
+# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
+# Javadoc-style will behave just like regular comments and it will not be
+# interpreted by doxygen.
+# The default value is: NO.
+
+JAVADOC_BANNER         = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# By default Python docstrings are displayed as preformatted text and doxygen's
+# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the
+# doxygen's special commands can be used and the contents of the docstring
+# documentation blocks is shown as doxygen documentation.
+# The default value is: YES.
+
+PYTHON_DOCSTRING       = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 2
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:^^"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". Note that you cannot put \n's in the value part of an alias
+# to insert newlines (in the resulting output). You can put ^^ in the value part
+# of an alias to insert a newline as if a physical newline was in the original
+# file. When you need a literal { or } or , in the value part of an alias you
+# have to escape them by means of a backslash (\), this can lead to conflicts
+# with the commands \{ and \} for these it is advised to use the version @{ and
+# @} or use a double escape (\\{ and \\})
+
+ALIASES                =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
+# sources only. Doxygen will then generate output that is more tailored for that
+# language. For instance, namespaces will be presented as modules, types will be
+# separated into more groups, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_SLICE  = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
+# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice,
+# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
+# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
+# tries to guess whether the code is fixed or free formatted code, this is the
+# default for Fortran type files). For instance to make doxygen treat .inc files
+# as Fortran files (default is PHP), and .f files as C (default is Fortran),
+# use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen. When specifying no_extension you should add
+# * to the FILE_PATTERNS.
+#
+# Note see also the list of default file extension mappings.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See https://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# to that level are automatically included in the table of contents, even if
+# they do not have an id attribute.
+# Note: This feature currently applies only to Markdown headings.
+# Minimum value: 0, maximum value: 99, default value: 5.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+TOC_INCLUDE_HEADINGS   = 5
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = YES
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use
+# during processing. When set to 0 doxygen will based this on the number of
+# cores available in the system. You can set it explicitly to a value larger
+# than 0 to get more control over the balance between CPU load and processing
+# speed. At this moment only the input processing can be done using multiple
+# threads. Since this is still an experimental feature the default is set to 1,
+# which effectively disables parallel processing. Please report any issues you
+# encounter. Generating dot graphs in parallel is controlled by the
+# DOT_NUM_THREADS setting.
+# Minimum value: 0, maximum value: 32, default value: 1.
+
+NUM_PROC_THREADS       = 1
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
+# methods of a class will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIV_VIRTUAL   = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If this flag is set to YES, the name of an unnamed parameter in a declaration
+# will be determined by the corresponding definition. By default unnamed
+# parameters remain unnamed in the output.
+# The default value is: YES.
+
+RESOLVE_UNNAMED_PARAMS = YES
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# declarations. If set to NO, these declarations will be included in the
+# documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = NO
+
+# With the correct setting of option CASE_SENSE_NAMES doxygen will better be
+# able to match the capabilities of the underlying filesystem. In case the
+# filesystem is case sensitive (i.e. it supports files in the same directory
+# whose names only differ in casing), the option must be set to YES to properly
+# deal with such files in case they appear in the input. For filesystems that
+# are not case sensitive the option should be set to NO to properly deal with
+# output files written for symbols that only differ in casing, such as for two
+# classes, one named CLASS and the other named Class, and to also support
+# references to files without having to specify the exact matching casing. On
+# Windows (including Cygwin) and MacOS, users should typically set this option
+# to NO, whereas on Linux or other Unix flavors it should typically be set to
+# YES.
+# Possible values are: SYSTEM, NO and YES.
+# The default value is: SYSTEM.
+
+CASE_SENSE_NAMES       = SYSTEM
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class
+# will show which file needs to be included to use the class.
+# The default value is: YES.
+
+SHOW_HEADERFILE        = YES
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = YES
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file. See also section "Changing the
+# layout of pages" for information.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as documenting some parameters in
+# a documented function twice, or documenting parameters that don't exist or
+# using markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete
+# function parameter documentation. If set to NO, doxygen will accept that some
+# parameters have no documentation without warning.
+# The default value is: YES.
+
+WARN_IF_INCOMPLETE_DOC = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong parameter
+# documentation, but not about the absence of documentation. If EXTRACT_ALL is
+# set to YES then this flag will automatically be disabled. See also
+# WARN_IF_INCOMPLETE_DOC
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = NO
+
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
+# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
+# at the end of the doxygen process doxygen will return with a non-zero status.
+# Possible values are: NO, YES and FAIL_ON_WARNINGS.
+# The default value is: NO.
+
+WARN_AS_ERROR          = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# See also: WARN_LINE_FORMAT
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# In the $text part of the WARN_FORMAT command it is possible that a reference
+# to a more specific place is given. To make it easier to jump to this place
+# (outside of doxygen) the user can define a custom "cut" / "paste" string.
+# Example:
+# WARN_LINE_FORMAT = "'vi $file +$line'"
+# See also: WARN_FORMAT
+# The default value is: at line $line of file $file.
+
+WARN_LINE_FORMAT       = "at line $line of file $file"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr). In case the file specified cannot be opened for writing the
+# warning and error messages are written to standard error. When as file - is
+# specified the warning and error messages are written to standard output
+# (stdout).
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT                  = README.md \
+                         include
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see:
+# https://www.gnu.org/software/libiconv/) for the list of possible encodings.
+# See also: INPUT_FILE_ENCODING
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify
+# character encoding on a per file pattern basis. Doxygen will compare the file
+# name with each pattern and apply the encoding instead of the default
+# INPUT_ENCODING) if there is a match. The character encodings are a list of the
+# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding
+# "INPUT_ENCODING" for further information on supported encodings.
+
+INPUT_FILE_ENCODING    =
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# Note the list of default checked file patterns might differ from the list of
+# default file extension mappings.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml,
+# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C
+# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd,
+# *.vhdl, *.ucf, *.qsf and *.ice.
+
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.idl \
+                         *.ddl \
+                         *.odl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.l \
+                         *.cs \
+                         *.d \
+                         *.php \
+                         *.php4 \
+                         *.php5 \
+                         *.phtml \
+                         *.inc \
+                         *.m \
+                         *.markdown \
+                         *.md \
+                         *.mm \
+                         *.dox \
+                         *.py \
+                         *.pyw \
+                         *.f90 \
+                         *.f95 \
+                         *.f03 \
+                         *.f08 \
+                         *.f18 \
+                         *.f \
+                         *.for \
+                         *.vhd \
+                         *.vhdl \
+                         *.ucf \
+                         *.qsf \
+                         *.ice
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                = include/capi \
+                         include/test \
+                         include/base/internal
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = *_internal.h
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# ANamespace::AClass, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS        = base::cef_subtle \
+                         base::internal \
+                         cef_trace_event \
+                         cef::logging
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that doxygen will use the data processed and written to standard output
+# for further processing, therefore nothing else, like debug statements or used
+# commands (so in case of a Windows batch file always use @echo OFF), should be
+# written to standard output.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE = README.md
+
+# The Fortran standard specifies that for fixed formatted Fortran code all
+# characters from position 72 are to be considered as comment. A common
+# extension is to allow longer lines before the automatic comment starts. The
+# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can
+# be processed before the automatic comment starts.
+# Minimum value: 7, maximum value: 10000, default value: 72.
+
+FORTRAN_COMMENT_AFTER  = 72
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# entity all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = NO
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see https://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = NO
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see:
+# http://clang.llvm.org/) for more accurate parsing at the cost of reduced
+# performance. This can be particularly helpful with template rich C++ code for
+# which doxygen's built-in parser lacks the necessary type information.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse_libclang=ON option for CMake.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS
+# tag is set to YES then doxygen will add the directory of each input to the
+# include path.
+# The default value is: YES.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_ADD_INC_PATHS    = YES
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS          =
+
+# If clang assisted parsing is enabled you can provide the clang parser with the
+# path to the directory containing a file called compile_commands.json. This
+# file is the compilation database (see:
+# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the
+# options used when the source files were built. This is equivalent to
+# specifying the -p option to a clang tool, such as clang-check. These options
+# will then be passed to the parser. Any options specified with CLANG_OPTIONS
+# will be added as well.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse_libclang=ON option for CMake.
+
+CLANG_DATABASE_PATH    =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          = Cef \
+                         cef_
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output
+# should be rendered with a dark or light theme. Default setting AUTO_LIGHT
+# enables light output unless the user preference is dark output. Other options
+# are DARK to always use dark mode, LIGHT to always use light mode, AUTO_DARK to
+# default to dark mode unless the user prefers light mode, and TOGGLE to let the
+# user toggle between dark and light mode via a button.
+# Possible values are: LIGHT Always generate light output., DARK Always generate
+# dark output., AUTO_LIGHT Automatically set the mode according to the user
+# preference, use light mode if no preference is set (the default)., AUTO_DARK
+# Automatically set the mode according to the user preference, use dark mode if
+# no preference is set. and TOGGLE Allow to user to switch between light and
+# dark mode via a button..
+# The default value is: AUTO_LIGHT.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE        = AUTO_LIGHT
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a color-wheel, see
+# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use gray-scales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = NO
+
+# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
+# documentation will contain a main index with vertical navigation menus that
+# are dynamically created via JavaScript. If disabled, the navigation index will
+# consists of multiple levels of tabs that are statically embedded in every HTML
+# page. Disable this option to support browsers that do not have JavaScript,
+# like the Qt help browser.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_MENUS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see:
+# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To
+# create a documentation set, doxygen will generate a Makefile in the HTML
+# output directory. Running make will produce the docset in that directory and
+# running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
+# genXcode/_index.html for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag determines the URL of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDURL         =
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# on Windows. In the beginning of 2021 Microsoft took the original page, with
+# a.o. the download links, offline the HTML help workshop was already many years
+# in maintenance mode). You can download the HTML help workshop from the web
+# archives at Installation executable (see:
+# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo
+# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe).
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION           =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the main .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location (absolute path
+# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to
+# run qhelpgenerator on the generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = YES
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine tune the look of the index (see "Fine-tuning the output"). As an
+# example, the default style sheet generated by doxygen has an example that
+# shows how to put an image at the root of the tree instead of the PROJECT_NAME.
+# Since the tree basically has the same information as the tab index, you could
+# consider setting DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = YES
+
+# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the
+# FULL_SIDEBAR option determines if the side bar is limited to only the treeview
+# area (value NO) or if it should extend to the full height of the window (value
+# YES). Setting this to YES gives a layout similar to
+# https://docs.readthedocs.io with more room for contents, but less room for the
+# project logo, title, and description. If either GENERATE_TREEVIEW or
+# DISABLE_INDEX is set to NO, this option has no effect.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FULL_SIDEBAR           = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email
+# addresses.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+OBFUSCATE_EMAILS       = YES
+
+# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
+# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
+# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
+# the HTML output. These images will generally look nicer at scaled resolutions.
+# Possible values are: png (the default) and svg (looks nicer but requires the
+# pdf2svg or inkscape tool).
+# The default value is: png.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FORMULA_FORMAT    = png
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE       = 10
+
+# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
+# to create new LaTeX commands to be used in formulas as building blocks. See
+# the section "Including formulas" for details.
+
+FORMULA_MACROFILE      =
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# https://www.mathjax.org) which uses client side JavaScript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# With MATHJAX_VERSION it is possible to specify the MathJax version to be used.
+# Note that the different versions of MathJax have different requirements with
+# regards to the different settings, so it is possible that also other MathJax
+# settings have to be changed when switching between the different MathJax
+# versions.
+# Possible values are: MathJax_2 and MathJax_3.
+# The default value is: MathJax_2.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_VERSION        = MathJax_2
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. For more details about the output format see MathJax
+# version 2 (see:
+# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3
+# (see:
+# http://docs.mathjax.org/en/latest/web/components/output.html).
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility. This is the name for Mathjax version 2, for MathJax version 3
+# this will be translated into chtml), NativeMML (i.e. MathML. Only supported
+# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This
+# is the name for Mathjax version 3, for MathJax version 2 this will be
+# translated into HTML-CSS) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from https://www.mathjax.org before deployment. The default value is:
+# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2
+# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        =
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# for MathJax version 2 (see
+# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions):
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# For example for MathJax version 3 (see
+# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html):
+# MATHJAX_EXTENSIONS = ams
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see:
+# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE           = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using JavaScript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see:
+# https://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see:
+# https://xapian.org/). See the section "External Indexing and Searching" for
+# details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when not enabling USE_PDFLATEX the default is latex when enabling
+# USE_PDFLATEX the default is pdflatex and when in the later case latex is
+# chosen this is overwritten by pdflatex. For specific output languages the
+# default can have been set differently, this depends on the implementation of
+# the output language.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME         =
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# Note: This tag is used in the Makefile / make.bat.
+# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file
+# (.tex).
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
+# generate index for LaTeX. In case there is no backslash (\) as first character
+# it will be automatically added in the LaTeX code.
+# Note: This tag is used in the generated output file (.tex).
+# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
+# The default value is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_MAKEINDEX_CMD    = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for
+# the generated LaTeX document. The header should contain everything until the
+# first chapter. If it is left blank doxygen will generate a standard header. It
+# is highly recommended to start with a default header using
+# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty
+# and then modify the file new_header.tex. See also section "Doxygen usage" for
+# information on how to generate the default header that doxygen normally uses.
+#
+# Note: Only use a user-defined header if you know what you are doing!
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. The following
+# commands have a special meaning inside the header (and footer): For a
+# description of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for
+# the generated LaTeX document. The footer should contain everything after the
+# last chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer. See also section "Doxygen
+# usage" for information on how to generate the default footer that doxygen
+# normally uses. Note: Only use a user-defined footer if you know what you are
+# doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as
+# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX
+# files. Set this option to YES, to get a higher quality PDF documentation.
+#
+# See also section LATEX_CMD_NAME for selecting the engine.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE        = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES     = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP        = NO
+
+# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
+# path from which the emoji images will be read. If a relative path is entered,
+# it will be relative to the LATEX_OUTPUT directory. If left blank the
+# LATEX_OUTPUT directory will be used.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EMOJI_DIRECTORY  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# configuration file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's configuration file. A template extensions file can be
+# generated using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = YES
+
+# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include
+# namespace members in file scope as well, matching the HTML output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_NS_MEMB_FILE_SCOPE = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
+# the structure of the code including all documentation. Note that this feature
+# is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to Sqlite3 output
+#---------------------------------------------------------------------------
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of
+# RECURSIVE has no effect here.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             = USING_CEF_SHARED \
+                         __cplusplus \
+                         OS_WIN \
+                         OS_LINUX \
+                         CEF_X11 \
+                         OS_MAC \
+                         ARCH_CPU_32_BITS
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH               =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT               = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of
+# subgraphs. When you want a differently looking font in the dot files that
+# doxygen generates you can specify fontname, fontcolor and fontsize attributes.
+# For details please see <a href=https://graphviz.org/doc/info/attrs.html>Node,
+# Edge and Graph Attributes specification</a> You need to make sure dot is able
+# to find the font, which can be done by putting it in a standard location or by
+# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
+# directory containing the font. Default graphviz fontsize is 14.
+# The default value is: fontname=Helvetica,fontsize=10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_COMMON_ATTR        = "fontname=Helvetica,fontsize=10"
+
+# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can
+# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. <a
+# href=https://graphviz.org/doc/info/arrows.html>Complete documentation about
+# arrows shapes.</a>
+# The default value is: labelfontname=Helvetica,labelfontsize=10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_EDGE_ATTR          = "labelfontname=Helvetica,labelfontsize=10"
+
+# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes
+# around nodes set 'shape=plain' or 'shape=plaintext' <a
+# href=https://www.graphviz.org/doc/info/shapes.html>Shapes specification</a>
+# The default value is: shape=box,height=0.2,width=0.4.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NODE_ATTR          = "shape=box,height=0.2,width=0.4"
+
+# You can set the path where dot can find font specified with fontname in
+# DOT_COMMON_ATTR and others dot attributes.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a
+# graph for each documented class showing the direct and indirect inheritance
+# relations. In case HAVE_DOT is set as well dot will be used to draw the graph,
+# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set
+# to TEXT the direct and indirect inheritance relations will be shown as texts /
+# links.
+# Possible values are: NO, YES, TEXT and GRAPH.
+# The default value is: YES.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies. See also the chapter Grouping
+# in the manual.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag UML_LOOK is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and
+# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS
+# tag is set to YES, doxygen will add type and arguments for attributes and
+# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen
+# will not generate fields with class member information in the UML graphs. The
+# class diagrams will look similar to the default class diagrams but using UML
+# notation for the relationships.
+# Possible values are: NO, YES and NONE.
+# The default value is: NO.
+# This tag requires that the tag UML_LOOK is set to YES.
+
+DOT_UML_DETAILS        = NO
+
+# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters
+# to display on a single line. If the actual line length exceeds this threshold
+# significantly it will wrapped across multiple lines. Some heuristics are apply
+# to avoid ugly line breaks.
+# Minimum value: 0, maximum value: 1000, default value: 17.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_WRAP_THRESHOLD     = 17
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH          = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = YES
+
+# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels
+# of child directories generated in directory dependency graphs by dot.
+# Minimum value: 1, maximum value: 25, default value: 1.
+# This tag requires that the tag DIRECTORY_GRAPH is set to YES.
+
+DIR_GRAPH_MAX_DEPTH    = 1
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS           =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file or to the filename of jar file
+# to be used. If left blank, it is assumed PlantUML is not used or called during
+# a preprocessing step. Doxygen will generate a warning when it encounters a
+# \startuml command in this case and will not generate output for the diagram.
+
+PLANTUML_JAR_PATH      =
+
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for plantuml.
+
+PLANTUML_CFG_FILE      =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH  =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal
+# graphical representation for inheritance and collaboration diagrams is used.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate
+# files that are used to generate the various graphs.
+#
+# Note: This setting is not only used for dot files but also for msc temporary
+# files.
+# The default value is: YES.
+
+DOT_CLEANUP            = YES
diff --git a/src/README.md b/src/README.md
index 9b69d59..ff44f17 100644
--- a/src/README.md
+++ b/src/README.md
@@ -9,9 +9,9 @@
 * Branches and Building - https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding

 * Announcements - https://groups.google.com/forum/#!forum/cef-announce

 * Support Forum - http://www.magpcss.org/ceforum/

-* CEF1 C++ API Docs - http://magpcss.org/ceforum/apidocs/

-* CEF3 C++ API Docs - http://magpcss.org/ceforum/apidocs3/

-* Downloads - http://opensource.spotify.com/cefbuilds/index.html

+* Issue Tracker - https://github.com/chromiumembedded/cef/issues

+* C++ API Docs - [Stable release docs](https://cef-builds.spotifycdn.com/docs/stable.html) / [Beta release docs](https://cef-builds.spotifycdn.com/docs/beta.html)

+* Downloads - https://cef-builds.spotifycdn.com/index.html

 * Donations - http://www.magpcss.org/ceforum/donate.php

 

 # Introduction

@@ -29,11 +29,11 @@
 

 # Getting Started

 

-Users new to CEF development should start by reading the [Tutorial](https://bitbucket.org/chromiumembedded/cef/wiki/Tutorial) Wiki page for an overview of CEF usage and then proceed to the [GeneralUsage](https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage) Wiki page for a more in-depth discussion or architectural and usage issues. Complete API documentation is available [here](http://magpcss.org/ceforum/apidocs3/). CEF support and related discussion is available on the [CEF Forum](http://www.magpcss.org/ceforum/).

+Users new to CEF development should start by reading the [Tutorial](https://bitbucket.org/chromiumembedded/cef/wiki/Tutorial) Wiki page for an overview of CEF usage and then proceed to the [GeneralUsage](https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage) Wiki page for a more in-depth discussion or architectural and usage issues. Complete API documentation is available [here](https://cef-builds.spotifycdn.com/docs/stable.html). CEF support and related discussion is available on the [CEF Forum](http://www.magpcss.org/ceforum/).

 

 # Binary Distributions

 

-Binary distributions, which include all files necessary to build a CEF-based application, are available on the [Downloads](http://opensource.spotify.com/cefbuilds/index.html) page. Binary distributions are stand-alone and do not require the download of CEF or Chromium source code. Symbol files for debugging binary distributions of libcef can also be downloaded from the above links.

+Binary distributions, which include all files necessary to build a CEF-based application, are available on the [Downloads](https://cef-builds.spotifycdn.com/index.html) page. Binary distributions are stand-alone and do not require the download of CEF or Chromium source code. Symbol files for debugging binary distributions of libcef can also be downloaded from the above links.

 

 # Source Distributions

 

@@ -45,15 +45,12 @@
 

 * .Net (CEF3) - https://github.com/cefsharp/CefSharp

 * .Net (CEF1) - https://bitbucket.org/fddima/cefglue

-* .Net/Mono (CEF3) - https://bitbucket.org/xilium/xilium.cefglue

-* .Net (CEF3) - https://bitbucket.org/chromiumfx/chromiumfx

-* Delphi (CEF1) - http://code.google.com/p/delphichromiumembedded/

-* Delphi (CEF3) - https://github.com/hgourvest/dcef3

-* Delphi (CEF3) - https://github.com/salvadordf/CEF4Delphi

-* Go - https://github.com/richardwilkes/cef

+* .Net/Mono (CEF3) - https://gitlab.com/xiliumhq/chromiumembedded/cefglue

+* Delphi - https://github.com/hgourvest/dcef3

+* Delphi - https://github.com/salvadordf/CEF4Delphi

 * Go - https://github.com/CzarekTomczak/cef2go

+* Go - https://github.com/energye/energy

 * Java - https://bitbucket.org/chromiumembedded/java-cef

-* Java - http://code.google.com/p/javacef/

 * Python - http://code.google.com/p/cefpython/

 

 If you're the maintainer of a project not listed above and would like your project listed here please either post to the [CEF Forum](http://www.magpcss.org/ceforum/) or contact Marshall directly.

@@ -62,7 +59,7 @@
 

 CEF is still very much a work in progress. Some ways that you can help out:

 

-\- Vote for issues in the [CEF issue tracker](https://bitbucket.org/chromiumembedded/cef/issues?status=new&status=open) that are important to you. This helps with development prioritization.

+\- Vote for issues in the [CEF issue tracker](https://github.com/chromiumembedded/cef/issues) that are important to you. This helps with development prioritization.

 

 \- Report any bugs that you find or feature requests that are important to you. Make sure to first search for existing issues before creating new ones. Please use the [CEF Forum](http://magpcss.org/ceforum) and not the issue tracker for usage questions. Each CEF issue should:

 

@@ -73,7 +70,7 @@
 

 \- Write unit tests for new or existing functionality.

 

-\- Pull requests and patches are welcome. View open issues in the [CEF issue tracker](https://bitbucket.org/chromiumembedded/cef/issues?status=new&status=open) or search for TODO(cef) in the source code for ideas.

+\- Pull requests and patches are welcome. View open issues in the [CEF issue tracker](https://github.com/chromiumembedded/cef/issues) or search for TODO(cef) in the source code for ideas.

 

 If you would like to contribute source code changes to CEF please follow the below guidelines:

 

@@ -82,6 +79,6 @@
 \- Submit a [pull request](https://bitbucket.org/chromiumembedded/cef/wiki/ContributingWithGit) or create a patch with your changes and attach it to the CEF issue. Changes should:

 

 * Be submitted against the current [CEF master branch](https://bitbucket.org/chromiumembedded/cef/src/?at=master) unless explicitly fixing a bug in a CEF release branch.

-* Follow the style of existing CEF source files. In general CEF uses the [Chromium coding style](http://www.chromium.org/developers/coding-style).

+* Follow the style of existing CEF source files. In general CEF uses the [Chromium C++ style guide](https://chromium.googlesource.com/chromium/src/+/master/styleguide/c++/c++.md).

 * Include new or modified unit tests as appropriate to the functionality.

 * Not include unnecessary or unrelated changes.

diff --git a/src/cef_create_projects.bat b/src/cef_create_projects.bat
index 8dc7784..bc1e48b 100644
--- a/src/cef_create_projects.bat
+++ b/src/cef_create_projects.bat
@@ -1,2 +1,2 @@
 @echo off

-python.bat tools\gclient_hook.py

+python3.bat tools\gclient_hook.py

diff --git a/src/cef_create_projects.sh b/src/cef_create_projects.sh
index a9c94cd..d77c9a1 100755
--- a/src/cef_create_projects.sh
+++ b/src/cef_create_projects.sh
@@ -1,2 +1,2 @@
 #!/bin/sh
-python tools/gclient_hook.py
+python3 tools/gclient_hook.py
diff --git a/src/cef_paths.gypi b/src/cef_paths.gypi
index a972dea..6adc138 100644
--- a/src/cef_paths.gypi
+++ b/src/cef_paths.gypi
@@ -1,4 +1,4 @@
-# Copyright (c) 2020 The Chromium Embedded Framework Authors. All rights
+# Copyright (c) 2023 The Chromium Embedded Framework Authors. All rights
 # reserved. Use of this source code is governed by a BSD-style license that
 # can be found in the LICENSE file.
 #
@@ -8,7 +8,7 @@
 # by hand. See the translator.README.txt file in the tools directory for
 # more information.
 #
-# $hash=72268a78a76d7d91b8ad47f6b6e9f6d9cb04d9cf$
+# $hash=ab931540f6f4d80336123acea6cf51e701f5a63a$
 #
 
 {
@@ -22,6 +22,7 @@
       'include/cef_browser_process_handler.h',
       'include/cef_callback.h',
       'include/cef_client.h',
+      'include/cef_command_handler.h',
       'include/cef_command_line.h',
       'include/cef_context_menu_handler.h',
       'include/cef_cookie.h',
@@ -40,6 +41,8 @@
       'include/cef_find_handler.h',
       'include/cef_focus_handler.h',
       'include/cef_frame.h',
+      'include/cef_frame_handler.h',
+      'include/cef_i18n_util.h',
       'include/cef_image.h',
       'include/cef_jsdialog_handler.h',
       'include/cef_keyboard_handler.h',
@@ -52,6 +55,8 @@
       'include/cef_origin_whitelist.h',
       'include/cef_parser.h',
       'include/cef_path_util.h',
+      'include/cef_permission_handler.h',
+      'include/cef_preference.h',
       'include/cef_print_handler.h',
       'include/cef_print_settings.h',
       'include/cef_process_message.h',
@@ -60,7 +65,6 @@
       'include/cef_render_handler.h',
       'include/cef_render_process_handler.h',
       'include/cef_request.h',
-      'include/cef_request_callback.h',
       'include/cef_request_context.h',
       'include/cef_request_context_handler.h',
       'include/cef_request_handler.h',
@@ -72,6 +76,8 @@
       'include/cef_response_filter.h',
       'include/cef_scheme.h',
       'include/cef_server.h',
+      'include/cef_shared_memory_region.h',
+      'include/cef_shared_process_message_builder.h',
       'include/cef_ssl_info.h',
       'include/cef_ssl_status.h',
       'include/cef_stream.h',
@@ -83,11 +89,11 @@
       'include/cef_v8.h',
       'include/cef_values.h',
       'include/cef_waitable_event.h',
-      'include/cef_web_plugin.h',
       'include/cef_x509_certificate.h',
       'include/cef_xml_reader.h',
       'include/cef_zip_reader.h',
       'include/test/cef_test_helpers.h',
+      'include/test/cef_test_server.h',
       'include/test/cef_translator_test.h',
       'include/views/cef_box_layout.h',
       'include/views/cef_browser_view.h',
@@ -100,6 +106,7 @@
       'include/views/cef_layout.h',
       'include/views/cef_menu_button.h',
       'include/views/cef_menu_button_delegate.h',
+      'include/views/cef_overlay_controller.h',
       'include/views/cef_panel.h',
       'include/views/cef_panel_delegate.h',
       'include/views/cef_scroll_view.h',
@@ -119,6 +126,7 @@
       'include/capi/cef_browser_process_handler_capi.h',
       'include/capi/cef_callback_capi.h',
       'include/capi/cef_client_capi.h',
+      'include/capi/cef_command_handler_capi.h',
       'include/capi/cef_command_line_capi.h',
       'include/capi/cef_context_menu_handler_capi.h',
       'include/capi/cef_cookie_capi.h',
@@ -137,6 +145,8 @@
       'include/capi/cef_find_handler_capi.h',
       'include/capi/cef_focus_handler_capi.h',
       'include/capi/cef_frame_capi.h',
+      'include/capi/cef_frame_handler_capi.h',
+      'include/capi/cef_i18n_util_capi.h',
       'include/capi/cef_image_capi.h',
       'include/capi/cef_jsdialog_handler_capi.h',
       'include/capi/cef_keyboard_handler_capi.h',
@@ -149,6 +159,8 @@
       'include/capi/cef_origin_whitelist_capi.h',
       'include/capi/cef_parser_capi.h',
       'include/capi/cef_path_util_capi.h',
+      'include/capi/cef_permission_handler_capi.h',
+      'include/capi/cef_preference_capi.h',
       'include/capi/cef_print_handler_capi.h',
       'include/capi/cef_print_settings_capi.h',
       'include/capi/cef_process_message_capi.h',
@@ -157,7 +169,6 @@
       'include/capi/cef_render_handler_capi.h',
       'include/capi/cef_render_process_handler_capi.h',
       'include/capi/cef_request_capi.h',
-      'include/capi/cef_request_callback_capi.h',
       'include/capi/cef_request_context_capi.h',
       'include/capi/cef_request_context_handler_capi.h',
       'include/capi/cef_request_handler_capi.h',
@@ -169,6 +180,8 @@
       'include/capi/cef_response_filter_capi.h',
       'include/capi/cef_scheme_capi.h',
       'include/capi/cef_server_capi.h',
+      'include/capi/cef_shared_memory_region_capi.h',
+      'include/capi/cef_shared_process_message_builder_capi.h',
       'include/capi/cef_ssl_info_capi.h',
       'include/capi/cef_ssl_status_capi.h',
       'include/capi/cef_stream_capi.h',
@@ -180,11 +193,11 @@
       'include/capi/cef_v8_capi.h',
       'include/capi/cef_values_capi.h',
       'include/capi/cef_waitable_event_capi.h',
-      'include/capi/cef_web_plugin_capi.h',
       'include/capi/cef_x509_certificate_capi.h',
       'include/capi/cef_xml_reader_capi.h',
       'include/capi/cef_zip_reader_capi.h',
       'include/capi/test/cef_test_helpers_capi.h',
+      'include/capi/test/cef_test_server_capi.h',
       'include/capi/test/cef_translator_test_capi.h',
       'include/capi/views/cef_box_layout_capi.h',
       'include/capi/views/cef_browser_view_capi.h',
@@ -197,6 +210,7 @@
       'include/capi/views/cef_layout_capi.h',
       'include/capi/views/cef_menu_button_capi.h',
       'include/capi/views/cef_menu_button_delegate_capi.h',
+      'include/capi/views/cef_overlay_controller_capi.h',
       'include/capi/views/cef_panel_capi.h',
       'include/capi/views/cef_panel_delegate_capi.h',
       'include/capi/views/cef_scroll_view_capi.h',
@@ -240,6 +254,8 @@
       'libcef_dll/cpptoc/callback_cpptoc.h',
       'libcef_dll/ctocpp/client_ctocpp.cc',
       'libcef_dll/ctocpp/client_ctocpp.h',
+      'libcef_dll/ctocpp/command_handler_ctocpp.cc',
+      'libcef_dll/ctocpp/command_handler_ctocpp.h',
       'libcef_dll/cpptoc/command_line_cpptoc.cc',
       'libcef_dll/cpptoc/command_line_cpptoc.h',
       'libcef_dll/ctocpp/completion_callback_ctocpp.cc',
@@ -300,6 +316,8 @@
       'libcef_dll/ctocpp/focus_handler_ctocpp.h',
       'libcef_dll/cpptoc/frame_cpptoc.cc',
       'libcef_dll/cpptoc/frame_cpptoc.h',
+      'libcef_dll/ctocpp/frame_handler_ctocpp.cc',
+      'libcef_dll/ctocpp/frame_handler_ctocpp.h',
       'libcef_dll/cpptoc/get_extension_resource_callback_cpptoc.cc',
       'libcef_dll/cpptoc/get_extension_resource_callback_cpptoc.h',
       'libcef_dll/cpptoc/image_cpptoc.cc',
@@ -320,6 +338,8 @@
       'libcef_dll/cpptoc/list_value_cpptoc.h',
       'libcef_dll/ctocpp/load_handler_ctocpp.cc',
       'libcef_dll/ctocpp/load_handler_ctocpp.h',
+      'libcef_dll/cpptoc/media_access_callback_cpptoc.cc',
+      'libcef_dll/cpptoc/media_access_callback_cpptoc.h',
       'libcef_dll/ctocpp/media_observer_ctocpp.cc',
       'libcef_dll/ctocpp/media_observer_ctocpp.h',
       'libcef_dll/cpptoc/media_route_cpptoc.cc',
@@ -348,16 +368,26 @@
       'libcef_dll/cpptoc/navigation_entry_cpptoc.h',
       'libcef_dll/ctocpp/navigation_entry_visitor_ctocpp.cc',
       'libcef_dll/ctocpp/navigation_entry_visitor_ctocpp.h',
+      'libcef_dll/cpptoc/views/overlay_controller_cpptoc.cc',
+      'libcef_dll/cpptoc/views/overlay_controller_cpptoc.h',
       'libcef_dll/cpptoc/views/panel_cpptoc.cc',
       'libcef_dll/cpptoc/views/panel_cpptoc.h',
       'libcef_dll/ctocpp/views/panel_delegate_ctocpp.cc',
       'libcef_dll/ctocpp/views/panel_delegate_ctocpp.h',
       'libcef_dll/ctocpp/pdf_print_callback_ctocpp.cc',
       'libcef_dll/ctocpp/pdf_print_callback_ctocpp.h',
+      'libcef_dll/ctocpp/permission_handler_ctocpp.cc',
+      'libcef_dll/ctocpp/permission_handler_ctocpp.h',
+      'libcef_dll/cpptoc/permission_prompt_callback_cpptoc.cc',
+      'libcef_dll/cpptoc/permission_prompt_callback_cpptoc.h',
       'libcef_dll/cpptoc/post_data_cpptoc.cc',
       'libcef_dll/cpptoc/post_data_cpptoc.h',
       'libcef_dll/cpptoc/post_data_element_cpptoc.cc',
       'libcef_dll/cpptoc/post_data_element_cpptoc.h',
+      'libcef_dll/cpptoc/preference_manager_cpptoc.cc',
+      'libcef_dll/cpptoc/preference_manager_cpptoc.h',
+      'libcef_dll/cpptoc/preference_registrar_cpptoc.cc',
+      'libcef_dll/cpptoc/preference_registrar_cpptoc.h',
       'libcef_dll/cpptoc/print_dialog_callback_cpptoc.cc',
       'libcef_dll/cpptoc/print_dialog_callback_cpptoc.h',
       'libcef_dll/ctocpp/print_handler_ctocpp.cc',
@@ -370,8 +400,6 @@
       'libcef_dll/cpptoc/process_message_cpptoc.h',
       'libcef_dll/ctocpp/read_handler_ctocpp.cc',
       'libcef_dll/ctocpp/read_handler_ctocpp.h',
-      'libcef_dll/ctocpp/register_cdm_callback_ctocpp.cc',
-      'libcef_dll/ctocpp/register_cdm_callback_ctocpp.h',
       'libcef_dll/cpptoc/registration_cpptoc.cc',
       'libcef_dll/cpptoc/registration_cpptoc.h',
       'libcef_dll/ctocpp/render_handler_ctocpp.cc',
@@ -380,8 +408,6 @@
       'libcef_dll/ctocpp/render_process_handler_ctocpp.h',
       'libcef_dll/cpptoc/request_cpptoc.cc',
       'libcef_dll/cpptoc/request_cpptoc.h',
-      'libcef_dll/cpptoc/request_callback_cpptoc.cc',
-      'libcef_dll/cpptoc/request_callback_cpptoc.h',
       'libcef_dll/cpptoc/request_context_cpptoc.cc',
       'libcef_dll/cpptoc/request_context_cpptoc.h',
       'libcef_dll/ctocpp/request_context_handler_ctocpp.cc',
@@ -410,6 +436,8 @@
       'libcef_dll/cpptoc/run_context_menu_callback_cpptoc.h',
       'libcef_dll/ctocpp/run_file_dialog_callback_ctocpp.cc',
       'libcef_dll/ctocpp/run_file_dialog_callback_ctocpp.h',
+      'libcef_dll/cpptoc/run_quick_menu_callback_cpptoc.cc',
+      'libcef_dll/cpptoc/run_quick_menu_callback_cpptoc.h',
       'libcef_dll/cpptoc/sslinfo_cpptoc.cc',
       'libcef_dll/cpptoc/sslinfo_cpptoc.h',
       'libcef_dll/cpptoc/sslstatus_cpptoc.cc',
@@ -428,6 +456,10 @@
       'libcef_dll/ctocpp/server_handler_ctocpp.h',
       'libcef_dll/ctocpp/set_cookie_callback_ctocpp.cc',
       'libcef_dll/ctocpp/set_cookie_callback_ctocpp.h',
+      'libcef_dll/cpptoc/shared_memory_region_cpptoc.cc',
+      'libcef_dll/cpptoc/shared_memory_region_cpptoc.h',
+      'libcef_dll/cpptoc/shared_process_message_builder_cpptoc.cc',
+      'libcef_dll/cpptoc/shared_process_message_builder_cpptoc.h',
       'libcef_dll/cpptoc/stream_reader_cpptoc.cc',
       'libcef_dll/cpptoc/stream_reader_cpptoc.h',
       'libcef_dll/cpptoc/stream_writer_cpptoc.cc',
@@ -438,6 +470,12 @@
       'libcef_dll/ctocpp/task_ctocpp.h',
       'libcef_dll/cpptoc/task_runner_cpptoc.cc',
       'libcef_dll/cpptoc/task_runner_cpptoc.h',
+      'libcef_dll/cpptoc/test/test_server_cpptoc.cc',
+      'libcef_dll/cpptoc/test/test_server_cpptoc.h',
+      'libcef_dll/cpptoc/test/test_server_connection_cpptoc.cc',
+      'libcef_dll/cpptoc/test/test_server_connection_cpptoc.h',
+      'libcef_dll/ctocpp/test/test_server_handler_ctocpp.cc',
+      'libcef_dll/ctocpp/test/test_server_handler_ctocpp.h',
       'libcef_dll/cpptoc/views/textfield_cpptoc.cc',
       'libcef_dll/cpptoc/views/textfield_cpptoc.h',
       'libcef_dll/ctocpp/views/textfield_delegate_ctocpp.cc',
@@ -496,12 +534,6 @@
       'libcef_dll/ctocpp/views/view_delegate_ctocpp.h',
       'libcef_dll/cpptoc/waitable_event_cpptoc.cc',
       'libcef_dll/cpptoc/waitable_event_cpptoc.h',
-      'libcef_dll/cpptoc/web_plugin_info_cpptoc.cc',
-      'libcef_dll/cpptoc/web_plugin_info_cpptoc.h',
-      'libcef_dll/ctocpp/web_plugin_info_visitor_ctocpp.cc',
-      'libcef_dll/ctocpp/web_plugin_info_visitor_ctocpp.h',
-      'libcef_dll/ctocpp/web_plugin_unstable_callback_ctocpp.cc',
-      'libcef_dll/ctocpp/web_plugin_unstable_callback_ctocpp.h',
       'libcef_dll/cpptoc/views/window_cpptoc.cc',
       'libcef_dll/cpptoc/views/window_cpptoc.h',
       'libcef_dll/ctocpp/views/window_delegate_ctocpp.cc',
@@ -550,6 +582,8 @@
       'libcef_dll/ctocpp/callback_ctocpp.h',
       'libcef_dll/cpptoc/client_cpptoc.cc',
       'libcef_dll/cpptoc/client_cpptoc.h',
+      'libcef_dll/cpptoc/command_handler_cpptoc.cc',
+      'libcef_dll/cpptoc/command_handler_cpptoc.h',
       'libcef_dll/ctocpp/command_line_ctocpp.cc',
       'libcef_dll/ctocpp/command_line_ctocpp.h',
       'libcef_dll/cpptoc/completion_callback_cpptoc.cc',
@@ -610,6 +644,8 @@
       'libcef_dll/cpptoc/focus_handler_cpptoc.h',
       'libcef_dll/ctocpp/frame_ctocpp.cc',
       'libcef_dll/ctocpp/frame_ctocpp.h',
+      'libcef_dll/cpptoc/frame_handler_cpptoc.cc',
+      'libcef_dll/cpptoc/frame_handler_cpptoc.h',
       'libcef_dll/ctocpp/get_extension_resource_callback_ctocpp.cc',
       'libcef_dll/ctocpp/get_extension_resource_callback_ctocpp.h',
       'libcef_dll/ctocpp/image_ctocpp.cc',
@@ -630,6 +666,8 @@
       'libcef_dll/ctocpp/list_value_ctocpp.h',
       'libcef_dll/cpptoc/load_handler_cpptoc.cc',
       'libcef_dll/cpptoc/load_handler_cpptoc.h',
+      'libcef_dll/ctocpp/media_access_callback_ctocpp.cc',
+      'libcef_dll/ctocpp/media_access_callback_ctocpp.h',
       'libcef_dll/cpptoc/media_observer_cpptoc.cc',
       'libcef_dll/cpptoc/media_observer_cpptoc.h',
       'libcef_dll/ctocpp/media_route_ctocpp.cc',
@@ -658,16 +696,26 @@
       'libcef_dll/ctocpp/navigation_entry_ctocpp.h',
       'libcef_dll/cpptoc/navigation_entry_visitor_cpptoc.cc',
       'libcef_dll/cpptoc/navigation_entry_visitor_cpptoc.h',
+      'libcef_dll/ctocpp/views/overlay_controller_ctocpp.cc',
+      'libcef_dll/ctocpp/views/overlay_controller_ctocpp.h',
       'libcef_dll/ctocpp/views/panel_ctocpp.cc',
       'libcef_dll/ctocpp/views/panel_ctocpp.h',
       'libcef_dll/cpptoc/views/panel_delegate_cpptoc.cc',
       'libcef_dll/cpptoc/views/panel_delegate_cpptoc.h',
       'libcef_dll/cpptoc/pdf_print_callback_cpptoc.cc',
       'libcef_dll/cpptoc/pdf_print_callback_cpptoc.h',
+      'libcef_dll/cpptoc/permission_handler_cpptoc.cc',
+      'libcef_dll/cpptoc/permission_handler_cpptoc.h',
+      'libcef_dll/ctocpp/permission_prompt_callback_ctocpp.cc',
+      'libcef_dll/ctocpp/permission_prompt_callback_ctocpp.h',
       'libcef_dll/ctocpp/post_data_ctocpp.cc',
       'libcef_dll/ctocpp/post_data_ctocpp.h',
       'libcef_dll/ctocpp/post_data_element_ctocpp.cc',
       'libcef_dll/ctocpp/post_data_element_ctocpp.h',
+      'libcef_dll/ctocpp/preference_manager_ctocpp.cc',
+      'libcef_dll/ctocpp/preference_manager_ctocpp.h',
+      'libcef_dll/ctocpp/preference_registrar_ctocpp.cc',
+      'libcef_dll/ctocpp/preference_registrar_ctocpp.h',
       'libcef_dll/ctocpp/print_dialog_callback_ctocpp.cc',
       'libcef_dll/ctocpp/print_dialog_callback_ctocpp.h',
       'libcef_dll/cpptoc/print_handler_cpptoc.cc',
@@ -680,8 +728,6 @@
       'libcef_dll/ctocpp/process_message_ctocpp.h',
       'libcef_dll/cpptoc/read_handler_cpptoc.cc',
       'libcef_dll/cpptoc/read_handler_cpptoc.h',
-      'libcef_dll/cpptoc/register_cdm_callback_cpptoc.cc',
-      'libcef_dll/cpptoc/register_cdm_callback_cpptoc.h',
       'libcef_dll/ctocpp/registration_ctocpp.cc',
       'libcef_dll/ctocpp/registration_ctocpp.h',
       'libcef_dll/cpptoc/render_handler_cpptoc.cc',
@@ -690,8 +736,6 @@
       'libcef_dll/cpptoc/render_process_handler_cpptoc.h',
       'libcef_dll/ctocpp/request_ctocpp.cc',
       'libcef_dll/ctocpp/request_ctocpp.h',
-      'libcef_dll/ctocpp/request_callback_ctocpp.cc',
-      'libcef_dll/ctocpp/request_callback_ctocpp.h',
       'libcef_dll/ctocpp/request_context_ctocpp.cc',
       'libcef_dll/ctocpp/request_context_ctocpp.h',
       'libcef_dll/cpptoc/request_context_handler_cpptoc.cc',
@@ -720,6 +764,8 @@
       'libcef_dll/ctocpp/run_context_menu_callback_ctocpp.h',
       'libcef_dll/cpptoc/run_file_dialog_callback_cpptoc.cc',
       'libcef_dll/cpptoc/run_file_dialog_callback_cpptoc.h',
+      'libcef_dll/ctocpp/run_quick_menu_callback_ctocpp.cc',
+      'libcef_dll/ctocpp/run_quick_menu_callback_ctocpp.h',
       'libcef_dll/ctocpp/sslinfo_ctocpp.cc',
       'libcef_dll/ctocpp/sslinfo_ctocpp.h',
       'libcef_dll/ctocpp/sslstatus_ctocpp.cc',
@@ -738,6 +784,10 @@
       'libcef_dll/cpptoc/server_handler_cpptoc.h',
       'libcef_dll/cpptoc/set_cookie_callback_cpptoc.cc',
       'libcef_dll/cpptoc/set_cookie_callback_cpptoc.h',
+      'libcef_dll/ctocpp/shared_memory_region_ctocpp.cc',
+      'libcef_dll/ctocpp/shared_memory_region_ctocpp.h',
+      'libcef_dll/ctocpp/shared_process_message_builder_ctocpp.cc',
+      'libcef_dll/ctocpp/shared_process_message_builder_ctocpp.h',
       'libcef_dll/ctocpp/stream_reader_ctocpp.cc',
       'libcef_dll/ctocpp/stream_reader_ctocpp.h',
       'libcef_dll/ctocpp/stream_writer_ctocpp.cc',
@@ -748,6 +798,12 @@
       'libcef_dll/cpptoc/task_cpptoc.h',
       'libcef_dll/ctocpp/task_runner_ctocpp.cc',
       'libcef_dll/ctocpp/task_runner_ctocpp.h',
+      'libcef_dll/ctocpp/test/test_server_ctocpp.cc',
+      'libcef_dll/ctocpp/test/test_server_ctocpp.h',
+      'libcef_dll/ctocpp/test/test_server_connection_ctocpp.cc',
+      'libcef_dll/ctocpp/test/test_server_connection_ctocpp.h',
+      'libcef_dll/cpptoc/test/test_server_handler_cpptoc.cc',
+      'libcef_dll/cpptoc/test/test_server_handler_cpptoc.h',
       'libcef_dll/ctocpp/views/textfield_ctocpp.cc',
       'libcef_dll/ctocpp/views/textfield_ctocpp.h',
       'libcef_dll/cpptoc/views/textfield_delegate_cpptoc.cc',
@@ -806,12 +862,6 @@
       'libcef_dll/cpptoc/views/view_delegate_cpptoc.h',
       'libcef_dll/ctocpp/waitable_event_ctocpp.cc',
       'libcef_dll/ctocpp/waitable_event_ctocpp.h',
-      'libcef_dll/ctocpp/web_plugin_info_ctocpp.cc',
-      'libcef_dll/ctocpp/web_plugin_info_ctocpp.h',
-      'libcef_dll/cpptoc/web_plugin_info_visitor_cpptoc.cc',
-      'libcef_dll/cpptoc/web_plugin_info_visitor_cpptoc.h',
-      'libcef_dll/cpptoc/web_plugin_unstable_callback_cpptoc.cc',
-      'libcef_dll/cpptoc/web_plugin_unstable_callback_cpptoc.h',
       'libcef_dll/ctocpp/views/window_ctocpp.cc',
       'libcef_dll/ctocpp/views/window_ctocpp.h',
       'libcef_dll/cpptoc/views/window_delegate_cpptoc.cc',
diff --git a/src/cef_paths2.gypi b/src/cef_paths2.gypi
index 0d5d3c3..9a5b227 100644
--- a/src/cef_paths2.gypi
+++ b/src/cef_paths2.gypi
@@ -5,26 +5,24 @@
 {
   'variables': {
     'includes_common': [
+      'include/base/cef_atomic_flag.h',
       'include/base/cef_atomic_ref_count.h',
-      'include/base/cef_atomicops.h',
-      'include/base/cef_basictypes.h',
+      'include/base/cef_auto_reset.h',
       'include/base/cef_bind.h',
-      'include/base/cef_bind_helpers.h',
       'include/base/cef_build.h',
       'include/base/cef_callback.h',
       'include/base/cef_callback_forward.h',
       'include/base/cef_callback_helpers.h',
       'include/base/cef_callback_list.h',
       'include/base/cef_cancelable_callback.h',
+      'include/base/cef_compiler_specific.h',
       'include/base/cef_lock.h',
       'include/base/cef_logging.h',
       'include/base/cef_macros.h',
-      'include/base/cef_move.h',
       'include/base/cef_platform_thread.h',
+      'include/base/cef_ptr_util.h',
       'include/base/cef_ref_counted.h',
-      'include/base/cef_scoped_ptr.h',
-      'include/base/cef_string16.h',
-      'include/base/cef_template_util.h',
+      'include/base/cef_scoped_refptr.h',
       'include/base/cef_thread_checker.h',
       'include/base/cef_trace_event.h',
       'include/base/cef_tuple.h',
@@ -33,14 +31,15 @@
       'include/base/internal/cef_callback_internal.h',
       'include/base/internal/cef_lock_impl.h',
       'include/base/internal/cef_raw_scoped_refptr_mismatch_checker.h',
+      'include/base/internal/cef_scoped_policy.h',
       'include/base/internal/cef_thread_checker_impl.h',
       'include/cef_api_hash.h',
       'include/cef_base.h',
-      'include/cef_config.h',
       'include/cef_version.h',
       'include/internal/cef_export.h',
       'include/internal/cef_ptr.h',
       'include/internal/cef_string_wrappers.h',
+      'include/internal/cef_time_wrappers.h',
       'include/internal/cef_types_wrappers.h',
     ],
     'includes_common_capi': [
@@ -54,6 +53,8 @@
       'include/internal/cef_time.h',
       'include/internal/cef_trace_event_internal.h',
       'include/internal/cef_types.h',
+      'include/internal/cef_types_content_settings.h',
+      'include/internal/cef_types_geometry.h',
     ],
     'includes_capi': [
       'include/capi/cef_base_capi.h',
@@ -73,18 +74,16 @@
       'include/wrapper/cef_library_loader.h',
     ],
     'includes_win': [
-      'include/base/internal/cef_atomicops_arm64_msvc.h',
-      'include/base/internal/cef_atomicops_x86_msvc.h',
-      'include/base/internal/cef_bind_internal_win.h',
       'include/cef_sandbox_win.h',
       'include/internal/cef_win.h',
     ],
     'includes_win_capi': [
+      'include/internal/cef_app_win.h',
       'include/internal/cef_types_win.h',
     ],
     'includes_mac': [
-      'include/base/internal/cef_atomicops_atomicword_compat.h',
-      'include/base/internal/cef_atomicops_mac.h',
+      'include/base/cef_scoped_typeref_mac.h',
+      'include/base/internal/cef_scoped_block_mac.h',
       'include/cef_application_mac.h',
       'include/cef_sandbox_mac.h',
       'include/internal/cef_mac.h',
@@ -93,10 +92,6 @@
       'include/internal/cef_types_mac.h',
     ],
     'includes_linux': [
-      'include/base/internal/cef_atomicops_atomicword_compat.h',
-      'include/base/internal/cef_atomicops_arm_gcc.h',
-      'include/base/internal/cef_atomicops_arm64_gcc.h',
-      'include/base/internal/cef_atomicops_x86_gcc.h',
       'include/internal/cef_linux.h',
     ],
     'includes_linux_capi': [
@@ -117,20 +112,19 @@
       'libcef_dll/resource.h',
       'libcef_dll/shutdown_checker.cc',
       'libcef_dll/shutdown_checker.h',
+      'libcef_dll/template_util.h',
       'libcef_dll/transfer_util.cc',
       'libcef_dll/transfer_util.h',
       'libcef_dll/wrapper_types.h',
     ],
     'libcef_dll_wrapper_sources_base': [
-      'libcef_dll/base/cef_atomicops_x86_gcc.cc',
-      'libcef_dll/base/cef_bind_helpers.cc',
+      'libcef_dll/base/cef_atomic_flag.cc',
       'libcef_dll/base/cef_callback_helpers.cc',
       'libcef_dll/base/cef_callback_internal.cc',
       'libcef_dll/base/cef_lock.cc',
       'libcef_dll/base/cef_lock_impl.cc',
       'libcef_dll/base/cef_logging.cc',
       'libcef_dll/base/cef_ref_counted.cc',
-      'libcef_dll/base/cef_string16.cc',
       'libcef_dll/base/cef_thread_checker_impl.cc',
       'libcef_dll/base/cef_weak_ptr.cc',
     ],
@@ -143,9 +137,9 @@
       'libcef_dll/cpptoc/cpptoc_scoped.h',
       'libcef_dll/ctocpp/ctocpp_ref_counted.h',
       'libcef_dll/ctocpp/ctocpp_scoped.h',
-      'libcef_dll/ptr_util.h',
       'libcef_dll/shutdown_checker.cc',
       'libcef_dll/shutdown_checker.h',
+      'libcef_dll/template_util.h',
       'libcef_dll/transfer_util.cc',
       'libcef_dll/transfer_util.h',
       'libcef_dll/wrapper_types.h',
@@ -153,6 +147,8 @@
       'libcef_dll/wrapper/cef_byte_read_handler.cc',
       'libcef_dll/wrapper/cef_closure_task.cc',
       'libcef_dll/wrapper/cef_message_router.cc',
+      'libcef_dll/wrapper/cef_message_router_utils.cc',
+      'libcef_dll/wrapper/cef_message_router_utils.h',
       'libcef_dll/wrapper/cef_resource_manager.cc',
       'libcef_dll/wrapper/cef_scoped_temp_dir.cc',
       'libcef_dll/wrapper/cef_stream_resource_handler.cc',
@@ -183,12 +179,16 @@
       'tests/shared/browser/resource_util.h',
     ],
     'shared_sources_common': [
+      'tests/shared/common/binary_value_utils.cc',
+      'tests/shared/common/binary_value_utils.h',
       'tests/shared/common/client_app.cc',
       'tests/shared/common/client_app.h',
       'tests/shared/common/client_app_other.cc',
       'tests/shared/common/client_app_other.h',
       'tests/shared/common/client_switches.cc',
       'tests/shared/common/client_switches.h',
+      'tests/shared/common/string_util.cc',
+      'tests/shared/common/string_util.h',
     ],
     'shared_sources_renderer': [
       'tests/shared/renderer/client_app_renderer.cc',
@@ -220,6 +220,8 @@
       'tests/shared/browser/util_win.h',
     ],
     'cefclient_sources_browser': [
+      'tests/cefclient/browser/binary_transfer_test.cc',
+      'tests/cefclient/browser/binary_transfer_test.h',
       'tests/cefclient/browser/binding_test.cc',
       'tests/cefclient/browser/binding_test.h',
       'tests/cefclient/browser/browser_window.cc',
@@ -235,11 +237,13 @@
       'tests/cefclient/browser/client_handler_osr.h',
       'tests/cefclient/browser/client_handler_std.cc',
       'tests/cefclient/browser/client_handler_std.h',
+      'tests/cefclient/browser/client_prefs.cc',
+      'tests/cefclient/browser/client_prefs.h',
       'tests/cefclient/browser/client_types.h',
+      'tests/cefclient/browser/default_client_handler.cc',
+      'tests/cefclient/browser/default_client_handler.h',
       'tests/cefclient/browser/dialog_test.cc',
       'tests/cefclient/browser/dialog_test.h',
-      'tests/cefclient/browser/drm_test.cc',
-      'tests/cefclient/browser/drm_test.h',
       'tests/cefclient/browser/image_cache.cc',
       'tests/cefclient/browser/image_cache.h',
       'tests/cefclient/browser/main_context.cc',
@@ -262,6 +266,8 @@
       'tests/cefclient/browser/root_window_create.cc',
       'tests/cefclient/browser/root_window_manager.cc',
       'tests/cefclient/browser/root_window_manager.h',
+      'tests/cefclient/browser/root_window_views.cc',
+      'tests/cefclient/browser/root_window_views.h',
       'tests/cefclient/browser/scheme_test.cc',
       'tests/cefclient/browser/scheme_test.h',
       'tests/cefclient/browser/server_test.cc',
@@ -271,10 +277,20 @@
       'tests/cefclient/browser/test_runner.h',
       'tests/cefclient/browser/urlrequest_test.cc',
       'tests/cefclient/browser/urlrequest_test.h',
+      'tests/cefclient/browser/views_menu_bar.cc',
+      'tests/cefclient/browser/views_menu_bar.h',
+      'tests/cefclient/browser/views_overlay_controls.cc',
+      'tests/cefclient/browser/views_overlay_controls.h',
+      'tests/cefclient/browser/views_style.cc',
+      'tests/cefclient/browser/views_style.h',
+      'tests/cefclient/browser/views_window.cc',
+      'tests/cefclient/browser/views_window.h',
       'tests/cefclient/browser/window_test.cc',
       'tests/cefclient/browser/window_test.h',
       'tests/cefclient/browser/window_test_runner.cc',
       'tests/cefclient/browser/window_test_runner.h',
+      'tests/cefclient/browser/window_test_runner_views.cc',
+      'tests/cefclient/browser/window_test_runner_views.h',
     ],
     'cefclient_sources_common': [
       'tests/cefclient/common/client_app_delegates_common.cc',
@@ -285,6 +301,8 @@
       'tests/cefclient/renderer/client_app_delegates_renderer.cc',
       'tests/cefclient/renderer/client_renderer.cc',
       'tests/cefclient/renderer/client_renderer.h',
+      'tests/cefclient/renderer/ipc_performance_test.cc',
+      'tests/cefclient/renderer/ipc_performance_test.h',
       'tests/cefclient/renderer/performance_test.cc',
       'tests/cefclient/renderer/performance_test.h',
       'tests/cefclient/renderer/performance_test_setup.h',
@@ -294,7 +312,8 @@
       'tests/cefclient/resources/binding.html',
       'tests/cefclient/resources/dialogs.html',
       'tests/cefclient/resources/draggable.html',
-      'tests/cefclient/resources/drm.html',
+      'tests/cefclient/resources/ipc_performance.html',
+      'tests/cefclient/resources/binary_transfer.html',
       'tests/cefclient/resources/localstorage.html',
       'tests/cefclient/resources/logo.png',
       'tests/cefclient/resources/media_router.html',
@@ -347,20 +366,10 @@
       'tests/cefclient/browser/osr_window_win.cc',
       'tests/cefclient/browser/osr_window_win.h',
       'tests/cefclient/browser/resource_util_win_idmap.cc',
-      'tests/cefclient/browser/root_window_views.cc',
-      'tests/cefclient/browser/root_window_views.h',
       'tests/cefclient/browser/root_window_win.cc',
       'tests/cefclient/browser/root_window_win.h',
       'tests/cefclient/browser/temp_window_win.cc',
       'tests/cefclient/browser/temp_window_win.h',
-      'tests/cefclient/browser/views_menu_bar.cc',
-      'tests/cefclient/browser/views_menu_bar.h',
-      'tests/cefclient/browser/views_style.cc',
-      'tests/cefclient/browser/views_style.h',
-      'tests/cefclient/browser/views_window.cc',
-      'tests/cefclient/browser/views_window.h',
-      'tests/cefclient/browser/window_test_runner_views.cc',
-      'tests/cefclient/browser/window_test_runner_views.h',
       'tests/cefclient/browser/window_test_runner_win.cc',
       'tests/cefclient/browser/window_test_runner_win.h',
       'tests/cefclient/cefclient_win.cc',
@@ -388,6 +397,7 @@
       'tests/cefclient/browser/temp_window_mac.mm',
       'tests/cefclient/browser/text_input_client_osr_mac.h',
       'tests/cefclient/browser/text_input_client_osr_mac.mm',
+      'tests/cefclient/browser/views_window_mac.mm',
       'tests/cefclient/browser/window_test_runner_mac.h',
       'tests/cefclient/browser/window_test_runner_mac.mm',
       'tests/cefclient/cefclient_mac.mm',
@@ -413,22 +423,12 @@
       'tests/cefclient/browser/resource_util_linux.cc',
       'tests/cefclient/browser/root_window_gtk.cc',
       'tests/cefclient/browser/root_window_gtk.h',
-      'tests/cefclient/browser/root_window_views.cc',
-      'tests/cefclient/browser/root_window_views.h',
       'tests/cefclient/browser/temp_window_x11.cc',
       'tests/cefclient/browser/temp_window_x11.h',
       'tests/cefclient/browser/util_gtk.cc',
       'tests/cefclient/browser/util_gtk.h',
-      'tests/cefclient/browser/views_menu_bar.cc',
-      'tests/cefclient/browser/views_menu_bar.h',
-      'tests/cefclient/browser/views_style.cc',
-      'tests/cefclient/browser/views_style.h',
-      'tests/cefclient/browser/views_window.cc',
-      'tests/cefclient/browser/views_window.h',
       'tests/cefclient/browser/window_test_runner_gtk.cc',
       'tests/cefclient/browser/window_test_runner_gtk.h',
-      'tests/cefclient/browser/window_test_runner_views.cc',
-      'tests/cefclient/browser/window_test_runner_views.h',
       'tests/cefclient/cefclient_gtk.cc',
     ],
     'cefsimple_sources_common': [
@@ -465,11 +465,19 @@
       'tests/cefsimple/cefsimple_linux.cc',
       'tests/cefsimple/simple_handler_linux.cc',
     ],
+    'ceftests_data_resources': [
+      'tests/ceftests/resources/net/data/ssl/certificates/expired_cert.pem',
+      'tests/ceftests/resources/net/data/ssl/certificates/localhost_cert.pem',
+      'tests/ceftests/resources/net/data/ssl/certificates/ok_cert.pem',
+      'tests/ceftests/resources/net/data/ssl/certificates/root_ca_cert.pem',
+    ],
     'ceftests_sources_common': [
       'tests/ceftests/audio_output_unittest.cc',
       'tests/ceftests/browser_info_map_unittest.cc',
+      'tests/ceftests/certificate_error_unittest.cc',
       'tests/ceftests/command_line_unittest.cc',
       'tests/ceftests/cookie_unittest.cc',
+      'tests/ceftests/cors_unittest.cc',
       'tests/ceftests/devtools_message_unittest.cc',
       'tests/ceftests/dialog_unittest.cc',
       'tests/ceftests/display_unittest.cc',
@@ -484,19 +492,29 @@
       'tests/ceftests/extensions/extension_test_handler.h',
       'tests/ceftests/extensions/view_unittest.cc',
       'tests/ceftests/file_util_unittest.cc',
+      'tests/ceftests/frame_handler_unittest.cc',
       'tests/ceftests/frame_unittest.cc',
+      'tests/ceftests/hsts_redirect_unittest.cc',
       'tests/ceftests/image_unittest.cc',
       'tests/ceftests/image_util.cc',
       'tests/ceftests/image_util.h',
       'tests/ceftests/jsdialog_unittest.cc',
       'tests/ceftests/life_span_unittest.cc',
-      'tests/ceftests/message_router_unittest.cc',
+      'tests/ceftests/media_access_unittest.cc',
+      'tests/ceftests/message_router_binary_unittest.cc',
+      'tests/ceftests/message_router_harness_unittest.cc',
+      'tests/ceftests/message_router_multi_query_unittest.cc',
+      'tests/ceftests/message_router_single_query_unittest.cc',
+      'tests/ceftests/message_router_threshold_unittest.cc',
+      'tests/ceftests/message_router_unittest_utils.cc',
+      'tests/ceftests/message_router_unittest_utils.h',
       'tests/ceftests/navigation_unittest.cc',
       'tests/ceftests/os_rendering_unittest.cc',
       'tests/ceftests/osr_accessibility_unittest.cc',
       'tests/ceftests/osr_display_unittest.cc',
       'tests/ceftests/parser_unittest.cc',
-      'tests/ceftests/plugin_unittest.cc',
+      'tests/ceftests/pdf_viewer_unittest.cc',
+      'tests/ceftests/permission_prompt_unittest.cc',
       'tests/ceftests/preference_unittest.cc',
       'tests/ceftests/print_unittest.cc',
       'tests/ceftests/process_message_unittest.cc',
@@ -513,6 +531,8 @@
       'tests/ceftests/scheme_handler_unittest.cc',
       'tests/ceftests/scoped_temp_dir_unittest.cc',
       'tests/ceftests/server_unittest.cc',
+      'tests/ceftests/send_shared_process_message_unittest.cc',
+      "tests/ceftests/shared_process_message_unittest.cc",
       'tests/ceftests/stream_unittest.cc',
       'tests/ceftests/stream_resource_handler_unittest.cc',
       'tests/ceftests/string_unittest.cc',
@@ -520,25 +540,35 @@
       'tests/ceftests/task_unittest.cc',
       'tests/ceftests/test_handler.cc',
       'tests/ceftests/test_handler.h',
+      'tests/ceftests/test_request.cc',
+      'tests/ceftests/test_request.h',
+      'tests/ceftests/test_server.cc',
+      'tests/ceftests/test_server.h',
+      'tests/ceftests/test_server_observer.h',
+      'tests/ceftests/test_server_observer.cc',
+      'tests/ceftests/test_server_observer_unittest.cc',
+      'tests/ceftests/test_server_manager.h',
+      'tests/ceftests/test_server_manager.cc',
+      'tests/ceftests/test_server_runner.h',
+      'tests/ceftests/test_server_runner.cc',
+      'tests/ceftests/test_server_runner_normal.cc',
+      'tests/ceftests/test_server_runner_test.cc',
+      'tests/ceftests/test_server_unittest.cc',
       'tests/ceftests/test_suite.cc',
       'tests/ceftests/test_suite.h',
       'tests/ceftests/test_util.cc',
       'tests/ceftests/test_util.h',
+      'tests/ceftests/time_unittest.cc',
       'tests/ceftests/thread_helper.cc',
       'tests/ceftests/thread_helper.h',
       'tests/ceftests/thread_unittest.cc',
       'tests/ceftests/tracing_unittest.cc',
+      'tests/ceftests/track_callback.h',
       'tests/ceftests/translator_unittest.cc',
       'tests/ceftests/urlrequest_unittest.cc',
       'tests/ceftests/v8_unittest.cc',
       'tests/ceftests/values_unittest.cc',
       'tests/ceftests/version_unittest.cc',
-      'tests/ceftests/waitable_event_unittest.cc',
-      'tests/ceftests/webui_unittest.cc',
-      'tests/ceftests/xml_reader_unittest.cc',
-      'tests/ceftests/zip_reader_unittest.cc',
-    ],
-    'ceftests_sources_views': [
       'tests/ceftests/views/button_unittest.cc',
       'tests/ceftests/views/panel_unittest.cc',
       'tests/ceftests/views/scroll_view_unittest.cc',
@@ -546,8 +576,13 @@
       'tests/ceftests/views/test_window_delegate.h',
       'tests/ceftests/views/textfield_unittest.cc',
       'tests/ceftests/views/window_unittest.cc',
+      'tests/ceftests/waitable_event_unittest.cc',
+      'tests/ceftests/webui_unittest.cc',
+      'tests/ceftests/xml_reader_unittest.cc',
+      'tests/ceftests/zip_reader_unittest.cc',
     ],
     'ceftests_sources_win': [
+      'tests/ceftests/resource_util_win_dir.cc',
       'tests/ceftests/resource_util_win_idmap.cc',
       'tests/ceftests/resources/win/ceftests.rc',
     ],
@@ -570,11 +605,20 @@
       'tests/ceftests/audio_output_unittest.cc',
       'tests/ceftests/client_app_delegates.cc',
       'tests/ceftests/cookie_unittest.cc',
+      'tests/ceftests/cors_unittest.cc',
       'tests/ceftests/dom_unittest.cc',
       'tests/ceftests/frame_unittest.cc',
-      'tests/ceftests/message_router_unittest.cc',
+      'tests/ceftests/media_access_unittest.cc',
+      'tests/ceftests/message_router_binary_unittest.cc',
+      'tests/ceftests/message_router_harness_unittest.cc',
+      'tests/ceftests/message_router_multi_query_unittest.cc',
+      'tests/ceftests/message_router_single_query_unittest.cc',
+      'tests/ceftests/message_router_threshold_unittest.cc',
+      'tests/ceftests/message_router_unittest_utils.cc',
+      'tests/ceftests/message_router_unittest_utils.h',
       'tests/ceftests/navigation_unittest.cc',
-      'tests/ceftests/plugin_unittest.cc',
+      'tests/ceftests/pdf_viewer_unittest.cc',
+      'tests/ceftests/permission_prompt_unittest.cc',
       'tests/ceftests/preference_unittest.cc',
       'tests/ceftests/process_message_unittest.cc',
       'tests/ceftests/request_handler_unittest.cc',
@@ -584,13 +628,28 @@
       'tests/ceftests/routing_test_handler.cc',
       'tests/ceftests/routing_test_handler.h',
       'tests/ceftests/scheme_handler_unittest.cc',
+      'tests/ceftests/send_shared_process_message_unittest.cc',
+      "tests/ceftests/shared_process_message_unittest.cc",
       'tests/ceftests/urlrequest_unittest.cc',
       'tests/ceftests/test_handler.cc',
       'tests/ceftests/test_handler.h',
+      'tests/ceftests/test_request.cc',
+      'tests/ceftests/test_request.h',
+      'tests/ceftests/test_server.cc',
+      'tests/ceftests/test_server.h',
+      'tests/ceftests/test_server_observer.h',
+      'tests/ceftests/test_server_observer.cc',
+      'tests/ceftests/test_server_manager.h',
+      'tests/ceftests/test_server_manager.cc',
+      'tests/ceftests/test_server_runner.h',
+      'tests/ceftests/test_server_runner.cc',
+      'tests/ceftests/test_server_runner_normal.cc',
+      'tests/ceftests/test_server_runner_test.cc',
       'tests/ceftests/test_suite.cc',
       'tests/ceftests/test_suite.h',
       'tests/ceftests/test_util.cc',
       'tests/ceftests/test_util.h',
+      'tests/ceftests/track_callback.h',
       'tests/ceftests/thread_helper.cc',
       'tests/ceftests/thread_helper.h',
       'tests/ceftests/thread_unittest.cc',
diff --git a/src/cef_repack_locales.gni b/src/cef_repack_locales.gni
deleted file mode 100644
index 51e9189..0000000
--- a/src/cef_repack_locales.gni
+++ /dev/null
@@ -1,132 +0,0 @@
-# Copyright 2016 The Chromium Embedded Framework Authors. Portions copyright
-# 2014 the Chromium Authors. All rights reserved. Use of this source code is
-# governed by a BSD-style license that can be found in the LICENSE file.
-#
-# This is a copy of src/chrome/chrome_repack_locales.gni with the necessary
-# modifications to meet CEF's requirements.
-
-import("//build/config/chrome_build.gni")
-import("//build/config/features.gni")
-import("//build/config/ui.gni")
-import("//tools/grit/repack.gni")
-
-# Arguments:
-#
-#   locale
-#       Internal name of locale. e.g. "pt-BR"
-#
-#   output
-#       Output file name.
-#
-#   visibility
-#       Normal meaning.
-template("_repack_one_locale") {
-  locale = invoker.locale
-
-  repack(target_name) {
-    visibility = invoker.visibility
-
-    # Each input pak file should also have a deps line for completeness.
-    # Add associated .h files in the make_pack_header("strings") target.
-    sources = [
-      "${root_gen_dir}/cef/cef_strings_${locale}.pak",
-      "${root_gen_dir}/chrome/chromium_strings_${locale}.pak",
-      "${root_gen_dir}/chrome/generated_resources_${locale}.pak",
-      "${root_gen_dir}/chrome/locale_settings_${locale}.pak",
-      "${root_gen_dir}/chrome/platform_locale_settings_${locale}.pak",
-      "${root_gen_dir}/components/strings/components_locale_settings_${locale}.pak",
-      "${root_gen_dir}/components/strings/components_strings_${locale}.pak",
-      "${root_gen_dir}/extensions/strings/extensions_strings_${locale}.pak",
-      "${root_gen_dir}/services/strings/services_strings_${locale}.pak",
-      "${root_gen_dir}/third_party/blink/public/strings/blink_strings_${locale}.pak",
-      "${root_gen_dir}/ui/strings/app_locale_settings_${locale}.pak",
-      "${root_gen_dir}/ui/strings/ui_strings_${locale}.pak",
-    ]
-
-    # Use public_deps so that generated grit headers are discoverable from
-    # the libcef_static target. Grit deps that generate .cc files must be
-    # listed both here and in the libcef_static target.
-    public_deps = [
-      ":cef_strings",
-      "//chrome/app:chromium_strings",
-      "//chrome/app:generated_resources",
-      "//chrome/app/resources:locale_settings",
-      "//chrome/app/resources:platform_locale_settings",
-      "//components/strings:components_locale_settings",
-      "//components/strings:components_strings",
-      "//extensions/strings",
-      "//services/strings",
-      "//third_party/blink/public/strings",
-      "//ui/strings:app_locale_settings",
-      "//ui/strings:ui_strings",
-    ]
-
-    output = invoker.output
-  }
-}
-
-# Creates an action to call the repack_locales script.
-#
-# The GYP version generates the locales in the "gen" directory and then copies
-# it to the root build directory. This isn't easy to express in a GN copy
-# rule since the files on Mac have a complex structure. So we generate the
-# files into the final place and skip the "gen" directory.
-#
-# This template uses GN's looping constructs to avoid the complex call to
-# chrome/tools/build/repack_locales.py which wraps the repack commands in the
-# GYP build.
-#
-# Arguments
-#
-#   input_locales
-#       List of locale names to use as inputs.
-#
-#   output_locales
-#       A list containing the corresponding output names for each of the
-#       input names. Mac uses different names in some cases.
-#
-#   visibility
-template("cef_repack_locales") {
-  # This is the name of the group below that will collect all the invidual
-  # locale targets. External targets will depend on this.
-  group_target_name = target_name
-
-  # GN's subscript is too stupid to do invoker.output_locales[foo] so we need
-  # to make a copy and do output_locales[foo].
-  output_locales = invoker.output_locales
-
-  # Collects all targets the loop generates.
-  locale_targets = []
-
-  # This loop iterates over the input locales and also keeps a counter so it
-  # can simultaneously iterate over the output locales (using GN's very
-  # limited looping capabilities).
-  current_index = 0
-  foreach(input_locale, invoker.input_locales) {
-    output_locale = output_locales[current_index]
-
-    # Compute the name of the target for the current file. Save it for the deps.
-    current_name = "${target_name}_${input_locale}"
-    locale_targets += [ ":$current_name" ]
-
-    _repack_one_locale(current_name) {
-      visibility = [ ":$group_target_name" ]
-      locale = input_locale
-
-      # Compute the output name. Mac uses a different location.
-      if (is_mac || is_ios) {
-        output = "${root_gen_dir}/repack/locales/${output_locale}.pak"
-      } else {
-        output = "${root_out_dir}/locales/${output_locale}.pak"
-      }
-    }
-
-    current_index = current_index + 1
-  }
-
-  # The group that external targets depend on which collects all deps.
-  group(group_target_name) {
-    forward_variables_from(invoker, [ "visibility" ])
-    public_deps = locale_targets
-  }
-}
diff --git a/src/cmake/cef_macros.cmake.in b/src/cmake/cef_macros.cmake.in
index 1b667e1..f357d06 100644
--- a/src/cmake/cef_macros.cmake.in
+++ b/src/cmake/cef_macros.cmake.in
@@ -25,7 +25,7 @@
 
   message(STATUS "Binary distribution root:     ${_CEF_ROOT}")
 
-  if(OS_MACOSX)
+  if(OS_MAC)
     message(STATUS "Base SDK:                     ${CMAKE_OSX_SYSROOT}")
     message(STATUS "Target SDK:                   ${CEF_TARGET_SDK}")
   endif()
@@ -75,8 +75,8 @@
   if(OS_WINDOWS AND ${name_of_list}_WINDOWS)
     list(APPEND ${name_of_list} ${${name_of_list}_WINDOWS})
   endif()
-  if(OS_MACOSX AND ${name_of_list}_MACOSX)
-    list(APPEND ${name_of_list} ${${name_of_list}_MACOSX})
+  if(OS_MAC AND ${name_of_list}_MAC)
+    list(APPEND ${name_of_list} ${${name_of_list}_MAC})
   endif()
 endmacro()
 
@@ -95,43 +95,64 @@
   endif()
 endmacro()
 
-# Copy a list of files from one directory to another. Relative files paths are maintained.
-# The path component of the source |file_list| will be removed.
+# Copy a list of files from one directory to another. Relative file paths are maintained.
 macro(COPY_FILES target file_list source_dir target_dir)
   foreach(FILENAME ${file_list})
     set(source_file ${source_dir}/${FILENAME})
+
+    # Remove the target file path component.
     get_filename_component(target_name ${FILENAME} NAME)
     set(target_file ${target_dir}/${target_name})
 
-    string(FIND ${source_file} "$<CONFIGURATION>" _pos)
-    if(NOT ${_pos} EQUAL -1)
-      # Must test with an actual configuration directory.
-      string(REPLACE "$<CONFIGURATION>" "Release" existing_source_file ${source_file})
-      if(NOT EXISTS ${existing_source_file})
-        string(REPLACE "$<CONFIGURATION>" "Debug" existing_source_file ${source_file})
-      endif()
-    else()
-      set(existing_source_file ${source_file})
-    endif()
-
-    if(IS_DIRECTORY ${existing_source_file})
-      add_custom_command(
-        TARGET ${target}
-        POST_BUILD
-        COMMAND ${CMAKE_COMMAND} -E copy_directory "${source_file}" "${target_file}"
-        VERBATIM
-        )
-    else()
-      add_custom_command(
-        TARGET ${target}
-        POST_BUILD
-        COMMAND ${CMAKE_COMMAND} -E copy_if_different "${source_file}" "${target_file}"
-        VERBATIM
-        )
-    endif()
+    COPY_SINGLE_FILE(${target} ${source_file} ${target_file})
   endforeach()
 endmacro()
 
+# Copy a list of files from one directory to another. Relative file paths are maintained.
+macro(COPY_RESOURCES target file_list prefix_list source_dir target_dir)
+  foreach(FILENAME ${file_list})
+    set(source_file ${source_dir}/${FILENAME})
+
+    # Remove one or more prefixes from the source paths.
+    set(TARGET_FILENAME "${FILENAME}")
+    foreach(PREFIX ${prefix_list})
+      string(REGEX REPLACE "^.*${PREFIX}" "" TARGET_FILENAME ${TARGET_FILENAME})
+    endforeach()
+    set(target_file ${target_dir}/${TARGET_FILENAME})
+
+    COPY_SINGLE_FILE(${target} ${source_file} ${target_file})
+  endforeach()
+endmacro()
+
+macro(COPY_SINGLE_FILE target source_file target_file)
+  string(FIND ${source_file} "$<CONFIGURATION>" _pos)
+  if(NOT ${_pos} EQUAL -1)
+    # Must test with an actual configuration directory.
+    string(REPLACE "$<CONFIGURATION>" "Release" existing_source_file ${source_file})
+    if(NOT EXISTS ${existing_source_file})
+      string(REPLACE "$<CONFIGURATION>" "Debug" existing_source_file ${source_file})
+    endif()
+  else()
+    set(existing_source_file ${source_file})
+  endif()
+
+  if(IS_DIRECTORY ${existing_source_file})
+    add_custom_command(
+      TARGET ${target}
+      POST_BUILD
+      COMMAND ${CMAKE_COMMAND} -E copy_directory "${source_file}" "${target_file}"
+      VERBATIM
+      )
+  else()
+    add_custom_command(
+      TARGET ${target}
+      POST_BUILD
+      COMMAND ${CMAKE_COMMAND} -E copy_if_different "${source_file}" "${target_file}"
+      VERBATIM
+      )
+  endif()
+endmacro()
+
 
 #
 # Linux macros.
@@ -184,10 +205,10 @@
 # Mac OS X macros.
 #
 
-if(OS_MACOSX)
+if(OS_MAC)
 
 # Manually process and copy over resource files.
-macro(COPY_MACOSX_RESOURCES resource_list prefix_list target source_dir app_path)
+macro(COPY_MAC_RESOURCES resource_list prefix_list target source_dir app_path)
   foreach(FILENAME ${resource_list})
     # Remove one or more prefixes from the source paths.
     set(TARGET_FILENAME "${FILENAME}")
@@ -229,7 +250,7 @@
   endforeach()
 endmacro()
 
-endif(OS_MACOSX)
+endif(OS_MAC)
 
 
 #
@@ -298,7 +319,7 @@
     set_property(TARGET ${target} PROPERTY LINK_FLAGS_RELEASE ${_flags_str})
   endif()
 
-  if(OS_MACOSX)
+  if(OS_MAC)
     # Set Xcode target properties.
     set_target_properties(${target} PROPERTIES
       XCODE_ATTRIBUTE_ALWAYS_SEARCH_USER_PATHS                    NO
diff --git a/src/cmake/cef_variables.cmake.in b/src/cmake/cef_variables.cmake.in
index 4b3b58d..e8c0ada 100644
--- a/src/cmake/cef_variables.cmake.in
+++ b/src/cmake/cef_variables.cmake.in
@@ -14,7 +14,8 @@
 
 # Determine the platform.
 if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
-  set(OS_MACOSX 1)
+  set(OS_MAC 1)
+  set(OS_MACOSX 1)  # For backwards compatibility.
   set(OS_POSIX 1)
 elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
   set(OS_LINUX 1)
@@ -25,16 +26,14 @@
 
 # Determine the project architecture.
 if(NOT DEFINED PROJECT_ARCH)
-  if(CMAKE_SIZEOF_VOID_P MATCHES 8)
+  if(("${CMAKE_HOST_SYSTEM_PROCESSOR}" STREQUAL "arm64") OR
+     ("${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}" STREQUAL "ARM64"))
+    set(PROJECT_ARCH "arm64")
+  elseif(CMAKE_SIZEOF_VOID_P MATCHES 8)
     set(PROJECT_ARCH "x86_64")
   else()
     set(PROJECT_ARCH "x86")
   endif()
-
-  if(OS_MACOSX)
-    # PROJECT_ARCH should be specified on Mac OS X.
-    message(WARNING "No PROJECT_ARCH value specified, using ${PROJECT_ARCH}")
-  endif()
 endif()
 
 if(${CMAKE_GENERATOR} STREQUAL "Ninja")
@@ -92,6 +91,7 @@
     -Wno-unused-parameter           # Don't warn about unused parameters
     -Wno-error=comment              # Don't warn about code in comments
     -Wno-comment                    # Don't warn about code in comments
+    -Wno-deprecated-declarations    # Don't warn about using deprecated methods
     )
   list(APPEND CEF_C_COMPILER_FLAGS
     -std=c99                        # Use the C99 language standard
@@ -101,7 +101,7 @@
     -fno-rtti                       # Disable real-time type information
     -fno-threadsafe-statics         # Don't generate thread-safe statics
     -fvisibility-inlines-hidden     # Give hidden visibility to inlined class member functions
-    -std=gnu++11                    # Use the C++11 language standard including GNU extensions
+    -std=c++17                      # Use the C++17 language standard
     -Wsign-compare                  # Warn about mixed signed/unsigned type comparisons
     )
   list(APPEND CEF_COMPILER_FLAGS_DEBUG
@@ -218,18 +218,18 @@
     libcef.so
     libEGL.so
     libGLESv2.so
+    libvk_swiftshader.so
+    libvulkan.so.1
     snapshot_blob.bin
     v8_context_snapshot.bin
-    swiftshader
+    vk_swiftshader_icd.json
     )
 
   # List of CEF resource files.
   set(CEF_RESOURCE_FILES
-    cef.pak
-    cef_100_percent.pak
-    cef_200_percent.pak
-    cef_extensions.pak
-    devtools_resources.pak
+    chrome_100_percent.pak
+    chrome_200_percent.pak
+    resources.pak
     icudtl.dat
     locales
     )
@@ -246,7 +246,7 @@
 # Mac OS X configuration.
 #
 
-if(OS_MACOSX)
+if(OS_MAC)
   # Platform-specific compiler/linker flags.
   # See also Xcode target properties in cef_macros.cmake.
   set(CEF_LIBTYPE SHARED)
@@ -272,7 +272,7 @@
     -fno-threadsafe-statics         # Don't generate thread-safe statics
     -fobjc-call-cxx-cdtors          # Call the constructor/destructor of C++ instance variables in ObjC objects
     -fvisibility-inlines-hidden     # Give hidden visibility to inlined class member functions
-    -std=gnu++11                    # Use the C++11 language standard including GNU extensions
+    -std=c++17                      # Use the C++17 language standard
     -Wno-narrowing                  # Don't warn about type narrowing
     -Wsign-compare                  # Warn about mixed signed/unsigned type comparisons
     )
@@ -310,7 +310,7 @@
 
   # Find the newest available base SDK.
   execute_process(COMMAND xcode-select --print-path OUTPUT_VARIABLE XCODE_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
-  foreach(OS_VERSION 10.11 10.10 10.9)
+  foreach(OS_VERSION 10.15 10.14 10.13)
     set(SDK "${XCODE_PATH}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX${OS_VERSION}.sdk")
     if(NOT "${CMAKE_OSX_SYSROOT}" AND EXISTS "${SDK}" AND IS_DIRECTORY "${SDK}")
       set(CMAKE_OSX_SYSROOT ${SDK})
@@ -318,7 +318,7 @@
   endforeach()
 
   # Target SDK.
-  set(CEF_TARGET_SDK               "10.9")
+  set(CEF_TARGET_SDK               "10.13")
   list(APPEND CEF_COMPILER_FLAGS
     -mmacosx-version-min=${CEF_TARGET_SDK}
   )
@@ -327,6 +327,8 @@
   # Target architecture.
   if(PROJECT_ARCH STREQUAL "x86_64")
     set(CMAKE_OSX_ARCHITECTURES "x86_64")
+  elseif(PROJECT_ARCH STREQUAL "arm64")
+    set(CMAKE_OSX_ARCHITECTURES "arm64")
   else()
     set(CMAKE_OSX_ARCHITECTURES "i386")
   endif()
@@ -344,6 +346,10 @@
       CEF_USE_SANDBOX   # Used by apps to test if the sandbox is enabled
       )
 
+    list(APPEND CEF_STANDARD_LIBS
+      -lsandbox
+      )
+
     # CEF sandbox library paths.
     set(CEF_SANDBOX_LIB_DEBUG "${CEF_BINARY_DIR_DEBUG}/cef_sandbox.a")
     set(CEF_SANDBOX_LIB_RELEASE "${CEF_BINARY_DIR_RELEASE}/cef_sandbox.a")
@@ -353,6 +359,7 @@
   # Format is "<name suffix>:<target suffix>:<plist suffix>".
   set(CEF_HELPER_APP_SUFFIXES
     "::"
+    " (Alerts):_alerts:.alerts"
     " (GPU):_gpu:.gpu"
     " (Plugin):_plugin:.plugin"
     " (Renderer):_renderer:.renderer"
@@ -375,25 +382,8 @@
 
   if(USE_SANDBOX)
     # Check if the current MSVC version is compatible with the cef_sandbox.lib
-    # static library. For a list of all version numbers see
-    # https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B#Internal_version_numbering
-    list(APPEND supported_msvc_versions
-      1900  # VS2015 and updates 1, 2, & 3
-      1910  # VS2017 version 15.1 & 15.2
-      1911  # VS2017 version 15.3 & 15.4
-      1912  # VS2017 version 15.5
-      1913  # VS2017 version 15.6
-      1914  # VS2017 version 15.7
-      1915  # VS2017 version 15.8
-      1916  # VS2017 version 15.9
-      1920  # VS2019 version 16.0
-      1921  # VS2019 version 16.1
-      1922  # VS2019 version 16.2
-      1923  # VS2019 version 16.3
-      1924  # VS2019 version 16.4
-      )
-    list(FIND supported_msvc_versions ${MSVC_VERSION} _index)
-    if (${_index} EQUAL -1)
+    # static library. We require VS2015 or newer.
+    if(MSVC_VERSION LESS 1900)
       message(WARNING "CEF sandbox is not compatible with the current MSVC version (${MSVC_VERSION})")
       set(USE_SANDBOX OFF)
     endif()
@@ -420,6 +410,7 @@
     /wd4100       # Ignore "unreferenced formal parameter" warning
     /wd4127       # Ignore "conditional expression is constant" warning
     /wd4244       # Ignore "conversion possible loss of data" warning
+    /wd4324       # Ignore "structure was padded due to alignment specifier" warning
     /wd4481       # Ignore "nonstandard extension used: override" warning
     /wd4512       # Ignore "assignment operator could not be generated" warning
     /wd4701       # Ignore "potentially uninitialized local variable" warning
@@ -436,17 +427,75 @@
     /Ob2          # Inline any suitable function
     /GF           # Enable string pooling
     )
+  list(APPEND CEF_CXX_COMPILER_FLAGS
+    /std:c++17    # Use the C++17 language standard
+    )
   list(APPEND CEF_LINKER_FLAGS_DEBUG
     /DEBUG        # Generate debug information
     )
   list(APPEND CEF_EXE_LINKER_FLAGS
     /MANIFEST:NO        # No default manifest (see ADD_WINDOWS_MANIFEST macro usage)
     /LARGEADDRESSAWARE  # Allow 32-bit processes to access 3GB of RAM
+
+    # Delayload most libraries as the dlls are simply not required at startup (or
+    # at all, depending on the process type). Some dlls open handles when they are
+    # loaded, and we may not want them to be loaded in renderers or other sandboxed
+    # processes. Conversely, some dlls must be loaded before sandbox lockdown. In
+    # unsandboxed processes they will load when first needed. The linker will
+    # automatically ignore anything which is not linked to the binary at all (it is
+    # harmless to have an unmatched /delayload). This list should be kept in sync
+    # with Chromium's "delayloads" target from the //build/config/win/BUILD.gn file.
+    /DELAYLOAD:api-ms-win-core-winrt-error-l1-1-0.dll
+    /DELAYLOAD:api-ms-win-core-winrt-l1-1-0.dll
+    /DELAYLOAD:api-ms-win-core-winrt-string-l1-1-0.dll
+    /DELAYLOAD:advapi32.dll
+    /DELAYLOAD:comctl32.dll
+    /DELAYLOAD:comdlg32.dll
+    /DELAYLOAD:credui.dll
+    /DELAYLOAD:cryptui.dll
+    /DELAYLOAD:d3d11.dll
+    /DELAYLOAD:d3d9.dll
+    /DELAYLOAD:dwmapi.dll
+    /DELAYLOAD:dxgi.dll
+    /DELAYLOAD:dxva2.dll
+    /DELAYLOAD:esent.dll
+    /DELAYLOAD:gdi32.dll
+    /DELAYLOAD:hid.dll
+    /DELAYLOAD:imagehlp.dll
+    /DELAYLOAD:imm32.dll
+    /DELAYLOAD:msi.dll
+    /DELAYLOAD:netapi32.dll
+    /DELAYLOAD:ncrypt.dll
+    /DELAYLOAD:ole32.dll
+    /DELAYLOAD:oleacc.dll
+    /DELAYLOAD:propsys.dll
+    /DELAYLOAD:psapi.dll
+    /DELAYLOAD:rpcrt4.dll
+    /DELAYLOAD:rstrtmgr.dll
+    /DELAYLOAD:setupapi.dll
+    /DELAYLOAD:shell32.dll
+    /DELAYLOAD:shlwapi.dll
+    /DELAYLOAD:uiautomationcore.dll
+    /DELAYLOAD:urlmon.dll
+    /DELAYLOAD:user32.dll
+    /DELAYLOAD:usp10.dll
+    /DELAYLOAD:uxtheme.dll
+    /DELAYLOAD:wer.dll
+    /DELAYLOAD:wevtapi.dll
+    /DELAYLOAD:wininet.dll
+    /DELAYLOAD:winusb.dll
+    /DELAYLOAD:wsock32.dll
+    /DELAYLOAD:wtsapi32.dll
     )
   list(APPEND CEF_COMPILER_DEFINES
     WIN32 _WIN32 _WINDOWS             # Windows platform
     UNICODE _UNICODE                  # Unicode build
-    WINVER=0x0601 _WIN32_WINNT=0x601  # Targeting Windows 7
+    # Targeting Windows 10. We can't say `=_WIN32_WINNT_WIN10` here because
+    # some files do `#if WINVER < 0x0600` without including windows.h before,
+    # and then _WIN32_WINNT_WIN10 isn't yet known to be 0x0A00.
+    WINVER=0x0A00
+    _WIN32_WINNT=0x0A00
+    NTDDI_VERSION=NTDDI_WIN10_FE
     NOMINMAX                          # Use the standard's templated min/max
     WIN32_LEAN_AND_MEAN               # Exclude less common API declarations
     _HAS_EXCEPTIONS=0                 # Disable exceptions
@@ -455,9 +504,27 @@
     NDEBUG _NDEBUG                    # Not a debug build
     )
 
+  if(PROJECT_ARCH STREQUAL "x86")
+    # Set the initial stack size to 0.5MiB, instead of the 1.5MiB minimum
+    # needed by CEF's main thread. This saves significant memory on threads
+    # (like those in the Windows thread pool, and others) whose stack size we
+    # can only control through this setting. The main thread (in 32-bit builds
+    # only) uses fibers to switch to a 4MiB stack at runtime via
+    # CefRunWinMainWithPreferredStackSize().
+    list(APPEND CEF_EXE_LINKER_FLAGS
+      /STACK:0x80000
+      )
+  else()
+    # Increase the initial stack size to 8MiB from the default 1MiB.
+    list(APPEND CEF_EXE_LINKER_FLAGS
+      /STACK:0x800000
+      )
+  endif()
+
   # Standard libraries.
   set(CEF_STANDARD_LIBS
     comctl32.lib
+    gdi32.lib
     rpcrt4.lib
     shlwapi.lib
     ws2_32.lib
@@ -482,16 +549,16 @@
     libGLESv2.dll
     snapshot_blob.bin
     v8_context_snapshot.bin
-    swiftshader
+    vk_swiftshader.dll
+    vk_swiftshader_icd.json
+    vulkan-1.dll
     )
 
   # List of CEF resource files.
   set(CEF_RESOURCE_FILES
-    cef.pak
-    cef_100_percent.pak
-    cef_200_percent.pak
-    cef_extensions.pak
-    devtools_resources.pak
+    chrome_100_percent.pak
+    chrome_200_percent.pak
+    resources.pak
     icudtl.dat
     locales
     )
@@ -501,17 +568,27 @@
       PSAPI_VERSION=1   # Required by cef_sandbox.lib
       CEF_USE_SANDBOX   # Used by apps to test if the sandbox is enabled
       )
+    list(APPEND CEF_COMPILER_DEFINES_DEBUG
+      _HAS_ITERATOR_DEBUGGING=0   # Disable iterator debugging
+      )
 
     # Libraries required by cef_sandbox.lib.
     set(CEF_SANDBOX_STANDARD_LIBS
+      Advapi32.lib
       dbghelp.lib
       Delayimp.lib
+      ntdll.lib
+      OleAut32.lib
       PowrProf.lib
       Propsys.lib
       psapi.lib
       SetupAPI.lib
+      Shell32.lib
+      Shcore.lib
+      Userenv.lib
       version.lib
       wbemuuid.lib
+      WindowsApp.lib
       winmm.lib
       )
 
diff --git a/src/include/base/cef_atomic_flag.h b/src/include/base/cef_atomic_flag.h
new file mode 100644
index 0000000..3a2fdbc
--- /dev/null
+++ b/src/include/base/cef_atomic_flag.h
@@ -0,0 +1,97 @@
+// 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_ATOMIC_FLAG_H_
+#define CEF_INCLUDE_BASE_CEF_ATOMIC_FLAG_H_
+#pragma once
+
+#if defined(USING_CHROMIUM_INCLUDES)
+// When building CEF include the Chromium header directly.
+#include "base/synchronization/atomic_flag.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 <stdint.h>
+
+#include <atomic>
+
+#include "include/base/cef_thread_checker.h"
+
+namespace base {
+
+///
+/// A flag that can safely be set from one thread and read from other threads.
+///
+/// This class IS NOT intended for synchronization between threads.
+///
+class AtomicFlag {
+ public:
+  AtomicFlag();
+
+  AtomicFlag(const AtomicFlag&) = delete;
+  AtomicFlag& operator=(const AtomicFlag&) = delete;
+
+  ~AtomicFlag();
+
+  ///
+  /// Set the flag. Must always be called from the same thread.
+  ///
+  void Set();
+
+  ///
+  /// Returns true iff the flag was set. If this returns true, the current
+  /// thread is guaranteed to be synchronized with all memory operations on the
+  /// thread which invoked Set() up until at least the first call to Set() on
+  /// it.
+  ///
+  bool IsSet() const {
+    // Inline here: this has a measurable performance impact on base::WeakPtr.
+    return flag_.load(std::memory_order_acquire) != 0;
+  }
+
+  ///
+  /// Resets the flag. Be careful when using this: callers might not expect
+  /// IsSet() to return false after returning true once.
+  ///
+  void UnsafeResetForTesting();
+
+ private:
+  std::atomic<uint_fast8_t> flag_{0};
+  base::ThreadChecker set_thread_checker_;
+};
+
+}  // namespace base
+
+#endif  // !USING_CHROMIUM_INCLUDES
+
+#endif  // CEF_INCLUDE_BASE_CEF_ATOMIC_FLAG_H_
diff --git a/src/include/base/cef_atomic_ref_count.h b/src/include/base/cef_atomic_ref_count.h
index 4d67779..38e8f93 100644
--- a/src/include/base/cef_atomic_ref_count.h
+++ b/src/include/base/cef_atomic_ref_count.h
@@ -43,120 +43,78 @@
 // 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<AtomicRefCount*>(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<AtomicRefCount*>(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<AtomicRefCount*>(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<AtomicRefCount*>(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
+#include <atomic>
 
 namespace base {
 
-typedef subtle::Atomic32 AtomicRefCount;
+class AtomicRefCount {
+ public:
+  constexpr AtomicRefCount() : ref_count_(0) {}
+  explicit constexpr AtomicRefCount(int initial_value)
+      : ref_count_(initial_value) {}
 
-// Increment a reference count by "increment", which must exceed 0.
-inline void AtomicRefCountIncN(volatile AtomicRefCount* ptr,
-                               AtomicRefCount increment) {
-  subtle::NoBarrier_AtomicIncrement(ptr, increment);
-}
+  ///
+  /// Increment a reference count.
+  /// Returns the previous value of the count.
+  ///
+  int Increment() { return Increment(1); }
 
-// 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);
+  ///
+  /// Increment a reference count by "increment", which must exceed 0.
+  /// Returns the previous value of the count.
+  ///
+  int Increment(int increment) {
+    return ref_count_.fetch_add(increment, std::memory_order_relaxed);
   }
-  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);
+  ///
+  /// Decrement a reference count, 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.
+  ///
+  bool Decrement() {
+    // TODO(jbroman): Technically this doesn't need to be an acquire operation
+    // unless the result is 1 (i.e., the ref count did indeed reach zero).
+    // However, there are toolchain issues that make that not work as well at
+    // present (notably TSAN doesn't like it).
+    return ref_count_.fetch_sub(1, std::memory_order_acq_rel) != 1;
   }
-  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 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.
+  ///
+  bool IsOne() const { return ref_count_.load(std::memory_order_acquire) == 1; }
+
+  ///
+  /// 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.
+  ///
+  bool IsZero() const {
+    return ref_count_.load(std::memory_order_acquire) == 0;
   }
-  return res;
-}
+
+  ///
+  /// Returns the current reference count (with no barriers). This is subtle,
+  /// and should be used only for debugging.
+  ///
+  int SubtleRefCountForDebug() const {
+    return ref_count_.load(std::memory_order_relaxed);
+  }
+
+ private:
+  std::atomic_int ref_count_;
+};
 
 }  // namespace base
 
diff --git a/src/include/base/cef_atomicops.h b/src/include/base/cef_atomicops.h
deleted file mode 100644
index a5b6459..0000000
--- a/src/include/base/cef_atomicops.h
+++ /dev/null
@@ -1,203 +0,0 @@
-// 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.
-
-// For atomic operations on reference counts, see cef_atomic_ref_count.h.
-
-// The routines exported by this module are subtle.  If you use them, even if
-// you get the code right, it will depend on careful reasoning about atomicity
-// and memory ordering; it will be less readable, and harder to maintain.  If
-// you plan to use these routines, you should have a good reason, such as solid
-// evidence that performance would otherwise suffer, or there being no
-// alternative.  You should assume only properties explicitly guaranteed by the
-// specifications in this file.  You are almost certainly _not_ writing code
-// just for the x86; if you assume x86 semantics, x86 hardware bugs and
-// implementations on other archtectures will cause your code to break.  If you
-// do not know what you are doing, avoid these routines, and use a Mutex.
-//
-// It is incorrect to make direct assignments to/from an atomic variable.
-// You should use one of the Load or Store routines.  The NoBarrier
-// versions are provided when no barriers are needed:
-//   NoBarrier_Store()
-//   NoBarrier_Load()
-// Although there are currently no compiler enforcement, you are encouraged
-// to use these.
-//
-
-#ifndef CEF_INCLUDE_BASE_CEF_ATOMICOPS_H_
-#define CEF_INCLUDE_BASE_CEF_ATOMICOPS_H_
-#pragma once
-
-#if defined(BASE_ATOMICOPS_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/atomicops.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 <stdint.h>
-
-#include "include/base/cef_build.h"
-
-#if defined(OS_WIN) && defined(ARCH_CPU_64_BITS)
-// windows.h #defines this (only on x64). This causes problems because the
-// public API also uses MemoryBarrier at the public name for this fence. So, on
-// X64, undef it, and call its documented
-// (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684208.aspx)
-// implementation directly.
-#undef MemoryBarrier
-#endif
-
-namespace base {
-namespace subtle {
-
-typedef int32_t Atomic32;
-#ifdef ARCH_CPU_64_BITS
-// We need to be able to go between Atomic64 and AtomicWord implicitly.  This
-// means Atomic64 and AtomicWord should be the same type on 64-bit.
-#if defined(__ILP32__) || defined(OS_NACL)
-// NaCl's intptr_t is not actually 64-bits on 64-bit!
-// http://code.google.com/p/nativeclient/issues/detail?id=1162
-typedef int64_t Atomic64;
-#else
-typedef intptr_t Atomic64;
-#endif
-#endif
-
-// Use AtomicWord for a machine-sized pointer.  It will use the Atomic32 or
-// Atomic64 routines below, depending on your architecture.
-typedef intptr_t AtomicWord;
-
-// Atomically execute:
-//      result = *ptr;
-//      if (*ptr == old_value)
-//        *ptr = new_value;
-//      return result;
-//
-// I.e., replace "*ptr" with "new_value" if "*ptr" used to be "old_value".
-// Always return the old value of "*ptr"
-//
-// This routine implies no memory barriers.
-Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
-                                  Atomic32 old_value,
-                                  Atomic32 new_value);
-
-// Atomically store new_value into *ptr, returning the previous value held in
-// *ptr.  This routine implies no memory barriers.
-Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, Atomic32 new_value);
-
-// Atomically increment *ptr by "increment".  Returns the new value of
-// *ptr with the increment applied.  This routine implies no memory barriers.
-Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment);
-
-Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment);
-
-// These following lower-level operations are typically useful only to people
-// implementing higher-level synchronization operations like spinlocks,
-// mutexes, and condition-variables.  They combine CompareAndSwap(), a load, or
-// a store with appropriate memory-ordering instructions.  "Acquire" operations
-// ensure that no later memory access can be reordered ahead of the operation.
-// "Release" operations ensure that no previous memory access can be reordered
-// after the operation.  "Barrier" operations have both "Acquire" and "Release"
-// semantics.   A MemoryBarrier() has "Barrier" semantics, but does no memory
-// access.
-Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
-                                Atomic32 old_value,
-                                Atomic32 new_value);
-Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
-                                Atomic32 old_value,
-                                Atomic32 new_value);
-
-void MemoryBarrier();
-void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value);
-void Acquire_Store(volatile Atomic32* ptr, Atomic32 value);
-void Release_Store(volatile Atomic32* ptr, Atomic32 value);
-
-Atomic32 NoBarrier_Load(volatile const Atomic32* ptr);
-Atomic32 Acquire_Load(volatile const Atomic32* ptr);
-Atomic32 Release_Load(volatile const Atomic32* ptr);
-
-// 64-bit atomic operations (only available on 64-bit processors).
-#ifdef ARCH_CPU_64_BITS
-Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr,
-                                  Atomic64 old_value,
-                                  Atomic64 new_value);
-Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, Atomic64 new_value);
-Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment);
-Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment);
-
-Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr,
-                                Atomic64 old_value,
-                                Atomic64 new_value);
-Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr,
-                                Atomic64 old_value,
-                                Atomic64 new_value);
-void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value);
-void Acquire_Store(volatile Atomic64* ptr, Atomic64 value);
-void Release_Store(volatile Atomic64* ptr, Atomic64 value);
-Atomic64 NoBarrier_Load(volatile const Atomic64* ptr);
-Atomic64 Acquire_Load(volatile const Atomic64* ptr);
-Atomic64 Release_Load(volatile const Atomic64* ptr);
-#endif  // ARCH_CPU_64_BITS
-
-}  // namespace subtle
-}  // namespace base
-
-// Include our platform specific implementation.
-#if defined(OS_WIN) && defined(COMPILER_MSVC) && defined(ARCH_CPU_X86_FAMILY)
-#include "include/base/internal/cef_atomicops_x86_msvc.h"
-#elif defined(OS_WIN) && (defined(__ARM_ARCH_ISA_A64) || defined(_M_ARM64))
-#include "include/base/internal/cef_atomicops_arm64_msvc.h"
-#elif defined(OS_MACOSX)
-#include "include/base/internal/cef_atomicops_mac.h"
-#elif defined(COMPILER_GCC) && defined(ARCH_CPU_X86_FAMILY)
-#include "include/base/internal/cef_atomicops_x86_gcc.h"
-#elif defined(COMPILER_GCC) && defined(__ARM_ARCH_ISA_A64)
-#include "include/base/internal/cef_atomicops_arm64_gcc.h"
-#elif defined(COMPILER_GCC) && defined(__ARM_ARCH)
-#include "include/base/internal/cef_atomicops_arm_gcc.h"
-#else
-#error "Atomic operations are not supported on your platform"
-#endif
-
-// On some platforms we need additional declarations to make
-// AtomicWord compatible with our other Atomic* types.
-#if defined(OS_MACOSX) || defined(OS_OPENBSD)
-#include "include/base/internal/cef_atomicops_atomicword_compat.h"
-#endif
-
-#endif  // !USING_CHROMIUM_INCLUDES
-
-#endif  // CEF_INCLUDE_BASE_CEF_ATOMICOPS_H_
diff --git a/src/include/base/cef_auto_reset.h b/src/include/base/cef_auto_reset.h
new file mode 100644
index 0000000..be3a05d
--- /dev/null
+++ b/src/include/base/cef_auto_reset.h
@@ -0,0 +1,90 @@
+// 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.
+
+// base::AutoReset<> is useful for setting a variable to a new value only within
+// a particular scope. An base::AutoReset<> object resets a variable to its
+// original value upon destruction, making it an alternative to writing
+// "var = false;" or "var = old_val;" at all of a block's exit points.
+//
+// This should be obvious, but note that an base::AutoReset<> instance should
+// have a shorter lifetime than its scoped_variable, to prevent invalid memory
+// writes when the base::AutoReset<> object is destroyed.
+
+#ifndef CEF_INCLUDE_BASE_CEF_AUTO_RESET_H_
+#define CEF_INCLUDE_BASE_CEF_AUTO_RESET_H_
+#pragma once
+
+#if defined(USING_CHROMIUM_INCLUDES)
+// When building CEF include the Chromium header directly.
+#include "base/auto_reset.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 <utility>
+
+namespace base {
+
+template <typename T>
+class AutoReset {
+ public:
+  template <typename U>
+  AutoReset(T* scoped_variable, U&& new_value)
+      : scoped_variable_(scoped_variable),
+        original_value_(
+            std::exchange(*scoped_variable_, std::forward<U>(new_value))) {}
+
+  AutoReset(AutoReset&& other)
+      : scoped_variable_(std::exchange(other.scoped_variable_, nullptr)),
+        original_value_(std::move(other.original_value_)) {}
+
+  AutoReset& operator=(AutoReset&& rhs) {
+    scoped_variable_ = std::exchange(rhs.scoped_variable_, nullptr);
+    original_value_ = std::move(rhs.original_value_);
+    return *this;
+  }
+
+  ~AutoReset() {
+    if (scoped_variable_) {
+      *scoped_variable_ = std::move(original_value_);
+    }
+  }
+
+ private:
+  T* scoped_variable_;
+  T original_value_;
+};
+
+}  // namespace base
+
+#endif  // !USING_CHROMIUM_INCLUDES
+
+#endif  // CEF_INCLUDE_BASE_CEF_AUTO_RESET_H_
diff --git a/src/include/base/cef_basictypes.h b/src/include/base/cef_basictypes.h
deleted file mode 100644
index e38f4f7..0000000
--- a/src/include/base/cef_basictypes.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// 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 <limits.h>  // For UINT_MAX
-#include <stddef.h>  // 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
-// <inttypes.h> 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/base/cef_bind.h b/src/include/base/cef_bind.h
index 77c9c55..e879b56 100644
--- a/src/include/base/cef_bind.h
+++ b/src/include/base/cef_bind.h
@@ -28,546 +28,361 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+///
+/// \file
+/// base::BindOnce() and base::BindRepeating() are helpers for creating
+/// base::OnceCallback and base::RepeatingCallback objects respectively.
+///
+/// For a runnable object of n-arity, the base::Bind*() family allows partial
+/// application of the first m arguments. The remaining n - m arguments must be
+/// passed when invoking the callback with Run().
+///
+/// <pre>
+///   // The first argument is bound at callback creation; the remaining
+///   // two must be passed when calling Run() on the callback object.
+///   base::OnceCallback<long(int, long)> cb = base::BindOnce(
+///       [](short x, int y, long z) { return x * y * z; }, 42);
+/// </pre>
+///
+/// When binding to a method, the receiver object must also be specified at
+/// callback creation time. When Run() is invoked, the method will be invoked on
+/// the specified receiver object.
+///
+/// <pre>
+///   class C : public base::RefCounted<C> { void F(); };
+///   auto instance = base::MakeRefCounted<C>();
+///   auto cb = base::BindOnce(&C::F, instance);
+///   std::move(cb).Run();  // Identical to instance->F()
+/// </pre>
+///
+/// See https://chromium.googlesource.com/chromium/src/+/lkgr/docs/callback.md
+/// for the full documentation.
+///
+
+// Implementation notes
+//
+// If you're reading the implementation, before proceeding further, you should
+// read the top comment of base/internal/cef_bind_internal.h for a definition
+// of common terms and concepts.
+
 #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)
+#if defined(USING_CHROMIUM_INCLUDES)
 // When building CEF include the Chromium header directly.
-#include "base/bind.h"
+#include "base/functional/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"
+#include <functional>
+#include <memory>
+#include <type_traits>
+#include <utility>
 
-// -----------------------------------------------------------------------------
-// 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.
+#include "include/base/cef_build.h"
+#include "include/base/cef_compiler_specific.h"
+#include "include/base/internal/cef_bind_internal.h"
+
+#if defined(OS_APPLE) && !HAS_FEATURE(objc_arc)
+#include "include/base/internal/cef_scoped_block_mac.h"
+#endif
 
 namespace base {
 
-template <typename Functor>
-base::Callback<typename cef_internal::BindState<
-    typename cef_internal::FunctorTraits<Functor>::RunnableType,
-    typename cef_internal::FunctorTraits<Functor>::RunType,
-    void()>::UnboundRunType>
-Bind(Functor functor) {
-  // Typedefs for how to store and run the functor.
-  typedef
-      typename cef_internal::FunctorTraits<Functor>::RunnableType RunnableType;
-  typedef typename cef_internal::FunctorTraits<Functor>::RunType RunType;
+///
+/// Bind as OnceCallback.
+///
+template <typename Functor, typename... Args>
+inline OnceCallback<cef_internal::MakeUnboundRunType<Functor, Args...>>
+BindOnce(Functor&& functor, Args&&... args) {
+  static_assert(!cef_internal::IsOnceCallback<std::decay_t<Functor>>() ||
+                    (std::is_rvalue_reference<Functor&&>() &&
+                     !std::is_const<std::remove_reference_t<Functor>>()),
+                "BindOnce requires non-const rvalue for OnceCallback binding."
+                " I.e.: base::BindOnce(std::move(callback)).");
+  static_assert(
+      std::conjunction<cef_internal::AssertBindArgIsNotBasePassed<
+          std::decay_t<Args>>...>::value,
+      "Use std::move() instead of base::Passed() with base::BindOnce()");
 
-  typedef cef_internal::BindState<RunnableType, RunType, void()> BindState;
-
-  return Callback<typename BindState::UnboundRunType>(
-      new BindState(cef_internal::MakeRunnable(functor)));
+  return cef_internal::BindImpl<OnceCallback>(std::forward<Functor>(functor),
+                                              std::forward<Args>(args)...);
 }
 
-template <typename Functor, typename P1>
-base::Callback<typename cef_internal::BindState<
-    typename cef_internal::FunctorTraits<Functor>::RunnableType,
-    typename cef_internal::FunctorTraits<Functor>::RunType,
-    void(typename cef_internal::CallbackParamTraits<P1>::StorageType)>::
-                   UnboundRunType>
-Bind(Functor functor, const P1& p1) {
-  // Typedefs for how to store and run the functor.
-  typedef
-      typename cef_internal::FunctorTraits<Functor>::RunnableType RunnableType;
-  typedef typename cef_internal::FunctorTraits<Functor>::RunType RunType;
+///
+/// Bind as RepeatingCallback.
+///
+template <typename Functor, typename... Args>
+inline RepeatingCallback<cef_internal::MakeUnboundRunType<Functor, Args...>>
+BindRepeating(Functor&& functor, Args&&... args) {
+  static_assert(
+      !cef_internal::IsOnceCallback<std::decay_t<Functor>>(),
+      "BindRepeating cannot bind OnceCallback. Use BindOnce with std::move().");
 
-  // 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<typename RunnableType::RunType>
-      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<typename BoundFunctorTraits::A1Type>::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<RunnableType>::value ||
-                     !cef_internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
-                 p1_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::HasIsMethodTag<RunnableType>::value ||
-                     !is_array<P1>::value,
-                 first_bound_argument_to_method_cannot_be_array);
-  typedef cef_internal::BindState<
-      RunnableType, RunType,
-      void(typename cef_internal::CallbackParamTraits<P1>::StorageType)>
-      BindState;
-
-  return Callback<typename BindState::UnboundRunType>(
-      new BindState(cef_internal::MakeRunnable(functor), p1));
+  return cef_internal::BindImpl<RepeatingCallback>(
+      std::forward<Functor>(functor), std::forward<Args>(args)...);
 }
 
-template <typename Functor, typename P1, typename P2>
-base::Callback<typename cef_internal::BindState<
-    typename cef_internal::FunctorTraits<Functor>::RunnableType,
-    typename cef_internal::FunctorTraits<Functor>::RunType,
-    void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
-         typename cef_internal::CallbackParamTraits<P2>::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<Functor>::RunnableType RunnableType;
-  typedef typename cef_internal::FunctorTraits<Functor>::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<typename RunnableType::RunType>
-      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<typename BoundFunctorTraits::A1Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A2Type>::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<RunnableType>::value ||
-                     !cef_internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
-                 p1_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::HasIsMethodTag<RunnableType>::value ||
-                     !is_array<P1>::value,
-                 first_bound_argument_to_method_cannot_be_array);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
-                 p2_is_refcounted_type_and_needs_scoped_refptr);
-  typedef cef_internal::BindState<
-      RunnableType, RunType,
-      void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
-           typename cef_internal::CallbackParamTraits<P2>::StorageType)>
-      BindState;
-
-  return Callback<typename BindState::UnboundRunType>(
-      new BindState(cef_internal::MakeRunnable(functor), p1, p2));
+///
+/// Special cases for binding to a base::Callback without extra bound arguments.
+/// We CHECK() the validity of callback to guard against null pointers
+/// accidentally ending up in posted tasks, causing hard-to-debug crashes.
+///
+template <typename Signature>
+OnceCallback<Signature> BindOnce(OnceCallback<Signature> callback) {
+  CHECK(callback);
+  return callback;
 }
 
-template <typename Functor, typename P1, typename P2, typename P3>
-base::Callback<typename cef_internal::BindState<
-    typename cef_internal::FunctorTraits<Functor>::RunnableType,
-    typename cef_internal::FunctorTraits<Functor>::RunType,
-    void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
-         typename cef_internal::CallbackParamTraits<P2>::StorageType,
-         typename cef_internal::CallbackParamTraits<P3>::StorageType)>::
-                   UnboundRunType>
-Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3) {
-  // Typedefs for how to store and run the functor.
-  typedef
-      typename cef_internal::FunctorTraits<Functor>::RunnableType RunnableType;
-  typedef typename cef_internal::FunctorTraits<Functor>::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<typename RunnableType::RunType>
-      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<typename BoundFunctorTraits::A1Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A3Type>::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<RunnableType>::value ||
-                     !cef_internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
-                 p1_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::HasIsMethodTag<RunnableType>::value ||
-                     !is_array<P1>::value,
-                 first_bound_argument_to_method_cannot_be_array);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
-                 p2_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P3>::value,
-                 p3_is_refcounted_type_and_needs_scoped_refptr);
-  typedef cef_internal::BindState<
-      RunnableType, RunType,
-      void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
-           typename cef_internal::CallbackParamTraits<P2>::StorageType,
-           typename cef_internal::CallbackParamTraits<P3>::StorageType)>
-      BindState;
-
-  return Callback<typename BindState::UnboundRunType>(
-      new BindState(cef_internal::MakeRunnable(functor), p1, p2, p3));
+template <typename Signature>
+OnceCallback<Signature> BindOnce(RepeatingCallback<Signature> callback) {
+  CHECK(callback);
+  return callback;
 }
 
-template <typename Functor, typename P1, typename P2, typename P3, typename P4>
-base::Callback<typename cef_internal::BindState<
-    typename cef_internal::FunctorTraits<Functor>::RunnableType,
-    typename cef_internal::FunctorTraits<Functor>::RunType,
-    void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
-         typename cef_internal::CallbackParamTraits<P2>::StorageType,
-         typename cef_internal::CallbackParamTraits<P3>::StorageType,
-         typename cef_internal::CallbackParamTraits<P4>::StorageType)>::
-                   UnboundRunType>
-Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
-  // Typedefs for how to store and run the functor.
-  typedef
-      typename cef_internal::FunctorTraits<Functor>::RunnableType RunnableType;
-  typedef typename cef_internal::FunctorTraits<Functor>::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<typename RunnableType::RunType>
-      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<typename BoundFunctorTraits::A1Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A3Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A4Type>::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<RunnableType>::value ||
-                     !cef_internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
-                 p1_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::HasIsMethodTag<RunnableType>::value ||
-                     !is_array<P1>::value,
-                 first_bound_argument_to_method_cannot_be_array);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
-                 p2_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P3>::value,
-                 p3_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P4>::value,
-                 p4_is_refcounted_type_and_needs_scoped_refptr);
-  typedef cef_internal::BindState<
-      RunnableType, RunType,
-      void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
-           typename cef_internal::CallbackParamTraits<P2>::StorageType,
-           typename cef_internal::CallbackParamTraits<P3>::StorageType,
-           typename cef_internal::CallbackParamTraits<P4>::StorageType)>
-      BindState;
-
-  return Callback<typename BindState::UnboundRunType>(
-      new BindState(cef_internal::MakeRunnable(functor), p1, p2, p3, p4));
+template <typename Signature>
+RepeatingCallback<Signature> BindRepeating(
+    RepeatingCallback<Signature> callback) {
+  CHECK(callback);
+  return callback;
 }
 
-template <typename Functor,
-          typename P1,
-          typename P2,
-          typename P3,
-          typename P4,
-          typename P5>
-base::Callback<typename cef_internal::BindState<
-    typename cef_internal::FunctorTraits<Functor>::RunnableType,
-    typename cef_internal::FunctorTraits<Functor>::RunType,
-    void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
-         typename cef_internal::CallbackParamTraits<P2>::StorageType,
-         typename cef_internal::CallbackParamTraits<P3>::StorageType,
-         typename cef_internal::CallbackParamTraits<P4>::StorageType,
-         typename cef_internal::CallbackParamTraits<P5>::StorageType)>::
-                   UnboundRunType>
-Bind(Functor functor,
-     const P1& p1,
-     const P2& p2,
-     const P3& p3,
-     const P4& p4,
-     const P5& p5) {
-  // Typedefs for how to store and run the functor.
-  typedef
-      typename cef_internal::FunctorTraits<Functor>::RunnableType RunnableType;
-  typedef typename cef_internal::FunctorTraits<Functor>::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<typename RunnableType::RunType>
-      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<typename BoundFunctorTraits::A1Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A3Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A4Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A5Type>::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<RunnableType>::value ||
-                     !cef_internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
-                 p1_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::HasIsMethodTag<RunnableType>::value ||
-                     !is_array<P1>::value,
-                 first_bound_argument_to_method_cannot_be_array);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
-                 p2_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P3>::value,
-                 p3_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P4>::value,
-                 p4_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P5>::value,
-                 p5_is_refcounted_type_and_needs_scoped_refptr);
-  typedef cef_internal::BindState<
-      RunnableType, RunType,
-      void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
-           typename cef_internal::CallbackParamTraits<P2>::StorageType,
-           typename cef_internal::CallbackParamTraits<P3>::StorageType,
-           typename cef_internal::CallbackParamTraits<P4>::StorageType,
-           typename cef_internal::CallbackParamTraits<P5>::StorageType)>
-      BindState;
-
-  return Callback<typename BindState::UnboundRunType>(
-      new BindState(cef_internal::MakeRunnable(functor), p1, p2, p3, p4, p5));
+///
+/// Unretained() allows binding a non-refcounted class, and to disable
+/// refcounting on arguments that are refcounted objects.
+///
+/// EXAMPLE OF Unretained():
+///
+/// <pre>
+///   class Foo {
+///    public:
+///     void func() { cout << "Foo:f" << endl; }
+///   };
+///
+///   // In some function somewhere.
+///   Foo foo;
+///   OnceClosure foo_callback =
+///       BindOnce(&Foo::func, Unretained(&foo));
+///   std::move(foo_callback).Run();  // Prints "Foo:f".
+/// </pre>
+///
+/// Without the Unretained() wrapper on |&foo|, the above call would fail
+/// to compile because Foo does not support the AddRef() and Release() methods.
+///
+template <typename T>
+inline cef_internal::UnretainedWrapper<T> Unretained(T* o) {
+  return cef_internal::UnretainedWrapper<T>(o);
 }
 
-template <typename Functor,
-          typename P1,
-          typename P2,
-          typename P3,
-          typename P4,
-          typename P5,
-          typename P6>
-base::Callback<typename cef_internal::BindState<
-    typename cef_internal::FunctorTraits<Functor>::RunnableType,
-    typename cef_internal::FunctorTraits<Functor>::RunType,
-    void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
-         typename cef_internal::CallbackParamTraits<P2>::StorageType,
-         typename cef_internal::CallbackParamTraits<P3>::StorageType,
-         typename cef_internal::CallbackParamTraits<P4>::StorageType,
-         typename cef_internal::CallbackParamTraits<P5>::StorageType,
-         typename cef_internal::CallbackParamTraits<P6>::StorageType)>::
-                   UnboundRunType>
-Bind(Functor functor,
-     const P1& p1,
-     const P2& p2,
-     const P3& p3,
-     const P4& p4,
-     const P5& p5,
-     const P6& p6) {
-  // Typedefs for how to store and run the functor.
-  typedef
-      typename cef_internal::FunctorTraits<Functor>::RunnableType RunnableType;
-  typedef typename cef_internal::FunctorTraits<Functor>::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<typename RunnableType::RunType>
-      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<typename BoundFunctorTraits::A1Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A3Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A4Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A5Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A6Type>::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<RunnableType>::value ||
-                     !cef_internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
-                 p1_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::HasIsMethodTag<RunnableType>::value ||
-                     !is_array<P1>::value,
-                 first_bound_argument_to_method_cannot_be_array);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
-                 p2_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P3>::value,
-                 p3_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P4>::value,
-                 p4_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P5>::value,
-                 p5_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P6>::value,
-                 p6_is_refcounted_type_and_needs_scoped_refptr);
-  typedef cef_internal::BindState<
-      RunnableType, RunType,
-      void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
-           typename cef_internal::CallbackParamTraits<P2>::StorageType,
-           typename cef_internal::CallbackParamTraits<P3>::StorageType,
-           typename cef_internal::CallbackParamTraits<P4>::StorageType,
-           typename cef_internal::CallbackParamTraits<P5>::StorageType,
-           typename cef_internal::CallbackParamTraits<P6>::StorageType)>
-      BindState;
-
-  return Callback<typename BindState::UnboundRunType>(new BindState(
-      cef_internal::MakeRunnable(functor), p1, p2, p3, p4, p5, p6));
+///
+/// RetainedRef() accepts a ref counted object and retains a reference to it.
+/// When the callback is called, the object is passed as a raw pointer.
+///
+/// EXAMPLE OF RetainedRef():
+///
+/// <pre>
+///    void foo(RefCountedBytes* bytes) {}
+///
+///    scoped_refptr<RefCountedBytes> bytes = ...;
+///    OnceClosure callback = BindOnce(&foo, base::RetainedRef(bytes));
+///    std::move(callback).Run();
+/// </pre>
+///
+/// Without RetainedRef, the scoped_refptr would try to implicitly convert to
+/// a raw pointer and fail compilation:
+///
+/// <pre>
+///    OnceClosure callback = BindOnce(&foo, bytes); // ERROR!
+/// </pre>
+///
+template <typename T>
+inline cef_internal::RetainedRefWrapper<T> RetainedRef(T* o) {
+  return cef_internal::RetainedRefWrapper<T>(o);
+}
+template <typename T>
+inline cef_internal::RetainedRefWrapper<T> RetainedRef(scoped_refptr<T> o) {
+  return cef_internal::RetainedRefWrapper<T>(std::move(o));
 }
 
-template <typename Functor,
-          typename P1,
-          typename P2,
-          typename P3,
-          typename P4,
-          typename P5,
-          typename P6,
-          typename P7>
-base::Callback<typename cef_internal::BindState<
-    typename cef_internal::FunctorTraits<Functor>::RunnableType,
-    typename cef_internal::FunctorTraits<Functor>::RunType,
-    void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
-         typename cef_internal::CallbackParamTraits<P2>::StorageType,
-         typename cef_internal::CallbackParamTraits<P3>::StorageType,
-         typename cef_internal::CallbackParamTraits<P4>::StorageType,
-         typename cef_internal::CallbackParamTraits<P5>::StorageType,
-         typename cef_internal::CallbackParamTraits<P6>::StorageType,
-         typename cef_internal::CallbackParamTraits<P7>::StorageType)>::
-                   UnboundRunType>
-Bind(Functor functor,
-     const P1& p1,
-     const P2& p2,
-     const P3& p3,
-     const P4& p4,
-     const P5& p5,
-     const P6& p6,
-     const P7& p7) {
-  // Typedefs for how to store and run the functor.
-  typedef
-      typename cef_internal::FunctorTraits<Functor>::RunnableType RunnableType;
-  typedef typename cef_internal::FunctorTraits<Functor>::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<typename RunnableType::RunType>
-      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<typename BoundFunctorTraits::A1Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A3Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A4Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A5Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A6Type>::value ||
-        is_non_const_reference<typename BoundFunctorTraits::A7Type>::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<RunnableType>::value ||
-                     !cef_internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
-                 p1_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::HasIsMethodTag<RunnableType>::value ||
-                     !is_array<P1>::value,
-                 first_bound_argument_to_method_cannot_be_array);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
-                 p2_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P3>::value,
-                 p3_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P4>::value,
-                 p4_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P5>::value,
-                 p5_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P6>::value,
-                 p6_is_refcounted_type_and_needs_scoped_refptr);
-  COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P7>::value,
-                 p7_is_refcounted_type_and_needs_scoped_refptr);
-  typedef cef_internal::BindState<
-      RunnableType, RunType,
-      void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
-           typename cef_internal::CallbackParamTraits<P2>::StorageType,
-           typename cef_internal::CallbackParamTraits<P3>::StorageType,
-           typename cef_internal::CallbackParamTraits<P4>::StorageType,
-           typename cef_internal::CallbackParamTraits<P5>::StorageType,
-           typename cef_internal::CallbackParamTraits<P6>::StorageType,
-           typename cef_internal::CallbackParamTraits<P7>::StorageType)>
-      BindState;
-
-  return Callback<typename BindState::UnboundRunType>(new BindState(
-      cef_internal::MakeRunnable(functor), p1, p2, p3, p4, p5, p6, p7));
+///
+/// Owned() transfers ownership of an object to the callback resulting from
+/// bind; the object will be deleted when the callback is deleted.
+///
+/// EXAMPLE OF Owned():
+///
+/// <pre>
+///   void foo(int* arg) { cout << *arg << endl }
+///
+///   int* pn = new int(1);
+///   RepeatingClosure foo_callback = BindRepeating(&foo, Owned(pn));
+///
+///   foo_callback.Run();  // Prints "1"
+///   foo_callback.Run();  // Prints "1"
+///   *pn = 2;
+///   foo_callback.Run();  // Prints "2"
+///
+///   foo_callback.Reset();  // |pn| is deleted.  Also will happen when
+///                          // |foo_callback| goes out of scope.
+/// </pre>
+///
+/// Without Owned(), someone would have to know to delete |pn| when the last
+/// reference to the callback is deleted.
+///
+template <typename T>
+inline cef_internal::OwnedWrapper<T> Owned(T* o) {
+  return cef_internal::OwnedWrapper<T>(o);
 }
 
+template <typename T, typename Deleter>
+inline cef_internal::OwnedWrapper<T, Deleter> Owned(
+    std::unique_ptr<T, Deleter>&& ptr) {
+  return cef_internal::OwnedWrapper<T, Deleter>(std::move(ptr));
+}
+
+///
+/// OwnedRef() stores an object in the callback resulting from
+/// bind and passes a reference to the object to the bound function.
+///
+/// EXAMPLE OF OwnedRef():
+///
+/// <pre>
+///   void foo(int& arg) { cout << ++arg << endl }
+///
+///   int counter = 0;
+///   RepeatingClosure foo_callback = BindRepeating(&foo, OwnedRef(counter));
+///
+///   foo_callback.Run();  // Prints "1"
+///   foo_callback.Run();  // Prints "2"
+///   foo_callback.Run();  // Prints "3"
+///
+///   cout << counter;     // Prints "0", OwnedRef creates a copy of counter.
+/// </pre>
+///
+///  Supports OnceCallbacks as well, useful to pass placeholder arguments:
+///
+/// <pre>
+///   void bar(int& ignore, const std::string& s) { cout << s << endl }
+///
+///   OnceClosure bar_callback = BindOnce(&bar, OwnedRef(0), "Hello");
+///
+///   std::move(bar_callback).Run(); // Prints "Hello"
+/// </pre>
+///
+/// Without OwnedRef() it would not be possible to pass a mutable reference to
+/// an object owned by the callback.
+///
+template <typename T>
+cef_internal::OwnedRefWrapper<std::decay_t<T>> OwnedRef(T&& t) {
+  return cef_internal::OwnedRefWrapper<std::decay_t<T>>(std::forward<T>(t));
+}
+
+///
+/// Passed() is for transferring movable-but-not-copyable types (eg. unique_ptr)
+/// through a RepeatingCallback. Logically, this signifies a destructive
+/// transfer of the state of the argument into the target function. Invoking
+/// RepeatingCallback::Run() twice on a callback that was created with a
+/// Passed() argument will CHECK() because the first invocation would have
+/// already transferred ownership to the target function.
+///
+/// Note that Passed() is not necessary with BindOnce(), as std::move() does the
+/// same thing. Avoid Passed() in favor of std::move() with BindOnce().
+///
+/// EXAMPLE OF Passed():
+///
+/// <pre>
+///   void TakesOwnership(std::unique_ptr<Foo> arg) { }
+///   std::unique_ptr<Foo> CreateFoo() { return std::make_unique<Foo>();
+///   }
+///
+///   auto f = std::make_unique<Foo>();
+///
+///   // |cb| is given ownership of Foo(). |f| is now NULL.
+///   // You can use std::move(f) in place of &f, but it's more verbose.
+///   RepeatingClosure cb = BindRepeating(&TakesOwnership, Passed(&f));
+///
+///   // Run was never called so |cb| still owns Foo() and deletes
+///   // it on Reset().
+///   cb.Reset();
+///
+///   // |cb| is given a new Foo created by CreateFoo().
+///   cb = BindRepeating(&TakesOwnership, Passed(CreateFoo()));
+///
+///   // |arg| in TakesOwnership() is given ownership of Foo(). |cb|
+///   // no longer owns Foo() and, if reset, would not delete Foo().
+///   cb.Run();  // Foo() is now transferred to |arg| and deleted.
+///   cb.Run();  // This CHECK()s since Foo() already been used once.
+/// </pre>
+///
+/// We offer 2 syntaxes for calling Passed(). The first takes an rvalue and is
+/// best suited for use with the return value of a function or other temporary
+/// rvalues. The second takes a pointer to the scoper and is just syntactic
+/// sugar to avoid having to write Passed(std::move(scoper)).
+///
+/// Both versions of Passed() prevent T from being an lvalue reference. The
+/// first via use of enable_if, and the second takes a T* which will not bind to
+/// T&.
+///
+template <typename T,
+          std::enable_if_t<!std::is_lvalue_reference<T>::value>* = nullptr>
+inline cef_internal::PassedWrapper<T> Passed(T&& scoper) {
+  return cef_internal::PassedWrapper<T>(std::move(scoper));
+}
+template <typename T>
+inline cef_internal::PassedWrapper<T> Passed(T* scoper) {
+  return cef_internal::PassedWrapper<T>(std::move(*scoper));
+}
+
+///
+/// IgnoreResult() is used to adapt a function or callback with a return type to
+/// one with a void return. This is most useful if you have a function with,
+/// say, a pesky ignorable bool return that you want to use with PostTask or
+/// something else that expect a callback with a void return.
+///
+/// EXAMPLE OF IgnoreResult():
+///
+/// <pre>
+///   int DoSomething(int arg) { cout << arg << endl; }
+///
+///   // Assign to a callback with a void return type.
+///   OnceCallback<void(int)> cb = BindOnce(IgnoreResult(&DoSomething));
+///   std::move(cb).Run(1);  // Prints "1".
+///
+///   // Prints "2" on |ml|.
+///   ml->PostTask(FROM_HERE, BindOnce(IgnoreResult(&DoSomething), 2);
+/// </pre>
+///
+template <typename T>
+inline cef_internal::IgnoreResultHelper<T> IgnoreResult(T data) {
+  return cef_internal::IgnoreResultHelper<T>(std::move(data));
+}
+
+#if defined(OS_APPLE) && !HAS_FEATURE(objc_arc)
+
+///
+/// RetainBlock() is used to adapt an Objective-C block when Automated Reference
+/// Counting (ARC) is disabled. This is unnecessary when ARC is enabled, as the
+/// BindOnce and BindRepeating already support blocks then.
+///
+/// EXAMPLE OF RetainBlock():
+///
+/// <pre>
+///   // Wrap the block and bind it to a callback.
+///   OnceCallback<void(int)> cb =
+///       BindOnce(RetainBlock(^(int n) { NSLog(@"%d", n); }));
+///   std::move(cb).Run(1);  // Logs "1".
+/// </pre>
+///
+template <typename R, typename... Args>
+base::mac::ScopedBlock<R (^)(Args...)> RetainBlock(R (^block)(Args...)) {
+  return base::mac::ScopedBlock<R (^)(Args...)>(block,
+                                                base::scoped_policy::RETAIN);
+}
+
+#endif  // defined(OS_APPLE) && !HAS_FEATURE(objc_arc)
+
 }  // namespace base
 
 #endif  // !USING_CHROMIUM_INCLUDES
diff --git a/src/include/base/cef_bind_helpers.h b/src/include/base/cef_bind_helpers.h
deleted file mode 100644
index 2b4798b..0000000
--- a/src/include/base/cef_bind_helpers.h
+++ /dev/null
@@ -1,579 +0,0 @@
-// 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 defines a set of argument wrappers and related factory methods that
-// can be used specify the refcounting and reference semantics of arguments
-// that are bound by the Bind() function in base/bind.h.
-//
-// It also defines a set of simple functions and utilities that people want
-// when using Callback<> and Bind().
-//
-//
-// ARGUMENT BINDING WRAPPERS
-//
-// The wrapper functions are base::Unretained(), base::Owned(), base::Passed(),
-// base::ConstRef(), and base::IgnoreResult().
-//
-// Unretained() allows Bind() to bind a non-refcounted class, and to disable
-// refcounting on arguments that are refcounted objects.
-//
-// Owned() transfers ownership of an object to the Callback resulting from
-// bind; the object will be deleted when the Callback is deleted.
-//
-// Passed() is for transferring movable-but-not-copyable types (eg. scoped_ptr)
-// through a Callback. Logically, this signifies a destructive transfer of
-// the state of the argument into the target function.  Invoking
-// Callback::Run() twice on a Callback that was created with a Passed()
-// argument will CHECK() because the first invocation would have already
-// transferred ownership to the target function.
-//
-// ConstRef() allows binding a constant reference to an argument rather
-// than a copy.
-//
-// IgnoreResult() is used to adapt a function or Callback with a return type to
-// one with a void return. This is most useful if you have a function with,
-// say, a pesky ignorable bool return that you want to use with PostTask or
-// something else that expect a Callback with a void return.
-//
-// EXAMPLE OF Unretained():
-//
-//   class Foo {
-//    public:
-//     void func() { cout << "Foo:f" << endl; }
-//   };
-//
-//   // In some function somewhere.
-//   Foo foo;
-//   Closure foo_callback =
-//       Bind(&Foo::func, Unretained(&foo));
-//   foo_callback.Run();  // Prints "Foo:f".
-//
-// Without the Unretained() wrapper on |&foo|, the above call would fail
-// to compile because Foo does not support the AddRef() and Release() methods.
-//
-//
-// EXAMPLE OF Owned():
-//
-//   void foo(int* arg) { cout << *arg << endl }
-//
-//   int* pn = new int(1);
-//   Closure foo_callback = Bind(&foo, Owned(pn));
-//
-//   foo_callback.Run();  // Prints "1"
-//   foo_callback.Run();  // Prints "1"
-//   *n = 2;
-//   foo_callback.Run();  // Prints "2"
-//
-//   foo_callback.Reset();  // |pn| is deleted.  Also will happen when
-//                          // |foo_callback| goes out of scope.
-//
-// Without Owned(), someone would have to know to delete |pn| when the last
-// reference to the Callback is deleted.
-//
-//
-// EXAMPLE OF ConstRef():
-//
-//   void foo(int arg) { cout << arg << endl }
-//
-//   int n = 1;
-//   Closure no_ref = Bind(&foo, n);
-//   Closure has_ref = Bind(&foo, ConstRef(n));
-//
-//   no_ref.Run();  // Prints "1"
-//   has_ref.Run();  // Prints "1"
-//
-//   n = 2;
-//   no_ref.Run();  // Prints "1"
-//   has_ref.Run();  // Prints "2"
-//
-// Note that because ConstRef() takes a reference on |n|, |n| must outlive all
-// its bound callbacks.
-//
-//
-// EXAMPLE OF IgnoreResult():
-//
-//   int DoSomething(int arg) { cout << arg << endl; }
-//
-//   // Assign to a Callback with a void return type.
-//   Callback<void(int)> cb = Bind(IgnoreResult(&DoSomething));
-//   cb->Run(1);  // Prints "1".
-//
-//   // Prints "1" on |ml|.
-//   ml->PostTask(FROM_HERE, Bind(IgnoreResult(&DoSomething), 1);
-//
-//
-// EXAMPLE OF Passed():
-//
-//   void TakesOwnership(scoped_ptr<Foo> arg) { }
-//   scoped_ptr<Foo> CreateFoo() { return scoped_ptr<Foo>(new Foo()); }
-//
-//   scoped_ptr<Foo> f(new Foo());
-//
-//   // |cb| is given ownership of Foo(). |f| is now NULL.
-//   // You can use f.Pass() in place of &f, but it's more verbose.
-//   Closure cb = Bind(&TakesOwnership, Passed(&f));
-//
-//   // Run was never called so |cb| still owns Foo() and deletes
-//   // it on Reset().
-//   cb.Reset();
-//
-//   // |cb| is given a new Foo created by CreateFoo().
-//   cb = Bind(&TakesOwnership, Passed(CreateFoo()));
-//
-//   // |arg| in TakesOwnership() is given ownership of Foo(). |cb|
-//   // no longer owns Foo() and, if reset, would not delete Foo().
-//   cb.Run();  // Foo() is now transferred to |arg| and deleted.
-//   cb.Run();  // This CHECK()s since Foo() already been used once.
-//
-// Passed() is particularly useful with PostTask() when you are transferring
-// ownership of an argument into a task, but don't necessarily know if the
-// task will always be executed. This can happen if the task is cancellable
-// or if it is posted to a MessageLoopProxy.
-//
-//
-// SIMPLE FUNCTIONS AND UTILITIES.
-//
-//   DoNothing() - Useful for creating a Closure that does nothing when called.
-//   DeletePointer<T>() - Useful for creating a Closure that will delete a
-//                        pointer when invoked. Only use this when necessary.
-//                        In most cases MessageLoop::DeleteSoon() is a better
-//                        fit.
-
-#ifndef CEF_INCLUDE_BASE_CEF_BIND_HELPERS_H_
-#define CEF_INCLUDE_BASE_CEF_BIND_HELPERS_H_
-#pragma once
-
-#if defined(BASE_BIND_HELPERS_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_helpers.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/cef_basictypes.h"
-#include "include/base/cef_callback.h"
-#include "include/base/cef_template_util.h"
-#include "include/base/cef_weak_ptr.h"
-
-namespace base {
-namespace cef_internal {
-
-// Use the Substitution Failure Is Not An Error (SFINAE) trick to inspect T
-// for the existence of AddRef() and Release() functions of the correct
-// signature.
-//
-// http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error
-// http://stackoverflow.com/questions/257288/is-it-possible-to-write-a-c-template-to-check-for-a-functions-existence
-// http://stackoverflow.com/questions/4358584/sfinae-approach-comparison
-// http://stackoverflow.com/questions/1966362/sfinae-to-check-for-inherited-member-functions
-//
-// The last link in particular show the method used below.
-//
-// For SFINAE to work with inherited methods, we need to pull some extra tricks
-// with multiple inheritance.  In the more standard formulation, the overloads
-// of Check would be:
-//
-//   template <typename C>
-//   Yes NotTheCheckWeWant(Helper<&C::TargetFunc>*);
-//
-//   template <typename C>
-//   No NotTheCheckWeWant(...);
-//
-//   static const bool value = sizeof(NotTheCheckWeWant<T>(0)) == sizeof(Yes);
-//
-// The problem here is that template resolution will not match
-// C::TargetFunc if TargetFunc does not exist directly in C.  That is, if
-// TargetFunc in inherited from an ancestor, &C::TargetFunc will not match,
-// |value| will be false.  This formulation only checks for whether or
-// not TargetFunc exist directly in the class being introspected.
-//
-// To get around this, we play a dirty trick with multiple inheritance.
-// First, We create a class BaseMixin that declares each function that we
-// want to probe for.  Then we create a class Base that inherits from both T
-// (the class we wish to probe) and BaseMixin.  Note that the function
-// signature in BaseMixin does not need to match the signature of the function
-// we are probing for; thus it's easiest to just use void(void).
-//
-// Now, if TargetFunc exists somewhere in T, then &Base::TargetFunc has an
-// ambiguous resolution between BaseMixin and T.  This lets us write the
-// following:
-//
-//   template <typename C>
-//   No GoodCheck(Helper<&C::TargetFunc>*);
-//
-//   template <typename C>
-//   Yes GoodCheck(...);
-//
-//   static const bool value = sizeof(GoodCheck<Base>(0)) == sizeof(Yes);
-//
-// Notice here that the variadic version of GoodCheck() returns Yes here
-// instead of No like the previous one. Also notice that we calculate |value|
-// by specializing GoodCheck() on Base instead of T.
-//
-// We've reversed the roles of the variadic, and Helper overloads.
-// GoodCheck(Helper<&C::TargetFunc>*), when C = Base, fails to be a valid
-// substitution if T::TargetFunc exists. Thus GoodCheck<Base>(0) will resolve
-// to the variadic version if T has TargetFunc.  If T::TargetFunc does not
-// exist, then &C::TargetFunc is not ambiguous, and the overload resolution
-// will prefer GoodCheck(Helper<&C::TargetFunc>*).
-//
-// This method of SFINAE will correctly probe for inherited names, but it cannot
-// typecheck those names.  It's still a good enough sanity check though.
-//
-// Works on gcc-4.2, gcc-4.4, and Visual Studio 2008.
-//
-// TODO(ajwong): Move to ref_counted.h or template_util.h when we've vetted
-// this works well.
-//
-// TODO(ajwong): Make this check for Release() as well.
-// See http://crbug.com/82038.
-template <typename T>
-class SupportsAddRefAndRelease {
-  typedef char Yes[1];
-  typedef char No[2];
-
-  struct BaseMixin {
-    void AddRef();
-  };
-
-// MSVC warns when you try to use Base if T has a private destructor, the
-// common pattern for refcounted types. It does this even though no attempt to
-// instantiate Base is made.  We disable the warning for this definition.
-#if defined(OS_WIN)
-#pragma warning(push)
-#pragma warning(disable : 4624)
-#endif
-  struct Base : public T, public BaseMixin {};
-#if defined(OS_WIN)
-#pragma warning(pop)
-#endif
-
-  template <void (BaseMixin::*)(void)>
-  struct Helper {};
-
-  template <typename C>
-  static No& Check(Helper<&C::AddRef>*);
-
-  template <typename>
-  static Yes& Check(...);
-
- public:
-  static const bool value = sizeof(Check<Base>(0)) == sizeof(Yes);
-};
-
-// Helpers to assert that arguments of a recounted type are bound with a
-// scoped_refptr.
-template <bool IsClasstype, typename T>
-struct UnsafeBindtoRefCountedArgHelper : false_type {};
-
-template <typename T>
-struct UnsafeBindtoRefCountedArgHelper<true, T>
-    : integral_constant<bool, SupportsAddRefAndRelease<T>::value> {};
-
-template <typename T>
-struct UnsafeBindtoRefCountedArg : false_type {};
-
-template <typename T>
-struct UnsafeBindtoRefCountedArg<T*>
-    : UnsafeBindtoRefCountedArgHelper<is_class<T>::value, T> {};
-
-template <typename T>
-class HasIsMethodTag {
-  typedef char Yes[1];
-  typedef char No[2];
-
-  template <typename U>
-  static Yes& Check(typename U::IsMethod*);
-
-  template <typename U>
-  static No& Check(...);
-
- public:
-  static const bool value = sizeof(Check<T>(0)) == sizeof(Yes);
-};
-
-template <typename T>
-class UnretainedWrapper {
- public:
-  explicit UnretainedWrapper(T* o) : ptr_(o) {}
-  T* get() const { return ptr_; }
-
- private:
-  T* ptr_;
-};
-
-template <typename T>
-class ConstRefWrapper {
- public:
-  explicit ConstRefWrapper(const T& o) : ptr_(&o) {}
-  const T& get() const { return *ptr_; }
-
- private:
-  const T* ptr_;
-};
-
-template <typename T>
-struct IgnoreResultHelper {
-  explicit IgnoreResultHelper(T functor) : functor_(functor) {}
-
-  T functor_;
-};
-
-template <typename T>
-struct IgnoreResultHelper<Callback<T>> {
-  explicit IgnoreResultHelper(const Callback<T>& functor) : functor_(functor) {}
-
-  const Callback<T>& functor_;
-};
-
-// An alternate implementation is to avoid the destructive copy, and instead
-// specialize ParamTraits<> for OwnedWrapper<> to change the StorageType to
-// a class that is essentially a scoped_ptr<>.
-//
-// The current implementation has the benefit though of leaving ParamTraits<>
-// fully in callback_internal.h as well as avoiding type conversions during
-// storage.
-template <typename T>
-class OwnedWrapper {
- public:
-  explicit OwnedWrapper(T* o) : ptr_(o) {}
-  ~OwnedWrapper() { delete ptr_; }
-  T* get() const { return ptr_; }
-  OwnedWrapper(const OwnedWrapper& other) {
-    ptr_ = other.ptr_;
-    other.ptr_ = NULL;
-  }
-
- private:
-  mutable T* ptr_;
-};
-
-// PassedWrapper is a copyable adapter for a scoper that ignores const.
-//
-// It is needed to get around the fact that Bind() takes a const reference to
-// all its arguments.  Because Bind() takes a const reference to avoid
-// unnecessary copies, it is incompatible with movable-but-not-copyable
-// types; doing a destructive "move" of the type into Bind() would violate
-// the const correctness.
-//
-// This conundrum cannot be solved without either C++11 rvalue references or
-// a O(2^n) blowup of Bind() templates to handle each combination of regular
-// types and movable-but-not-copyable types.  Thus we introduce a wrapper type
-// that is copyable to transmit the correct type information down into
-// BindState<>. Ignoring const in this type makes sense because it is only
-// created when we are explicitly trying to do a destructive move.
-//
-// Two notes:
-//  1) PassedWrapper supports any type that has a "Pass()" function.
-//     This is intentional. The whitelisting of which specific types we
-//     support is maintained by CallbackParamTraits<>.
-//  2) is_valid_ is distinct from NULL because it is valid to bind a "NULL"
-//     scoper to a Callback and allow the Callback to execute once.
-template <typename T>
-class PassedWrapper {
- public:
-  explicit PassedWrapper(T scoper) : is_valid_(true), scoper_(scoper.Pass()) {}
-  PassedWrapper(const PassedWrapper& other)
-      : is_valid_(other.is_valid_), scoper_(other.scoper_.Pass()) {}
-  T Pass() const {
-    CHECK(is_valid_);
-    is_valid_ = false;
-    return scoper_.Pass();
-  }
-
- private:
-  mutable bool is_valid_;
-  mutable T scoper_;
-};
-
-// Unwrap the stored parameters for the wrappers above.
-template <typename T>
-struct UnwrapTraits {
-  typedef const T& ForwardType;
-  static ForwardType Unwrap(const T& o) { return o; }
-};
-
-template <typename T>
-struct UnwrapTraits<UnretainedWrapper<T>> {
-  typedef T* ForwardType;
-  static ForwardType Unwrap(UnretainedWrapper<T> unretained) {
-    return unretained.get();
-  }
-};
-
-template <typename T>
-struct UnwrapTraits<ConstRefWrapper<T>> {
-  typedef const T& ForwardType;
-  static ForwardType Unwrap(ConstRefWrapper<T> const_ref) {
-    return const_ref.get();
-  }
-};
-
-template <typename T>
-struct UnwrapTraits<scoped_refptr<T>> {
-  typedef T* ForwardType;
-  static ForwardType Unwrap(const scoped_refptr<T>& o) { return o.get(); }
-};
-
-template <typename T>
-struct UnwrapTraits<WeakPtr<T>> {
-  typedef const WeakPtr<T>& ForwardType;
-  static ForwardType Unwrap(const WeakPtr<T>& o) { return o; }
-};
-
-template <typename T>
-struct UnwrapTraits<OwnedWrapper<T>> {
-  typedef T* ForwardType;
-  static ForwardType Unwrap(const OwnedWrapper<T>& o) { return o.get(); }
-};
-
-template <typename T>
-struct UnwrapTraits<PassedWrapper<T>> {
-  typedef T ForwardType;
-  static T Unwrap(PassedWrapper<T>& o) { return o.Pass(); }
-};
-
-// Utility for handling different refcounting semantics in the Bind()
-// function.
-template <bool is_method, typename T>
-struct MaybeRefcount;
-
-template <typename T>
-struct MaybeRefcount<false, T> {
-  static void AddRef(const T&) {}
-  static void Release(const T&) {}
-};
-
-template <typename T, size_t n>
-struct MaybeRefcount<false, T[n]> {
-  static void AddRef(const T*) {}
-  static void Release(const T*) {}
-};
-
-template <typename T>
-struct MaybeRefcount<true, T> {
-  static void AddRef(const T&) {}
-  static void Release(const T&) {}
-};
-
-template <typename T>
-struct MaybeRefcount<true, T*> {
-  static void AddRef(T* o) { o->AddRef(); }
-  static void Release(T* o) { o->Release(); }
-};
-
-// No need to additionally AddRef() and Release() since we are storing a
-// scoped_refptr<> inside the storage object already.
-template <typename T>
-struct MaybeRefcount<true, scoped_refptr<T>> {
-  static void AddRef(const scoped_refptr<T>& o) {}
-  static void Release(const scoped_refptr<T>& o) {}
-};
-
-template <typename T>
-struct MaybeRefcount<true, const T*> {
-  static void AddRef(const T* o) { o->AddRef(); }
-  static void Release(const T* o) { o->Release(); }
-};
-
-// IsWeakMethod is a helper that determine if we are binding a WeakPtr<> to a
-// method.  It is used internally by Bind() to select the correct
-// InvokeHelper that will no-op itself in the event the WeakPtr<> for
-// the target object is invalidated.
-//
-// P1 should be the type of the object that will be received of the method.
-template <bool IsMethod, typename P1>
-struct IsWeakMethod : public false_type {};
-
-template <typename T>
-struct IsWeakMethod<true, WeakPtr<T>> : public true_type {};
-
-template <typename T>
-struct IsWeakMethod<true, ConstRefWrapper<WeakPtr<T>>> : public true_type {};
-
-}  // namespace cef_internal
-
-template <typename T>
-static inline cef_internal::UnretainedWrapper<T> Unretained(T* o) {
-  return cef_internal::UnretainedWrapper<T>(o);
-}
-
-template <typename T>
-static inline cef_internal::ConstRefWrapper<T> ConstRef(const T& o) {
-  return cef_internal::ConstRefWrapper<T>(o);
-}
-
-template <typename T>
-static inline cef_internal::OwnedWrapper<T> Owned(T* o) {
-  return cef_internal::OwnedWrapper<T>(o);
-}
-
-// We offer 2 syntaxes for calling Passed().  The first takes a temporary and
-// is best suited for use with the return value of a function. The second
-// takes a pointer to the scoper and is just syntactic sugar to avoid having
-// to write Passed(scoper.Pass()).
-template <typename T>
-static inline cef_internal::PassedWrapper<T> Passed(T scoper) {
-  return cef_internal::PassedWrapper<T>(scoper.Pass());
-}
-template <typename T>
-static inline cef_internal::PassedWrapper<T> Passed(T* scoper) {
-  return cef_internal::PassedWrapper<T>(scoper->Pass());
-}
-
-template <typename T>
-static inline cef_internal::IgnoreResultHelper<T> IgnoreResult(T data) {
-  return cef_internal::IgnoreResultHelper<T>(data);
-}
-
-template <typename T>
-static inline cef_internal::IgnoreResultHelper<Callback<T>> IgnoreResult(
-    const Callback<T>& data) {
-  return cef_internal::IgnoreResultHelper<Callback<T>>(data);
-}
-
-void DoNothing();
-
-template <typename T>
-void DeletePointer(T* obj) {
-  delete obj;
-}
-
-}  // namespace base
-
-#endif  // !USING_CHROMIUM_INCLUDES
-
-#endif  // CEF_INCLUDE_BASE_CEF_BIND_HELPERS_H_
diff --git a/src/include/base/cef_build.h b/src/include/base/cef_build.h
index 61dc317..d32c617 100644
--- a/src/include/base/cef_build.h
+++ b/src/include/base/cef_build.h
@@ -27,53 +27,132 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+/// \file
+/// This file adds defines about the platform we're currently building on.
+///
+/// <pre>
+///  Operating System:
+///    OS_AIX / OS_ANDROID / OS_ASMJS / OS_FREEBSD / OS_FUCHSIA / OS_IOS /
+///    OS_LINUX / OS_MAC / OS_NACL (SFI or NONSFI) / OS_NETBSD / OS_OPENBSD /
+///    OS_QNX / OS_SOLARIS / OS_WIN
+///  Operating System family:
+///    OS_APPLE: IOS or MAC
+///    OS_BSD: FREEBSD or NETBSD or OPENBSD
+///    OS_POSIX: AIX or ANDROID or ASMJS or CHROMEOS or FREEBSD or IOS or LINUX
+///              or MAC or NACL or NETBSD or OPENBSD or QNX or SOLARIS
+///
+///  /!\ Note: OS_CHROMEOS is set by the build system, not this file
+///
+///  Compiler:
+///    COMPILER_MSVC / COMPILER_GCC
+///
+///  Processor:
+///    ARCH_CPU_ARM64 / ARCH_CPU_ARMEL / ARCH_CPU_MIPS / ARCH_CPU_MIPS64 /
+///    ARCH_CPU_MIPS64EL / ARCH_CPU_MIPSEL / ARCH_CPU_PPC64 / ARCH_CPU_S390 /
+///    ARCH_CPU_S390X / ARCH_CPU_X86 / ARCH_CPU_X86_64
+///  Processor family:
+///    ARCH_CPU_ARM_FAMILY: ARMEL or ARM64
+///    ARCH_CPU_MIPS_FAMILY: MIPS64EL or MIPSEL or MIPS64 or MIPS
+///    ARCH_CPU_PPC64_FAMILY: PPC64
+///    ARCH_CPU_S390_FAMILY: S390 or S390X
+///    ARCH_CPU_X86_FAMILY: X86 or X86_64
+///  Processor features:
+///    ARCH_CPU_31_BITS / ARCH_CPU_32_BITS / ARCH_CPU_64_BITS
+///    ARCH_CPU_BIG_ENDIAN / ARCH_CPU_LITTLE_ENDIAN
+/// </pre>
+///
+
 #ifndef CEF_INCLUDE_BASE_CEF_BUILD_H_
 #define CEF_INCLUDE_BASE_CEF_BUILD_H_
 #pragma once
 
 #if defined(USING_CHROMIUM_INCLUDES)
 // When building CEF include the Chromium header directly.
-#include "base/compiler_specific.h"
+#include "build/build_config.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.
 
-#if defined(_WIN32)
-#ifndef OS_WIN
-#define OS_WIN 1
-#endif
+// A set of macros to use for platform detection.
+#if defined(ANDROID)
+#define OS_ANDROID 1
 #elif defined(__APPLE__)
-#ifndef OS_MACOSX
-#define OS_MACOSX 1
-#endif
-#elif defined(__linux__)
-#ifndef OS_LINUX
-#define OS_LINUX 1
-#endif
+// Only include TargetConditionals after testing ANDROID as some Android builds
+// on the Mac have this header available and it's not needed unless the target
+// is really an Apple platform.
+#include <TargetConditionals.h>
+#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
+#define OS_IOS 1
 #else
-#error Please add support for your platform in cef_build.h
+#define OS_MAC 1
+// For backwards compatibility.
+#define OS_MACOSX 1
+#endif  // defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
+#elif defined(__linux__)
+#if !defined(OS_CHROMEOS)
+// Do not define OS_LINUX on Chrome OS build.
+// The OS_CHROMEOS macro is defined in GN.
+#define OS_LINUX 1
+#endif  // !defined(OS_CHROMEOS)
+// Include a system header to pull in features.h for glibc/uclibc macros.
+#include <unistd.h>
+#if defined(__GLIBC__) && !defined(__UCLIBC__)
+// We really are using glibc, not uClibc pretending to be glibc.
+#define LIBC_GLIBC 1
+#endif
+#elif defined(_WIN32)
+#define OS_WIN 1
+#elif defined(__Fuchsia__)
+#define OS_FUCHSIA 1
+#elif defined(__FreeBSD__)
+#define OS_FREEBSD 1
+#elif defined(__NetBSD__)
+#define OS_NETBSD 1
+#elif defined(__OpenBSD__)
+#define OS_OPENBSD 1
+#elif defined(__sun)
+#define OS_SOLARIS 1
+#elif defined(__QNXNTO__)
+#define OS_QNX 1
+#elif defined(_AIX)
+#define OS_AIX 1
+#elif defined(__asmjs__) || defined(__wasm__)
+#define OS_ASMJS 1
+#else
+#error Please add support for your platform in include/base/cef_build.h
+#endif
+// NOTE: Adding a new port? Please follow
+// https://chromium.googlesource.com/chromium/src/+/master/docs/new_port_policy.md
+
+#if defined(OS_MAC) || defined(OS_IOS)
+#define OS_APPLE 1
+#endif
+
+// For access to standard BSD features, use OS_BSD instead of a
+// more specific macro.
+#if defined(OS_FREEBSD) || defined(OS_NETBSD) || defined(OS_OPENBSD)
+#define OS_BSD 1
 #endif
 
 // For access to standard POSIXish features, use OS_POSIX instead of a
 // more specific macro.
-#if defined(OS_MACOSX) || defined(OS_LINUX)
-#ifndef OS_POSIX
+#if defined(OS_AIX) || defined(OS_ANDROID) || defined(OS_ASMJS) ||  \
+    defined(OS_FREEBSD) || defined(OS_IOS) || defined(OS_LINUX) ||  \
+    defined(OS_CHROMEOS) || defined(OS_MAC) || defined(OS_NACL) ||  \
+    defined(OS_NETBSD) || defined(OS_OPENBSD) || defined(OS_QNX) || \
+    defined(OS_SOLARIS)
 #define OS_POSIX 1
 #endif
-#endif
 
-// Compiler detection.
+// Compiler detection. Note: clang masquerades as GCC on POSIX and as MSVC on
+// Windows.
 #if defined(__GNUC__)
-#ifndef COMPILER_GCC
 #define COMPILER_GCC 1
-#endif
 #elif defined(_MSC_VER)
-#ifndef COMPILER_MSVC
 #define COMPILER_MSVC 1
-#endif
 #else
-#error Please add support for your compiler in cef_build.h
+#error Please add support for your compiler in build/build_config.h
 #endif
 
 // Processor architecture detection.  For more info on what's defined, see:
@@ -90,6 +169,26 @@
 #define ARCH_CPU_X86 1
 #define ARCH_CPU_32_BITS 1
 #define ARCH_CPU_LITTLE_ENDIAN 1
+#elif defined(__s390x__)
+#define ARCH_CPU_S390_FAMILY 1
+#define ARCH_CPU_S390X 1
+#define ARCH_CPU_64_BITS 1
+#define ARCH_CPU_BIG_ENDIAN 1
+#elif defined(__s390__)
+#define ARCH_CPU_S390_FAMILY 1
+#define ARCH_CPU_S390 1
+#define ARCH_CPU_31_BITS 1
+#define ARCH_CPU_BIG_ENDIAN 1
+#elif (defined(__PPC64__) || defined(__PPC__)) && defined(__BIG_ENDIAN__)
+#define ARCH_CPU_PPC64_FAMILY 1
+#define ARCH_CPU_PPC64 1
+#define ARCH_CPU_64_BITS 1
+#define ARCH_CPU_BIG_ENDIAN 1
+#elif defined(__PPC64__)
+#define ARCH_CPU_PPC64_FAMILY 1
+#define ARCH_CPU_PPC64 1
+#define ARCH_CPU_64_BITS 1
+#define ARCH_CPU_LITTLE_ENDIAN 1
 #elif defined(__ARMEL__)
 #define ARCH_CPU_ARM_FAMILY 1
 #define ARCH_CPU_ARMEL 1
@@ -100,21 +199,42 @@
 #define ARCH_CPU_ARM64 1
 #define ARCH_CPU_64_BITS 1
 #define ARCH_CPU_LITTLE_ENDIAN 1
-#elif defined(__pnacl__)
+#elif defined(__pnacl__) || defined(__asmjs__) || defined(__wasm__)
 #define ARCH_CPU_32_BITS 1
 #define ARCH_CPU_LITTLE_ENDIAN 1
 #elif defined(__MIPSEL__)
+#if defined(__LP64__)
+#define ARCH_CPU_MIPS_FAMILY 1
+#define ARCH_CPU_MIPS64EL 1
+#define ARCH_CPU_64_BITS 1
+#define ARCH_CPU_LITTLE_ENDIAN 1
+#else
 #define ARCH_CPU_MIPS_FAMILY 1
 #define ARCH_CPU_MIPSEL 1
 #define ARCH_CPU_32_BITS 1
 #define ARCH_CPU_LITTLE_ENDIAN 1
+#endif
+#elif defined(__MIPSEB__)
+#if defined(__LP64__)
+#define ARCH_CPU_MIPS_FAMILY 1
+#define ARCH_CPU_MIPS64 1
+#define ARCH_CPU_64_BITS 1
+#define ARCH_CPU_BIG_ENDIAN 1
 #else
-#error Please add support for your architecture in cef_build.h
+#define ARCH_CPU_MIPS_FAMILY 1
+#define ARCH_CPU_MIPS 1
+#define ARCH_CPU_32_BITS 1
+#define ARCH_CPU_BIG_ENDIAN 1
+#endif
+#else
+#error Please add support for your architecture in include/base/cef_build.h
 #endif
 
 // Type detection for wchar_t.
 #if defined(OS_WIN)
 #define WCHAR_T_IS_UTF16
+#elif defined(OS_FUCHSIA)
+#define WCHAR_T_IS_UTF32
 #elif defined(OS_POSIX) && defined(COMPILER_GCC) && defined(__WCHAR_MAX__) && \
     (__WCHAR_MAX__ == 0x7fffffff || __WCHAR_MAX__ == 0xffffffff)
 #define WCHAR_T_IS_UTF32
@@ -126,82 +246,18 @@
 // short wchar works for them.
 #define WCHAR_T_IS_UTF16
 #else
-#error Please add support for your compiler in cef_build.h
+#error Please add support for your compiler in include/base/cef_build.h
 #endif
 
-// Annotate a function indicating the caller must examine the return value.
-// Use like:
-//   int foo() WARN_UNUSED_RESULT;
-// To explicitly ignore a result, see |ignore_result()| in <base/macros.h>.
-#ifndef WARN_UNUSED_RESULT
-#if defined(COMPILER_GCC)
-#define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
-#else
-#define WARN_UNUSED_RESULT
-#endif
-#endif  // WARN_UNUSED_RESULT
-
-// Annotate a typedef or function indicating it's ok if it's not used.
-// Use like:
-//   typedef Foo Bar ALLOW_UNUSED_TYPE;
-#ifndef ALLOW_UNUSED_TYPE
-#if defined(COMPILER_GCC)
-#define ALLOW_UNUSED_TYPE __attribute__((unused))
-#else
-#define ALLOW_UNUSED_TYPE
-#endif
-#endif  // ALLOW_UNUSED_TYPE
-
-// Annotate a variable indicating it's ok if the variable is not used.
-// (Typically used to silence a compiler warning when the assignment
-// is important for some other reason.)
-// Use like:
-//   int x = ...;
-//   ALLOW_UNUSED_LOCAL(x);
-#ifndef ALLOW_UNUSED_LOCAL
-#define ALLOW_UNUSED_LOCAL(x) false ? (void)x : (void)0
-#endif
-
-// Sanitizers annotations.
-#if defined(__has_attribute)
-#if __has_attribute(no_sanitize)
-#define NO_SANITIZE(what) __attribute__((no_sanitize(what)))
-#endif
-#endif
-#if !defined(NO_SANITIZE)
-#define NO_SANITIZE(what)
+#if defined(OS_ANDROID)
+// The compiler thinks std::string::const_iterator and "const char*" are
+// equivalent types.
+#define STD_STRING_ITERATOR_IS_CHAR_POINTER
+// The compiler thinks std::u16string::const_iterator and "char16_t*" are
+// equivalent types.
+#define BASE_STRING16_ITERATOR_IS_CHAR16_POINTER
 #endif
 
 #endif  // !USING_CHROMIUM_INCLUDES
 
-// Annotate a virtual method indicating it must be overriding a virtual method
-// in the parent class.
-// Use like:
-//   void foo() OVERRIDE;
-// NOTE: This define should only be used in classes exposed to the client since
-// C++11 support may not be enabled in client applications. CEF internal classes
-// should use the `override` keyword directly.
-#ifndef OVERRIDE
-#if defined(__clang__)
-#define OVERRIDE override
-#elif defined(COMPILER_MSVC) && _MSC_VER >= 1600
-// Visual Studio 2010 and later support override.
-#define OVERRIDE override
-#elif defined(COMPILER_GCC) && __cplusplus >= 201103 && \
-    (__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >= 40700
-// GCC 4.7 supports explicit virtual overrides when C++11 support is enabled.
-#define OVERRIDE override
-#else
-#define OVERRIDE
-#endif
-#endif  // OVERRIDE
-
-// Check for C++11 template alias support which was added in VS2013 and GCC4.7.
-// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf
-#if __cplusplus > 199711L || (defined(_MSC_VER) && _MSC_VER >= 1800) || \
-    (defined(__GNUC__) &&                                               \
-     (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ >= 40700))
-#define HAS_CPP11_TEMPLATE_ALIAS_SUPPORT
-#endif
-
 #endif  // CEF_INCLUDE_BASE_CEF_BUILD_H_
diff --git a/src/include/base/cef_callback.h b/src/include/base/cef_callback.h
index 16e238a..bcfe499 100644
--- a/src/include/base/cef_callback.h
+++ b/src/include/base/cef_callback.h
@@ -28,772 +28,221 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+/// \file
+/// A callback is similar in concept to a function pointer: it wraps a runnable
+/// object such as a function, method, lambda, or even another callback,
+/// allowing the runnable object to be invoked later via the callback object.
+///
+/// Unlike function pointers, callbacks are created with base::BindOnce() or
+/// base::BindRepeating() and support partial function application.
+///
+/// A base::OnceCallback may be Run() at most once; a base::RepeatingCallback
+/// may be Run() any number of times. |is_null()| is guaranteed to return true
+/// for a moved-from callback.
+///
+/// <pre>
+///   // The lambda takes two arguments, but the first argument |x| is bound at
+///   // callback creation.
+///   base::OnceCallback<int(int)> cb = base::BindOnce([] (int x, int y) {
+///     return x + y;
+///   }, 1);
+///   // Run() only needs the remaining unbound argument |y|.
+///   printf("1 + 2 = %d\n", std::move(cb).Run(2));  // Prints 3
+///   printf("cb is null? %s\n",
+///          cb.is_null() ? "true" : "false");  // Prints true
+///   std::move(cb).Run(2);  // Crashes since |cb| has already run.
+/// </pre>
+///
+/// Callbacks also support cancellation. A common use is binding the receiver
+/// object as a WeakPtr<T>. If that weak pointer is invalidated, calling Run()
+/// will be a no-op. Note that |IsCancelled()| and |is_null()| are distinct:
+/// simply cancelling a callback will not also make it null.
+///
+/// See https://chromium.googlesource.com/chromium/src/+/lkgr/docs/callback.md
+/// for the full documentation.
+
 #ifndef CEF_INCLUDE_BASE_CEF_CALLBACK_H_
 #define CEF_INCLUDE_BASE_CEF_CALLBACK_H_
 #pragma once
 
-#if defined(BASE_CALLBACK_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)
+#if defined(USING_CHROMIUM_INCLUDES)
 // When building CEF include the Chromium header directly.
-#include "base/callback.h"
+#include "base/functional/callback.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 <stddef.h>
+
+#include "include/base/cef_bind.h"
 #include "include/base/cef_callback_forward.h"
-#include "include/base/cef_template_util.h"
+#include "include/base/cef_logging.h"
 #include "include/base/internal/cef_callback_internal.h"
 
-// NOTE: Header files that do not require the full definition of Callback or
-// Closure should #include "base/cef_callback_forward.h" instead of this file.
-
-// -----------------------------------------------------------------------------
-// Introduction
-// -----------------------------------------------------------------------------
-//
-// The templated Callback class is a generalized function object. Together
-// with the Bind() function in bind.h, they provide a type-safe method for
-// performing partial application of functions.
-//
-// Partial application (or "currying") is the process of binding a subset of
-// a function's arguments to produce another function that takes fewer
-// arguments. This can be used to pass around a unit of delayed execution,
-// much like lexical closures are used in other languages. For example, it
-// is used in Chromium code to schedule tasks on different MessageLoops.
-//
-// A callback with no unbound input parameters (base::Callback<void(void)>)
-// is called a base::Closure. Note that this is NOT the same as what other
-// languages refer to as a closure -- it does not retain a reference to its
-// enclosing environment.
-//
-// MEMORY MANAGEMENT AND PASSING
-//
-// The Callback objects themselves should be passed by const-reference, and
-// stored by copy. They internally store their state via a refcounted class
-// and thus do not need to be deleted.
-//
-// The reason to pass via a const-reference is to avoid unnecessary
-// AddRef/Release pairs to the internal state.
-//
-//
-// -----------------------------------------------------------------------------
-// Quick reference for basic stuff
-// -----------------------------------------------------------------------------
-//
-// BINDING A BARE FUNCTION
-//
-//   int Return5() { return 5; }
-//   base::Callback<int(void)> func_cb = base::Bind(&Return5);
-//   LOG(INFO) << func_cb.Run();  // Prints 5.
-//
-// BINDING A CLASS METHOD
-//
-//   The first argument to bind is the member function to call, the second is
-//   the object on which to call it.
-//
-//   class Ref : public base::RefCountedThreadSafe<Ref> {
-//    public:
-//     int Foo() { return 3; }
-//     void PrintBye() { LOG(INFO) << "bye."; }
-//   };
-//   scoped_refptr<Ref> ref = new Ref();
-//   base::Callback<void(void)> ref_cb = base::Bind(&Ref::Foo, ref);
-//   LOG(INFO) << ref_cb.Run();  // Prints out 3.
-//
-//   By default the object must support RefCounted or you will get a compiler
-//   error. If you're passing between threads, be sure it's
-//   RefCountedThreadSafe! See "Advanced binding of member functions" below if
-//   you don't want to use reference counting.
-//
-// RUNNING A CALLBACK
-//
-//   Callbacks can be run with their "Run" method, which has the same
-//   signature as the template argument to the callback.
-//
-//   void DoSomething(const base::Callback<void(int, std::string)>& callback) {
-//     callback.Run(5, "hello");
-//   }
-//
-//   Callbacks can be run more than once (they don't get deleted or marked when
-//   run). However, this precludes using base::Passed (see below).
-//
-//   void DoSomething(const base::Callback<double(double)>& callback) {
-//     double myresult = callback.Run(3.14159);
-//     myresult += callback.Run(2.71828);
-//   }
-//
-// PASSING UNBOUND INPUT PARAMETERS
-//
-//   Unbound parameters are specified at the time a callback is Run(). They are
-//   specified in the Callback template type:
-//
-//   void MyFunc(int i, const std::string& str) {}
-//   base::Callback<void(int, const std::string&)> cb = base::Bind(&MyFunc);
-//   cb.Run(23, "hello, world");
-//
-// PASSING BOUND INPUT PARAMETERS
-//
-//   Bound parameters are specified when you create thee callback as arguments
-//   to Bind(). They will be passed to the function and the Run()ner of the
-//   callback doesn't see those values or even know that the function it's
-//   calling.
-//
-//   void MyFunc(int i, const std::string& str) {}
-//   base::Callback<void(void)> cb = base::Bind(&MyFunc, 23, "hello world");
-//   cb.Run();
-//
-//   A callback with no unbound input parameters (base::Callback<void(void)>)
-//   is called a base::Closure. So we could have also written:
-//
-//   base::Closure cb = base::Bind(&MyFunc, 23, "hello world");
-//
-//   When calling member functions, bound parameters just go after the object
-//   pointer.
-//
-//   base::Closure cb = base::Bind(&MyClass::MyFunc, this, 23, "hello world");
-//
-// PARTIAL BINDING OF PARAMETERS
-//
-//   You can specify some parameters when you create the callback, and specify
-//   the rest when you execute the callback.
-//
-//   void MyFunc(int i, const std::string& str) {}
-//   base::Callback<void(const std::string&)> cb = base::Bind(&MyFunc, 23);
-//   cb.Run("hello world");
-//
-//   When calling a function bound parameters are first, followed by unbound
-//   parameters.
-//
-//
-// -----------------------------------------------------------------------------
-// Quick reference for advanced binding
-// -----------------------------------------------------------------------------
-//
-// BINDING A CLASS METHOD WITH WEAK POINTERS
-//
-//   base::Bind(&MyClass::Foo, GetWeakPtr());
-//
-//   The callback will not be run if the object has already been destroyed.
-//   DANGER: weak pointers are not threadsafe, so don't use this
-//   when passing between threads!
-//
-// BINDING A CLASS METHOD WITH MANUAL LIFETIME MANAGEMENT
-//
-//   base::Bind(&MyClass::Foo, base::Unretained(this));
-//
-//   This disables all lifetime management on the object. You're responsible
-//   for making sure the object is alive at the time of the call. You break it,
-//   you own it!
-//
-// BINDING A CLASS METHOD AND HAVING THE CALLBACK OWN THE CLASS
-//
-//   MyClass* myclass = new MyClass;
-//   base::Bind(&MyClass::Foo, base::Owned(myclass));
-//
-//   The object will be deleted when the callback is destroyed, even if it's
-//   not run (like if you post a task during shutdown). Potentially useful for
-//   "fire and forget" cases.
-//
-// IGNORING RETURN VALUES
-//
-//   Sometimes you want to call a function that returns a value in a callback
-//   that doesn't expect a return value.
-//
-//   int DoSomething(int arg) { cout << arg << endl; }
-//   base::Callback<void<int>) cb =
-//       base::Bind(base::IgnoreResult(&DoSomething));
-//
-//
-// -----------------------------------------------------------------------------
-// Quick reference for binding parameters to Bind()
-// -----------------------------------------------------------------------------
-//
-// Bound parameters are specified as arguments to Bind() and are passed to the
-// function. A callback with no parameters or no unbound parameters is called a
-// Closure (base::Callback<void(void)> and base::Closure are the same thing).
-//
-// PASSING PARAMETERS OWNED BY THE CALLBACK
-//
-//   void Foo(int* arg) { cout << *arg << endl; }
-//   int* pn = new int(1);
-//   base::Closure foo_callback = base::Bind(&foo, base::Owned(pn));
-//
-//   The parameter will be deleted when the callback is destroyed, even if it's
-//   not run (like if you post a task during shutdown).
-//
-// PASSING PARAMETERS AS A scoped_ptr
-//
-//   void TakesOwnership(scoped_ptr<Foo> arg) {}
-//   scoped_ptr<Foo> f(new Foo);
-//   // f becomes null during the following call.
-//   base::Closure cb = base::Bind(&TakesOwnership, base::Passed(&f));
-//
-//   Ownership of the parameter will be with the callback until the it is run,
-//   when ownership is passed to the callback function. This means the callback
-//   can only be run once. If the callback is never run, it will delete the
-//   object when it's destroyed.
-//
-// PASSING PARAMETERS AS A scoped_refptr
-//
-//   void TakesOneRef(scoped_refptr<Foo> arg) {}
-//   scoped_refptr<Foo> f(new Foo)
-//   base::Closure cb = base::Bind(&TakesOneRef, f);
-//
-//   This should "just work." The closure will take a reference as long as it
-//   is alive, and another reference will be taken for the called function.
-//
-// PASSING PARAMETERS BY REFERENCE
-//
-//   Const references are *copied* unless ConstRef is used. Example:
-//
-//   void foo(const int& arg) { printf("%d %p\n", arg, &arg); }
-//   int n = 1;
-//   base::Closure has_copy = base::Bind(&foo, n);
-//   base::Closure has_ref = base::Bind(&foo, base::ConstRef(n));
-//   n = 2;
-//   foo(n);                        // Prints "2 0xaaaaaaaaaaaa"
-//   has_copy.Run();                // Prints "1 0xbbbbbbbbbbbb"
-//   has_ref.Run();                 // Prints "2 0xaaaaaaaaaaaa"
-//
-//   Normally parameters are copied in the closure. DANGER: ConstRef stores a
-//   const reference instead, referencing the original parameter. This means
-//   that you must ensure the object outlives the callback!
-//
-//
-// -----------------------------------------------------------------------------
-// Implementation notes
-// -----------------------------------------------------------------------------
-//
-// WHERE IS THIS DESIGN FROM:
-//
-// The design Callback and Bind is heavily influenced by C++'s
-// tr1::function/tr1::bind, and by the "Google Callback" system used inside
-// Google.
-//
-//
-// HOW THE IMPLEMENTATION WORKS:
-//
-// There are three main components to the system:
-//   1) The Callback classes.
-//   2) The Bind() functions.
-//   3) The arguments wrappers (e.g., Unretained() and ConstRef()).
-//
-// The Callback classes represent a generic function pointer. Internally,
-// it stores a refcounted piece of state that represents the target function
-// and all its bound parameters.  Each Callback specialization has a templated
-// constructor that takes an BindState<>*.  In the context of the constructor,
-// the static type of this BindState<> pointer uniquely identifies the
-// function it is representing, all its bound parameters, and a Run() method
-// that is capable of invoking the target.
-//
-// Callback's constructor takes the BindState<>* that has the full static type
-// and erases the target function type as well as the types of the bound
-// parameters.  It does this by storing a pointer to the specific Run()
-// function, and upcasting the state of BindState<>* to a
-// BindStateBase*. This is safe as long as this BindStateBase pointer
-// is only used with the stored Run() pointer.
-//
-// To BindState<> objects are created inside the Bind() functions.
-// These functions, along with a set of internal templates, are responsible for
-//
-//  - Unwrapping the function signature into return type, and parameters
-//  - Determining the number of parameters that are bound
-//  - Creating the BindState storing the bound parameters
-//  - Performing compile-time asserts to avoid error-prone behavior
-//  - Returning an Callback<> with an arity matching the number of unbound
-//    parameters and that knows the correct refcounting semantics for the
-//    target object if we are binding a method.
-//
-// The Bind functions do the above using type-inference, and template
-// specializations.
-//
-// By default Bind() will store copies of all bound parameters, and attempt
-// to refcount a target object if the function being bound is a class method.
-// These copies are created even if the function takes parameters as const
-// references. (Binding to non-const references is forbidden, see bind.h.)
-//
-// To change this behavior, we introduce a set of argument wrappers
-// (e.g., Unretained(), and ConstRef()).  These are simple container templates
-// that are passed by value, and wrap a pointer to argument.  See the
-// file-level comment in base/bind_helpers.h for more info.
-//
-// These types are passed to the Unwrap() functions, and the MaybeRefcount()
-// functions respectively to modify the behavior of Bind().  The Unwrap()
-// and MaybeRefcount() functions change behavior by doing partial
-// specialization based on whether or not a parameter is a wrapper type.
-//
-// ConstRef() is similar to tr1::cref.  Unretained() is specific to Chromium.
-//
-//
-// WHY NOT TR1 FUNCTION/BIND?
-//
-// Direct use of tr1::function and tr1::bind was considered, but ultimately
-// rejected because of the number of copy constructors invocations involved
-// in the binding of arguments during construction, and the forwarding of
-// arguments during invocation.  These copies will no longer be an issue in
-// C++0x because C++0x will support rvalue reference allowing for the compiler
-// to avoid these copies.  However, waiting for C++0x is not an option.
-//
-// Measured with valgrind on gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5), the
-// tr1::bind call itself will invoke a non-trivial copy constructor three times
-// for each bound parameter.  Also, each when passing a tr1::function, each
-// bound argument will be copied again.
-//
-// In addition to the copies taken at binding and invocation, copying a
-// tr1::function causes a copy to be made of all the bound parameters and
-// state.
-//
-// Furthermore, in Chromium, it is desirable for the Callback to take a
-// reference on a target object when representing a class method call.  This
-// is not supported by tr1.
-//
-// Lastly, tr1::function and tr1::bind has a more general and flexible API.
-// This includes things like argument reordering by use of
-// tr1::bind::placeholder, support for non-const reference parameters, and some
-// limited amount of subtyping of the tr1::function object (e.g.,
-// tr1::function<int(int)> is convertible to tr1::function<void(int)>).
-//
-// These are not features that are required in Chromium. Some of them, such as
-// allowing for reference parameters, and subtyping of functions, may actually
-// become a source of errors. Removing support for these features actually
-// allows for a simpler implementation, and a terser Currying API.
-//
-//
-// WHY NOT GOOGLE CALLBACKS?
-//
-// The Google callback system also does not support refcounting.  Furthermore,
-// its implementation has a number of strange edge cases with respect to type
-// conversion of its arguments.  In particular, the argument's constness must
-// at times match exactly the function signature, or the type-inference might
-// break.  Given the above, writing a custom solution was easier.
-//
-//
-// MISSING FUNCTIONALITY
-//  - Invoking the return of Bind.  Bind(&foo).Run() does not work;
-//  - Binding arrays to functions that take a non-const pointer.
-//    Example:
-//      void Foo(const char* ptr);
-//      void Bar(char* ptr);
-//      Bind(&Foo, "test");
-//      Bind(&Bar, "test");  // This fails because ptr is not const.
-
 namespace base {
 
-// First, we forward declare the Callback class template. This informs the
-// compiler that the template only has 1 type parameter which is the function
-// signature that the Callback is representing.
-//
-// After this, create template specializations for 0-7 parameters. Note that
-// even though the template typelist grows, the specialization still
-// only has one type: the function signature.
-//
-// If you are thinking of forward declaring Callback in your own header file,
-// please include "base/callback_forward.h" instead.
-template <typename Sig>
-class Callback;
-
-namespace cef_internal {
-template <typename Runnable, typename RunType, typename BoundArgsType>
-struct BindState;
-}  // namespace cef_internal
-
-template <typename R>
-class Callback<R(void)> : public cef_internal::CallbackBase {
+template <typename R, typename... Args>
+class OnceCallback<R(Args...)> : public cef_internal::CallbackBase {
  public:
-  typedef R(RunType)();
+  using ResultType = R;
+  using RunType = R(Args...);
+  using PolymorphicInvoke = R (*)(cef_internal::BindStateBase*,
+                                  cef_internal::PassingType<Args>...);
 
-  Callback() : CallbackBase(NULL) {}
+  constexpr OnceCallback() = default;
+  OnceCallback(std::nullptr_t) = delete;
 
-  // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
-  // return the exact Callback<> type.  See base/bind.h for details.
-  template <typename Runnable, typename BindRunType, typename BoundArgsType>
-  Callback(
-      cef_internal::BindState<Runnable, BindRunType, BoundArgsType>* bind_state)
-      : CallbackBase(bind_state) {
-    // Force the assignment to a local variable of PolymorphicInvoke
-    // so the compiler will typecheck that the passed in Run() method has
-    // the correct type.
-    PolymorphicInvoke invoke_func =
-        &cef_internal::BindState<Runnable, BindRunType,
-                                 BoundArgsType>::InvokerType::Run;
-    polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
+  explicit OnceCallback(cef_internal::BindStateBase* bind_state)
+      : cef_internal::CallbackBase(bind_state) {}
+
+  OnceCallback(const OnceCallback&) = delete;
+  OnceCallback& operator=(const OnceCallback&) = delete;
+
+  OnceCallback(OnceCallback&&) noexcept = default;
+  OnceCallback& operator=(OnceCallback&&) noexcept = default;
+
+  OnceCallback(RepeatingCallback<RunType> other)
+      : cef_internal::CallbackBase(std::move(other)) {}
+
+  OnceCallback& operator=(RepeatingCallback<RunType> other) {
+    static_cast<cef_internal::CallbackBase&>(*this) = std::move(other);
+    return *this;
   }
 
-  bool Equals(const Callback& other) const {
-    return CallbackBase::Equals(other);
+  R Run(Args... args) const& {
+    static_assert(!sizeof(*this),
+                  "OnceCallback::Run() may only be invoked on a non-const "
+                  "rvalue, i.e. std::move(callback).Run().");
+    NOTREACHED();
   }
 
-  R Run() const {
+  R Run(Args... args) && {
+    // Move the callback instance into a local variable before the invocation,
+    // that ensures the internal state is cleared after the invocation.
+    // It's not safe to touch |this| after the invocation, since running the
+    // bound function may destroy |this|.
+    OnceCallback cb = std::move(*this);
     PolymorphicInvoke f =
-        reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
-
-    return f(bind_state_.get());
+        reinterpret_cast<PolymorphicInvoke>(cb.polymorphic_invoke());
+    return f(cb.bind_state_.get(), std::forward<Args>(args)...);
   }
 
- private:
-  typedef R (*PolymorphicInvoke)(cef_internal::BindStateBase*);
+  // Then() returns a new OnceCallback that receives the same arguments as
+  // |this|, and with the return type of |then|. The returned callback will:
+  // 1) Run the functor currently bound to |this| callback.
+  // 2) Run the |then| callback with the result from step 1 as its single
+  //    argument.
+  // 3) Return the value from running the |then| callback.
+  //
+  // Since this method generates a callback that is a replacement for `this`,
+  // `this` will be consumed and reset to a null callback to ensure the
+  // originally-bound functor can be run at most once.
+  template <typename ThenR, typename... ThenArgs>
+  OnceCallback<ThenR(Args...)> Then(OnceCallback<ThenR(ThenArgs...)> then) && {
+    CHECK(then);
+    return BindOnce(
+        cef_internal::ThenHelper<
+            OnceCallback, OnceCallback<ThenR(ThenArgs...)>>::CreateTrampoline(),
+        std::move(*this), std::move(then));
+  }
+
+  // This overload is required; even though RepeatingCallback is implicitly
+  // convertible to OnceCallback, that conversion will not used when matching
+  // for template argument deduction.
+  template <typename ThenR, typename... ThenArgs>
+  OnceCallback<ThenR(Args...)> Then(
+      RepeatingCallback<ThenR(ThenArgs...)> then) && {
+    CHECK(then);
+    return BindOnce(
+        cef_internal::ThenHelper<
+            OnceCallback,
+            RepeatingCallback<ThenR(ThenArgs...)>>::CreateTrampoline(),
+        std::move(*this), std::move(then));
+  }
 };
 
-template <typename R, typename A1>
-class Callback<R(A1)> : public cef_internal::CallbackBase {
+template <typename R, typename... Args>
+class RepeatingCallback<R(Args...)>
+    : public cef_internal::CallbackBaseCopyable {
  public:
-  typedef R(RunType)(A1);
+  using ResultType = R;
+  using RunType = R(Args...);
+  using PolymorphicInvoke = R (*)(cef_internal::BindStateBase*,
+                                  cef_internal::PassingType<Args>...);
 
-  Callback() : CallbackBase(NULL) {}
+  constexpr RepeatingCallback() = default;
+  RepeatingCallback(std::nullptr_t) = delete;
 
-  // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
-  // return the exact Callback<> type.  See base/bind.h for details.
-  template <typename Runnable, typename BindRunType, typename BoundArgsType>
-  Callback(
-      cef_internal::BindState<Runnable, BindRunType, BoundArgsType>* bind_state)
-      : CallbackBase(bind_state) {
-    // Force the assignment to a local variable of PolymorphicInvoke
-    // so the compiler will typecheck that the passed in Run() method has
-    // the correct type.
-    PolymorphicInvoke invoke_func =
-        &cef_internal::BindState<Runnable, BindRunType,
-                                 BoundArgsType>::InvokerType::Run;
-    polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
+  explicit RepeatingCallback(cef_internal::BindStateBase* bind_state)
+      : cef_internal::CallbackBaseCopyable(bind_state) {}
+
+  // Copyable and movable.
+  RepeatingCallback(const RepeatingCallback&) = default;
+  RepeatingCallback& operator=(const RepeatingCallback&) = default;
+  RepeatingCallback(RepeatingCallback&&) noexcept = default;
+  RepeatingCallback& operator=(RepeatingCallback&&) noexcept = default;
+
+  bool operator==(const RepeatingCallback& other) const {
+    return EqualsInternal(other);
   }
 
-  bool Equals(const Callback& other) const {
-    return CallbackBase::Equals(other);
+  bool operator!=(const RepeatingCallback& other) const {
+    return !operator==(other);
   }
 
-  R Run(typename cef_internal::CallbackParamTraits<A1>::ForwardType a1) const {
+  R Run(Args... args) const& {
     PolymorphicInvoke f =
-        reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
-
-    return f(bind_state_.get(), cef_internal::CallbackForward(a1));
+        reinterpret_cast<PolymorphicInvoke>(this->polymorphic_invoke());
+    return f(this->bind_state_.get(), std::forward<Args>(args)...);
   }
 
- private:
-  typedef R (*PolymorphicInvoke)(
-      cef_internal::BindStateBase*,
-      typename cef_internal::CallbackParamTraits<A1>::ForwardType);
-};
-
-template <typename R, typename A1, typename A2>
-class Callback<R(A1, A2)> : public cef_internal::CallbackBase {
- public:
-  typedef R(RunType)(A1, A2);
-
-  Callback() : CallbackBase(NULL) {}
-
-  // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
-  // return the exact Callback<> type.  See base/bind.h for details.
-  template <typename Runnable, typename BindRunType, typename BoundArgsType>
-  Callback(
-      cef_internal::BindState<Runnable, BindRunType, BoundArgsType>* bind_state)
-      : CallbackBase(bind_state) {
-    // Force the assignment to a local variable of PolymorphicInvoke
-    // so the compiler will typecheck that the passed in Run() method has
-    // the correct type.
-    PolymorphicInvoke invoke_func =
-        &cef_internal::BindState<Runnable, BindRunType,
-                                 BoundArgsType>::InvokerType::Run;
-    polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
-  }
-
-  bool Equals(const Callback& other) const {
-    return CallbackBase::Equals(other);
-  }
-
-  R Run(typename cef_internal::CallbackParamTraits<A1>::ForwardType a1,
-        typename cef_internal::CallbackParamTraits<A2>::ForwardType a2) const {
+  R Run(Args... args) && {
+    // Move the callback instance into a local variable before the invocation,
+    // that ensures the internal state is cleared after the invocation.
+    // It's not safe to touch |this| after the invocation, since running the
+    // bound function may destroy |this|.
+    RepeatingCallback cb = std::move(*this);
     PolymorphicInvoke f =
-        reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
-
-    return f(bind_state_.get(), cef_internal::CallbackForward(a1),
-             cef_internal::CallbackForward(a2));
+        reinterpret_cast<PolymorphicInvoke>(cb.polymorphic_invoke());
+    return f(std::move(cb).bind_state_.get(), std::forward<Args>(args)...);
   }
 
- private:
-  typedef R (*PolymorphicInvoke)(
-      cef_internal::BindStateBase*,
-      typename cef_internal::CallbackParamTraits<A1>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A2>::ForwardType);
+  // Then() returns a new RepeatingCallback that receives the same arguments as
+  // |this|, and with the return type of |then|. The
+  // returned callback will:
+  // 1) Run the functor currently bound to |this| callback.
+  // 2) Run the |then| callback with the result from step 1 as its single
+  //    argument.
+  // 3) Return the value from running the |then| callback.
+  //
+  // If called on an rvalue (e.g. std::move(cb).Then(...)), this method
+  // generates a callback that is a replacement for `this`. Therefore, `this`
+  // will be consumed and reset to a null callback to ensure the
+  // originally-bound functor will be run at most once.
+  template <typename ThenR, typename... ThenArgs>
+  RepeatingCallback<ThenR(Args...)> Then(
+      RepeatingCallback<ThenR(ThenArgs...)> then) const& {
+    CHECK(then);
+    return BindRepeating(
+        cef_internal::ThenHelper<
+            RepeatingCallback,
+            RepeatingCallback<ThenR(ThenArgs...)>>::CreateTrampoline(),
+        *this, std::move(then));
+  }
+
+  template <typename ThenR, typename... ThenArgs>
+  RepeatingCallback<ThenR(Args...)> Then(
+      RepeatingCallback<ThenR(ThenArgs...)> then) && {
+    CHECK(then);
+    return BindRepeating(
+        cef_internal::ThenHelper<
+            RepeatingCallback,
+            RepeatingCallback<ThenR(ThenArgs...)>>::CreateTrampoline(),
+        std::move(*this), std::move(then));
+  }
 };
 
-template <typename R, typename A1, typename A2, typename A3>
-class Callback<R(A1, A2, A3)> : public cef_internal::CallbackBase {
- public:
-  typedef R(RunType)(A1, A2, A3);
-
-  Callback() : CallbackBase(NULL) {}
-
-  // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
-  // return the exact Callback<> type.  See base/bind.h for details.
-  template <typename Runnable, typename BindRunType, typename BoundArgsType>
-  Callback(
-      cef_internal::BindState<Runnable, BindRunType, BoundArgsType>* bind_state)
-      : CallbackBase(bind_state) {
-    // Force the assignment to a local variable of PolymorphicInvoke
-    // so the compiler will typecheck that the passed in Run() method has
-    // the correct type.
-    PolymorphicInvoke invoke_func =
-        &cef_internal::BindState<Runnable, BindRunType,
-                                 BoundArgsType>::InvokerType::Run;
-    polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
-  }
-
-  bool Equals(const Callback& other) const {
-    return CallbackBase::Equals(other);
-  }
-
-  R Run(typename cef_internal::CallbackParamTraits<A1>::ForwardType a1,
-        typename cef_internal::CallbackParamTraits<A2>::ForwardType a2,
-        typename cef_internal::CallbackParamTraits<A3>::ForwardType a3) const {
-    PolymorphicInvoke f =
-        reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
-
-    return f(bind_state_.get(), cef_internal::CallbackForward(a1),
-             cef_internal::CallbackForward(a2),
-             cef_internal::CallbackForward(a3));
-  }
-
- private:
-  typedef R (*PolymorphicInvoke)(
-      cef_internal::BindStateBase*,
-      typename cef_internal::CallbackParamTraits<A1>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A2>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A3>::ForwardType);
-};
-
-template <typename R, typename A1, typename A2, typename A3, typename A4>
-class Callback<R(A1, A2, A3, A4)> : public cef_internal::CallbackBase {
- public:
-  typedef R(RunType)(A1, A2, A3, A4);
-
-  Callback() : CallbackBase(NULL) {}
-
-  // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
-  // return the exact Callback<> type.  See base/bind.h for details.
-  template <typename Runnable, typename BindRunType, typename BoundArgsType>
-  Callback(
-      cef_internal::BindState<Runnable, BindRunType, BoundArgsType>* bind_state)
-      : CallbackBase(bind_state) {
-    // Force the assignment to a local variable of PolymorphicInvoke
-    // so the compiler will typecheck that the passed in Run() method has
-    // the correct type.
-    PolymorphicInvoke invoke_func =
-        &cef_internal::BindState<Runnable, BindRunType,
-                                 BoundArgsType>::InvokerType::Run;
-    polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
-  }
-
-  bool Equals(const Callback& other) const {
-    return CallbackBase::Equals(other);
-  }
-
-  R Run(typename cef_internal::CallbackParamTraits<A1>::ForwardType a1,
-        typename cef_internal::CallbackParamTraits<A2>::ForwardType a2,
-        typename cef_internal::CallbackParamTraits<A3>::ForwardType a3,
-        typename cef_internal::CallbackParamTraits<A4>::ForwardType a4) const {
-    PolymorphicInvoke f =
-        reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
-
-    return f(bind_state_.get(), cef_internal::CallbackForward(a1),
-             cef_internal::CallbackForward(a2),
-             cef_internal::CallbackForward(a3),
-             cef_internal::CallbackForward(a4));
-  }
-
- private:
-  typedef R (*PolymorphicInvoke)(
-      cef_internal::BindStateBase*,
-      typename cef_internal::CallbackParamTraits<A1>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A2>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A3>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A4>::ForwardType);
-};
-
-template <typename R,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5>
-class Callback<R(A1, A2, A3, A4, A5)> : public cef_internal::CallbackBase {
- public:
-  typedef R(RunType)(A1, A2, A3, A4, A5);
-
-  Callback() : CallbackBase(NULL) {}
-
-  // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
-  // return the exact Callback<> type.  See base/bind.h for details.
-  template <typename Runnable, typename BindRunType, typename BoundArgsType>
-  Callback(
-      cef_internal::BindState<Runnable, BindRunType, BoundArgsType>* bind_state)
-      : CallbackBase(bind_state) {
-    // Force the assignment to a local variable of PolymorphicInvoke
-    // so the compiler will typecheck that the passed in Run() method has
-    // the correct type.
-    PolymorphicInvoke invoke_func =
-        &cef_internal::BindState<Runnable, BindRunType,
-                                 BoundArgsType>::InvokerType::Run;
-    polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
-  }
-
-  bool Equals(const Callback& other) const {
-    return CallbackBase::Equals(other);
-  }
-
-  R Run(typename cef_internal::CallbackParamTraits<A1>::ForwardType a1,
-        typename cef_internal::CallbackParamTraits<A2>::ForwardType a2,
-        typename cef_internal::CallbackParamTraits<A3>::ForwardType a3,
-        typename cef_internal::CallbackParamTraits<A4>::ForwardType a4,
-        typename cef_internal::CallbackParamTraits<A5>::ForwardType a5) const {
-    PolymorphicInvoke f =
-        reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
-
-    return f(
-        bind_state_.get(), cef_internal::CallbackForward(a1),
-        cef_internal::CallbackForward(a2), cef_internal::CallbackForward(a3),
-        cef_internal::CallbackForward(a4), cef_internal::CallbackForward(a5));
-  }
-
- private:
-  typedef R (*PolymorphicInvoke)(
-      cef_internal::BindStateBase*,
-      typename cef_internal::CallbackParamTraits<A1>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A2>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A3>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A4>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A5>::ForwardType);
-};
-
-template <typename R,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6>
-class Callback<R(A1, A2, A3, A4, A5, A6)> : public cef_internal::CallbackBase {
- public:
-  typedef R(RunType)(A1, A2, A3, A4, A5, A6);
-
-  Callback() : CallbackBase(NULL) {}
-
-  // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
-  // return the exact Callback<> type.  See base/bind.h for details.
-  template <typename Runnable, typename BindRunType, typename BoundArgsType>
-  Callback(
-      cef_internal::BindState<Runnable, BindRunType, BoundArgsType>* bind_state)
-      : CallbackBase(bind_state) {
-    // Force the assignment to a local variable of PolymorphicInvoke
-    // so the compiler will typecheck that the passed in Run() method has
-    // the correct type.
-    PolymorphicInvoke invoke_func =
-        &cef_internal::BindState<Runnable, BindRunType,
-                                 BoundArgsType>::InvokerType::Run;
-    polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
-  }
-
-  bool Equals(const Callback& other) const {
-    return CallbackBase::Equals(other);
-  }
-
-  R Run(typename cef_internal::CallbackParamTraits<A1>::ForwardType a1,
-        typename cef_internal::CallbackParamTraits<A2>::ForwardType a2,
-        typename cef_internal::CallbackParamTraits<A3>::ForwardType a3,
-        typename cef_internal::CallbackParamTraits<A4>::ForwardType a4,
-        typename cef_internal::CallbackParamTraits<A5>::ForwardType a5,
-        typename cef_internal::CallbackParamTraits<A6>::ForwardType a6) const {
-    PolymorphicInvoke f =
-        reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
-
-    return f(
-        bind_state_.get(), cef_internal::CallbackForward(a1),
-        cef_internal::CallbackForward(a2), cef_internal::CallbackForward(a3),
-        cef_internal::CallbackForward(a4), cef_internal::CallbackForward(a5),
-        cef_internal::CallbackForward(a6));
-  }
-
- private:
-  typedef R (*PolymorphicInvoke)(
-      cef_internal::BindStateBase*,
-      typename cef_internal::CallbackParamTraits<A1>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A2>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A3>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A4>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A5>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A6>::ForwardType);
-};
-
-template <typename R,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6,
-          typename A7>
-class Callback<R(A1, A2, A3, A4, A5, A6, A7)>
-    : public cef_internal::CallbackBase {
- public:
-  typedef R(RunType)(A1, A2, A3, A4, A5, A6, A7);
-
-  Callback() : CallbackBase(NULL) {}
-
-  // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
-  // return the exact Callback<> type.  See base/bind.h for details.
-  template <typename Runnable, typename BindRunType, typename BoundArgsType>
-  Callback(
-      cef_internal::BindState<Runnable, BindRunType, BoundArgsType>* bind_state)
-      : CallbackBase(bind_state) {
-    // Force the assignment to a local variable of PolymorphicInvoke
-    // so the compiler will typecheck that the passed in Run() method has
-    // the correct type.
-    PolymorphicInvoke invoke_func =
-        &cef_internal::BindState<Runnable, BindRunType,
-                                 BoundArgsType>::InvokerType::Run;
-    polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
-  }
-
-  bool Equals(const Callback& other) const {
-    return CallbackBase::Equals(other);
-  }
-
-  R Run(typename cef_internal::CallbackParamTraits<A1>::ForwardType a1,
-        typename cef_internal::CallbackParamTraits<A2>::ForwardType a2,
-        typename cef_internal::CallbackParamTraits<A3>::ForwardType a3,
-        typename cef_internal::CallbackParamTraits<A4>::ForwardType a4,
-        typename cef_internal::CallbackParamTraits<A5>::ForwardType a5,
-        typename cef_internal::CallbackParamTraits<A6>::ForwardType a6,
-        typename cef_internal::CallbackParamTraits<A7>::ForwardType a7) const {
-    PolymorphicInvoke f =
-        reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
-
-    return f(
-        bind_state_.get(), cef_internal::CallbackForward(a1),
-        cef_internal::CallbackForward(a2), cef_internal::CallbackForward(a3),
-        cef_internal::CallbackForward(a4), cef_internal::CallbackForward(a5),
-        cef_internal::CallbackForward(a6), cef_internal::CallbackForward(a7));
-  }
-
- private:
-  typedef R (*PolymorphicInvoke)(
-      cef_internal::BindStateBase*,
-      typename cef_internal::CallbackParamTraits<A1>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A2>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A3>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A4>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A5>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A6>::ForwardType,
-      typename cef_internal::CallbackParamTraits<A7>::ForwardType);
-};
-
-// Syntactic sugar to make Callbacks<void(void)> easier to declare since it
-// will be used in a lot of APIs with delayed execution.
-typedef Callback<void(void)> Closure;
-
 }  // namespace base
 
 #endif  // !USING_CHROMIUM_INCLUDES
diff --git a/src/include/base/cef_callback_forward.h b/src/include/base/cef_callback_forward.h
index d604d7c..2d22774 100644
--- a/src/include/base/cef_callback_forward.h
+++ b/src/include/base/cef_callback_forward.h
@@ -32,14 +32,9 @@
 #define INCLUDE_BASE_CEF_CALLBACK_FORWARD_H_
 #pragma once
 
-#if defined(BASE_CALLBACK_FORWARD_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)
+#if defined(USING_CHROMIUM_INCLUDES)
 // When building CEF include the Chromium header directly.
-#include "base/callback_forward.h"
+#include "base/functional/callback_forward.h"
 #else  // !USING_CHROMIUM_INCLUDES
 // The following is substantially similar to the Chromium implementation.
 // If the Chromium implementation diverges the below implementation should be
@@ -47,10 +42,19 @@
 
 namespace base {
 
-template <typename Sig>
-class Callback;
+template <typename Signature>
+class OnceCallback;
 
-typedef Callback<void(void)> Closure;
+template <typename Signature>
+class RepeatingCallback;
+
+///
+/// Syntactic sugar to make OnceClosure<void()> and RepeatingClosure<void()>
+/// easier to declare since they will be used in a lot of APIs with delayed
+/// execution.
+///
+using OnceClosure = OnceCallback<void()>;
+using RepeatingClosure = RepeatingCallback<void()>;
 
 }  // namespace base
 
diff --git a/src/include/base/cef_callback_helpers.h b/src/include/base/cef_callback_helpers.h
index ebe074a..5e38644 100644
--- a/src/include/base/cef_callback_helpers.h
+++ b/src/include/base/cef_callback_helpers.h
@@ -32,60 +32,228 @@
 // are implemented using templates, with a class per callback signature, adding
 // methods to Callback<> itself is unattractive (lots of extra code gets
 // generated).  Instead, consider adding methods here.
-//
-// ResetAndReturn(&cb) is like cb.Reset() but allows executing a callback (via a
-// copy) after the original callback is Reset().  This can be handy if Run()
-// reads/writes the variable holding the Callback.
 
 #ifndef CEF_INCLUDE_BASE_CEF_CALLBACK_HELPERS_H_
 #define CEF_INCLUDE_BASE_CEF_CALLBACK_HELPERS_H_
 #pragma once
 
-#if defined(BASE_CALLBACK_HELPERS_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)
+#if defined(USING_CHROMIUM_INCLUDES)
 // When building CEF include the Chromium header directly.
-#include "base/callback_helpers.h"
+#include "base/functional/callback_helpers.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/cef_basictypes.h"
-#include "include/base/cef_build.h"
+#include <atomic>
+#include <memory>
+#include <type_traits>
+#include <utility>
+
+#include "include/base/cef_bind.h"
 #include "include/base/cef_callback.h"
-#include "include/base/cef_macros.h"
+#include "include/base/cef_logging.h"
 
 namespace base {
 
-template <typename Sig>
-base::Callback<Sig> ResetAndReturn(base::Callback<Sig>* cb) {
-  base::Callback<Sig> ret(*cb);
-  cb->Reset();
-  return ret;
+namespace internal {
+
+template <typename T>
+struct IsBaseCallbackImpl : std::false_type {};
+
+template <typename R, typename... Args>
+struct IsBaseCallbackImpl<OnceCallback<R(Args...)>> : std::true_type {};
+
+template <typename R, typename... Args>
+struct IsBaseCallbackImpl<RepeatingCallback<R(Args...)>> : std::true_type {};
+
+template <typename T>
+struct IsOnceCallbackImpl : std::false_type {};
+
+template <typename R, typename... Args>
+struct IsOnceCallbackImpl<OnceCallback<R(Args...)>> : std::true_type {};
+
+}  // namespace internal
+
+///
+/// IsBaseCallback<T>::value is true when T is any of the Closure or Callback
+/// family of types.
+///
+template <typename T>
+using IsBaseCallback = internal::IsBaseCallbackImpl<std::decay_t<T>>;
+
+///
+/// IsOnceCallback<T>::value is true when T is a OnceClosure or OnceCallback
+/// type.
+///
+template <typename T>
+using IsOnceCallback = internal::IsOnceCallbackImpl<std::decay_t<T>>;
+
+///
+/// SFINAE friendly enabler allowing to overload methods for both Repeating and
+/// OnceCallbacks.
+///
+/// Usage:
+/// <pre>
+///   template <template <typename> class CallbackType,
+///             ... other template args ...,
+///             typename = EnableIfIsBaseCallback<CallbackType>>
+///   void DoStuff(CallbackType<...> cb, ...);
+/// </pre>
+///
+template <template <typename> class CallbackType>
+using EnableIfIsBaseCallback =
+    std::enable_if_t<IsBaseCallback<CallbackType<void()>>::value>;
+
+namespace internal {
+
+template <typename... Args>
+class OnceCallbackHolder final {
+ public:
+  OnceCallbackHolder(OnceCallback<void(Args...)> callback,
+                     bool ignore_extra_runs)
+      : callback_(std::move(callback)), ignore_extra_runs_(ignore_extra_runs) {
+    DCHECK(callback_);
+  }
+  OnceCallbackHolder(const OnceCallbackHolder&) = delete;
+  OnceCallbackHolder& operator=(const OnceCallbackHolder&) = delete;
+
+  void Run(Args... args) {
+    if (has_run_.exchange(true)) {
+      CHECK(ignore_extra_runs_) << "Both OnceCallbacks returned by "
+                                   "base::SplitOnceCallback() were run. "
+                                   "At most one of the pair should be run.";
+      return;
+    }
+    DCHECK(callback_);
+    std::move(callback_).Run(std::forward<Args>(args)...);
+  }
+
+ private:
+  volatile std::atomic_bool has_run_{false};
+  base::OnceCallback<void(Args...)> callback_;
+  const bool ignore_extra_runs_;
+};
+
+}  // namespace internal
+
+///
+/// Wraps the given OnceCallback into a RepeatingCallback that relays its
+/// invocation to the original OnceCallback on the first invocation. The
+/// following invocations are just ignored.
+///
+/// Note that this deliberately subverts the Once/Repeating paradigm of
+/// Callbacks but helps ease the migration from old-style Callbacks. Avoid if
+/// possible; use if necessary for migration.
+///
+// TODO(tzik): Remove it. https://crbug.com/730593
+template <typename... Args>
+RepeatingCallback<void(Args...)> AdaptCallbackForRepeating(
+    OnceCallback<void(Args...)> callback) {
+  using Helper = internal::OnceCallbackHolder<Args...>;
+  return base::BindRepeating(
+      &Helper::Run, std::make_unique<Helper>(std::move(callback),
+                                             /*ignore_extra_runs=*/true));
 }
 
-// ScopedClosureRunner is akin to scoped_ptr for Closures. It ensures that the
-// Closure is executed and deleted no matter how the current scope exits.
+///
+/// Wraps the given OnceCallback and returns two OnceCallbacks with an identical
+/// signature. On first invokation of either returned callbacks, the original
+/// callback is invoked. Invoking the remaining callback results in a crash.
+///
+template <typename... Args>
+std::pair<OnceCallback<void(Args...)>, OnceCallback<void(Args...)>>
+SplitOnceCallback(OnceCallback<void(Args...)> callback) {
+  using Helper = internal::OnceCallbackHolder<Args...>;
+  auto wrapped_once = base::BindRepeating(
+      &Helper::Run, std::make_unique<Helper>(std::move(callback),
+                                             /*ignore_extra_runs=*/false));
+  return std::make_pair(wrapped_once, wrapped_once);
+}
+
+///
+/// ScopedClosureRunner is akin to std::unique_ptr<> for Closures. It ensures
+/// that the Closure is executed no matter how the current scope exits.
+/// If you are looking for "ScopedCallback", "CallbackRunner", or
+/// "CallbackScoper" this is the class you want.
+///
 class ScopedClosureRunner {
  public:
   ScopedClosureRunner();
-  explicit ScopedClosureRunner(const Closure& closure);
+  explicit ScopedClosureRunner(OnceClosure closure);
+  ScopedClosureRunner(ScopedClosureRunner&& other);
+  // Runs the current closure if it's set, then replaces it with the closure
+  // from |other|. This is akin to how unique_ptr frees the contained pointer in
+  // its move assignment operator. If you need to explicitly avoid running any
+  // current closure, use ReplaceClosure().
+  ScopedClosureRunner& operator=(ScopedClosureRunner&& other);
   ~ScopedClosureRunner();
 
-  void Reset();
-  void Reset(const Closure& closure);
-  Closure Release() WARN_UNUSED_RESULT;
+  explicit operator bool() const { return !!closure_; }
+
+  // Calls the current closure and resets it, so it wont be called again.
+  void RunAndReset();
+
+  // Replaces closure with the new one releasing the old one without calling it.
+  void ReplaceClosure(OnceClosure closure);
+
+  // Releases the Closure without calling.
+  [[nodiscard]] OnceClosure Release();
 
  private:
-  Closure closure_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedClosureRunner);
+  OnceClosure closure_;
 };
 
+///
+/// Creates a null callback.
+///
+class NullCallback {
+ public:
+  template <typename R, typename... Args>
+  operator RepeatingCallback<R(Args...)>() const {
+    return RepeatingCallback<R(Args...)>();
+  }
+  template <typename R, typename... Args>
+  operator OnceCallback<R(Args...)>() const {
+    return OnceCallback<R(Args...)>();
+  }
+};
+
+///
+/// Creates a callback that does nothing when called.
+///
+class DoNothing {
+ public:
+  template <typename... Args>
+  operator RepeatingCallback<void(Args...)>() const {
+    return Repeatedly<Args...>();
+  }
+  template <typename... Args>
+  operator OnceCallback<void(Args...)>() const {
+    return Once<Args...>();
+  }
+  // Explicit way of specifying a specific callback type when the compiler can't
+  // deduce it.
+  template <typename... Args>
+  static RepeatingCallback<void(Args...)> Repeatedly() {
+    return BindRepeating([](Args... args) {});
+  }
+  template <typename... Args>
+  static OnceCallback<void(Args...)> Once() {
+    return BindOnce([](Args... args) {});
+  }
+};
+
+///
+/// Useful for creating a Closure that will delete a pointer when invoked. Only
+/// use this when necessary. In most cases MessageLoop::DeleteSoon() is a better
+/// fit.
+///
+template <typename T>
+void DeletePointer(T* obj) {
+  delete obj;
+}
+
 }  // namespace base
 
 #endif  // !USING_CHROMIUM_INCLUDES
diff --git a/src/include/base/cef_callback_list.h b/src/include/base/cef_callback_list.h
index e0ef366..2038acb 100644
--- a/src/include/base/cef_callback_list.h
+++ b/src/include/base/cef_callback_list.h
@@ -28,419 +28,373 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+///
+/// \file
+/// A container for a list of callbacks. Provides callers the ability to
+/// manually or automatically unregister callbacks at any time, including during
+/// callback notification.
+///
+/// TYPICAL USAGE:
+///
+/// <pre>
+/// class MyWidget {
+///  public:
+///   using CallbackList = base::RepeatingCallbackList<void(const Foo&)>;
+///
+///   // Registers |cb| to be called whenever NotifyFoo() is executed.
+///   CallbackListSubscription RegisterCallback(CallbackList::CallbackType cb) {
+///     return callback_list_.Add(std::move(cb));
+///   }
+///
+///  private:
+///   // Calls all registered callbacks, with |foo| as the supplied arg.
+///   void NotifyFoo(const Foo& foo) {
+///     callback_list_.Notify(foo);
+///   }
+///
+///   CallbackList callback_list_;
+/// };
+///
+///
+/// class MyWidgetListener {
+///  private:
+///   void OnFoo(const Foo& foo) {
+///     // Called whenever MyWidget::NotifyFoo() is executed, unless
+///     // |foo_subscription_| has been destroyed.
+///   }
+///
+///   // Automatically deregisters the callback when deleted (e.g. in
+///   // ~MyWidgetListener()).  Unretained(this) is safe here since the
+///   // ScopedClosureRunner does not outlive |this|.
+///   CallbackListSubscription foo_subscription_ =
+///       MyWidget::Get()->RegisterCallback(
+///           base::BindRepeating(&MyWidgetListener::OnFoo,
+///                               base::Unretained(this)));
+/// };
+/// </pre>
+///
+/// UNSUPPORTED:
+///
+/// * Destroying the CallbackList during callback notification.
+///
+/// This is possible to support, but not currently necessary.
+///
+
 #ifndef CEF_INCLUDE_BASE_CEF_CALLBACK_LIST_H_
 #define CEF_INCLUDE_BASE_CEF_CALLBACK_LIST_H_
 #pragma once
 
-#if defined(BASE_CALLBACK_LIST_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)
+#if defined(USING_CHROMIUM_INCLUDES)
 // When building CEF include the Chromium header directly.
-#include "base/callback_list.h"
+#include "base/functional/callback_list.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 <algorithm>
 #include <list>
+#include <memory>
+#include <utility>
 
-#include "include/base/cef_basictypes.h"
-#include "include/base/cef_build.h"
+#include "include/base/cef_auto_reset.h"
+#include "include/base/cef_bind.h"
 #include "include/base/cef_callback.h"
+#include "include/base/cef_callback_helpers.h"
 #include "include/base/cef_logging.h"
-#include "include/base/cef_macros.h"
-#include "include/base/cef_scoped_ptr.h"
-#include "include/base/internal/cef_callback_internal.h"
-
-// OVERVIEW:
-//
-// A container for a list of callbacks.  Unlike a normal STL vector or list,
-// this container can be modified during iteration without invalidating the
-// iterator. It safely handles the case of a callback removing itself
-// or another callback from the list while callbacks are being run.
-//
-// TYPICAL USAGE:
-//
-// class MyWidget {
-//  public:
-//   ...
-//
-//   typedef base::Callback<void(const Foo&)> OnFooCallback;
-//
-//   scoped_ptr<base::CallbackList<void(const Foo&)>::Subscription>
-//   RegisterCallback(const OnFooCallback& cb) {
-//     return callback_list_.Add(cb);
-//   }
-//
-//  private:
-//   void NotifyFoo(const Foo& foo) {
-//      callback_list_.Notify(foo);
-//   }
-//
-//   base::CallbackList<void(const Foo&)> callback_list_;
-//
-//   DISALLOW_COPY_AND_ASSIGN(MyWidget);
-// };
-//
-//
-// class MyWidgetListener {
-//  public:
-//   MyWidgetListener::MyWidgetListener() {
-//     foo_subscription_ = MyWidget::GetCurrent()->RegisterCallback(
-//             base::Bind(&MyWidgetListener::OnFoo, this)));
-//   }
-//
-//   MyWidgetListener::~MyWidgetListener() {
-//      // Subscription gets deleted automatically and will deregister
-//      // the callback in the process.
-//   }
-//
-//  private:
-//   void OnFoo(const Foo& foo) {
-//     // Do something.
-//   }
-//
-//   scoped_ptr<base::CallbackList<void(const Foo&)>::Subscription>
-//       foo_subscription_;
-//
-//   DISALLOW_COPY_AND_ASSIGN(MyWidgetListener);
-// };
+#include "include/base/cef_weak_ptr.h"
 
 namespace base {
+namespace internal {
+template <typename CallbackListImpl>
+class CallbackListBase;
+}  // namespace internal
 
-namespace cef_internal {
+template <typename Signature>
+class OnceCallbackList;
 
-template <typename CallbackType>
+template <typename Signature>
+class RepeatingCallbackList;
+
+// A trimmed-down version of ScopedClosureRunner that can be used to guarantee a
+// closure is run on destruction. This is designed to be used by
+// CallbackListBase to run CancelCallback() when this subscription dies;
+// consumers can avoid callbacks on dead objects by ensuring the subscription
+// returned by CallbackListBase::Add() does not outlive the bound object in the
+// callback. A typical way to do this is to bind a callback to a member function
+// on `this` and store the returned subscription as a member variable.
+class CallbackListSubscription {
+ public:
+  CallbackListSubscription();
+  CallbackListSubscription(CallbackListSubscription&& subscription);
+  CallbackListSubscription& operator=(CallbackListSubscription&& subscription);
+  ~CallbackListSubscription();
+
+  explicit operator bool() const { return !!closure_; }
+
+ private:
+  template <typename T>
+  friend class internal::CallbackListBase;
+
+  explicit CallbackListSubscription(base::OnceClosure closure);
+
+  void Run();
+
+  OnceClosure closure_;
+};
+
+namespace internal {
+
+// From base/stl_util.h.
+template <class T, class Allocator, class Predicate>
+size_t EraseIf(std::list<T, Allocator>& container, Predicate pred) {
+  size_t old_size = container.size();
+  container.remove_if(pred);
+  return old_size - container.size();
+}
+
+// A traits class to break circular type dependencies between CallbackListBase
+// and its subclasses.
+template <typename CallbackList>
+struct CallbackListTraits;
+
+// NOTE: It's important that Callbacks provide iterator stability when items are
+// added to the end, so e.g. a std::vector<> is not suitable here.
+template <typename Signature>
+struct CallbackListTraits<OnceCallbackList<Signature>> {
+  using CallbackType = OnceCallback<Signature>;
+  using Callbacks = std::list<CallbackType>;
+};
+template <typename Signature>
+struct CallbackListTraits<RepeatingCallbackList<Signature>> {
+  using CallbackType = RepeatingCallback<Signature>;
+  using Callbacks = std::list<CallbackType>;
+};
+
+template <typename CallbackListImpl>
 class CallbackListBase {
  public:
-  class Subscription {
-   public:
-    Subscription(CallbackListBase<CallbackType>* list,
-                 typename std::list<CallbackType>::iterator iter)
-        : list_(list), iter_(iter) {}
+  using CallbackType =
+      typename CallbackListTraits<CallbackListImpl>::CallbackType;
+  static_assert(IsBaseCallback<CallbackType>::value, "");
 
-    ~Subscription() {
-      if (list_->active_iterator_count_) {
-        iter_->Reset();
-      } else {
-        list_->callbacks_.erase(iter_);
-        if (!list_->removal_callback_.is_null())
-          list_->removal_callback_.Run();
+  // TODO(crbug.com/1103086): Update references to use this directly and by
+  // value, then remove.
+  using Subscription = CallbackListSubscription;
+
+  CallbackListBase() = default;
+  CallbackListBase(const CallbackListBase&) = delete;
+  CallbackListBase& operator=(const CallbackListBase&) = delete;
+
+  ~CallbackListBase() {
+    // Destroying the list during iteration is unsupported and will cause a UAF.
+    CHECK(!iterating_);
+  }
+
+  // Registers |cb| for future notifications. Returns a CallbackListSubscription
+  // whose destruction will cancel |cb|.
+  [[nodiscard]] CallbackListSubscription Add(CallbackType cb) {
+    DCHECK(!cb.is_null());
+    return CallbackListSubscription(base::BindOnce(
+        &CallbackListBase::CancelCallback, weak_ptr_factory_.GetWeakPtr(),
+        callbacks_.insert(callbacks_.end(), std::move(cb))));
+  }
+
+  // Registers |cb| for future notifications. Provides no way for the caller to
+  // cancel, so this is only safe for cases where the callback is guaranteed to
+  // live at least as long as this list (e.g. if it's bound on the same object
+  // that owns the list).
+  // TODO(pkasting): Attempt to use Add() instead and see if callers can relax
+  // other lifetime/ordering mechanisms as a result.
+  void AddUnsafe(CallbackType cb) {
+    DCHECK(!cb.is_null());
+    callbacks_.push_back(std::move(cb));
+  }
+
+  // Registers |removal_callback| to be run after elements are removed from the
+  // list of registered callbacks.
+  void set_removal_callback(const RepeatingClosure& removal_callback) {
+    removal_callback_ = removal_callback;
+  }
+
+  // Returns whether the list of registered callbacks is empty (from an external
+  // perspective -- meaning no remaining callbacks are live).
+  bool empty() const {
+    return std::all_of(callbacks_.cbegin(), callbacks_.cend(),
+                       [](const auto& callback) { return callback.is_null(); });
+  }
+
+  // Calls all registered callbacks that are not canceled beforehand. If any
+  // callbacks are unregistered, notifies any registered removal callback at the
+  // end.
+  //
+  // Arguments must be copyable, since they must be supplied to all callbacks.
+  // Move-only types would be destructively modified by passing them to the
+  // first callback and not reach subsequent callbacks as intended.
+  //
+  // Notify() may be called re-entrantly, in which case the nested call
+  // completes before the outer one continues. Callbacks are only ever added at
+  // the end and canceled callbacks are not pruned from the list until the
+  // outermost iteration completes, so existing iterators should never be
+  // invalidated. However, this does mean that a callback added during a nested
+  // call can be notified by outer calls -- meaning it will be notified about
+  // things that happened before it was added -- if its subscription outlives
+  // the reentrant Notify() call.
+  template <typename... RunArgs>
+  void Notify(RunArgs&&... args) {
+    if (empty()) {
+      return;  // Nothing to do.
+    }
+
+    {
+      AutoReset<bool> iterating(&iterating_, true);
+
+      // Skip any callbacks that are canceled during iteration.
+      // NOTE: Since RunCallback() may call Add(), it's not safe to cache the
+      // value of callbacks_.end() across loop iterations.
+      const auto next_valid = [this](const auto it) {
+        return std::find_if_not(it, callbacks_.end(), [](const auto& callback) {
+          return callback.is_null();
+        });
+      };
+      for (auto it = next_valid(callbacks_.begin()); it != callbacks_.end();
+           it = next_valid(it)) {
+        // NOTE: Intentionally does not call std::forward<RunArgs>(args)...,
+        // since that would allow move-only arguments.
+        static_cast<CallbackListImpl*>(this)->RunCallback(it++, args...);
       }
     }
 
-   private:
-    CallbackListBase<CallbackType>* list_;
-    typename std::list<CallbackType>::iterator iter_;
+    // Re-entrant invocations shouldn't prune anything from the list. This can
+    // invalidate iterators from underneath higher call frames. It's safe to
+    // simply do nothing, since the outermost frame will continue through here
+    // and prune all null callbacks below.
+    if (iterating_) {
+      return;
+    }
 
-    DISALLOW_COPY_AND_ASSIGN(Subscription);
-  };
+    // Any null callbacks remaining in the list were canceled due to
+    // Subscription destruction during iteration, and can safely be erased now.
+    const size_t erased_callbacks =
+        EraseIf(callbacks_, [](const auto& cb) { return cb.is_null(); });
 
-  // Add a callback to the list. The callback will remain registered until the
-  // returned Subscription is destroyed, which must occur before the
-  // CallbackList is destroyed.
-  scoped_ptr<Subscription> Add(const CallbackType& cb) WARN_UNUSED_RESULT {
-    DCHECK(!cb.is_null());
-    return scoped_ptr<Subscription>(
-        new Subscription(this, callbacks_.insert(callbacks_.end(), cb)));
-  }
-
-  // Sets a callback which will be run when a subscription list is changed.
-  void set_removal_callback(const Closure& callback) {
-    removal_callback_ = callback;
-  }
-
-  // Returns true if there are no subscriptions. This is only valid to call when
-  // not looping through the list.
-  bool empty() {
-    DCHECK_EQ(0, active_iterator_count_);
-    return callbacks_.empty();
+    // Run |removal_callback_| if any callbacks were canceled. Note that we
+    // cannot simply compare list sizes before and after iterating, since
+    // notification may result in Add()ing new callbacks as well as canceling
+    // them. Also note that if this is a OnceCallbackList, the OnceCallbacks
+    // that were executed above have all been removed regardless of whether
+    // they're counted in |erased_callbacks_|.
+    if (removal_callback_ &&
+        (erased_callbacks || IsOnceCallback<CallbackType>::value)) {
+      removal_callback_.Run();  // May delete |this|!
+    }
   }
 
  protected:
-  // An iterator class that can be used to access the list of callbacks.
-  class Iterator {
-   public:
-    explicit Iterator(CallbackListBase<CallbackType>* list)
-        : list_(list), list_iter_(list_->callbacks_.begin()) {
-      ++list_->active_iterator_count_;
+  using Callbacks = typename CallbackListTraits<CallbackListImpl>::Callbacks;
+
+  // Holds non-null callbacks, which will be called during Notify().
+  Callbacks callbacks_;
+
+ private:
+  // Cancels the callback pointed to by |it|, which is guaranteed to be valid.
+  void CancelCallback(const typename Callbacks::iterator& it) {
+    if (static_cast<CallbackListImpl*>(this)->CancelNullCallback(it)) {
+      return;
     }
 
-    Iterator(const Iterator& iter)
-        : list_(iter.list_), list_iter_(iter.list_iter_) {
-      ++list_->active_iterator_count_;
-    }
-
-    ~Iterator() {
-      if (list_ && --list_->active_iterator_count_ == 0) {
-        list_->Compact();
+    if (iterating_) {
+      // Calling erase() here is unsafe, since the loop in Notify() may be
+      // referencing this same iterator, e.g. if adjacent callbacks'
+      // Subscriptions are both destroyed when the first one is Run().  Just
+      // reset the callback and let Notify() clean it up at the end.
+      it->Reset();
+    } else {
+      callbacks_.erase(it);
+      if (removal_callback_) {
+        removal_callback_.Run();  // May delete |this|!
       }
     }
-
-    CallbackType* GetNext() {
-      while ((list_iter_ != list_->callbacks_.end()) && list_iter_->is_null())
-        ++list_iter_;
-
-      CallbackType* cb = NULL;
-      if (list_iter_ != list_->callbacks_.end()) {
-        cb = &(*list_iter_);
-        ++list_iter_;
-      }
-      return cb;
-    }
-
-   private:
-    CallbackListBase<CallbackType>* list_;
-    typename std::list<CallbackType>::iterator list_iter_;
-  };
-
-  CallbackListBase() : active_iterator_count_(0) {}
-
-  ~CallbackListBase() {
-    DCHECK_EQ(0, active_iterator_count_);
-    DCHECK_EQ(0U, callbacks_.size());
   }
 
-  // Returns an instance of a CallbackListBase::Iterator which can be used
-  // to run callbacks.
-  Iterator GetIterator() { return Iterator(this); }
+  // Set while Notify() is traversing |callbacks_|.  Used primarily to avoid
+  // invalidating iterators that may be in use.
+  bool iterating_ = false;
 
-  // Compact the list: remove any entries which were NULLed out during
-  // iteration.
-  void Compact() {
-    typename std::list<CallbackType>::iterator it = callbacks_.begin();
-    bool updated = false;
-    while (it != callbacks_.end()) {
-      if ((*it).is_null()) {
-        updated = true;
-        it = callbacks_.erase(it);
-      } else {
-        ++it;
-      }
+  // Called after elements are removed from |callbacks_|.
+  RepeatingClosure removal_callback_;
 
-      if (updated && !removal_callback_.is_null())
-        removal_callback_.Run();
-    }
-  }
-
- private:
-  std::list<CallbackType> callbacks_;
-  int active_iterator_count_;
-  Closure removal_callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(CallbackListBase);
+  WeakPtrFactory<CallbackListBase> weak_ptr_factory_{this};
 };
 
-}  // namespace cef_internal
+}  // namespace internal
 
-template <typename Sig>
-class CallbackList;
+template <typename Signature>
+class OnceCallbackList
+    : public internal::CallbackListBase<OnceCallbackList<Signature>> {
+ private:
+  friend internal::CallbackListBase<OnceCallbackList>;
+  using Traits = internal::CallbackListTraits<OnceCallbackList>;
 
-template <>
-class CallbackList<void(void)>
-    : public cef_internal::CallbackListBase<Callback<void(void)>> {
- public:
-  typedef Callback<void(void)> CallbackType;
+  // Runs the current callback, which may cancel it or any other callbacks.
+  template <typename... RunArgs>
+  void RunCallback(typename Traits::Callbacks::iterator it, RunArgs&&... args) {
+    // OnceCallbacks still have Subscriptions with outstanding iterators;
+    // splice() removes them from |callbacks_| without invalidating those.
+    null_callbacks_.splice(null_callbacks_.end(), this->callbacks_, it);
 
-  CallbackList() {}
-
-  void Notify() {
-    cef_internal::CallbackListBase<CallbackType>::Iterator it =
-        this->GetIterator();
-    CallbackType* cb;
-    while ((cb = it.GetNext()) != NULL) {
-      cb->Run();
-    }
+    // NOTE: Intentionally does not call std::forward<RunArgs>(args)...; see
+    // comments in Notify().
+    std::move(*it).Run(args...);
   }
 
- private:
-  DISALLOW_COPY_AND_ASSIGN(CallbackList);
-};
-
-template <typename A1>
-class CallbackList<void(A1)>
-    : public cef_internal::CallbackListBase<Callback<void(A1)>> {
- public:
-  typedef Callback<void(A1)> CallbackType;
-
-  CallbackList() {}
-
-  void Notify(typename cef_internal::CallbackParamTraits<A1>::ForwardType a1) {
-    typename cef_internal::CallbackListBase<CallbackType>::Iterator it =
-        this->GetIterator();
-    CallbackType* cb;
-    while ((cb = it.GetNext()) != NULL) {
-      cb->Run(a1);
+  // If |it| refers to an already-canceled callback, does any necessary cleanup
+  // and returns true.  Otherwise returns false.
+  bool CancelNullCallback(const typename Traits::Callbacks::iterator& it) {
+    if (it->is_null()) {
+      null_callbacks_.erase(it);
+      return true;
     }
+    return false;
   }
 
- private:
-  DISALLOW_COPY_AND_ASSIGN(CallbackList);
+  // Holds null callbacks whose Subscriptions are still alive, so the
+  // Subscriptions will still contain valid iterators.  Only needed for
+  // OnceCallbacks, since RepeatingCallbacks are not canceled except by
+  // Subscription destruction.
+  typename Traits::Callbacks null_callbacks_;
 };
 
-template <typename A1, typename A2>
-class CallbackList<void(A1, A2)>
-    : public cef_internal::CallbackListBase<Callback<void(A1, A2)>> {
- public:
-  typedef Callback<void(A1, A2)> CallbackType;
-
-  CallbackList() {}
-
-  void Notify(typename cef_internal::CallbackParamTraits<A1>::ForwardType a1,
-              typename cef_internal::CallbackParamTraits<A2>::ForwardType a2) {
-    typename cef_internal::CallbackListBase<CallbackType>::Iterator it =
-        this->GetIterator();
-    CallbackType* cb;
-    while ((cb = it.GetNext()) != NULL) {
-      cb->Run(a1, a2);
-    }
+template <typename Signature>
+class RepeatingCallbackList
+    : public internal::CallbackListBase<RepeatingCallbackList<Signature>> {
+ private:
+  friend internal::CallbackListBase<RepeatingCallbackList>;
+  using Traits = internal::CallbackListTraits<RepeatingCallbackList>;
+  // Runs the current callback, which may cancel it or any other callbacks.
+  template <typename... RunArgs>
+  void RunCallback(typename Traits::Callbacks::iterator it, RunArgs&&... args) {
+    // NOTE: Intentionally does not call std::forward<RunArgs>(args)...; see
+    // comments in Notify().
+    it->Run(args...);
   }
 
- private:
-  DISALLOW_COPY_AND_ASSIGN(CallbackList);
-};
-
-template <typename A1, typename A2, typename A3>
-class CallbackList<void(A1, A2, A3)>
-    : public cef_internal::CallbackListBase<Callback<void(A1, A2, A3)>> {
- public:
-  typedef Callback<void(A1, A2, A3)> CallbackType;
-
-  CallbackList() {}
-
-  void Notify(typename cef_internal::CallbackParamTraits<A1>::ForwardType a1,
-              typename cef_internal::CallbackParamTraits<A2>::ForwardType a2,
-              typename cef_internal::CallbackParamTraits<A3>::ForwardType a3) {
-    typename cef_internal::CallbackListBase<CallbackType>::Iterator it =
-        this->GetIterator();
-    CallbackType* cb;
-    while ((cb = it.GetNext()) != NULL) {
-      cb->Run(a1, a2, a3);
-    }
+  // If |it| refers to an already-canceled callback, does any necessary cleanup
+  // and returns true.  Otherwise returns false.
+  bool CancelNullCallback(const typename Traits::Callbacks::iterator& it) {
+    // Because at most one Subscription can point to a given callback, and
+    // RepeatingCallbacks are only reset by CancelCallback(), no one should be
+    // able to request cancellation of a canceled RepeatingCallback.
+    DCHECK(!it->is_null());
+    return false;
   }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CallbackList);
 };
 
-template <typename A1, typename A2, typename A3, typename A4>
-class CallbackList<void(A1, A2, A3, A4)>
-    : public cef_internal::CallbackListBase<Callback<void(A1, A2, A3, A4)>> {
- public:
-  typedef Callback<void(A1, A2, A3, A4)> CallbackType;
-
-  CallbackList() {}
-
-  void Notify(typename cef_internal::CallbackParamTraits<A1>::ForwardType a1,
-              typename cef_internal::CallbackParamTraits<A2>::ForwardType a2,
-              typename cef_internal::CallbackParamTraits<A3>::ForwardType a3,
-              typename cef_internal::CallbackParamTraits<A4>::ForwardType a4) {
-    typename cef_internal::CallbackListBase<CallbackType>::Iterator it =
-        this->GetIterator();
-    CallbackType* cb;
-    while ((cb = it.GetNext()) != NULL) {
-      cb->Run(a1, a2, a3, a4);
-    }
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CallbackList);
-};
-
-template <typename A1, typename A2, typename A3, typename A4, typename A5>
-class CallbackList<void(A1, A2, A3, A4, A5)>
-    : public cef_internal::CallbackListBase<
-          Callback<void(A1, A2, A3, A4, A5)>> {
- public:
-  typedef Callback<void(A1, A2, A3, A4, A5)> CallbackType;
-
-  CallbackList() {}
-
-  void Notify(typename cef_internal::CallbackParamTraits<A1>::ForwardType a1,
-              typename cef_internal::CallbackParamTraits<A2>::ForwardType a2,
-              typename cef_internal::CallbackParamTraits<A3>::ForwardType a3,
-              typename cef_internal::CallbackParamTraits<A4>::ForwardType a4,
-              typename cef_internal::CallbackParamTraits<A5>::ForwardType a5) {
-    typename cef_internal::CallbackListBase<CallbackType>::Iterator it =
-        this->GetIterator();
-    CallbackType* cb;
-    while ((cb = it.GetNext()) != NULL) {
-      cb->Run(a1, a2, a3, a4, a5);
-    }
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CallbackList);
-};
-
-template <typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6>
-class CallbackList<void(A1, A2, A3, A4, A5, A6)>
-    : public cef_internal::CallbackListBase<
-          Callback<void(A1, A2, A3, A4, A5, A6)>> {
- public:
-  typedef Callback<void(A1, A2, A3, A4, A5, A6)> CallbackType;
-
-  CallbackList() {}
-
-  void Notify(typename cef_internal::CallbackParamTraits<A1>::ForwardType a1,
-              typename cef_internal::CallbackParamTraits<A2>::ForwardType a2,
-              typename cef_internal::CallbackParamTraits<A3>::ForwardType a3,
-              typename cef_internal::CallbackParamTraits<A4>::ForwardType a4,
-              typename cef_internal::CallbackParamTraits<A5>::ForwardType a5,
-              typename cef_internal::CallbackParamTraits<A6>::ForwardType a6) {
-    typename cef_internal::CallbackListBase<CallbackType>::Iterator it =
-        this->GetIterator();
-    CallbackType* cb;
-    while ((cb = it.GetNext()) != NULL) {
-      cb->Run(a1, a2, a3, a4, a5, a6);
-    }
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CallbackList);
-};
-
-template <typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6,
-          typename A7>
-class CallbackList<void(A1, A2, A3, A4, A5, A6, A7)>
-    : public cef_internal::CallbackListBase<
-          Callback<void(A1, A2, A3, A4, A5, A6, A7)>> {
- public:
-  typedef Callback<void(A1, A2, A3, A4, A5, A6, A7)> CallbackType;
-
-  CallbackList() {}
-
-  void Notify(typename cef_internal::CallbackParamTraits<A1>::ForwardType a1,
-              typename cef_internal::CallbackParamTraits<A2>::ForwardType a2,
-              typename cef_internal::CallbackParamTraits<A3>::ForwardType a3,
-              typename cef_internal::CallbackParamTraits<A4>::ForwardType a4,
-              typename cef_internal::CallbackParamTraits<A5>::ForwardType a5,
-              typename cef_internal::CallbackParamTraits<A6>::ForwardType a6,
-              typename cef_internal::CallbackParamTraits<A7>::ForwardType a7) {
-    typename cef_internal::CallbackListBase<CallbackType>::Iterator it =
-        this->GetIterator();
-    CallbackType* cb;
-    while ((cb = it.GetNext()) != NULL) {
-      cb->Run(a1, a2, a3, a4, a5, a6, a7);
-    }
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CallbackList);
-};
+///
+/// Syntactic sugar to parallel that used for Callbacks.
+///
+using OnceClosureList = OnceCallbackList<void()>;
+using RepeatingClosureList = RepeatingCallbackList<void()>;
 
 }  // namespace base
 
diff --git a/src/include/base/cef_cancelable_callback.h b/src/include/base/cef_cancelable_callback.h
index febce3a..3563149 100644
--- a/src/include/base/cef_cancelable_callback.h
+++ b/src/include/base/cef_cancelable_callback.h
@@ -27,54 +27,58 @@
 // 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.
-//
-// CancelableCallback is a wrapper around base::Callback that allows
-// cancellation of a callback. CancelableCallback takes a reference on the
-// wrapped callback until this object is destroyed or Reset()/Cancel() are
-// called.
-//
-// NOTE:
-//
-// Calling CancelableCallback::Cancel() brings the object back to its natural,
-// default-constructed state, i.e., CancelableCallback::callback() will return
-// a null callback.
-//
-// THREAD-SAFETY:
-//
-// CancelableCallback objects must be created on, posted to, cancelled on, and
-// destroyed on the same thread.
-//
-//
-// EXAMPLE USAGE:
-//
-// In the following example, the test is verifying that RunIntensiveTest()
-// Quit()s the message loop within 4 seconds. The cancelable callback is posted
-// to the message loop, the intensive test runs, the message loop is run,
-// then the callback is cancelled.
-//
-// void TimeoutCallback(const std::string& timeout_message) {
-//   FAIL() << timeout_message;
-//   MessageLoop::current()->QuitWhenIdle();
-// }
-//
-// CancelableClosure timeout(base::Bind(&TimeoutCallback, "Test timed out."));
-// MessageLoop::current()->PostDelayedTask(FROM_HERE, timeout.callback(),
-//                                         4000)  // 4 seconds to run.
-// RunIntensiveTest();
-// MessageLoop::current()->Run();
-// timeout.Cancel();  // Hopefully this is hit before the timeout callback runs.
-//
+
+///
+/// \file
+/// CancelableCallback is a wrapper around base::Callback that allows
+/// cancellation of a callback. CancelableCallback takes a reference on the
+/// wrapped callback until this object is destroyed or Reset()/Cancel() are
+/// called.
+///
+/// NOTE:
+///
+/// Calling CancelableCallback::Cancel() brings the object back to its natural,
+/// default-constructed state, i.e., CancelableCallback::callback() will return
+/// a null callback.
+///
+/// THREAD-SAFETY:
+///
+/// CancelableCallback objects must be created on, posted to, cancelled on, and
+/// destroyed on the same thread.
+///
+///
+/// EXAMPLE USAGE:
+///
+/// In the following example, the test is verifying that RunIntensiveTest()
+/// Quit()s the message loop within 4 seconds. The cancelable callback is posted
+/// to the message loop, the intensive test runs, the message loop is run,
+/// then the callback is cancelled.
+///
+/// <pre>
+///   RunLoop run_loop;
+///
+///   void TimeoutCallback(const std::string& timeout_message) {
+///     FAIL() << timeout_message;
+///     run_loop.QuitWhenIdle();
+///   }
+///
+///   CancelableOnceClosure timeout(
+///       base::BindOnce(&TimeoutCallback, "Test timed out."));
+///   ThreadTaskRunnerHandle::Get()->PostDelayedTask(FROM_HERE,
+///                                                  timeout.callback(),
+///                                                  TimeDelta::FromSeconds(4));
+///   RunIntensiveTest();
+///   run_loop.Run();
+///   // Hopefully this is hit before the timeout callback runs.
+///   timeout.Cancel();
+/// </pre>
+///
 
 #ifndef CEF_INCLUDE_BASE_CEF_CANCELABLE_CALLBACK_H_
 #define CEF_INCLUDE_BASE_CEF_CANCELABLE_CALLBACK_H_
 #pragma once
 
-#if defined(BASE_CANCELABLE_CALLBACK_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)
+#if defined(USING_CHROMIUM_INCLUDES)
 // When building CEF include the Chromium header directly.
 #include "base/cancelable_callback.h"
 #else  // !USING_CHROMIUM_INCLUDES
@@ -82,37 +86,36 @@
 // If the Chromium implementation diverges the below implementation should be
 // updated to match.
 
+#include <utility>
+
 #include "include/base/cef_bind.h"
-#include "include/base/cef_build.h"
 #include "include/base/cef_callback.h"
+#include "include/base/cef_compiler_specific.h"
 #include "include/base/cef_logging.h"
-#include "include/base/cef_macros.h"
 #include "include/base/cef_weak_ptr.h"
 #include "include/base/internal/cef_callback_internal.h"
 
 namespace base {
+namespace internal {
 
-template <typename Sig>
-class CancelableCallback;
-
-template <>
-class CancelableCallback<void(void)> {
+template <typename CallbackType>
+class CancelableCallbackImpl {
  public:
-  CancelableCallback() : weak_factory_(this) {}
+  CancelableCallbackImpl() = default;
+  CancelableCallbackImpl(const CancelableCallbackImpl&) = delete;
+  CancelableCallbackImpl& operator=(const CancelableCallbackImpl&) = delete;
 
   // |callback| must not be null.
-  explicit CancelableCallback(const base::Callback<void(void)>& callback)
-      : weak_factory_(this), callback_(callback) {
-    DCHECK(!callback.is_null());
-    InitializeForwarder();
+  explicit CancelableCallbackImpl(CallbackType callback)
+      : callback_(std::move(callback)) {
+    DCHECK(callback_);
   }
 
-  ~CancelableCallback() {}
+  ~CancelableCallbackImpl() = default;
 
   // Cancels and drops the reference to the wrapped callback.
   void Cancel() {
-    weak_factory_.InvalidateWeakPtrs();
-    forwarder_.Reset();
+    weak_ptr_factory_.InvalidateWeakPtrs();
     callback_.Reset();
   }
 
@@ -121,170 +124,69 @@
 
   // Sets |callback| as the closure that may be cancelled. |callback| may not
   // be null. Outstanding and any previously wrapped callbacks are cancelled.
-  void Reset(const base::Callback<void(void)>& callback) {
-    DCHECK(!callback.is_null());
-
+  void Reset(CallbackType callback) {
+    DCHECK(callback);
     // Outstanding tasks (e.g., posted to a message loop) must not be called.
     Cancel();
-
-    // |forwarder_| is no longer valid after Cancel(), so re-bind.
-    InitializeForwarder();
-
-    callback_ = callback;
+    callback_ = std::move(callback);
   }
 
   // Returns a callback that can be disabled by calling Cancel().
-  const base::Callback<void(void)>& callback() const { return forwarder_; }
+  CallbackType callback() const {
+    if (!callback_) {
+      return CallbackType();
+    }
+    CallbackType forwarder;
+    MakeForwarder(&forwarder);
+    return forwarder;
+  }
 
  private:
-  void Forward() { callback_.Run(); }
-
-  // Helper method to bind |forwarder_| using a weak pointer from
-  // |weak_factory_|.
-  void InitializeForwarder() {
-    forwarder_ = base::Bind(&CancelableCallback<void(void)>::Forward,
-                            weak_factory_.GetWeakPtr());
+  template <typename... Args>
+  void MakeForwarder(RepeatingCallback<void(Args...)>* out) const {
+    using ForwarderType = void (CancelableCallbackImpl::*)(Args...);
+    ForwarderType forwarder = &CancelableCallbackImpl::ForwardRepeating;
+    *out = BindRepeating(forwarder, weak_ptr_factory_.GetWeakPtr());
   }
 
-  // Used to ensure Forward() is not run when this object is destroyed.
-  base::WeakPtrFactory<CancelableCallback<void(void)>> weak_factory_;
+  template <typename... Args>
+  void MakeForwarder(OnceCallback<void(Args...)>* out) const {
+    using ForwarderType = void (CancelableCallbackImpl::*)(Args...);
+    ForwarderType forwarder = &CancelableCallbackImpl::ForwardOnce;
+    *out = BindOnce(forwarder, weak_ptr_factory_.GetWeakPtr());
+  }
 
-  // The wrapper closure.
-  base::Callback<void(void)> forwarder_;
+  template <typename... Args>
+  void ForwardRepeating(Args... args) {
+    callback_.Run(std::forward<Args>(args)...);
+  }
+
+  template <typename... Args>
+  void ForwardOnce(Args... args) {
+    weak_ptr_factory_.InvalidateWeakPtrs();
+    std::move(callback_).Run(std::forward<Args>(args)...);
+  }
 
   // The stored closure that may be cancelled.
-  base::Callback<void(void)> callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(CancelableCallback);
+  CallbackType callback_;
+  mutable base::WeakPtrFactory<CancelableCallbackImpl> weak_ptr_factory_{this};
 };
 
-template <typename A1>
-class CancelableCallback<void(A1)> {
- public:
-  CancelableCallback() : weak_factory_(this) {}
+}  // namespace internal
 
-  // |callback| must not be null.
-  explicit CancelableCallback(const base::Callback<void(A1)>& callback)
-      : weak_factory_(this), callback_(callback) {
-    DCHECK(!callback.is_null());
-    InitializeForwarder();
-  }
+///
+/// Consider using base::WeakPtr directly instead of base::CancelableCallback
+/// for the task cancellation.
+///
+template <typename Signature>
+using CancelableOnceCallback =
+    internal::CancelableCallbackImpl<OnceCallback<Signature>>;
+using CancelableOnceClosure = CancelableOnceCallback<void()>;
 
-  ~CancelableCallback() {}
-
-  // Cancels and drops the reference to the wrapped callback.
-  void Cancel() {
-    weak_factory_.InvalidateWeakPtrs();
-    forwarder_.Reset();
-    callback_.Reset();
-  }
-
-  // Returns true if the wrapped callback has been cancelled.
-  bool IsCancelled() const { return callback_.is_null(); }
-
-  // Sets |callback| as the closure that may be cancelled. |callback| may not
-  // be null. Outstanding and any previously wrapped callbacks are cancelled.
-  void Reset(const base::Callback<void(A1)>& callback) {
-    DCHECK(!callback.is_null());
-
-    // Outstanding tasks (e.g., posted to a message loop) must not be called.
-    Cancel();
-
-    // |forwarder_| is no longer valid after Cancel(), so re-bind.
-    InitializeForwarder();
-
-    callback_ = callback;
-  }
-
-  // Returns a callback that can be disabled by calling Cancel().
-  const base::Callback<void(A1)>& callback() const { return forwarder_; }
-
- private:
-  void Forward(A1 a1) const { callback_.Run(a1); }
-
-  // Helper method to bind |forwarder_| using a weak pointer from
-  // |weak_factory_|.
-  void InitializeForwarder() {
-    forwarder_ = base::Bind(&CancelableCallback<void(A1)>::Forward,
-                            weak_factory_.GetWeakPtr());
-  }
-
-  // Used to ensure Forward() is not run when this object is destroyed.
-  base::WeakPtrFactory<CancelableCallback<void(A1)>> weak_factory_;
-
-  // The wrapper closure.
-  base::Callback<void(A1)> forwarder_;
-
-  // The stored closure that may be cancelled.
-  base::Callback<void(A1)> callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(CancelableCallback);
-};
-
-template <typename A1, typename A2>
-class CancelableCallback<void(A1, A2)> {
- public:
-  CancelableCallback() : weak_factory_(this) {}
-
-  // |callback| must not be null.
-  explicit CancelableCallback(const base::Callback<void(A1, A2)>& callback)
-      : weak_factory_(this), callback_(callback) {
-    DCHECK(!callback.is_null());
-    InitializeForwarder();
-  }
-
-  ~CancelableCallback() {}
-
-  // Cancels and drops the reference to the wrapped callback.
-  void Cancel() {
-    weak_factory_.InvalidateWeakPtrs();
-    forwarder_.Reset();
-    callback_.Reset();
-  }
-
-  // Returns true if the wrapped callback has been cancelled.
-  bool IsCancelled() const { return callback_.is_null(); }
-
-  // Sets |callback| as the closure that may be cancelled. |callback| may not
-  // be null. Outstanding and any previously wrapped callbacks are cancelled.
-  void Reset(const base::Callback<void(A1, A2)>& callback) {
-    DCHECK(!callback.is_null());
-
-    // Outstanding tasks (e.g., posted to a message loop) must not be called.
-    Cancel();
-
-    // |forwarder_| is no longer valid after Cancel(), so re-bind.
-    InitializeForwarder();
-
-    callback_ = callback;
-  }
-
-  // Returns a callback that can be disabled by calling Cancel().
-  const base::Callback<void(A1, A2)>& callback() const { return forwarder_; }
-
- private:
-  void Forward(A1 a1, A2 a2) const { callback_.Run(a1, a2); }
-
-  // Helper method to bind |forwarder_| using a weak pointer from
-  // |weak_factory_|.
-  void InitializeForwarder() {
-    forwarder_ = base::Bind(&CancelableCallback<void(A1, A2)>::Forward,
-                            weak_factory_.GetWeakPtr());
-  }
-
-  // Used to ensure Forward() is not run when this object is destroyed.
-  base::WeakPtrFactory<CancelableCallback<void(A1, A2)>> weak_factory_;
-
-  // The wrapper closure.
-  base::Callback<void(A1, A2)> forwarder_;
-
-  // The stored closure that may be cancelled.
-  base::Callback<void(A1, A2)> callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(CancelableCallback);
-};
-
-typedef CancelableCallback<void(void)> CancelableClosure;
+template <typename Signature>
+using CancelableRepeatingCallback =
+    internal::CancelableCallbackImpl<RepeatingCallback<Signature>>;
+using CancelableRepeatingClosure = CancelableRepeatingCallback<void()>;
 
 }  // namespace base
 
diff --git a/src/include/base/cef_compiler_specific.h b/src/include/base/cef_compiler_specific.h
new file mode 100644
index 0000000..24bcfb2
--- /dev/null
+++ b/src/include/base/cef_compiler_specific.h
@@ -0,0 +1,382 @@
+// Copyright (c) 2021 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_COMPILER_SPECIFIC_H_
+#define CEF_INCLUDE_BASE_CEF_COMPILER_SPECIFIC_H_
+#pragma once
+
+#if defined(USING_CHROMIUM_INCLUDES)
+// When building CEF include the Chromium header directly.
+#include "base/compiler_specific.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/cef_build.h"
+
+// This is a wrapper around `__has_cpp_attribute`, which can be used to test for
+// the presence of an attribute. In case the compiler does not support this
+// macro it will simply evaluate to 0.
+//
+// References:
+// https://wg21.link/sd6#testing-for-the-presence-of-an-attribute-__has_cpp_attribute
+// https://wg21.link/cpp.cond#:__has_cpp_attribute
+#if defined(__has_cpp_attribute)
+#define HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
+#else
+#define HAS_CPP_ATTRIBUTE(x) 0
+#endif
+
+// A wrapper around `__has_builtin`, similar to HAS_CPP_ATTRIBUTE.
+#if defined(__has_builtin)
+#define HAS_BUILTIN(x) __has_builtin(x)
+#else
+#define HAS_BUILTIN(x) 0
+#endif
+
+// __has_feature and __has_attribute don't exist for MSVC.
+#if !defined(__has_feature)
+#define __has_feature(x) 0
+#endif  // !defined(__has_feature)
+
+#if !defined(__has_attribute)
+#define __has_attribute(x) 0
+#endif  // !defined(__has_attribute)
+
+// Annotate a function indicating it should not be inlined.
+// Use like:
+//   NOINLINE void DoStuff() { ... }
+#if defined(COMPILER_GCC)
+#define NOINLINE __attribute__((noinline))
+#elif defined(COMPILER_MSVC)
+#define NOINLINE __declspec(noinline)
+#else
+#define NOINLINE
+#endif
+
+#if defined(COMPILER_GCC) && defined(NDEBUG)
+#define ALWAYS_INLINE inline __attribute__((__always_inline__))
+#elif defined(COMPILER_MSVC) && defined(NDEBUG)
+#define ALWAYS_INLINE __forceinline
+#else
+#define ALWAYS_INLINE inline
+#endif
+
+// Annotate a function indicating it should never be tail called. Useful to make
+// sure callers of the annotated function are never omitted from call-stacks.
+// To provide the complementary behavior (prevent the annotated function from
+// being omitted) look at NOINLINE. Also note that this doesn't prevent code
+// folding of multiple identical caller functions into a single signature. To
+// prevent code folding, see NO_CODE_FOLDING() in base/debug/alias.h.
+// Use like:
+//   void NOT_TAIL_CALLED FooBar();
+#if defined(__clang__) && __has_attribute(not_tail_called)
+#define NOT_TAIL_CALLED __attribute__((not_tail_called))
+#else
+#define NOT_TAIL_CALLED
+#endif
+
+// Specify memory alignment for structs, classes, etc.
+// Use like:
+//   class ALIGNAS(16) MyClass { ... }
+//   ALIGNAS(16) int array[4];
+//
+// In most places you can use the C++11 keyword "alignas", which is preferred.
+//
+// But compilers have trouble mixing __attribute__((...)) syntax with
+// alignas(...) syntax.
+//
+// Doesn't work in clang or gcc:
+//   struct alignas(16) __attribute__((packed)) S { char c; };
+// Works in clang but not gcc:
+//   struct __attribute__((packed)) alignas(16) S2 { char c; };
+// Works in clang and gcc:
+//   struct alignas(16) S3 { char c; } __attribute__((packed));
+//
+// There are also some attributes that must be specified *before* a class
+// definition: visibility (used for exporting functions/classes) is one of
+// these attributes. This means that it is not possible to use alignas() with a
+// class that is marked as exported.
+#if defined(COMPILER_MSVC)
+#define ALIGNAS(byte_alignment) __declspec(align(byte_alignment))
+#elif defined(COMPILER_GCC)
+#define ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment)))
+#endif
+
+// In case the compiler supports it NO_UNIQUE_ADDRESS evaluates to the C++20
+// attribute [[no_unique_address]]. This allows annotating data members so that
+// they need not have an address distinct from all other non-static data members
+// of its class.
+//
+// References:
+// * https://en.cppreference.com/w/cpp/language/attributes/no_unique_address
+// * https://wg21.link/dcl.attr.nouniqueaddr
+#if HAS_CPP_ATTRIBUTE(no_unique_address)
+#define NO_UNIQUE_ADDRESS [[no_unique_address]]
+#else
+#define NO_UNIQUE_ADDRESS
+#endif
+
+// Tell the compiler a function is using a printf-style format string.
+// |format_param| is the one-based index of the format string parameter;
+// |dots_param| is the one-based index of the "..." parameter.
+// For v*printf functions (which take a va_list), pass 0 for dots_param.
+// (This is undocumented but matches what the system C headers do.)
+// For member functions, the implicit this parameter counts as index 1.
+#if defined(COMPILER_GCC) || defined(__clang__)
+#define PRINTF_FORMAT(format_param, dots_param) \
+  __attribute__((format(printf, format_param, dots_param)))
+#else
+#define PRINTF_FORMAT(format_param, dots_param)
+#endif
+
+// WPRINTF_FORMAT is the same, but for wide format strings.
+// This doesn't appear to yet be implemented in any compiler.
+// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38308 .
+#define WPRINTF_FORMAT(format_param, dots_param)
+// If available, it would look like:
+//   __attribute__((format(wprintf, format_param, dots_param)))
+
+// Sanitizers annotations.
+#if defined(__has_attribute)
+#if __has_attribute(no_sanitize)
+#define NO_SANITIZE(what) __attribute__((no_sanitize(what)))
+#endif
+#endif
+#if !defined(NO_SANITIZE)
+#define NO_SANITIZE(what)
+#endif
+
+// MemorySanitizer annotations.
+#if defined(MEMORY_SANITIZER) && !defined(OS_NACL)
+#include <sanitizer/msan_interface.h>
+
+// Mark a memory region fully initialized.
+// Use this to annotate code that deliberately reads uninitialized data, for
+// example a GC scavenging root set pointers from the stack.
+#define MSAN_UNPOISON(p, size) __msan_unpoison(p, size)
+
+// Check a memory region for initializedness, as if it was being used here.
+// If any bits are uninitialized, crash with an MSan report.
+// Use this to sanitize data which MSan won't be able to track, e.g. before
+// passing data to another process via shared memory.
+#define MSAN_CHECK_MEM_IS_INITIALIZED(p, size) \
+  __msan_check_mem_is_initialized(p, size)
+#else  // MEMORY_SANITIZER
+#define MSAN_UNPOISON(p, size)
+#define MSAN_CHECK_MEM_IS_INITIALIZED(p, size)
+#endif  // MEMORY_SANITIZER
+
+// DISABLE_CFI_PERF -- Disable Control Flow Integrity for perf reasons.
+#if !defined(DISABLE_CFI_PERF)
+#if defined(__clang__) && defined(OFFICIAL_BUILD)
+#define DISABLE_CFI_PERF __attribute__((no_sanitize("cfi")))
+#else
+#define DISABLE_CFI_PERF
+#endif
+#endif
+
+// DISABLE_CFI_ICALL -- Disable Control Flow Integrity indirect call checks.
+#if !defined(DISABLE_CFI_ICALL)
+#if defined(OS_WIN)
+// Windows also needs __declspec(guard(nocf)).
+#define DISABLE_CFI_ICALL NO_SANITIZE("cfi-icall") __declspec(guard(nocf))
+#else
+#define DISABLE_CFI_ICALL NO_SANITIZE("cfi-icall")
+#endif
+#endif
+#if !defined(DISABLE_CFI_ICALL)
+#define DISABLE_CFI_ICALL
+#endif
+
+// Macro useful for writing cross-platform function pointers.
+#if !defined(CDECL)
+#if defined(OS_WIN)
+#define CDECL __cdecl
+#else  // defined(OS_WIN)
+#define CDECL
+#endif  // defined(OS_WIN)
+#endif  // !defined(CDECL)
+
+// Macro for hinting that an expression is likely to be false.
+#if !defined(UNLIKELY)
+#if defined(COMPILER_GCC) || defined(__clang__)
+#define UNLIKELY(x) __builtin_expect(!!(x), 0)
+#else
+#define UNLIKELY(x) (x)
+#endif  // defined(COMPILER_GCC)
+#endif  // !defined(UNLIKELY)
+
+#if !defined(LIKELY)
+#if defined(COMPILER_GCC) || defined(__clang__)
+#define LIKELY(x) __builtin_expect(!!(x), 1)
+#else
+#define LIKELY(x) (x)
+#endif  // defined(COMPILER_GCC)
+#endif  // !defined(LIKELY)
+
+// Compiler feature-detection.
+// clang.llvm.org/docs/LanguageExtensions.html#has-feature-and-has-extension
+#if defined(__has_feature)
+#define HAS_FEATURE(FEATURE) __has_feature(FEATURE)
+#else
+#define HAS_FEATURE(FEATURE) 0
+#endif
+
+#if defined(COMPILER_GCC)
+#define PRETTY_FUNCTION __PRETTY_FUNCTION__
+#elif defined(COMPILER_MSVC)
+#define PRETTY_FUNCTION __FUNCSIG__
+#else
+// See https://en.cppreference.com/w/c/language/function_definition#func
+#define PRETTY_FUNCTION __func__
+#endif
+
+#if !defined(CPU_ARM_NEON)
+#if defined(__arm__)
+#if !defined(__ARMEB__) && !defined(__ARM_EABI__) && !defined(__EABI__) && \
+    !defined(__VFP_FP__) && !defined(_WIN32_WCE) && !defined(ANDROID)
+#error Chromium does not support middle endian architecture
+#endif
+#if defined(__ARM_NEON__)
+#define CPU_ARM_NEON 1
+#endif
+#endif  // defined(__arm__)
+#endif  // !defined(CPU_ARM_NEON)
+
+#if !defined(HAVE_MIPS_MSA_INTRINSICS)
+#if defined(__mips_msa) && defined(__mips_isa_rev) && (__mips_isa_rev >= 5)
+#define HAVE_MIPS_MSA_INTRINSICS 1
+#endif
+#endif
+
+#if defined(__clang__) && __has_attribute(uninitialized)
+// Attribute "uninitialized" disables -ftrivial-auto-var-init=pattern for
+// the specified variable.
+// Library-wide alternative is
+// 'configs -= [ "//build/config/compiler:default_init_stack_vars" ]' in .gn
+// file.
+//
+// See "init_stack_vars" in build/config/compiler/BUILD.gn and
+// http://crbug.com/977230
+// "init_stack_vars" is enabled for non-official builds and we hope to enable it
+// in official build in 2020 as well. The flag writes fixed pattern into
+// uninitialized parts of all local variables. In rare cases such initialization
+// is undesirable and attribute can be used:
+//   1. Degraded performance
+// In most cases compiler is able to remove additional stores. E.g. if memory is
+// never accessed or properly initialized later. Preserved stores mostly will
+// not affect program performance. However if compiler failed on some
+// performance critical code we can get a visible regression in a benchmark.
+//   2. memset, memcpy calls
+// Compiler may replaces some memory writes with memset or memcpy calls. This is
+// not -ftrivial-auto-var-init specific, but it can happen more likely with the
+// flag. It can be a problem if code is not linked with C run-time library.
+//
+// Note: The flag is security risk mitigation feature. So in future the
+// attribute uses should be avoided when possible. However to enable this
+// mitigation on the most of the code we need to be less strict now and minimize
+// number of exceptions later. So if in doubt feel free to use attribute, but
+// please document the problem for someone who is going to cleanup it later.
+// E.g. platform, bot, benchmark or test name in patch description or next to
+// the attribute.
+#define STACK_UNINITIALIZED __attribute__((uninitialized))
+#else
+#define STACK_UNINITIALIZED
+#endif
+
+// The ANALYZER_ASSUME_TRUE(bool arg) macro adds compiler-specific hints
+// to Clang which control what code paths are statically analyzed,
+// and is meant to be used in conjunction with assert & assert-like functions.
+// The expression is passed straight through if analysis isn't enabled.
+//
+// ANALYZER_SKIP_THIS_PATH() suppresses static analysis for the current
+// codepath and any other branching codepaths that might follow.
+#if defined(__clang_analyzer__)
+
+inline constexpr bool AnalyzerNoReturn() __attribute__((analyzer_noreturn)) {
+  return false;
+}
+
+inline constexpr bool AnalyzerAssumeTrue(bool arg) {
+  // AnalyzerNoReturn() is invoked and analysis is terminated if |arg| is
+  // false.
+  return arg || AnalyzerNoReturn();
+}
+
+#define ANALYZER_ASSUME_TRUE(arg) ::AnalyzerAssumeTrue(!!(arg))
+#define ANALYZER_SKIP_THIS_PATH() static_cast<void>(::AnalyzerNoReturn())
+#define ANALYZER_ALLOW_UNUSED(var) static_cast<void>(var);
+
+#else  // !defined(__clang_analyzer__)
+
+#define ANALYZER_ASSUME_TRUE(arg) (arg)
+#define ANALYZER_SKIP_THIS_PATH()
+#define ANALYZER_ALLOW_UNUSED(var) static_cast<void>(var);
+
+#endif  // defined(__clang_analyzer__)
+
+// Use nomerge attribute to disable optimization of merging multiple same calls.
+#if defined(__clang__) && __has_attribute(nomerge)
+#define NOMERGE [[clang::nomerge]]
+#else
+#define NOMERGE
+#endif
+
+// Marks a type as being eligible for the "trivial" ABI despite having a
+// non-trivial destructor or copy/move constructor. Such types can be relocated
+// after construction by simply copying their memory, which makes them eligible
+// to be passed in registers. The canonical example is std::unique_ptr.
+//
+// Use with caution; this has some subtle effects on constructor/destructor
+// ordering and will be very incorrect if the type relies on its address
+// remaining constant. When used as a function argument (by value), the value
+// may be constructed in the caller's stack frame, passed in a register, and
+// then used and destructed in the callee's stack frame. A similar thing can
+// occur when values are returned.
+//
+// TRIVIAL_ABI is not needed for types which have a trivial destructor and
+// copy/move constructors, such as base::TimeTicks and other POD.
+//
+// It is also not likely to be effective on types too large to be passed in one
+// or two registers on typical target ABIs.
+//
+// See also:
+//   https://clang.llvm.org/docs/AttributeReference.html#trivial-abi
+//   https://libcxx.llvm.org/docs/DesignDocs/UniquePtrTrivialAbi.html
+#if defined(__clang__) && __has_attribute(trivial_abi)
+#define TRIVIAL_ABI [[clang::trivial_abi]]
+#else
+#define TRIVIAL_ABI
+#endif
+
+#endif  // !USING_CHROMIUM_INCLUDES
+#endif  // CEF_INCLUDE_BASE_CEF_COMPILER_SPECIFIC_H_
diff --git a/src/include/base/cef_lock.h b/src/include/base/cef_lock.h
index 6909bd6..27af8ae 100644
--- a/src/include/base/cef_lock.h
+++ b/src/include/base/cef_lock.h
@@ -32,12 +32,7 @@
 #define CEF_INCLUDE_BASE_CEF_LOCK_H_
 #pragma once
 
-#if defined(BASE_SYNCHRONIZATION_LOCK_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)
+#if defined(USING_CHROMIUM_INCLUDES)
 // When building CEF include the Chromium header directly.
 #include "base/synchronization/lock.h"
 #else  // !USING_CHROMIUM_INCLUDES
@@ -46,28 +41,35 @@
 // updated to match.
 
 #include "include/base/cef_logging.h"
-#include "include/base/cef_macros.h"
 #include "include/base/cef_platform_thread.h"
 #include "include/base/internal/cef_lock_impl.h"
 
 namespace base {
 namespace cef_internal {
 
-// A convenient wrapper for an OS specific critical section.  The only real
-// intelligence in this class is in debug mode for the support for the
-// AssertAcquired() method.
+///
+/// A convenient wrapper for an OS specific critical section.  The only real
+/// intelligence in this class is in debug mode for the support for the
+/// AssertAcquired() method.
+///
 class Lock {
  public:
 #if !DCHECK_IS_ON()  // Optimized wrapper implementation
   Lock() : lock_() {}
+
+  Lock(const Lock&) = delete;
+  Lock& operator=(const Lock&) = delete;
+
   ~Lock() {}
   void Acquire() { lock_.Lock(); }
   void Release() { lock_.Unlock(); }
 
-  // If the lock is not held, take it and return true. If the lock is already
-  // held by another thread, immediately return false. This must not be called
-  // by a thread already holding the lock (what happens is undefined and an
-  // assertion may fail).
+  ///
+  /// If the lock is not held, take it and return true. If the lock is already
+  /// held by another thread, immediately return false. This must not be called
+  /// by a thread already holding the lock (what happens is undefined and an
+  /// assertion may fail).
+  ///
   bool Try() { return lock_.Try(); }
 
   // Null implementation if not debug.
@@ -116,11 +118,11 @@
 
   // Platform specific underlying lock implementation.
   LockImpl lock_;
-
-  DISALLOW_COPY_AND_ASSIGN(Lock);
 };
 
-// A helper class that acquires the given Lock while the AutoLock is in scope.
+///
+/// A helper class that acquires the given Lock while the AutoLock is in scope.
+///
 class AutoLock {
  public:
   struct AlreadyAcquired {};
@@ -131,6 +133,9 @@
     lock_.AssertAcquired();
   }
 
+  AutoLock(const AutoLock&) = delete;
+  AutoLock& operator=(const AutoLock&) = delete;
+
   ~AutoLock() {
     lock_.AssertAcquired();
     lock_.Release();
@@ -138,11 +143,12 @@
 
  private:
   Lock& lock_;
-  DISALLOW_COPY_AND_ASSIGN(AutoLock);
 };
 
-// AutoUnlock is a helper that will Release() the |lock| argument in the
-// constructor, and re-Acquire() it in the destructor.
+///
+/// AutoUnlock is a helper that will Release() the |lock| argument in the
+/// constructor, and re-Acquire() it in the destructor.
+///
 class AutoUnlock {
  public:
   explicit AutoUnlock(Lock& lock) : lock_(lock) {
@@ -151,11 +157,13 @@
     lock_.Release();
   }
 
+  AutoUnlock(const AutoUnlock&) = delete;
+  AutoUnlock& operator=(const AutoUnlock&) = delete;
+
   ~AutoUnlock() { lock_.Acquire(); }
 
  private:
   Lock& lock_;
-  DISALLOW_COPY_AND_ASSIGN(AutoUnlock);
 };
 
 }  // namespace cef_internal
@@ -163,9 +171,9 @@
 // Implement classes in the cef_internal namespace and then expose them to the
 // base namespace. This avoids conflicts with the base.lib implementation when
 // linking sandbox support on Windows.
-using cef_internal::Lock;
 using cef_internal::AutoLock;
 using cef_internal::AutoUnlock;
+using cef_internal::Lock;
 
 }  // namespace base
 
diff --git a/src/include/base/cef_logging.h b/src/include/base/cef_logging.h
index ba93097..31adf21 100644
--- a/src/include/base/cef_logging.h
+++ b/src/include/base/cef_logging.h
@@ -27,116 +27,140 @@
 // 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.
-//
-// ---------------------------------------------------------------------------
-//
-// The contents of this file are only available to applications that link
-// against the libcef_dll_wrapper target.
-//
-// WARNING: Logging macros should not be used in the main/browser process before
-// calling CefInitialize or in sub-processes before calling CefExecuteProcess.
-//
-// Instructions
-// ------------
-//
-// Make a bunch of macros for logging.  The way to log things is to stream
-// things to LOG(<a particular severity level>).  E.g.,
-//
-//   LOG(INFO) << "Found " << num_cookies << " cookies";
-//
-// You can also do conditional logging:
-//
-//   LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
-//
-// The CHECK(condition) macro is active in both debug and release builds and
-// effectively performs a LOG(FATAL) which terminates the process and
-// generates a crashdump unless a debugger is attached.
-//
-// There are also "debug mode" logging macros like the ones above:
-//
-//   DLOG(INFO) << "Found cookies";
-//
-//   DLOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
-//
-// All "debug mode" logging is compiled away to nothing for non-debug mode
-// compiles.  LOG_IF and development flags also work well together
-// because the code can be compiled away sometimes.
-//
-// We also have
-//
-//   LOG_ASSERT(assertion);
-//   DLOG_ASSERT(assertion);
-//
-// which is syntactic sugar for {,D}LOG_IF(FATAL, assert fails) << assertion;
-//
-// There are "verbose level" logging macros.  They look like
-//
-//   VLOG(1) << "I'm printed when you run the program with --v=1 or more";
-//   VLOG(2) << "I'm printed when you run the program with --v=2 or more";
-//
-// These always log at the INFO log level (when they log at all).
-// The verbose logging can also be turned on module-by-module.  For instance,
-//    --vmodule=profile=2,icon_loader=1,browser_*=3,*/chromeos/*=4 --v=0
-// will cause:
-//   a. VLOG(2) and lower messages to be printed from profile.{h,cc}
-//   b. VLOG(1) and lower messages to be printed from icon_loader.{h,cc}
-//   c. VLOG(3) and lower messages to be printed from files prefixed with
-//      "browser"
-//   d. VLOG(4) and lower messages to be printed from files under a
-//     "chromeos" directory.
-//   e. VLOG(0) and lower messages to be printed from elsewhere
-//
-// The wildcarding functionality shown by (c) supports both '*' (match
-// 0 or more characters) and '?' (match any single character)
-// wildcards.  Any pattern containing a forward or backward slash will
-// be tested against the whole pathname and not just the module.
-// E.g., "*/foo/bar/*=2" would change the logging level for all code
-// in source files under a "foo/bar" directory.
-//
-// There's also VLOG_IS_ON(n) "verbose level" condition macro. To be used as
-//
-//   if (VLOG_IS_ON(2)) {
-//     // do some logging preparation and logging
-//     // that can't be accomplished with just VLOG(2) << ...;
-//   }
-//
-// There is also a VLOG_IF "verbose level" condition macro for sample
-// cases, when some extra computation and preparation for logs is not
-// needed.
-//
-//   VLOG_IF(1, (size > 1024))
-//      << "I'm printed when size is more than 1024 and when you run the "
-//         "program with --v=1 or more";
-//
-// We also override the standard 'assert' to use 'DLOG_ASSERT'.
-//
-// Lastly, there is:
-//
-//   PLOG(ERROR) << "Couldn't do foo";
-//   DPLOG(ERROR) << "Couldn't do foo";
-//   PLOG_IF(ERROR, cond) << "Couldn't do foo";
-//   DPLOG_IF(ERROR, cond) << "Couldn't do foo";
-//   PCHECK(condition) << "Couldn't do foo";
-//   DPCHECK(condition) << "Couldn't do foo";
-//
-// which append the last system error to the message in string form (taken from
-// GetLastError() on Windows and errno on POSIX).
-//
-// The supported severity levels for macros that allow you to specify one
-// are (in increasing order of severity) INFO, WARNING, ERROR, and FATAL.
-//
-// Very important: logging a message at the FATAL severity level causes
-// the program to terminate (after the message is logged).
-//
-// There is the special severity of DFATAL, which logs FATAL in debug mode,
-// ERROR in normal mode.
-//
+
+///
+/// \file
+/// A bunch of macros for logging.
+///
+/// NOTE: The contents of this file are only available to applications that link
+/// against the libcef_dll_wrapper target.
+///
+/// WARNING: Logging macros should not be used in the main/browser process
+/// before calling CefInitialize or in sub-processes before calling
+/// CefExecuteProcess.
+///
+/// INSTRUCTIONS:
+///
+/// The way to log things is to stream things to LOG(<a particular severity
+/// level>). E.g.,
+///
+/// <pre>
+///   LOG(INFO) << "Found " << num_cookies << " cookies";
+/// </pre>
+///
+/// You can also do conditional logging:
+///
+/// <pre>
+///   LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
+/// </pre>
+///
+/// The CHECK(condition) macro is active in both debug and release builds and
+/// effectively performs a LOG(FATAL) which terminates the process and
+/// generates a crashdump unless a debugger is attached.
+///
+/// There are also "debug mode" logging macros like the ones above:
+///
+/// <pre>
+///   DLOG(INFO) << "Found cookies";
+///
+///   DLOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
+/// </pre>
+///
+/// All "debug mode" logging is compiled away to nothing for non-debug mode
+/// compiles.  LOG_IF and development flags also work well together
+/// because the code can be compiled away sometimes.
+///
+/// We also have
+///
+/// <pre>
+///   LOG_ASSERT(assertion);
+///   DLOG_ASSERT(assertion);
+/// </pre>
+///
+/// which is syntactic sugar for "{,D}LOG_IF(FATAL, assert fails) << assertion;"
+///
+/// There are "verbose level" logging macros.  They look like
+///
+/// <pre>
+///   VLOG(1) << "I'm printed when you run the program with --v=1 or more";
+///   VLOG(2) << "I'm printed when you run the program with --v=2 or more";
+/// </pre>
+///
+/// These always log at the INFO log level (when they log at all).
+/// The verbose logging can also be turned on module-by-module.  For instance,
+/// <pre>
+///    --vmodule=profile=2,icon_loader=1,browser_*=3,*/chromeos/*=4 --v=0
+/// </pre>
+/// will cause:
+/// 1. VLOG(2) and lower messages to be printed from profile.{h,cc}
+/// 2. VLOG(1) and lower messages to be printed from icon_loader.{h,cc}
+/// 3. VLOG(3) and lower messages to be printed from files prefixed with
+///    "browser"
+/// 4. VLOG(4) and lower messages to be printed from files under a
+///    "chromeos" directory.
+/// 5. VLOG(0) and lower messages to be printed from elsewhere
+///
+/// The wildcarding functionality shown by (c) supports both '*' (match
+/// 0 or more characters) and '?' (match any single character)
+/// wildcards.  Any pattern containing a forward or backward slash will
+/// be tested against the whole pathname and not just the module.
+/// E.g., "*/foo/bar/*=2" would change the logging level for all code
+/// in source files under a "foo/bar" directory.
+///
+/// There's also VLOG_IS_ON(n) "verbose level" condition macro. To be used as
+///
+/// <pre>
+///   if (VLOG_IS_ON(2)) {
+///     // do some logging preparation and logging
+///     // that can't be accomplished with just VLOG(2) << ...;
+///   }
+/// </pre>
+///
+/// There is also a VLOG_IF "verbose level" condition macro for sample
+/// cases, when some extra computation and preparation for logs is not
+/// needed.
+///
+/// <pre>
+///   VLOG_IF(1, (size > 1024))
+///      << "I'm printed when size is more than 1024 and when you run the "
+///         "program with --v=1 or more";
+/// </pre>
+///
+/// We also override the standard 'assert' to use 'DLOG_ASSERT'.
+///
+/// Lastly, there is:
+///
+/// <pre>
+///   PLOG(ERROR) << "Couldn't do foo";
+///   DPLOG(ERROR) << "Couldn't do foo";
+///   PLOG_IF(ERROR, cond) << "Couldn't do foo";
+///   DPLOG_IF(ERROR, cond) << "Couldn't do foo";
+///   PCHECK(condition) << "Couldn't do foo";
+///   DPCHECK(condition) << "Couldn't do foo";
+/// </pre>
+///
+/// which append the last system error to the message in string form (taken from
+/// GetLastError() on Windows and errno on POSIX).
+///
+/// The supported severity levels for macros that allow you to specify one
+/// are (in increasing order of severity) INFO, WARNING, ERROR, and FATAL.
+///
+/// Very important: logging a message at the FATAL severity level causes
+/// the program to terminate (after the message is logged).
+///
+/// There is the special severity of DFATAL, which logs FATAL in debug mode,
+/// ERROR in normal mode.
+///
 
 #ifndef CEF_INCLUDE_BASE_CEF_LOGGING_H_
 #define CEF_INCLUDE_BASE_CEF_LOGGING_H_
 #pragma once
 
-#if defined(DCHECK)
+#if defined(USING_CHROMIUM_INCLUDES)
+// When building CEF include the Chromium header directly.
+#include "base/logging.h"
+#include "base/notreached.h"
+#elif defined(DCHECK)
 // Do nothing if the macros provided by this header already exist.
 // This can happen in cases where Chromium code is used directly by the
 // client application. When using Chromium code directly always include
@@ -149,10 +173,7 @@
 #define DCHECK_IS_ON() true
 #endif
 
-#elif defined(USING_CHROMIUM_INCLUDES)
-// When building CEF include the Chromium header directly.
-#include "base/logging.h"
-#else  // !USING_CHROMIUM_INCLUDES
+#else  // !defined(DCHECK)
 // The following is substantially similar to the Chromium implementation.
 // If the Chromium implementation diverges the below implementation should be
 // updated to match.
@@ -163,7 +184,6 @@
 #include <string>
 
 #include "include/base/cef_build.h"
-#include "include/base/cef_macros.h"
 #include "include/internal/cef_logging_internal.h"
 
 namespace cef {
@@ -201,21 +221,21 @@
 // A few definitions of macros that don't generate much code. These are used
 // by LOG() and LOG_IF, etc. Since these are used all over our code, it's
 // better to have compact code for these operations.
-#define COMPACT_GOOGLE_LOG_EX_INFO(ClassName, ...)                    \
-  cef::logging::ClassName(__FILE__, __LINE__, cef::logging::LOG_INFO, \
-                          ##__VA_ARGS__)
-#define COMPACT_GOOGLE_LOG_EX_WARNING(ClassName, ...)                    \
-  cef::logging::ClassName(__FILE__, __LINE__, cef::logging::LOG_WARNING, \
-                          ##__VA_ARGS__)
-#define COMPACT_GOOGLE_LOG_EX_ERROR(ClassName, ...)                    \
-  cef::logging::ClassName(__FILE__, __LINE__, cef::logging::LOG_ERROR, \
-                          ##__VA_ARGS__)
-#define COMPACT_GOOGLE_LOG_EX_FATAL(ClassName, ...)                    \
-  cef::logging::ClassName(__FILE__, __LINE__, cef::logging::LOG_FATAL, \
-                          ##__VA_ARGS__)
-#define COMPACT_GOOGLE_LOG_EX_DFATAL(ClassName, ...)                    \
-  cef::logging::ClassName(__FILE__, __LINE__, cef::logging::LOG_DFATAL, \
-                          ##__VA_ARGS__)
+#define COMPACT_GOOGLE_LOG_EX_INFO(ClassName, ...)                        \
+  ::cef::logging::ClassName(__FILE__, __LINE__, ::cef::logging::LOG_INFO, \
+                            ##__VA_ARGS__)
+#define COMPACT_GOOGLE_LOG_EX_WARNING(ClassName, ...)                        \
+  ::cef::logging::ClassName(__FILE__, __LINE__, ::cef::logging::LOG_WARNING, \
+                            ##__VA_ARGS__)
+#define COMPACT_GOOGLE_LOG_EX_ERROR(ClassName, ...)                        \
+  ::cef::logging::ClassName(__FILE__, __LINE__, ::cef::logging::LOG_ERROR, \
+                            ##__VA_ARGS__)
+#define COMPACT_GOOGLE_LOG_EX_FATAL(ClassName, ...)                        \
+  ::cef::logging::ClassName(__FILE__, __LINE__, ::cef::logging::LOG_FATAL, \
+                            ##__VA_ARGS__)
+#define COMPACT_GOOGLE_LOG_EX_DFATAL(ClassName, ...)                        \
+  ::cef::logging::ClassName(__FILE__, __LINE__, ::cef::logging::LOG_DFATAL, \
+                            ##__VA_ARGS__)
 
 #define COMPACT_GOOGLE_LOG_INFO COMPACT_GOOGLE_LOG_EX_INFO(LogMessage)
 #define COMPACT_GOOGLE_LOG_WARNING COMPACT_GOOGLE_LOG_EX_WARNING(LogMessage)
@@ -553,12 +573,7 @@
 #define DCHECK_GE(val1, val2) DCHECK_OP(GE, >=, val1, val2)
 #define DCHECK_GT(val1, val2) DCHECK_OP(GT, >, val1, val2)
 
-#if defined(NDEBUG) && defined(OS_CHROMEOS)
-#define NOTREACHED() \
-  LOG(ERROR) << "NOTREACHED() hit in " << __FUNCTION__ << ". "
-#else
 #define NOTREACHED() DCHECK(false)
-#endif
 
 // Redefine the standard assert to use our nice log files
 #undef assert
@@ -587,6 +602,9 @@
              LogSeverity severity,
              std::string* result);
 
+  LogMessage(const LogMessage&) = delete;
+  LogMessage& operator=(const LogMessage&) = delete;
+
   ~LogMessage();
 
   std::ostream& stream() { return stream_; }
@@ -618,8 +636,6 @@
 
   SaveLastError last_error_;
 #endif
-
-  DISALLOW_COPY_AND_ASSIGN(LogMessage);
 };
 
 // A non-macro interface to the log facility; (useful
@@ -659,6 +675,9 @@
                        LogSeverity severity,
                        SystemErrorCode err);
 
+  Win32ErrorLogMessage(const Win32ErrorLogMessage&) = delete;
+  Win32ErrorLogMessage& operator=(const Win32ErrorLogMessage&) = delete;
+
   // Appends the error message before destructing the encapsulated class.
   ~Win32ErrorLogMessage();
 
@@ -667,8 +686,6 @@
  private:
   SystemErrorCode err_;
   LogMessage log_message_;
-
-  DISALLOW_COPY_AND_ASSIGN(Win32ErrorLogMessage);
 };
 #elif defined(OS_POSIX)
 // Appends a formatted system message of the errno type
@@ -679,6 +696,9 @@
                   LogSeverity severity,
                   SystemErrorCode err);
 
+  ErrnoLogMessage(const ErrnoLogMessage&) = delete;
+  ErrnoLogMessage& operator=(const ErrnoLogMessage&) = delete;
+
   // Appends the error message before destructing the encapsulated class.
   ~ErrnoLogMessage();
 
@@ -687,8 +707,6 @@
  private:
   SystemErrorCode err_;
   LogMessage log_message_;
-
-  DISALLOW_COPY_AND_ASSIGN(ErrnoLogMessage);
 };
 #endif  // OS_WIN
 
@@ -705,6 +723,13 @@
 inline std::ostream& operator<<(std::ostream& out, const std::wstring& wstr) {
   return out << wstr.c_str();
 }
+#if defined(WCHAR_T_IS_UTF32)
+std::ostream& operator<<(std::ostream& out, const char16_t* wstr);
+#elif defined(WCHAR_T_IS_UTF16)
+inline std::ostream& operator<<(std::ostream& out, const char16_t* wstr) {
+  return operator<<(out, reinterpret_cast<const wchar_t*>(wstr));
+}
+#endif
 
 // The NOTIMPLEMENTED() macro annotates codepaths which have
 // not been implemented yet.
diff --git a/src/include/base/cef_macros.h b/src/include/base/cef_macros.h
index e714529..f5517f9 100644
--- a/src/include/base/cef_macros.h
+++ b/src/include/base/cef_macros.h
@@ -32,189 +32,32 @@
 #define CEF_INCLUDE_BASE_CEF_MACROS_H_
 #pragma once
 
-#if defined(USING_CHROMIUM_INCLUDES)
-// When building CEF include the Chromium header directly.
-#include "base/macros.h"
-
-#else  // !USING_CHROMIUM_INCLUDES
+#if !defined(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 <stddef.h>                  // For size_t.
-#include "include/base/cef_build.h"  // For COMPILER_MSVC
+// ALL DISALLOW_xxx MACROS ARE DEPRECATED; DO NOT USE IN NEW CODE.
+// Use explicit deletions instead. For more information see
+// https://chromium.googlesource.com/chromium/src/+/lkgr/styleguide/c++/c++-dos-and-donts.md#explicitly-declare-class-copyability_movability
 
-#if !defined(arraysize)
+// DEPRECATED: See above. Makes a class uncopyable.
+#define DISALLOW_COPY(TypeName) TypeName(const TypeName&) = delete
 
-// The arraysize(arr) macro returns the # of elements in an array arr.
-// The expression is a compile-time constant, and therefore can be
-// used in defining new arrays, for example.  If you use arraysize on
-// a pointer by mistake, you will get a compile-time error.
-//
-// One caveat is that arraysize() doesn't accept any array of an
-// anonymous type or a type defined inside a function.  In these rare
-// cases, you have to use the unsafe ARRAYSIZE_UNSAFE() macro below.  This is
-// due to a limitation in C++'s template system.  The limitation might
-// eventually be removed, but it hasn't happened yet.
+// DEPRECATED: See above. Makes a class unassignable.
+#define DISALLOW_ASSIGN(TypeName) TypeName& operator=(const TypeName&) = delete
 
-// This template function declaration is used in defining arraysize.
-// Note that the function doesn't need an implementation, as we only
-// use its type.
-template <typename T, size_t N>
-char (&ArraySizeHelper(T (&array)[N]))[N];
-
-// That gcc wants both of these prototypes seems mysterious. VC, for
-// its part, can't decide which to use (another mystery). Matching of
-// template overloads: the final frontier.
-#ifndef _MSC_VER
-template <typename T, size_t N>
-char (&ArraySizeHelper(const T (&array)[N]))[N];
-#endif
-
-#define arraysize(array) (sizeof(ArraySizeHelper(array)))
-
-#endif  // !arraysize
-
-#if !defined(DISALLOW_COPY_AND_ASSIGN)
-
-// A macro to disallow the copy constructor and operator= functions
-// This should be used in the private: declarations for a class
+// DEPRECATED: See above. Makes a class uncopyable and unassignable.
 #define DISALLOW_COPY_AND_ASSIGN(TypeName) \
-  TypeName(const TypeName&);               \
-  void operator=(const TypeName&)
+  DISALLOW_COPY(TypeName);                 \
+  DISALLOW_ASSIGN(TypeName)
 
-#endif  // !DISALLOW_COPY_AND_ASSIGN
-
-#if !defined(DISALLOW_IMPLICIT_CONSTRUCTORS)
-
-// A macro to disallow all the implicit constructors, namely the
+// DEPRECATED: See above. Disallow all implicit constructors, namely the
 // default constructor, copy constructor and operator= functions.
-//
-// This should be used in the private: declarations for a class
-// that wants to prevent anyone from instantiating it. This is
-// especially useful for classes containing only static methods.
 #define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
-  TypeName();                                    \
+  TypeName() = delete;                           \
   DISALLOW_COPY_AND_ASSIGN(TypeName)
 
-#endif  // !DISALLOW_IMPLICIT_CONSTRUCTORS
-
-#if !defined(COMPILE_ASSERT)
-
-// The COMPILE_ASSERT macro can be used to verify that a compile time
-// expression is true. For example, you could use it to verify the
-// size of a static array:
-//
-//   COMPILE_ASSERT(ARRAYSIZE_UNSAFE(content_type_names) == CONTENT_NUM_TYPES,
-//                  content_type_names_incorrect_size);
-//
-// or to make sure a struct is smaller than a certain size:
-//
-//   COMPILE_ASSERT(sizeof(foo) < 128, foo_too_large);
-//
-// The second argument to the macro is the name of the variable. If
-// the expression is false, most compilers will issue a warning/error
-// containing the name of the variable.
-
-#if __cplusplus >= 201103L
-
-// Under C++11, just use static_assert.
-#define COMPILE_ASSERT(expr, msg) static_assert(expr, #msg)
-
-#else
-
-namespace cef {
-
-template <bool>
-struct CompileAssert {};
-
-}  // namespace cef
-
-#define COMPILE_ASSERT(expr, msg)          \
-  typedef cef::CompileAssert<(bool(expr))> \
-      msg[bool(expr) ? 1 : -1] ALLOW_UNUSED_TYPE
-
-// Implementation details of COMPILE_ASSERT:
-//
-// - COMPILE_ASSERT works by defining an array type that has -1
-//   elements (and thus is invalid) when the expression is false.
-//
-// - The simpler definition
-//
-//     #define COMPILE_ASSERT(expr, msg) typedef char msg[(expr) ? 1 : -1]
-//
-//   does not work, as gcc supports variable-length arrays whose sizes
-//   are determined at run-time (this is gcc's extension and not part
-//   of the C++ standard).  As a result, gcc fails to reject the
-//   following code with the simple definition:
-//
-//     int foo;
-//     COMPILE_ASSERT(foo, msg); // not supposed to compile as foo is
-//                               // not a compile-time constant.
-//
-// - By using the type CompileAssert<(bool(expr))>, we ensures that
-//   expr is a compile-time constant.  (Template arguments must be
-//   determined at compile-time.)
-//
-// - The outer parentheses in CompileAssert<(bool(expr))> are necessary
-//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written
-//
-//     CompileAssert<bool(expr)>
-//
-//   instead, these compilers will refuse to compile
-//
-//     COMPILE_ASSERT(5 > 0, some_message);
-//
-//   (They seem to think the ">" in "5 > 0" marks the end of the
-//   template argument list.)
-//
-// - The array size is (bool(expr) ? 1 : -1), instead of simply
-//
-//     ((expr) ? 1 : -1).
-//
-//   This is to avoid running into a bug in MS VC 7.1, which
-//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
-
-#endif  // !(__cplusplus >= 201103L)
-
-#endif  // !defined(COMPILE_ASSERT)
-
 #endif  // !USING_CHROMIUM_INCLUDES
 
-#if !defined(MSVC_PUSH_DISABLE_WARNING) && defined(COMPILER_MSVC)
-
-// MSVC_PUSH_DISABLE_WARNING pushes |n| onto a stack of warnings to be disabled.
-// The warning remains disabled until popped by MSVC_POP_WARNING.
-#define MSVC_PUSH_DISABLE_WARNING(n) \
-  __pragma(warning(push)) __pragma(warning(disable : n))
-
-// MSVC_PUSH_WARNING_LEVEL pushes |n| as the global warning level.  The level
-// remains in effect until popped by MSVC_POP_WARNING().  Use 0 to disable all
-// warnings.
-#define MSVC_PUSH_WARNING_LEVEL(n) __pragma(warning(push, n))
-
-// Pop effects of innermost MSVC_PUSH_* macro.
-#define MSVC_POP_WARNING() __pragma(warning(pop))
-
-#endif  // !defined(MSVC_PUSH_DISABLE_WARNING) && defined(COMPILER_MSVC)
-
-#if !defined(ALLOW_THIS_IN_INITIALIZER_LIST)
-#if defined(COMPILER_MSVC)
-// Allows |this| to be passed as an argument in constructor initializer lists.
-// This uses push/pop instead of the seemingly simpler suppress feature to avoid
-// having the warning be disabled for more than just |code|.
-//
-// Example usage:
-// Foo::Foo() : x(NULL), ALLOW_THIS_IN_INITIALIZER_LIST(y(this)), z(3) {}
-//
-// Compiler warning C4355: 'this': used in base member initializer list:
-// http://msdn.microsoft.com/en-us/library/3c594ae3(VS.80).aspx
-#define ALLOW_THIS_IN_INITIALIZER_LIST(code) \
-  MSVC_PUSH_DISABLE_WARNING(4355)            \
-  code MSVC_POP_WARNING()
-#else  // !COMPILER_MSVC
-#define ALLOW_THIS_IN_INITIALIZER_LIST(code) code
-#endif  // !COMPILER_MSVC
-#endif  // !ALLOW_THIS_IN_INITIALIZER_LIST
-
 #endif  // CEF_INCLUDE_BASE_CEF_MACROS_H_
diff --git a/src/include/base/cef_move.h b/src/include/base/cef_move.h
deleted file mode 100644
index da47d2d..0000000
--- a/src/include/base/cef_move.h
+++ /dev/null
@@ -1,261 +0,0 @@
-// 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_MOVE_H_
-#define CEF_INCLUDE_BASE_CEF_MOVE_H_
-
-#if defined(MOVE_ONLY_TYPE_FOR_CPP_03)
-// Do nothing if the macro in this header has already been defined.
-// 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/move.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.
-
-// Macro with the boilerplate that makes a type move-only in C++03.
-//
-// USAGE
-//
-// This macro should be used instead of DISALLOW_COPY_AND_ASSIGN to create
-// a "move-only" type.  Unlike DISALLOW_COPY_AND_ASSIGN, this macro should be
-// the first line in a class declaration.
-//
-// A class using this macro must call .Pass() (or somehow be an r-value already)
-// before it can be:
-//
-//   * Passed as a function argument
-//   * Used as the right-hand side of an assignment
-//   * Returned from a function
-//
-// Each class will still need to define their own "move constructor" and "move
-// operator=" to make this useful.  Here's an example of the macro, the move
-// constructor, and the move operator= from the scoped_ptr class:
-//
-//  template <typename T>
-//  class scoped_ptr {
-//     MOVE_ONLY_TYPE_FOR_CPP_03(scoped_ptr, RValue)
-//   public:
-//    scoped_ptr(RValue& other) : ptr_(other.release()) { }
-//    scoped_ptr& operator=(RValue& other) {
-//      swap(other);
-//      return *this;
-//    }
-//  };
-//
-// Note that the constructor must NOT be marked explicit.
-//
-// For consistency, the second parameter to the macro should always be RValue
-// unless you have a strong reason to do otherwise.  It is only exposed as a
-// macro parameter so that the move constructor and move operator= don't look
-// like they're using a phantom type.
-//
-//
-// HOW THIS WORKS
-//
-// For a thorough explanation of this technique, see:
-//
-//   http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Move_Constructor
-//
-// The summary is that we take advantage of 2 properties:
-//
-//   1) non-const references will not bind to r-values.
-//   2) C++ can apply one user-defined conversion when initializing a
-//      variable.
-//
-// The first lets us disable the copy constructor and assignment operator
-// by declaring private version of them with a non-const reference parameter.
-//
-// For l-values, direct initialization still fails like in
-// DISALLOW_COPY_AND_ASSIGN because the copy constructor and assignment
-// operators are private.
-//
-// For r-values, the situation is different. The copy constructor and
-// assignment operator are not viable due to (1), so we are trying to call
-// a non-existent constructor and non-existing operator= rather than a private
-// one.  Since we have not committed an error quite yet, we can provide an
-// alternate conversion sequence and a constructor.  We add
-//
-//   * a private struct named "RValue"
-//   * a user-defined conversion "operator RValue()"
-//   * a "move constructor" and "move operator=" that take the RValue& as
-//     their sole parameter.
-//
-// Only r-values will trigger this sequence and execute our "move constructor"
-// or "move operator=."  L-values will match the private copy constructor and
-// operator= first giving a "private in this context" error.  This combination
-// gives us a move-only type.
-//
-// For signaling a destructive transfer of data from an l-value, we provide a
-// method named Pass() which creates an r-value for the current instance
-// triggering the move constructor or move operator=.
-//
-// Other ways to get r-values is to use the result of an expression like a
-// function call.
-//
-// Here's an example with comments explaining what gets triggered where:
-//
-//    class Foo {
-//      MOVE_ONLY_TYPE_FOR_CPP_03(Foo, RValue);
-//
-//     public:
-//       ... API ...
-//       Foo(RValue other);           // Move constructor.
-//       Foo& operator=(RValue rhs);  // Move operator=
-//    };
-//
-//    Foo MakeFoo();  // Function that returns a Foo.
-//
-//    Foo f;
-//    Foo f_copy(f);  // ERROR: Foo(Foo&) is private in this context.
-//    Foo f_assign;
-//    f_assign = f;   // ERROR: operator=(Foo&) is private in this context.
-//
-//
-//    Foo f(MakeFoo());      // R-value so alternate conversion executed.
-//    Foo f_copy(f.Pass());  // R-value so alternate conversion executed.
-//    f = f_copy.Pass();     // R-value so alternate conversion executed.
-//
-//
-// IMPLEMENTATION SUBTLETIES WITH RValue
-//
-// The RValue struct is just a container for a pointer back to the original
-// object. It should only ever be created as a temporary, and no external
-// class should ever declare it or use it in a parameter.
-//
-// It is tempting to want to use the RValue type in function parameters, but
-// excluding the limited usage here for the move constructor and move
-// operator=, doing so would mean that the function could take both r-values
-// and l-values equially which is unexpected.  See COMPARED To Boost.Move for
-// more details.
-//
-// An alternate, and incorrect, implementation of the RValue class used by
-// Boost.Move makes RValue a fieldless child of the move-only type. RValue&
-// is then used in place of RValue in the various operators.  The RValue& is
-// "created" by doing *reinterpret_cast<RValue*>(this).  This has the appeal
-// of never creating a temporary RValue struct even with optimizations
-// disabled.  Also, by virtue of inheritance you can treat the RValue
-// reference as if it were the move-only type itself.  Unfortunately,
-// using the result of this reinterpret_cast<> is actually undefined behavior
-// due to C++98 5.2.10.7. In certain compilers (e.g., NaCl) the optimizer
-// will generate non-working code.
-//
-// In optimized builds, both implementations generate the same assembly so we
-// choose the one that adheres to the standard.
-//
-//
-// WHY HAVE typedef void MoveOnlyTypeForCPP03
-//
-// Callback<>/Bind() needs to understand movable-but-not-copyable semantics
-// to call .Pass() appropriately when it is expected to transfer the value.
-// The cryptic typedef MoveOnlyTypeForCPP03 is added to make this check
-// easy and automatic in helper templates for Callback<>/Bind().
-// See IsMoveOnlyType template and its usage in base/callback_internal.h
-// for more details.
-//
-//
-// COMPARED TO C++11
-//
-// In C++11, you would implement this functionality using an r-value reference
-// and our .Pass() method would be replaced with a call to std::move().
-//
-// This emulation also has a deficiency where it uses up the single
-// user-defined conversion allowed by C++ during initialization.  This can
-// cause problems in some API edge cases.  For instance, in scoped_ptr, it is
-// impossible to make a function "void Foo(scoped_ptr<Parent> p)" accept a
-// value of type scoped_ptr<Child> even if you add a constructor to
-// scoped_ptr<> that would make it look like it should work.  C++11 does not
-// have this deficiency.
-//
-//
-// COMPARED TO Boost.Move
-//
-// Our implementation similar to Boost.Move, but we keep the RValue struct
-// private to the move-only type, and we don't use the reinterpret_cast<> hack.
-//
-// In Boost.Move, RValue is the boost::rv<> template.  This type can be used
-// when writing APIs like:
-//
-//   void MyFunc(boost::rv<Foo>& f)
-//
-// that can take advantage of rv<> to avoid extra copies of a type.  However you
-// would still be able to call this version of MyFunc with an l-value:
-//
-//   Foo f;
-//   MyFunc(f);  // Uh oh, we probably just destroyed |f| w/o calling Pass().
-//
-// unless someone is very careful to also declare a parallel override like:
-//
-//   void MyFunc(const Foo& f)
-//
-// that would catch the l-values first.  This was declared unsafe in C++11 and
-// a C++11 compiler will explicitly fail MyFunc(f).  Unfortunately, we cannot
-// ensure this in C++03.
-//
-// Since we have no need for writing such APIs yet, our implementation keeps
-// RValue private and uses a .Pass() method to do the conversion instead of
-// trying to write a version of "std::move()." Writing an API like std::move()
-// would require the RValue struct to be public.
-//
-//
-// CAVEATS
-//
-// If you include a move-only type as a field inside a class that does not
-// explicitly declare a copy constructor, the containing class's implicit
-// copy constructor will change from Containing(const Containing&) to
-// Containing(Containing&).  This can cause some unexpected errors.
-//
-//   http://llvm.org/bugs/show_bug.cgi?id=11528
-//
-// The workaround is to explicitly declare your copy constructor.
-//
-#define MOVE_ONLY_TYPE_FOR_CPP_03(type, rvalue_type)       \
- private:                                                  \
-  struct rvalue_type {                                     \
-    explicit rvalue_type(type* object) : object(object) {} \
-    type* object;                                          \
-  };                                                       \
-  type(type&);                                             \
-  void operator=(type&);                                   \
-                                                           \
- public:                                                   \
-  operator rvalue_type() { return rvalue_type(this); }     \
-  type Pass() { return type(rvalue_type(this)); }          \
-  typedef void MoveOnlyTypeForCPP03;                       \
-                                                           \
- private:
-
-#endif  // !USING_CHROMIUM_INCLUDES
-
-#endif  // CEF_INCLUDE_BASE_CEF_MOVE_H_
diff --git a/src/include/base/cef_platform_thread.h b/src/include/base/cef_platform_thread.h
index d3fdd79..8e6dd05 100644
--- a/src/include/base/cef_platform_thread.h
+++ b/src/include/base/cef_platform_thread.h
@@ -35,12 +35,7 @@
 #ifndef CEF_INCLUDE_BASE_PLATFORM_THREAD_H_
 #define CEF_INCLUDE_BASE_PLATFORM_THREAD_H_
 
-#if defined(BASE_THREADING_PLATFORM_THREAD_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)
+#if defined(USING_CHROMIUM_INCLUDES)
 // When building CEF include the Chromium header directly.
 #include "base/threading/platform_thread.h"
 #else  // !USING_CHROMIUM_INCLUDES
@@ -48,23 +43,26 @@
 // If the Chromium implementation diverges the below implementation should be
 // updated to match.
 
-#include "include/base/cef_basictypes.h"
 #include "include/base/cef_build.h"
 #include "include/internal/cef_thread_internal.h"
 
 namespace base {
 
-// Used for logging. Always an integer value.
+///
+/// Used for logging. Always an integer value.
+///
 typedef cef_platform_thread_id_t PlatformThreadId;
 
-// Used for thread checking and debugging.
-// Meant to be as fast as possible.
-// These are produced by PlatformThread::CurrentRef(), and used to later
-// check if we are on the same thread or not by using ==. These are safe
-// to copy between threads, but can't be copied to another process as they
-// have no meaning there. Also, the internal identifier can be re-used
-// after a thread dies, so a PlatformThreadRef cannot be reliably used
-// to distinguish a new thread from an old, dead thread.
+///
+/// Used for thread checking and debugging.
+/// Meant to be as fast as possible.
+/// These are produced by PlatformThread::CurrentRef(), and used to later
+/// check if we are on the same thread or not by using ==. These are safe
+/// to copy between threads, but can't be copied to another process as they
+/// have no meaning there. Also, the internal identifier can be re-used
+/// after a thread dies, so a PlatformThreadRef cannot be reliably used
+/// to distinguish a new thread from an old, dead thread.
+///
 class PlatformThreadRef {
  public:
   typedef cef_platform_thread_handle_t RefType;
@@ -81,18 +79,24 @@
   RefType id_;
 };
 
-// A namespace for low-level thread functions.
-// Chromium uses a class with static methods but CEF uses an actual namespace
-// to avoid linker problems with the sandbox libaries on Windows.
+///
+/// A namespace for low-level thread functions.
+/// Chromium uses a class with static methods but CEF uses an actual namespace
+/// to avoid linker problems with the sandbox libaries on Windows.
+///
 namespace PlatformThread {
 
-// Gets the current thread id, which may be useful for logging purposes.
+///
+/// Gets the current thread id, which may be useful for logging purposes.
+///
 inline PlatformThreadId CurrentId() {
   return cef_get_current_platform_thread_id();
 }
 
-// Gets the current thread reference, which can be used to check if
-// we're on the right thread quickly.
+///
+/// Gets the current thread reference, which can be used to check if
+/// we're on the right thread quickly.
+///
 inline PlatformThreadRef CurrentRef() {
   return PlatformThreadRef(cef_get_current_platform_thread_handle());
 }
diff --git a/src/include/cef_request_callback.h b/src/include/base/cef_ptr_util.h
similarity index 61%
copy from src/include/cef_request_callback.h
copy to src/include/base/cef_ptr_util.h
index 68094de..082b87a 100644
--- a/src/include/cef_request_callback.h
+++ b/src/include/base/cef_ptr_util.h
@@ -1,4 +1,5 @@
-// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2021 Marshall A. Greenblatt. Portions copyright (c) 2015
+// 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
@@ -26,38 +27,34 @@
 // 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.
-//
-// ---------------------------------------------------------------------------
-//
-// The contents of this file must follow a specific format in order to
-// support the CEF translator tool. See the translator.README.txt file in the
-// tools directory for more information.
-//
 
-#ifndef CEF_INCLUDE_CEF_REQUEST_CALLBACK_H_
-#define CEF_INCLUDE_CEF_REQUEST_CALLBACK_H_
+#ifndef INCLUDE_BASE_CEF_PTR_UTIL_H_
+#define INCLUDE_BASE_CEF_PTR_UTIL_H_
 #pragma once
 
-#include "include/cef_base.h"
+#if defined(USING_CHROMIUM_INCLUDES)
+// When building CEF include the Chromium header directly.
+#include "base/memory/ptr_util.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 <memory>
+#include <utility>
+
+namespace base {
 
 ///
-// Callback interface used for asynchronous continuation of url requests.
+/// Helper to transfer ownership of a raw pointer to a std::unique_ptr<T>.
+/// Note that std::unique_ptr<T> has very different semantics from
+/// std::unique_ptr<T[]>: do not use this helper for array allocations.
 ///
-/*--cef(source=library)--*/
-class CefRequestCallback : public virtual CefBaseRefCounted {
- public:
-  ///
-  // Continue the url request. If |allow| is true the request will be continued.
-  // Otherwise, the request will be canceled.
-  ///
-  /*--cef(capi_name=cont)--*/
-  virtual void Continue(bool allow) = 0;
+template <typename T>
+std::unique_ptr<T> WrapUnique(T* ptr) {
+  return std::unique_ptr<T>(ptr);
+}
 
-  ///
-  // Cancel the url request.
-  ///
-  /*--cef()--*/
-  virtual void Cancel() = 0;
-};
+}  // namespace base
 
-#endif  // CEF_INCLUDE_CEF_REQUEST_CALLBACK_H_
+#endif  // INCLUDE_BASE_CEF_PTR_UTIL_H_
diff --git a/src/include/base/cef_ref_counted.h b/src/include/base/cef_ref_counted.h
index 7a68707..58c40d8 100644
--- a/src/include/base/cef_ref_counted.h
+++ b/src/include/base/cef_ref_counted.h
@@ -33,12 +33,7 @@
 #define CEF_INCLUDE_BASE_CEF_REF_COUNTED_H_
 #pragma once
 
-#if defined(BASE_MEMORY_REF_COUNTED_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)
+#if defined(USING_CHROMIUM_INCLUDES)
 // When building CEF include the Chromium header directly.
 #include "base/memory/ref_counted.h"
 #else  // !USING_CHROMIUM_INCLUDES
@@ -46,15 +41,18 @@
 // If the Chromium implementation diverges the below implementation should be
 // updated to match.
 
-#include <cassert>
+#include <stddef.h>
+
+#include <utility>
 
 #include "include/base/cef_atomic_ref_count.h"
 #include "include/base/cef_build.h"
+#include "include/base/cef_compiler_specific.h"
 #include "include/base/cef_logging.h"
-#include "include/base/cef_macros.h"
+#include "include/base/cef_scoped_refptr.h"
+#include "include/base/cef_thread_checker.h"
 
 namespace base {
-
 namespace cef_subtle {
 
 class RefCountedBase {
@@ -63,15 +61,22 @@
   bool HasAtLeastOneRef() const { return ref_count_ >= 1; }
 
  protected:
-  RefCountedBase()
-      : ref_count_(0)
+  explicit RefCountedBase(StartRefCountFromZeroTag) {
 #if DCHECK_IS_ON()
-        ,
-        in_dtor_(false)
+    thread_checker_.DetachFromThread();
 #endif
-  {
   }
 
+  explicit RefCountedBase(StartRefCountFromOneTag) : ref_count_(1) {
+#if DCHECK_IS_ON()
+    needs_adopt_ref_ = true;
+    thread_checker_.DetachFromThread();
+#endif
+  }
+
+  RefCountedBase(const RefCountedBase&) = delete;
+  RefCountedBase& operator=(const RefCountedBase&) = delete;
+
   ~RefCountedBase() {
 #if DCHECK_IS_ON()
     DCHECK(in_dtor_) << "RefCounted object deleted without calling Release()";
@@ -81,31 +86,92 @@
   void AddRef() const {
 #if DCHECK_IS_ON()
     DCHECK(!in_dtor_);
+    DCHECK(!needs_adopt_ref_)
+        << "This RefCounted object is created with non-zero reference count."
+        << " The first reference to such a object has to be made by AdoptRef or"
+        << " MakeRefCounted.";
+    if (ref_count_ >= 1) {
+      DCHECK(CalledOnValidThread());
+    }
 #endif
-    ++ref_count_;
+
+    AddRefImpl();
   }
 
   // Returns true if the object should self-delete.
   bool Release() const {
+    ReleaseImpl();
+
 #if DCHECK_IS_ON()
     DCHECK(!in_dtor_);
-#endif
-    if (--ref_count_ == 0) {
-#if DCHECK_IS_ON()
+    if (ref_count_ == 0) {
       in_dtor_ = true;
-#endif
-      return true;
     }
-    return false;
+
+    if (ref_count_ >= 1) {
+      DCHECK(CalledOnValidThread());
+    }
+    if (ref_count_ == 1) {
+      thread_checker_.DetachFromThread();
+    }
+#endif
+
+    return ref_count_ == 0;
+  }
+
+  // Returns true if it is safe to read or write the object, from a thread
+  // safety standpoint. Should be DCHECK'd from the methods of RefCounted
+  // classes if there is a danger of objects being shared across threads.
+  //
+  // This produces fewer false positives than adding a separate ThreadChecker
+  // into the subclass, because it automatically detaches from the thread when
+  // the reference count is 1 (and never fails if there is only one reference).
+  //
+  // This means unlike a separate ThreadChecker, it will permit a singly
+  // referenced object to be passed between threads (not holding a reference on
+  // the sending thread), but will trap if the sending thread holds onto a
+  // reference, or if the object is accessed from multiple threads
+  // simultaneously.
+  bool IsOnValidThread() const {
+#if DCHECK_IS_ON()
+    return ref_count_ <= 1 || CalledOnValidThread();
+#else
+    return true;
+#endif
   }
 
  private:
-  mutable int ref_count_;
+  template <typename U>
+  friend scoped_refptr<U> base::AdoptRef(U*);
+
+  void Adopted() const {
 #if DCHECK_IS_ON()
-  mutable bool in_dtor_;
+    DCHECK(needs_adopt_ref_);
+    needs_adopt_ref_ = false;
+#endif
+  }
+
+#if defined(ARCH_CPU_64_BITS)
+  void AddRefImpl() const;
+  void ReleaseImpl() const;
+#else
+  void AddRefImpl() const { ++ref_count_; }
+  void ReleaseImpl() const { --ref_count_; }
 #endif
 
-  DISALLOW_COPY_AND_ASSIGN(RefCountedBase);
+#if DCHECK_IS_ON()
+  bool CalledOnValidThread() const;
+#endif
+
+  mutable uint32_t ref_count_ = 0;
+  static_assert(std::is_unsigned<decltype(ref_count_)>::value,
+                "ref_count_ must be an unsigned type.");
+
+#if DCHECK_IS_ON()
+  mutable bool needs_adopt_ref_ = false;
+  mutable bool in_dtor_ = false;
+  mutable ThreadChecker thread_checker_;
+#endif
 };
 
 class RefCountedThreadSafeBase {
@@ -114,65 +180,227 @@
   bool HasAtLeastOneRef() const;
 
  protected:
-  RefCountedThreadSafeBase();
-  ~RefCountedThreadSafeBase();
-
-  void AddRef() const;
-
-  // Returns true if the object should self-delete.
-  bool Release() const;
-
- private:
-  mutable AtomicRefCount ref_count_;
+  explicit constexpr RefCountedThreadSafeBase(StartRefCountFromZeroTag) {}
+  explicit constexpr RefCountedThreadSafeBase(StartRefCountFromOneTag)
+      : ref_count_(1) {
 #if DCHECK_IS_ON()
-  mutable bool in_dtor_;
+    needs_adopt_ref_ = true;
+#endif
+  }
+
+  RefCountedThreadSafeBase(const RefCountedThreadSafeBase&) = delete;
+  RefCountedThreadSafeBase& operator=(const RefCountedThreadSafeBase&) = delete;
+
+#if DCHECK_IS_ON()
+  ~RefCountedThreadSafeBase();
+#else
+  ~RefCountedThreadSafeBase() = default;
 #endif
 
-  DISALLOW_COPY_AND_ASSIGN(RefCountedThreadSafeBase);
+// Release and AddRef are suitable for inlining on X86 because they generate
+// very small code threads. On other platforms (ARM), it causes a size
+// regression and is probably not worth it.
+#if defined(ARCH_CPU_X86_FAMILY)
+  // Returns true if the object should self-delete.
+  bool Release() const { return ReleaseImpl(); }
+  void AddRef() const { AddRefImpl(); }
+  void AddRefWithCheck() const { AddRefWithCheckImpl(); }
+#else
+  // Returns true if the object should self-delete.
+  bool Release() const;
+  void AddRef() const;
+  void AddRefWithCheck() const;
+#endif
+
+ private:
+  template <typename U>
+  friend scoped_refptr<U> base::AdoptRef(U*);
+
+  void Adopted() const {
+#if DCHECK_IS_ON()
+    DCHECK(needs_adopt_ref_);
+    needs_adopt_ref_ = false;
+#endif
+  }
+
+  ALWAYS_INLINE void AddRefImpl() const {
+#if DCHECK_IS_ON()
+    DCHECK(!in_dtor_);
+    DCHECK(!needs_adopt_ref_)
+        << "This RefCounted object is created with non-zero reference count."
+        << " The first reference to such a object has to be made by AdoptRef or"
+        << " MakeRefCounted.";
+#endif
+    ref_count_.Increment();
+  }
+
+  ALWAYS_INLINE void AddRefWithCheckImpl() const {
+#if DCHECK_IS_ON()
+    DCHECK(!in_dtor_);
+    DCHECK(!needs_adopt_ref_)
+        << "This RefCounted object is created with non-zero reference count."
+        << " The first reference to such a object has to be made by AdoptRef or"
+        << " MakeRefCounted.";
+#endif
+    CHECK(ref_count_.Increment() > 0);
+  }
+
+  ALWAYS_INLINE bool ReleaseImpl() const {
+#if DCHECK_IS_ON()
+    DCHECK(!in_dtor_);
+    DCHECK(!ref_count_.IsZero());
+#endif
+    if (!ref_count_.Decrement()) {
+#if DCHECK_IS_ON()
+      in_dtor_ = true;
+#endif
+      return true;
+    }
+    return false;
+  }
+
+  mutable AtomicRefCount ref_count_{0};
+#if DCHECK_IS_ON()
+  mutable bool needs_adopt_ref_ = false;
+  mutable bool in_dtor_ = false;
+#endif
+};
+
+// ScopedAllowCrossThreadRefCountAccess disables the check documented on
+// RefCounted below for rare pre-existing use cases where thread-safety was
+// guaranteed through other means (e.g. explicit sequencing of calls across
+// execution threads when bouncing between threads in order). New callers
+// should refrain from using this (callsites handling thread-safety through
+// locks should use RefCountedThreadSafe per the overhead of its atomics being
+// negligible compared to locks anyways and callsites doing explicit sequencing
+// should properly std::move() the ref to avoid hitting this check).
+// TODO(tzik): Cleanup existing use cases and remove
+// ScopedAllowCrossThreadRefCountAccess.
+class ScopedAllowCrossThreadRefCountAccess final {
+ public:
+#if DCHECK_IS_ON()
+  ScopedAllowCrossThreadRefCountAccess();
+  ~ScopedAllowCrossThreadRefCountAccess();
+#else
+  ScopedAllowCrossThreadRefCountAccess() {}
+  ~ScopedAllowCrossThreadRefCountAccess() {}
+#endif
 };
 
 }  // namespace cef_subtle
 
-//
-// A base class for reference counted classes.  Otherwise, known as a cheap
-// knock-off of WebKit's RefCounted<T> class.  To use this guy just extend your
-// class from it like so:
-//
-//   class MyFoo : public base::RefCounted<MyFoo> {
-//    ...
-//    private:
-//     friend class base::RefCounted<MyFoo>;
-//     ~MyFoo();
-//   };
-//
-// You should always make your destructor private, to avoid any code deleting
-// the object accidently while there are references to it.
-template <class T>
+using ScopedAllowCrossThreadRefCountAccess =
+    cef_subtle::ScopedAllowCrossThreadRefCountAccess;
+
+///
+/// The reference count starts from zero by default, and we intended to migrate
+/// to start-from-one ref count. Put REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE() to
+/// the ref counted class to opt-in.
+///
+/// If an object has start-from-one ref count, the first scoped_refptr need to
+/// be created by base::AdoptRef() or base::MakeRefCounted(). We can use
+/// base::MakeRefCounted() to create create both type of ref counted object.
+///
+/// The motivations to use start-from-one ref count are:
+///  - Start-from-one ref count doesn't need the ref count increment for the
+///    first reference.
+///  - It can detect an invalid object acquisition for a being-deleted object
+///    that has zero ref count. That tends to happen on custom deleter that
+///    delays the deletion.
+///    TODO(tzik): Implement invalid acquisition detection.
+///  - Behavior parity to Blink's WTF::RefCounted, whose count starts from one.
+///    And start-from-one ref count is a step to merge WTF::RefCounted into
+///    base::RefCounted.
+///
+#define REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE()                 \
+  static constexpr ::base::cef_subtle::StartRefCountFromOneTag \
+      kRefCountPreference = ::base::cef_subtle::kStartRefCountFromOneTag
+
+template <class T, typename Traits>
+class RefCounted;
+
+///
+/// Default traits for RefCounted<T>.  Deletes the object when its ref count
+/// reaches 0. Overload to delete it on a different thread etc.
+///
+template <typename T>
+struct DefaultRefCountedTraits {
+  static void Destruct(const T* x) {
+    RefCounted<T, DefaultRefCountedTraits>::DeleteInternal(x);
+  }
+};
+
+///
+/// A base class for reference counted classes. Otherwise, known as a cheap
+/// knock-off of WebKit's RefCounted<T> class. To use this, just extend your
+/// class from it like so:
+///
+/// <pre>
+///   class MyFoo : public base::RefCounted<MyFoo> {
+///    ...
+///    private:
+///     friend class base::RefCounted<MyFoo>;
+///     ~MyFoo();
+///   };
+/// </pre>
+///
+/// Usage Notes:
+/// 1. You should always make your destructor non-public, to avoid any code
+///    deleting the object accidentally while there are references to it.
+/// 2. You should always make the ref-counted base class a friend of your class,
+///    so that it can access the destructor.
+///
+/// The ref count manipulation to RefCounted is NOT thread safe and has DCHECKs
+/// to trap unsafe cross thread usage. A subclass instance of RefCounted can be
+/// passed to another execution thread only when its ref count is 1. If the ref
+/// count is more than 1, the RefCounted class verifies the ref updates are made
+/// on the same execution thread as the previous ones. The subclass can also
+/// manually call IsOnValidThread to trap other non-thread-safe accesses; see
+/// the documentation for that method.
+///
+template <class T, typename Traits = DefaultRefCountedTraits<T>>
 class RefCounted : public cef_subtle::RefCountedBase {
  public:
-  RefCounted() {}
+  static constexpr cef_subtle::StartRefCountFromZeroTag kRefCountPreference =
+      cef_subtle::kStartRefCountFromZeroTag;
+
+  RefCounted() : cef_subtle::RefCountedBase(T::kRefCountPreference) {}
+
+  RefCounted(const RefCounted&) = delete;
+  RefCounted& operator=(const RefCounted&) = delete;
 
   void AddRef() const { cef_subtle::RefCountedBase::AddRef(); }
 
   void Release() const {
     if (cef_subtle::RefCountedBase::Release()) {
-      delete static_cast<const T*>(this);
+      // Prune the code paths which the static analyzer may take to simulate
+      // object destruction. Use-after-free errors aren't possible given the
+      // lifetime guarantees of the refcounting system.
+      ANALYZER_SKIP_THIS_PATH();
+
+      Traits::Destruct(static_cast<const T*>(this));
     }
   }
 
  protected:
-  ~RefCounted() {}
+  ~RefCounted() = default;
 
  private:
-  DISALLOW_COPY_AND_ASSIGN(RefCounted<T>);
+  friend struct DefaultRefCountedTraits<T>;
+  template <typename U>
+  static void DeleteInternal(const U* x) {
+    delete x;
+  }
 };
 
 // Forward declaration.
 template <class T, typename Traits>
 class RefCountedThreadSafe;
 
-// Default traits for RefCountedThreadSafe<T>.  Deletes the object when its ref
-// count reaches 0.  Overload to delete it on a different thread etc.
+///
+/// Default traits for RefCountedThreadSafe<T>. Deletes the object when its ref
+/// count reaches 0. Overload to delete it on a different thread etc.
+///
 template <typename T>
 struct DefaultRefCountedThreadSafeTraits {
   static void Destruct(const T* x) {
@@ -184,187 +412,100 @@
   }
 };
 
-//
-// A thread-safe variant of RefCounted<T>
-//
-//   class MyFoo : public base::RefCountedThreadSafe<MyFoo> {
-//    ...
-//   };
-//
-// If you're using the default trait, then you should add compile time
-// asserts that no one else is deleting your object.  i.e.
-//    private:
-//     friend class base::RefCountedThreadSafe<MyFoo>;
-//     ~MyFoo();
+///
+/// A thread-safe variant of RefCounted<T>
+///
+/// <pre>
+///   class MyFoo : public base::RefCountedThreadSafe<MyFoo> {
+///    ...
+///   };
+/// </pre>
+///
+/// If you're using the default trait, then you should add compile time
+/// asserts that no one else is deleting your object.  i.e.
+/// <pre>
+///    private:
+///     friend class base::RefCountedThreadSafe<MyFoo>;
+///     ~MyFoo();
+/// </pre>
+///
+/// We can use REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE() with RefCountedThreadSafe
+/// too. See the comment above the RefCounted definition for details.
+///
 template <class T, typename Traits = DefaultRefCountedThreadSafeTraits<T>>
 class RefCountedThreadSafe : public cef_subtle::RefCountedThreadSafeBase {
  public:
-  RefCountedThreadSafe() {}
+  static constexpr cef_subtle::StartRefCountFromZeroTag kRefCountPreference =
+      cef_subtle::kStartRefCountFromZeroTag;
 
-  void AddRef() const { cef_subtle::RefCountedThreadSafeBase::AddRef(); }
+  explicit RefCountedThreadSafe()
+      : cef_subtle::RefCountedThreadSafeBase(T::kRefCountPreference) {}
+
+  RefCountedThreadSafe(const RefCountedThreadSafe&) = delete;
+  RefCountedThreadSafe& operator=(const RefCountedThreadSafe&) = delete;
+
+  void AddRef() const { AddRefImpl(T::kRefCountPreference); }
 
   void Release() const {
     if (cef_subtle::RefCountedThreadSafeBase::Release()) {
+      ANALYZER_SKIP_THIS_PATH();
       Traits::Destruct(static_cast<const T*>(this));
     }
   }
 
  protected:
-  ~RefCountedThreadSafe() {}
+  ~RefCountedThreadSafe() = default;
 
  private:
   friend struct DefaultRefCountedThreadSafeTraits<T>;
-  static void DeleteInternal(const T* x) { delete x; }
+  template <typename U>
+  static void DeleteInternal(const U* x) {
+    delete x;
+  }
 
-  DISALLOW_COPY_AND_ASSIGN(RefCountedThreadSafe);
+  void AddRefImpl(cef_subtle::StartRefCountFromZeroTag) const {
+    cef_subtle::RefCountedThreadSafeBase::AddRef();
+  }
+
+  void AddRefImpl(cef_subtle::StartRefCountFromOneTag) const {
+    cef_subtle::RefCountedThreadSafeBase::AddRefWithCheck();
+  }
 };
 
-//
-// A thread-safe wrapper for some piece of data so we can place other
-// things in scoped_refptrs<>.
-//
+///
+/// A thread-safe wrapper for some piece of data so we can place other
+/// things in scoped_refptrs<>.
+///
 template <typename T>
 class RefCountedData
     : public base::RefCountedThreadSafe<base::RefCountedData<T>> {
  public:
   RefCountedData() : data() {}
   RefCountedData(const T& in_value) : data(in_value) {}
+  RefCountedData(T&& in_value) : data(std::move(in_value)) {}
+  template <typename... Args>
+  explicit RefCountedData(std::in_place_t, Args&&... args)
+      : data(std::forward<Args>(args)...) {}
 
   T data;
 
  private:
   friend class base::RefCountedThreadSafe<base::RefCountedData<T>>;
-  ~RefCountedData() {}
+  ~RefCountedData() = default;
 };
 
+template <typename T>
+bool operator==(const RefCountedData<T>& lhs, const RefCountedData<T>& rhs) {
+  return lhs.data == rhs.data;
+}
+
+template <typename T>
+bool operator!=(const RefCountedData<T>& lhs, const RefCountedData<T>& rhs) {
+  return !(lhs == rhs);
+}
+
 }  // namespace base
 
-//
-// A smart pointer class for reference counted objects.  Use this class instead
-// of calling AddRef and Release manually on a reference counted object to
-// avoid common memory leaks caused by forgetting to Release an object
-// reference.  Sample usage:
-//
-//   class MyFoo : public RefCounted<MyFoo> {
-//    ...
-//   };
-//
-//   void some_function() {
-//     scoped_refptr<MyFoo> foo = new MyFoo();
-//     foo->Method(param);
-//     // |foo| is released when this function returns
-//   }
-//
-//   void some_other_function() {
-//     scoped_refptr<MyFoo> foo = new MyFoo();
-//     ...
-//     foo = NULL;  // explicitly releases |foo|
-//     ...
-//     if (foo)
-//       foo->Method(param);
-//   }
-//
-// The above examples show how scoped_refptr<T> acts like a pointer to T.
-// Given two scoped_refptr<T> classes, it is also possible to exchange
-// references between the two objects, like so:
-//
-//   {
-//     scoped_refptr<MyFoo> a = new MyFoo();
-//     scoped_refptr<MyFoo> b;
-//
-//     b.swap(a);
-//     // now, |b| references the MyFoo object, and |a| references NULL.
-//   }
-//
-// To make both |a| and |b| in the above example reference the same MyFoo
-// object, simply use the assignment operator:
-//
-//   {
-//     scoped_refptr<MyFoo> a = new MyFoo();
-//     scoped_refptr<MyFoo> b;
-//
-//     b = a;
-//     // now, |a| and |b| each own a reference to the same MyFoo object.
-//   }
-//
-template <class T>
-class scoped_refptr {
- public:
-  typedef T element_type;
-
-  scoped_refptr() : ptr_(NULL) {}
-
-  scoped_refptr(T* p) : ptr_(p) {
-    if (ptr_)
-      ptr_->AddRef();
-  }
-
-  scoped_refptr(const scoped_refptr<T>& r) : ptr_(r.ptr_) {
-    if (ptr_)
-      ptr_->AddRef();
-  }
-
-  template <typename U>
-  scoped_refptr(const scoped_refptr<U>& r) : ptr_(r.get()) {
-    if (ptr_)
-      ptr_->AddRef();
-  }
-
-  ~scoped_refptr() {
-    if (ptr_)
-      ptr_->Release();
-  }
-
-  T* get() const { return ptr_; }
-
-  // Allow scoped_refptr<C> to be used in boolean expression
-  // and comparison operations.
-  operator T*() const { return ptr_; }
-
-  T* operator->() const {
-    assert(ptr_ != NULL);
-    return ptr_;
-  }
-
-  scoped_refptr<T>& operator=(T* p) {
-    // AddRef first so that self assignment should work
-    if (p)
-      p->AddRef();
-    T* old_ptr = ptr_;
-    ptr_ = p;
-    if (old_ptr)
-      old_ptr->Release();
-    return *this;
-  }
-
-  scoped_refptr<T>& operator=(const scoped_refptr<T>& r) {
-    return *this = r.ptr_;
-  }
-
-  template <typename U>
-  scoped_refptr<T>& operator=(const scoped_refptr<U>& r) {
-    return *this = r.get();
-  }
-
-  void swap(T** pp) {
-    T* p = ptr_;
-    ptr_ = *pp;
-    *pp = p;
-  }
-
-  void swap(scoped_refptr<T>& r) { swap(&r.ptr_); }
-
- protected:
-  T* ptr_;
-};
-
-// Handy utility for creating a scoped_refptr<T> out of a T* explicitly without
-// having to retype all the template arguments
-template <typename T>
-scoped_refptr<T> make_scoped_refptr(T* t) {
-  return scoped_refptr<T>(t);
-}
-
 #endif  // !USING_CHROMIUM_INCLUDES
 
 #endif  // CEF_INCLUDE_BASE_CEF_REF_COUNTED_H_
diff --git a/src/include/base/cef_scoped_ptr.h b/src/include/base/cef_scoped_ptr.h
deleted file mode 100644
index eb9e0e2..0000000
--- a/src/include/base/cef_scoped_ptr.h
+++ /dev/null
@@ -1,625 +0,0 @@
-// 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.
-
-// Scopers help you manage ownership of a pointer, helping you easily manage a
-// pointer within a scope, and automatically destroying the pointer at the end
-// of a scope.  There are two main classes you will use, which correspond to the
-// operators new/delete and new[]/delete[].
-//
-// Example usage (scoped_ptr<T>):
-//   {
-//     scoped_ptr<Foo> foo(new Foo("wee"));
-//   }  // foo goes out of scope, releasing the pointer with it.
-//
-//   {
-//     scoped_ptr<Foo> foo;          // No pointer managed.
-//     foo.reset(new Foo("wee"));    // Now a pointer is managed.
-//     foo.reset(new Foo("wee2"));   // Foo("wee") was destroyed.
-//     foo.reset(new Foo("wee3"));   // Foo("wee2") was destroyed.
-//     foo->Method();                // Foo::Method() called.
-//     foo.get()->Method();          // Foo::Method() called.
-//     SomeFunc(foo.release());      // SomeFunc takes ownership, foo no longer
-//                                   // manages a pointer.
-//     foo.reset(new Foo("wee4"));   // foo manages a pointer again.
-//     foo.reset();                  // Foo("wee4") destroyed, foo no longer
-//                                   // manages a pointer.
-//   }  // foo wasn't managing a pointer, so nothing was destroyed.
-//
-// Example usage (scoped_ptr<T[]>):
-//   {
-//     scoped_ptr<Foo[]> foo(new Foo[100]);
-//     foo.get()->Method();  // Foo::Method on the 0th element.
-//     foo[10].Method();     // Foo::Method on the 10th element.
-//   }
-//
-// These scopers also implement part of the functionality of C++11 unique_ptr
-// in that they are "movable but not copyable."  You can use the scopers in
-// the parameter and return types of functions to signify ownership transfer
-// in to and out of a function.  When calling a function that has a scoper
-// as the argument type, it must be called with the result of an analogous
-// scoper's Pass() function or another function that generates a temporary;
-// passing by copy will NOT work.  Here is an example using scoped_ptr:
-//
-//   void TakesOwnership(scoped_ptr<Foo> arg) {
-//     // Do something with arg
-//   }
-//   scoped_ptr<Foo> CreateFoo() {
-//     // No need for calling Pass() because we are constructing a temporary
-//     // for the return value.
-//     return scoped_ptr<Foo>(new Foo("new"));
-//   }
-//   scoped_ptr<Foo> PassThru(scoped_ptr<Foo> arg) {
-//     return arg.Pass();
-//   }
-//
-//   {
-//     scoped_ptr<Foo> ptr(new Foo("yay"));  // ptr manages Foo("yay").
-//     TakesOwnership(ptr.Pass());           // ptr no longer owns Foo("yay").
-//     scoped_ptr<Foo> ptr2 = CreateFoo();   // ptr2 owns the return Foo.
-//     scoped_ptr<Foo> ptr3 =                // ptr3 now owns what was in ptr2.
-//         PassThru(ptr2.Pass());            // ptr2 is correspondingly NULL.
-//   }
-//
-// Notice that if you do not call Pass() when returning from PassThru(), or
-// when invoking TakesOwnership(), the code will not compile because scopers
-// are not copyable; they only implement move semantics which require calling
-// the Pass() function to signify a destructive transfer of state. CreateFoo()
-// is different though because we are constructing a temporary on the return
-// line and thus can avoid needing to call Pass().
-//
-// Pass() properly handles upcast in initialization, i.e. you can use a
-// scoped_ptr<Child> to initialize a scoped_ptr<Parent>:
-//
-//   scoped_ptr<Foo> foo(new Foo());
-//   scoped_ptr<FooParent> parent(foo.Pass());
-//
-// PassAs<>() should be used to upcast return value in return statement:
-//
-//   scoped_ptr<Foo> CreateFoo() {
-//     scoped_ptr<FooChild> result(new FooChild());
-//     return result.PassAs<Foo>();
-//   }
-//
-// Note that PassAs<>() is implemented only for scoped_ptr<T>, but not for
-// scoped_ptr<T[]>. This is because casting array pointers may not be safe.
-
-#ifndef CEF_INCLUDE_BASE_CEF_MEMORY_SCOPED_PTR_H_
-#define CEF_INCLUDE_BASE_CEF_MEMORY_SCOPED_PTR_H_
-#pragma once
-
-#if defined(BASE_MEMORY_SCOPED_PTR_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)
-// Do nothing when building CEF.
-#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.
-
-// This is an implementation designed to match the anticipated future TR2
-// implementation of the scoped_ptr class.
-
-#include <assert.h>
-#include <stddef.h>
-#include <stdlib.h>
-
-#include <algorithm>  // For std::swap().
-
-#include "include/base/cef_basictypes.h"
-#include "include/base/cef_build.h"
-#include "include/base/cef_macros.h"
-#include "include/base/cef_move.h"
-#include "include/base/cef_template_util.h"
-
-namespace base {
-
-namespace subtle {
-class RefCountedBase;
-class RefCountedThreadSafeBase;
-}  // namespace subtle
-
-// Function object which deletes its parameter, which must be a pointer.
-// If C is an array type, invokes 'delete[]' on the parameter; otherwise,
-// invokes 'delete'. The default deleter for scoped_ptr<T>.
-template <class T>
-struct DefaultDeleter {
-  DefaultDeleter() {}
-  template <typename U>
-  DefaultDeleter(const DefaultDeleter<U>& other) {
-    // IMPLEMENTATION NOTE: C++11 20.7.1.1.2p2 only provides this constructor
-    // if U* is implicitly convertible to T* and U is not an array type.
-    //
-    // Correct implementation should use SFINAE to disable this
-    // constructor. However, since there are no other 1-argument constructors,
-    // using a COMPILE_ASSERT() based on is_convertible<> and requiring
-    // complete types is simpler and will cause compile failures for equivalent
-    // misuses.
-    //
-    // Note, the is_convertible<U*, T*> check also ensures that U is not an
-    // array. T is guaranteed to be a non-array, so any U* where U is an array
-    // cannot convert to T*.
-    enum { T_must_be_complete = sizeof(T) };
-    enum { U_must_be_complete = sizeof(U) };
-    COMPILE_ASSERT((base::is_convertible<U*, T*>::value),
-                   U_ptr_must_implicitly_convert_to_T_ptr);
-  }
-  inline void operator()(T* ptr) const {
-    enum { type_must_be_complete = sizeof(T) };
-    delete ptr;
-  }
-};
-
-// Specialization of DefaultDeleter for array types.
-template <class T>
-struct DefaultDeleter<T[]> {
-  inline void operator()(T* ptr) const {
-    enum { type_must_be_complete = sizeof(T) };
-    delete[] ptr;
-  }
-
- private:
-  // Disable this operator for any U != T because it is undefined to execute
-  // an array delete when the static type of the array mismatches the dynamic
-  // type.
-  //
-  // References:
-  //   C++98 [expr.delete]p3
-  //   http://cplusplus.github.com/LWG/lwg-defects.html#938
-  template <typename U>
-  void operator()(U* array) const;
-};
-
-template <class T, int n>
-struct DefaultDeleter<T[n]> {
-  // Never allow someone to declare something like scoped_ptr<int[10]>.
-  COMPILE_ASSERT(sizeof(T) == -1, do_not_use_array_with_size_as_type);
-};
-
-// Function object which invokes 'free' on its parameter, which must be
-// a pointer. Can be used to store malloc-allocated pointers in scoped_ptr:
-//
-// scoped_ptr<int, base::FreeDeleter> foo_ptr(
-//     static_cast<int*>(malloc(sizeof(int))));
-struct FreeDeleter {
-  inline void operator()(void* ptr) const { free(ptr); }
-};
-
-namespace cef_internal {
-
-template <typename T>
-struct IsNotRefCounted {
-  enum {
-    value =
-        !base::is_convertible<T*, base::subtle::RefCountedBase*>::value &&
-        !base::is_convertible<T*,
-                              base::subtle::RefCountedThreadSafeBase*>::value
-  };
-};
-
-// Minimal implementation of the core logic of scoped_ptr, suitable for
-// reuse in both scoped_ptr and its specializations.
-template <class T, class D>
-class scoped_ptr_impl {
- public:
-  explicit scoped_ptr_impl(T* p) : data_(p) {}
-
-  // Initializer for deleters that have data parameters.
-  scoped_ptr_impl(T* p, const D& d) : data_(p, d) {}
-
-  // Templated constructor that destructively takes the value from another
-  // scoped_ptr_impl.
-  template <typename U, typename V>
-  scoped_ptr_impl(scoped_ptr_impl<U, V>* other)
-      : data_(other->release(), other->get_deleter()) {
-    // We do not support move-only deleters.  We could modify our move
-    // emulation to have base::subtle::move() and base::subtle::forward()
-    // functions that are imperfect emulations of their C++11 equivalents,
-    // but until there's a requirement, just assume deleters are copyable.
-  }
-
-  template <typename U, typename V>
-  void TakeState(scoped_ptr_impl<U, V>* other) {
-    // See comment in templated constructor above regarding lack of support
-    // for move-only deleters.
-    reset(other->release());
-    get_deleter() = other->get_deleter();
-  }
-
-  ~scoped_ptr_impl() {
-    if (data_.ptr != NULL) {
-      // Not using get_deleter() saves one function call in non-optimized
-      // builds.
-      static_cast<D&>(data_)(data_.ptr);
-    }
-  }
-
-  void reset(T* p) {
-    // This is a self-reset, which is no longer allowed: http://crbug.com/162971
-    if (p != NULL && p == data_.ptr)
-      abort();
-
-    // Note that running data_.ptr = p can lead to undefined behavior if
-    // get_deleter()(get()) deletes this. In order to prevent this, reset()
-    // should update the stored pointer before deleting its old value.
-    //
-    // However, changing reset() to use that behavior may cause current code to
-    // break in unexpected ways. If the destruction of the owned object
-    // dereferences the scoped_ptr when it is destroyed by a call to reset(),
-    // then it will incorrectly dispatch calls to |p| rather than the original
-    // value of |data_.ptr|.
-    //
-    // During the transition period, set the stored pointer to NULL while
-    // deleting the object. Eventually, this safety check will be removed to
-    // prevent the scenario initially described from occuring and
-    // http://crbug.com/176091 can be closed.
-    T* old = data_.ptr;
-    data_.ptr = NULL;
-    if (old != NULL)
-      static_cast<D&>(data_)(old);
-    data_.ptr = p;
-  }
-
-  T* get() const { return data_.ptr; }
-
-  D& get_deleter() { return data_; }
-  const D& get_deleter() const { return data_; }
-
-  void swap(scoped_ptr_impl& p2) {
-    // Standard swap idiom: 'using std::swap' ensures that std::swap is
-    // present in the overload set, but we call swap unqualified so that
-    // any more-specific overloads can be used, if available.
-    using std::swap;
-    swap(static_cast<D&>(data_), static_cast<D&>(p2.data_));
-    swap(data_.ptr, p2.data_.ptr);
-  }
-
-  T* release() {
-    T* old_ptr = data_.ptr;
-    data_.ptr = NULL;
-    return old_ptr;
-  }
-
- private:
-  // Needed to allow type-converting constructor.
-  template <typename U, typename V>
-  friend class scoped_ptr_impl;
-
-  // Use the empty base class optimization to allow us to have a D
-  // member, while avoiding any space overhead for it when D is an
-  // empty class.  See e.g. http://www.cantrip.org/emptyopt.html for a good
-  // discussion of this technique.
-  struct Data : public D {
-    explicit Data(T* ptr_in) : ptr(ptr_in) {}
-    Data(T* ptr_in, const D& other) : D(other), ptr(ptr_in) {}
-    T* ptr;
-  };
-
-  Data data_;
-
-  DISALLOW_COPY_AND_ASSIGN(scoped_ptr_impl);
-};
-
-}  // namespace cef_internal
-
-}  // namespace base
-
-// A scoped_ptr<T> is like a T*, except that the destructor of scoped_ptr<T>
-// automatically deletes the pointer it holds (if any).
-// That is, scoped_ptr<T> owns the T object that it points to.
-// Like a T*, a scoped_ptr<T> may hold either NULL or a pointer to a T object.
-// Also like T*, scoped_ptr<T> is thread-compatible, and once you
-// dereference it, you get the thread safety guarantees of T.
-//
-// The size of scoped_ptr is small. On most compilers, when using the
-// DefaultDeleter, sizeof(scoped_ptr<T>) == sizeof(T*). Custom deleters will
-// increase the size proportional to whatever state they need to have. See
-// comments inside scoped_ptr_impl<> for details.
-//
-// Current implementation targets having a strict subset of  C++11's
-// unique_ptr<> features. Known deficiencies include not supporting move-only
-// deleteres, function pointers as deleters, and deleters with reference
-// types.
-template <class T, class D = base::DefaultDeleter<T>>
-class scoped_ptr {
-  MOVE_ONLY_TYPE_FOR_CPP_03(scoped_ptr, RValue)
-
-  COMPILE_ASSERT(base::cef_internal::IsNotRefCounted<T>::value,
-                 T_is_refcounted_type_and_needs_scoped_refptr);
-
- public:
-  // The element and deleter types.
-  typedef T element_type;
-  typedef D deleter_type;
-
-  // Constructor.  Defaults to initializing with NULL.
-  scoped_ptr() : impl_(NULL) {}
-
-  // Constructor.  Takes ownership of p.
-  explicit scoped_ptr(element_type* p) : impl_(p) {}
-
-  // Constructor.  Allows initialization of a stateful deleter.
-  scoped_ptr(element_type* p, const D& d) : impl_(p, d) {}
-
-  // Constructor.  Allows construction from a scoped_ptr rvalue for a
-  // convertible type and deleter.
-  //
-  // IMPLEMENTATION NOTE: C++11 unique_ptr<> keeps this constructor distinct
-  // from the normal move constructor. By C++11 20.7.1.2.1.21, this constructor
-  // has different post-conditions if D is a reference type. Since this
-  // implementation does not support deleters with reference type,
-  // we do not need a separate move constructor allowing us to avoid one
-  // use of SFINAE. You only need to care about this if you modify the
-  // implementation of scoped_ptr.
-  template <typename U, typename V>
-  scoped_ptr(scoped_ptr<U, V> other) : impl_(&other.impl_) {
-    COMPILE_ASSERT(!base::is_array<U>::value, U_cannot_be_an_array);
-  }
-
-  // Constructor.  Move constructor for C++03 move emulation of this type.
-  scoped_ptr(RValue rvalue) : impl_(&rvalue.object->impl_) {}
-
-  // operator=.  Allows assignment from a scoped_ptr rvalue for a convertible
-  // type and deleter.
-  //
-  // IMPLEMENTATION NOTE: C++11 unique_ptr<> keeps this operator= distinct from
-  // the normal move assignment operator. By C++11 20.7.1.2.3.4, this templated
-  // form has different requirements on for move-only Deleters. Since this
-  // implementation does not support move-only Deleters, we do not need a
-  // separate move assignment operator allowing us to avoid one use of SFINAE.
-  // You only need to care about this if you modify the implementation of
-  // scoped_ptr.
-  template <typename U, typename V>
-  scoped_ptr& operator=(scoped_ptr<U, V> rhs) {
-    COMPILE_ASSERT(!base::is_array<U>::value, U_cannot_be_an_array);
-    impl_.TakeState(&rhs.impl_);
-    return *this;
-  }
-
-  // Reset.  Deletes the currently owned object, if any.
-  // Then takes ownership of a new object, if given.
-  void reset(element_type* p = NULL) { impl_.reset(p); }
-
-  // Accessors to get the owned object.
-  // operator* and operator-> will assert() if there is no current object.
-  element_type& operator*() const {
-    assert(impl_.get() != NULL);
-    return *impl_.get();
-  }
-  element_type* operator->() const {
-    assert(impl_.get() != NULL);
-    return impl_.get();
-  }
-  element_type* get() const { return impl_.get(); }
-
-  // Access to the deleter.
-  deleter_type& get_deleter() { return impl_.get_deleter(); }
-  const deleter_type& get_deleter() const { return impl_.get_deleter(); }
-
-  // Allow scoped_ptr<element_type> to be used in boolean expressions, but not
-  // implicitly convertible to a real bool (which is dangerous).
-  //
-  // Note that this trick is only safe when the == and != operators
-  // are declared explicitly, as otherwise "scoped_ptr1 ==
-  // scoped_ptr2" will compile but do the wrong thing (i.e., convert
-  // to Testable and then do the comparison).
- private:
-  typedef base::cef_internal::scoped_ptr_impl<element_type, deleter_type>
-      scoped_ptr::*Testable;
-
- public:
-  operator Testable() const { return impl_.get() ? &scoped_ptr::impl_ : NULL; }
-
-  // Comparison operators.
-  // These return whether two scoped_ptr refer to the same object, not just to
-  // two different but equal objects.
-  bool operator==(const element_type* p) const { return impl_.get() == p; }
-  bool operator!=(const element_type* p) const { return impl_.get() != p; }
-
-  // Swap two scoped pointers.
-  void swap(scoped_ptr& p2) { impl_.swap(p2.impl_); }
-
-  // Release a pointer.
-  // The return value is the current pointer held by this object.
-  // If this object holds a NULL pointer, the return value is NULL.
-  // After this operation, this object will hold a NULL pointer,
-  // and will not own the object any more.
-  element_type* release() WARN_UNUSED_RESULT { return impl_.release(); }
-
-  // C++98 doesn't support functions templates with default parameters which
-  // makes it hard to write a PassAs() that understands converting the deleter
-  // while preserving simple calling semantics.
-  //
-  // Until there is a use case for PassAs() with custom deleters, just ignore
-  // the custom deleter.
-  template <typename PassAsType>
-  scoped_ptr<PassAsType> PassAs() {
-    return scoped_ptr<PassAsType>(Pass());
-  }
-
- private:
-  // Needed to reach into |impl_| in the constructor.
-  template <typename U, typename V>
-  friend class scoped_ptr;
-  base::cef_internal::scoped_ptr_impl<element_type, deleter_type> impl_;
-
-  // Forbidden for API compatibility with std::unique_ptr.
-  explicit scoped_ptr(int disallow_construction_from_null);
-
-  // Forbid comparison of scoped_ptr types.  If U != T, it totally
-  // doesn't make sense, and if U == T, it still doesn't make sense
-  // because you should never have the same object owned by two different
-  // scoped_ptrs.
-  template <class U>
-  bool operator==(scoped_ptr<U> const& p2) const;
-  template <class U>
-  bool operator!=(scoped_ptr<U> const& p2) const;
-};
-
-template <class T, class D>
-class scoped_ptr<T[], D> {
-  MOVE_ONLY_TYPE_FOR_CPP_03(scoped_ptr, RValue)
-
- public:
-  // The element and deleter types.
-  typedef T element_type;
-  typedef D deleter_type;
-
-  // Constructor.  Defaults to initializing with NULL.
-  scoped_ptr() : impl_(NULL) {}
-
-  // Constructor. Stores the given array. Note that the argument's type
-  // must exactly match T*. In particular:
-  // - it cannot be a pointer to a type derived from T, because it is
-  //   inherently unsafe in the general case to access an array through a
-  //   pointer whose dynamic type does not match its static type (eg., if
-  //   T and the derived types had different sizes access would be
-  //   incorrectly calculated). Deletion is also always undefined
-  //   (C++98 [expr.delete]p3). If you're doing this, fix your code.
-  // - it cannot be NULL, because NULL is an integral expression, not a
-  //   pointer to T. Use the no-argument version instead of explicitly
-  //   passing NULL.
-  // - it cannot be const-qualified differently from T per unique_ptr spec
-  //   (http://cplusplus.github.com/LWG/lwg-active.html#2118). Users wanting
-  //   to work around this may use implicit_cast<const T*>().
-  //   However, because of the first bullet in this comment, users MUST
-  //   NOT use implicit_cast<Base*>() to upcast the static type of the array.
-  explicit scoped_ptr(element_type* array) : impl_(array) {}
-
-  // Constructor.  Move constructor for C++03 move emulation of this type.
-  scoped_ptr(RValue rvalue) : impl_(&rvalue.object->impl_) {}
-
-  // operator=.  Move operator= for C++03 move emulation of this type.
-  scoped_ptr& operator=(RValue rhs) {
-    impl_.TakeState(&rhs.object->impl_);
-    return *this;
-  }
-
-  // Reset.  Deletes the currently owned array, if any.
-  // Then takes ownership of a new object, if given.
-  void reset(element_type* array = NULL) { impl_.reset(array); }
-
-  // Accessors to get the owned array.
-  element_type& operator[](size_t i) const {
-    assert(impl_.get() != NULL);
-    return impl_.get()[i];
-  }
-  element_type* get() const { return impl_.get(); }
-
-  // Access to the deleter.
-  deleter_type& get_deleter() { return impl_.get_deleter(); }
-  const deleter_type& get_deleter() const { return impl_.get_deleter(); }
-
-  // Allow scoped_ptr<element_type> to be used in boolean expressions, but not
-  // implicitly convertible to a real bool (which is dangerous).
- private:
-  typedef base::cef_internal::scoped_ptr_impl<element_type, deleter_type>
-      scoped_ptr::*Testable;
-
- public:
-  operator Testable() const { return impl_.get() ? &scoped_ptr::impl_ : NULL; }
-
-  // Comparison operators.
-  // These return whether two scoped_ptr refer to the same object, not just to
-  // two different but equal objects.
-  bool operator==(element_type* array) const { return impl_.get() == array; }
-  bool operator!=(element_type* array) const { return impl_.get() != array; }
-
-  // Swap two scoped pointers.
-  void swap(scoped_ptr& p2) { impl_.swap(p2.impl_); }
-
-  // Release a pointer.
-  // The return value is the current pointer held by this object.
-  // If this object holds a NULL pointer, the return value is NULL.
-  // After this operation, this object will hold a NULL pointer,
-  // and will not own the object any more.
-  element_type* release() WARN_UNUSED_RESULT { return impl_.release(); }
-
- private:
-  // Force element_type to be a complete type.
-  enum { type_must_be_complete = sizeof(element_type) };
-
-  // Actually hold the data.
-  base::cef_internal::scoped_ptr_impl<element_type, deleter_type> impl_;
-
-  // Disable initialization from any type other than element_type*, by
-  // providing a constructor that matches such an initialization, but is
-  // private and has no definition. This is disabled because it is not safe to
-  // call delete[] on an array whose static type does not match its dynamic
-  // type.
-  template <typename U>
-  explicit scoped_ptr(U* array);
-  explicit scoped_ptr(int disallow_construction_from_null);
-
-  // Disable reset() from any type other than element_type*, for the same
-  // reasons as the constructor above.
-  template <typename U>
-  void reset(U* array);
-  void reset(int disallow_reset_from_null);
-
-  // Forbid comparison of scoped_ptr types.  If U != T, it totally
-  // doesn't make sense, and if U == T, it still doesn't make sense
-  // because you should never have the same object owned by two different
-  // scoped_ptrs.
-  template <class U>
-  bool operator==(scoped_ptr<U> const& p2) const;
-  template <class U>
-  bool operator!=(scoped_ptr<U> const& p2) const;
-};
-
-// Free functions
-template <class T, class D>
-void swap(scoped_ptr<T, D>& p1, scoped_ptr<T, D>& p2) {
-  p1.swap(p2);
-}
-
-template <class T, class D>
-bool operator==(T* p1, const scoped_ptr<T, D>& p2) {
-  return p1 == p2.get();
-}
-
-template <class T, class D>
-bool operator!=(T* p1, const scoped_ptr<T, D>& p2) {
-  return p1 != p2.get();
-}
-
-// A function to convert T* into scoped_ptr<T>
-// Doing e.g. make_scoped_ptr(new FooBarBaz<type>(arg)) is a shorter notation
-// for scoped_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
-template <typename T>
-scoped_ptr<T> make_scoped_ptr(T* ptr) {
-  return scoped_ptr<T>(ptr);
-}
-
-#endif  // !USING_CHROMIUM_INCLUDES
-
-#endif  // CEF_INCLUDE_BASE_CEF_MEMORY_SCOPED_PTR_H_
diff --git a/src/include/base/cef_scoped_refptr.h b/src/include/base/cef_scoped_refptr.h
new file mode 100644
index 0000000..9269039
--- /dev/null
+++ b/src/include/base/cef_scoped_refptr.h
@@ -0,0 +1,420 @@
+// Copyright (c) 2017 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_SCOPED_REFPTR_H_
+#define CEF_INCLUDE_BASE_CEF_SCOPED_REFPTR_H_
+#pragma once
+
+#if defined(USING_CHROMIUM_INCLUDES)
+// When building CEF include the Chromium header directly.
+#include "base/memory/scoped_refptr.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 <stddef.h>
+
+#include <iosfwd>
+#include <type_traits>
+#include <utility>
+
+#include "include/base/cef_logging.h"
+
+template <class T>
+class scoped_refptr;
+
+namespace base {
+
+template <class, typename>
+class RefCounted;
+template <class, typename>
+class RefCountedThreadSafe;
+class SequencedTaskRunner;
+class WrappedPromise;
+
+template <typename T>
+scoped_refptr<T> AdoptRef(T* t);
+
+namespace internal {
+
+class BasePromise;
+
+}  // namespace internal
+
+namespace cef_subtle {
+
+enum AdoptRefTag { kAdoptRefTag };
+enum StartRefCountFromZeroTag { kStartRefCountFromZeroTag };
+enum StartRefCountFromOneTag { kStartRefCountFromOneTag };
+
+template <typename T, typename U, typename V>
+constexpr bool IsRefCountPreferenceOverridden(const T*,
+                                              const RefCounted<U, V>*) {
+  return !std::is_same<std::decay_t<decltype(T::kRefCountPreference)>,
+                       std::decay_t<decltype(U::kRefCountPreference)>>::value;
+}
+
+template <typename T, typename U, typename V>
+constexpr bool IsRefCountPreferenceOverridden(
+    const T*,
+    const RefCountedThreadSafe<U, V>*) {
+  return !std::is_same<std::decay_t<decltype(T::kRefCountPreference)>,
+                       std::decay_t<decltype(U::kRefCountPreference)>>::value;
+}
+
+constexpr bool IsRefCountPreferenceOverridden(...) {
+  return false;
+}
+
+}  // namespace cef_subtle
+
+// Creates a scoped_refptr from a raw pointer without incrementing the reference
+// count. Use this only for a newly created object whose reference count starts
+// from 1 instead of 0.
+template <typename T>
+scoped_refptr<T> AdoptRef(T* obj) {
+  using Tag = std::decay_t<decltype(T::kRefCountPreference)>;
+  static_assert(std::is_same<cef_subtle::StartRefCountFromOneTag, Tag>::value,
+                "Use AdoptRef only if the reference count starts from one.");
+
+  DCHECK(obj);
+  DCHECK(obj->HasOneRef());
+  obj->Adopted();
+  return scoped_refptr<T>(obj, cef_subtle::kAdoptRefTag);
+}
+
+namespace cef_subtle {
+
+template <typename T>
+scoped_refptr<T> AdoptRefIfNeeded(T* obj, StartRefCountFromZeroTag) {
+  return scoped_refptr<T>(obj);
+}
+
+template <typename T>
+scoped_refptr<T> AdoptRefIfNeeded(T* obj, StartRefCountFromOneTag) {
+  return AdoptRef(obj);
+}
+
+}  // namespace cef_subtle
+
+// Constructs an instance of T, which is a ref counted type, and wraps the
+// object into a scoped_refptr<T>.
+template <typename T, typename... Args>
+scoped_refptr<T> MakeRefCounted(Args&&... args) {
+  T* obj = new T(std::forward<Args>(args)...);
+  return cef_subtle::AdoptRefIfNeeded(obj, T::kRefCountPreference);
+}
+
+// Takes an instance of T, which is a ref counted type, and wraps the object
+// into a scoped_refptr<T>.
+template <typename T>
+scoped_refptr<T> WrapRefCounted(T* t) {
+  return scoped_refptr<T>(t);
+}
+
+}  // namespace base
+
+///
+/// A smart pointer class for reference counted objects.  Use this class instead
+/// of calling AddRef and Release manually on a reference counted object to
+/// avoid common memory leaks caused by forgetting to Release an object
+/// reference. Sample usage:
+///
+/// <pre>
+///   class MyFoo : public RefCounted<MyFoo> {
+///    ...
+///    private:
+///     friend class RefCounted<MyFoo>;  // Allow destruction by RefCounted<>.
+///     ~MyFoo();                        // Destructor must be
+///     private/protected.
+///   };
+///
+///   void some_function() {
+///     scoped_refptr<MyFoo> foo = MakeRefCounted<MyFoo>();
+///     foo->Method(param);
+///     // |foo| is released when this function returns
+///   }
+///
+///   void some_other_function() {
+///     scoped_refptr<MyFoo> foo = MakeRefCounted<MyFoo>();
+///     ...
+///     foo.reset();  // explicitly releases |foo|
+///     ...
+///     if (foo)
+///       foo->Method(param);
+///   }
+/// </pre>
+///
+/// The above examples show how scoped_refptr<T> acts like a pointer to T.
+/// Given two scoped_refptr<T> classes, it is also possible to exchange
+/// references between the two objects, like so:
+///
+/// <pre>
+///   {
+///     scoped_refptr<MyFoo> a = MakeRefCounted<MyFoo>();
+///     scoped_refptr<MyFoo> b;
+///
+///     b.swap(a);
+///     // now, |b| references the MyFoo object, and |a| references nullptr.
+///   }
+/// </pre>
+///
+/// To make both |a| and |b| in the above example reference the same MyFoo
+/// object, simply use the assignment operator:
+///
+/// <pre>
+///   {
+///     scoped_refptr<MyFoo> a = MakeRefCounted<MyFoo>();
+///     scoped_refptr<MyFoo> b;
+///
+///     b = a;
+///     // now, |a| and |b| each own a reference to the same MyFoo object.
+///   }
+/// </pre>
+///
+/// Also see Chromium's ownership and calling conventions:
+/// https://chromium.googlesource.com/chromium/src/+/lkgr/styleguide/c++/c++.md#object-ownership-and-calling-conventions
+/// Specifically:
+///   If the function (at least sometimes) takes a ref on a refcounted object,
+///   declare the param as scoped_refptr<T>. The caller can decide whether it
+///   wishes to transfer ownership (by calling std::move(t) when passing t) or
+///   retain its ref (by simply passing t directly).
+///   In other words, use scoped_refptr like you would a std::unique_ptr except
+///   in the odd case where it's required to hold on to a ref while handing one
+///   to another component (if a component merely needs to use t on the stack
+///   without keeping a ref: pass t as a raw T*).
+///
+template <class T>
+class TRIVIAL_ABI scoped_refptr {
+ public:
+  typedef T element_type;
+
+  constexpr scoped_refptr() = default;
+
+  // Allow implicit construction from nullptr.
+  constexpr scoped_refptr(std::nullptr_t) {}
+
+  // Constructs from a raw pointer. Note that this constructor allows implicit
+  // conversion from T* to scoped_refptr<T> which is strongly discouraged. If
+  // you are creating a new ref-counted object please use
+  // base::MakeRefCounted<T>() or base::WrapRefCounted<T>(). Otherwise you
+  // should move or copy construct from an existing scoped_refptr<T> to the
+  // ref-counted object.
+  scoped_refptr(T* p) : ptr_(p) {
+    if (ptr_) {
+      AddRef(ptr_);
+    }
+  }
+
+  // Copy constructor. This is required in addition to the copy conversion
+  // constructor below.
+  scoped_refptr(const scoped_refptr& r) : scoped_refptr(r.ptr_) {}
+
+  // Copy conversion constructor.
+  template <typename U,
+            typename = typename std::enable_if<
+                std::is_convertible<U*, T*>::value>::type>
+  scoped_refptr(const scoped_refptr<U>& r) : scoped_refptr(r.ptr_) {}
+
+  // Move constructor. This is required in addition to the move conversion
+  // constructor below.
+  scoped_refptr(scoped_refptr&& r) noexcept : ptr_(r.ptr_) { r.ptr_ = nullptr; }
+
+  // Move conversion constructor.
+  template <typename U,
+            typename = typename std::enable_if<
+                std::is_convertible<U*, T*>::value>::type>
+  scoped_refptr(scoped_refptr<U>&& r) noexcept : ptr_(r.ptr_) {
+    r.ptr_ = nullptr;
+  }
+
+  ~scoped_refptr() {
+    static_assert(!base::cef_subtle::IsRefCountPreferenceOverridden(
+                      static_cast<T*>(nullptr), static_cast<T*>(nullptr)),
+                  "It's unsafe to override the ref count preference."
+                  " Please remove REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE"
+                  " from subclasses.");
+    if (ptr_) {
+      Release(ptr_);
+    }
+  }
+
+  T* get() const { return ptr_; }
+
+  T& operator*() const {
+    DCHECK(ptr_);
+    return *ptr_;
+  }
+
+  T* operator->() const {
+    DCHECK(ptr_);
+    return ptr_;
+  }
+
+  scoped_refptr& operator=(std::nullptr_t) {
+    reset();
+    return *this;
+  }
+
+  scoped_refptr& operator=(T* p) { return *this = scoped_refptr(p); }
+
+  // Unified assignment operator.
+  scoped_refptr& operator=(scoped_refptr r) noexcept {
+    swap(r);
+    return *this;
+  }
+
+  // Sets managed object to null and releases reference to the previous managed
+  // object, if it existed.
+  void reset() { scoped_refptr().swap(*this); }
+
+  // Returns the owned pointer (if any), releasing ownership to the caller. The
+  // caller is responsible for managing the lifetime of the reference.
+  [[nodiscard]] T* release();
+
+  void swap(scoped_refptr& r) noexcept { std::swap(ptr_, r.ptr_); }
+
+  explicit operator bool() const { return ptr_ != nullptr; }
+
+  template <typename U>
+  bool operator==(const scoped_refptr<U>& rhs) const {
+    return ptr_ == rhs.get();
+  }
+
+  template <typename U>
+  bool operator!=(const scoped_refptr<U>& rhs) const {
+    return !operator==(rhs);
+  }
+
+  template <typename U>
+  bool operator<(const scoped_refptr<U>& rhs) const {
+    return ptr_ < rhs.get();
+  }
+
+ protected:
+  T* ptr_ = nullptr;
+
+ private:
+  template <typename U>
+  friend scoped_refptr<U> base::AdoptRef(U*);
+  friend class ::base::SequencedTaskRunner;
+
+  // Friend access so these classes can use the constructor below as part of a
+  // binary size optimization.
+  friend class ::base::internal::BasePromise;
+  friend class ::base::WrappedPromise;
+
+  scoped_refptr(T* p, base::cef_subtle::AdoptRefTag) : ptr_(p) {}
+
+  // Friend required for move constructors that set r.ptr_ to null.
+  template <typename U>
+  friend class scoped_refptr;
+
+  // Non-inline helpers to allow:
+  //     class Opaque;
+  //     extern template class scoped_refptr<Opaque>;
+  // Otherwise the compiler will complain that Opaque is an incomplete type.
+  static void AddRef(T* ptr);
+  static void Release(T* ptr);
+};
+
+template <typename T>
+T* scoped_refptr<T>::release() {
+  T* ptr = ptr_;
+  ptr_ = nullptr;
+  return ptr;
+}
+
+// static
+template <typename T>
+void scoped_refptr<T>::AddRef(T* ptr) {
+  ptr->AddRef();
+}
+
+// static
+template <typename T>
+void scoped_refptr<T>::Release(T* ptr) {
+  ptr->Release();
+}
+
+template <typename T, typename U>
+bool operator==(const scoped_refptr<T>& lhs, const U* rhs) {
+  return lhs.get() == rhs;
+}
+
+template <typename T, typename U>
+bool operator==(const T* lhs, const scoped_refptr<U>& rhs) {
+  return lhs == rhs.get();
+}
+
+template <typename T>
+bool operator==(const scoped_refptr<T>& lhs, std::nullptr_t null) {
+  return !static_cast<bool>(lhs);
+}
+
+template <typename T>
+bool operator==(std::nullptr_t null, const scoped_refptr<T>& rhs) {
+  return !static_cast<bool>(rhs);
+}
+
+template <typename T, typename U>
+bool operator!=(const scoped_refptr<T>& lhs, const U* rhs) {
+  return !operator==(lhs, rhs);
+}
+
+template <typename T, typename U>
+bool operator!=(const T* lhs, const scoped_refptr<U>& rhs) {
+  return !operator==(lhs, rhs);
+}
+
+template <typename T>
+bool operator!=(const scoped_refptr<T>& lhs, std::nullptr_t null) {
+  return !operator==(lhs, null);
+}
+
+template <typename T>
+bool operator!=(std::nullptr_t null, const scoped_refptr<T>& rhs) {
+  return !operator==(null, rhs);
+}
+
+template <typename T>
+std::ostream& operator<<(std::ostream& out, const scoped_refptr<T>& p) {
+  return out << p.get();
+}
+
+template <typename T>
+void swap(scoped_refptr<T>& lhs, scoped_refptr<T>& rhs) noexcept {
+  lhs.swap(rhs);
+}
+
+#endif  // !USING_CHROMIUM_INCLUDES
+
+#endif  // CEF_INCLUDE_BASE_CEF_SCOPED_REFPTR_H_
diff --git a/src/include/base/cef_scoped_typeref_mac.h b/src/include/base/cef_scoped_typeref_mac.h
new file mode 100644
index 0000000..65d16a1
--- /dev/null
+++ b/src/include/base/cef_scoped_typeref_mac.h
@@ -0,0 +1,190 @@
+// Copyright (c) 2021 Marshall A. Greenblatt. Portions copyright (c) 2013
+// 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_SCOPED_TYPEREF_MAC_H_
+#define CEF_INCLUDE_BASE_CEF_SCOPED_TYPEREF_MAC_H_
+#pragma once
+
+#if defined(USING_CHROMIUM_INCLUDES)
+// When building CEF include the Chromium header directly.
+#include "base/mac/scoped_typeref.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/cef_logging.h"
+#include "include/base/internal/cef_scoped_policy.h"
+
+namespace base {
+
+template <typename T>
+struct ScopedTypeRefTraits;
+
+///
+/// ScopedTypeRef<> is patterned after std::unique_ptr<>, but maintains
+/// ownership of a reference to any type that is maintained by Retain and
+/// Release methods.
+///
+/// The Traits structure must provide the Retain and Release methods for type T.
+/// A default ScopedTypeRefTraits is used but not defined, and should be defined
+/// for each type to use this interface. For example, an appropriate definition
+/// of ScopedTypeRefTraits for CGLContextObj would be:
+///
+/// <pre>
+///   template<>
+///   struct ScopedTypeRefTraits<CGLContextObj> {
+///     static CGLContextObj InvalidValue() { return nullptr; }
+///     static CGLContextObj Retain(CGLContextObj object) {
+///       CGLContextRetain(object);
+///       return object;
+///     }
+///     static void Release(CGLContextObj object) { CGLContextRelease(object); }
+///   };
+/// </pre>
+///
+/// For the many types that have pass-by-pointer create functions, the function
+/// InitializeInto() is provided to allow direct initialization and assumption
+/// of ownership of the object. For example, continuing to use the above
+/// CGLContextObj specialization:
+///
+/// <pre>
+///   base::ScopedTypeRef<CGLContextObj> context;
+///   CGLCreateContext(pixel_format, share_group, context.InitializeInto());
+/// </pre>
+///
+/// For initialization with an existing object, the caller may specify whether
+/// the ScopedTypeRef<> being initialized is assuming the caller's existing
+/// ownership of the object (and should not call Retain in initialization) or if
+/// it should not assume this ownership and must create its own (by calling
+/// Retain in initialization). This behavior is based on the |policy| parameter,
+/// with |ASSUME| for the former and |RETAIN| for the latter. The default policy
+/// is to |ASSUME|.
+///
+template <typename T, typename Traits = ScopedTypeRefTraits<T>>
+class ScopedTypeRef {
+ public:
+  using element_type = T;
+
+  explicit constexpr ScopedTypeRef(
+      element_type object = Traits::InvalidValue(),
+      base::scoped_policy::OwnershipPolicy policy = base::scoped_policy::ASSUME)
+      : object_(object) {
+    if (object_ && policy == base::scoped_policy::RETAIN) {
+      object_ = Traits::Retain(object_);
+    }
+  }
+
+  ScopedTypeRef(const ScopedTypeRef<T, Traits>& that) : object_(that.object_) {
+    if (object_) {
+      object_ = Traits::Retain(object_);
+    }
+  }
+
+  // This allows passing an object to a function that takes its superclass.
+  template <typename R, typename RTraits>
+  explicit ScopedTypeRef(const ScopedTypeRef<R, RTraits>& that_as_subclass)
+      : object_(that_as_subclass.get()) {
+    if (object_) {
+      object_ = Traits::Retain(object_);
+    }
+  }
+
+  ScopedTypeRef(ScopedTypeRef<T, Traits>&& that) : object_(that.object_) {
+    that.object_ = Traits::InvalidValue();
+  }
+
+  ~ScopedTypeRef() {
+    if (object_) {
+      Traits::Release(object_);
+    }
+  }
+
+  ScopedTypeRef& operator=(const ScopedTypeRef<T, Traits>& that) {
+    reset(that.get(), base::scoped_policy::RETAIN);
+    return *this;
+  }
+
+  // This is to be used only to take ownership of objects that are created
+  // by pass-by-pointer create functions. To enforce this, require that the
+  // object be reset to NULL before this may be used.
+  [[nodiscard]] element_type* InitializeInto() {
+    DCHECK(!object_);
+    return &object_;
+  }
+
+  void reset(const ScopedTypeRef<T, Traits>& that) {
+    reset(that.get(), base::scoped_policy::RETAIN);
+  }
+
+  void reset(element_type object = Traits::InvalidValue(),
+             base::scoped_policy::OwnershipPolicy policy =
+                 base::scoped_policy::ASSUME) {
+    if (object && policy == base::scoped_policy::RETAIN) {
+      object = Traits::Retain(object);
+    }
+    if (object_) {
+      Traits::Release(object_);
+    }
+    object_ = object;
+  }
+
+  bool operator==(const element_type& that) const { return object_ == that; }
+
+  bool operator!=(const element_type& that) const { return object_ != that; }
+
+  operator element_type() const { return object_; }
+
+  element_type get() const { return object_; }
+
+  void swap(ScopedTypeRef& that) {
+    element_type temp = that.object_;
+    that.object_ = object_;
+    object_ = temp;
+  }
+
+  // ScopedTypeRef<>::release() is like std::unique_ptr<>::release.  It is NOT
+  // a wrapper for Release().  To force a ScopedTypeRef<> object to call
+  // Release(), use ScopedTypeRef<>::reset().
+  [[nodiscard]] element_type release() {
+    element_type temp = object_;
+    object_ = Traits::InvalidValue();
+    return temp;
+  }
+
+ private:
+  element_type object_;
+};
+
+}  // namespace base
+
+#endif  // !USING_CHROMIUM_INCLUDES
+
+#endif  // CEF_INCLUDE_BASE_CEF_SCOPED_TYPEREF_MAC_H_
diff --git a/src/include/base/cef_string16.h b/src/include/base/cef_string16.h
deleted file mode 100644
index 6afcb79..0000000
--- a/src/include/base/cef_string16.h
+++ /dev/null
@@ -1,223 +0,0 @@
-// Copyright (c) 2014 Marshall A. Greenblatt. Portions copyright (c) 2013
-// 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_STRING16_H_
-#define CEF_INCLUDE_BASE_CEF_STRING16_H_
-#pragma once
-
-#if defined(BASE_STRINGS_STRING16_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/strings/string16.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.
-// WHAT:
-// A version of std::basic_string that provides 2-byte characters even when
-// wchar_t is not implemented as a 2-byte type. You can access this class as
-// string16. We also define char16, which string16 is based upon.
-//
-// WHY:
-// On Windows, wchar_t is 2 bytes, and it can conveniently handle UTF-16/UCS-2
-// data. Plenty of existing code operates on strings encoded as UTF-16.
-//
-// On many other platforms, sizeof(wchar_t) is 4 bytes by default. We can make
-// it 2 bytes by using the GCC flag -fshort-wchar. But then std::wstring fails
-// at run time, because it calls some functions (like wcslen) that come from
-// the system's native C library -- which was built with a 4-byte wchar_t!
-// It's wasteful to use 4-byte wchar_t strings to carry UTF-16 data, and it's
-// entirely improper on those systems where the encoding of wchar_t is defined
-// as UTF-32.
-//
-// Here, we define string16, which is similar to std::wstring but replaces all
-// libc functions with custom, 2-byte-char compatible routines. It is capable
-// of carrying UTF-16-encoded data.
-
-#include <stdio.h>
-#include <string>
-
-#include "include/base/cef_basictypes.h"
-
-#if defined(WCHAR_T_IS_UTF16)
-
-namespace base {
-
-typedef wchar_t char16;
-typedef std::wstring string16;
-typedef std::char_traits<wchar_t> string16_char_traits;
-
-}  // namespace base
-
-#elif defined(WCHAR_T_IS_UTF32)
-
-#include <stdint.h>  // For uint16_t
-
-#include "include/base/cef_macros.h"
-
-namespace cef {
-namespace base {
-
-typedef uint16_t char16;
-
-// char16 versions of the functions required by string16_char_traits; these
-// are based on the wide character functions of similar names ("w" or "wcs"
-// instead of "c16").
-int c16memcmp(const char16* s1, const char16* s2, size_t n);
-size_t c16len(const char16* s);
-const char16* c16memchr(const char16* s, char16 c, size_t n);
-char16* c16memmove(char16* s1, const char16* s2, size_t n);
-char16* c16memcpy(char16* s1, const char16* s2, size_t n);
-char16* c16memset(char16* s, char16 c, size_t n);
-
-struct string16_char_traits {
-  typedef char16 char_type;
-  typedef int int_type;
-
-  // int_type needs to be able to hold each possible value of char_type, and in
-  // addition, the distinct value of eof().
-  COMPILE_ASSERT(sizeof(int_type) > sizeof(char_type), unexpected_type_width);
-
-  typedef std::streamoff off_type;
-  typedef mbstate_t state_type;
-  typedef std::fpos<state_type> pos_type;
-
-  static void assign(char_type& c1, const char_type& c2) { c1 = c2; }
-
-  static bool eq(const char_type& c1, const char_type& c2) { return c1 == c2; }
-  static bool lt(const char_type& c1, const char_type& c2) { return c1 < c2; }
-
-  static int compare(const char_type* s1, const char_type* s2, size_t n) {
-    return c16memcmp(s1, s2, n);
-  }
-
-  static size_t length(const char_type* s) { return c16len(s); }
-
-  static const char_type* find(const char_type* s,
-                               size_t n,
-                               const char_type& a) {
-    return c16memchr(s, a, n);
-  }
-
-  static char_type* move(char_type* s1, const char_type* s2, int_type n) {
-    return c16memmove(s1, s2, n);
-  }
-
-  static char_type* copy(char_type* s1, const char_type* s2, size_t n) {
-    return c16memcpy(s1, s2, n);
-  }
-
-  static char_type* assign(char_type* s, size_t n, char_type a) {
-    return c16memset(s, a, n);
-  }
-
-  static int_type not_eof(const int_type& c) {
-    return eq_int_type(c, eof()) ? 0 : c;
-  }
-
-  static char_type to_char_type(const int_type& c) { return char_type(c); }
-
-  static int_type to_int_type(const char_type& c) { return int_type(c); }
-
-  static bool eq_int_type(const int_type& c1, const int_type& c2) {
-    return c1 == c2;
-  }
-
-  static int_type eof() { return static_cast<int_type>(EOF); }
-};
-
-typedef std::basic_string<char16, string16_char_traits> string16;
-
-}  // namespace base
-}  // namespace cef
-
-namespace base {
-
-typedef cef::base::char16 char16;
-typedef cef::base::string16 string16;
-
-extern std::ostream& operator<<(std::ostream& out, const string16& str);
-
-// This is required by googletest to print a readable output on test failures.
-extern void PrintTo(const string16& str, std::ostream* out);
-
-}  // namespace base
-
-// The string class will be explicitly instantiated only once, in string16.cc.
-//
-// std::basic_string<> in GNU libstdc++ contains a static data member,
-// _S_empty_rep_storage, to represent empty strings.  When an operation such
-// as assignment or destruction is performed on a string, causing its existing
-// data member to be invalidated, it must not be freed if this static data
-// member is being used.  Otherwise, it counts as an attempt to free static
-// (and not allocated) data, which is a memory error.
-//
-// Generally, due to C++ template magic, _S_empty_rep_storage will be marked
-// as a coalesced symbol, meaning that the linker will combine multiple
-// instances into a single one when generating output.
-//
-// If a string class is used by multiple shared libraries, a problem occurs.
-// Each library will get its own copy of _S_empty_rep_storage.  When strings
-// are passed across a library boundary for alteration or destruction, memory
-// errors will result.  GNU libstdc++ contains a configuration option,
-// --enable-fully-dynamic-string (_GLIBCXX_FULLY_DYNAMIC_STRING), which
-// disables the static data member optimization, but it's a good optimization
-// and non-STL code is generally at the mercy of the system's STL
-// configuration.  Fully-dynamic strings are not the default for GNU libstdc++
-// libstdc++ itself or for the libstdc++ installations on the systems we care
-// about, such as Mac OS X and relevant flavors of Linux.
-//
-// See also http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24196 .
-//
-// To avoid problems, string classes need to be explicitly instantiated only
-// once, in exactly one library.  All other string users see it via an "extern"
-// declaration.  This is precisely how GNU libstdc++ handles
-// std::basic_string<char> (string) and std::basic_string<wchar_t> (wstring).
-//
-// This also works around a Mac OS X linker bug in ld64-85.2.1 (Xcode 3.1.2),
-// in which the linker does not fully coalesce symbols when dead code
-// stripping is enabled.  This bug causes the memory errors described above
-// to occur even when a std::basic_string<> does not cross shared library
-// boundaries, such as in statically-linked executables.
-//
-// TODO(mark): File this bug with Apple and update this note with a bug number.
-
-extern template class std::basic_string<cef::base::char16,
-                                        cef::base::string16_char_traits>;
-
-#endif  // WCHAR_T_IS_UTF32
-
-#endif  // !USING_CHROMIUM_INCLUDES
-
-#endif  // CEF_INCLUDE_BASE_CEF_STRING16_H_
diff --git a/src/include/base/cef_template_util.h b/src/include/base/cef_template_util.h
deleted file mode 100644
index 38fa583..0000000
--- a/src/include/base/cef_template_util.h
+++ /dev/null
@@ -1,214 +0,0 @@
-// 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_TEMPLATE_UTIL_H_
-#define CEF_INCLUDE_BASE_CEF_TEMPLATE_UTIL_H_
-#pragma once
-
-#if defined(BASE_TEMPLATE_UTIL_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/template_util.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 <cstddef>  // For size_t.
-
-#include "include/base/cef_build.h"
-
-namespace base {
-
-// template definitions from tr1
-
-template <class T, T v>
-struct integral_constant {
-  static const T value = v;
-  typedef T value_type;
-  typedef integral_constant<T, v> type;
-};
-
-template <class T, T v>
-const T integral_constant<T, v>::value;
-
-typedef integral_constant<bool, true> true_type;
-typedef integral_constant<bool, false> false_type;
-
-template <class T>
-struct is_pointer : false_type {};
-template <class T>
-struct is_pointer<T*> : true_type {};
-
-// Member function pointer detection up to four params. Add more as needed
-// below. This is built-in to C++ 11, and we can remove this when we switch.
-template <typename T>
-struct is_member_function_pointer : false_type {};
-
-template <typename R, typename Z>
-struct is_member_function_pointer<R (Z::*)()> : true_type {};
-template <typename R, typename Z>
-struct is_member_function_pointer<R (Z::*)() const> : true_type {};
-
-template <typename R, typename Z, typename A>
-struct is_member_function_pointer<R (Z::*)(A)> : true_type {};
-template <typename R, typename Z, typename A>
-struct is_member_function_pointer<R (Z::*)(A) const> : true_type {};
-
-template <typename R, typename Z, typename A, typename B>
-struct is_member_function_pointer<R (Z::*)(A, B)> : true_type {};
-template <typename R, typename Z, typename A, typename B>
-struct is_member_function_pointer<R (Z::*)(A, B) const> : true_type {};
-
-template <typename R, typename Z, typename A, typename B, typename C>
-struct is_member_function_pointer<R (Z::*)(A, B, C)> : true_type {};
-template <typename R, typename Z, typename A, typename B, typename C>
-struct is_member_function_pointer<R (Z::*)(A, B, C) const> : true_type {};
-
-template <typename R,
-          typename Z,
-          typename A,
-          typename B,
-          typename C,
-          typename D>
-struct is_member_function_pointer<R (Z::*)(A, B, C, D)> : true_type {};
-template <typename R,
-          typename Z,
-          typename A,
-          typename B,
-          typename C,
-          typename D>
-struct is_member_function_pointer<R (Z::*)(A, B, C, D) const> : true_type {};
-
-template <class T, class U>
-struct is_same : public false_type {};
-template <class T>
-struct is_same<T, T> : true_type {};
-
-template <class>
-struct is_array : public false_type {};
-template <class T, size_t n>
-struct is_array<T[n]> : public true_type {};
-template <class T>
-struct is_array<T[]> : public true_type {};
-
-template <class T>
-struct is_non_const_reference : false_type {};
-template <class T>
-struct is_non_const_reference<T&> : true_type {};
-template <class T>
-struct is_non_const_reference<const T&> : false_type {};
-
-template <class T>
-struct is_const : false_type {};
-template <class T>
-struct is_const<const T> : true_type {};
-
-template <class T>
-struct is_void : false_type {};
-template <>
-struct is_void<void> : true_type {};
-
-namespace cef_internal {
-
-// Types YesType and NoType are guaranteed such that sizeof(YesType) <
-// sizeof(NoType).
-typedef char YesType;
-
-struct NoType {
-  YesType dummy[2];
-};
-
-// This class is an implementation detail for is_convertible, and you
-// don't need to know how it works to use is_convertible. For those
-// who care: we declare two different functions, one whose argument is
-// of type To and one with a variadic argument list. We give them
-// return types of different size, so we can use sizeof to trick the
-// compiler into telling us which function it would have chosen if we
-// had called it with an argument of type From.  See Alexandrescu's
-// _Modern C++ Design_ for more details on this sort of trick.
-
-struct ConvertHelper {
-  template <typename To>
-  static YesType Test(To);
-
-  template <typename To>
-  static NoType Test(...);
-
-  template <typename From>
-  static From& Create();
-};
-
-// Used to determine if a type is a struct/union/class. Inspired by Boost's
-// is_class type_trait implementation.
-struct IsClassHelper {
-  template <typename C>
-  static YesType Test(void (C::*)(void));
-
-  template <typename C>
-  static NoType Test(...);
-};
-
-}  // namespace cef_internal
-
-// Inherits from true_type if From is convertible to To, false_type otherwise.
-//
-// Note that if the type is convertible, this will be a true_type REGARDLESS
-// of whether or not the conversion would emit a warning.
-template <typename From, typename To>
-struct is_convertible
-    : integral_constant<bool,
-                        sizeof(cef_internal::ConvertHelper::Test<To>(
-                            cef_internal::ConvertHelper::Create<From>())) ==
-                            sizeof(cef_internal::YesType)> {};
-
-template <typename T>
-struct is_class
-    : integral_constant<bool,
-                        sizeof(cef_internal::IsClassHelper::Test<T>(0)) ==
-                            sizeof(cef_internal::YesType)> {};
-
-template <bool B, class T = void>
-struct enable_if {};
-
-template <class T>
-struct enable_if<true, T> {
-  typedef T type;
-};
-
-}  // namespace base
-
-#endif  // !USING_CHROMIUM_INCLUDES
-
-#endif  // CEF_INCLUDE_BASE_CEF_TEMPLATE_UTIL_H_
diff --git a/src/include/base/cef_thread_checker.h b/src/include/base/cef_thread_checker.h
index e48c8d0..6f21c69 100644
--- a/src/include/base/cef_thread_checker.h
+++ b/src/include/base/cef_thread_checker.h
@@ -32,12 +32,7 @@
 #define CEF_INCLUDE_BASE_THREAD_CHECKER_H_
 #pragma once
 
-#if defined(BASE_THREADING_THREAD_CHECKER_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)
+#if defined(USING_CHROMIUM_INCLUDES)
 // When building CEF include the Chromium header directly.
 #include "base/threading/thread_checker.h"
 #else  // !USING_CHROMIUM_INCLUDES
@@ -48,10 +43,12 @@
 #include "include/base/cef_logging.h"
 #include "include/base/internal/cef_thread_checker_impl.h"
 
-// Apart from debug builds, we also enable the thread checker in
-// builds with DCHECK_ALWAYS_ON so that trybots and waterfall bots
-// with this define will get the same level of thread checking as
-// debug bots.
+///
+/// Apart from debug builds, we also enable the thread checker in
+/// builds with DCHECK_ALWAYS_ON so that trybots and waterfall bots
+/// with this define will get the same level of thread checking as
+/// debug bots.
+///
 #if DCHECK_IS_ON()
 #define ENABLE_THREAD_CHECKER 1
 #else
@@ -62,10 +59,12 @@
 
 namespace cef_internal {
 
-// Do nothing implementation, for use in release mode.
-//
-// Note: You should almost always use the ThreadChecker class to get the
-// right version for your build configuration.
+///
+/// Do nothing implementation, for use in release mode.
+///
+/// Note: You should almost always use the ThreadChecker class to get the
+/// right version for your build configuration.
+///
 class ThreadCheckerDoNothing {
  public:
   bool CalledOnValidThread() const { return true; }
@@ -75,37 +74,42 @@
 
 }  // namespace cef_internal
 
-// ThreadChecker is a helper class used to help verify that some methods of a
-// class are called from the same thread. It provides identical functionality to
-// base::NonThreadSafe, but it is meant to be held as a member variable, rather
-// than inherited from base::NonThreadSafe.
-//
-// While inheriting from base::NonThreadSafe may give a clear indication about
-// the thread-safety of a class, it may also lead to violations of the style
-// guide with regard to multiple inheritance. The choice between having a
-// ThreadChecker member and inheriting from base::NonThreadSafe should be based
-// on whether:
-//  - Derived classes need to know the thread they belong to, as opposed to
-//    having that functionality fully encapsulated in the base class.
-//  - Derived classes should be able to reassign the base class to another
-//    thread, via DetachFromThread.
-//
-// If neither of these are true, then having a ThreadChecker member and calling
-// CalledOnValidThread is the preferable solution.
-//
-// Example:
-// class MyClass {
-//  public:
-//   void Foo() {
-//     DCHECK(thread_checker_.CalledOnValidThread());
-//     ... (do stuff) ...
-//   }
-//
-//  private:
-//   ThreadChecker thread_checker_;
-// }
-//
-// In Release mode, CalledOnValidThread will always return true.
+///
+/// ThreadChecker is a helper class used to help verify that some methods of a
+/// class are called from the same thread. It provides identical functionality
+/// to base::NonThreadSafe, but it is meant to be held as a member variable,
+/// rather than inherited from base::NonThreadSafe.
+///
+/// While inheriting from base::NonThreadSafe may give a clear indication about
+/// the thread-safety of a class, it may also lead to violations of the style
+/// guide with regard to multiple inheritance. The choice between having a
+/// ThreadChecker member and inheriting from base::NonThreadSafe should be based
+/// on whether:
+///  - Derived classes need to know the thread they belong to, as opposed to
+///    having that functionality fully encapsulated in the base class.
+///  - Derived classes should be able to reassign the base class to another
+///    thread, via DetachFromThread.
+///
+/// If neither of these are true, then having a ThreadChecker member and calling
+/// CalledOnValidThread is the preferable solution.
+///
+/// Example:
+///
+/// <pre>
+///   class MyClass {
+///    public:
+///     void Foo() {
+///       DCHECK(thread_checker_.CalledOnValidThread());
+///       ... (do stuff) ...
+///     }
+///
+///    private:
+///     ThreadChecker thread_checker_;
+///   }
+/// </pre>
+///
+/// In Release mode, CalledOnValidThread will always return true.
+///
 #if ENABLE_THREAD_CHECKER
 class ThreadChecker : public cef_internal::ThreadCheckerImpl {};
 #else
diff --git a/src/include/base/cef_trace_event.h b/src/include/base/cef_trace_event.h
index 1b2cad0..30e31af 100644
--- a/src/include/base/cef_trace_event.h
+++ b/src/include/base/cef_trace_event.h
@@ -29,124 +29,133 @@
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 ///
-// Trace events are for tracking application performance and resource usage.
-// Macros are provided to track:
-//    Begin and end of function calls
-//    Counters
-//
-// Events are issued against categories. Whereas LOG's categories are statically
-// defined, TRACE categories are created implicitly with a string. For example:
-//   TRACE_EVENT_INSTANT0("MY_SUBSYSTEM", "SomeImportantEvent")
-//
-// Events can be INSTANT, or can be pairs of BEGIN and END in the same scope:
-//   TRACE_EVENT_BEGIN0("MY_SUBSYSTEM", "SomethingCostly")
-//   doSomethingCostly()
-//   TRACE_EVENT_END0("MY_SUBSYSTEM", "SomethingCostly")
-// Note: Our tools can't always determine the correct BEGIN/END pairs unless
-// these are used in the same scope. Use ASYNC_BEGIN/ASYNC_END macros if you
-// need them to be in separate scopes.
-//
-// A common use case is to trace entire function scopes. This issues a trace
-// BEGIN and END automatically:
-//   void doSomethingCostly() {
-//     TRACE_EVENT0("MY_SUBSYSTEM", "doSomethingCostly");
-//     ...
-//   }
-//
-// Additional parameters can be associated with an event:
-//   void doSomethingCostly2(int howMuch) {
-//     TRACE_EVENT1("MY_SUBSYSTEM", "doSomethingCostly",
-//         "howMuch", howMuch);
-//     ...
-//   }
-//
-// The trace system will automatically add to this information the current
-// process id, thread id, and a timestamp in microseconds.
-//
-// To trace an asynchronous procedure such as an IPC send/receive, use
-// ASYNC_BEGIN and ASYNC_END:
-//   [single threaded sender code]
-//     static int send_count = 0;
-//     ++send_count;
-//     TRACE_EVENT_ASYNC_BEGIN0("ipc", "message", send_count);
-//     Send(new MyMessage(send_count));
-//   [receive code]
-//     void OnMyMessage(send_count) {
-//       TRACE_EVENT_ASYNC_END0("ipc", "message", send_count);
-//     }
-// The third parameter is a unique ID to match ASYNC_BEGIN/ASYNC_END pairs.
-// ASYNC_BEGIN and ASYNC_END can occur on any thread of any traced process.
-// Pointers can be used for the ID parameter, and they will be mangled
-// internally so that the same pointer on two different processes will not
-// match. For example:
-//   class MyTracedClass {
-//    public:
-//     MyTracedClass() {
-//       TRACE_EVENT_ASYNC_BEGIN0("category", "MyTracedClass", this);
-//     }
-//     ~MyTracedClass() {
-//       TRACE_EVENT_ASYNC_END0("category", "MyTracedClass", this);
-//     }
-//   }
-//
-// The trace event also supports counters, which is a way to track a quantity
-// as it varies over time. Counters are created with the following macro:
-//   TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter", g_myCounterValue);
-//
-// Counters are process-specific. The macro itself can be issued from any
-// thread, however.
-//
-// Sometimes, you want to track two counters at once. You can do this with two
-// counter macros:
-//   TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter0", g_myCounterValue[0]);
-//   TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter1", g_myCounterValue[1]);
-// Or you can do it with a combined macro:
-//   TRACE_COUNTER2("MY_SUBSYSTEM", "myCounter",
-//       "bytesPinned", g_myCounterValue[0],
-//       "bytesAllocated", g_myCounterValue[1]);
-// This indicates to the tracing UI that these counters should be displayed
-// in a single graph, as a summed area chart.
-//
-// Since counters are in a global namespace, you may want to disembiguate with a
-// unique ID, by using the TRACE_COUNTER_ID* variations.
-//
-// By default, trace collection is compiled in, but turned off at runtime.
-// Collecting trace data is the responsibility of the embedding application. In
-// CEF's case, calling BeginTracing will turn on tracing on all active
-// processes.
-//
-//
-// Memory scoping note:
-// Tracing copies the pointers, not the string content, of the strings passed
-// in for category, name, and arg_names.  Thus, the following code will cause
-// problems:
-//     char* str = strdup("impprtantName");
-//     TRACE_EVENT_INSTANT0("SUBSYSTEM", str);  // BAD!
-//     free(str);                   // Trace system now has dangling pointer
-//
-// To avoid this issue with the |name| and |arg_name| parameters, use the
-// TRACE_EVENT_COPY_XXX overloads of the macros at additional runtime
-// overhead.
-// Notes: The category must always be in a long-lived char* (i.e. static const).
-//        The |arg_values|, when used, are always deep copied with the _COPY
-//        macros.
-//
-//
-// Thread Safety:
-// All macros are thread safe and can be used from any process.
+/// \file
+/// Trace events are for tracking application performance and resource usage.
+/// Macros are provided to track:
+///    Begin and end of function calls
+///    Counters
+///
+/// Events are issued against categories. Whereas LOG's categories are
+/// statically defined, TRACE categories are created implicitly with a string.
+/// For example: <pre>
+///   TRACE_EVENT_INSTANT0("MY_SUBSYSTEM", "SomeImportantEvent")
+/// </pre>
+///
+/// Events can be INSTANT, or can be pairs of BEGIN and END in the same scope:
+/// <pre>
+///   TRACE_EVENT_BEGIN0("MY_SUBSYSTEM", "SomethingCostly")
+///   doSomethingCostly()
+///   TRACE_EVENT_END0("MY_SUBSYSTEM", "SomethingCostly")
+/// </pre>
+/// Note: Our tools can't always determine the correct BEGIN/END pairs unless
+/// these are used in the same scope. Use ASYNC_BEGIN/ASYNC_END macros if you
+/// need them to be in separate scopes.
+///
+/// A common use case is to trace entire function scopes. This issues a trace
+/// BEGIN and END automatically:
+/// <pre>
+///   void doSomethingCostly() {
+///     TRACE_EVENT0("MY_SUBSYSTEM", "doSomethingCostly");
+///     ...
+///   }
+/// </pre>
+///
+/// Additional parameters can be associated with an event:
+/// <pre>
+///   void doSomethingCostly2(int howMuch) {
+///     TRACE_EVENT1("MY_SUBSYSTEM", "doSomethingCostly",
+///         "howMuch", howMuch);
+///     ...
+///   }
+/// </pre>
+///
+/// The trace system will automatically add to this information the current
+/// process id, thread id, and a timestamp in microseconds.
+///
+/// To trace an asynchronous procedure such as an IPC send/receive, use
+/// ASYNC_BEGIN and ASYNC_END:
+/// <pre>
+///   [single threaded sender code]
+///     static int send_count = 0;
+///     ++send_count;
+///     TRACE_EVENT_ASYNC_BEGIN0("ipc", "message", send_count);
+///     Send(new MyMessage(send_count));
+///   [receive code]
+///     void OnMyMessage(send_count) {
+///       TRACE_EVENT_ASYNC_END0("ipc", "message", send_count);
+///     }
+/// </pre>
+/// The third parameter is a unique ID to match ASYNC_BEGIN/ASYNC_END pairs.
+/// ASYNC_BEGIN and ASYNC_END can occur on any thread of any traced process.
+/// Pointers can be used for the ID parameter, and they will be mangled
+/// internally so that the same pointer on two different processes will not
+/// match. For example:
+/// <pre>
+///   class MyTracedClass {
+///    public:
+///     MyTracedClass() {
+///       TRACE_EVENT_ASYNC_BEGIN0("category", "MyTracedClass", this);
+///     }
+///     ~MyTracedClass() {
+///       TRACE_EVENT_ASYNC_END0("category", "MyTracedClass", this);
+///     }
+///   }
+/// </pre>
+///
+/// The trace event also supports counters, which is a way to track a quantity
+/// as it varies over time. Counters are created with the following macro:
+/// <pre>
+///   TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter", g_myCounterValue);
+/// </pre>
+///
+/// Counters are process-specific. The macro itself can be issued from any
+/// thread, however.
+///
+/// Sometimes, you want to track two counters at once. You can do this with two
+/// counter macros:
+/// <pre>
+///   TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter0", g_myCounterValue[0]);
+///   TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter1", g_myCounterValue[1]);
+/// </pre>
+/// Or you can do it with a combined macro:
+/// <pre>
+///   TRACE_COUNTER2("MY_SUBSYSTEM", "myCounter",
+///       "bytesPinned", g_myCounterValue[0],
+///       "bytesAllocated", g_myCounterValue[1]);
+/// </pre>
+/// This indicates to the tracing UI that these counters should be displayed
+/// in a single graph, as a summed area chart.
+///
+/// Since counters are in a global namespace, you may want to disembiguate with
+/// a unique ID, by using the TRACE_COUNTER_ID* variations.
+///
+/// By default, trace collection is compiled in, but turned off at runtime.
+/// Collecting trace data is the responsibility of the embedding application. In
+/// CEF's case, calling BeginTracing will turn on tracing on all active
+/// processes.
+///
+///
+/// Memory scoping note:
+/// Tracing copies the pointers, not the string content, of the strings passed
+/// in for category, name, and arg_names.  Thus, the following code will cause
+/// problems:
+/// <pre>
+///     char* str = strdup("impprtantName");
+///     TRACE_EVENT_INSTANT0("SUBSYSTEM", str);  // BAD!
+///     free(str);                   // Trace system now has dangling pointer
+/// </pre>
+///
+///
+/// Thread Safety:
+/// All macros are thread safe and can be used from any process.
 ///
 
 #ifndef CEF_INCLUDE_BASE_CEF_TRACE_EVENT_H_
 #define CEF_INCLUDE_BASE_CEF_TRACE_EVENT_H_
 #pragma once
 
-#if defined(TRACE_EVENT0)
-// Do nothing if the macros provided by this header already exist.
-// 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.
+#if defined(USING_CHROMIUM_INCLUDES)
+/// When building CEF include the Chromium header directly.
 #include "base/trace_event/trace_event.h"
 #else  // !USING_CHROMIUM_INCLUDES
 // The following is substantially similar to the Chromium implementation.
@@ -155,20 +164,22 @@
 
 #include "include/internal/cef_trace_event_internal.h"
 
-// Records a pair of begin and end events called "name" for the current
-// scope, with 0, 1 or 2 associated arguments. If the category is not
-// enabled, then this does nothing.
-// - category and name strings must have application lifetime (statics or
-//   literals). They may not include " chars.
-#define TRACE_EVENT0(category, name)                              \
-  cef_trace_event_begin(category, name, NULL, 0, NULL, 0, false); \
+///
+/// Records a pair of begin and end events called "name" for the current
+/// scope, with 0, 1 or 2 associated arguments. If the category is not
+/// enabled, then this does nothing.
+/// - category and name strings must have application lifetime (statics or
+///   literals). They may not include " chars.
+///
+#define TRACE_EVENT0(category, name)                       \
+  cef_trace_event_begin(category, name, NULL, 0, NULL, 0); \
   CEF_INTERNAL_TRACE_END_ON_SCOPE_CLOSE(category, name)
-#define TRACE_EVENT1(category, name, arg1_name, arg1_val)                     \
-  cef_trace_event_begin(category, name, arg1_name, arg1_val, NULL, 0, false); \
+#define TRACE_EVENT1(category, name, arg1_name, arg1_val)              \
+  cef_trace_event_begin(category, name, arg1_name, arg1_val, NULL, 0); \
   CEF_INTERNAL_TRACE_END_ON_SCOPE_CLOSE(category, name)
 #define TRACE_EVENT2(category, name, arg1_name, arg1_val, arg2_name, arg2_val) \
   cef_trace_event_begin(category, name, arg1_name, arg1_val, arg2_name,        \
-                        arg2_val, false);                                      \
+                        arg2_val);                                             \
   CEF_INTERNAL_TRACE_END_ON_SCOPE_CLOSE(category, name)
 
 // Implementation detail: trace event macros create temporary variable names.
@@ -184,228 +195,181 @@
   cef_trace_event::CefTraceEndOnScopeClose CEF_INTERNAL_TRACE_EVENT_UID( \
       profileScope)(category, name)
 
-// Records a single event called "name" immediately, with 0, 1 or 2
-// associated arguments. If the category is not enabled, then this
-// does nothing.
-// - category and name strings must have application lifetime (statics or
-//   literals). They may not include " chars.
+///
+/// Records a single event called "name" immediately, with 0, 1 or 2
+/// associated arguments. If the category is not enabled, then this
+/// does nothing.
+/// - category and name strings must have application lifetime (statics or
+///   literals). They may not include " chars.
+///
 #define TRACE_EVENT_INSTANT0(category, name) \
-  cef_trace_event_instant(category, name, NULL, 0, NULL, 0, false)
+  cef_trace_event_instant(category, name, NULL, 0, NULL, 0)
 #define TRACE_EVENT_INSTANT1(category, name, arg1_name, arg1_val) \
-  cef_trace_event_instant(category, name, arg1_name, arg1_val, NULL, 0, false)
+  cef_trace_event_instant(category, name, arg1_name, arg1_val, NULL, 0)
 #define TRACE_EVENT_INSTANT2(category, name, arg1_name, arg1_val, arg2_name, \
                              arg2_val)                                       \
   cef_trace_event_instant(category, name, arg1_name, arg1_val, arg2_name,    \
-                          arg2_val, false)
-#define TRACE_EVENT_COPY_INSTANT0(category, name) \
-  cef_trace_event_instant(category, name, NULL, 0, NULL, 0, true)
-#define TRACE_EVENT_COPY_INSTANT1(category, name, arg1_name, arg1_val) \
-  cef_trace_event_instant(category, name, arg1_name, arg1_val, NULL, 0, true)
-#define TRACE_EVENT_COPY_INSTANT2(category, name, arg1_name, arg1_val,    \
-                                  arg2_name, arg2_val)                    \
-  cef_trace_event_instant(category, name, arg1_name, arg1_val, arg2_name, \
-                          arg2_val, true)
+                          arg2_val)
 
-// Records a single BEGIN event called "name" immediately, with 0, 1 or 2
-// associated arguments. If the category is not enabled, then this
-// does nothing.
-// - category and name strings must have application lifetime (statics or
-//   literals). They may not include " chars.
+///
+/// Records a single BEGIN event called "name" immediately, with 0, 1 or 2
+/// associated arguments. If the category is not enabled, then this
+/// does nothing.
+/// - category and name strings must have application lifetime (statics or
+///   literals). They may not include " chars.
+///
 #define TRACE_EVENT_BEGIN0(category, name) \
-  cef_trace_event_begin(category, name, NULL, 0, NULL, 0, false)
+  cef_trace_event_begin(category, name, NULL, 0, NULL, 0)
 #define TRACE_EVENT_BEGIN1(category, name, arg1_name, arg1_val) \
-  cef_trace_event_begin(category, name, arg1_name, arg1_val, NULL, 0, false)
+  cef_trace_event_begin(category, name, arg1_name, arg1_val, NULL, 0)
 #define TRACE_EVENT_BEGIN2(category, name, arg1_name, arg1_val, arg2_name, \
                            arg2_val)                                       \
   cef_trace_event_begin(category, name, arg1_name, arg1_val, arg2_name,    \
-                        arg2_val, false)
-#define TRACE_EVENT_COPY_BEGIN0(category, name) \
-  cef_trace_event_begin(category, name, NULL, 0, NULL, 0, true)
-#define TRACE_EVENT_COPY_BEGIN1(category, name, arg1_name, arg1_val) \
-  cef_trace_event_begin(category, name, arg1_name, arg1_val, NULL, 0, true)
-#define TRACE_EVENT_COPY_BEGIN2(category, name, arg1_name, arg1_val,    \
-                                arg2_name, arg2_val)                    \
-  cef_trace_event_begin(category, name, arg1_name, arg1_val, arg2_name, \
-                        arg2_val, true)
+                        arg2_val)
 
-// Records a single END event for "name" immediately. If the category
-// is not enabled, then this does nothing.
-// - category and name strings must have application lifetime (statics or
-//   literals). They may not include " chars.
+///
+/// Records a single END event for "name" immediately. If the category
+/// is not enabled, then this does nothing.
+/// - category and name strings must have application lifetime (statics or
+///   literals). They may not include " chars.
+///
 #define TRACE_EVENT_END0(category, name) \
-  cef_trace_event_end(category, name, NULL, 0, NULL, 0, false)
+  cef_trace_event_end(category, name, NULL, 0, NULL, 0)
 #define TRACE_EVENT_END1(category, name, arg1_name, arg1_val) \
-  cef_trace_event_end(category, name, arg1_name, arg1_val, NULL, 0, false)
+  cef_trace_event_end(category, name, arg1_name, arg1_val, NULL, 0)
 #define TRACE_EVENT_END2(category, name, arg1_name, arg1_val, arg2_name, \
                          arg2_val)                                       \
-  cef_trace_event_end(category, name, arg1_name, arg1_val, arg2_name,    \
-                      arg2_val, false)
-#define TRACE_EVENT_COPY_END0(category, name) \
-  cef_trace_event_end(category, name, NULL, 0, NULL, 0, true)
-#define TRACE_EVENT_COPY_END1(category, name, arg1_name, arg1_val) \
-  cef_trace_event_end(category, name, arg1_name, arg1_val, NULL, 0, true)
-#define TRACE_EVENT_COPY_END2(category, name, arg1_name, arg1_val, arg2_name, \
-                              arg2_val)                                       \
-  cef_trace_event_end(category, name, arg1_name, arg1_val, arg2_name,         \
-                      arg2_val, true)
+  cef_trace_event_end(category, name, arg1_name, arg1_val, arg2_name, arg2_val)
 
-// Records the value of a counter called "name" immediately. Value
-// must be representable as a 32 bit integer.
-// - category and name strings must have application lifetime (statics or
-//   literals). They may not include " chars.
+///
+/// Records the value of a counter called "name" immediately. Value
+/// must be representable as a 32 bit integer.
+/// - category and name strings must have application lifetime (statics or
+///   literals). They may not include " chars.
+///
 #define TRACE_COUNTER1(category, name, value) \
-  cef_trace_counter(category, name, NULL, value, NULL, 0, false)
-#define TRACE_COPY_COUNTER1(category, name, value) \
-  cef_trace_counter(category, name, NULL, value, NULL, 0, true)
+  cef_trace_counter(category, name, NULL, value, NULL, 0)
 
-// Records the values of a multi-parted counter called "name" immediately.
-// The UI will treat value1 and value2 as parts of a whole, displaying their
-// values as a stacked-bar chart.
-// - category and name strings must have application lifetime (statics or
-//   literals). They may not include " chars.
+///
+/// Records the values of a multi-parted counter called "name" immediately.
+/// The UI will treat value1 and value2 as parts of a whole, displaying their
+/// values as a stacked-bar chart.
+/// - category and name strings must have application lifetime (statics or
+///   literals). They may not include " chars.
+///
 #define TRACE_COUNTER2(category, name, value1_name, value1_val, value2_name, \
                        value2_val)                                           \
   cef_trace_counter(category, name, value1_name, value1_val, value2_name,    \
-                    value2_val, false)
-#define TRACE_COPY_COUNTER2(category, name, value1_name, value1_val,      \
-                            value2_name, value2_val)                      \
-  cef_trace_counter(category, name, value1_name, value1_val, value2_name, \
-                    value2_val, true)
+                    value2_val)
 
-// Records the value of a counter called "name" immediately. Value
-// must be representable as a 32 bit integer.
-// - category and name strings must have application lifetime (statics or
-//   literals). They may not include " chars.
-// - |id| is used to disambiguate counters with the same name. It must either
-//   be a pointer or an integer value up to 64 bits. If it's a pointer, the
-//   bits will be xored with a hash of the process ID so that the same pointer
-//   on two different processes will not collide.
+///
+/// Records the value of a counter called "name" immediately. Value
+/// must be representable as a 32 bit integer.
+/// - category and name strings must have application lifetime (statics or
+///   literals). They may not include " chars.
+/// - |id| is used to disambiguate counters with the same name. It must either
+///   be a pointer or an integer value up to 64 bits. If it's a pointer, the
+///   bits will be xored with a hash of the process ID so that the same pointer
+///   on two different processes will not collide.
+///
 #define TRACE_COUNTER_ID1(category, name, id, value) \
-  cef_trace_counter_id(category, name, id, NULL, value, NULL, 0, false)
-#define TRACE_COPY_COUNTER_ID1(category, name, id, value) \
-  cef_trace_counter_id(category, name, id, NULL, value, NULL, 0, true)
+  cef_trace_counter_id(category, name, id, NULL, value, NULL, 0)
 
-// Records the values of a multi-parted counter called "name" immediately.
-// The UI will treat value1 and value2 as parts of a whole, displaying their
-// values as a stacked-bar chart.
-// - category and name strings must have application lifetime (statics or
-//   literals). They may not include " chars.
-// - |id| is used to disambiguate counters with the same name. It must either
-//   be a pointer or an integer value up to 64 bits. If it's a pointer, the
-//   bits will be xored with a hash of the process ID so that the same pointer
-//   on two different processes will not collide.
+///
+/// Records the values of a multi-parted counter called "name" immediately.
+/// The UI will treat value1 and value2 as parts of a whole, displaying their
+/// values as a stacked-bar chart.
+/// - category and name strings must have application lifetime (statics or
+///   literals). They may not include " chars.
+/// - |id| is used to disambiguate counters with the same name. It must either
+///   be a pointer or an integer value up to 64 bits. If it's a pointer, the
+///   bits will be xored with a hash of the process ID so that the same pointer
+///   on two different processes will not collide.
+///
 #define TRACE_COUNTER_ID2(category, name, id, value1_name, value1_val, \
                           value2_name, value2_val)                     \
   cef_trace_counter_id(category, name, id, value1_name, value1_val,    \
-                       value2_name, value2_val, false)
-#define TRACE_COPY_COUNTER_ID2(category, name, id, value1_name, value1_val, \
-                               value2_name, value2_val)                     \
-  cef_trace_counter_id(category, name, id, value1_name, value1_val,         \
-                       value2_name, value2_val, true)
+                       value2_name, value2_val)
 
-// Records a single ASYNC_BEGIN event called "name" immediately, with 0, 1 or 2
-// associated arguments. If the category is not enabled, then this
-// does nothing.
-// - category and name strings must have application lifetime (statics or
-//   literals). They may not include " chars.
-// - |id| is used to match the ASYNC_BEGIN event with the ASYNC_END event.
-//   ASYNC events are considered to match if their category, name and id values
-//   all match. |id| must either be a pointer or an integer value up to 64
-//   bits. If it's a pointer, the bits will be xored with a hash of the process
-//   ID sothat the same pointer on two different processes will not collide.
-// An asynchronous operation can consist of multiple phases. The first phase is
-// defined by the ASYNC_BEGIN calls. Additional phases can be defined using the
-// ASYNC_STEP_BEGIN macros. When the operation completes, call ASYNC_END.
-// An async operation can span threads and processes, but all events in that
-// operation must use the same |name| and |id|. Each event can have its own
-// args.
+///
+/// Records a single ASYNC_BEGIN event called "name" immediately, with 0, 1 or 2
+/// associated arguments. If the category is not enabled, then this
+/// does nothing.
+/// - category and name strings must have application lifetime (statics or
+///   literals). They may not include " chars.
+/// - |id| is used to match the ASYNC_BEGIN event with the ASYNC_END event.
+///   ASYNC events are considered to match if their category, name and id values
+///   all match. |id| must either be a pointer or an integer value up to 64
+///   bits. If it's a pointer, the bits will be xored with a hash of the process
+///   ID sothat the same pointer on two different processes will not collide.
+/// An asynchronous operation can consist of multiple phases. The first phase is
+/// defined by the ASYNC_BEGIN calls. Additional phases can be defined using the
+/// ASYNC_STEP_BEGIN macros. When the operation completes, call ASYNC_END.
+/// An async operation can span threads and processes, but all events in that
+/// operation must use the same |name| and |id|. Each event can have its own
+/// args.
+///
 #define TRACE_EVENT_ASYNC_BEGIN0(category, name, id) \
-  cef_trace_event_async_begin(category, name, id, NULL, 0, NULL, 0, false)
-#define TRACE_EVENT_ASYNC_BEGIN1(category, name, id, arg1_name, arg1_val)    \
-  cef_trace_event_async_begin(category, name, id, arg1_name, arg1_val, NULL, \
-                              0, false)
+  cef_trace_event_async_begin(category, name, id, NULL, 0, NULL, 0)
+#define TRACE_EVENT_ASYNC_BEGIN1(category, name, id, arg1_name, arg1_val) \
+  cef_trace_event_async_begin(category, name, id, arg1_name, arg1_val, NULL, 0)
 #define TRACE_EVENT_ASYNC_BEGIN2(category, name, id, arg1_name, arg1_val, \
                                  arg2_name, arg2_val)                     \
   cef_trace_event_async_begin(category, name, id, arg1_name, arg1_val,    \
-                              arg2_name, arg2_val, false)
-#define TRACE_EVENT_COPY_ASYNC_BEGIN0(category, name, id) \
-  cef_trace_event_async_begin(category, name, id, NULL, 0, NULL, 0, true)
-#define TRACE_EVENT_COPY_ASYNC_BEGIN1(category, name, id, arg1_name, arg1_val) \
-  cef_trace_event_async_begin(category, name, id, arg1_name, arg1_val, NULL,   \
-                              0, true)
-#define TRACE_EVENT_COPY_ASYNC_BEGIN2(category, name, id, arg1_name, arg1_val, \
-                                      arg2_name, arg2_val)                     \
-  cef_trace_event_async_begin(category, name, id, arg1_name, arg1_val,         \
-                              arg2_name, arg2_val, true)
+                              arg2_name, arg2_val)
 
-// Records a single ASYNC_STEP_INTO event for |step| immediately. If the
-// category is not enabled, then this does nothing. The |name| and |id| must
-// match the ASYNC_BEGIN event above. The |step| param identifies this step
-// within the async event. This should be called at the beginning of the next
-// phase of an asynchronous operation. The ASYNC_BEGIN event must not have any
-// ASYNC_STEP_PAST events.
+///
+/// Records a single ASYNC_STEP_INTO event for |step| immediately. If the
+/// category is not enabled, then this does nothing. The |name| and |id| must
+/// match the ASYNC_BEGIN event above. The |step| param identifies this step
+/// within the async event. This should be called at the beginning of the next
+/// phase of an asynchronous operation. The ASYNC_BEGIN event must not have any
+/// ASYNC_STEP_PAST events.
+///
 #define TRACE_EVENT_ASYNC_STEP_INTO0(category, name, id, step) \
-  cef_trace_event_async_step_into(category, name, id, step, NULL, 0, false)
+  cef_trace_event_async_step_into(category, name, id, step, NULL, 0)
 #define TRACE_EVENT_ASYNC_STEP_INTO1(category, name, id, step, arg1_name, \
                                      arg1_val)                            \
-  cef_trace_event_async_step_into(category, name, id, step, arg1_name,    \
-                                  arg1_val, false)
-#define TRACE_EVENT_COPY_ASYNC_STEP_INTO0(category, name, id, step) \
-  cef_trace_event_async_step_into(category, name, id, step, NULL, 0, true)
-#define TRACE_EVENT_COPY_ASYNC_STEP_INTO1(category, name, id, step, arg1_name, \
-                                          arg1_val)                            \
-  cef_trace_event_async_step_into(category, name, id, step, arg1_name,         \
-                                  arg1_val, true)
+  cef_trace_event_async_step_into(category, name, id, step, arg1_name, arg1_val)
 
-// Records a single ASYNC_STEP_PAST event for |step| immediately. If the
-// category is not enabled, then this does nothing. The |name| and |id| must
-// match the ASYNC_BEGIN event above. The |step| param identifies this step
-// within the async event. This should be called at the beginning of the next
-// phase of an asynchronous operation. The ASYNC_BEGIN event must not have any
-// ASYNC_STEP_INTO events.
+///
+/// Records a single ASYNC_STEP_PAST event for |step| immediately. If the
+/// category is not enabled, then this does nothing. The |name| and |id| must
+/// match the ASYNC_BEGIN event above. The |step| param identifies this step
+/// within the async event. This should be called at the beginning of the next
+/// phase of an asynchronous operation. The ASYNC_BEGIN event must not have any
+/// ASYNC_STEP_INTO events.
+///
 #define TRACE_EVENT_ASYNC_STEP_PAST0(category, name, id, step) \
-  cef_trace_event_async_step_past(category, name, id, step, NULL, 0, false)
+  cef_trace_event_async_step_past(category, name, id, step, NULL, 0)
 #define TRACE_EVENT_ASYNC_STEP_PAST1(category, name, id, step, arg1_name, \
                                      arg1_val)                            \
-  cef_trace_event_async_step_past(category, name, id, step, arg1_name,    \
-                                  arg1_val, false)
-#define TRACE_EVENT_COPY_ASYNC_STEP_PAST0(category, name, id, step) \
-  cef_trace_event_async_step_past(category, name, id, step, NULL, 0, true)
-#define TRACE_EVENT_COPY_ASYNC_STEP_PAST1(category, name, id, step, arg1_name, \
-                                          arg1_val)                            \
-  cef_trace_event_async_step_past(category, name, id, step, arg1_name,         \
-                                  arg1_val, true)
+  cef_trace_event_async_step_past(category, name, id, step, arg1_name, arg1_val)
 
-// Records a single ASYNC_END event for "name" immediately. If the category
-// is not enabled, then this does nothing.
+///
+/// Records a single ASYNC_END event for "name" immediately. If the category
+/// is not enabled, then this does nothing.
+///
 #define TRACE_EVENT_ASYNC_END0(category, name, id) \
-  cef_trace_event_async_end(category, name, id, NULL, 0, NULL, 0, false)
-#define TRACE_EVENT_ASYNC_END1(category, name, id, arg1_name, arg1_val)       \
-  cef_trace_event_async_end(category, name, id, arg1_name, arg1_val, NULL, 0, \
-                            false)
+  cef_trace_event_async_end(category, name, id, NULL, 0, NULL, 0)
+#define TRACE_EVENT_ASYNC_END1(category, name, id, arg1_name, arg1_val) \
+  cef_trace_event_async_end(category, name, id, arg1_name, arg1_val, NULL, 0)
 #define TRACE_EVENT_ASYNC_END2(category, name, id, arg1_name, arg1_val, \
                                arg2_name, arg2_val)                     \
   cef_trace_event_async_end(category, name, id, arg1_name, arg1_val,    \
-                            arg2_name, arg2_val, false)
-#define TRACE_EVENT_COPY_ASYNC_END0(category, name, id) \
-  cef_trace_event_async_end(category, name, id, NULL, 0, NULL, 0, true)
-#define TRACE_EVENT_COPY_ASYNC_END1(category, name, id, arg1_name, arg1_val)  \
-  cef_trace_event_async_end(category, name, id, arg1_name, arg1_val, NULL, 0, \
-                            true)
-#define TRACE_EVENT_COPY_ASYNC_END2(category, name, id, arg1_name, arg1_val, \
-                                    arg2_name, arg2_val)                     \
-  cef_trace_event_async_end(category, name, id, arg1_name, arg1_val,         \
-                            arg2_name, arg2_val, true)
+                            arg2_name, arg2_val)
 
 namespace cef_trace_event {
 
-// Used by TRACE_EVENTx macro. Do not use directly.
+///
+/// Used by TRACE_EVENTx macro. Do not use directly.
+///
 class CefTraceEndOnScopeClose {
  public:
   CefTraceEndOnScopeClose(const char* category, const char* name)
       : category_(category), name_(name) {}
   ~CefTraceEndOnScopeClose() {
-    cef_trace_event_end(category_, name_, NULL, 0, NULL, 0, false);
+    cef_trace_event_end(category_, name_, NULL, 0, NULL, 0);
   }
 
  private:
@@ -413,7 +377,7 @@
   const char* name_;
 };
 
-}  // cef_trace_event
+}  // namespace cef_trace_event
 
 #endif  // !USING_CHROMIUM_INCLUDES
 
diff --git a/src/include/base/cef_tuple.h b/src/include/base/cef_tuple.h
index aeb6e9c..ae438d3 100644
--- a/src/include/base/cef_tuple.h
+++ b/src/include/base/cef_tuple.h
@@ -28,40 +28,36 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-// A Tuple is a generic templatized container, similar in concept to std::pair.
-// There are classes Tuple0 to Tuple6, cooresponding to the number of elements
-// it contains.  The convenient MakeTuple() function takes 0 to 6 arguments,
-// and will construct and return the appropriate Tuple object.  The functions
-// DispatchToMethod and DispatchToFunction take a function pointer or instance
-// and method pointer, and unpack a tuple into arguments to the call.
-//
-// Tuple elements are copied by value, and stored in the tuple.  See the unit
-// tests for more details of how/when the values are copied.
-//
-// Example usage:
-//   // These two methods of creating a Tuple are identical.
-//   Tuple2<int, const char*> tuple_a(1, "wee");
-//   Tuple2<int, const char*> tuple_b = MakeTuple(1, "wee");
-//
-//   void SomeFunc(int a, const char* b) { }
-//   DispatchToFunction(&SomeFunc, tuple_a);  // SomeFunc(1, "wee")
-//   DispatchToFunction(
-//       &SomeFunc, MakeTuple(10, "foo"));    // SomeFunc(10, "foo")
-//
-//   struct { void SomeMeth(int a, int b, int c) { } } foo;
-//   DispatchToMethod(&foo, &Foo::SomeMeth, MakeTuple(1, 2, 3));
-//   // foo->SomeMeth(1, 2, 3);
+///
+/// \file
+/// Use std::tuple as tuple type. This file contains helper functions for
+/// working with std::tuples.
+/// The functions DispatchToMethod and DispatchToFunction take a function
+/// pointer or instance and method pointer, and unpack a tuple into arguments to
+/// the call.
+///
+/// Example usage:
+/// <pre>
+///   // These two methods of creating a Tuple are identical.
+///   std::tuple<int, const char*> tuple_a(1, "wee");
+///   std::tuple<int, const char*> tuple_b = std::make_tuple(1, "wee");
+///
+///   void SomeFunc(int a, const char* b) { }
+///   DispatchToFunction(&SomeFunc, tuple_a);  // SomeFunc(1, "wee")
+///   DispatchToFunction(
+///       &SomeFunc, std::make_tuple(10, "foo"));    // SomeFunc(10, "foo")
+///
+///   struct { void SomeMeth(int a, int b, int c) { } } foo;
+///   DispatchToMethod(&foo, &Foo::SomeMeth, std::make_tuple(1, 2, 3));
+///   // foo->SomeMeth(1, 2, 3);
+/// </pre>
+///
 
 #ifndef CEF_INCLUDE_BASE_CEF_TUPLE_H_
 #define CEF_INCLUDE_BASE_CEF_TUPLE_H_
 #pragma once
 
-#if defined(BASE_TUPLE_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)
+#if defined(USING_CHROMIUM_INCLUDES)
 // When building CEF include the Chromium header directly.
 #include "base/tuple.h"
 #else  // !USING_CHROMIUM_INCLUDES
@@ -69,559 +65,14 @@
 // If the Chromium implementation diverges the below implementation should be
 // updated to match.
 
-#include "include/base/cef_bind_helpers.h"
+#include <stddef.h>
+#include <tuple>
+#include <utility>
+
+#include "include/base/cef_build.h"
 
 namespace base {
 
-// Traits ----------------------------------------------------------------------
-//
-// A simple traits class for tuple arguments.
-//
-// ValueType: the bare, nonref version of a type (same as the type for nonrefs).
-// RefType: the ref version of a type (same as the type for refs).
-// ParamType: what type to pass to functions (refs should not be constified).
-
-template <class P>
-struct TupleTraits {
-  typedef P ValueType;
-  typedef P& RefType;
-  typedef const P& ParamType;
-};
-
-template <class P>
-struct TupleTraits<P&> {
-  typedef P ValueType;
-  typedef P& RefType;
-  typedef P& ParamType;
-};
-
-template <class P>
-struct TupleTypes {};
-
-// Tuple -----------------------------------------------------------------------
-//
-// This set of classes is useful for bundling 0 or more heterogeneous data types
-// into a single variable.  The advantage of this is that it greatly simplifies
-// function objects that need to take an arbitrary number of parameters; see
-// RunnableMethod and IPC::MessageWithTuple.
-//
-// Tuple0 is supplied to act as a 'void' type.  It can be used, for example,
-// when dispatching to a function that accepts no arguments (see the
-// Dispatchers below).
-// Tuple1<A> is rarely useful.  One such use is when A is non-const ref that you
-// want filled by the dispatchee, and the tuple is merely a container for that
-// output (a "tier").  See MakeRefTuple and its usages.
-
-struct Tuple0 {
-  typedef Tuple0 ValueTuple;
-  typedef Tuple0 RefTuple;
-  typedef Tuple0 ParamTuple;
-};
-
-template <class A>
-struct Tuple1 {
- public:
-  typedef A TypeA;
-
-  Tuple1() {}
-  explicit Tuple1(typename TupleTraits<A>::ParamType a) : a(a) {}
-
-  A a;
-};
-
-template <class A, class B>
-struct Tuple2 {
- public:
-  typedef A TypeA;
-  typedef B TypeB;
-
-  Tuple2() {}
-  Tuple2(typename TupleTraits<A>::ParamType a,
-         typename TupleTraits<B>::ParamType b)
-      : a(a), b(b) {}
-
-  A a;
-  B b;
-};
-
-template <class A, class B, class C>
-struct Tuple3 {
- public:
-  typedef A TypeA;
-  typedef B TypeB;
-  typedef C TypeC;
-
-  Tuple3() {}
-  Tuple3(typename TupleTraits<A>::ParamType a,
-         typename TupleTraits<B>::ParamType b,
-         typename TupleTraits<C>::ParamType c)
-      : a(a), b(b), c(c) {}
-
-  A a;
-  B b;
-  C c;
-};
-
-template <class A, class B, class C, class D>
-struct Tuple4 {
- public:
-  typedef A TypeA;
-  typedef B TypeB;
-  typedef C TypeC;
-  typedef D TypeD;
-
-  Tuple4() {}
-  Tuple4(typename TupleTraits<A>::ParamType a,
-         typename TupleTraits<B>::ParamType b,
-         typename TupleTraits<C>::ParamType c,
-         typename TupleTraits<D>::ParamType d)
-      : a(a), b(b), c(c), d(d) {}
-
-  A a;
-  B b;
-  C c;
-  D d;
-};
-
-template <class A, class B, class C, class D, class E>
-struct Tuple5 {
- public:
-  typedef A TypeA;
-  typedef B TypeB;
-  typedef C TypeC;
-  typedef D TypeD;
-  typedef E TypeE;
-
-  Tuple5() {}
-  Tuple5(typename TupleTraits<A>::ParamType a,
-         typename TupleTraits<B>::ParamType b,
-         typename TupleTraits<C>::ParamType c,
-         typename TupleTraits<D>::ParamType d,
-         typename TupleTraits<E>::ParamType e)
-      : a(a), b(b), c(c), d(d), e(e) {}
-
-  A a;
-  B b;
-  C c;
-  D d;
-  E e;
-};
-
-template <class A, class B, class C, class D, class E, class F>
-struct Tuple6 {
- public:
-  typedef A TypeA;
-  typedef B TypeB;
-  typedef C TypeC;
-  typedef D TypeD;
-  typedef E TypeE;
-  typedef F TypeF;
-
-  Tuple6() {}
-  Tuple6(typename TupleTraits<A>::ParamType a,
-         typename TupleTraits<B>::ParamType b,
-         typename TupleTraits<C>::ParamType c,
-         typename TupleTraits<D>::ParamType d,
-         typename TupleTraits<E>::ParamType e,
-         typename TupleTraits<F>::ParamType f)
-      : a(a), b(b), c(c), d(d), e(e), f(f) {}
-
-  A a;
-  B b;
-  C c;
-  D d;
-  E e;
-  F f;
-};
-
-template <class A, class B, class C, class D, class E, class F, class G>
-struct Tuple7 {
- public:
-  typedef A TypeA;
-  typedef B TypeB;
-  typedef C TypeC;
-  typedef D TypeD;
-  typedef E TypeE;
-  typedef F TypeF;
-  typedef G TypeG;
-
-  Tuple7() {}
-  Tuple7(typename TupleTraits<A>::ParamType a,
-         typename TupleTraits<B>::ParamType b,
-         typename TupleTraits<C>::ParamType c,
-         typename TupleTraits<D>::ParamType d,
-         typename TupleTraits<E>::ParamType e,
-         typename TupleTraits<F>::ParamType f,
-         typename TupleTraits<G>::ParamType g)
-      : a(a), b(b), c(c), d(d), e(e), f(f), g(g) {}
-
-  A a;
-  B b;
-  C c;
-  D d;
-  E e;
-  F f;
-  G g;
-};
-
-template <class A,
-          class B,
-          class C,
-          class D,
-          class E,
-          class F,
-          class G,
-          class H>
-struct Tuple8 {
- public:
-  typedef A TypeA;
-  typedef B TypeB;
-  typedef C TypeC;
-  typedef D TypeD;
-  typedef E TypeE;
-  typedef F TypeF;
-  typedef G TypeG;
-  typedef H TypeH;
-
-  Tuple8() {}
-  Tuple8(typename TupleTraits<A>::ParamType a,
-         typename TupleTraits<B>::ParamType b,
-         typename TupleTraits<C>::ParamType c,
-         typename TupleTraits<D>::ParamType d,
-         typename TupleTraits<E>::ParamType e,
-         typename TupleTraits<F>::ParamType f,
-         typename TupleTraits<G>::ParamType g,
-         typename TupleTraits<H>::ParamType h)
-      : a(a), b(b), c(c), d(d), e(e), f(f), g(g), h(h) {}
-
-  A a;
-  B b;
-  C c;
-  D d;
-  E e;
-  F f;
-  G g;
-  H h;
-};
-
-// Tuple types ----------------------------------------------------------------
-//
-// Allows for selection of ValueTuple/RefTuple/ParamTuple without needing the
-// definitions of class types the tuple takes as parameters.
-
-template <>
-struct TupleTypes<Tuple0> {
-  typedef Tuple0 ValueTuple;
-  typedef Tuple0 RefTuple;
-  typedef Tuple0 ParamTuple;
-};
-
-template <class A>
-struct TupleTypes<Tuple1<A>> {
-  typedef Tuple1<typename TupleTraits<A>::ValueType> ValueTuple;
-  typedef Tuple1<typename TupleTraits<A>::RefType> RefTuple;
-  typedef Tuple1<typename TupleTraits<A>::ParamType> ParamTuple;
-};
-
-template <class A, class B>
-struct TupleTypes<Tuple2<A, B>> {
-  typedef Tuple2<typename TupleTraits<A>::ValueType,
-                 typename TupleTraits<B>::ValueType>
-      ValueTuple;
-  typedef Tuple2<typename TupleTraits<A>::RefType,
-                 typename TupleTraits<B>::RefType>
-      RefTuple;
-  typedef Tuple2<typename TupleTraits<A>::ParamType,
-                 typename TupleTraits<B>::ParamType>
-      ParamTuple;
-};
-
-template <class A, class B, class C>
-struct TupleTypes<Tuple3<A, B, C>> {
-  typedef Tuple3<typename TupleTraits<A>::ValueType,
-                 typename TupleTraits<B>::ValueType,
-                 typename TupleTraits<C>::ValueType>
-      ValueTuple;
-  typedef Tuple3<typename TupleTraits<A>::RefType,
-                 typename TupleTraits<B>::RefType,
-                 typename TupleTraits<C>::RefType>
-      RefTuple;
-  typedef Tuple3<typename TupleTraits<A>::ParamType,
-                 typename TupleTraits<B>::ParamType,
-                 typename TupleTraits<C>::ParamType>
-      ParamTuple;
-};
-
-template <class A, class B, class C, class D>
-struct TupleTypes<Tuple4<A, B, C, D>> {
-  typedef Tuple4<typename TupleTraits<A>::ValueType,
-                 typename TupleTraits<B>::ValueType,
-                 typename TupleTraits<C>::ValueType,
-                 typename TupleTraits<D>::ValueType>
-      ValueTuple;
-  typedef Tuple4<typename TupleTraits<A>::RefType,
-                 typename TupleTraits<B>::RefType,
-                 typename TupleTraits<C>::RefType,
-                 typename TupleTraits<D>::RefType>
-      RefTuple;
-  typedef Tuple4<typename TupleTraits<A>::ParamType,
-                 typename TupleTraits<B>::ParamType,
-                 typename TupleTraits<C>::ParamType,
-                 typename TupleTraits<D>::ParamType>
-      ParamTuple;
-};
-
-template <class A, class B, class C, class D, class E>
-struct TupleTypes<Tuple5<A, B, C, D, E>> {
-  typedef Tuple5<typename TupleTraits<A>::ValueType,
-                 typename TupleTraits<B>::ValueType,
-                 typename TupleTraits<C>::ValueType,
-                 typename TupleTraits<D>::ValueType,
-                 typename TupleTraits<E>::ValueType>
-      ValueTuple;
-  typedef Tuple5<typename TupleTraits<A>::RefType,
-                 typename TupleTraits<B>::RefType,
-                 typename TupleTraits<C>::RefType,
-                 typename TupleTraits<D>::RefType,
-                 typename TupleTraits<E>::RefType>
-      RefTuple;
-  typedef Tuple5<typename TupleTraits<A>::ParamType,
-                 typename TupleTraits<B>::ParamType,
-                 typename TupleTraits<C>::ParamType,
-                 typename TupleTraits<D>::ParamType,
-                 typename TupleTraits<E>::ParamType>
-      ParamTuple;
-};
-
-template <class A, class B, class C, class D, class E, class F>
-struct TupleTypes<Tuple6<A, B, C, D, E, F>> {
-  typedef Tuple6<typename TupleTraits<A>::ValueType,
-                 typename TupleTraits<B>::ValueType,
-                 typename TupleTraits<C>::ValueType,
-                 typename TupleTraits<D>::ValueType,
-                 typename TupleTraits<E>::ValueType,
-                 typename TupleTraits<F>::ValueType>
-      ValueTuple;
-  typedef Tuple6<typename TupleTraits<A>::RefType,
-                 typename TupleTraits<B>::RefType,
-                 typename TupleTraits<C>::RefType,
-                 typename TupleTraits<D>::RefType,
-                 typename TupleTraits<E>::RefType,
-                 typename TupleTraits<F>::RefType>
-      RefTuple;
-  typedef Tuple6<typename TupleTraits<A>::ParamType,
-                 typename TupleTraits<B>::ParamType,
-                 typename TupleTraits<C>::ParamType,
-                 typename TupleTraits<D>::ParamType,
-                 typename TupleTraits<E>::ParamType,
-                 typename TupleTraits<F>::ParamType>
-      ParamTuple;
-};
-
-template <class A, class B, class C, class D, class E, class F, class G>
-struct TupleTypes<Tuple7<A, B, C, D, E, F, G>> {
-  typedef Tuple7<typename TupleTraits<A>::ValueType,
-                 typename TupleTraits<B>::ValueType,
-                 typename TupleTraits<C>::ValueType,
-                 typename TupleTraits<D>::ValueType,
-                 typename TupleTraits<E>::ValueType,
-                 typename TupleTraits<F>::ValueType,
-                 typename TupleTraits<G>::ValueType>
-      ValueTuple;
-  typedef Tuple7<typename TupleTraits<A>::RefType,
-                 typename TupleTraits<B>::RefType,
-                 typename TupleTraits<C>::RefType,
-                 typename TupleTraits<D>::RefType,
-                 typename TupleTraits<E>::RefType,
-                 typename TupleTraits<F>::RefType,
-                 typename TupleTraits<G>::RefType>
-      RefTuple;
-  typedef Tuple7<typename TupleTraits<A>::ParamType,
-                 typename TupleTraits<B>::ParamType,
-                 typename TupleTraits<C>::ParamType,
-                 typename TupleTraits<D>::ParamType,
-                 typename TupleTraits<E>::ParamType,
-                 typename TupleTraits<F>::ParamType,
-                 typename TupleTraits<G>::ParamType>
-      ParamTuple;
-};
-
-template <class A,
-          class B,
-          class C,
-          class D,
-          class E,
-          class F,
-          class G,
-          class H>
-struct TupleTypes<Tuple8<A, B, C, D, E, F, G, H>> {
-  typedef Tuple8<typename TupleTraits<A>::ValueType,
-                 typename TupleTraits<B>::ValueType,
-                 typename TupleTraits<C>::ValueType,
-                 typename TupleTraits<D>::ValueType,
-                 typename TupleTraits<E>::ValueType,
-                 typename TupleTraits<F>::ValueType,
-                 typename TupleTraits<G>::ValueType,
-                 typename TupleTraits<H>::ValueType>
-      ValueTuple;
-  typedef Tuple8<typename TupleTraits<A>::RefType,
-                 typename TupleTraits<B>::RefType,
-                 typename TupleTraits<C>::RefType,
-                 typename TupleTraits<D>::RefType,
-                 typename TupleTraits<E>::RefType,
-                 typename TupleTraits<F>::RefType,
-                 typename TupleTraits<G>::RefType,
-                 typename TupleTraits<H>::RefType>
-      RefTuple;
-  typedef Tuple8<typename TupleTraits<A>::ParamType,
-                 typename TupleTraits<B>::ParamType,
-                 typename TupleTraits<C>::ParamType,
-                 typename TupleTraits<D>::ParamType,
-                 typename TupleTraits<E>::ParamType,
-                 typename TupleTraits<F>::ParamType,
-                 typename TupleTraits<G>::ParamType,
-                 typename TupleTraits<H>::ParamType>
-      ParamTuple;
-};
-
-// Tuple creators -------------------------------------------------------------
-//
-// Helper functions for constructing tuples while inferring the template
-// argument types.
-
-inline Tuple0 MakeTuple() {
-  return Tuple0();
-}
-
-template <class A>
-inline Tuple1<A> MakeTuple(const A& a) {
-  return Tuple1<A>(a);
-}
-
-template <class A, class B>
-inline Tuple2<A, B> MakeTuple(const A& a, const B& b) {
-  return Tuple2<A, B>(a, b);
-}
-
-template <class A, class B, class C>
-inline Tuple3<A, B, C> MakeTuple(const A& a, const B& b, const C& c) {
-  return Tuple3<A, B, C>(a, b, c);
-}
-
-template <class A, class B, class C, class D>
-inline Tuple4<A, B, C, D> MakeTuple(const A& a,
-                                    const B& b,
-                                    const C& c,
-                                    const D& d) {
-  return Tuple4<A, B, C, D>(a, b, c, d);
-}
-
-template <class A, class B, class C, class D, class E>
-inline Tuple5<A, B, C, D, E> MakeTuple(const A& a,
-                                       const B& b,
-                                       const C& c,
-                                       const D& d,
-                                       const E& e) {
-  return Tuple5<A, B, C, D, E>(a, b, c, d, e);
-}
-
-template <class A, class B, class C, class D, class E, class F>
-inline Tuple6<A, B, C, D, E, F> MakeTuple(const A& a,
-                                          const B& b,
-                                          const C& c,
-                                          const D& d,
-                                          const E& e,
-                                          const F& f) {
-  return Tuple6<A, B, C, D, E, F>(a, b, c, d, e, f);
-}
-
-template <class A, class B, class C, class D, class E, class F, class G>
-inline Tuple7<A, B, C, D, E, F, G> MakeTuple(const A& a,
-                                             const B& b,
-                                             const C& c,
-                                             const D& d,
-                                             const E& e,
-                                             const F& f,
-                                             const G& g) {
-  return Tuple7<A, B, C, D, E, F, G>(a, b, c, d, e, f, g);
-}
-
-template <class A,
-          class B,
-          class C,
-          class D,
-          class E,
-          class F,
-          class G,
-          class H>
-inline Tuple8<A, B, C, D, E, F, G, H> MakeTuple(const A& a,
-                                                const B& b,
-                                                const C& c,
-                                                const D& d,
-                                                const E& e,
-                                                const F& f,
-                                                const G& g,
-                                                const H& h) {
-  return Tuple8<A, B, C, D, E, F, G, H>(a, b, c, d, e, f, g, h);
-}
-
-// The following set of helpers make what Boost refers to as "Tiers" - a tuple
-// of references.
-
-template <class A>
-inline Tuple1<A&> MakeRefTuple(A& a) {
-  return Tuple1<A&>(a);
-}
-
-template <class A, class B>
-inline Tuple2<A&, B&> MakeRefTuple(A& a, B& b) {
-  return Tuple2<A&, B&>(a, b);
-}
-
-template <class A, class B, class C>
-inline Tuple3<A&, B&, C&> MakeRefTuple(A& a, B& b, C& c) {
-  return Tuple3<A&, B&, C&>(a, b, c);
-}
-
-template <class A, class B, class C, class D>
-inline Tuple4<A&, B&, C&, D&> MakeRefTuple(A& a, B& b, C& c, D& d) {
-  return Tuple4<A&, B&, C&, D&>(a, b, c, d);
-}
-
-template <class A, class B, class C, class D, class E>
-inline Tuple5<A&, B&, C&, D&, E&> MakeRefTuple(A& a, B& b, C& c, D& d, E& e) {
-  return Tuple5<A&, B&, C&, D&, E&>(a, b, c, d, e);
-}
-
-template <class A, class B, class C, class D, class E, class F>
-inline Tuple6<A&, B&, C&, D&, E&, F&> MakeRefTuple(A& a,
-                                                   B& b,
-                                                   C& c,
-                                                   D& d,
-                                                   E& e,
-                                                   F& f) {
-  return Tuple6<A&, B&, C&, D&, E&, F&>(a, b, c, d, e, f);
-}
-
-template <class A, class B, class C, class D, class E, class F, class G>
-inline Tuple7<A&, B&, C&, D&, E&, F&, G&>
-MakeRefTuple(A& a, B& b, C& c, D& d, E& e, F& f, G& g) {
-  return Tuple7<A&, B&, C&, D&, E&, F&, G&>(a, b, c, d, e, f, g);
-}
-
-template <class A,
-          class B,
-          class C,
-          class D,
-          class E,
-          class F,
-          class G,
-          class H>
-inline Tuple8<A&, B&, C&, D&, E&, F&, G&, H&>
-MakeRefTuple(A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h) {
-  return Tuple8<A&, B&, C&, D&, E&, F&, G&, H&>(a, b, c, d, e, f, g, h);
-}
-
 // Dispatchers ----------------------------------------------------------------
 //
 // Helper functions that call the given method on an object, with the unpacked
@@ -633,974 +84,65 @@
 
 // Non-Static Dispatchers with no out params.
 
-template <class ObjT, class Method>
-inline void DispatchToMethod(ObjT* obj, Method method, const Tuple0& arg) {
-  (obj->*method)();
+template <typename ObjT, typename Method, typename Tuple, size_t... Ns>
+inline void DispatchToMethodImpl(const ObjT& obj,
+                                 Method method,
+                                 Tuple&& args,
+                                 std::index_sequence<Ns...>) {
+  (obj->*method)(std::get<Ns>(std::forward<Tuple>(args))...);
 }
 
-template <class ObjT, class Method, class A>
-inline void DispatchToMethod(ObjT* obj, Method method, const A& arg) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg));
-}
-
-template <class ObjT, class Method, class A>
-inline void DispatchToMethod(ObjT* obj, Method method, const Tuple1<A>& arg) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a));
-}
-
-template <class ObjT, class Method, class A, class B>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple2<A, B>& arg) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a),
-                 base::cef_internal::UnwrapTraits<B>::Unwrap(arg.b));
-}
-
-template <class ObjT, class Method, class A, class B, class C>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple3<A, B, C>& arg) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a),
-                 base::cef_internal::UnwrapTraits<B>::Unwrap(arg.b),
-                 base::cef_internal::UnwrapTraits<C>::Unwrap(arg.c));
-}
-
-template <class ObjT, class Method, class A, class B, class C, class D>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple4<A, B, C, D>& arg) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a),
-                 base::cef_internal::UnwrapTraits<B>::Unwrap(arg.b),
-                 base::cef_internal::UnwrapTraits<C>::Unwrap(arg.c),
-                 base::cef_internal::UnwrapTraits<D>::Unwrap(arg.d));
-}
-
-template <class ObjT, class Method, class A, class B, class C, class D, class E>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple5<A, B, C, D, E>& arg) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a),
-                 base::cef_internal::UnwrapTraits<B>::Unwrap(arg.b),
-                 base::cef_internal::UnwrapTraits<C>::Unwrap(arg.c),
-                 base::cef_internal::UnwrapTraits<D>::Unwrap(arg.d),
-                 base::cef_internal::UnwrapTraits<E>::Unwrap(arg.e));
-}
-
-template <class ObjT,
-          class Method,
-          class A,
-          class B,
-          class C,
-          class D,
-          class E,
-          class F>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple6<A, B, C, D, E, F>& arg) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a),
-                 base::cef_internal::UnwrapTraits<B>::Unwrap(arg.b),
-                 base::cef_internal::UnwrapTraits<C>::Unwrap(arg.c),
-                 base::cef_internal::UnwrapTraits<D>::Unwrap(arg.d),
-                 base::cef_internal::UnwrapTraits<E>::Unwrap(arg.e),
-                 base::cef_internal::UnwrapTraits<F>::Unwrap(arg.f));
-}
-
-template <class ObjT,
-          class Method,
-          class A,
-          class B,
-          class C,
-          class D,
-          class E,
-          class F,
-          class G>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple7<A, B, C, D, E, F, G>& arg) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a),
-                 base::cef_internal::UnwrapTraits<B>::Unwrap(arg.b),
-                 base::cef_internal::UnwrapTraits<C>::Unwrap(arg.c),
-                 base::cef_internal::UnwrapTraits<D>::Unwrap(arg.d),
-                 base::cef_internal::UnwrapTraits<E>::Unwrap(arg.e),
-                 base::cef_internal::UnwrapTraits<F>::Unwrap(arg.f),
-                 base::cef_internal::UnwrapTraits<G>::Unwrap(arg.g));
-}
-
-template <class ObjT,
-          class Method,
-          class A,
-          class B,
-          class C,
-          class D,
-          class E,
-          class F,
-          class G,
-          class H>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple8<A, B, C, D, E, F, G, H>& arg) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a),
-                 base::cef_internal::UnwrapTraits<B>::Unwrap(arg.b),
-                 base::cef_internal::UnwrapTraits<C>::Unwrap(arg.c),
-                 base::cef_internal::UnwrapTraits<D>::Unwrap(arg.d),
-                 base::cef_internal::UnwrapTraits<E>::Unwrap(arg.e),
-                 base::cef_internal::UnwrapTraits<F>::Unwrap(arg.f),
-                 base::cef_internal::UnwrapTraits<G>::Unwrap(arg.g),
-                 base::cef_internal::UnwrapTraits<H>::Unwrap(arg.h));
+template <typename ObjT, typename Method, typename Tuple>
+inline void DispatchToMethod(const ObjT& obj, Method method, Tuple&& args) {
+  constexpr size_t size = std::tuple_size<std::decay_t<Tuple>>::value;
+  DispatchToMethodImpl(obj, method, std::forward<Tuple>(args),
+                       std::make_index_sequence<size>());
 }
 
 // Static Dispatchers with no out params.
 
-template <class Function>
-inline void DispatchToFunction(Function function, const Tuple0& arg) {
-  (*function)();
+template <typename Function, typename Tuple, size_t... Ns>
+inline void DispatchToFunctionImpl(Function function,
+                                   Tuple&& args,
+                                   std::index_sequence<Ns...>) {
+  (*function)(std::get<Ns>(std::forward<Tuple>(args))...);
 }
 
-template <class Function, class A>
-inline void DispatchToFunction(Function function, const A& arg) {
-  (*function)(arg);
+template <typename Function, typename Tuple>
+inline void DispatchToFunction(Function function, Tuple&& args) {
+  constexpr size_t size = std::tuple_size<std::decay_t<Tuple>>::value;
+  DispatchToFunctionImpl(function, std::forward<Tuple>(args),
+                         std::make_index_sequence<size>());
 }
 
-template <class Function, class A>
-inline void DispatchToFunction(Function function, const Tuple1<A>& arg) {
-  (*function)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a));
+// Dispatchers with out parameters.
+
+template <typename ObjT,
+          typename Method,
+          typename InTuple,
+          typename OutTuple,
+          size_t... InNs,
+          size_t... OutNs>
+inline void DispatchToMethodImpl(const ObjT& obj,
+                                 Method method,
+                                 InTuple&& in,
+                                 OutTuple* out,
+                                 std::index_sequence<InNs...>,
+                                 std::index_sequence<OutNs...>) {
+  (obj->*method)(std::get<InNs>(std::forward<InTuple>(in))...,
+                 &std::get<OutNs>(*out)...);
 }
 
-template <class Function, class A, class B>
-inline void DispatchToFunction(Function function, const Tuple2<A, B>& arg) {
-  (*function)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a),
-              base::cef_internal::UnwrapTraits<B>::Unwrap(arg.b));
-}
-
-template <class Function, class A, class B, class C>
-inline void DispatchToFunction(Function function, const Tuple3<A, B, C>& arg) {
-  (*function)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a),
-              base::cef_internal::UnwrapTraits<B>::Unwrap(arg.b),
-              base::cef_internal::UnwrapTraits<C>::Unwrap(arg.c));
-}
-
-template <class Function, class A, class B, class C, class D>
-inline void DispatchToFunction(Function function,
-                               const Tuple4<A, B, C, D>& arg) {
-  (*function)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a),
-              base::cef_internal::UnwrapTraits<B>::Unwrap(arg.b),
-              base::cef_internal::UnwrapTraits<C>::Unwrap(arg.c),
-              base::cef_internal::UnwrapTraits<D>::Unwrap(arg.d));
-}
-
-template <class Function, class A, class B, class C, class D, class E>
-inline void DispatchToFunction(Function function,
-                               const Tuple5<A, B, C, D, E>& arg) {
-  (*function)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a),
-              base::cef_internal::UnwrapTraits<B>::Unwrap(arg.b),
-              base::cef_internal::UnwrapTraits<C>::Unwrap(arg.c),
-              base::cef_internal::UnwrapTraits<D>::Unwrap(arg.d),
-              base::cef_internal::UnwrapTraits<E>::Unwrap(arg.e));
-}
-
-template <class Function, class A, class B, class C, class D, class E, class F>
-inline void DispatchToFunction(Function function,
-                               const Tuple6<A, B, C, D, E, F>& arg) {
-  (*function)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a),
-              base::cef_internal::UnwrapTraits<B>::Unwrap(arg.b),
-              base::cef_internal::UnwrapTraits<C>::Unwrap(arg.c),
-              base::cef_internal::UnwrapTraits<D>::Unwrap(arg.d),
-              base::cef_internal::UnwrapTraits<E>::Unwrap(arg.e),
-              base::cef_internal::UnwrapTraits<F>::Unwrap(arg.f));
-}
-
-template <class Function,
-          class A,
-          class B,
-          class C,
-          class D,
-          class E,
-          class F,
-          class G>
-inline void DispatchToFunction(Function function,
-                               const Tuple7<A, B, C, D, E, F, G>& arg) {
-  (*function)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a),
-              base::cef_internal::UnwrapTraits<B>::Unwrap(arg.b),
-              base::cef_internal::UnwrapTraits<C>::Unwrap(arg.c),
-              base::cef_internal::UnwrapTraits<D>::Unwrap(arg.d),
-              base::cef_internal::UnwrapTraits<E>::Unwrap(arg.e),
-              base::cef_internal::UnwrapTraits<F>::Unwrap(arg.f),
-              base::cef_internal::UnwrapTraits<G>::Unwrap(arg.g));
-}
-
-template <class Function,
-          class A,
-          class B,
-          class C,
-          class D,
-          class E,
-          class F,
-          class G,
-          class H>
-inline void DispatchToFunction(Function function,
-                               const Tuple8<A, B, C, D, E, F, G, H>& arg) {
-  (*function)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a),
-              base::cef_internal::UnwrapTraits<B>::Unwrap(arg.b),
-              base::cef_internal::UnwrapTraits<C>::Unwrap(arg.c),
-              base::cef_internal::UnwrapTraits<D>::Unwrap(arg.d),
-              base::cef_internal::UnwrapTraits<E>::Unwrap(arg.e),
-              base::cef_internal::UnwrapTraits<F>::Unwrap(arg.f),
-              base::cef_internal::UnwrapTraits<G>::Unwrap(arg.g),
-              base::cef_internal::UnwrapTraits<H>::Unwrap(arg.h));
-}
-
-// Dispatchers with 0 out param (as a Tuple0).
-
-template <class ObjT, class Method>
-inline void DispatchToMethod(ObjT* obj,
+template <typename ObjT, typename Method, typename InTuple, typename OutTuple>
+inline void DispatchToMethod(const ObjT& obj,
                              Method method,
-                             const Tuple0& arg,
-                             Tuple0*) {
-  (obj->*method)();
-}
-
-template <class ObjT, class Method, class A>
-inline void DispatchToMethod(ObjT* obj, Method method, const A& arg, Tuple0*) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg));
-}
-
-template <class ObjT, class Method, class A>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple1<A>& arg,
-                             Tuple0*) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a));
-}
-
-template <class ObjT, class Method, class A, class B>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple2<A, B>& arg,
-                             Tuple0*) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a),
-                 base::cef_internal::UnwrapTraits<B>::Unwrap(arg.b));
-}
-
-template <class ObjT, class Method, class A, class B, class C>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple3<A, B, C>& arg,
-                             Tuple0*) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a),
-                 base::cef_internal::UnwrapTraits<B>::Unwrap(arg.b),
-                 base::cef_internal::UnwrapTraits<C>::Unwrap(arg.c));
-}
-
-template <class ObjT, class Method, class A, class B, class C, class D>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple4<A, B, C, D>& arg,
-                             Tuple0*) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a),
-                 base::cef_internal::UnwrapTraits<B>::Unwrap(arg.b),
-                 base::cef_internal::UnwrapTraits<C>::Unwrap(arg.c),
-                 base::cef_internal::UnwrapTraits<D>::Unwrap(arg.d));
-}
-
-template <class ObjT, class Method, class A, class B, class C, class D, class E>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple5<A, B, C, D, E>& arg,
-                             Tuple0*) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a),
-                 base::cef_internal::UnwrapTraits<B>::Unwrap(arg.b),
-                 base::cef_internal::UnwrapTraits<C>::Unwrap(arg.c),
-                 base::cef_internal::UnwrapTraits<D>::Unwrap(arg.d),
-                 base::cef_internal::UnwrapTraits<E>::Unwrap(arg.e));
-}
-
-template <class ObjT,
-          class Method,
-          class A,
-          class B,
-          class C,
-          class D,
-          class E,
-          class F>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple6<A, B, C, D, E, F>& arg,
-                             Tuple0*) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<A>::Unwrap(arg.a),
-                 base::cef_internal::UnwrapTraits<B>::Unwrap(arg.b),
-                 base::cef_internal::UnwrapTraits<C>::Unwrap(arg.c),
-                 base::cef_internal::UnwrapTraits<D>::Unwrap(arg.d),
-                 base::cef_internal::UnwrapTraits<E>::Unwrap(arg.e),
-                 base::cef_internal::UnwrapTraits<F>::Unwrap(arg.f));
-}
-
-// Dispatchers with 1 out param.
-
-template <class ObjT, class Method, class OutA>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple0& in,
-                             Tuple1<OutA>* out) {
-  (obj->*method)(&out->a);
-}
-
-template <class ObjT, class Method, class InA, class OutA>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const InA& in,
-                             Tuple1<OutA>* out) {
-  (obj->*method)(in, &out->a);
-}
-
-template <class ObjT, class Method, class InA, class OutA>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple1<InA>& in,
-                             Tuple1<OutA>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a), &out->a);
-}
-
-template <class ObjT, class Method, class InA, class InB, class OutA>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple2<InA, InB>& in,
-                             Tuple1<OutA>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b), &out->a);
-}
-
-template <class ObjT, class Method, class InA, class InB, class InC, class OutA>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple3<InA, InB, InC>& in,
-                             Tuple1<OutA>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b),
-                 base::cef_internal::UnwrapTraits<InC>::Unwrap(in.c), &out->a);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class InC,
-          class InD,
-          class OutA>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple4<InA, InB, InC, InD>& in,
-                             Tuple1<OutA>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b),
-                 base::cef_internal::UnwrapTraits<InC>::Unwrap(in.c),
-                 base::cef_internal::UnwrapTraits<InD>::Unwrap(in.d), &out->a);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class InC,
-          class InD,
-          class InE,
-          class OutA>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple5<InA, InB, InC, InD, InE>& in,
-                             Tuple1<OutA>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b),
-                 base::cef_internal::UnwrapTraits<InC>::Unwrap(in.c),
-                 base::cef_internal::UnwrapTraits<InD>::Unwrap(in.d),
-                 base::cef_internal::UnwrapTraits<InE>::Unwrap(in.e), &out->a);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class InC,
-          class InD,
-          class InE,
-          class InF,
-          class OutA>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple6<InA, InB, InC, InD, InE, InF>& in,
-                             Tuple1<OutA>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b),
-                 base::cef_internal::UnwrapTraits<InC>::Unwrap(in.c),
-                 base::cef_internal::UnwrapTraits<InD>::Unwrap(in.d),
-                 base::cef_internal::UnwrapTraits<InE>::Unwrap(in.e),
-                 base::cef_internal::UnwrapTraits<InF>::Unwrap(in.f), &out->a);
-}
-
-// Dispatchers with 2 out params.
-
-template <class ObjT, class Method, class OutA, class OutB>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple0& in,
-                             Tuple2<OutA, OutB>* out) {
-  (obj->*method)(&out->a, &out->b);
-}
-
-template <class ObjT, class Method, class InA, class OutA, class OutB>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const InA& in,
-                             Tuple2<OutA, OutB>* out) {
-  (obj->*method)(in, &out->a, &out->b);
-}
-
-template <class ObjT, class Method, class InA, class OutA, class OutB>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple1<InA>& in,
-                             Tuple2<OutA, OutB>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a), &out->a,
-                 &out->b);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class OutA,
-          class OutB>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple2<InA, InB>& in,
-                             Tuple2<OutA, OutB>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b), &out->a,
-                 &out->b);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class InC,
-          class OutA,
-          class OutB>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple3<InA, InB, InC>& in,
-                             Tuple2<OutA, OutB>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b),
-                 base::cef_internal::UnwrapTraits<InC>::Unwrap(in.c), &out->a,
-                 &out->b);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class InC,
-          class InD,
-          class OutA,
-          class OutB>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple4<InA, InB, InC, InD>& in,
-                             Tuple2<OutA, OutB>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b),
-                 base::cef_internal::UnwrapTraits<InC>::Unwrap(in.c),
-                 base::cef_internal::UnwrapTraits<InD>::Unwrap(in.d), &out->a,
-                 &out->b);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class InC,
-          class InD,
-          class InE,
-          class OutA,
-          class OutB>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple5<InA, InB, InC, InD, InE>& in,
-                             Tuple2<OutA, OutB>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b),
-                 base::cef_internal::UnwrapTraits<InC>::Unwrap(in.c),
-                 base::cef_internal::UnwrapTraits<InD>::Unwrap(in.d),
-                 base::cef_internal::UnwrapTraits<InE>::Unwrap(in.e), &out->a,
-                 &out->b);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class InC,
-          class InD,
-          class InE,
-          class InF,
-          class OutA,
-          class OutB>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple6<InA, InB, InC, InD, InE, InF>& in,
-                             Tuple2<OutA, OutB>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b),
-                 base::cef_internal::UnwrapTraits<InC>::Unwrap(in.c),
-                 base::cef_internal::UnwrapTraits<InD>::Unwrap(in.d),
-                 base::cef_internal::UnwrapTraits<InE>::Unwrap(in.e),
-                 base::cef_internal::UnwrapTraits<InF>::Unwrap(in.f), &out->a,
-                 &out->b);
-}
-
-// Dispatchers with 3 out params.
-
-template <class ObjT, class Method, class OutA, class OutB, class OutC>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple0& in,
-                             Tuple3<OutA, OutB, OutC>* out) {
-  (obj->*method)(&out->a, &out->b, &out->c);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class OutA,
-          class OutB,
-          class OutC>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const InA& in,
-                             Tuple3<OutA, OutB, OutC>* out) {
-  (obj->*method)(in, &out->a, &out->b, &out->c);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class OutA,
-          class OutB,
-          class OutC>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple1<InA>& in,
-                             Tuple3<OutA, OutB, OutC>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a), &out->a,
-                 &out->b, &out->c);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class OutA,
-          class OutB,
-          class OutC>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple2<InA, InB>& in,
-                             Tuple3<OutA, OutB, OutC>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b), &out->a,
-                 &out->b, &out->c);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class InC,
-          class OutA,
-          class OutB,
-          class OutC>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple3<InA, InB, InC>& in,
-                             Tuple3<OutA, OutB, OutC>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b),
-                 base::cef_internal::UnwrapTraits<InC>::Unwrap(in.c), &out->a,
-                 &out->b, &out->c);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class InC,
-          class InD,
-          class OutA,
-          class OutB,
-          class OutC>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple4<InA, InB, InC, InD>& in,
-                             Tuple3<OutA, OutB, OutC>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b),
-                 base::cef_internal::UnwrapTraits<InC>::Unwrap(in.c),
-                 base::cef_internal::UnwrapTraits<InD>::Unwrap(in.d), &out->a,
-                 &out->b, &out->c);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class InC,
-          class InD,
-          class InE,
-          class OutA,
-          class OutB,
-          class OutC>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple5<InA, InB, InC, InD, InE>& in,
-                             Tuple3<OutA, OutB, OutC>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b),
-                 base::cef_internal::UnwrapTraits<InC>::Unwrap(in.c),
-                 base::cef_internal::UnwrapTraits<InD>::Unwrap(in.d),
-                 base::cef_internal::UnwrapTraits<InE>::Unwrap(in.e), &out->a,
-                 &out->b, &out->c);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class InC,
-          class InD,
-          class InE,
-          class InF,
-          class OutA,
-          class OutB,
-          class OutC>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple6<InA, InB, InC, InD, InE, InF>& in,
-                             Tuple3<OutA, OutB, OutC>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b),
-                 base::cef_internal::UnwrapTraits<InC>::Unwrap(in.c),
-                 base::cef_internal::UnwrapTraits<InD>::Unwrap(in.d),
-                 base::cef_internal::UnwrapTraits<InE>::Unwrap(in.e),
-                 base::cef_internal::UnwrapTraits<InF>::Unwrap(in.f), &out->a,
-                 &out->b, &out->c);
-}
-
-// Dispatchers with 4 out params.
-
-template <class ObjT,
-          class Method,
-          class OutA,
-          class OutB,
-          class OutC,
-          class OutD>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple0& in,
-                             Tuple4<OutA, OutB, OutC, OutD>* out) {
-  (obj->*method)(&out->a, &out->b, &out->c, &out->d);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class OutA,
-          class OutB,
-          class OutC,
-          class OutD>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const InA& in,
-                             Tuple4<OutA, OutB, OutC, OutD>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in), &out->a,
-                 &out->b, &out->c, &out->d);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class OutA,
-          class OutB,
-          class OutC,
-          class OutD>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple1<InA>& in,
-                             Tuple4<OutA, OutB, OutC, OutD>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a), &out->a,
-                 &out->b, &out->c, &out->d);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class OutA,
-          class OutB,
-          class OutC,
-          class OutD>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple2<InA, InB>& in,
-                             Tuple4<OutA, OutB, OutC, OutD>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b), &out->a,
-                 &out->b, &out->c, &out->d);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class InC,
-          class OutA,
-          class OutB,
-          class OutC,
-          class OutD>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple3<InA, InB, InC>& in,
-                             Tuple4<OutA, OutB, OutC, OutD>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b),
-                 base::cef_internal::UnwrapTraits<InC>::Unwrap(in.c), &out->a,
-                 &out->b, &out->c, &out->d);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class InC,
-          class InD,
-          class OutA,
-          class OutB,
-          class OutC,
-          class OutD>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple4<InA, InB, InC, InD>& in,
-                             Tuple4<OutA, OutB, OutC, OutD>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b),
-                 base::cef_internal::UnwrapTraits<InC>::Unwrap(in.c),
-                 base::cef_internal::UnwrapTraits<InD>::Unwrap(in.d), &out->a,
-                 &out->b, &out->c, &out->d);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class InC,
-          class InD,
-          class InE,
-          class OutA,
-          class OutB,
-          class OutC,
-          class OutD>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple5<InA, InB, InC, InD, InE>& in,
-                             Tuple4<OutA, OutB, OutC, OutD>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b),
-                 base::cef_internal::UnwrapTraits<InC>::Unwrap(in.c),
-                 base::cef_internal::UnwrapTraits<InD>::Unwrap(in.d),
-                 base::cef_internal::UnwrapTraits<InE>::Unwrap(in.e), &out->a,
-                 &out->b, &out->c, &out->d);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class InC,
-          class InD,
-          class InE,
-          class InF,
-          class OutA,
-          class OutB,
-          class OutC,
-          class OutD>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple6<InA, InB, InC, InD, InE, InF>& in,
-                             Tuple4<OutA, OutB, OutC, OutD>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b),
-                 base::cef_internal::UnwrapTraits<InC>::Unwrap(in.c),
-                 base::cef_internal::UnwrapTraits<InD>::Unwrap(in.d),
-                 base::cef_internal::UnwrapTraits<InE>::Unwrap(in.e),
-                 base::cef_internal::UnwrapTraits<InF>::Unwrap(in.f), &out->a,
-                 &out->b, &out->c, &out->d);
-}
-
-// Dispatchers with 5 out params.
-
-template <class ObjT,
-          class Method,
-          class OutA,
-          class OutB,
-          class OutC,
-          class OutD,
-          class OutE>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple0& in,
-                             Tuple5<OutA, OutB, OutC, OutD, OutE>* out) {
-  (obj->*method)(&out->a, &out->b, &out->c, &out->d, &out->e);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class OutA,
-          class OutB,
-          class OutC,
-          class OutD,
-          class OutE>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const InA& in,
-                             Tuple5<OutA, OutB, OutC, OutD, OutE>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in), &out->a,
-                 &out->b, &out->c, &out->d, &out->e);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class OutA,
-          class OutB,
-          class OutC,
-          class OutD,
-          class OutE>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple1<InA>& in,
-                             Tuple5<OutA, OutB, OutC, OutD, OutE>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a), &out->a,
-                 &out->b, &out->c, &out->d, &out->e);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class OutA,
-          class OutB,
-          class OutC,
-          class OutD,
-          class OutE>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple2<InA, InB>& in,
-                             Tuple5<OutA, OutB, OutC, OutD, OutE>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b), &out->a,
-                 &out->b, &out->c, &out->d, &out->e);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class InC,
-          class OutA,
-          class OutB,
-          class OutC,
-          class OutD,
-          class OutE>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple3<InA, InB, InC>& in,
-                             Tuple5<OutA, OutB, OutC, OutD, OutE>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b),
-                 base::cef_internal::UnwrapTraits<InC>::Unwrap(in.c), &out->a,
-                 &out->b, &out->c, &out->d, &out->e);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class InC,
-          class InD,
-          class OutA,
-          class OutB,
-          class OutC,
-          class OutD,
-          class OutE>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple4<InA, InB, InC, InD>& in,
-                             Tuple5<OutA, OutB, OutC, OutD, OutE>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b),
-                 base::cef_internal::UnwrapTraits<InC>::Unwrap(in.c),
-                 base::cef_internal::UnwrapTraits<InD>::Unwrap(in.d), &out->a,
-                 &out->b, &out->c, &out->d, &out->e);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class InC,
-          class InD,
-          class InE,
-          class OutA,
-          class OutB,
-          class OutC,
-          class OutD,
-          class OutE>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple5<InA, InB, InC, InD, InE>& in,
-                             Tuple5<OutA, OutB, OutC, OutD, OutE>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b),
-                 base::cef_internal::UnwrapTraits<InC>::Unwrap(in.c),
-                 base::cef_internal::UnwrapTraits<InD>::Unwrap(in.d),
-                 base::cef_internal::UnwrapTraits<InE>::Unwrap(in.e), &out->a,
-                 &out->b, &out->c, &out->d, &out->e);
-}
-
-template <class ObjT,
-          class Method,
-          class InA,
-          class InB,
-          class InC,
-          class InD,
-          class InE,
-          class InF,
-          class OutA,
-          class OutB,
-          class OutC,
-          class OutD,
-          class OutE>
-inline void DispatchToMethod(ObjT* obj,
-                             Method method,
-                             const Tuple6<InA, InB, InC, InD, InE, InF>& in,
-                             Tuple5<OutA, OutB, OutC, OutD, OutE>* out) {
-  (obj->*method)(base::cef_internal::UnwrapTraits<InA>::Unwrap(in.a),
-                 base::cef_internal::UnwrapTraits<InB>::Unwrap(in.b),
-                 base::cef_internal::UnwrapTraits<InC>::Unwrap(in.c),
-                 base::cef_internal::UnwrapTraits<InD>::Unwrap(in.d),
-                 base::cef_internal::UnwrapTraits<InE>::Unwrap(in.e),
-                 base::cef_internal::UnwrapTraits<InF>::Unwrap(in.f), &out->a,
-                 &out->b, &out->c, &out->d, &out->e);
+                             InTuple&& in,
+                             OutTuple* out) {
+  constexpr size_t in_size = std::tuple_size<std::decay_t<InTuple>>::value;
+  constexpr size_t out_size = std::tuple_size<OutTuple>::value;
+  DispatchToMethodImpl(obj, method, std::forward<InTuple>(in), out,
+                       std::make_index_sequence<in_size>(),
+                       std::make_index_sequence<out_size>());
 }
 
 }  // namespace base
diff --git a/src/include/base/cef_weak_ptr.h b/src/include/base/cef_weak_ptr.h
index 1ba34b9..2946689 100644
--- a/src/include/base/cef_weak_ptr.h
+++ b/src/include/base/cef_weak_ptr.h
@@ -28,80 +28,79 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-// Weak pointers are pointers to an object that do not affect its lifetime,
-// and which may be invalidated (i.e. reset to NULL) by the object, or its
-// owner, at any time, most commonly when the object is about to be deleted.
-
-// Weak pointers are useful when an object needs to be accessed safely by one
-// or more objects other than its owner, and those callers can cope with the
-// object vanishing and e.g. tasks posted to it being silently dropped.
-// Reference-counting such an object would complicate the ownership graph and
-// make it harder to reason about the object's lifetime.
-
-// EXAMPLE:
-//
-//  class Controller {
-//   public:
-//    Controller() : weak_factory_(this) {}
-//    void SpawnWorker() { Worker::StartNew(weak_factory_.GetWeakPtr()); }
-//    void WorkComplete(const Result& result) { ... }
-//   private:
-//    // Member variables should appear before the WeakPtrFactory, to ensure
-//    // that any WeakPtrs to Controller are invalidated before its members
-//    // variable's destructors are executed, rendering them invalid.
-//    WeakPtrFactory<Controller> weak_factory_;
-//  };
-//
-//  class Worker {
-//   public:
-//    static void StartNew(const WeakPtr<Controller>& controller) {
-//      Worker* worker = new Worker(controller);
-//      // Kick off asynchronous processing...
-//    }
-//   private:
-//    Worker(const WeakPtr<Controller>& controller)
-//        : controller_(controller) {}
-//    void DidCompleteAsynchronousProcessing(const Result& result) {
-//      if (controller_)
-//        controller_->WorkComplete(result);
-//    }
-//    WeakPtr<Controller> controller_;
-//  };
-//
-// With this implementation a caller may use SpawnWorker() to dispatch multiple
-// Workers and subsequently delete the Controller, without waiting for all
-// Workers to have completed.
-
-// ------------------------- IMPORTANT: Thread-safety -------------------------
-
-// Weak pointers may be passed safely between threads, but must always be
-// dereferenced and invalidated on the same thread otherwise checking the
-// pointer would be racey.
-//
-// To ensure correct use, the first time a WeakPtr issued by a WeakPtrFactory
-// is dereferenced, the factory and its WeakPtrs become bound to the calling
-// thread, and cannot be dereferenced or invalidated on any other thread. Bound
-// WeakPtrs can still be handed off to other threads, e.g. to use to post tasks
-// back to object on the bound thread.
-//
-// If all WeakPtr objects are destroyed or invalidated then the factory is
-// unbound from the SequencedTaskRunner/Thread. The WeakPtrFactory may then be
-// destroyed, or new WeakPtr objects may be used, from a different sequence.
-//
-// Thus, at least one WeakPtr object must exist and have been dereferenced on
-// the correct thread to enforce that other WeakPtr objects will enforce they
-// are used on the desired thread.
+///
+/// \file
+/// Weak pointers are pointers to an object that do not affect its lifetime.
+/// They may be invalidated (i.e. reset to nullptr) by the object, or its
+/// owner, at any time, most commonly when the object is about to be deleted.
+///
+/// Weak pointers are useful when an object needs to be accessed safely by one
+/// or more objects other than its owner, and those callers can cope with the
+/// object vanishing and e.g. tasks posted to it being silently dropped.
+/// Reference-counting such an object would complicate the ownership graph and
+/// make it harder to reason about the object's lifetime.
+///
+/// EXAMPLE:
+///
+/// <pre>
+///  class Controller {
+///   public:
+///    void SpawnWorker() { Worker::StartNew(weak_factory_.GetWeakPtr()); }
+///    void WorkComplete(const Result& result) { ... }
+///   private:
+///    // Member variables should appear before the WeakPtrFactory, to ensure
+///    // that any WeakPtrs to Controller are invalidated before its members
+///    // variable's destructors are executed, rendering them invalid.
+///    WeakPtrFactory<Controller> weak_factory_{this};
+///  };
+///
+///  class Worker {
+///   public:
+///    static void StartNew(WeakPtr<Controller> controller) {
+///      Worker* worker = new Worker(std::move(controller));
+///      // Kick off asynchronous processing...
+///    }
+///   private:
+///    Worker(WeakPtr<Controller> controller)
+///        : controller_(std::move(controller)) {}
+///    void DidCompleteAsynchronousProcessing(const Result& result) {
+///      if (controller_)
+///        controller_->WorkComplete(result);
+///    }
+///    WeakPtr<Controller> controller_;
+///  };
+/// </pre>
+///
+/// With this implementation a caller may use SpawnWorker() to dispatch multiple
+/// Workers and subsequently delete the Controller, without waiting for all
+/// Workers to have completed.
+///
+/// <b>IMPORTANT: Thread-safety</b>
+///
+/// Weak pointers may be passed safely between threads, but must always be
+/// dereferenced and invalidated on the same ThreaddTaskRunner otherwise
+/// checking the pointer would be racey.
+///
+/// To ensure correct use, the first time a WeakPtr issued by a WeakPtrFactory
+/// is dereferenced, the factory and its WeakPtrs become bound to the calling
+/// thread or current ThreaddWorkerPool token, and cannot be dereferenced or
+/// invalidated on any other task runner. Bound WeakPtrs can still be handed
+/// off to other task runners, e.g. to use to post tasks back to object on the
+/// bound thread.
+///
+/// If all WeakPtr objects are destroyed or invalidated then the factory is
+/// unbound from the ThreadedTaskRunner/Thread. The WeakPtrFactory may then be
+/// destroyed, or new WeakPtr objects may be used, from a different thread.
+///
+/// Thus, at least one WeakPtr object must exist and have been dereferenced on
+/// the correct thread to enforce that other WeakPtr objects will enforce they
+/// are used on the desired thread.
 
 #ifndef CEF_INCLUDE_BASE_CEF_WEAK_PTR_H_
 #define CEF_INCLUDE_BASE_CEF_WEAK_PTR_H_
 #pragma once
 
-#if defined(BASE_MEMORY_WEAK_PTR_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)
+#if defined(USING_CHROMIUM_INCLUDES)
 // When building CEF include the Chromium header directly.
 #include "base/memory/weak_ptr.h"
 #else  // !USING_CHROMIUM_INCLUDES
@@ -109,10 +108,12 @@
 // If the Chromium implementation diverges the below implementation should be
 // updated to match.
 
-#include "include/base/cef_basictypes.h"
+#include <cstddef>
+#include <type_traits>
+
+#include "include/base/cef_atomic_flag.h"
 #include "include/base/cef_logging.h"
 #include "include/base/cef_ref_counted.h"
-#include "include/base/cef_template_util.h"
 #include "include/base/cef_thread_checker.h"
 
 namespace base {
@@ -128,8 +129,8 @@
 
 class WeakReference {
  public:
-  // Although Flag is bound to a specific thread, it may be deleted from another
-  // via base::WeakPtr::~WeakPtr().
+  // Although Flag is bound to a specific ThreaddTaskRunner, it may be
+  // deleted from another via base::WeakPtr::~WeakPtr().
   class Flag : public RefCountedThreadSafe<Flag> {
    public:
     Flag();
@@ -137,23 +138,30 @@
     void Invalidate();
     bool IsValid() const;
 
+    bool MaybeValid() const;
+
+    void DetachFromThread();
+
    private:
     friend class base::RefCountedThreadSafe<Flag>;
 
     ~Flag();
 
-    // The current Chromium implementation uses SequenceChecker instead of
-    // ThreadChecker to support SequencedWorkerPools. CEF does not yet expose
-    // the concept of SequencedWorkerPools.
-    ThreadChecker thread_checker_;
-    bool is_valid_;
+    base::ThreadChecker thread_checker_;
+    AtomicFlag invalidated_;
   };
 
   WeakReference();
-  explicit WeakReference(const Flag* flag);
+  explicit WeakReference(const scoped_refptr<Flag>& flag);
   ~WeakReference();
 
-  bool is_valid() const;
+  WeakReference(WeakReference&& other) noexcept;
+  WeakReference(const WeakReference& other);
+  WeakReference& operator=(WeakReference&& other) noexcept = default;
+  WeakReference& operator=(const WeakReference& other) = default;
+
+  bool IsValid() const;
+  bool MaybeValid() const;
 
  private:
   scoped_refptr<const Flag> flag_;
@@ -166,12 +174,12 @@
 
   WeakReference GetRef() const;
 
-  bool HasRefs() const { return flag_.get() && !flag_->HasOneRef(); }
+  bool HasRefs() const { return !flag_->HasOneRef(); }
 
   void Invalidate();
 
  private:
-  mutable scoped_refptr<WeakReference::Flag> flag_;
+  scoped_refptr<WeakReference::Flag> flag_;
 };
 
 // This class simplifies the implementation of WeakPtr's type conversion
@@ -183,10 +191,24 @@
   WeakPtrBase();
   ~WeakPtrBase();
 
+  WeakPtrBase(const WeakPtrBase& other) = default;
+  WeakPtrBase(WeakPtrBase&& other) noexcept = default;
+  WeakPtrBase& operator=(const WeakPtrBase& other) = default;
+  WeakPtrBase& operator=(WeakPtrBase&& other) noexcept = default;
+
+  void reset() {
+    ref_ = cef_internal::WeakReference();
+    ptr_ = 0;
+  }
+
  protected:
-  explicit WeakPtrBase(const WeakReference& ref);
+  WeakPtrBase(const WeakReference& ref, uintptr_t ptr);
 
   WeakReference ref_;
+
+  // This pointer is only valid when ref_.is_valid() is true.  Otherwise, its
+  // value is undefined (as opposed to nullptr).
+  uintptr_t ptr_;
 };
 
 // This class provides a common implementation of common functions that would
@@ -198,13 +220,14 @@
   // conversion will only compile if there is exists a Base which inherits
   // from SupportsWeakPtr<Base>. See base::AsWeakPtr() below for a helper
   // function that makes calling this easier.
+  //
+  // Precondition: t != nullptr
   template <typename Derived>
   static WeakPtr<Derived> StaticAsWeakPtr(Derived* t) {
-    typedef is_convertible<Derived, cef_internal::SupportsWeakPtrBase&>
-        convertible;
-    COMPILE_ASSERT(convertible::value,
-                   AsWeakPtr_argument_inherits_from_SupportsWeakPtr);
-    return AsWeakPtrImpl<Derived>(t, *t);
+    static_assert(
+        std::is_base_of<cef_internal::SupportsWeakPtrBase, Derived>::value,
+        "AsWeakPtr argument must inherit from SupportsWeakPtr");
+    return AsWeakPtrImpl<Derived>(t);
   }
 
  private:
@@ -212,10 +235,10 @@
   // which is an instance of SupportsWeakPtr<Base>. We can then safely
   // static_cast the Base* to a Derived*.
   template <typename Derived, typename Base>
-  static WeakPtr<Derived> AsWeakPtrImpl(Derived* t,
-                                        const SupportsWeakPtr<Base>&) {
-    WeakPtr<Base> ptr = t->Base::AsWeakPtr();
-    return WeakPtr<Derived>(ptr.ref_, static_cast<Derived*>(ptr.ptr_));
+  static WeakPtr<Derived> AsWeakPtrImpl(SupportsWeakPtr<Base>* t) {
+    WeakPtr<Base> ptr = t->AsWeakPtr();
+    return WeakPtr<Derived>(
+        ptr.ref_, static_cast<Derived*>(reinterpret_cast<Base*>(ptr.ptr_)));
   }
 };
 
@@ -224,66 +247,84 @@
 template <typename T>
 class WeakPtrFactory;
 
-// The WeakPtr class holds a weak reference to |T*|.
-//
-// This class is designed to be used like a normal pointer.  You should always
-// null-test an object of this class before using it or invoking a method that
-// may result in the underlying object being destroyed.
-//
-// EXAMPLE:
-//
-//   class Foo { ... };
-//   WeakPtr<Foo> foo;
-//   if (foo)
-//     foo->method();
-//
+///
+/// The WeakPtr class holds a weak reference to |T*|.
+///
+/// This class is designed to be used like a normal pointer.  You should always
+/// null-test an object of this class before using it or invoking a method that
+/// may result in the underlying object being destroyed.
+///
+/// EXAMPLE:
+///
+/// <pre>
+///   class Foo { ... };
+///   WeakPtr<Foo> foo;
+///   if (foo)
+///     foo->method();
+/// </pre>
+///
 template <typename T>
 class WeakPtr : public cef_internal::WeakPtrBase {
  public:
-  WeakPtr() : ptr_(NULL) {}
+  WeakPtr() = default;
+  WeakPtr(std::nullptr_t) {}
 
-  // Allow conversion from U to T provided U "is a" T. Note that this
-  // is separate from the (implicit) copy constructor.
+  ///
+  /// Allow conversion from U to T provided U "is a" T. Note that this
+  /// is separate from the (implicit) copy and move constructors.
+  ///
   template <typename U>
-  WeakPtr(const WeakPtr<U>& other) : WeakPtrBase(other), ptr_(other.ptr_) {}
+  WeakPtr(const WeakPtr<U>& other) : WeakPtrBase(other) {
+    // Need to cast from U* to T* to do pointer adjustment in case of multiple
+    // inheritance. This also enforces the "U is a T" rule.
+    T* t = reinterpret_cast<U*>(other.ptr_);
+    ptr_ = reinterpret_cast<uintptr_t>(t);
+  }
+  template <typename U>
+  WeakPtr(WeakPtr<U>&& other) noexcept : WeakPtrBase(std::move(other)) {
+    // Need to cast from U* to T* to do pointer adjustment in case of multiple
+    // inheritance. This also enforces the "U is a T" rule.
+    T* t = reinterpret_cast<U*>(other.ptr_);
+    ptr_ = reinterpret_cast<uintptr_t>(t);
+  }
 
-  T* get() const { return ref_.is_valid() ? ptr_ : NULL; }
+  T* get() const {
+    return ref_.IsValid() ? reinterpret_cast<T*>(ptr_) : nullptr;
+  }
 
   T& operator*() const {
-    DCHECK(get() != NULL);
+    CHECK(ref_.IsValid());
     return *get();
   }
   T* operator->() const {
-    DCHECK(get() != NULL);
+    CHECK(ref_.IsValid());
     return get();
   }
 
-  // Allow WeakPtr<element_type> to be used in boolean expressions, but not
-  // implicitly convertible to a real bool (which is dangerous).
-  //
-  // Note that this trick is only safe when the == and != operators
-  // are declared explicitly, as otherwise "weak_ptr1 == weak_ptr2"
-  // will compile but do the wrong thing (i.e., convert to Testable
-  // and then do the comparison).
- private:
-  typedef T* WeakPtr::*Testable;
+  ///
+  /// Allow conditionals to test validity, e.g. `if (weak_ptr) {...}`;
+  ///
+  explicit operator bool() const { return get() != nullptr; }
 
- public:
-  operator Testable() const { return get() ? &WeakPtr::ptr_ : NULL; }
+  ///
+  /// Returns false if the WeakPtr is confirmed to be invalid. This call is safe
+  /// to make from any thread, e.g. to optimize away unnecessary work, but
+  /// operator bool() must always be called, on the correct thread, before
+  /// actually using the pointer.
+  ///
+  /// Warning: as with any object, this call is only thread-safe if the WeakPtr
+  /// instance isn't being re-assigned or reset() racily with this call.
+  ///
+  bool MaybeValid() const { return ref_.MaybeValid(); }
 
-  void reset() {
-    ref_ = cef_internal::WeakReference();
-    ptr_ = NULL;
-  }
+  ///
+  /// Returns whether the object |this| points to has been invalidated. This can
+  /// be used to distinguish a WeakPtr to a destroyed object from one that has
+  /// been explicitly set to null.
+  ///
+  bool WasInvalidated() const { return ptr_ && !ref_.IsValid(); }
 
  private:
-  // Explicitly declare comparison operators as required by the bool
-  // trick, but keep them private.
-  template <class U>
-  bool operator==(WeakPtr<U> const&) const;
-  template <class U>
-  bool operator!=(WeakPtr<U> const&) const;
-
   friend class cef_internal::SupportsWeakPtrBase;
   template <typename U>
   friend class WeakPtr;
@@ -291,88 +332,131 @@
   friend class WeakPtrFactory<T>;
 
   WeakPtr(const cef_internal::WeakReference& ref, T* ptr)
-      : WeakPtrBase(ref), ptr_(ptr) {}
-
-  // This pointer is only valid when ref_.is_valid() is true.  Otherwise, its
-  // value is undefined (as opposed to NULL).
-  T* ptr_;
+      : WeakPtrBase(ref, reinterpret_cast<uintptr_t>(ptr)) {}
 };
 
-// A class may be composed of a WeakPtrFactory and thereby
-// control how it exposes weak pointers to itself.  This is helpful if you only
-// need weak pointers within the implementation of a class.  This class is also
-// useful when working with primitive types.  For example, you could have a
-// WeakPtrFactory<bool> that is used to pass around a weak reference to a bool.
+///
+/// Allow callers to compare WeakPtrs against nullptr to test validity.
+///
 template <class T>
-class WeakPtrFactory {
+bool operator!=(const WeakPtr<T>& weak_ptr, std::nullptr_t) {
+  return !(weak_ptr == nullptr);
+}
+template <class T>
+bool operator!=(std::nullptr_t, const WeakPtr<T>& weak_ptr) {
+  return weak_ptr != nullptr;
+}
+template <class T>
+bool operator==(const WeakPtr<T>& weak_ptr, std::nullptr_t) {
+  return weak_ptr.get() == nullptr;
+}
+template <class T>
+bool operator==(std::nullptr_t, const WeakPtr<T>& weak_ptr) {
+  return weak_ptr == nullptr;
+}
+
+namespace cef_internal {
+class WeakPtrFactoryBase {
+ protected:
+  WeakPtrFactoryBase(uintptr_t ptr);
+  ~WeakPtrFactoryBase();
+  cef_internal::WeakReferenceOwner weak_reference_owner_;
+  uintptr_t ptr_;
+};
+}  // namespace cef_internal
+
+///
+/// A class may be composed of a WeakPtrFactory and thereby control how it
+/// exposes weak pointers to itself.  This is helpful if you only need weak
+/// pointers within the implementation of a class.  This class is also useful
+/// when working with primitive types.  For example, you could have a
+/// WeakPtrFactory<bool> that is used to pass around a weak reference to a
+/// bool.
+///
+template <class T>
+class WeakPtrFactory : public cef_internal::WeakPtrFactoryBase {
  public:
-  explicit WeakPtrFactory(T* ptr) : ptr_(ptr) {}
+  WeakPtrFactory() = delete;
 
-  ~WeakPtrFactory() { ptr_ = NULL; }
+  explicit WeakPtrFactory(T* ptr)
+      : WeakPtrFactoryBase(reinterpret_cast<uintptr_t>(ptr)) {}
 
-  WeakPtr<T> GetWeakPtr() {
-    DCHECK(ptr_);
-    return WeakPtr<T>(weak_reference_owner_.GetRef(), ptr_);
+  WeakPtrFactory(const WeakPtrFactory&) = delete;
+  WeakPtrFactory& operator=(const WeakPtrFactory&) = delete;
+
+  ~WeakPtrFactory() = default;
+
+  WeakPtr<T> GetWeakPtr() const {
+    return WeakPtr<T>(weak_reference_owner_.GetRef(),
+                      reinterpret_cast<T*>(ptr_));
   }
 
-  // Call this method to invalidate all existing weak pointers.
+  ///
+  /// Call this method to invalidate all existing weak pointers.
+  ///
   void InvalidateWeakPtrs() {
     DCHECK(ptr_);
     weak_reference_owner_.Invalidate();
   }
 
-  // Call this method to determine if any weak pointers exist.
+  ///
+  /// Call this method to determine if any weak pointers exist.
+  ///
   bool HasWeakPtrs() const {
     DCHECK(ptr_);
     return weak_reference_owner_.HasRefs();
   }
-
- private:
-  cef_internal::WeakReferenceOwner weak_reference_owner_;
-  T* ptr_;
-  DISALLOW_IMPLICIT_CONSTRUCTORS(WeakPtrFactory);
 };
 
-// A class may extend from SupportsWeakPtr to let others take weak pointers to
-// it. This avoids the class itself implementing boilerplate to dispense weak
-// pointers.  However, since SupportsWeakPtr's destructor won't invalidate
-// weak pointers to the class until after the derived class' members have been
-// destroyed, its use can lead to subtle use-after-destroy issues.
+///
+/// A class may extend from SupportsWeakPtr to let others take weak pointers to
+/// it. This avoids the class itself implementing boilerplate to dispense weak
+/// pointers.  However, since SupportsWeakPtr's destructor won't invalidate
+/// weak pointers to the class until after the derived class' members have been
+/// destroyed, its use can lead to subtle use-after-destroy issues.
+///
 template <class T>
 class SupportsWeakPtr : public cef_internal::SupportsWeakPtrBase {
  public:
-  SupportsWeakPtr() {}
+  SupportsWeakPtr() = default;
+
+  SupportsWeakPtr(const SupportsWeakPtr&) = delete;
+  SupportsWeakPtr& operator=(const SupportsWeakPtr&) = delete;
 
   WeakPtr<T> AsWeakPtr() {
     return WeakPtr<T>(weak_reference_owner_.GetRef(), static_cast<T*>(this));
   }
 
  protected:
-  ~SupportsWeakPtr() {}
+  ~SupportsWeakPtr() = default;
 
  private:
   cef_internal::WeakReferenceOwner weak_reference_owner_;
-  DISALLOW_COPY_AND_ASSIGN(SupportsWeakPtr);
 };
 
-// Helper function that uses type deduction to safely return a WeakPtr<Derived>
-// when Derived doesn't directly extend SupportsWeakPtr<Derived>, instead it
-// extends a Base that extends SupportsWeakPtr<Base>.
-//
-// EXAMPLE:
-//   class Base : public base::SupportsWeakPtr<Producer> {};
-//   class Derived : public Base {};
-//
-//   Derived derived;
-//   base::WeakPtr<Derived> ptr = base::AsWeakPtr(&derived);
-//
-// Note that the following doesn't work (invalid type conversion) since
-// Derived::AsWeakPtr() is WeakPtr<Base> SupportsWeakPtr<Base>::AsWeakPtr(),
-// and there's no way to safely cast WeakPtr<Base> to WeakPtr<Derived> at
-// the caller.
-//
-//   base::WeakPtr<Derived> ptr = derived.AsWeakPtr();  // Fails.
-
+///
+/// Helper function that uses type deduction to safely return a WeakPtr<Derived>
+/// when Derived doesn't directly extend SupportsWeakPtr<Derived>, instead it
+/// extends a Base that extends SupportsWeakPtr<Base>.
+///
+/// EXAMPLE:
+/// <pre>
+///   class Base : public base::SupportsWeakPtr<Producer> {};
+///   class Derived : public Base {};
+///
+///   Derived derived;
+///   base::WeakPtr<Derived> ptr = base::AsWeakPtr(&derived);
+/// </pre>
+///
+/// Note that the following doesn't work (invalid type conversion) since
+/// Derived::AsWeakPtr() is WeakPtr<Base> SupportsWeakPtr<Base>::AsWeakPtr(),
+/// and there's no way to safely cast WeakPtr<Base> to WeakPtr<Derived> at
+/// the caller.
+///
+/// <pre>
+///   base::WeakPtr<Derived> ptr = derived.AsWeakPtr();  // Fails.
+/// </pre>
+///
 template <typename Derived>
 WeakPtr<Derived> AsWeakPtr(Derived* t) {
   return cef_internal::SupportsWeakPtrBase::StaticAsWeakPtr<Derived>(t);
diff --git a/src/include/base/internal/cef_atomicops_arm64_gcc.h b/src/include/base/internal/cef_atomicops_arm64_gcc.h
deleted file mode 100644
index 787b3ca..0000000
--- a/src/include/base/internal/cef_atomicops_arm64_gcc.h
+++ /dev/null
@@ -1,335 +0,0 @@
-// 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.
-//
-// Do not include this header file directly. Use base/cef_atomicops.h
-// instead.
-
-#ifndef CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_ARM64_GCC_H_
-#define CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_ARM64_GCC_H_
-
-namespace base {
-namespace subtle {
-
-inline void MemoryBarrier() {
-  __asm__ __volatile__ ("dmb ish" ::: "memory");  // NOLINT
-}
-
-// NoBarrier versions of the operation include "memory" in the clobber list.
-// This is not required for direct usage of the NoBarrier versions of the
-// operations. However this is required for correctness when they are used as
-// part of the Acquire or Release versions, to ensure that nothing from outside
-// the call is reordered between the operation and the memory barrier. This does
-// not change the code generated, so has no or minimal impact on the
-// NoBarrier operations.
-
-inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
-                                         Atomic32 old_value,
-                                         Atomic32 new_value) {
-  Atomic32 prev;
-  int32_t temp;
-
-  __asm__ __volatile__ (  // NOLINT
-    "0:                                    \n\t"
-    "ldxr %w[prev], %[ptr]                 \n\t"  // Load the previous value.
-    "cmp %w[prev], %w[old_value]           \n\t"
-    "bne 1f                                \n\t"
-    "stxr %w[temp], %w[new_value], %[ptr]  \n\t"  // Try to store the new value.
-    "cbnz %w[temp], 0b                     \n\t"  // Retry if it did not work.
-    "1:                                    \n\t"
-    : [prev]"=&r" (prev),
-      [temp]"=&r" (temp),
-      [ptr]"+Q" (*ptr)
-    : [old_value]"IJr" (old_value),
-      [new_value]"r" (new_value)
-    : "cc", "memory"
-  );  // NOLINT
-
-  return prev;
-}
-
-inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr,
-                                         Atomic32 new_value) {
-  Atomic32 result;
-  int32_t temp;
-
-  __asm__ __volatile__ (  // NOLINT
-    "0:                                    \n\t"
-    "ldxr %w[result], %[ptr]               \n\t"  // Load the previous value.
-    "stxr %w[temp], %w[new_value], %[ptr]  \n\t"  // Try to store the new value.
-    "cbnz %w[temp], 0b                     \n\t"  // Retry if it did not work.
-    : [result]"=&r" (result),
-      [temp]"=&r" (temp),
-      [ptr]"+Q" (*ptr)
-    : [new_value]"r" (new_value)
-    : "memory"
-  );  // NOLINT
-
-  return result;
-}
-
-inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr,
-                                          Atomic32 increment) {
-  Atomic32 result;
-  int32_t temp;
-
-  __asm__ __volatile__ (  // NOLINT
-    "0:                                       \n\t"
-    "ldxr %w[result], %[ptr]                  \n\t"  // Load the previous value.
-    "add %w[result], %w[result], %w[increment]\n\t"
-    "stxr %w[temp], %w[result], %[ptr]        \n\t"  // Try to store the result.
-    "cbnz %w[temp], 0b                        \n\t"  // Retry on failure.
-    : [result]"=&r" (result),
-      [temp]"=&r" (temp),
-      [ptr]"+Q" (*ptr)
-    : [increment]"IJr" (increment)
-    : "memory"
-  );  // NOLINT
-
-  return result;
-}
-
-inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr,
-                                        Atomic32 increment) {
-  Atomic32 result;
-
-  MemoryBarrier();
-  result = NoBarrier_AtomicIncrement(ptr, increment);
-  MemoryBarrier();
-
-  return result;
-}
-
-inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
-                                       Atomic32 old_value,
-                                       Atomic32 new_value) {
-  Atomic32 prev;
-
-  prev = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-  MemoryBarrier();
-
-  return prev;
-}
-
-inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
-                                       Atomic32 old_value,
-                                       Atomic32 new_value) {
-  Atomic32 prev;
-
-  MemoryBarrier();
-  prev = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-
-  return prev;
-}
-
-inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) {
-  *ptr = value;
-}
-
-inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
-  *ptr = value;
-  MemoryBarrier();
-}
-
-inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) {
-  __asm__ __volatile__ (  // NOLINT
-    "stlr %w[value], %[ptr]  \n\t"
-    : [ptr]"=Q" (*ptr)
-    : [value]"r" (value)
-    : "memory"
-  );  // NOLINT
-}
-
-inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) {
-  return *ptr;
-}
-
-inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) {
-  Atomic32 value;
-
-  __asm__ __volatile__ (  // NOLINT
-    "ldar %w[value], %[ptr]  \n\t"
-    : [value]"=r" (value)
-    : [ptr]"Q" (*ptr)
-    : "memory"
-  );  // NOLINT
-
-  return value;
-}
-
-inline Atomic32 Release_Load(volatile const Atomic32* ptr) {
-  MemoryBarrier();
-  return *ptr;
-}
-
-// 64-bit versions of the operations.
-// See the 32-bit versions for comments.
-
-inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr,
-                                         Atomic64 old_value,
-                                         Atomic64 new_value) {
-  Atomic64 prev;
-  int32_t temp;
-
-  __asm__ __volatile__ (  // NOLINT
-    "0:                                    \n\t"
-    "ldxr %[prev], %[ptr]                  \n\t"
-    "cmp %[prev], %[old_value]             \n\t"
-    "bne 1f                                \n\t"
-    "stxr %w[temp], %[new_value], %[ptr]   \n\t"
-    "cbnz %w[temp], 0b                     \n\t"
-    "1:                                    \n\t"
-    : [prev]"=&r" (prev),
-      [temp]"=&r" (temp),
-      [ptr]"+Q" (*ptr)
-    : [old_value]"IJr" (old_value),
-      [new_value]"r" (new_value)
-    : "cc", "memory"
-  );  // NOLINT
-
-  return prev;
-}
-
-inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr,
-                                         Atomic64 new_value) {
-  Atomic64 result;
-  int32_t temp;
-
-  __asm__ __volatile__ (  // NOLINT
-    "0:                                    \n\t"
-    "ldxr %[result], %[ptr]                \n\t"
-    "stxr %w[temp], %[new_value], %[ptr]   \n\t"
-    "cbnz %w[temp], 0b                     \n\t"
-    : [result]"=&r" (result),
-      [temp]"=&r" (temp),
-      [ptr]"+Q" (*ptr)
-    : [new_value]"r" (new_value)
-    : "memory"
-  );  // NOLINT
-
-  return result;
-}
-
-inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr,
-                                          Atomic64 increment) {
-  Atomic64 result;
-  int32_t temp;
-
-  __asm__ __volatile__ (  // NOLINT
-    "0:                                     \n\t"
-    "ldxr %[result], %[ptr]                 \n\t"
-    "add %[result], %[result], %[increment] \n\t"
-    "stxr %w[temp], %[result], %[ptr]       \n\t"
-    "cbnz %w[temp], 0b                      \n\t"
-    : [result]"=&r" (result),
-      [temp]"=&r" (temp),
-      [ptr]"+Q" (*ptr)
-    : [increment]"IJr" (increment)
-    : "memory"
-  );  // NOLINT
-
-  return result;
-}
-
-inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr,
-                                        Atomic64 increment) {
-  Atomic64 result;
-
-  MemoryBarrier();
-  result = NoBarrier_AtomicIncrement(ptr, increment);
-  MemoryBarrier();
-
-  return result;
-}
-
-inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr,
-                                       Atomic64 old_value,
-                                       Atomic64 new_value) {
-  Atomic64 prev;
-
-  prev = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-  MemoryBarrier();
-
-  return prev;
-}
-
-inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr,
-                                       Atomic64 old_value,
-                                       Atomic64 new_value) {
-  Atomic64 prev;
-
-  MemoryBarrier();
-  prev = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-
-  return prev;
-}
-
-inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) {
-  *ptr = value;
-}
-
-inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) {
-  *ptr = value;
-  MemoryBarrier();
-}
-
-inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) {
-  __asm__ __volatile__ (  // NOLINT
-    "stlr %x[value], %[ptr]  \n\t"
-    : [ptr]"=Q" (*ptr)
-    : [value]"r" (value)
-    : "memory"
-  );  // NOLINT
-}
-
-inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) {
-  return *ptr;
-}
-
-inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) {
-  Atomic64 value;
-
-  __asm__ __volatile__ (  // NOLINT
-    "ldar %x[value], %[ptr]  \n\t"
-    : [value]"=r" (value)
-    : [ptr]"Q" (*ptr)
-    : "memory"
-  );  // NOLINT
-
-  return value;
-}
-
-inline Atomic64 Release_Load(volatile const Atomic64* ptr) {
-  MemoryBarrier();
-  return *ptr;
-}
-
-} }  // namespace base::subtle
-
-#endif  // CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_ARM64_GCC_H_
-
diff --git a/src/include/base/internal/cef_atomicops_arm64_msvc.h b/src/include/base/internal/cef_atomicops_arm64_msvc.h
deleted file mode 100644
index 86d950f..0000000
--- a/src/include/base/internal/cef_atomicops_arm64_msvc.h
+++ /dev/null
@@ -1,197 +0,0 @@
-// Copyright (c) 2008 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.
-
-// Do not include this header file directly. Use base/cef_atomicops.h
-// instead.
-
-#ifndef CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_ARM64_MSVC_H_
-#define CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_ARM64_MSVC_H_
-
-#include <windows.h>
-
-#include <intrin.h>
-
-#include "include/base/cef_macros.h"
-
-namespace base {
-namespace subtle {
-
-inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
-                                         Atomic32 old_value,
-                                         Atomic32 new_value) {
-  LONG result = _InterlockedCompareExchange(
-      reinterpret_cast<volatile LONG*>(ptr), static_cast<LONG>(new_value),
-      static_cast<LONG>(old_value));
-  return static_cast<Atomic32>(result);
-}
-
-inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr,
-                                         Atomic32 new_value) {
-  LONG result = _InterlockedExchange(reinterpret_cast<volatile LONG*>(ptr),
-                                     static_cast<LONG>(new_value));
-  return static_cast<Atomic32>(result);
-}
-
-inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr,
-                                        Atomic32 increment) {
-  return _InterlockedExchangeAdd(reinterpret_cast<volatile LONG*>(ptr),
-                                 static_cast<LONG>(increment)) +
-         increment;
-}
-
-inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr,
-                                          Atomic32 increment) {
-  return Barrier_AtomicIncrement(ptr, increment);
-}
-
-#if !(defined(_MSC_VER) && _MSC_VER >= 1400)
-#error "We require at least vs2005 for MemoryBarrier"
-#endif
-
-inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
-                                       Atomic32 old_value,
-                                       Atomic32 new_value) {
-  return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-}
-
-inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
-                                       Atomic32 old_value,
-                                       Atomic32 new_value) {
-  return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-}
-
-inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) {
-  *ptr = value;
-}
-
-inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
-  NoBarrier_AtomicExchange(ptr, value);
-  // acts as a barrier in this implementation
-}
-
-inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) {
-  *ptr = value;
-  // See comments in Atomic64 version of Release_Store() below.
-}
-
-inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) {
-  return *ptr;
-}
-
-inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) {
-  Atomic32 value = *ptr;
-  return value;
-}
-
-inline Atomic32 Release_Load(volatile const Atomic32* ptr) {
-  MemoryBarrier();
-  return *ptr;
-}
-
-#if defined(_WIN64)
-
-// 64-bit low-level operations on 64-bit platform.
-
-COMPILE_ASSERT(sizeof(Atomic64) == sizeof(PVOID), atomic_word_is_atomic);
-
-inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr,
-                                         Atomic64 old_value,
-                                         Atomic64 new_value) {
-  PVOID result = InterlockedCompareExchangePointer(
-      reinterpret_cast<volatile PVOID*>(ptr),
-      reinterpret_cast<PVOID>(new_value), reinterpret_cast<PVOID>(old_value));
-  return reinterpret_cast<Atomic64>(result);
-}
-
-inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr,
-                                         Atomic64 new_value) {
-  PVOID result =
-      InterlockedExchangePointer(reinterpret_cast<volatile PVOID*>(ptr),
-                                 reinterpret_cast<PVOID>(new_value));
-  return reinterpret_cast<Atomic64>(result);
-}
-
-inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr,
-                                        Atomic64 increment) {
-  return InterlockedExchangeAdd64(reinterpret_cast<volatile LONGLONG*>(ptr),
-                                  static_cast<LONGLONG>(increment)) +
-         increment;
-}
-
-inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr,
-                                          Atomic64 increment) {
-  return Barrier_AtomicIncrement(ptr, increment);
-}
-
-inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) {
-  *ptr = value;
-}
-
-inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) {
-  NoBarrier_AtomicExchange(ptr, value);
-  // acts as a barrier in this implementation
-}
-
-inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) {
-  *ptr = value;
-}
-
-inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) {
-  return *ptr;
-}
-
-inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) {
-  Atomic64 value = *ptr;
-  return value;
-}
-
-inline Atomic64 Release_Load(volatile const Atomic64* ptr) {
-  MemoryBarrier();
-  return *ptr;
-}
-
-inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr,
-                                       Atomic64 old_value,
-                                       Atomic64 new_value) {
-  return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-}
-
-inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr,
-                                       Atomic64 old_value,
-                                       Atomic64 new_value) {
-  return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-}
-
-#endif  // defined(_WIN64)
-
-}  // namespace base::subtle
-}  // namespace base
-
-#endif  // CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_ARM64_MSVC_H_
-
diff --git a/src/include/base/internal/cef_atomicops_arm_gcc.h b/src/include/base/internal/cef_atomicops_arm_gcc.h
deleted file mode 100644
index 2e39ce3..0000000
--- a/src/include/base/internal/cef_atomicops_arm_gcc.h
+++ /dev/null
@@ -1,325 +0,0 @@
-// Copyright (c) 2013 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.
-//
-// Do not include this header file directly. Use base/cef_atomicops.h
-// instead.
-//
-// LinuxKernelCmpxchg and Barrier_AtomicIncrement are from Google Gears.
-
-#ifndef CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_ARM_GCC_H_
-#define CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_ARM_GCC_H_
-
-#if defined(OS_QNX)
-#include <sys/cpuinline.h>
-#endif
-
-namespace base {
-namespace subtle {
-
-// Memory barriers on ARM are funky, but the kernel is here to help:
-//
-// * ARMv5 didn't support SMP, there is no memory barrier instruction at
-//   all on this architecture, or when targeting its machine code.
-//
-// * Some ARMv6 CPUs support SMP. A full memory barrier can be produced by
-//   writing a random value to a very specific coprocessor register.
-//
-// * On ARMv7, the "dmb" instruction is used to perform a full memory
-//   barrier (though writing to the co-processor will still work).
-//   However, on single core devices (e.g. Nexus One, or Nexus S),
-//   this instruction will take up to 200 ns, which is huge, even though
-//   it's completely un-needed on these devices.
-//
-// * There is no easy way to determine at runtime if the device is
-//   single or multi-core. However, the kernel provides a useful helper
-//   function at a fixed memory address (0xffff0fa0), which will always
-//   perform a memory barrier in the most efficient way. I.e. on single
-//   core devices, this is an empty function that exits immediately.
-//   On multi-core devices, it implements a full memory barrier.
-//
-// * This source could be compiled to ARMv5 machine code that runs on a
-//   multi-core ARMv6 or ARMv7 device. In this case, memory barriers
-//   are needed for correct execution. Always call the kernel helper, even
-//   when targeting ARMv5TE.
-//
-
-inline void MemoryBarrier() {
-#if defined(OS_LINUX) || defined(OS_ANDROID)
-  // Note: This is a function call, which is also an implicit compiler barrier.
-  typedef void (*KernelMemoryBarrierFunc)();
-  ((KernelMemoryBarrierFunc)0xffff0fa0)();
-#elif defined(OS_QNX)
-  __cpu_membarrier();
-#else
-#error MemoryBarrier() is not implemented on this platform.
-#endif
-}
-
-// An ARM toolchain would only define one of these depending on which
-// variant of the target architecture is being used. This tests against
-// any known ARMv6 or ARMv7 variant, where it is possible to directly
-// use ldrex/strex instructions to implement fast atomic operations.
-#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) ||  \
-    defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || \
-    defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) ||  \
-    defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || \
-    defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__)
-
-inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
-                                         Atomic32 old_value,
-                                         Atomic32 new_value) {
-  Atomic32 prev_value;
-  int reloop;
-  do {
-    // The following is equivalent to:
-    //
-    //   prev_value = LDREX(ptr)
-    //   reloop = 0
-    //   if (prev_value != old_value)
-    //      reloop = STREX(ptr, new_value)
-    __asm__ __volatile__(
-        "    ldrex %0, [%3]\n"
-        "    mov %1, #0\n"
-        "    cmp %0, %4\n"
-#ifdef __thumb2__
-        "    it eq\n"
-#endif
-        "    strexeq %1, %5, [%3]\n"
-        : "=&r"(prev_value), "=&r"(reloop), "+m"(*ptr)
-        : "r"(ptr), "r"(old_value), "r"(new_value)
-        : "cc", "memory");
-  } while (reloop != 0);
-  return prev_value;
-}
-
-inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
-                                       Atomic32 old_value,
-                                       Atomic32 new_value) {
-  Atomic32 result = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-  MemoryBarrier();
-  return result;
-}
-
-inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
-                                       Atomic32 old_value,
-                                       Atomic32 new_value) {
-  MemoryBarrier();
-  return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-}
-
-inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr,
-                                          Atomic32 increment) {
-  Atomic32 value;
-  int reloop;
-  do {
-    // Equivalent to:
-    //
-    //  value = LDREX(ptr)
-    //  value += increment
-    //  reloop = STREX(ptr, value)
-    //
-    __asm__ __volatile__(
-        "    ldrex %0, [%3]\n"
-        "    add %0, %0, %4\n"
-        "    strex %1, %0, [%3]\n"
-        : "=&r"(value), "=&r"(reloop), "+m"(*ptr)
-        : "r"(ptr), "r"(increment)
-        : "cc", "memory");
-  } while (reloop);
-  return value;
-}
-
-inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr,
-                                        Atomic32 increment) {
-  // TODO(digit): Investigate if it's possible to implement this with
-  // a single MemoryBarrier() operation between the LDREX and STREX.
-  // See http://crbug.com/246514
-  MemoryBarrier();
-  Atomic32 result = NoBarrier_AtomicIncrement(ptr, increment);
-  MemoryBarrier();
-  return result;
-}
-
-inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr,
-                                         Atomic32 new_value) {
-  Atomic32 old_value;
-  int reloop;
-  do {
-    // old_value = LDREX(ptr)
-    // reloop = STREX(ptr, new_value)
-    __asm__ __volatile__(
-        "   ldrex %0, [%3]\n"
-        "   strex %1, %4, [%3]\n"
-        : "=&r"(old_value), "=&r"(reloop), "+m"(*ptr)
-        : "r"(ptr), "r"(new_value)
-        : "cc", "memory");
-  } while (reloop != 0);
-  return old_value;
-}
-
-// This tests against any known ARMv5 variant.
-#elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) || \
-    defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__)
-
-// The kernel also provides a helper function to perform an atomic
-// compare-and-swap operation at the hard-wired address 0xffff0fc0.
-// On ARMv5, this is implemented by a special code path that the kernel
-// detects and treats specially when thread pre-emption happens.
-// On ARMv6 and higher, it uses LDREX/STREX instructions instead.
-//
-// Note that this always perform a full memory barrier, there is no
-// need to add calls MemoryBarrier() before or after it. It also
-// returns 0 on success, and 1 on exit.
-//
-// Available and reliable since Linux 2.6.24. Both Android and ChromeOS
-// use newer kernel revisions, so this should not be a concern.
-namespace {
-
-inline int LinuxKernelCmpxchg(Atomic32 old_value,
-                              Atomic32 new_value,
-                              volatile Atomic32* ptr) {
-  typedef int (*KernelCmpxchgFunc)(Atomic32, Atomic32, volatile Atomic32*);
-  return ((KernelCmpxchgFunc)0xffff0fc0)(old_value, new_value, ptr);
-}
-
-}  // namespace
-
-inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
-                                         Atomic32 old_value,
-                                         Atomic32 new_value) {
-  Atomic32 prev_value;
-  for (;;) {
-    prev_value = *ptr;
-    if (prev_value != old_value)
-      return prev_value;
-    if (!LinuxKernelCmpxchg(old_value, new_value, ptr))
-      return old_value;
-  }
-}
-
-inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr,
-                                         Atomic32 new_value) {
-  Atomic32 old_value;
-  do {
-    old_value = *ptr;
-  } while (LinuxKernelCmpxchg(old_value, new_value, ptr));
-  return old_value;
-}
-
-inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr,
-                                          Atomic32 increment) {
-  return Barrier_AtomicIncrement(ptr, increment);
-}
-
-inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr,
-                                        Atomic32 increment) {
-  for (;;) {
-    // Atomic exchange the old value with an incremented one.
-    Atomic32 old_value = *ptr;
-    Atomic32 new_value = old_value + increment;
-    if (!LinuxKernelCmpxchg(old_value, new_value, ptr)) {
-      // The exchange took place as expected.
-      return new_value;
-    }
-    // Otherwise, *ptr changed mid-loop and we need to retry.
-  }
-}
-
-inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
-                                       Atomic32 old_value,
-                                       Atomic32 new_value) {
-  Atomic32 prev_value;
-  for (;;) {
-    prev_value = *ptr;
-    if (prev_value != old_value) {
-      // Always ensure acquire semantics.
-      MemoryBarrier();
-      return prev_value;
-    }
-    if (!LinuxKernelCmpxchg(old_value, new_value, ptr))
-      return old_value;
-  }
-}
-
-inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
-                                       Atomic32 old_value,
-                                       Atomic32 new_value) {
-  // This could be implemented as:
-  //    MemoryBarrier();
-  //    return NoBarrier_CompareAndSwap();
-  //
-  // But would use 3 barriers per succesful CAS. To save performance,
-  // use Acquire_CompareAndSwap(). Its implementation guarantees that:
-  // - A succesful swap uses only 2 barriers (in the kernel helper).
-  // - An early return due to (prev_value != old_value) performs
-  //   a memory barrier with no store, which is equivalent to the
-  //   generic implementation above.
-  return Acquire_CompareAndSwap(ptr, old_value, new_value);
-}
-
-#else
-#error "Your CPU's ARM architecture is not supported yet"
-#endif
-
-// NOTE: Atomicity of the following load and store operations is only
-// guaranteed in case of 32-bit alignement of |ptr| values.
-
-inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) {
-  *ptr = value;
-}
-
-inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
-  *ptr = value;
-  MemoryBarrier();
-}
-
-inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) {
-  MemoryBarrier();
-  *ptr = value;
-}
-
-inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) {
-  return *ptr;
-}
-
-inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) {
-  Atomic32 value = *ptr;
-  MemoryBarrier();
-  return value;
-}
-
-inline Atomic32 Release_Load(volatile const Atomic32* ptr) {
-  MemoryBarrier();
-  return *ptr;
-}
-
-}  // namespace base::subtle
-}  // namespace base
-
-#endif  // CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_ARM_GCC_H_
diff --git a/src/include/base/internal/cef_atomicops_atomicword_compat.h b/src/include/base/internal/cef_atomicops_atomicword_compat.h
deleted file mode 100644
index f905de8..0000000
--- a/src/include/base/internal/cef_atomicops_atomicword_compat.h
+++ /dev/null
@@ -1,124 +0,0 @@
-// 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.
-
-// Do not include this header file directly. Use base/cef_atomicops.h
-// instead.
-
-#ifndef CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_ATOMICWORD_COMPAT_H_
-#define CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_ATOMICWORD_COMPAT_H_
-
-// AtomicWord is a synonym for intptr_t, and Atomic32 is a synonym for int32,
-// which in turn means int. On some LP32 platforms, intptr_t is an int, but
-// on others, it's a long. When AtomicWord and Atomic32 are based on different
-// fundamental types, their pointers are incompatible.
-//
-// This file defines function overloads to allow both AtomicWord and Atomic32
-// data to be used with this interface.
-//
-// On LP64 platforms, AtomicWord and Atomic64 are both always long,
-// so this problem doesn't occur.
-
-#if !defined(ARCH_CPU_64_BITS)
-
-namespace base {
-namespace subtle {
-
-inline AtomicWord NoBarrier_CompareAndSwap(volatile AtomicWord* ptr,
-                                           AtomicWord old_value,
-                                           AtomicWord new_value) {
-  return NoBarrier_CompareAndSwap(reinterpret_cast<volatile Atomic32*>(ptr),
-                                  old_value, new_value);
-}
-
-inline AtomicWord NoBarrier_AtomicExchange(volatile AtomicWord* ptr,
-                                           AtomicWord new_value) {
-  return NoBarrier_AtomicExchange(reinterpret_cast<volatile Atomic32*>(ptr),
-                                  new_value);
-}
-
-inline AtomicWord NoBarrier_AtomicIncrement(volatile AtomicWord* ptr,
-                                            AtomicWord increment) {
-  return NoBarrier_AtomicIncrement(reinterpret_cast<volatile Atomic32*>(ptr),
-                                   increment);
-}
-
-inline AtomicWord Barrier_AtomicIncrement(volatile AtomicWord* ptr,
-                                          AtomicWord increment) {
-  return Barrier_AtomicIncrement(reinterpret_cast<volatile Atomic32*>(ptr),
-                                 increment);
-}
-
-inline AtomicWord Acquire_CompareAndSwap(volatile AtomicWord* ptr,
-                                         AtomicWord old_value,
-                                         AtomicWord new_value) {
-  return base::subtle::Acquire_CompareAndSwap(
-      reinterpret_cast<volatile Atomic32*>(ptr), old_value, new_value);
-}
-
-inline AtomicWord Release_CompareAndSwap(volatile AtomicWord* ptr,
-                                         AtomicWord old_value,
-                                         AtomicWord new_value) {
-  return base::subtle::Release_CompareAndSwap(
-      reinterpret_cast<volatile Atomic32*>(ptr), old_value, new_value);
-}
-
-inline void NoBarrier_Store(volatile AtomicWord* ptr, AtomicWord value) {
-  NoBarrier_Store(reinterpret_cast<volatile Atomic32*>(ptr), value);
-}
-
-inline void Acquire_Store(volatile AtomicWord* ptr, AtomicWord value) {
-  return base::subtle::Acquire_Store(reinterpret_cast<volatile Atomic32*>(ptr),
-                                     value);
-}
-
-inline void Release_Store(volatile AtomicWord* ptr, AtomicWord value) {
-  return base::subtle::Release_Store(reinterpret_cast<volatile Atomic32*>(ptr),
-                                     value);
-}
-
-inline AtomicWord NoBarrier_Load(volatile const AtomicWord* ptr) {
-  return NoBarrier_Load(reinterpret_cast<volatile const Atomic32*>(ptr));
-}
-
-inline AtomicWord Acquire_Load(volatile const AtomicWord* ptr) {
-  return base::subtle::Acquire_Load(
-      reinterpret_cast<volatile const Atomic32*>(ptr));
-}
-
-inline AtomicWord Release_Load(volatile const AtomicWord* ptr) {
-  return base::subtle::Release_Load(
-      reinterpret_cast<volatile const Atomic32*>(ptr));
-}
-
-}  // namespace base::subtle
-}  // namespace base
-
-#endif  // !defined(ARCH_CPU_64_BITS)
-
-#endif  // CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_ATOMICWORD_COMPAT_H_
diff --git a/src/include/base/internal/cef_atomicops_mac.h b/src/include/base/internal/cef_atomicops_mac.h
deleted file mode 100644
index 374ae35..0000000
--- a/src/include/base/internal/cef_atomicops_mac.h
+++ /dev/null
@@ -1,223 +0,0 @@
-// 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.
-
-// Do not include this header file directly. Use base/cef_atomicops.h
-// instead.
-
-#ifndef CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_MAC_H_
-#define CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_MAC_H_
-
-#include <libkern/OSAtomic.h>
-
-namespace base {
-namespace subtle {
-
-inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
-                                         Atomic32 old_value,
-                                         Atomic32 new_value) {
-  Atomic32 prev_value;
-  do {
-    if (OSAtomicCompareAndSwap32(old_value, new_value,
-                                 const_cast<Atomic32*>(ptr))) {
-      return old_value;
-    }
-    prev_value = *ptr;
-  } while (prev_value == old_value);
-  return prev_value;
-}
-
-inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr,
-                                         Atomic32 new_value) {
-  Atomic32 old_value;
-  do {
-    old_value = *ptr;
-  } while (!OSAtomicCompareAndSwap32(old_value, new_value,
-                                     const_cast<Atomic32*>(ptr)));
-  return old_value;
-}
-
-inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr,
-                                          Atomic32 increment) {
-  return OSAtomicAdd32(increment, const_cast<Atomic32*>(ptr));
-}
-
-inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr,
-                                        Atomic32 increment) {
-  return OSAtomicAdd32Barrier(increment, const_cast<Atomic32*>(ptr));
-}
-
-inline void MemoryBarrier() {
-  OSMemoryBarrier();
-}
-
-inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
-                                       Atomic32 old_value,
-                                       Atomic32 new_value) {
-  Atomic32 prev_value;
-  do {
-    if (OSAtomicCompareAndSwap32Barrier(old_value, new_value,
-                                        const_cast<Atomic32*>(ptr))) {
-      return old_value;
-    }
-    prev_value = *ptr;
-  } while (prev_value == old_value);
-  return prev_value;
-}
-
-inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
-                                       Atomic32 old_value,
-                                       Atomic32 new_value) {
-  return Acquire_CompareAndSwap(ptr, old_value, new_value);
-}
-
-inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) {
-  *ptr = value;
-}
-
-inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
-  *ptr = value;
-  MemoryBarrier();
-}
-
-inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) {
-  MemoryBarrier();
-  *ptr = value;
-}
-
-inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) {
-  return *ptr;
-}
-
-inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) {
-  Atomic32 value = *ptr;
-  MemoryBarrier();
-  return value;
-}
-
-inline Atomic32 Release_Load(volatile const Atomic32* ptr) {
-  MemoryBarrier();
-  return *ptr;
-}
-
-#ifdef __LP64__
-
-// 64-bit implementation on 64-bit platform
-
-inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr,
-                                         Atomic64 old_value,
-                                         Atomic64 new_value) {
-  Atomic64 prev_value;
-  do {
-    if (OSAtomicCompareAndSwap64(old_value, new_value,
-                                 reinterpret_cast<volatile int64_t*>(ptr))) {
-      return old_value;
-    }
-    prev_value = *ptr;
-  } while (prev_value == old_value);
-  return prev_value;
-}
-
-inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr,
-                                         Atomic64 new_value) {
-  Atomic64 old_value;
-  do {
-    old_value = *ptr;
-  } while (!OSAtomicCompareAndSwap64(old_value, new_value,
-                                     reinterpret_cast<volatile int64_t*>(ptr)));
-  return old_value;
-}
-
-inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr,
-                                          Atomic64 increment) {
-  return OSAtomicAdd64(increment, reinterpret_cast<volatile int64_t*>(ptr));
-}
-
-inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr,
-                                        Atomic64 increment) {
-  return OSAtomicAdd64Barrier(increment,
-                              reinterpret_cast<volatile int64_t*>(ptr));
-}
-
-inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr,
-                                       Atomic64 old_value,
-                                       Atomic64 new_value) {
-  Atomic64 prev_value;
-  do {
-    if (OSAtomicCompareAndSwap64Barrier(
-            old_value, new_value, reinterpret_cast<volatile int64_t*>(ptr))) {
-      return old_value;
-    }
-    prev_value = *ptr;
-  } while (prev_value == old_value);
-  return prev_value;
-}
-
-inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr,
-                                       Atomic64 old_value,
-                                       Atomic64 new_value) {
-  // The lib kern interface does not distinguish between
-  // Acquire and Release memory barriers; they are equivalent.
-  return Acquire_CompareAndSwap(ptr, old_value, new_value);
-}
-
-inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) {
-  *ptr = value;
-}
-
-inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) {
-  *ptr = value;
-  MemoryBarrier();
-}
-
-inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) {
-  MemoryBarrier();
-  *ptr = value;
-}
-
-inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) {
-  return *ptr;
-}
-
-inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) {
-  Atomic64 value = *ptr;
-  MemoryBarrier();
-  return value;
-}
-
-inline Atomic64 Release_Load(volatile const Atomic64* ptr) {
-  MemoryBarrier();
-  return *ptr;
-}
-
-#endif  // defined(__LP64__)
-
-}  // namespace base::subtle
-}  // namespace base
-
-#endif  // CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_MAC_H_
diff --git a/src/include/base/internal/cef_atomicops_x86_gcc.h b/src/include/base/internal/cef_atomicops_x86_gcc.h
deleted file mode 100644
index b93df21..0000000
--- a/src/include/base/internal/cef_atomicops_x86_gcc.h
+++ /dev/null
@@ -1,268 +0,0 @@
-// 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.
-
-// Do not include this header file directly. Use base/cef_atomicops.h
-// instead.
-
-#ifndef CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_X86_GCC_H_
-#define CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_X86_GCC_H_
-
-// This struct is not part of the public API of this module; clients may not
-// use it.
-// Features of this x86.  Values may not be correct before main() is run,
-// but are set conservatively.
-struct AtomicOps_x86CPUFeatureStruct {
-  bool has_amd_lock_mb_bug;  // Processor has AMD memory-barrier bug; do lfence
-                             // after acquire compare-and-swap.
-};
-extern struct AtomicOps_x86CPUFeatureStruct AtomicOps_Internalx86CPUFeatures;
-
-#define ATOMICOPS_COMPILER_BARRIER() __asm__ __volatile__("" : : : "memory")
-
-namespace base {
-namespace subtle {
-
-// 32-bit low-level operations on any platform.
-
-inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
-                                         Atomic32 old_value,
-                                         Atomic32 new_value) {
-  Atomic32 prev;
-  __asm__ __volatile__("lock; cmpxchgl %1,%2"
-                       : "=a"(prev)
-                       : "q"(new_value), "m"(*ptr), "0"(old_value)
-                       : "memory");
-  return prev;
-}
-
-inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr,
-                                         Atomic32 new_value) {
-  __asm__ __volatile__("xchgl %1,%0"  // The lock prefix is implicit for xchg.
-                       : "=r"(new_value)
-                       : "m"(*ptr), "0"(new_value)
-                       : "memory");
-  return new_value;  // Now it's the previous value.
-}
-
-inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr,
-                                          Atomic32 increment) {
-  Atomic32 temp = increment;
-  __asm__ __volatile__("lock; xaddl %0,%1"
-                       : "+r"(temp), "+m"(*ptr)
-                       :
-                       : "memory");
-  // temp now holds the old value of *ptr
-  return temp + increment;
-}
-
-inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr,
-                                        Atomic32 increment) {
-  Atomic32 temp = increment;
-  __asm__ __volatile__("lock; xaddl %0,%1"
-                       : "+r"(temp), "+m"(*ptr)
-                       :
-                       : "memory");
-  // temp now holds the old value of *ptr
-  if (AtomicOps_Internalx86CPUFeatures.has_amd_lock_mb_bug) {
-    __asm__ __volatile__("lfence" : : : "memory");
-  }
-  return temp + increment;
-}
-
-inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
-                                       Atomic32 old_value,
-                                       Atomic32 new_value) {
-  Atomic32 x = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-  if (AtomicOps_Internalx86CPUFeatures.has_amd_lock_mb_bug) {
-    __asm__ __volatile__("lfence" : : : "memory");
-  }
-  return x;
-}
-
-inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
-                                       Atomic32 old_value,
-                                       Atomic32 new_value) {
-  return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-}
-
-inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) {
-  *ptr = value;
-}
-
-inline void MemoryBarrier() {
-  __asm__ __volatile__("mfence" : : : "memory");
-}
-
-inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
-  *ptr = value;
-  MemoryBarrier();
-}
-
-inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) {
-  ATOMICOPS_COMPILER_BARRIER();
-  *ptr = value;  // An x86 store acts as a release barrier.
-  // See comments in Atomic64 version of Release_Store(), below.
-}
-
-inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) {
-  return *ptr;
-}
-
-inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) {
-  Atomic32 value = *ptr;  // An x86 load acts as a acquire barrier.
-  // See comments in Atomic64 version of Release_Store(), below.
-  ATOMICOPS_COMPILER_BARRIER();
-  return value;
-}
-
-inline Atomic32 Release_Load(volatile const Atomic32* ptr) {
-  MemoryBarrier();
-  return *ptr;
-}
-
-#if defined(__x86_64__)
-
-// 64-bit low-level operations on 64-bit platform.
-
-inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr,
-                                         Atomic64 old_value,
-                                         Atomic64 new_value) {
-  Atomic64 prev;
-  __asm__ __volatile__("lock; cmpxchgq %1,%2"
-                       : "=a"(prev)
-                       : "q"(new_value), "m"(*ptr), "0"(old_value)
-                       : "memory");
-  return prev;
-}
-
-inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr,
-                                         Atomic64 new_value) {
-  __asm__ __volatile__("xchgq %1,%0"  // The lock prefix is implicit for xchg.
-                       : "=r"(new_value)
-                       : "m"(*ptr), "0"(new_value)
-                       : "memory");
-  return new_value;  // Now it's the previous value.
-}
-
-inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr,
-                                          Atomic64 increment) {
-  Atomic64 temp = increment;
-  __asm__ __volatile__("lock; xaddq %0,%1"
-                       : "+r"(temp), "+m"(*ptr)
-                       :
-                       : "memory");
-  // temp now contains the previous value of *ptr
-  return temp + increment;
-}
-
-inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr,
-                                        Atomic64 increment) {
-  Atomic64 temp = increment;
-  __asm__ __volatile__("lock; xaddq %0,%1"
-                       : "+r"(temp), "+m"(*ptr)
-                       :
-                       : "memory");
-  // temp now contains the previous value of *ptr
-  if (AtomicOps_Internalx86CPUFeatures.has_amd_lock_mb_bug) {
-    __asm__ __volatile__("lfence" : : : "memory");
-  }
-  return temp + increment;
-}
-
-inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) {
-  *ptr = value;
-}
-
-inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) {
-  *ptr = value;
-  MemoryBarrier();
-}
-
-inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) {
-  ATOMICOPS_COMPILER_BARRIER();
-
-  *ptr = value;  // An x86 store acts as a release barrier
-                 // for current AMD/Intel chips as of Jan 2008.
-                 // See also Acquire_Load(), below.
-
-  // When new chips come out, check:
-  //  IA-32 Intel Architecture Software Developer's Manual, Volume 3:
-  //  System Programming Guide, Chatper 7: Multiple-processor management,
-  //  Section 7.2, Memory Ordering.
-  // Last seen at:
-  //   http://developer.intel.com/design/pentium4/manuals/index_new.htm
-  //
-  // x86 stores/loads fail to act as barriers for a few instructions (clflush
-  // maskmovdqu maskmovq movntdq movnti movntpd movntps movntq) but these are
-  // not generated by the compiler, and are rare.  Users of these instructions
-  // need to know about cache behaviour in any case since all of these involve
-  // either flushing cache lines or non-temporal cache hints.
-}
-
-inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) {
-  return *ptr;
-}
-
-inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) {
-  Atomic64 value = *ptr;  // An x86 load acts as a acquire barrier,
-                          // for current AMD/Intel chips as of Jan 2008.
-                          // See also Release_Store(), above.
-  ATOMICOPS_COMPILER_BARRIER();
-  return value;
-}
-
-inline Atomic64 Release_Load(volatile const Atomic64* ptr) {
-  MemoryBarrier();
-  return *ptr;
-}
-
-inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr,
-                                       Atomic64 old_value,
-                                       Atomic64 new_value) {
-  Atomic64 x = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-  if (AtomicOps_Internalx86CPUFeatures.has_amd_lock_mb_bug) {
-    __asm__ __volatile__("lfence" : : : "memory");
-  }
-  return x;
-}
-
-inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr,
-                                       Atomic64 old_value,
-                                       Atomic64 new_value) {
-  return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-}
-
-#endif  // defined(__x86_64__)
-
-}  // namespace base::subtle
-}  // namespace base
-
-#undef ATOMICOPS_COMPILER_BARRIER
-
-#endif  // CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_X86_GCC_H_
diff --git a/src/include/base/internal/cef_atomicops_x86_msvc.h b/src/include/base/internal/cef_atomicops_x86_msvc.h
deleted file mode 100644
index a262c81..0000000
--- a/src/include/base/internal/cef_atomicops_x86_msvc.h
+++ /dev/null
@@ -1,221 +0,0 @@
-// Copyright (c) 2008 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.
-
-// Do not include this header file directly. Use base/cef_atomicops.h
-// instead.
-
-#ifndef CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_X86_MSVC_H_
-#define CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_X86_MSVC_H_
-
-#include <windows.h>
-
-#include <intrin.h>
-
-#include "include/base/cef_macros.h"
-
-#if defined(ARCH_CPU_64_BITS)
-// windows.h #defines this (only on x64). This causes problems because the
-// public API also uses MemoryBarrier at the public name for this fence. So, on
-// X64, undef it, and call its documented
-// (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684208.aspx)
-// implementation directly.
-#undef MemoryBarrier
-#endif
-
-namespace base {
-namespace subtle {
-
-inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
-                                         Atomic32 old_value,
-                                         Atomic32 new_value) {
-  LONG result = _InterlockedCompareExchange(
-      reinterpret_cast<volatile LONG*>(ptr), static_cast<LONG>(new_value),
-      static_cast<LONG>(old_value));
-  return static_cast<Atomic32>(result);
-}
-
-inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr,
-                                         Atomic32 new_value) {
-  LONG result = _InterlockedExchange(reinterpret_cast<volatile LONG*>(ptr),
-                                     static_cast<LONG>(new_value));
-  return static_cast<Atomic32>(result);
-}
-
-inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr,
-                                        Atomic32 increment) {
-  return _InterlockedExchangeAdd(reinterpret_cast<volatile LONG*>(ptr),
-                                 static_cast<LONG>(increment)) +
-         increment;
-}
-
-inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr,
-                                          Atomic32 increment) {
-  return Barrier_AtomicIncrement(ptr, increment);
-}
-
-#if !(defined(_MSC_VER) && _MSC_VER >= 1400)
-#error "We require at least vs2005 for MemoryBarrier"
-#endif
-inline void MemoryBarrier() {
-#if defined(ARCH_CPU_64_BITS)
-  // See #undef and note at the top of this file.
-  __faststorefence();
-#else
-  // We use MemoryBarrier from WinNT.h
-  ::MemoryBarrier();
-#endif
-}
-
-inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
-                                       Atomic32 old_value,
-                                       Atomic32 new_value) {
-  return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-}
-
-inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
-                                       Atomic32 old_value,
-                                       Atomic32 new_value) {
-  return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-}
-
-inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) {
-  *ptr = value;
-}
-
-inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
-  NoBarrier_AtomicExchange(ptr, value);
-  // acts as a barrier in this implementation
-}
-
-inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) {
-  *ptr = value;  // works w/o barrier for current Intel chips as of June 2005
-  // See comments in Atomic64 version of Release_Store() below.
-}
-
-inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) {
-  return *ptr;
-}
-
-inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) {
-  Atomic32 value = *ptr;
-  return value;
-}
-
-inline Atomic32 Release_Load(volatile const Atomic32* ptr) {
-  MemoryBarrier();
-  return *ptr;
-}
-
-#if defined(_WIN64)
-
-// 64-bit low-level operations on 64-bit platform.
-
-COMPILE_ASSERT(sizeof(Atomic64) == sizeof(PVOID), atomic_word_is_atomic);
-
-inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr,
-                                         Atomic64 old_value,
-                                         Atomic64 new_value) {
-  PVOID result = InterlockedCompareExchangePointer(
-      reinterpret_cast<volatile PVOID*>(ptr),
-      reinterpret_cast<PVOID>(new_value), reinterpret_cast<PVOID>(old_value));
-  return reinterpret_cast<Atomic64>(result);
-}
-
-inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr,
-                                         Atomic64 new_value) {
-  PVOID result =
-      InterlockedExchangePointer(reinterpret_cast<volatile PVOID*>(ptr),
-                                 reinterpret_cast<PVOID>(new_value));
-  return reinterpret_cast<Atomic64>(result);
-}
-
-inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr,
-                                        Atomic64 increment) {
-  return InterlockedExchangeAdd64(reinterpret_cast<volatile LONGLONG*>(ptr),
-                                  static_cast<LONGLONG>(increment)) +
-         increment;
-}
-
-inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr,
-                                          Atomic64 increment) {
-  return Barrier_AtomicIncrement(ptr, increment);
-}
-
-inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) {
-  *ptr = value;
-}
-
-inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) {
-  NoBarrier_AtomicExchange(ptr, value);
-  // acts as a barrier in this implementation
-}
-
-inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) {
-  *ptr = value;  // works w/o barrier for current Intel chips as of June 2005
-
-  // When new chips come out, check:
-  //  IA-32 Intel Architecture Software Developer's Manual, Volume 3:
-  //  System Programming Guide, Chatper 7: Multiple-processor management,
-  //  Section 7.2, Memory Ordering.
-  // Last seen at:
-  //   http://developer.intel.com/design/pentium4/manuals/index_new.htm
-}
-
-inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) {
-  return *ptr;
-}
-
-inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) {
-  Atomic64 value = *ptr;
-  return value;
-}
-
-inline Atomic64 Release_Load(volatile const Atomic64* ptr) {
-  MemoryBarrier();
-  return *ptr;
-}
-
-inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr,
-                                       Atomic64 old_value,
-                                       Atomic64 new_value) {
-  return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-}
-
-inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr,
-                                       Atomic64 old_value,
-                                       Atomic64 new_value) {
-  return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-}
-
-#endif  // defined(_WIN64)
-
-}  // namespace base::subtle
-}  // namespace base
-
-#endif  // CEF_INCLUDE_BASE_INTERNAL_CEF_ATOMICOPS_X86_MSVC_H_
diff --git a/src/include/base/internal/cef_bind_internal.h b/src/include/base/internal/cef_bind_internal.h
index 64eeb3f..fddfec0 100644
--- a/src/include/base/internal/cef_bind_internal.h
+++ b/src/include/base/internal/cef_bind_internal.h
@@ -29,769 +29,340 @@
 
 // Do not include this header file directly. Use base/cef_bind.h instead.
 
+// See base/cef_callback.h for user documentation.
+//
+//
+// CONCEPTS:
+//  Functor -- A movable type representing something that should be called.
+//             All function pointers and Callback<> are functors even if the
+//             invocation syntax differs.
+//  RunType -- A function type (as opposed to function _pointer_ type) for
+//             a Callback<>::Run().  Usually just a convenience typedef.
+//  (Bound)Args -- A set of types that stores the arguments.
+//
+// Types:
+//  ForceVoidReturn<> -- Helper class for translating function signatures to
+//                       equivalent forms with a "void" return type.
+//  FunctorTraits<> -- Type traits used to determine the correct RunType and
+//                     invocation manner for a Functor.  This is where function
+//                     signature adapters are applied.
+//  InvokeHelper<> -- Take a Functor + arguments and actully invokes it.
+//                    Handle the differing syntaxes needed for WeakPtr<>
+//                    support.  This is separate from Invoker to avoid creating
+//                    multiple version of Invoker<>.
+//  Invoker<> -- Unwraps the curried parameters and executes the Functor.
+//  BindState<> -- Stores the curried parameters, and is the main entry point
+//                 into the Bind() system.
+
 #ifndef CEF_INCLUDE_BASE_INTERNAL_CEF_BIND_INTERNAL_H_
 #define CEF_INCLUDE_BASE_INTERNAL_CEF_BIND_INTERNAL_H_
 
-#include "include/base/cef_bind_helpers.h"
+#include <stddef.h>
+
+#include <functional>
+#include <memory>
+#include <tuple>
+#include <type_traits>
+#include <utility>
+
 #include "include/base/cef_build.h"
-#include "include/base/cef_template_util.h"
+#include "include/base/cef_compiler_specific.h"
+#include "include/base/cef_logging.h"
 #include "include/base/cef_weak_ptr.h"
 #include "include/base/internal/cef_callback_internal.h"
 #include "include/base/internal/cef_raw_scoped_refptr_mismatch_checker.h"
 
+#if defined(OS_APPLE) && !HAS_FEATURE(objc_arc)
+#include "include/base/internal/cef_scoped_block_mac.h"
+#endif
+
 #if defined(OS_WIN)
-#include "include/base/internal/cef_bind_internal_win.h"
+namespace Microsoft {
+namespace WRL {
+template <typename>
+class ComPtr;
+}  // namespace WRL
+}  // namespace Microsoft
 #endif
 
 namespace base {
+
+template <typename T>
+struct IsWeakReceiver;
+
+template <typename>
+struct BindUnwrapTraits;
+
+template <typename Functor, typename BoundArgsTuple, typename SFINAE = void>
+struct CallbackCancellationTraits;
+
 namespace cef_internal {
 
-// See base/callback.h for user documentation.
+template <typename Functor, typename SFINAE = void>
+struct FunctorTraits;
+
+template <typename T>
+class UnretainedWrapper {
+ public:
+  explicit UnretainedWrapper(T* o) : ptr_(o) {}
+  T* get() const { return ptr_; }
+
+ private:
+  T* ptr_;
+};
+
+template <typename T>
+class RetainedRefWrapper {
+ public:
+  explicit RetainedRefWrapper(T* o) : ptr_(o) {}
+  explicit RetainedRefWrapper(scoped_refptr<T> o) : ptr_(std::move(o)) {}
+  T* get() const { return ptr_.get(); }
+
+ private:
+  scoped_refptr<T> ptr_;
+};
+
+template <typename T>
+struct IgnoreResultHelper {
+  explicit IgnoreResultHelper(T functor) : functor_(std::move(functor)) {}
+  explicit operator bool() const { return !!functor_; }
+
+  T functor_;
+};
+
+template <typename T, typename Deleter = std::default_delete<T>>
+class OwnedWrapper {
+ public:
+  explicit OwnedWrapper(T* o) : ptr_(o) {}
+  explicit OwnedWrapper(std::unique_ptr<T, Deleter>&& ptr)
+      : ptr_(std::move(ptr)) {}
+  T* get() const { return ptr_.get(); }
+
+ private:
+  std::unique_ptr<T, Deleter> ptr_;
+};
+
+template <typename T>
+class OwnedRefWrapper {
+ public:
+  explicit OwnedRefWrapper(const T& t) : t_(t) {}
+  explicit OwnedRefWrapper(T&& t) : t_(std::move(t)) {}
+  T& get() const { return t_; }
+
+ private:
+  mutable T t_;
+};
+
+// PassedWrapper is a copyable adapter for a scoper that ignores const.
 //
+// It is needed to get around the fact that Bind() takes a const reference to
+// all its arguments.  Because Bind() takes a const reference to avoid
+// unnecessary copies, it is incompatible with movable-but-not-copyable
+// types; doing a destructive "move" of the type into Bind() would violate
+// the const correctness.
 //
-// CONCEPTS:
-//  Runnable -- A type (really a type class) that has a single Run() method
-//              and a RunType typedef that corresponds to the type of Run().
-//              A Runnable can declare that it should treated like a method
-//              call by including a typedef named IsMethod.  The value of
-//              this typedef is NOT inspected, only the existence.  When a
-//              Runnable declares itself a method, Bind() will enforce special
-//              refcounting + WeakPtr handling semantics for the first
-//              parameter which is expected to be an object.
-//  Functor -- A copyable type representing something that should be called.
-//             All function pointers, Callback<>, and Runnables are functors
-//             even if the invocation syntax differs.
-//  RunType -- A function type (as opposed to function _pointer_ type) for
-//             a Run() function.  Usually just a convenience typedef.
-//  (Bound)ArgsType -- A function type that is being (ab)used to store the
-//                     types of set of arguments.  The "return" type is always
-//                     void here.  We use this hack so that we do not need
-//                     a new type name for each arity of type. (eg.,
-//                     BindState1, BindState2).  This makes forward
-//                     declarations and friending much much easier.
+// This conundrum cannot be solved without either C++11 rvalue references or
+// a O(2^n) blowup of Bind() templates to handle each combination of regular
+// types and movable-but-not-copyable types.  Thus we introduce a wrapper type
+// that is copyable to transmit the correct type information down into
+// BindState<>. Ignoring const in this type makes sense because it is only
+// created when we are explicitly trying to do a destructive move.
 //
-// Types:
-//  RunnableAdapter<> -- Wraps the various "function" pointer types into an
-//                       object that adheres to the Runnable interface.
-//                       There are |3*ARITY| RunnableAdapter types.
-//  FunctionTraits<> -- Type traits that unwrap a function signature into a
-//                      a set of easier to use typedefs.  Used mainly for
-//                      compile time asserts.
-//                      There are |ARITY| FunctionTraits types.
-//  ForceVoidReturn<> -- Helper class for translating function signatures to
-//                       equivalent forms with a "void" return type.
-//                    There are |ARITY| ForceVoidReturn types.
-//  FunctorTraits<> -- Type traits used determine the correct RunType and
-//                     RunnableType for a Functor.  This is where function
-//                     signature adapters are applied.
-//                    There are |ARITY| ForceVoidReturn types.
-//  MakeRunnable<> -- Takes a Functor and returns an object in the Runnable
-//                    type class that represents the underlying Functor.
-//                    There are |O(1)| MakeRunnable types.
-//  InvokeHelper<> -- Take a Runnable + arguments and actully invokes it.
-// Handle the differing syntaxes needed for WeakPtr<> support,
-//                    and for ignoring return values.  This is separate from
-//                    Invoker to avoid creating multiple version of Invoker<>
-//                    which grows at O(n^2) with the arity.
-//                    There are |k*ARITY| InvokeHelper types.
-//  Invoker<> -- Unwraps the curried parameters and executes the Runnable.
-//               There are |(ARITY^2 + ARITY)/2| Invoketypes.
-//  BindState<> -- Stores the curried parameters, and is the main entry point
-//                 into the Bind() system, doing most of the type resolution.
-//                 There are ARITY BindState types.
+// Two notes:
+//  1) PassedWrapper supports any type that has a move constructor, however
+//     the type will need to be specifically allowed in order for it to be
+//     bound to a Callback. We guard this explicitly at the call of Passed()
+//     to make for clear errors. Things not given to Passed() will be forwarded
+//     and stored by value which will not work for general move-only types.
+//  2) is_valid_ is distinct from NULL because it is valid to bind a "NULL"
+//     scoper to a Callback and allow the Callback to execute once.
+template <typename T>
+class PassedWrapper {
+ public:
+  explicit PassedWrapper(T&& scoper)
+      : is_valid_(true), scoper_(std::move(scoper)) {}
+  PassedWrapper(PassedWrapper&& other)
+      : is_valid_(other.is_valid_), scoper_(std::move(other.scoper_)) {}
+  T Take() const {
+    CHECK(is_valid_);
+    is_valid_ = false;
+    return std::move(scoper_);
+  }
 
-// RunnableAdapter<>
+ private:
+  mutable bool is_valid_;
+  mutable T scoper_;
+};
+
+template <typename T>
+using Unwrapper = BindUnwrapTraits<std::decay_t<T>>;
+
+template <typename T>
+decltype(auto) Unwrap(T&& o) {
+  return Unwrapper<T>::Unwrap(std::forward<T>(o));
+}
+
+// IsWeakMethod is a helper that determine if we are binding a WeakPtr<> to a
+// method.  It is used internally by Bind() to select the correct
+// InvokeHelper that will no-op itself in the event the WeakPtr<> for
+// the target object is invalidated.
 //
-// The RunnableAdapter<> templates provide a uniform interface for invoking
-// a function pointer, method pointer, or const method pointer. The adapter
-// exposes a Run() method with an appropriate signature. Using this wrapper
-// allows for writing code that supports all three pointer types without
-// undue repetition.  Without it, a lot of code would need to be repeated 3
-// times.
+// The first argument should be the type of the object that will be received by
+// the method.
+template <bool is_method, typename... Args>
+struct IsWeakMethod : std::false_type {};
+
+template <typename T, typename... Args>
+struct IsWeakMethod<true, T, Args...> : IsWeakReceiver<T> {};
+
+// Packs a list of types to hold them in a single type.
+template <typename... Types>
+struct TypeList {};
+
+// Used for DropTypeListItem implementation.
+template <size_t n, typename List>
+struct DropTypeListItemImpl;
+
+// Do not use enable_if and SFINAE here to avoid MSVC2013 compile failure.
+template <size_t n, typename T, typename... List>
+struct DropTypeListItemImpl<n, TypeList<T, List...>>
+    : DropTypeListItemImpl<n - 1, TypeList<List...>> {};
+
+template <typename T, typename... List>
+struct DropTypeListItemImpl<0, TypeList<T, List...>> {
+  using Type = TypeList<T, List...>;
+};
+
+template <>
+struct DropTypeListItemImpl<0, TypeList<>> {
+  using Type = TypeList<>;
+};
+
+// A type-level function that drops |n| list item from given TypeList.
+template <size_t n, typename List>
+using DropTypeListItem = typename DropTypeListItemImpl<n, List>::Type;
+
+// Used for TakeTypeListItem implementation.
+template <size_t n, typename List, typename... Accum>
+struct TakeTypeListItemImpl;
+
+// Do not use enable_if and SFINAE here to avoid MSVC2013 compile failure.
+template <size_t n, typename T, typename... List, typename... Accum>
+struct TakeTypeListItemImpl<n, TypeList<T, List...>, Accum...>
+    : TakeTypeListItemImpl<n - 1, TypeList<List...>, Accum..., T> {};
+
+template <typename T, typename... List, typename... Accum>
+struct TakeTypeListItemImpl<0, TypeList<T, List...>, Accum...> {
+  using Type = TypeList<Accum...>;
+};
+
+template <typename... Accum>
+struct TakeTypeListItemImpl<0, TypeList<>, Accum...> {
+  using Type = TypeList<Accum...>;
+};
+
+// A type-level function that takes first |n| list item from given TypeList.
+// E.g. TakeTypeListItem<3, TypeList<A, B, C, D>> is evaluated to
+// TypeList<A, B, C>.
+template <size_t n, typename List>
+using TakeTypeListItem = typename TakeTypeListItemImpl<n, List>::Type;
+
+// Used for ConcatTypeLists implementation.
+template <typename List1, typename List2>
+struct ConcatTypeListsImpl;
+
+template <typename... Types1, typename... Types2>
+struct ConcatTypeListsImpl<TypeList<Types1...>, TypeList<Types2...>> {
+  using Type = TypeList<Types1..., Types2...>;
+};
+
+// A type-level function that concats two TypeLists.
+template <typename List1, typename List2>
+using ConcatTypeLists = typename ConcatTypeListsImpl<List1, List2>::Type;
+
+// Used for MakeFunctionType implementation.
+template <typename R, typename ArgList>
+struct MakeFunctionTypeImpl;
+
+template <typename R, typename... Args>
+struct MakeFunctionTypeImpl<R, TypeList<Args...>> {
+  // MSVC 2013 doesn't support Type Alias of function types.
+  // Revisit this after we update it to newer version.
+  typedef R Type(Args...);
+};
+
+// A type-level function that constructs a function type that has |R| as its
+// return type and has TypeLists items as its arguments.
+template <typename R, typename ArgList>
+using MakeFunctionType = typename MakeFunctionTypeImpl<R, ArgList>::Type;
+
+// Used for ExtractArgs and ExtractReturnType.
+template <typename Signature>
+struct ExtractArgsImpl;
+
+template <typename R, typename... Args>
+struct ExtractArgsImpl<R(Args...)> {
+  using ReturnType = R;
+  using ArgsList = TypeList<Args...>;
+};
+
+// A type-level function that extracts function arguments into a TypeList.
+// E.g. ExtractArgs<R(A, B, C)> is evaluated to TypeList<A, B, C>.
+template <typename Signature>
+using ExtractArgs = typename ExtractArgsImpl<Signature>::ArgsList;
+
+// A type-level function that extracts the return type of a function.
+// E.g. ExtractReturnType<R(A, B, C)> is evaluated to R.
+template <typename Signature>
+using ExtractReturnType = typename ExtractArgsImpl<Signature>::ReturnType;
+
+template <typename Callable,
+          typename Signature = decltype(&Callable::operator())>
+struct ExtractCallableRunTypeImpl;
+
+template <typename Callable, typename R, typename... Args>
+struct ExtractCallableRunTypeImpl<Callable, R (Callable::*)(Args...)> {
+  using Type = R(Args...);
+};
+
+template <typename Callable, typename R, typename... Args>
+struct ExtractCallableRunTypeImpl<Callable, R (Callable::*)(Args...) const> {
+  using Type = R(Args...);
+};
+
+// Evaluated to RunType of the given callable type.
+// Example:
+//   auto f = [](int, char*) { return 0.1; };
+//   ExtractCallableRunType<decltype(f)>
+//   is evaluated to
+//   double(int, char*);
+template <typename Callable>
+using ExtractCallableRunType =
+    typename ExtractCallableRunTypeImpl<Callable>::Type;
+
+// IsCallableObject<Functor> is std::true_type if |Functor| has operator().
+// Otherwise, it's std::false_type.
+// Example:
+//   IsCallableObject<void(*)()>::value is false.
 //
-// For method pointers and const method pointers the first argument to Run()
-// is considered to be the received of the method.  This is similar to STL's
-// mem_fun().
+//   struct Foo {};
+//   IsCallableObject<void(Foo::*)()>::value is false.
 //
-// This class also exposes a RunType typedef that is the function type of the
-// Run() function.
-//
-// If and only if the wrapper contains a method or const method pointer, an
-// IsMethod typedef is exposed.  The existence of this typedef (NOT the value)
-// marks that the wrapper should be considered a method wrapper.
+//   int i = 0;
+//   auto f = [i]() {};
+//   IsCallableObject<decltype(f)>::value is false.
+template <typename Functor, typename SFINAE = void>
+struct IsCallableObject : std::false_type {};
 
-template <typename Functor>
-class RunnableAdapter;
+template <typename Callable>
+struct IsCallableObject<Callable, std::void_t<decltype(&Callable::operator())>>
+    : std::true_type {};
 
-// Function: Arity 0.
-template <typename R>
-class RunnableAdapter<R (*)()> {
- public:
-  typedef R(RunType)();
-
-  explicit RunnableAdapter(R (*function)()) : function_(function) {}
-
-  R Run() { return function_(); }
-
- private:
-  R (*function_)();
-};
-
-// Method: Arity 0.
-template <typename R, typename T>
-class RunnableAdapter<R (T::*)()> {
- public:
-  typedef R(RunType)(T*);
-  typedef true_type IsMethod;
-
-  explicit RunnableAdapter(R (T::*method)()) : method_(method) {}
-
-  R Run(T* object) { return (object->*method_)(); }
-
- private:
-  R (T::*method_)();
-};
-
-// Const Method: Arity 0.
-template <typename R, typename T>
-class RunnableAdapter<R (T::*)() const> {
- public:
-  typedef R(RunType)(const T*);
-  typedef true_type IsMethod;
-
-  explicit RunnableAdapter(R (T::*method)() const) : method_(method) {}
-
-  R Run(const T* object) { return (object->*method_)(); }
-
- private:
-  R (T::*method_)() const;
-};
-
-// Function: Arity 1.
-template <typename R, typename A1>
-class RunnableAdapter<R (*)(A1)> {
- public:
-  typedef R(RunType)(A1);
-
-  explicit RunnableAdapter(R (*function)(A1)) : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1) {
-    return function_(CallbackForward(a1));
-  }
-
- private:
-  R (*function_)(A1);
-};
-
-// Method: Arity 1.
-template <typename R, typename T, typename A1>
-class RunnableAdapter<R (T::*)(A1)> {
- public:
-  typedef R(RunType)(T*, A1);
-  typedef true_type IsMethod;
-
-  explicit RunnableAdapter(R (T::*method)(A1)) : method_(method) {}
-
-  R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1) {
-    return (object->*method_)(CallbackForward(a1));
-  }
-
- private:
-  R (T::*method_)(A1);
-};
-
-// Const Method: Arity 1.
-template <typename R, typename T, typename A1>
-class RunnableAdapter<R (T::*)(A1) const> {
- public:
-  typedef R(RunType)(const T*, A1);
-  typedef true_type IsMethod;
-
-  explicit RunnableAdapter(R (T::*method)(A1) const) : method_(method) {}
-
-  R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1) {
-    return (object->*method_)(CallbackForward(a1));
-  }
-
- private:
-  R (T::*method_)(A1) const;
-};
-
-// Function: Arity 2.
-template <typename R, typename A1, typename A2>
-class RunnableAdapter<R (*)(A1, A2)> {
- public:
-  typedef R(RunType)(A1, A2);
-
-  explicit RunnableAdapter(R (*function)(A1, A2)) : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2) {
-    return function_(CallbackForward(a1), CallbackForward(a2));
-  }
-
- private:
-  R (*function_)(A1, A2);
-};
-
-// Method: Arity 2.
-template <typename R, typename T, typename A1, typename A2>
-class RunnableAdapter<R (T::*)(A1, A2)> {
- public:
-  typedef R(RunType)(T*, A1, A2);
-  typedef true_type IsMethod;
-
-  explicit RunnableAdapter(R (T::*method)(A1, A2)) : method_(method) {}
-
-  R Run(T* object,
-        typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2));
-  }
-
- private:
-  R (T::*method_)(A1, A2);
-};
-
-// Const Method: Arity 2.
-template <typename R, typename T, typename A1, typename A2>
-class RunnableAdapter<R (T::*)(A1, A2) const> {
- public:
-  typedef R(RunType)(const T*, A1, A2);
-  typedef true_type IsMethod;
-
-  explicit RunnableAdapter(R (T::*method)(A1, A2) const) : method_(method) {}
-
-  R Run(const T* object,
-        typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2));
-  }
-
- private:
-  R (T::*method_)(A1, A2) const;
-};
-
-// Function: Arity 3.
-template <typename R, typename A1, typename A2, typename A3>
-class RunnableAdapter<R (*)(A1, A2, A3)> {
- public:
-  typedef R(RunType)(A1, A2, A3);
-
-  explicit RunnableAdapter(R (*function)(A1, A2, A3)) : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3) {
-    return function_(CallbackForward(a1), CallbackForward(a2),
-                     CallbackForward(a3));
-  }
-
- private:
-  R (*function_)(A1, A2, A3);
-};
-
-// Method: Arity 3.
-template <typename R, typename T, typename A1, typename A2, typename A3>
-class RunnableAdapter<R (T::*)(A1, A2, A3)> {
- public:
-  typedef R(RunType)(T*, A1, A2, A3);
-  typedef true_type IsMethod;
-
-  explicit RunnableAdapter(R (T::*method)(A1, A2, A3)) : method_(method) {}
-
-  R Run(T* object,
-        typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
-                              CallbackForward(a3));
-  }
-
- private:
-  R (T::*method_)(A1, A2, A3);
-};
-
-// Const Method: Arity 3.
-template <typename R, typename T, typename A1, typename A2, typename A3>
-class RunnableAdapter<R (T::*)(A1, A2, A3) const> {
- public:
-  typedef R(RunType)(const T*, A1, A2, A3);
-  typedef true_type IsMethod;
-
-  explicit RunnableAdapter(R (T::*method)(A1, A2, A3) const)
-      : method_(method) {}
-
-  R Run(const T* object,
-        typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
-                              CallbackForward(a3));
-  }
-
- private:
-  R (T::*method_)(A1, A2, A3) const;
-};
-
-// Function: Arity 4.
-template <typename R, typename A1, typename A2, typename A3, typename A4>
-class RunnableAdapter<R (*)(A1, A2, A3, A4)> {
- public:
-  typedef R(RunType)(A1, A2, A3, A4);
-
-  explicit RunnableAdapter(R (*function)(A1, A2, A3, A4))
-      : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3,
-        typename CallbackParamTraits<A4>::ForwardType a4) {
-    return function_(CallbackForward(a1), CallbackForward(a2),
-                     CallbackForward(a3), CallbackForward(a4));
-  }
-
- private:
-  R (*function_)(A1, A2, A3, A4);
-};
-
-// Method: Arity 4.
-template <typename R,
-          typename T,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4>
-class RunnableAdapter<R (T::*)(A1, A2, A3, A4)> {
- public:
-  typedef R(RunType)(T*, A1, A2, A3, A4);
-  typedef true_type IsMethod;
-
-  explicit RunnableAdapter(R (T::*method)(A1, A2, A3, A4)) : method_(method) {}
-
-  R Run(T* object,
-        typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3,
-        typename CallbackParamTraits<A4>::ForwardType a4) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
-                              CallbackForward(a3), CallbackForward(a4));
-  }
-
- private:
-  R (T::*method_)(A1, A2, A3, A4);
-};
-
-// Const Method: Arity 4.
-template <typename R,
-          typename T,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4>
-class RunnableAdapter<R (T::*)(A1, A2, A3, A4) const> {
- public:
-  typedef R(RunType)(const T*, A1, A2, A3, A4);
-  typedef true_type IsMethod;
-
-  explicit RunnableAdapter(R (T::*method)(A1, A2, A3, A4) const)
-      : method_(method) {}
-
-  R Run(const T* object,
-        typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3,
-        typename CallbackParamTraits<A4>::ForwardType a4) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
-                              CallbackForward(a3), CallbackForward(a4));
-  }
-
- private:
-  R (T::*method_)(A1, A2, A3, A4) const;
-};
-
-// Function: Arity 5.
-template <typename R,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5>
-class RunnableAdapter<R (*)(A1, A2, A3, A4, A5)> {
- public:
-  typedef R(RunType)(A1, A2, A3, A4, A5);
-
-  explicit RunnableAdapter(R (*function)(A1, A2, A3, A4, A5))
-      : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3,
-        typename CallbackParamTraits<A4>::ForwardType a4,
-        typename CallbackParamTraits<A5>::ForwardType a5) {
-    return function_(CallbackForward(a1), CallbackForward(a2),
-                     CallbackForward(a3), CallbackForward(a4),
-                     CallbackForward(a5));
-  }
-
- private:
-  R (*function_)(A1, A2, A3, A4, A5);
-};
-
-// Method: Arity 5.
-template <typename R,
-          typename T,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5>
-class RunnableAdapter<R (T::*)(A1, A2, A3, A4, A5)> {
- public:
-  typedef R(RunType)(T*, A1, A2, A3, A4, A5);
-  typedef true_type IsMethod;
-
-  explicit RunnableAdapter(R (T::*method)(A1, A2, A3, A4, A5))
-      : method_(method) {}
-
-  R Run(T* object,
-        typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3,
-        typename CallbackParamTraits<A4>::ForwardType a4,
-        typename CallbackParamTraits<A5>::ForwardType a5) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
-                              CallbackForward(a3), CallbackForward(a4),
-                              CallbackForward(a5));
-  }
-
- private:
-  R (T::*method_)(A1, A2, A3, A4, A5);
-};
-
-// Const Method: Arity 5.
-template <typename R,
-          typename T,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5>
-class RunnableAdapter<R (T::*)(A1, A2, A3, A4, A5) const> {
- public:
-  typedef R(RunType)(const T*, A1, A2, A3, A4, A5);
-  typedef true_type IsMethod;
-
-  explicit RunnableAdapter(R (T::*method)(A1, A2, A3, A4, A5) const)
-      : method_(method) {}
-
-  R Run(const T* object,
-        typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3,
-        typename CallbackParamTraits<A4>::ForwardType a4,
-        typename CallbackParamTraits<A5>::ForwardType a5) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
-                              CallbackForward(a3), CallbackForward(a4),
-                              CallbackForward(a5));
-  }
-
- private:
-  R (T::*method_)(A1, A2, A3, A4, A5) const;
-};
-
-// Function: Arity 6.
-template <typename R,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6>
-class RunnableAdapter<R (*)(A1, A2, A3, A4, A5, A6)> {
- public:
-  typedef R(RunType)(A1, A2, A3, A4, A5, A6);
-
-  explicit RunnableAdapter(R (*function)(A1, A2, A3, A4, A5, A6))
-      : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3,
-        typename CallbackParamTraits<A4>::ForwardType a4,
-        typename CallbackParamTraits<A5>::ForwardType a5,
-        typename CallbackParamTraits<A6>::ForwardType a6) {
-    return function_(CallbackForward(a1), CallbackForward(a2),
-                     CallbackForward(a3), CallbackForward(a4),
-                     CallbackForward(a5), CallbackForward(a6));
-  }
-
- private:
-  R (*function_)(A1, A2, A3, A4, A5, A6);
-};
-
-// Method: Arity 6.
-template <typename R,
-          typename T,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6>
-class RunnableAdapter<R (T::*)(A1, A2, A3, A4, A5, A6)> {
- public:
-  typedef R(RunType)(T*, A1, A2, A3, A4, A5, A6);
-  typedef true_type IsMethod;
-
-  explicit RunnableAdapter(R (T::*method)(A1, A2, A3, A4, A5, A6))
-      : method_(method) {}
-
-  R Run(T* object,
-        typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3,
-        typename CallbackParamTraits<A4>::ForwardType a4,
-        typename CallbackParamTraits<A5>::ForwardType a5,
-        typename CallbackParamTraits<A6>::ForwardType a6) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
-                              CallbackForward(a3), CallbackForward(a4),
-                              CallbackForward(a5), CallbackForward(a6));
-  }
-
- private:
-  R (T::*method_)(A1, A2, A3, A4, A5, A6);
-};
-
-// Const Method: Arity 6.
-template <typename R,
-          typename T,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6>
-class RunnableAdapter<R (T::*)(A1, A2, A3, A4, A5, A6) const> {
- public:
-  typedef R(RunType)(const T*, A1, A2, A3, A4, A5, A6);
-  typedef true_type IsMethod;
-
-  explicit RunnableAdapter(R (T::*method)(A1, A2, A3, A4, A5, A6) const)
-      : method_(method) {}
-
-  R Run(const T* object,
-        typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3,
-        typename CallbackParamTraits<A4>::ForwardType a4,
-        typename CallbackParamTraits<A5>::ForwardType a5,
-        typename CallbackParamTraits<A6>::ForwardType a6) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
-                              CallbackForward(a3), CallbackForward(a4),
-                              CallbackForward(a5), CallbackForward(a6));
-  }
-
- private:
-  R (T::*method_)(A1, A2, A3, A4, A5, A6) const;
-};
-
-// Function: Arity 7.
-template <typename R,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6,
-          typename A7>
-class RunnableAdapter<R (*)(A1, A2, A3, A4, A5, A6, A7)> {
- public:
-  typedef R(RunType)(A1, A2, A3, A4, A5, A6, A7);
-
-  explicit RunnableAdapter(R (*function)(A1, A2, A3, A4, A5, A6, A7))
-      : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3,
-        typename CallbackParamTraits<A4>::ForwardType a4,
-        typename CallbackParamTraits<A5>::ForwardType a5,
-        typename CallbackParamTraits<A6>::ForwardType a6,
-        typename CallbackParamTraits<A7>::ForwardType a7) {
-    return function_(CallbackForward(a1), CallbackForward(a2),
-                     CallbackForward(a3), CallbackForward(a4),
-                     CallbackForward(a5), CallbackForward(a6),
-                     CallbackForward(a7));
-  }
-
- private:
-  R (*function_)(A1, A2, A3, A4, A5, A6, A7);
-};
-
-// Method: Arity 7.
-template <typename R,
-          typename T,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6,
-          typename A7>
-class RunnableAdapter<R (T::*)(A1, A2, A3, A4, A5, A6, A7)> {
- public:
-  typedef R(RunType)(T*, A1, A2, A3, A4, A5, A6, A7);
-  typedef true_type IsMethod;
-
-  explicit RunnableAdapter(R (T::*method)(A1, A2, A3, A4, A5, A6, A7))
-      : method_(method) {}
-
-  R Run(T* object,
-        typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3,
-        typename CallbackParamTraits<A4>::ForwardType a4,
-        typename CallbackParamTraits<A5>::ForwardType a5,
-        typename CallbackParamTraits<A6>::ForwardType a6,
-        typename CallbackParamTraits<A7>::ForwardType a7) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
-                              CallbackForward(a3), CallbackForward(a4),
-                              CallbackForward(a5), CallbackForward(a6),
-                              CallbackForward(a7));
-  }
-
- private:
-  R (T::*method_)(A1, A2, A3, A4, A5, A6, A7);
-};
-
-// Const Method: Arity 7.
-template <typename R,
-          typename T,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6,
-          typename A7>
-class RunnableAdapter<R (T::*)(A1, A2, A3, A4, A5, A6, A7) const> {
- public:
-  typedef R(RunType)(const T*, A1, A2, A3, A4, A5, A6, A7);
-  typedef true_type IsMethod;
-
-  explicit RunnableAdapter(R (T::*method)(A1, A2, A3, A4, A5, A6, A7) const)
-      : method_(method) {}
-
-  R Run(const T* object,
-        typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3,
-        typename CallbackParamTraits<A4>::ForwardType a4,
-        typename CallbackParamTraits<A5>::ForwardType a5,
-        typename CallbackParamTraits<A6>::ForwardType a6,
-        typename CallbackParamTraits<A7>::ForwardType a7) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
-                              CallbackForward(a3), CallbackForward(a4),
-                              CallbackForward(a5), CallbackForward(a6),
-                              CallbackForward(a7));
-  }
-
- private:
-  R (T::*method_)(A1, A2, A3, A4, A5, A6, A7) const;
-};
-
-// FunctionTraits<>
-//
-// Breaks a function signature apart into typedefs for easier introspection.
-template <typename Sig>
-struct FunctionTraits;
-
-template <typename R>
-struct FunctionTraits<R()> {
-  typedef R ReturnType;
-};
-
-template <typename R, typename A1>
-struct FunctionTraits<R(A1)> {
-  typedef R ReturnType;
-  typedef A1 A1Type;
-};
-
-template <typename R, typename A1, typename A2>
-struct FunctionTraits<R(A1, A2)> {
-  typedef R ReturnType;
-  typedef A1 A1Type;
-  typedef A2 A2Type;
-};
-
-template <typename R, typename A1, typename A2, typename A3>
-struct FunctionTraits<R(A1, A2, A3)> {
-  typedef R ReturnType;
-  typedef A1 A1Type;
-  typedef A2 A2Type;
-  typedef A3 A3Type;
-};
-
-template <typename R, typename A1, typename A2, typename A3, typename A4>
-struct FunctionTraits<R(A1, A2, A3, A4)> {
-  typedef R ReturnType;
-  typedef A1 A1Type;
-  typedef A2 A2Type;
-  typedef A3 A3Type;
-  typedef A4 A4Type;
-};
-
-template <typename R,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5>
-struct FunctionTraits<R(A1, A2, A3, A4, A5)> {
-  typedef R ReturnType;
-  typedef A1 A1Type;
-  typedef A2 A2Type;
-  typedef A3 A3Type;
-  typedef A4 A4Type;
-  typedef A5 A5Type;
-};
-
-template <typename R,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6>
-struct FunctionTraits<R(A1, A2, A3, A4, A5, A6)> {
-  typedef R ReturnType;
-  typedef A1 A1Type;
-  typedef A2 A2Type;
-  typedef A3 A3Type;
-  typedef A4 A4Type;
-  typedef A5 A5Type;
-  typedef A6 A6Type;
-};
-
-template <typename R,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6,
-          typename A7>
-struct FunctionTraits<R(A1, A2, A3, A4, A5, A6, A7)> {
-  typedef R ReturnType;
-  typedef A1 A1Type;
-  typedef A2 A2Type;
-  typedef A3 A3Type;
-  typedef A4 A4Type;
-  typedef A5 A5Type;
-  typedef A6 A6Type;
-  typedef A7 A7Type;
-};
+// HasRefCountedTypeAsRawPtr inherits from true_type when any of the |Args| is a
+// raw pointer to a RefCounted type.
+template <typename... Ts>
+struct HasRefCountedTypeAsRawPtr
+    : std::disjunction<NeedsScopedRefptrButGetsRawPtr<Ts>...> {};
 
 // ForceVoidReturn<>
 //
@@ -799,2392 +370,1045 @@
 template <typename Sig>
 struct ForceVoidReturn;
 
-template <typename R>
-struct ForceVoidReturn<R()> {
-  typedef void(RunType)();
-};
-
-template <typename R, typename A1>
-struct ForceVoidReturn<R(A1)> {
-  typedef void(RunType)(A1);
-};
-
-template <typename R, typename A1, typename A2>
-struct ForceVoidReturn<R(A1, A2)> {
-  typedef void(RunType)(A1, A2);
-};
-
-template <typename R, typename A1, typename A2, typename A3>
-struct ForceVoidReturn<R(A1, A2, A3)> {
-  typedef void(RunType)(A1, A2, A3);
-};
-
-template <typename R, typename A1, typename A2, typename A3, typename A4>
-struct ForceVoidReturn<R(A1, A2, A3, A4)> {
-  typedef void(RunType)(A1, A2, A3, A4);
-};
-
-template <typename R,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5>
-struct ForceVoidReturn<R(A1, A2, A3, A4, A5)> {
-  typedef void(RunType)(A1, A2, A3, A4, A5);
-};
-
-template <typename R,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6>
-struct ForceVoidReturn<R(A1, A2, A3, A4, A5, A6)> {
-  typedef void(RunType)(A1, A2, A3, A4, A5, A6);
-};
-
-template <typename R,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6,
-          typename A7>
-struct ForceVoidReturn<R(A1, A2, A3, A4, A5, A6, A7)> {
-  typedef void(RunType)(A1, A2, A3, A4, A5, A6, A7);
+template <typename R, typename... Args>
+struct ForceVoidReturn<R(Args...)> {
+  using RunType = void(Args...);
 };
 
 // FunctorTraits<>
 //
 // See description at top of file.
-template <typename T>
-struct FunctorTraits {
-  typedef RunnableAdapter<T> RunnableType;
-  typedef typename RunnableType::RunType RunType;
-};
+template <typename Functor, typename SFINAE>
+struct FunctorTraits;
 
-template <typename T>
-struct FunctorTraits<IgnoreResultHelper<T>> {
-  typedef typename FunctorTraits<T>::RunnableType RunnableType;
-  typedef
-      typename ForceVoidReturn<typename RunnableType::RunType>::RunType RunType;
-};
-
-template <typename T>
-struct FunctorTraits<Callback<T>> {
-  typedef Callback<T> RunnableType;
-  typedef typename Callback<T>::RunType RunType;
-};
-
-// MakeRunnable<>
+// For empty callable types.
+// This specialization is intended to allow binding captureless lambdas, based
+// on the fact that captureless lambdas are empty while capturing lambdas are
+// not. This also allows any functors as far as it's an empty class.
+// Example:
 //
-// Converts a passed in functor to a RunnableType using type inference.
+//   // Captureless lambdas are allowed.
+//   []() {return 42;};
+//
+//   // Capturing lambdas are *not* allowed.
+//   int x;
+//   [x]() {return x;};
+//
+//   // Any empty class with operator() is allowed.
+//   struct Foo {
+//     void operator()() const {}
+//     // No non-static member variable and no virtual functions.
+//   };
+template <typename Functor>
+struct FunctorTraits<Functor,
+                     std::enable_if_t<IsCallableObject<Functor>::value &&
+                                      std::is_empty<Functor>::value>> {
+  using RunType = ExtractCallableRunType<Functor>;
+  static constexpr bool is_method = false;
+  static constexpr bool is_nullable = false;
+  static constexpr bool is_callback = false;
 
-template <typename T>
-typename FunctorTraits<T>::RunnableType MakeRunnable(const T& t) {
-  return RunnableAdapter<T>(t);
-}
+  template <typename RunFunctor, typename... RunArgs>
+  static ExtractReturnType<RunType> Invoke(RunFunctor&& functor,
+                                           RunArgs&&... args) {
+    return std::forward<RunFunctor>(functor)(std::forward<RunArgs>(args)...);
+  }
+};
 
-template <typename T>
-typename FunctorTraits<T>::RunnableType MakeRunnable(
-    const IgnoreResultHelper<T>& t) {
-  return MakeRunnable(t.functor_);
-}
+// For functions.
+template <typename R, typename... Args>
+struct FunctorTraits<R (*)(Args...)> {
+  using RunType = R(Args...);
+  static constexpr bool is_method = false;
+  static constexpr bool is_nullable = true;
+  static constexpr bool is_callback = false;
 
+  template <typename Function, typename... RunArgs>
+  static R Invoke(Function&& function, RunArgs&&... args) {
+    return std::forward<Function>(function)(std::forward<RunArgs>(args)...);
+  }
+};
+
+#if defined(OS_WIN) && !defined(ARCH_CPU_64_BITS)
+
+// For functions.
+template <typename R, typename... Args>
+struct FunctorTraits<R(__stdcall*)(Args...)> {
+  using RunType = R(Args...);
+  static constexpr bool is_method = false;
+  static constexpr bool is_nullable = true;
+  static constexpr bool is_callback = false;
+
+  template <typename... RunArgs>
+  static R Invoke(R(__stdcall* function)(Args...), RunArgs&&... args) {
+    return function(std::forward<RunArgs>(args)...);
+  }
+};
+
+// For functions.
+template <typename R, typename... Args>
+struct FunctorTraits<R(__fastcall*)(Args...)> {
+  using RunType = R(Args...);
+  static constexpr bool is_method = false;
+  static constexpr bool is_nullable = true;
+  static constexpr bool is_callback = false;
+
+  template <typename... RunArgs>
+  static R Invoke(R(__fastcall* function)(Args...), RunArgs&&... args) {
+    return function(std::forward<RunArgs>(args)...);
+  }
+};
+
+#endif  // defined(OS_WIN) && !defined(ARCH_CPU_64_BITS)
+
+#if defined(OS_APPLE)
+
+// Support for Objective-C blocks. There are two implementation depending
+// on whether Automated Reference Counting (ARC) is enabled. When ARC is
+// enabled, then the block itself can be bound as the compiler will ensure
+// its lifetime will be correctly managed. Otherwise, require the block to
+// be wrapped in a base::mac::ScopedBlock (via base::RetainBlock) that will
+// correctly manage the block lifetime.
+//
+// The two implementation ensure that the One Definition Rule (ODR) is not
+// broken (it is not possible to write a template base::RetainBlock that would
+// work correctly both with ARC enabled and disabled).
+
+#if HAS_FEATURE(objc_arc)
+
+template <typename R, typename... Args>
+struct FunctorTraits<R (^)(Args...)> {
+  using RunType = R(Args...);
+  static constexpr bool is_method = false;
+  static constexpr bool is_nullable = true;
+  static constexpr bool is_callback = false;
+
+  template <typename BlockType, typename... RunArgs>
+  static R Invoke(BlockType&& block, RunArgs&&... args) {
+    // According to LLVM documentation (6.3), "local variables of automatic
+    // storage duration do not have precise lifetime." Use objc_precise_lifetime
+    // to ensure that the Objective-C block is not deallocated until it has
+    // finished executing even if the Callback<> is destroyed during the block
+    // execution.
+    // https://clang.llvm.org/docs/AutomaticReferenceCounting.html#precise-lifetime-semantics
+    __attribute__((objc_precise_lifetime)) R (^scoped_block)(Args...) = block;
+    return scoped_block(std::forward<RunArgs>(args)...);
+  }
+};
+
+#else  // HAS_FEATURE(objc_arc)
+
+template <typename R, typename... Args>
+struct FunctorTraits<base::mac::ScopedBlock<R (^)(Args...)>> {
+  using RunType = R(Args...);
+  static constexpr bool is_method = false;
+  static constexpr bool is_nullable = true;
+  static constexpr bool is_callback = false;
+
+  template <typename BlockType, typename... RunArgs>
+  static R Invoke(BlockType&& block, RunArgs&&... args) {
+    // Copy the block to ensure that the Objective-C block is not deallocated
+    // until it has finished executing even if the Callback<> is destroyed
+    // during the block execution.
+    base::mac::ScopedBlock<R (^)(Args...)> scoped_block(block);
+    return scoped_block.get()(std::forward<RunArgs>(args)...);
+  }
+};
+
+#endif  // HAS_FEATURE(objc_arc)
+#endif  // defined(OS_APPLE)
+
+// For methods.
+template <typename R, typename Receiver, typename... Args>
+struct FunctorTraits<R (Receiver::*)(Args...)> {
+  using RunType = R(Receiver*, Args...);
+  static constexpr bool is_method = true;
+  static constexpr bool is_nullable = true;
+  static constexpr bool is_callback = false;
+
+  template <typename Method, typename ReceiverPtr, typename... RunArgs>
+  static R Invoke(Method method,
+                  ReceiverPtr&& receiver_ptr,
+                  RunArgs&&... args) {
+    return ((*receiver_ptr).*method)(std::forward<RunArgs>(args)...);
+  }
+};
+
+// For const methods.
+template <typename R, typename Receiver, typename... Args>
+struct FunctorTraits<R (Receiver::*)(Args...) const> {
+  using RunType = R(const Receiver*, Args...);
+  static constexpr bool is_method = true;
+  static constexpr bool is_nullable = true;
+  static constexpr bool is_callback = false;
+
+  template <typename Method, typename ReceiverPtr, typename... RunArgs>
+  static R Invoke(Method method,
+                  ReceiverPtr&& receiver_ptr,
+                  RunArgs&&... args) {
+    return ((*receiver_ptr).*method)(std::forward<RunArgs>(args)...);
+  }
+};
+
+#if defined(OS_WIN) && !defined(ARCH_CPU_64_BITS)
+
+// For __stdcall methods.
+template <typename R, typename Receiver, typename... Args>
+struct FunctorTraits<R (__stdcall Receiver::*)(Args...)> {
+  using RunType = R(Receiver*, Args...);
+  static constexpr bool is_method = true;
+  static constexpr bool is_nullable = true;
+  static constexpr bool is_callback = false;
+
+  template <typename Method, typename ReceiverPtr, typename... RunArgs>
+  static R Invoke(Method method,
+                  ReceiverPtr&& receiver_ptr,
+                  RunArgs&&... args) {
+    return ((*receiver_ptr).*method)(std::forward<RunArgs>(args)...);
+  }
+};
+
+// For __stdcall const methods.
+template <typename R, typename Receiver, typename... Args>
+struct FunctorTraits<R (__stdcall Receiver::*)(Args...) const> {
+  using RunType = R(const Receiver*, Args...);
+  static constexpr bool is_method = true;
+  static constexpr bool is_nullable = true;
+  static constexpr bool is_callback = false;
+
+  template <typename Method, typename ReceiverPtr, typename... RunArgs>
+  static R Invoke(Method method,
+                  ReceiverPtr&& receiver_ptr,
+                  RunArgs&&... args) {
+    return ((*receiver_ptr).*method)(std::forward<RunArgs>(args)...);
+  }
+};
+
+#endif  // defined(OS_WIN) && !defined(ARCH_CPU_64_BITS)
+
+#ifdef __cpp_noexcept_function_type
+// noexcept makes a distinct function type in C++17.
+// I.e. `void(*)()` and `void(*)() noexcept` are same in pre-C++17, and
+// different in C++17.
+template <typename R, typename... Args>
+struct FunctorTraits<R (*)(Args...) noexcept> : FunctorTraits<R (*)(Args...)> {
+};
+
+template <typename R, typename Receiver, typename... Args>
+struct FunctorTraits<R (Receiver::*)(Args...) noexcept>
+    : FunctorTraits<R (Receiver::*)(Args...)> {};
+
+template <typename R, typename Receiver, typename... Args>
+struct FunctorTraits<R (Receiver::*)(Args...) const noexcept>
+    : FunctorTraits<R (Receiver::*)(Args...) const> {};
+#endif
+
+// For IgnoreResults.
 template <typename T>
-const typename FunctorTraits<Callback<T>>::RunnableType& MakeRunnable(
-    const Callback<T>& t) {
-  DCHECK(!t.is_null());
-  return t;
-}
+struct FunctorTraits<IgnoreResultHelper<T>> : FunctorTraits<T> {
+  using RunType =
+      typename ForceVoidReturn<typename FunctorTraits<T>::RunType>::RunType;
+
+  template <typename IgnoreResultType, typename... RunArgs>
+  static void Invoke(IgnoreResultType&& ignore_result_helper,
+                     RunArgs&&... args) {
+    FunctorTraits<T>::Invoke(
+        std::forward<IgnoreResultType>(ignore_result_helper).functor_,
+        std::forward<RunArgs>(args)...);
+  }
+};
+
+// For OnceCallbacks.
+template <typename R, typename... Args>
+struct FunctorTraits<OnceCallback<R(Args...)>> {
+  using RunType = R(Args...);
+  static constexpr bool is_method = false;
+  static constexpr bool is_nullable = true;
+  static constexpr bool is_callback = true;
+
+  template <typename CallbackType, typename... RunArgs>
+  static R Invoke(CallbackType&& callback, RunArgs&&... args) {
+    DCHECK(!callback.is_null());
+    return std::forward<CallbackType>(callback).Run(
+        std::forward<RunArgs>(args)...);
+  }
+};
+
+// For RepeatingCallbacks.
+template <typename R, typename... Args>
+struct FunctorTraits<RepeatingCallback<R(Args...)>> {
+  using RunType = R(Args...);
+  static constexpr bool is_method = false;
+  static constexpr bool is_nullable = true;
+  static constexpr bool is_callback = true;
+
+  template <typename CallbackType, typename... RunArgs>
+  static R Invoke(CallbackType&& callback, RunArgs&&... args) {
+    DCHECK(!callback.is_null());
+    return std::forward<CallbackType>(callback).Run(
+        std::forward<RunArgs>(args)...);
+  }
+};
+
+template <typename Functor>
+using MakeFunctorTraits = FunctorTraits<std::decay_t<Functor>>;
 
 // InvokeHelper<>
 //
-// There are 3 logical InvokeHelper<> specializations: normal, void-return,
-// WeakCalls.
+// There are 2 logical InvokeHelper<> specializations: normal, WeakCalls.
 //
 // The normal type just calls the underlying runnable.
 //
-// We need a InvokeHelper to handle void return types in order to support
-// IgnoreResult().  Normally, if the Runnable's RunType had a void return,
-// the template system would just accept "return functor.Run()" ignoring
-// the fact that a void function is being used with return. This piece of
-// sugar breaks though when the Runnable's RunType is not void.  Thus, we
-// need a partial specialization to change the syntax to drop the "return"
-// from the invocation call.
-//
-// WeakCalls similarly need special syntax that is applied to the first
-// argument to check if they should no-op themselves.
-template <bool IsWeakCall,
-          typename ReturnType,
-          typename Runnable,
-          typename ArgsType>
+// WeakCalls need special syntax that is applied to the first argument to check
+// if they should no-op themselves.
+template <bool is_weak_call, typename ReturnType>
 struct InvokeHelper;
 
-template <typename ReturnType, typename Runnable>
-struct InvokeHelper<false, ReturnType, Runnable, void()> {
-  static ReturnType MakeItSo(Runnable runnable) { return runnable.Run(); }
-};
-
-template <typename Runnable>
-struct InvokeHelper<false, void, Runnable, void()> {
-  static void MakeItSo(Runnable runnable) { runnable.Run(); }
-};
-
-template <typename ReturnType, typename Runnable, typename A1>
-struct InvokeHelper<false, ReturnType, Runnable, void(A1)> {
-  static ReturnType MakeItSo(Runnable runnable, A1 a1) {
-    return runnable.Run(CallbackForward(a1));
+template <typename ReturnType>
+struct InvokeHelper<false, ReturnType> {
+  template <typename Functor, typename... RunArgs>
+  static inline ReturnType MakeItSo(Functor&& functor, RunArgs&&... args) {
+    using Traits = MakeFunctorTraits<Functor>;
+    return Traits::Invoke(std::forward<Functor>(functor),
+                          std::forward<RunArgs>(args)...);
   }
 };
 
-template <typename Runnable, typename A1>
-struct InvokeHelper<false, void, Runnable, void(A1)> {
-  static void MakeItSo(Runnable runnable, A1 a1) {
-    runnable.Run(CallbackForward(a1));
-  }
-};
-
-template <typename Runnable, typename BoundWeakPtr>
-struct InvokeHelper<true, void, Runnable, void(BoundWeakPtr)> {
-  static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr) {
-    if (!weak_ptr.get()) {
-      return;
-    }
-    runnable.Run(weak_ptr.get());
-  }
-};
-
-template <typename ReturnType, typename Runnable, typename A1, typename A2>
-struct InvokeHelper<false, ReturnType, Runnable, void(A1, A2)> {
-  static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2) {
-    return runnable.Run(CallbackForward(a1), CallbackForward(a2));
-  }
-};
-
-template <typename Runnable, typename A1, typename A2>
-struct InvokeHelper<false, void, Runnable, void(A1, A2)> {
-  static void MakeItSo(Runnable runnable, A1 a1, A2 a2) {
-    runnable.Run(CallbackForward(a1), CallbackForward(a2));
-  }
-};
-
-template <typename Runnable, typename BoundWeakPtr, typename A2>
-struct InvokeHelper<true, void, Runnable, void(BoundWeakPtr, A2)> {
-  static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2) {
-    if (!weak_ptr.get()) {
-      return;
-    }
-    runnable.Run(weak_ptr.get(), CallbackForward(a2));
-  }
-};
-
-template <typename ReturnType,
-          typename Runnable,
-          typename A1,
-          typename A2,
-          typename A3>
-struct InvokeHelper<false, ReturnType, Runnable, void(A1, A2, A3)> {
-  static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3) {
-    return runnable.Run(CallbackForward(a1), CallbackForward(a2),
-                        CallbackForward(a3));
-  }
-};
-
-template <typename Runnable, typename A1, typename A2, typename A3>
-struct InvokeHelper<false, void, Runnable, void(A1, A2, A3)> {
-  static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3) {
-    runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3));
-  }
-};
-
-template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3>
-struct InvokeHelper<true, void, Runnable, void(BoundWeakPtr, A2, A3)> {
-  static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3) {
-    if (!weak_ptr.get()) {
-      return;
-    }
-    runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3));
-  }
-};
-
-template <typename ReturnType,
-          typename Runnable,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4>
-struct InvokeHelper<false, ReturnType, Runnable, void(A1, A2, A3, A4)> {
-  static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4) {
-    return runnable.Run(CallbackForward(a1), CallbackForward(a2),
-                        CallbackForward(a3), CallbackForward(a4));
-  }
-};
-
-template <typename Runnable, typename A1, typename A2, typename A3, typename A4>
-struct InvokeHelper<false, void, Runnable, void(A1, A2, A3, A4)> {
-  static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4) {
-    runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3),
-                 CallbackForward(a4));
-  }
-};
-
-template <typename Runnable,
-          typename BoundWeakPtr,
-          typename A2,
-          typename A3,
-          typename A4>
-struct InvokeHelper<true, void, Runnable, void(BoundWeakPtr, A2, A3, A4)> {
-  static void MakeItSo(Runnable runnable,
-                       BoundWeakPtr weak_ptr,
-                       A2 a2,
-                       A3 a3,
-                       A4 a4) {
-    if (!weak_ptr.get()) {
-      return;
-    }
-    runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3),
-                 CallbackForward(a4));
-  }
-};
-
-template <typename ReturnType,
-          typename Runnable,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5>
-struct InvokeHelper<false, ReturnType, Runnable, void(A1, A2, A3, A4, A5)> {
-  static ReturnType MakeItSo(Runnable runnable,
-                             A1 a1,
-                             A2 a2,
-                             A3 a3,
-                             A4 a4,
-                             A5 a5) {
-    return runnable.Run(CallbackForward(a1), CallbackForward(a2),
-                        CallbackForward(a3), CallbackForward(a4),
-                        CallbackForward(a5));
-  }
-};
-
-template <typename Runnable,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5>
-struct InvokeHelper<false, void, Runnable, void(A1, A2, A3, A4, A5)> {
-  static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
-    runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3),
-                 CallbackForward(a4), CallbackForward(a5));
-  }
-};
-
-template <typename Runnable,
-          typename BoundWeakPtr,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5>
-struct InvokeHelper<true, void, Runnable, void(BoundWeakPtr, A2, A3, A4, A5)> {
-  static void MakeItSo(Runnable runnable,
-                       BoundWeakPtr weak_ptr,
-                       A2 a2,
-                       A3 a3,
-                       A4 a4,
-                       A5 a5) {
-    if (!weak_ptr.get()) {
-      return;
-    }
-    runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3),
-                 CallbackForward(a4), CallbackForward(a5));
-  }
-};
-
-template <typename ReturnType,
-          typename Runnable,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6>
-struct InvokeHelper<false, ReturnType, Runnable, void(A1, A2, A3, A4, A5, A6)> {
-  static ReturnType
-  MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {
-    return runnable.Run(CallbackForward(a1), CallbackForward(a2),
-                        CallbackForward(a3), CallbackForward(a4),
-                        CallbackForward(a5), CallbackForward(a6));
-  }
-};
-
-template <typename Runnable,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6>
-struct InvokeHelper<false, void, Runnable, void(A1, A2, A3, A4, A5, A6)> {
-  static void
-  MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {
-    runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3),
-                 CallbackForward(a4), CallbackForward(a5), CallbackForward(a6));
-  }
-};
-
-template <typename Runnable,
-          typename BoundWeakPtr,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6>
-struct InvokeHelper<true,
-                    void,
-                    Runnable,
-                    void(BoundWeakPtr, A2, A3, A4, A5, A6)> {
-  static void MakeItSo(Runnable runnable,
-                       BoundWeakPtr weak_ptr,
-                       A2 a2,
-                       A3 a3,
-                       A4 a4,
-                       A5 a5,
-                       A6 a6) {
-    if (!weak_ptr.get()) {
-      return;
-    }
-    runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3),
-                 CallbackForward(a4), CallbackForward(a5), CallbackForward(a6));
-  }
-};
-
-template <typename ReturnType,
-          typename Runnable,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6,
-          typename A7>
-struct InvokeHelper<false,
-                    ReturnType,
-                    Runnable,
-                    void(A1, A2, A3, A4, A5, A6, A7)> {
-  static ReturnType
-  MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) {
-    return runnable.Run(CallbackForward(a1), CallbackForward(a2),
-                        CallbackForward(a3), CallbackForward(a4),
-                        CallbackForward(a5), CallbackForward(a6),
-                        CallbackForward(a7));
-  }
-};
-
-template <typename Runnable,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6,
-          typename A7>
-struct InvokeHelper<false, void, Runnable, void(A1, A2, A3, A4, A5, A6, A7)> {
-  static void
-  MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) {
-    runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3),
-                 CallbackForward(a4), CallbackForward(a5), CallbackForward(a6),
-                 CallbackForward(a7));
-  }
-};
-
-template <typename Runnable,
-          typename BoundWeakPtr,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6,
-          typename A7>
-struct InvokeHelper<true,
-                    void,
-                    Runnable,
-                    void(BoundWeakPtr, A2, A3, A4, A5, A6, A7)> {
-  static void MakeItSo(Runnable runnable,
-                       BoundWeakPtr weak_ptr,
-                       A2 a2,
-                       A3 a3,
-                       A4 a4,
-                       A5 a5,
-                       A6 a6,
-                       A7 a7) {
-    if (!weak_ptr.get()) {
-      return;
-    }
-    runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3),
-                 CallbackForward(a4), CallbackForward(a5), CallbackForward(a6),
-                 CallbackForward(a7));
-  }
-};
-
-#if !defined(_MSC_VER)
-
-template <typename ReturnType, typename Runnable, typename ArgsType>
-struct InvokeHelper<true, ReturnType, Runnable, ArgsType> {
+template <typename ReturnType>
+struct InvokeHelper<true, ReturnType> {
   // WeakCalls are only supported for functions with a void return type.
-  // Otherwise, the function result would be undefined if the the WeakPtr<>
+  // Otherwise, the function result would be undefined if the WeakPtr<>
   // is invalidated.
-  COMPILE_ASSERT(is_void<ReturnType>::value,
-                 weak_ptrs_can_only_bind_to_methods_without_return_values);
-};
+  static_assert(std::is_void<ReturnType>::value,
+                "weak_ptrs can only bind to methods without return values");
 
-#endif
+  template <typename Functor, typename BoundWeakPtr, typename... RunArgs>
+  static inline void MakeItSo(Functor&& functor,
+                              BoundWeakPtr&& weak_ptr,
+                              RunArgs&&... args) {
+    if (!weak_ptr) {
+      return;
+    }
+    using Traits = MakeFunctorTraits<Functor>;
+    Traits::Invoke(std::forward<Functor>(functor),
+                   std::forward<BoundWeakPtr>(weak_ptr),
+                   std::forward<RunArgs>(args)...);
+  }
+};
 
 // Invoker<>
 //
 // See description at the top of the file.
-template <int NumBound, typename Storage, typename RunType>
+template <typename StorageType, typename UnboundRunType>
 struct Invoker;
 
-// Arity 0 -> 0.
-template <typename StorageType, typename R>
-struct Invoker<0, StorageType, R()> {
-  typedef R(RunType)(BindStateBase*);
-
-  typedef R(UnboundRunType)();
-
-  static R Run(BindStateBase* base) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
+template <typename StorageType, typename R, typename... UnboundArgs>
+struct Invoker<StorageType, R(UnboundArgs...)> {
+  static R RunOnce(BindStateBase* base,
+                   PassingType<UnboundArgs>... unbound_args) {
     // Local references to make debugger stepping easier. If in a debugger,
     // you really want to warp ahead and step through the
     // InvokeHelper<>::MakeItSo() call below.
-
-    return InvokeHelper<StorageType::IsWeakCall::value, R,
-                        typename StorageType::RunnableType,
-                        void()>::MakeItSo(storage->runnable_);
-  }
-};
-
-// Arity 1 -> 1.
-template <typename StorageType, typename R, typename X1>
-struct Invoker<0, StorageType, R(X1)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X1>::ForwardType);
-
-  typedef R(UnboundRunType)(X1);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X1>::ForwardType x1) {
     StorageType* storage = static_cast<StorageType*>(base);
+    static constexpr size_t num_bound_args =
+        std::tuple_size<decltype(storage->bound_args_)>::value;
+    return RunImpl(std::move(storage->functor_),
+                   std::move(storage->bound_args_),
+                   std::make_index_sequence<num_bound_args>(),
+                   std::forward<UnboundArgs>(unbound_args)...);
+  }
 
+  static R Run(BindStateBase* base, PassingType<UnboundArgs>... unbound_args) {
     // Local references to make debugger stepping easier. If in a debugger,
     // you really want to warp ahead and step through the
     // InvokeHelper<>::MakeItSo() call below.
+    const StorageType* storage = static_cast<StorageType*>(base);
+    static constexpr size_t num_bound_args =
+        std::tuple_size<decltype(storage->bound_args_)>::value;
+    return RunImpl(storage->functor_, storage->bound_args_,
+                   std::make_index_sequence<num_bound_args>(),
+                   std::forward<UnboundArgs>(unbound_args)...);
+  }
 
-    return InvokeHelper<StorageType::IsWeakCall::value, R,
-                        typename StorageType::RunnableType,
-                        void(typename CallbackParamTraits<X1>::ForwardType
-                                 x1)>::MakeItSo(storage->runnable_,
-                                                CallbackForward(x1));
+ private:
+  template <typename Functor, typename BoundArgsTuple, size_t... indices>
+  static inline R RunImpl(Functor&& functor,
+                          BoundArgsTuple&& bound,
+                          std::index_sequence<indices...>,
+                          UnboundArgs&&... unbound_args) {
+    static constexpr bool is_method = MakeFunctorTraits<Functor>::is_method;
+
+    using DecayedArgsTuple = std::decay_t<BoundArgsTuple>;
+    static constexpr bool is_weak_call =
+        IsWeakMethod<is_method,
+                     std::tuple_element_t<indices, DecayedArgsTuple>...>();
+
+    return InvokeHelper<is_weak_call, R>::MakeItSo(
+        std::forward<Functor>(functor),
+        Unwrap(std::get<indices>(std::forward<BoundArgsTuple>(bound)))...,
+        std::forward<UnboundArgs>(unbound_args)...);
   }
 };
 
-// Arity 1 -> 0.
-template <typename StorageType, typename R, typename X1>
-struct Invoker<1, StorageType, R(X1)> {
-  typedef R(RunType)(BindStateBase*);
+// Extracts necessary type info from Functor and BoundArgs.
+// Used to implement MakeUnboundRunType, BindOnce and BindRepeating.
+template <typename Functor, typename... BoundArgs>
+struct BindTypeHelper {
+  static constexpr size_t num_bounds = sizeof...(BoundArgs);
+  using FunctorTraits = MakeFunctorTraits<Functor>;
 
-  typedef R(UnboundRunType)();
+  // Example:
+  //   When Functor is `double (Foo::*)(int, const std::string&)`, and BoundArgs
+  //   is a template pack of `Foo*` and `int16_t`:
+  //    - RunType is `double(Foo*, int, const std::string&)`,
+  //    - ReturnType is `double`,
+  //    - RunParamsList is `TypeList<Foo*, int, const std::string&>`,
+  //    - BoundParamsList is `TypeList<Foo*, int>`,
+  //    - UnboundParamsList is `TypeList<const std::string&>`,
+  //    - BoundArgsList is `TypeList<Foo*, int16_t>`,
+  //    - UnboundRunType is `double(const std::string&)`.
+  using RunType = typename FunctorTraits::RunType;
+  using ReturnType = ExtractReturnType<RunType>;
 
-  static R Run(BindStateBase* base) {
-    StorageType* storage = static_cast<StorageType*>(base);
+  using RunParamsList = ExtractArgs<RunType>;
+  using BoundParamsList = TakeTypeListItem<num_bounds, RunParamsList>;
+  using UnboundParamsList = DropTypeListItem<num_bounds, RunParamsList>;
 
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
+  using BoundArgsList = TypeList<BoundArgs...>;
 
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    return InvokeHelper<StorageType::IsWeakCall::value, R,
-                        typename StorageType::RunnableType,
-                        void(typename Bound1UnwrapTraits::ForwardType)>::
-        MakeItSo(storage->runnable_, CallbackForward(x1));
-  }
+  using UnboundRunType = MakeFunctionType<ReturnType, UnboundParamsList>;
 };
 
-// Arity 2 -> 2.
-template <typename StorageType, typename R, typename X1, typename X2>
-struct Invoker<0, StorageType, R(X1, X2)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X1>::ForwardType,
-                     typename CallbackParamTraits<X2>::ForwardType);
+template <typename Functor>
+std::enable_if_t<FunctorTraits<Functor>::is_nullable, bool> IsNull(
+    const Functor& functor) {
+  return !functor;
+}
 
-  typedef R(UnboundRunType)(X1, X2);
+template <typename Functor>
+std::enable_if_t<!FunctorTraits<Functor>::is_nullable, bool> IsNull(
+    const Functor&) {
+  return false;
+}
 
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X1>::ForwardType x1,
-               typename CallbackParamTraits<X2>::ForwardType x2) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-
-    return InvokeHelper<StorageType::IsWeakCall::value, R,
-                        typename StorageType::RunnableType,
-                        void(typename CallbackParamTraits<X1>::ForwardType x1,
-                             typename CallbackParamTraits<X2>::ForwardType
-                                 x2)>::MakeItSo(storage->runnable_,
-                                                CallbackForward(x1),
-                                                CallbackForward(x2));
+// Used by QueryCancellationTraits below.
+template <typename Functor, typename BoundArgsTuple, size_t... indices>
+bool QueryCancellationTraitsImpl(BindStateBase::CancellationQueryMode mode,
+                                 const Functor& functor,
+                                 const BoundArgsTuple& bound_args,
+                                 std::index_sequence<indices...>) {
+  switch (mode) {
+    case BindStateBase::IS_CANCELLED:
+      return CallbackCancellationTraits<Functor, BoundArgsTuple>::IsCancelled(
+          functor, std::get<indices>(bound_args)...);
+    case BindStateBase::MAYBE_VALID:
+      return CallbackCancellationTraits<Functor, BoundArgsTuple>::MaybeValid(
+          functor, std::get<indices>(bound_args)...);
   }
-};
+  NOTREACHED();
+  return false;
+}
 
-// Arity 2 -> 1.
-template <typename StorageType, typename R, typename X1, typename X2>
-struct Invoker<1, StorageType, R(X1, X2)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X2>::ForwardType);
+// Relays |base| to corresponding CallbackCancellationTraits<>::Run(). Returns
+// true if the callback |base| represents is canceled.
+template <typename BindStateType>
+bool QueryCancellationTraits(const BindStateBase* base,
+                             BindStateBase::CancellationQueryMode mode) {
+  const BindStateType* storage = static_cast<const BindStateType*>(base);
+  static constexpr size_t num_bound_args =
+      std::tuple_size<decltype(storage->bound_args_)>::value;
+  return QueryCancellationTraitsImpl(
+      mode, storage->functor_, storage->bound_args_,
+      std::make_index_sequence<num_bound_args>());
+}
 
-  typedef R(UnboundRunType)(X2);
+// The base case of BanUnconstructedRefCountedReceiver that checks nothing.
+template <typename Functor, typename Receiver, typename... Unused>
+std::enable_if_t<
+    !(MakeFunctorTraits<Functor>::is_method &&
+      std::is_pointer<std::decay_t<Receiver>>::value &&
+      IsRefCountedType<std::remove_pointer_t<std::decay_t<Receiver>>>::value)>
+BanUnconstructedRefCountedReceiver(const Receiver& receiver, Unused&&...) {}
 
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X2>::ForwardType x2) {
-    StorageType* storage = static_cast<StorageType*>(base);
+template <typename Functor>
+void BanUnconstructedRefCountedReceiver() {}
 
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
+// Asserts that Callback is not the first owner of a ref-counted receiver.
+template <typename Functor, typename Receiver, typename... Unused>
+std::enable_if_t<
+    MakeFunctorTraits<Functor>::is_method &&
+    std::is_pointer<std::decay_t<Receiver>>::value &&
+    IsRefCountedType<std::remove_pointer_t<std::decay_t<Receiver>>>::value>
+BanUnconstructedRefCountedReceiver(const Receiver& receiver, Unused&&...) {
+  DCHECK(receiver);
 
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    return InvokeHelper<StorageType::IsWeakCall::value, R,
-                        typename StorageType::RunnableType,
-                        void(typename Bound1UnwrapTraits::ForwardType,
-                             typename CallbackParamTraits<X2>::ForwardType
-                                 x2)>::MakeItSo(storage->runnable_,
-                                                CallbackForward(x1),
-                                                CallbackForward(x2));
-  }
-};
-
-// Arity 2 -> 0.
-template <typename StorageType, typename R, typename X1, typename X2>
-struct Invoker<2, StorageType, R(X1, X2)> {
-  typedef R(RunType)(BindStateBase*);
-
-  typedef R(UnboundRunType)();
-
-  static R Run(BindStateBase* base) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    return InvokeHelper<StorageType::IsWeakCall::value, R,
-                        typename StorageType::RunnableType,
-                        void(typename Bound1UnwrapTraits::ForwardType,
-                             typename Bound2UnwrapTraits::ForwardType)>::
-        MakeItSo(storage->runnable_, CallbackForward(x1), CallbackForward(x2));
-  }
-};
-
-// Arity 3 -> 3.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3>
-struct Invoker<0, StorageType, R(X1, X2, X3)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X1>::ForwardType,
-                     typename CallbackParamTraits<X2>::ForwardType,
-                     typename CallbackParamTraits<X3>::ForwardType);
-
-  typedef R(UnboundRunType)(X1, X2, X3);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X1>::ForwardType x1,
-               typename CallbackParamTraits<X2>::ForwardType x2,
-               typename CallbackParamTraits<X3>::ForwardType x3) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-
-    return InvokeHelper<StorageType::IsWeakCall::value, R,
-                        typename StorageType::RunnableType,
-                        void(typename CallbackParamTraits<X1>::ForwardType x1,
-                             typename CallbackParamTraits<X2>::ForwardType x2,
-                             typename CallbackParamTraits<X3>::ForwardType
-                                 x3)>::MakeItSo(storage->runnable_,
-                                                CallbackForward(x1),
-                                                CallbackForward(x2),
-                                                CallbackForward(x3));
-  }
-};
-
-// Arity 3 -> 2.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3>
-struct Invoker<1, StorageType, R(X1, X2, X3)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X2>::ForwardType,
-                     typename CallbackParamTraits<X3>::ForwardType);
-
-  typedef R(UnboundRunType)(X2, X3);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X2>::ForwardType x2,
-               typename CallbackParamTraits<X3>::ForwardType x3) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    return InvokeHelper<StorageType::IsWeakCall::value, R,
-                        typename StorageType::RunnableType,
-                        void(typename Bound1UnwrapTraits::ForwardType,
-                             typename CallbackParamTraits<X2>::ForwardType x2,
-                             typename CallbackParamTraits<X3>::ForwardType
-                                 x3)>::MakeItSo(storage->runnable_,
-                                                CallbackForward(x1),
-                                                CallbackForward(x2),
-                                                CallbackForward(x3));
-  }
-};
-
-// Arity 3 -> 1.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3>
-struct Invoker<2, StorageType, R(X1, X2, X3)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X3>::ForwardType);
-
-  typedef R(UnboundRunType)(X3);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X3>::ForwardType x3) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    return InvokeHelper<StorageType::IsWeakCall::value, R,
-                        typename StorageType::RunnableType,
-                        void(typename Bound1UnwrapTraits::ForwardType,
-                             typename Bound2UnwrapTraits::ForwardType,
-                             typename CallbackParamTraits<X3>::ForwardType
-                                 x3)>::MakeItSo(storage->runnable_,
-                                                CallbackForward(x1),
-                                                CallbackForward(x2),
-                                                CallbackForward(x3));
-  }
-};
-
-// Arity 3 -> 0.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3>
-struct Invoker<3, StorageType, R(X1, X2, X3)> {
-  typedef R(RunType)(BindStateBase*);
-
-  typedef R(UnboundRunType)();
-
-  static R Run(BindStateBase* base) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-    typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    typename Bound3UnwrapTraits::ForwardType x3 =
-        Bound3UnwrapTraits::Unwrap(storage->p3_);
-    return InvokeHelper<StorageType::IsWeakCall::value, R,
-                        typename StorageType::RunnableType,
-                        void(typename Bound1UnwrapTraits::ForwardType,
-                             typename Bound2UnwrapTraits::ForwardType,
-                             typename Bound3UnwrapTraits::ForwardType)>::
-        MakeItSo(storage->runnable_, CallbackForward(x1), CallbackForward(x2),
-                 CallbackForward(x3));
-  }
-};
-
-// Arity 4 -> 4.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4>
-struct Invoker<0, StorageType, R(X1, X2, X3, X4)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X1>::ForwardType,
-                     typename CallbackParamTraits<X2>::ForwardType,
-                     typename CallbackParamTraits<X3>::ForwardType,
-                     typename CallbackParamTraits<X4>::ForwardType);
-
-  typedef R(UnboundRunType)(X1, X2, X3, X4);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X1>::ForwardType x1,
-               typename CallbackParamTraits<X2>::ForwardType x2,
-               typename CallbackParamTraits<X3>::ForwardType x3,
-               typename CallbackParamTraits<X4>::ForwardType x4) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-
-    return InvokeHelper<StorageType::IsWeakCall::value, R,
-                        typename StorageType::RunnableType,
-                        void(typename CallbackParamTraits<X1>::ForwardType x1,
-                             typename CallbackParamTraits<X2>::ForwardType x2,
-                             typename CallbackParamTraits<X3>::ForwardType x3,
-                             typename CallbackParamTraits<X4>::ForwardType
-                                 x4)>::MakeItSo(storage->runnable_,
-                                                CallbackForward(x1),
-                                                CallbackForward(x2),
-                                                CallbackForward(x3),
-                                                CallbackForward(x4));
-  }
-};
-
-// Arity 4 -> 3.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4>
-struct Invoker<1, StorageType, R(X1, X2, X3, X4)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X2>::ForwardType,
-                     typename CallbackParamTraits<X3>::ForwardType,
-                     typename CallbackParamTraits<X4>::ForwardType);
-
-  typedef R(UnboundRunType)(X2, X3, X4);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X2>::ForwardType x2,
-               typename CallbackParamTraits<X3>::ForwardType x3,
-               typename CallbackParamTraits<X4>::ForwardType x4) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    return InvokeHelper<StorageType::IsWeakCall::value, R,
-                        typename StorageType::RunnableType,
-                        void(typename Bound1UnwrapTraits::ForwardType,
-                             typename CallbackParamTraits<X2>::ForwardType x2,
-                             typename CallbackParamTraits<X3>::ForwardType x3,
-                             typename CallbackParamTraits<X4>::ForwardType
-                                 x4)>::MakeItSo(storage->runnable_,
-                                                CallbackForward(x1),
-                                                CallbackForward(x2),
-                                                CallbackForward(x3),
-                                                CallbackForward(x4));
-  }
-};
-
-// Arity 4 -> 2.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4>
-struct Invoker<2, StorageType, R(X1, X2, X3, X4)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X3>::ForwardType,
-                     typename CallbackParamTraits<X4>::ForwardType);
-
-  typedef R(UnboundRunType)(X3, X4);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X3>::ForwardType x3,
-               typename CallbackParamTraits<X4>::ForwardType x4) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    return InvokeHelper<StorageType::IsWeakCall::value, R,
-                        typename StorageType::RunnableType,
-                        void(typename Bound1UnwrapTraits::ForwardType,
-                             typename Bound2UnwrapTraits::ForwardType,
-                             typename CallbackParamTraits<X3>::ForwardType x3,
-                             typename CallbackParamTraits<X4>::ForwardType
-                                 x4)>::MakeItSo(storage->runnable_,
-                                                CallbackForward(x1),
-                                                CallbackForward(x2),
-                                                CallbackForward(x3),
-                                                CallbackForward(x4));
-  }
-};
-
-// Arity 4 -> 1.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4>
-struct Invoker<3, StorageType, R(X1, X2, X3, X4)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X4>::ForwardType);
-
-  typedef R(UnboundRunType)(X4);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X4>::ForwardType x4) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-    typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    typename Bound3UnwrapTraits::ForwardType x3 =
-        Bound3UnwrapTraits::Unwrap(storage->p3_);
-    return InvokeHelper<StorageType::IsWeakCall::value, R,
-                        typename StorageType::RunnableType,
-                        void(typename Bound1UnwrapTraits::ForwardType,
-                             typename Bound2UnwrapTraits::ForwardType,
-                             typename Bound3UnwrapTraits::ForwardType,
-                             typename CallbackParamTraits<X4>::ForwardType
-                                 x4)>::MakeItSo(storage->runnable_,
-                                                CallbackForward(x1),
-                                                CallbackForward(x2),
-                                                CallbackForward(x3),
-                                                CallbackForward(x4));
-  }
-};
-
-// Arity 4 -> 0.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4>
-struct Invoker<4, StorageType, R(X1, X2, X3, X4)> {
-  typedef R(RunType)(BindStateBase*);
-
-  typedef R(UnboundRunType)();
-
-  static R Run(BindStateBase* base) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-    typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
-    typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    typename Bound3UnwrapTraits::ForwardType x3 =
-        Bound3UnwrapTraits::Unwrap(storage->p3_);
-    typename Bound4UnwrapTraits::ForwardType x4 =
-        Bound4UnwrapTraits::Unwrap(storage->p4_);
-    return InvokeHelper<StorageType::IsWeakCall::value, R,
-                        typename StorageType::RunnableType,
-                        void(typename Bound1UnwrapTraits::ForwardType,
-                             typename Bound2UnwrapTraits::ForwardType,
-                             typename Bound3UnwrapTraits::ForwardType,
-                             typename Bound4UnwrapTraits::ForwardType)>::
-        MakeItSo(storage->runnable_, CallbackForward(x1), CallbackForward(x2),
-                 CallbackForward(x3), CallbackForward(x4));
-  }
-};
-
-// Arity 5 -> 5.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5>
-struct Invoker<0, StorageType, R(X1, X2, X3, X4, X5)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X1>::ForwardType,
-                     typename CallbackParamTraits<X2>::ForwardType,
-                     typename CallbackParamTraits<X3>::ForwardType,
-                     typename CallbackParamTraits<X4>::ForwardType,
-                     typename CallbackParamTraits<X5>::ForwardType);
-
-  typedef R(UnboundRunType)(X1, X2, X3, X4, X5);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X1>::ForwardType x1,
-               typename CallbackParamTraits<X2>::ForwardType x2,
-               typename CallbackParamTraits<X3>::ForwardType x3,
-               typename CallbackParamTraits<X4>::ForwardType x4,
-               typename CallbackParamTraits<X5>::ForwardType x5) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-
-    return InvokeHelper<
-        StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
-        void(typename CallbackParamTraits<X1>::ForwardType x1,
-             typename CallbackParamTraits<X2>::ForwardType x2,
-             typename CallbackParamTraits<X3>::ForwardType x3,
-             typename CallbackParamTraits<X4>::ForwardType x4,
-             typename CallbackParamTraits<X5>::ForwardType
-                 x5)>::MakeItSo(storage->runnable_, CallbackForward(x1),
-                                CallbackForward(x2), CallbackForward(x3),
-                                CallbackForward(x4), CallbackForward(x5));
-  }
-};
-
-// Arity 5 -> 4.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5>
-struct Invoker<1, StorageType, R(X1, X2, X3, X4, X5)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X2>::ForwardType,
-                     typename CallbackParamTraits<X3>::ForwardType,
-                     typename CallbackParamTraits<X4>::ForwardType,
-                     typename CallbackParamTraits<X5>::ForwardType);
-
-  typedef R(UnboundRunType)(X2, X3, X4, X5);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X2>::ForwardType x2,
-               typename CallbackParamTraits<X3>::ForwardType x3,
-               typename CallbackParamTraits<X4>::ForwardType x4,
-               typename CallbackParamTraits<X5>::ForwardType x5) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    return InvokeHelper<
-        StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
-        void(typename Bound1UnwrapTraits::ForwardType,
-             typename CallbackParamTraits<X2>::ForwardType x2,
-             typename CallbackParamTraits<X3>::ForwardType x3,
-             typename CallbackParamTraits<X4>::ForwardType x4,
-             typename CallbackParamTraits<X5>::ForwardType
-                 x5)>::MakeItSo(storage->runnable_, CallbackForward(x1),
-                                CallbackForward(x2), CallbackForward(x3),
-                                CallbackForward(x4), CallbackForward(x5));
-  }
-};
-
-// Arity 5 -> 3.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5>
-struct Invoker<2, StorageType, R(X1, X2, X3, X4, X5)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X3>::ForwardType,
-                     typename CallbackParamTraits<X4>::ForwardType,
-                     typename CallbackParamTraits<X5>::ForwardType);
-
-  typedef R(UnboundRunType)(X3, X4, X5);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X3>::ForwardType x3,
-               typename CallbackParamTraits<X4>::ForwardType x4,
-               typename CallbackParamTraits<X5>::ForwardType x5) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    return InvokeHelper<
-        StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
-        void(typename Bound1UnwrapTraits::ForwardType,
-             typename Bound2UnwrapTraits::ForwardType,
-             typename CallbackParamTraits<X3>::ForwardType x3,
-             typename CallbackParamTraits<X4>::ForwardType x4,
-             typename CallbackParamTraits<X5>::ForwardType
-                 x5)>::MakeItSo(storage->runnable_, CallbackForward(x1),
-                                CallbackForward(x2), CallbackForward(x3),
-                                CallbackForward(x4), CallbackForward(x5));
-  }
-};
-
-// Arity 5 -> 2.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5>
-struct Invoker<3, StorageType, R(X1, X2, X3, X4, X5)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X4>::ForwardType,
-                     typename CallbackParamTraits<X5>::ForwardType);
-
-  typedef R(UnboundRunType)(X4, X5);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X4>::ForwardType x4,
-               typename CallbackParamTraits<X5>::ForwardType x5) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-    typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    typename Bound3UnwrapTraits::ForwardType x3 =
-        Bound3UnwrapTraits::Unwrap(storage->p3_);
-    return InvokeHelper<
-        StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
-        void(typename Bound1UnwrapTraits::ForwardType,
-             typename Bound2UnwrapTraits::ForwardType,
-             typename Bound3UnwrapTraits::ForwardType,
-             typename CallbackParamTraits<X4>::ForwardType x4,
-             typename CallbackParamTraits<X5>::ForwardType
-                 x5)>::MakeItSo(storage->runnable_, CallbackForward(x1),
-                                CallbackForward(x2), CallbackForward(x3),
-                                CallbackForward(x4), CallbackForward(x5));
-  }
-};
-
-// Arity 5 -> 1.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5>
-struct Invoker<4, StorageType, R(X1, X2, X3, X4, X5)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X5>::ForwardType);
-
-  typedef R(UnboundRunType)(X5);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X5>::ForwardType x5) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-    typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
-    typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    typename Bound3UnwrapTraits::ForwardType x3 =
-        Bound3UnwrapTraits::Unwrap(storage->p3_);
-    typename Bound4UnwrapTraits::ForwardType x4 =
-        Bound4UnwrapTraits::Unwrap(storage->p4_);
-    return InvokeHelper<
-        StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
-        void(typename Bound1UnwrapTraits::ForwardType,
-             typename Bound2UnwrapTraits::ForwardType,
-             typename Bound3UnwrapTraits::ForwardType,
-             typename Bound4UnwrapTraits::ForwardType,
-             typename CallbackParamTraits<X5>::ForwardType
-                 x5)>::MakeItSo(storage->runnable_, CallbackForward(x1),
-                                CallbackForward(x2), CallbackForward(x3),
-                                CallbackForward(x4), CallbackForward(x5));
-  }
-};
-
-// Arity 5 -> 0.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5>
-struct Invoker<5, StorageType, R(X1, X2, X3, X4, X5)> {
-  typedef R(RunType)(BindStateBase*);
-
-  typedef R(UnboundRunType)();
-
-  static R Run(BindStateBase* base) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-    typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
-    typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
-    typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    typename Bound3UnwrapTraits::ForwardType x3 =
-        Bound3UnwrapTraits::Unwrap(storage->p3_);
-    typename Bound4UnwrapTraits::ForwardType x4 =
-        Bound4UnwrapTraits::Unwrap(storage->p4_);
-    typename Bound5UnwrapTraits::ForwardType x5 =
-        Bound5UnwrapTraits::Unwrap(storage->p5_);
-    return InvokeHelper<StorageType::IsWeakCall::value, R,
-                        typename StorageType::RunnableType,
-                        void(typename Bound1UnwrapTraits::ForwardType,
-                             typename Bound2UnwrapTraits::ForwardType,
-                             typename Bound3UnwrapTraits::ForwardType,
-                             typename Bound4UnwrapTraits::ForwardType,
-                             typename Bound5UnwrapTraits::ForwardType)>::
-        MakeItSo(storage->runnable_, CallbackForward(x1), CallbackForward(x2),
-                 CallbackForward(x3), CallbackForward(x4), CallbackForward(x5));
-  }
-};
-
-// Arity 6 -> 6.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5,
-          typename X6>
-struct Invoker<0, StorageType, R(X1, X2, X3, X4, X5, X6)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X1>::ForwardType,
-                     typename CallbackParamTraits<X2>::ForwardType,
-                     typename CallbackParamTraits<X3>::ForwardType,
-                     typename CallbackParamTraits<X4>::ForwardType,
-                     typename CallbackParamTraits<X5>::ForwardType,
-                     typename CallbackParamTraits<X6>::ForwardType);
-
-  typedef R(UnboundRunType)(X1, X2, X3, X4, X5, X6);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X1>::ForwardType x1,
-               typename CallbackParamTraits<X2>::ForwardType x2,
-               typename CallbackParamTraits<X3>::ForwardType x3,
-               typename CallbackParamTraits<X4>::ForwardType x4,
-               typename CallbackParamTraits<X5>::ForwardType x5,
-               typename CallbackParamTraits<X6>::ForwardType x6) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-
-    return InvokeHelper<
-        StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
-        void(typename CallbackParamTraits<X1>::ForwardType x1,
-             typename CallbackParamTraits<X2>::ForwardType x2,
-             typename CallbackParamTraits<X3>::ForwardType x3,
-             typename CallbackParamTraits<X4>::ForwardType x4,
-             typename CallbackParamTraits<X5>::ForwardType x5,
-             typename CallbackParamTraits<X6>::ForwardType
-                 x6)>::MakeItSo(storage->runnable_, CallbackForward(x1),
-                                CallbackForward(x2), CallbackForward(x3),
-                                CallbackForward(x4), CallbackForward(x5),
-                                CallbackForward(x6));
-  }
-};
-
-// Arity 6 -> 5.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5,
-          typename X6>
-struct Invoker<1, StorageType, R(X1, X2, X3, X4, X5, X6)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X2>::ForwardType,
-                     typename CallbackParamTraits<X3>::ForwardType,
-                     typename CallbackParamTraits<X4>::ForwardType,
-                     typename CallbackParamTraits<X5>::ForwardType,
-                     typename CallbackParamTraits<X6>::ForwardType);
-
-  typedef R(UnboundRunType)(X2, X3, X4, X5, X6);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X2>::ForwardType x2,
-               typename CallbackParamTraits<X3>::ForwardType x3,
-               typename CallbackParamTraits<X4>::ForwardType x4,
-               typename CallbackParamTraits<X5>::ForwardType x5,
-               typename CallbackParamTraits<X6>::ForwardType x6) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    return InvokeHelper<
-        StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
-        void(typename Bound1UnwrapTraits::ForwardType,
-             typename CallbackParamTraits<X2>::ForwardType x2,
-             typename CallbackParamTraits<X3>::ForwardType x3,
-             typename CallbackParamTraits<X4>::ForwardType x4,
-             typename CallbackParamTraits<X5>::ForwardType x5,
-             typename CallbackParamTraits<X6>::ForwardType
-                 x6)>::MakeItSo(storage->runnable_, CallbackForward(x1),
-                                CallbackForward(x2), CallbackForward(x3),
-                                CallbackForward(x4), CallbackForward(x5),
-                                CallbackForward(x6));
-  }
-};
-
-// Arity 6 -> 4.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5,
-          typename X6>
-struct Invoker<2, StorageType, R(X1, X2, X3, X4, X5, X6)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X3>::ForwardType,
-                     typename CallbackParamTraits<X4>::ForwardType,
-                     typename CallbackParamTraits<X5>::ForwardType,
-                     typename CallbackParamTraits<X6>::ForwardType);
-
-  typedef R(UnboundRunType)(X3, X4, X5, X6);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X3>::ForwardType x3,
-               typename CallbackParamTraits<X4>::ForwardType x4,
-               typename CallbackParamTraits<X5>::ForwardType x5,
-               typename CallbackParamTraits<X6>::ForwardType x6) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    return InvokeHelper<
-        StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
-        void(typename Bound1UnwrapTraits::ForwardType,
-             typename Bound2UnwrapTraits::ForwardType,
-             typename CallbackParamTraits<X3>::ForwardType x3,
-             typename CallbackParamTraits<X4>::ForwardType x4,
-             typename CallbackParamTraits<X5>::ForwardType x5,
-             typename CallbackParamTraits<X6>::ForwardType
-                 x6)>::MakeItSo(storage->runnable_, CallbackForward(x1),
-                                CallbackForward(x2), CallbackForward(x3),
-                                CallbackForward(x4), CallbackForward(x5),
-                                CallbackForward(x6));
-  }
-};
-
-// Arity 6 -> 3.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5,
-          typename X6>
-struct Invoker<3, StorageType, R(X1, X2, X3, X4, X5, X6)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X4>::ForwardType,
-                     typename CallbackParamTraits<X5>::ForwardType,
-                     typename CallbackParamTraits<X6>::ForwardType);
-
-  typedef R(UnboundRunType)(X4, X5, X6);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X4>::ForwardType x4,
-               typename CallbackParamTraits<X5>::ForwardType x5,
-               typename CallbackParamTraits<X6>::ForwardType x6) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-    typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    typename Bound3UnwrapTraits::ForwardType x3 =
-        Bound3UnwrapTraits::Unwrap(storage->p3_);
-    return InvokeHelper<
-        StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
-        void(typename Bound1UnwrapTraits::ForwardType,
-             typename Bound2UnwrapTraits::ForwardType,
-             typename Bound3UnwrapTraits::ForwardType,
-             typename CallbackParamTraits<X4>::ForwardType x4,
-             typename CallbackParamTraits<X5>::ForwardType x5,
-             typename CallbackParamTraits<X6>::ForwardType
-                 x6)>::MakeItSo(storage->runnable_, CallbackForward(x1),
-                                CallbackForward(x2), CallbackForward(x3),
-                                CallbackForward(x4), CallbackForward(x5),
-                                CallbackForward(x6));
-  }
-};
-
-// Arity 6 -> 2.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5,
-          typename X6>
-struct Invoker<4, StorageType, R(X1, X2, X3, X4, X5, X6)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X5>::ForwardType,
-                     typename CallbackParamTraits<X6>::ForwardType);
-
-  typedef R(UnboundRunType)(X5, X6);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X5>::ForwardType x5,
-               typename CallbackParamTraits<X6>::ForwardType x6) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-    typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
-    typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    typename Bound3UnwrapTraits::ForwardType x3 =
-        Bound3UnwrapTraits::Unwrap(storage->p3_);
-    typename Bound4UnwrapTraits::ForwardType x4 =
-        Bound4UnwrapTraits::Unwrap(storage->p4_);
-    return InvokeHelper<
-        StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
-        void(typename Bound1UnwrapTraits::ForwardType,
-             typename Bound2UnwrapTraits::ForwardType,
-             typename Bound3UnwrapTraits::ForwardType,
-             typename Bound4UnwrapTraits::ForwardType,
-             typename CallbackParamTraits<X5>::ForwardType x5,
-             typename CallbackParamTraits<X6>::ForwardType
-                 x6)>::MakeItSo(storage->runnable_, CallbackForward(x1),
-                                CallbackForward(x2), CallbackForward(x3),
-                                CallbackForward(x4), CallbackForward(x5),
-                                CallbackForward(x6));
-  }
-};
-
-// Arity 6 -> 1.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5,
-          typename X6>
-struct Invoker<5, StorageType, R(X1, X2, X3, X4, X5, X6)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X6>::ForwardType);
-
-  typedef R(UnboundRunType)(X6);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X6>::ForwardType x6) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-    typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
-    typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
-    typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    typename Bound3UnwrapTraits::ForwardType x3 =
-        Bound3UnwrapTraits::Unwrap(storage->p3_);
-    typename Bound4UnwrapTraits::ForwardType x4 =
-        Bound4UnwrapTraits::Unwrap(storage->p4_);
-    typename Bound5UnwrapTraits::ForwardType x5 =
-        Bound5UnwrapTraits::Unwrap(storage->p5_);
-    return InvokeHelper<
-        StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
-        void(typename Bound1UnwrapTraits::ForwardType,
-             typename Bound2UnwrapTraits::ForwardType,
-             typename Bound3UnwrapTraits::ForwardType,
-             typename Bound4UnwrapTraits::ForwardType,
-             typename Bound5UnwrapTraits::ForwardType,
-             typename CallbackParamTraits<X6>::ForwardType
-                 x6)>::MakeItSo(storage->runnable_, CallbackForward(x1),
-                                CallbackForward(x2), CallbackForward(x3),
-                                CallbackForward(x4), CallbackForward(x5),
-                                CallbackForward(x6));
-  }
-};
-
-// Arity 6 -> 0.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5,
-          typename X6>
-struct Invoker<6, StorageType, R(X1, X2, X3, X4, X5, X6)> {
-  typedef R(RunType)(BindStateBase*);
-
-  typedef R(UnboundRunType)();
-
-  static R Run(BindStateBase* base) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-    typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
-    typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
-    typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
-    typedef typename StorageType::Bound6UnwrapTraits Bound6UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    typename Bound3UnwrapTraits::ForwardType x3 =
-        Bound3UnwrapTraits::Unwrap(storage->p3_);
-    typename Bound4UnwrapTraits::ForwardType x4 =
-        Bound4UnwrapTraits::Unwrap(storage->p4_);
-    typename Bound5UnwrapTraits::ForwardType x5 =
-        Bound5UnwrapTraits::Unwrap(storage->p5_);
-    typename Bound6UnwrapTraits::ForwardType x6 =
-        Bound6UnwrapTraits::Unwrap(storage->p6_);
-    return InvokeHelper<StorageType::IsWeakCall::value, R,
-                        typename StorageType::RunnableType,
-                        void(typename Bound1UnwrapTraits::ForwardType,
-                             typename Bound2UnwrapTraits::ForwardType,
-                             typename Bound3UnwrapTraits::ForwardType,
-                             typename Bound4UnwrapTraits::ForwardType,
-                             typename Bound5UnwrapTraits::ForwardType,
-                             typename Bound6UnwrapTraits::ForwardType)>::
-        MakeItSo(storage->runnable_, CallbackForward(x1), CallbackForward(x2),
-                 CallbackForward(x3), CallbackForward(x4), CallbackForward(x5),
-                 CallbackForward(x6));
-  }
-};
-
-// Arity 7 -> 7.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5,
-          typename X6,
-          typename X7>
-struct Invoker<0, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X1>::ForwardType,
-                     typename CallbackParamTraits<X2>::ForwardType,
-                     typename CallbackParamTraits<X3>::ForwardType,
-                     typename CallbackParamTraits<X4>::ForwardType,
-                     typename CallbackParamTraits<X5>::ForwardType,
-                     typename CallbackParamTraits<X6>::ForwardType,
-                     typename CallbackParamTraits<X7>::ForwardType);
-
-  typedef R(UnboundRunType)(X1, X2, X3, X4, X5, X6, X7);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X1>::ForwardType x1,
-               typename CallbackParamTraits<X2>::ForwardType x2,
-               typename CallbackParamTraits<X3>::ForwardType x3,
-               typename CallbackParamTraits<X4>::ForwardType x4,
-               typename CallbackParamTraits<X5>::ForwardType x5,
-               typename CallbackParamTraits<X6>::ForwardType x6,
-               typename CallbackParamTraits<X7>::ForwardType x7) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-
-    return InvokeHelper<
-        StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
-        void(typename CallbackParamTraits<X1>::ForwardType x1,
-             typename CallbackParamTraits<X2>::ForwardType x2,
-             typename CallbackParamTraits<X3>::ForwardType x3,
-             typename CallbackParamTraits<X4>::ForwardType x4,
-             typename CallbackParamTraits<X5>::ForwardType x5,
-             typename CallbackParamTraits<X6>::ForwardType x6,
-             typename CallbackParamTraits<X7>::ForwardType
-                 x7)>::MakeItSo(storage->runnable_, CallbackForward(x1),
-                                CallbackForward(x2), CallbackForward(x3),
-                                CallbackForward(x4), CallbackForward(x5),
-                                CallbackForward(x6), CallbackForward(x7));
-  }
-};
-
-// Arity 7 -> 6.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5,
-          typename X6,
-          typename X7>
-struct Invoker<1, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X2>::ForwardType,
-                     typename CallbackParamTraits<X3>::ForwardType,
-                     typename CallbackParamTraits<X4>::ForwardType,
-                     typename CallbackParamTraits<X5>::ForwardType,
-                     typename CallbackParamTraits<X6>::ForwardType,
-                     typename CallbackParamTraits<X7>::ForwardType);
-
-  typedef R(UnboundRunType)(X2, X3, X4, X5, X6, X7);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X2>::ForwardType x2,
-               typename CallbackParamTraits<X3>::ForwardType x3,
-               typename CallbackParamTraits<X4>::ForwardType x4,
-               typename CallbackParamTraits<X5>::ForwardType x5,
-               typename CallbackParamTraits<X6>::ForwardType x6,
-               typename CallbackParamTraits<X7>::ForwardType x7) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    return InvokeHelper<
-        StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
-        void(typename Bound1UnwrapTraits::ForwardType,
-             typename CallbackParamTraits<X2>::ForwardType x2,
-             typename CallbackParamTraits<X3>::ForwardType x3,
-             typename CallbackParamTraits<X4>::ForwardType x4,
-             typename CallbackParamTraits<X5>::ForwardType x5,
-             typename CallbackParamTraits<X6>::ForwardType x6,
-             typename CallbackParamTraits<X7>::ForwardType
-                 x7)>::MakeItSo(storage->runnable_, CallbackForward(x1),
-                                CallbackForward(x2), CallbackForward(x3),
-                                CallbackForward(x4), CallbackForward(x5),
-                                CallbackForward(x6), CallbackForward(x7));
-  }
-};
-
-// Arity 7 -> 5.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5,
-          typename X6,
-          typename X7>
-struct Invoker<2, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X3>::ForwardType,
-                     typename CallbackParamTraits<X4>::ForwardType,
-                     typename CallbackParamTraits<X5>::ForwardType,
-                     typename CallbackParamTraits<X6>::ForwardType,
-                     typename CallbackParamTraits<X7>::ForwardType);
-
-  typedef R(UnboundRunType)(X3, X4, X5, X6, X7);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X3>::ForwardType x3,
-               typename CallbackParamTraits<X4>::ForwardType x4,
-               typename CallbackParamTraits<X5>::ForwardType x5,
-               typename CallbackParamTraits<X6>::ForwardType x6,
-               typename CallbackParamTraits<X7>::ForwardType x7) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    return InvokeHelper<
-        StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
-        void(typename Bound1UnwrapTraits::ForwardType,
-             typename Bound2UnwrapTraits::ForwardType,
-             typename CallbackParamTraits<X3>::ForwardType x3,
-             typename CallbackParamTraits<X4>::ForwardType x4,
-             typename CallbackParamTraits<X5>::ForwardType x5,
-             typename CallbackParamTraits<X6>::ForwardType x6,
-             typename CallbackParamTraits<X7>::ForwardType
-                 x7)>::MakeItSo(storage->runnable_, CallbackForward(x1),
-                                CallbackForward(x2), CallbackForward(x3),
-                                CallbackForward(x4), CallbackForward(x5),
-                                CallbackForward(x6), CallbackForward(x7));
-  }
-};
-
-// Arity 7 -> 4.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5,
-          typename X6,
-          typename X7>
-struct Invoker<3, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X4>::ForwardType,
-                     typename CallbackParamTraits<X5>::ForwardType,
-                     typename CallbackParamTraits<X6>::ForwardType,
-                     typename CallbackParamTraits<X7>::ForwardType);
-
-  typedef R(UnboundRunType)(X4, X5, X6, X7);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X4>::ForwardType x4,
-               typename CallbackParamTraits<X5>::ForwardType x5,
-               typename CallbackParamTraits<X6>::ForwardType x6,
-               typename CallbackParamTraits<X7>::ForwardType x7) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-    typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    typename Bound3UnwrapTraits::ForwardType x3 =
-        Bound3UnwrapTraits::Unwrap(storage->p3_);
-    return InvokeHelper<
-        StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
-        void(typename Bound1UnwrapTraits::ForwardType,
-             typename Bound2UnwrapTraits::ForwardType,
-             typename Bound3UnwrapTraits::ForwardType,
-             typename CallbackParamTraits<X4>::ForwardType x4,
-             typename CallbackParamTraits<X5>::ForwardType x5,
-             typename CallbackParamTraits<X6>::ForwardType x6,
-             typename CallbackParamTraits<X7>::ForwardType
-                 x7)>::MakeItSo(storage->runnable_, CallbackForward(x1),
-                                CallbackForward(x2), CallbackForward(x3),
-                                CallbackForward(x4), CallbackForward(x5),
-                                CallbackForward(x6), CallbackForward(x7));
-  }
-};
-
-// Arity 7 -> 3.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5,
-          typename X6,
-          typename X7>
-struct Invoker<4, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X5>::ForwardType,
-                     typename CallbackParamTraits<X6>::ForwardType,
-                     typename CallbackParamTraits<X7>::ForwardType);
-
-  typedef R(UnboundRunType)(X5, X6, X7);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X5>::ForwardType x5,
-               typename CallbackParamTraits<X6>::ForwardType x6,
-               typename CallbackParamTraits<X7>::ForwardType x7) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-    typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
-    typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    typename Bound3UnwrapTraits::ForwardType x3 =
-        Bound3UnwrapTraits::Unwrap(storage->p3_);
-    typename Bound4UnwrapTraits::ForwardType x4 =
-        Bound4UnwrapTraits::Unwrap(storage->p4_);
-    return InvokeHelper<
-        StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
-        void(typename Bound1UnwrapTraits::ForwardType,
-             typename Bound2UnwrapTraits::ForwardType,
-             typename Bound3UnwrapTraits::ForwardType,
-             typename Bound4UnwrapTraits::ForwardType,
-             typename CallbackParamTraits<X5>::ForwardType x5,
-             typename CallbackParamTraits<X6>::ForwardType x6,
-             typename CallbackParamTraits<X7>::ForwardType
-                 x7)>::MakeItSo(storage->runnable_, CallbackForward(x1),
-                                CallbackForward(x2), CallbackForward(x3),
-                                CallbackForward(x4), CallbackForward(x5),
-                                CallbackForward(x6), CallbackForward(x7));
-  }
-};
-
-// Arity 7 -> 2.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5,
-          typename X6,
-          typename X7>
-struct Invoker<5, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X6>::ForwardType,
-                     typename CallbackParamTraits<X7>::ForwardType);
-
-  typedef R(UnboundRunType)(X6, X7);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X6>::ForwardType x6,
-               typename CallbackParamTraits<X7>::ForwardType x7) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-    typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
-    typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
-    typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    typename Bound3UnwrapTraits::ForwardType x3 =
-        Bound3UnwrapTraits::Unwrap(storage->p3_);
-    typename Bound4UnwrapTraits::ForwardType x4 =
-        Bound4UnwrapTraits::Unwrap(storage->p4_);
-    typename Bound5UnwrapTraits::ForwardType x5 =
-        Bound5UnwrapTraits::Unwrap(storage->p5_);
-    return InvokeHelper<
-        StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
-        void(typename Bound1UnwrapTraits::ForwardType,
-             typename Bound2UnwrapTraits::ForwardType,
-             typename Bound3UnwrapTraits::ForwardType,
-             typename Bound4UnwrapTraits::ForwardType,
-             typename Bound5UnwrapTraits::ForwardType,
-             typename CallbackParamTraits<X6>::ForwardType x6,
-             typename CallbackParamTraits<X7>::ForwardType
-                 x7)>::MakeItSo(storage->runnable_, CallbackForward(x1),
-                                CallbackForward(x2), CallbackForward(x3),
-                                CallbackForward(x4), CallbackForward(x5),
-                                CallbackForward(x6), CallbackForward(x7));
-  }
-};
-
-// Arity 7 -> 1.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5,
-          typename X6,
-          typename X7>
-struct Invoker<6, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
-  typedef R(RunType)(BindStateBase*,
-                     typename CallbackParamTraits<X7>::ForwardType);
-
-  typedef R(UnboundRunType)(X7);
-
-  static R Run(BindStateBase* base,
-               typename CallbackParamTraits<X7>::ForwardType x7) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-    typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
-    typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
-    typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
-    typedef typename StorageType::Bound6UnwrapTraits Bound6UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    typename Bound3UnwrapTraits::ForwardType x3 =
-        Bound3UnwrapTraits::Unwrap(storage->p3_);
-    typename Bound4UnwrapTraits::ForwardType x4 =
-        Bound4UnwrapTraits::Unwrap(storage->p4_);
-    typename Bound5UnwrapTraits::ForwardType x5 =
-        Bound5UnwrapTraits::Unwrap(storage->p5_);
-    typename Bound6UnwrapTraits::ForwardType x6 =
-        Bound6UnwrapTraits::Unwrap(storage->p6_);
-    return InvokeHelper<
-        StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
-        void(typename Bound1UnwrapTraits::ForwardType,
-             typename Bound2UnwrapTraits::ForwardType,
-             typename Bound3UnwrapTraits::ForwardType,
-             typename Bound4UnwrapTraits::ForwardType,
-             typename Bound5UnwrapTraits::ForwardType,
-             typename Bound6UnwrapTraits::ForwardType,
-             typename CallbackParamTraits<X7>::ForwardType
-                 x7)>::MakeItSo(storage->runnable_, CallbackForward(x1),
-                                CallbackForward(x2), CallbackForward(x3),
-                                CallbackForward(x4), CallbackForward(x5),
-                                CallbackForward(x6), CallbackForward(x7));
-  }
-};
-
-// Arity 7 -> 0.
-template <typename StorageType,
-          typename R,
-          typename X1,
-          typename X2,
-          typename X3,
-          typename X4,
-          typename X5,
-          typename X6,
-          typename X7>
-struct Invoker<7, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
-  typedef R(RunType)(BindStateBase*);
-
-  typedef R(UnboundRunType)();
-
-  static R Run(BindStateBase* base) {
-    StorageType* storage = static_cast<StorageType*>(base);
-
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
-    typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
-    typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
-    typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
-    typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
-    typedef typename StorageType::Bound6UnwrapTraits Bound6UnwrapTraits;
-    typedef typename StorageType::Bound7UnwrapTraits Bound7UnwrapTraits;
-
-    typename Bound1UnwrapTraits::ForwardType x1 =
-        Bound1UnwrapTraits::Unwrap(storage->p1_);
-    typename Bound2UnwrapTraits::ForwardType x2 =
-        Bound2UnwrapTraits::Unwrap(storage->p2_);
-    typename Bound3UnwrapTraits::ForwardType x3 =
-        Bound3UnwrapTraits::Unwrap(storage->p3_);
-    typename Bound4UnwrapTraits::ForwardType x4 =
-        Bound4UnwrapTraits::Unwrap(storage->p4_);
-    typename Bound5UnwrapTraits::ForwardType x5 =
-        Bound5UnwrapTraits::Unwrap(storage->p5_);
-    typename Bound6UnwrapTraits::ForwardType x6 =
-        Bound6UnwrapTraits::Unwrap(storage->p6_);
-    typename Bound7UnwrapTraits::ForwardType x7 =
-        Bound7UnwrapTraits::Unwrap(storage->p7_);
-    return InvokeHelper<StorageType::IsWeakCall::value, R,
-                        typename StorageType::RunnableType,
-                        void(typename Bound1UnwrapTraits::ForwardType,
-                             typename Bound2UnwrapTraits::ForwardType,
-                             typename Bound3UnwrapTraits::ForwardType,
-                             typename Bound4UnwrapTraits::ForwardType,
-                             typename Bound5UnwrapTraits::ForwardType,
-                             typename Bound6UnwrapTraits::ForwardType,
-                             typename Bound7UnwrapTraits::ForwardType)>::
-        MakeItSo(storage->runnable_, CallbackForward(x1), CallbackForward(x2),
-                 CallbackForward(x3), CallbackForward(x4), CallbackForward(x5),
-                 CallbackForward(x6), CallbackForward(x7));
-  }
-};
+  // It's error prone to make the implicit first reference to ref-counted types.
+  // In the example below, base::BindOnce() makes the implicit first reference
+  // to the ref-counted Foo. If PostTask() failed or the posted task ran fast
+  // enough, the newly created instance can be destroyed before |oo| makes
+  // another reference.
+  //   Foo::Foo() {
+  //     base::PostTask(FROM_HERE, base::BindOnce(&Foo::Bar, this));
+  //   }
+  //
+  //   scoped_refptr<Foo> oo = new Foo();
+  //
+  // Instead of doing like above, please consider adding a static constructor,
+  // and keep the first reference alive explicitly.
+  //   // static
+  //   scoped_refptr<Foo> Foo::Create() {
+  //     auto foo = base::WrapRefCounted(new Foo());
+  //     base::PostTask(FROM_HERE, base::BindOnce(&Foo::Bar, foo));
+  //     return foo;
+  //   }
+  //
+  //   Foo::Foo() {}
+  //
+  //   scoped_refptr<Foo> oo = Foo::Create();
+  DCHECK(receiver->HasAtLeastOneRef())
+      << "base::Bind{Once,Repeating}() refuses to create the first reference "
+         "to ref-counted objects. That typically happens around PostTask() in "
+         "their constructor, and such objects can be destroyed before `new` "
+         "returns if the task resolves fast enough.";
+}
 
 // BindState<>
 //
-// This stores all the state passed into Bind() and is also where most
-// of the template resolution magic occurs.
-//
-// Runnable is the functor we are binding arguments to.
-// RunType is type of the Run() function that the Invoker<> should use.
-// Normally, this is the same as the RunType of the Runnable, but it can
-// be different if an adapter like IgnoreResult() has been used.
-//
-// BoundArgsType contains the storage type for all the bound arguments by
-// (ab)using a function type.
-template <typename Runnable, typename RunType, typename BoundArgsType>
-struct BindState;
+// This stores all the state passed into Bind().
+template <typename Functor, typename... BoundArgs>
+struct BindState final : BindStateBase {
+  using IsCancellable = std::bool_constant<
+      CallbackCancellationTraits<Functor,
+                                 std::tuple<BoundArgs...>>::is_cancellable>;
+  template <typename ForwardFunctor, typename... ForwardBoundArgs>
+  static BindState* Create(BindStateBase::InvokeFuncStorage invoke_func,
+                           ForwardFunctor&& functor,
+                           ForwardBoundArgs&&... bound_args) {
+    // Ban ref counted receivers that were not yet fully constructed to avoid
+    // a common pattern of racy situation.
+    BanUnconstructedRefCountedReceiver<ForwardFunctor>(bound_args...);
 
-template <typename Runnable, typename RunType>
-struct BindState<Runnable, RunType, void()> : public BindStateBase {
-  typedef Runnable RunnableType;
-  typedef false_type IsWeakCall;
-  typedef Invoker<0, BindState, RunType> InvokerType;
-  typedef typename InvokerType::UnboundRunType UnboundRunType;
-  explicit BindState(const Runnable& runnable)
-      : BindStateBase(&Destroy), runnable_(runnable) {}
-
-  ~BindState() {}
-
-  static void Destroy(BindStateBase* self) {
-    delete static_cast<BindState*>(self);
+    // IsCancellable is std::false_type if
+    // CallbackCancellationTraits<>::IsCancelled returns always false.
+    // Otherwise, it's std::true_type.
+    return new BindState(IsCancellable{}, invoke_func,
+                         std::forward<ForwardFunctor>(functor),
+                         std::forward<ForwardBoundArgs>(bound_args)...);
   }
 
-  RunnableType runnable_;
+  Functor functor_;
+  std::tuple<BoundArgs...> bound_args_;
+
+ private:
+  static constexpr bool is_nested_callback =
+      MakeFunctorTraits<Functor>::is_callback;
+
+  template <typename ForwardFunctor, typename... ForwardBoundArgs>
+  explicit BindState(std::true_type,
+                     BindStateBase::InvokeFuncStorage invoke_func,
+                     ForwardFunctor&& functor,
+                     ForwardBoundArgs&&... bound_args)
+      : BindStateBase(invoke_func,
+                      &Destroy,
+                      &QueryCancellationTraits<BindState>),
+        functor_(std::forward<ForwardFunctor>(functor)),
+        bound_args_(std::forward<ForwardBoundArgs>(bound_args)...) {
+    // We check the validity of nested callbacks (e.g., Bind(callback, ...)) in
+    // release builds to avoid null pointers from ending up in posted tasks,
+    // causing hard-to-diagnose crashes. Ideally we'd do this for all functors
+    // here, but that would have a large binary size impact.
+    if (is_nested_callback) {
+      CHECK(!IsNull(functor_));
+    } else {
+      DCHECK(!IsNull(functor_));
+    }
+  }
+
+  template <typename ForwardFunctor, typename... ForwardBoundArgs>
+  explicit BindState(std::false_type,
+                     BindStateBase::InvokeFuncStorage invoke_func,
+                     ForwardFunctor&& functor,
+                     ForwardBoundArgs&&... bound_args)
+      : BindStateBase(invoke_func, &Destroy),
+        functor_(std::forward<ForwardFunctor>(functor)),
+        bound_args_(std::forward<ForwardBoundArgs>(bound_args)...) {
+    // See above for CHECK/DCHECK rationale.
+    if (is_nested_callback) {
+      CHECK(!IsNull(functor_));
+    } else {
+      DCHECK(!IsNull(functor_));
+    }
+  }
+
+  ~BindState() = default;
+
+  static void Destroy(const BindStateBase* self) {
+    delete static_cast<const BindState*>(self);
+  }
 };
 
-template <typename Runnable, typename RunType, typename P1>
-struct BindState<Runnable, RunType, void(P1)> : public BindStateBase {
-  typedef Runnable RunnableType;
-  typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
-  typedef Invoker<1, BindState, RunType> InvokerType;
-  typedef typename InvokerType::UnboundRunType UnboundRunType;
+// Used to implement MakeBindStateType.
+template <bool is_method, typename Functor, typename... BoundArgs>
+struct MakeBindStateTypeImpl;
 
-  // Convenience typedefs for bound argument types.
-  typedef UnwrapTraits<P1> Bound1UnwrapTraits;
-
-  BindState(const Runnable& runnable, const P1& p1)
-      : BindStateBase(&Destroy), runnable_(runnable), p1_(p1) {
-    MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
-  }
-
-  ~BindState() {
-    MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::Release(p1_);
-  }
-
-  static void Destroy(BindStateBase* self) {
-    delete static_cast<BindState*>(self);
-  }
-
-  RunnableType runnable_;
-  P1 p1_;
+template <typename Functor, typename... BoundArgs>
+struct MakeBindStateTypeImpl<false, Functor, BoundArgs...> {
+  static_assert(!HasRefCountedTypeAsRawPtr<std::decay_t<BoundArgs>...>::value,
+                "A parameter is a refcounted type and needs scoped_refptr.");
+  using Type = BindState<std::decay_t<Functor>, std::decay_t<BoundArgs>...>;
 };
 
-template <typename Runnable, typename RunType, typename P1, typename P2>
-struct BindState<Runnable, RunType, void(P1, P2)> : public BindStateBase {
-  typedef Runnable RunnableType;
-  typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
-  typedef Invoker<2, BindState, RunType> InvokerType;
-  typedef typename InvokerType::UnboundRunType UnboundRunType;
-
-  // Convenience typedefs for bound argument types.
-  typedef UnwrapTraits<P1> Bound1UnwrapTraits;
-  typedef UnwrapTraits<P2> Bound2UnwrapTraits;
-
-  BindState(const Runnable& runnable, const P1& p1, const P2& p2)
-      : BindStateBase(&Destroy), runnable_(runnable), p1_(p1), p2_(p2) {
-    MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
-  }
-
-  ~BindState() {
-    MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::Release(p1_);
-  }
-
-  static void Destroy(BindStateBase* self) {
-    delete static_cast<BindState*>(self);
-  }
-
-  RunnableType runnable_;
-  P1 p1_;
-  P2 p2_;
+template <typename Functor>
+struct MakeBindStateTypeImpl<true, Functor> {
+  using Type = BindState<std::decay_t<Functor>>;
 };
 
-template <typename Runnable,
-          typename RunType,
-          typename P1,
-          typename P2,
-          typename P3>
-struct BindState<Runnable, RunType, void(P1, P2, P3)> : public BindStateBase {
-  typedef Runnable RunnableType;
-  typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
-  typedef Invoker<3, BindState, RunType> InvokerType;
-  typedef typename InvokerType::UnboundRunType UnboundRunType;
+template <typename Functor, typename Receiver, typename... BoundArgs>
+struct MakeBindStateTypeImpl<true, Functor, Receiver, BoundArgs...> {
+ private:
+  using DecayedReceiver = std::decay_t<Receiver>;
 
-  // Convenience typedefs for bound argument types.
-  typedef UnwrapTraits<P1> Bound1UnwrapTraits;
-  typedef UnwrapTraits<P2> Bound2UnwrapTraits;
-  typedef UnwrapTraits<P3> Bound3UnwrapTraits;
+  static_assert(!std::is_array<std::remove_reference_t<Receiver>>::value,
+                "First bound argument to a method cannot be an array.");
+  static_assert(
+      !std::is_pointer<DecayedReceiver>::value ||
+          IsRefCountedType<std::remove_pointer_t<DecayedReceiver>>::value,
+      "Receivers may not be raw pointers. If using a raw pointer here is safe"
+      " and has no lifetime concerns, use base::Unretained() and document why"
+      " it's safe.");
+  static_assert(!HasRefCountedTypeAsRawPtr<std::decay_t<BoundArgs>...>::value,
+                "A parameter is a refcounted type and needs scoped_refptr.");
 
-  BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3)
-      : BindStateBase(&Destroy),
-        runnable_(runnable),
-        p1_(p1),
-        p2_(p2),
-        p3_(p3) {
-    MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
-  }
-
-  ~BindState() {
-    MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::Release(p1_);
-  }
-
-  static void Destroy(BindStateBase* self) {
-    delete static_cast<BindState*>(self);
-  }
-
-  RunnableType runnable_;
-  P1 p1_;
-  P2 p2_;
-  P3 p3_;
+ public:
+  using Type = BindState<
+      std::decay_t<Functor>,
+      std::conditional_t<std::is_pointer<DecayedReceiver>::value,
+                         scoped_refptr<std::remove_pointer_t<DecayedReceiver>>,
+                         DecayedReceiver>,
+      std::decay_t<BoundArgs>...>;
 };
 
-template <typename Runnable,
-          typename RunType,
-          typename P1,
-          typename P2,
-          typename P3,
-          typename P4>
-struct BindState<Runnable, RunType, void(P1, P2, P3, P4)>
-    : public BindStateBase {
-  typedef Runnable RunnableType;
-  typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
-  typedef Invoker<4, BindState, RunType> InvokerType;
-  typedef typename InvokerType::UnboundRunType UnboundRunType;
+template <typename Functor, typename... BoundArgs>
+using MakeBindStateType =
+    typename MakeBindStateTypeImpl<MakeFunctorTraits<Functor>::is_method,
+                                   Functor,
+                                   BoundArgs...>::Type;
 
-  // Convenience typedefs for bound argument types.
-  typedef UnwrapTraits<P1> Bound1UnwrapTraits;
-  typedef UnwrapTraits<P2> Bound2UnwrapTraits;
-  typedef UnwrapTraits<P3> Bound3UnwrapTraits;
-  typedef UnwrapTraits<P4> Bound4UnwrapTraits;
+// Returns a RunType of bound functor.
+// E.g. MakeUnboundRunType<R(A, B, C), A, B> is evaluated to R(C).
+template <typename Functor, typename... BoundArgs>
+using MakeUnboundRunType =
+    typename BindTypeHelper<Functor, BoundArgs...>::UnboundRunType;
 
-  BindState(const Runnable& runnable,
-            const P1& p1,
-            const P2& p2,
-            const P3& p3,
-            const P4& p4)
-      : BindStateBase(&Destroy),
-        runnable_(runnable),
-        p1_(p1),
-        p2_(p2),
-        p3_(p3),
-        p4_(p4) {
-    MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
-  }
+// The implementation of TransformToUnwrappedType below.
+template <bool is_once, typename T>
+struct TransformToUnwrappedTypeImpl;
 
-  ~BindState() {
-    MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::Release(p1_);
-  }
-
-  static void Destroy(BindStateBase* self) {
-    delete static_cast<BindState*>(self);
-  }
-
-  RunnableType runnable_;
-  P1 p1_;
-  P2 p2_;
-  P3 p3_;
-  P4 p4_;
+template <typename T>
+struct TransformToUnwrappedTypeImpl<true, T> {
+  using StoredType = std::decay_t<T>;
+  using ForwardType = StoredType&&;
+  using Unwrapped = decltype(Unwrap(std::declval<ForwardType>()));
 };
 
-template <typename Runnable,
-          typename RunType,
-          typename P1,
-          typename P2,
-          typename P3,
-          typename P4,
-          typename P5>
-struct BindState<Runnable, RunType, void(P1, P2, P3, P4, P5)>
-    : public BindStateBase {
-  typedef Runnable RunnableType;
-  typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
-  typedef Invoker<5, BindState, RunType> InvokerType;
-  typedef typename InvokerType::UnboundRunType UnboundRunType;
-
-  // Convenience typedefs for bound argument types.
-  typedef UnwrapTraits<P1> Bound1UnwrapTraits;
-  typedef UnwrapTraits<P2> Bound2UnwrapTraits;
-  typedef UnwrapTraits<P3> Bound3UnwrapTraits;
-  typedef UnwrapTraits<P4> Bound4UnwrapTraits;
-  typedef UnwrapTraits<P5> Bound5UnwrapTraits;
-
-  BindState(const Runnable& runnable,
-            const P1& p1,
-            const P2& p2,
-            const P3& p3,
-            const P4& p4,
-            const P5& p5)
-      : BindStateBase(&Destroy),
-        runnable_(runnable),
-        p1_(p1),
-        p2_(p2),
-        p3_(p3),
-        p4_(p4),
-        p5_(p5) {
-    MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
-  }
-
-  ~BindState() {
-    MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::Release(p1_);
-  }
-
-  static void Destroy(BindStateBase* self) {
-    delete static_cast<BindState*>(self);
-  }
-
-  RunnableType runnable_;
-  P1 p1_;
-  P2 p2_;
-  P3 p3_;
-  P4 p4_;
-  P5 p5_;
+template <typename T>
+struct TransformToUnwrappedTypeImpl<false, T> {
+  using StoredType = std::decay_t<T>;
+  using ForwardType = const StoredType&;
+  using Unwrapped = decltype(Unwrap(std::declval<ForwardType>()));
 };
 
-template <typename Runnable,
-          typename RunType,
-          typename P1,
-          typename P2,
-          typename P3,
-          typename P4,
-          typename P5,
-          typename P6>
-struct BindState<Runnable, RunType, void(P1, P2, P3, P4, P5, P6)>
-    : public BindStateBase {
-  typedef Runnable RunnableType;
-  typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
-  typedef Invoker<6, BindState, RunType> InvokerType;
-  typedef typename InvokerType::UnboundRunType UnboundRunType;
+// Transform |T| into `Unwrapped` type, which is passed to the target function.
+// Example:
+//   In is_once == true case,
+//     `int&&` -> `int&&`,
+//     `const int&` -> `int&&`,
+//     `OwnedWrapper<int>&` -> `int*&&`.
+//   In is_once == false case,
+//     `int&&` -> `const int&`,
+//     `const int&` -> `const int&`,
+//     `OwnedWrapper<int>&` -> `int* const &`.
+template <bool is_once, typename T>
+using TransformToUnwrappedType =
+    typename TransformToUnwrappedTypeImpl<is_once, T>::Unwrapped;
 
-  // Convenience typedefs for bound argument types.
-  typedef UnwrapTraits<P1> Bound1UnwrapTraits;
-  typedef UnwrapTraits<P2> Bound2UnwrapTraits;
-  typedef UnwrapTraits<P3> Bound3UnwrapTraits;
-  typedef UnwrapTraits<P4> Bound4UnwrapTraits;
-  typedef UnwrapTraits<P5> Bound5UnwrapTraits;
-  typedef UnwrapTraits<P6> Bound6UnwrapTraits;
-
-  BindState(const Runnable& runnable,
-            const P1& p1,
-            const P2& p2,
-            const P3& p3,
-            const P4& p4,
-            const P5& p5,
-            const P6& p6)
-      : BindStateBase(&Destroy),
-        runnable_(runnable),
-        p1_(p1),
-        p2_(p2),
-        p3_(p3),
-        p4_(p4),
-        p5_(p5),
-        p6_(p6) {
-    MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
-  }
-
-  ~BindState() {
-    MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::Release(p1_);
-  }
-
-  static void Destroy(BindStateBase* self) {
-    delete static_cast<BindState*>(self);
-  }
-
-  RunnableType runnable_;
-  P1 p1_;
-  P2 p2_;
-  P3 p3_;
-  P4 p4_;
-  P5 p5_;
-  P6 p6_;
+// Transforms |Args| into `Unwrapped` types, and packs them into a TypeList.
+// If |is_method| is true, tries to dereference the first argument to support
+// smart pointers.
+template <bool is_once, bool is_method, typename... Args>
+struct MakeUnwrappedTypeListImpl {
+  using Type = TypeList<TransformToUnwrappedType<is_once, Args>...>;
 };
 
-template <typename Runnable,
-          typename RunType,
-          typename P1,
-          typename P2,
-          typename P3,
-          typename P4,
-          typename P5,
-          typename P6,
-          typename P7>
-struct BindState<Runnable, RunType, void(P1, P2, P3, P4, P5, P6, P7)>
-    : public BindStateBase {
-  typedef Runnable RunnableType;
-  typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
-  typedef Invoker<7, BindState, RunType> InvokerType;
-  typedef typename InvokerType::UnboundRunType UnboundRunType;
-
-  // Convenience typedefs for bound argument types.
-  typedef UnwrapTraits<P1> Bound1UnwrapTraits;
-  typedef UnwrapTraits<P2> Bound2UnwrapTraits;
-  typedef UnwrapTraits<P3> Bound3UnwrapTraits;
-  typedef UnwrapTraits<P4> Bound4UnwrapTraits;
-  typedef UnwrapTraits<P5> Bound5UnwrapTraits;
-  typedef UnwrapTraits<P6> Bound6UnwrapTraits;
-  typedef UnwrapTraits<P7> Bound7UnwrapTraits;
-
-  BindState(const Runnable& runnable,
-            const P1& p1,
-            const P2& p2,
-            const P3& p3,
-            const P4& p4,
-            const P5& p5,
-            const P6& p6,
-            const P7& p7)
-      : BindStateBase(&Destroy),
-        runnable_(runnable),
-        p1_(p1),
-        p2_(p2),
-        p3_(p3),
-        p4_(p4),
-        p5_(p5),
-        p6_(p6),
-        p7_(p7) {
-    MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
-  }
-
-  ~BindState() {
-    MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::Release(p1_);
-  }
-
-  static void Destroy(BindStateBase* self) {
-    delete static_cast<BindState*>(self);
-  }
-
-  RunnableType runnable_;
-  P1 p1_;
-  P2 p2_;
-  P3 p3_;
-  P4 p4_;
-  P5 p5_;
-  P6 p6_;
-  P7 p7_;
+// Performs special handling for this pointers.
+// Example:
+//   int* -> int*,
+//   std::unique_ptr<int> -> int*.
+template <bool is_once, typename Receiver, typename... Args>
+struct MakeUnwrappedTypeListImpl<is_once, true, Receiver, Args...> {
+  using UnwrappedReceiver = TransformToUnwrappedType<is_once, Receiver>;
+  using Type = TypeList<decltype(&*std::declval<UnwrappedReceiver>()),
+                        TransformToUnwrappedType<is_once, Args>...>;
 };
 
+template <bool is_once, bool is_method, typename... Args>
+using MakeUnwrappedTypeList =
+    typename MakeUnwrappedTypeListImpl<is_once, is_method, Args...>::Type;
+
+// IsOnceCallback<T> is a std::true_type if |T| is a OnceCallback.
+template <typename T>
+struct IsOnceCallback : std::false_type {};
+
+template <typename Signature>
+struct IsOnceCallback<OnceCallback<Signature>> : std::true_type {};
+
+// Helpers to make error messages slightly more readable.
+template <int i>
+struct BindArgument {
+  template <typename ForwardingType>
+  struct ForwardedAs {
+    template <typename FunctorParamType>
+    struct ToParamWithType {
+      static constexpr bool kCanBeForwardedToBoundFunctor =
+          std::is_constructible<FunctorParamType, ForwardingType>::value;
+
+      // If the bound type can't be forwarded then test if `FunctorParamType` is
+      // a non-const lvalue reference and a reference to the unwrapped type
+      // *could* have been successfully forwarded.
+      static constexpr bool kNonConstRefParamMustBeWrapped =
+          kCanBeForwardedToBoundFunctor ||
+          !(std::is_lvalue_reference<FunctorParamType>::value &&
+            !std::is_const<std::remove_reference_t<FunctorParamType>>::value &&
+            std::is_convertible<std::decay_t<ForwardingType>&,
+                                FunctorParamType>::value);
+
+      // Note that this intentionally drops the const qualifier from
+      // `ForwardingType`, to test if it *could* have been successfully
+      // forwarded if `Passed()` had been used.
+      static constexpr bool kMoveOnlyTypeMustUseBasePassed =
+          kCanBeForwardedToBoundFunctor ||
+          !std::is_constructible<FunctorParamType,
+                                 std::decay_t<ForwardingType>&&>::value;
+    };
+  };
+
+  template <typename BoundAsType>
+  struct BoundAs {
+    template <typename StorageType>
+    struct StoredAs {
+      static constexpr bool kBindArgumentCanBeCaptured =
+          std::is_constructible<StorageType, BoundAsType>::value;
+      // Note that this intentionally drops the const qualifier from
+      // `BoundAsType`, to test if it *could* have been successfully bound if
+      // `std::move()` had been used.
+      static constexpr bool kMoveOnlyTypeMustUseStdMove =
+          kBindArgumentCanBeCaptured ||
+          !std::is_constructible<StorageType,
+                                 std::decay_t<BoundAsType>&&>::value;
+    };
+  };
+};
+
+// Helper to assert that parameter |i| of type |Arg| can be bound, which means:
+// - |Arg| can be retained internally as |Storage|.
+// - |Arg| can be forwarded as |Unwrapped| to |Param|.
+template <int i,
+          typename Arg,
+          typename Storage,
+          typename Unwrapped,
+          typename Param>
+struct AssertConstructible {
+ private:
+  // With `BindRepeating`, there are two decision points for how to handle a
+  // move-only type:
+  //
+  // 1. Whether the move-only argument should be moved into the internal
+  //    `BindState`. Either `std::move()` or `Passed` is sufficient to trigger
+  //    move-only semantics.
+  // 2. Whether or not the bound, move-only argument should be moved to the
+  //    bound functor when invoked. When the argument is bound with `Passed`,
+  //    invoking the callback will destructively move the bound, move-only
+  //    argument to the bound functor. In contrast, if the argument is bound
+  //    with `std::move()`, `RepeatingCallback` will attempt to call the bound
+  //    functor with a constant reference to the bound, move-only argument. This
+  //    will fail if the bound functor accepts that argument by value, since the
+  //    argument cannot be copied. It is this latter case that this
+  //    static_assert aims to catch.
+  //
+  // In contrast, `BindOnce()` only has one decision point. Once a move-only
+  // type is captured by value into the internal `BindState`, the bound,
+  // move-only argument will always be moved to the functor when invoked.
+  // Failure to use std::move will simply fail the `kMoveOnlyTypeMustUseStdMove`
+  // assert below instead.
+  //
+  // Note: `Passed()` is a legacy of supporting move-only types when repeating
+  // callbacks were the only callback type. A `RepeatingCallback` with a
+  // `Passed()` argument is really a `OnceCallback` and should eventually be
+  // migrated.
+  static_assert(
+      BindArgument<i>::template ForwardedAs<Unwrapped>::
+          template ToParamWithType<Param>::kMoveOnlyTypeMustUseBasePassed,
+      "base::BindRepeating() argument is a move-only type. Use base::Passed() "
+      "instead of std::move() to transfer ownership from the callback to the "
+      "bound functor.");
+  static_assert(
+      BindArgument<i>::template ForwardedAs<Unwrapped>::
+          template ToParamWithType<Param>::kNonConstRefParamMustBeWrapped,
+      "Bound argument for non-const reference parameter must be wrapped in "
+      "std::ref() or base::OwnedRef().");
+  static_assert(
+      BindArgument<i>::template ForwardedAs<Unwrapped>::
+          template ToParamWithType<Param>::kCanBeForwardedToBoundFunctor,
+      "Type mismatch between bound argument and bound functor's parameter.");
+
+  static_assert(BindArgument<i>::template BoundAs<Arg>::template StoredAs<
+                    Storage>::kMoveOnlyTypeMustUseStdMove,
+                "Attempting to bind a move-only type. Use std::move() to "
+                "transfer ownership to the created callback.");
+  // In practice, this static_assert should be quite rare as the storage type
+  // is deduced from the arguments passed to `BindOnce()`/`BindRepeating()`.
+  static_assert(
+      BindArgument<i>::template BoundAs<Arg>::template StoredAs<
+          Storage>::kBindArgumentCanBeCaptured,
+      "Cannot capture argument: is the argument copyable or movable?");
+};
+
+// Takes three same-length TypeLists, and applies AssertConstructible for each
+// triples.
+template <typename Index,
+          typename Args,
+          typename UnwrappedTypeList,
+          typename ParamsList>
+struct AssertBindArgsValidity;
+
+template <size_t... Ns,
+          typename... Args,
+          typename... Unwrapped,
+          typename... Params>
+struct AssertBindArgsValidity<std::index_sequence<Ns...>,
+                              TypeList<Args...>,
+                              TypeList<Unwrapped...>,
+                              TypeList<Params...>>
+    : AssertConstructible<static_cast<int>(Ns),
+                          Args,
+                          std::decay_t<Args>,
+                          Unwrapped,
+                          Params>... {
+  static constexpr bool ok = true;
+};
+
+template <typename T>
+struct AssertBindArgIsNotBasePassed : public std::true_type {};
+
+template <typename T>
+struct AssertBindArgIsNotBasePassed<PassedWrapper<T>> : public std::false_type {
+};
+
+// Used below in BindImpl to determine whether to use Invoker::Run or
+// Invoker::RunOnce.
+// Note: Simply using `kIsOnce ? &Invoker::RunOnce : &Invoker::Run` does not
+// work, since the compiler needs to check whether both expressions are
+// well-formed. Using `Invoker::Run` with a OnceCallback triggers a
+// static_assert, which is why the ternary expression does not compile.
+// TODO(crbug.com/752720): Remove this indirection once we have `if constexpr`.
+template <typename Invoker>
+constexpr auto GetInvokeFunc(std::true_type) {
+  return Invoker::RunOnce;
+}
+
+template <typename Invoker>
+constexpr auto GetInvokeFunc(std::false_type) {
+  return Invoker::Run;
+}
+
+template <template <typename> class CallbackT,
+          typename Functor,
+          typename... Args>
+decltype(auto) BindImpl(Functor&& functor, Args&&... args) {
+  // This block checks if each |args| matches to the corresponding params of the
+  // target function. This check does not affect the behavior of Bind, but its
+  // error message should be more readable.
+  static constexpr bool kIsOnce = IsOnceCallback<CallbackT<void()>>::value;
+  using Helper = BindTypeHelper<Functor, Args...>;
+  using FunctorTraits = typename Helper::FunctorTraits;
+  using BoundArgsList = typename Helper::BoundArgsList;
+  using UnwrappedArgsList =
+      MakeUnwrappedTypeList<kIsOnce, FunctorTraits::is_method, Args&&...>;
+  using BoundParamsList = typename Helper::BoundParamsList;
+  static_assert(
+      AssertBindArgsValidity<std::make_index_sequence<Helper::num_bounds>,
+                             BoundArgsList, UnwrappedArgsList,
+                             BoundParamsList>::ok,
+      "The bound args need to be convertible to the target params.");
+
+  using BindState = MakeBindStateType<Functor, Args...>;
+  using UnboundRunType = MakeUnboundRunType<Functor, Args...>;
+  using Invoker = Invoker<BindState, UnboundRunType>;
+  using CallbackType = CallbackT<UnboundRunType>;
+
+  // Store the invoke func into PolymorphicInvoke before casting it to
+  // InvokeFuncStorage, so that we can ensure its type matches to
+  // PolymorphicInvoke, to which CallbackType will cast back.
+  using PolymorphicInvoke = typename CallbackType::PolymorphicInvoke;
+  PolymorphicInvoke invoke_func =
+      GetInvokeFunc<Invoker>(std::bool_constant<kIsOnce>());
+
+  using InvokeFuncStorage = BindStateBase::InvokeFuncStorage;
+  return CallbackType(BindState::Create(
+      reinterpret_cast<InvokeFuncStorage>(invoke_func),
+      std::forward<Functor>(functor), std::forward<Args>(args)...));
+}
+
 }  // namespace cef_internal
+
+// An injection point to control |this| pointer behavior on a method invocation.
+// If IsWeakReceiver<> is true_type for |T| and |T| is used for a receiver of a
+// method, base::Bind cancels the method invocation if the receiver is tested as
+// false.
+// E.g. Foo::bar() is not called:
+//   struct Foo : base::SupportsWeakPtr<Foo> {
+//     void bar() {}
+//   };
+//
+//   WeakPtr<Foo> oo = nullptr;
+//   base::BindOnce(&Foo::bar, oo).Run();
+template <typename T>
+struct IsWeakReceiver : std::false_type {};
+
+template <typename T>
+struct IsWeakReceiver<std::reference_wrapper<T>> : IsWeakReceiver<T> {};
+
+template <typename T>
+struct IsWeakReceiver<WeakPtr<T>> : std::true_type {};
+
+// An injection point to control how objects are checked for maybe validity,
+// which is an optimistic thread-safe check for full validity.
+template <typename>
+struct MaybeValidTraits {
+  template <typename T>
+  static bool MaybeValid(const T& o) {
+    return o.MaybeValid();
+  }
+};
+
+// An injection point to control how bound objects passed to the target
+// function. BindUnwrapTraits<>::Unwrap() is called for each bound objects right
+// before the target function is invoked.
+template <typename>
+struct BindUnwrapTraits {
+  template <typename T>
+  static T&& Unwrap(T&& o) {
+    return std::forward<T>(o);
+  }
+};
+
+template <typename T>
+struct BindUnwrapTraits<cef_internal::UnretainedWrapper<T>> {
+  static T* Unwrap(const cef_internal::UnretainedWrapper<T>& o) {
+    return o.get();
+  }
+};
+
+template <typename T>
+struct BindUnwrapTraits<cef_internal::RetainedRefWrapper<T>> {
+  static T* Unwrap(const cef_internal::RetainedRefWrapper<T>& o) {
+    return o.get();
+  }
+};
+
+template <typename T, typename Deleter>
+struct BindUnwrapTraits<cef_internal::OwnedWrapper<T, Deleter>> {
+  static T* Unwrap(const cef_internal::OwnedWrapper<T, Deleter>& o) {
+    return o.get();
+  }
+};
+
+template <typename T>
+struct BindUnwrapTraits<cef_internal::OwnedRefWrapper<T>> {
+  static T& Unwrap(const cef_internal::OwnedRefWrapper<T>& o) {
+    return o.get();
+  }
+};
+
+template <typename T>
+struct BindUnwrapTraits<cef_internal::PassedWrapper<T>> {
+  static T Unwrap(const cef_internal::PassedWrapper<T>& o) { return o.Take(); }
+};
+
+#if defined(OS_WIN)
+template <typename T>
+struct BindUnwrapTraits<Microsoft::WRL::ComPtr<T>> {
+  static T* Unwrap(const Microsoft::WRL::ComPtr<T>& ptr) { return ptr.Get(); }
+};
+#endif
+
+// CallbackCancellationTraits allows customization of Callback's cancellation
+// semantics. By default, callbacks are not cancellable. A specialization should
+// set is_cancellable = true and implement an IsCancelled() that returns if the
+// callback should be cancelled.
+template <typename Functor, typename BoundArgsTuple, typename SFINAE>
+struct CallbackCancellationTraits {
+  static constexpr bool is_cancellable = false;
+};
+
+// Specialization for method bound to weak pointer receiver.
+template <typename Functor, typename... BoundArgs>
+struct CallbackCancellationTraits<
+    Functor,
+    std::tuple<BoundArgs...>,
+    std::enable_if_t<cef_internal::IsWeakMethod<
+        cef_internal::FunctorTraits<Functor>::is_method,
+        BoundArgs...>::value>> {
+  static constexpr bool is_cancellable = true;
+
+  template <typename Receiver, typename... Args>
+  static bool IsCancelled(const Functor&,
+                          const Receiver& receiver,
+                          const Args&...) {
+    return !receiver;
+  }
+
+  template <typename Receiver, typename... Args>
+  static bool MaybeValid(const Functor&,
+                         const Receiver& receiver,
+                         const Args&...) {
+    return MaybeValidTraits<Receiver>::MaybeValid(receiver);
+  }
+};
+
+// Specialization for a nested bind.
+template <typename Signature, typename... BoundArgs>
+struct CallbackCancellationTraits<OnceCallback<Signature>,
+                                  std::tuple<BoundArgs...>> {
+  static constexpr bool is_cancellable = true;
+
+  template <typename Functor>
+  static bool IsCancelled(const Functor& functor, const BoundArgs&...) {
+    return functor.IsCancelled();
+  }
+
+  template <typename Functor>
+  static bool MaybeValid(const Functor& functor, const BoundArgs&...) {
+    return MaybeValidTraits<Functor>::MaybeValid(functor);
+  }
+};
+
+template <typename Signature, typename... BoundArgs>
+struct CallbackCancellationTraits<RepeatingCallback<Signature>,
+                                  std::tuple<BoundArgs...>> {
+  static constexpr bool is_cancellable = true;
+
+  template <typename Functor>
+  static bool IsCancelled(const Functor& functor, const BoundArgs&...) {
+    return functor.IsCancelled();
+  }
+
+  template <typename Functor>
+  static bool MaybeValid(const Functor& functor, const BoundArgs&...) {
+    return MaybeValidTraits<Functor>::MaybeValid(functor);
+  }
+};
+
 }  // namespace base
 
 #endif  // CEF_INCLUDE_BASE_INTERNAL_CEF_BIND_INTERNAL_H_
diff --git a/src/include/base/internal/cef_bind_internal_win.h b/src/include/base/internal/cef_bind_internal_win.h
deleted file mode 100644
index 2d98fd1..0000000
--- a/src/include/base/internal/cef_bind_internal_win.h
+++ /dev/null
@@ -1,398 +0,0 @@
-// 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.
-
-// Do not include this header file directly. Use base/cef_bind.h instead.
-
-// Specializations of RunnableAdapter<> for Windows specific calling
-// conventions.  Please see base/bind_internal.h for more info.
-
-#ifndef CEF_INCLUDE_BASE_INTERNAL_CEF_BIND_INTERNAL_WIN_H_
-#define CEF_INCLUDE_BASE_INTERNAL_CEF_BIND_INTERNAL_WIN_H_
-
-// In the x64 architecture in Windows, __fastcall, __stdcall, etc, are all
-// the same as __cdecl which would turn the following specializations into
-// multiple definitions.
-#if defined(ARCH_CPU_X86_FAMILY)
-#if defined(ARCH_CPU_32_BITS)
-
-namespace base {
-namespace cef_internal {
-
-template <typename Functor>
-class RunnableAdapter;
-
-// __stdcall Function: Arity 0.
-template <typename R>
-class RunnableAdapter<R(__stdcall*)()> {
- public:
-  typedef R(RunType)();
-
-  explicit RunnableAdapter(R(__stdcall* function)()) : function_(function) {}
-
-  R Run() { return function_(); }
-
- private:
-  R(__stdcall* function_)();
-};
-
-// __fastcall Function: Arity 0.
-template <typename R>
-class RunnableAdapter<R(__fastcall*)()> {
- public:
-  typedef R(RunType)();
-
-  explicit RunnableAdapter(R(__fastcall* function)()) : function_(function) {}
-
-  R Run() { return function_(); }
-
- private:
-  R(__fastcall* function_)();
-};
-
-// __stdcall Function: Arity 1.
-template <typename R, typename A1>
-class RunnableAdapter<R(__stdcall*)(A1)> {
- public:
-  typedef R(RunType)(A1);
-
-  explicit RunnableAdapter(R(__stdcall* function)(A1)) : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1) {
-    return function_(a1);
-  }
-
- private:
-  R(__stdcall* function_)(A1);
-};
-
-// __fastcall Function: Arity 1.
-template <typename R, typename A1>
-class RunnableAdapter<R(__fastcall*)(A1)> {
- public:
-  typedef R(RunType)(A1);
-
-  explicit RunnableAdapter(R(__fastcall* function)(A1)) : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1) {
-    return function_(a1);
-  }
-
- private:
-  R(__fastcall* function_)(A1);
-};
-
-// __stdcall Function: Arity 2.
-template <typename R, typename A1, typename A2>
-class RunnableAdapter<R(__stdcall*)(A1, A2)> {
- public:
-  typedef R(RunType)(A1, A2);
-
-  explicit RunnableAdapter(R(__stdcall* function)(A1, A2))
-      : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2) {
-    return function_(a1, a2);
-  }
-
- private:
-  R(__stdcall* function_)(A1, A2);
-};
-
-// __fastcall Function: Arity 2.
-template <typename R, typename A1, typename A2>
-class RunnableAdapter<R(__fastcall*)(A1, A2)> {
- public:
-  typedef R(RunType)(A1, A2);
-
-  explicit RunnableAdapter(R(__fastcall* function)(A1, A2))
-      : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2) {
-    return function_(a1, a2);
-  }
-
- private:
-  R(__fastcall* function_)(A1, A2);
-};
-
-// __stdcall Function: Arity 3.
-template <typename R, typename A1, typename A2, typename A3>
-class RunnableAdapter<R(__stdcall*)(A1, A2, A3)> {
- public:
-  typedef R(RunType)(A1, A2, A3);
-
-  explicit RunnableAdapter(R(__stdcall* function)(A1, A2, A3))
-      : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3) {
-    return function_(a1, a2, a3);
-  }
-
- private:
-  R(__stdcall* function_)(A1, A2, A3);
-};
-
-// __fastcall Function: Arity 3.
-template <typename R, typename A1, typename A2, typename A3>
-class RunnableAdapter<R(__fastcall*)(A1, A2, A3)> {
- public:
-  typedef R(RunType)(A1, A2, A3);
-
-  explicit RunnableAdapter(R(__fastcall* function)(A1, A2, A3))
-      : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3) {
-    return function_(a1, a2, a3);
-  }
-
- private:
-  R(__fastcall* function_)(A1, A2, A3);
-};
-
-// __stdcall Function: Arity 4.
-template <typename R, typename A1, typename A2, typename A3, typename A4>
-class RunnableAdapter<R(__stdcall*)(A1, A2, A3, A4)> {
- public:
-  typedef R(RunType)(A1, A2, A3, A4);
-
-  explicit RunnableAdapter(R(__stdcall* function)(A1, A2, A3, A4))
-      : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3,
-        typename CallbackParamTraits<A4>::ForwardType a4) {
-    return function_(a1, a2, a3, a4);
-  }
-
- private:
-  R(__stdcall* function_)(A1, A2, A3, A4);
-};
-
-// __fastcall Function: Arity 4.
-template <typename R, typename A1, typename A2, typename A3, typename A4>
-class RunnableAdapter<R(__fastcall*)(A1, A2, A3, A4)> {
- public:
-  typedef R(RunType)(A1, A2, A3, A4);
-
-  explicit RunnableAdapter(R(__fastcall* function)(A1, A2, A3, A4))
-      : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3,
-        typename CallbackParamTraits<A4>::ForwardType a4) {
-    return function_(a1, a2, a3, a4);
-  }
-
- private:
-  R(__fastcall* function_)(A1, A2, A3, A4);
-};
-
-// __stdcall Function: Arity 5.
-template <typename R,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5>
-class RunnableAdapter<R(__stdcall*)(A1, A2, A3, A4, A5)> {
- public:
-  typedef R(RunType)(A1, A2, A3, A4, A5);
-
-  explicit RunnableAdapter(R(__stdcall* function)(A1, A2, A3, A4, A5))
-      : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3,
-        typename CallbackParamTraits<A4>::ForwardType a4,
-        typename CallbackParamTraits<A5>::ForwardType a5) {
-    return function_(a1, a2, a3, a4, a5);
-  }
-
- private:
-  R(__stdcall* function_)(A1, A2, A3, A4, A5);
-};
-
-// __fastcall Function: Arity 5.
-template <typename R,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5>
-class RunnableAdapter<R(__fastcall*)(A1, A2, A3, A4, A5)> {
- public:
-  typedef R(RunType)(A1, A2, A3, A4, A5);
-
-  explicit RunnableAdapter(R(__fastcall* function)(A1, A2, A3, A4, A5))
-      : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3,
-        typename CallbackParamTraits<A4>::ForwardType a4,
-        typename CallbackParamTraits<A5>::ForwardType a5) {
-    return function_(a1, a2, a3, a4, a5);
-  }
-
- private:
-  R(__fastcall* function_)(A1, A2, A3, A4, A5);
-};
-
-// __stdcall Function: Arity 6.
-template <typename R,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6>
-class RunnableAdapter<R(__stdcall*)(A1, A2, A3, A4, A5, A6)> {
- public:
-  typedef R(RunType)(A1, A2, A3, A4, A5, A6);
-
-  explicit RunnableAdapter(R(__stdcall* function)(A1, A2, A3, A4, A5, A6))
-      : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3,
-        typename CallbackParamTraits<A4>::ForwardType a4,
-        typename CallbackParamTraits<A5>::ForwardType a5,
-        typename CallbackParamTraits<A6>::ForwardType a6) {
-    return function_(a1, a2, a3, a4, a5, a6);
-  }
-
- private:
-  R(__stdcall* function_)(A1, A2, A3, A4, A5, A6);
-};
-
-// __fastcall Function: Arity 6.
-template <typename R,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6>
-class RunnableAdapter<R(__fastcall*)(A1, A2, A3, A4, A5, A6)> {
- public:
-  typedef R(RunType)(A1, A2, A3, A4, A5, A6);
-
-  explicit RunnableAdapter(R(__fastcall* function)(A1, A2, A3, A4, A5, A6))
-      : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3,
-        typename CallbackParamTraits<A4>::ForwardType a4,
-        typename CallbackParamTraits<A5>::ForwardType a5,
-        typename CallbackParamTraits<A6>::ForwardType a6) {
-    return function_(a1, a2, a3, a4, a5, a6);
-  }
-
- private:
-  R(__fastcall* function_)(A1, A2, A3, A4, A5, A6);
-};
-
-// __stdcall Function: Arity 7.
-template <typename R,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6,
-          typename A7>
-class RunnableAdapter<R(__stdcall*)(A1, A2, A3, A4, A5, A6, A7)> {
- public:
-  typedef R(RunType)(A1, A2, A3, A4, A5, A6, A7);
-
-  explicit RunnableAdapter(R(__stdcall* function)(A1, A2, A3, A4, A5, A6, A7))
-      : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3,
-        typename CallbackParamTraits<A4>::ForwardType a4,
-        typename CallbackParamTraits<A5>::ForwardType a5,
-        typename CallbackParamTraits<A6>::ForwardType a6,
-        typename CallbackParamTraits<A7>::ForwardType a7) {
-    return function_(a1, a2, a3, a4, a5, a6, a7);
-  }
-
- private:
-  R(__stdcall* function_)(A1, A2, A3, A4, A5, A6, A7);
-};
-
-// __fastcall Function: Arity 7.
-template <typename R,
-          typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6,
-          typename A7>
-class RunnableAdapter<R(__fastcall*)(A1, A2, A3, A4, A5, A6, A7)> {
- public:
-  typedef R(RunType)(A1, A2, A3, A4, A5, A6, A7);
-
-  explicit RunnableAdapter(R(__fastcall* function)(A1, A2, A3, A4, A5, A6, A7))
-      : function_(function) {}
-
-  R Run(typename CallbackParamTraits<A1>::ForwardType a1,
-        typename CallbackParamTraits<A2>::ForwardType a2,
-        typename CallbackParamTraits<A3>::ForwardType a3,
-        typename CallbackParamTraits<A4>::ForwardType a4,
-        typename CallbackParamTraits<A5>::ForwardType a5,
-        typename CallbackParamTraits<A6>::ForwardType a6,
-        typename CallbackParamTraits<A7>::ForwardType a7) {
-    return function_(a1, a2, a3, a4, a5, a6, a7);
-  }
-
- private:
-  R(__fastcall* function_)(A1, A2, A3, A4, A5, A6, A7);
-};
-
-}  // namespace cef_internal
-}  // namespace base
-
-#endif  // defined(ARCH_CPU_32_BITS)
-#endif  // defined(ARCH_CPU_X86_FAMILY)
-
-#endif  // CEF_INCLUDE_BASE_INTERNAL_CEF_BIND_INTERNAL_WIN_H_
diff --git a/src/include/base/internal/cef_callback_internal.h b/src/include/base/internal/cef_callback_internal.h
index 1f2e16c..f3435e9 100644
--- a/src/include/base/internal/cef_callback_internal.h
+++ b/src/include/base/internal/cef_callback_internal.h
@@ -36,72 +36,156 @@
 #ifndef CEF_INCLUDE_BASE_INTERNAL_CEF_CALLBACK_INTERNAL_H_
 #define CEF_INCLUDE_BASE_INTERNAL_CEF_CALLBACK_INTERNAL_H_
 
-#include <stddef.h>
-
-#include "include/base/cef_atomic_ref_count.h"
-#include "include/base/cef_macros.h"
+#include "include/base/cef_callback_forward.h"
 #include "include/base/cef_ref_counted.h"
-#include "include/base/cef_scoped_ptr.h"
-#include "include/base/cef_template_util.h"
-
-template <typename T>
-class ScopedVector;
 
 namespace base {
-namespace cef_internal {
-class CallbackBase;
 
-// At the base level, the only task is to add reference counting data. Don't use
-// RefCountedThreadSafe since it requires the destructor to be a virtual method.
-// Creating a vtable for every BindState template instantiation results in a lot
-// of bloat. Its only task is to call the destructor which can be done with a
-// function pointer.
-class BindStateBase {
- protected:
-  explicit BindStateBase(void (*destructor)(BindStateBase*))
-      : ref_count_(0), destructor_(destructor) {}
-  ~BindStateBase() {}
+struct FakeBindState;
+
+namespace cef_internal {
+
+class BindStateBase;
+class FinallyExecutorCommon;
+class ThenAndCatchExecutorCommon;
+
+template <typename ReturnType>
+class PostTaskExecutor;
+
+template <typename Functor, typename... BoundArgs>
+struct BindState;
+
+class CallbackBase;
+class CallbackBaseCopyable;
+
+struct BindStateBaseRefCountTraits {
+  static void Destruct(const BindStateBase*);
+};
+
+template <typename T>
+using PassingType = std::conditional_t<std::is_scalar<T>::value, T, T&&>;
+
+// BindStateBase is used to provide an opaque handle that the Callback
+// class can use to represent a function object with bound arguments.  It
+// behaves as an existential type that is used by a corresponding
+// DoInvoke function to perform the function execution.  This allows
+// us to shield the Callback class from the types of the bound argument via
+// "type erasure."
+// At the base level, the only task is to add reference counting data. Avoid
+// using or inheriting any virtual functions. Creating a vtable for every
+// BindState template instantiation results in a lot of bloat. Its only task is
+// to call the destructor which can be done with a function pointer.
+class BindStateBase
+    : public RefCountedThreadSafe<BindStateBase, BindStateBaseRefCountTraits> {
+ public:
+  REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE();
+
+  enum CancellationQueryMode {
+    IS_CANCELLED,
+    MAYBE_VALID,
+  };
+
+  using InvokeFuncStorage = void (*)();
+
+  BindStateBase(const BindStateBase&) = delete;
+  BindStateBase& operator=(const BindStateBase&) = delete;
 
  private:
-  friend class scoped_refptr<BindStateBase>;
+  BindStateBase(InvokeFuncStorage polymorphic_invoke,
+                void (*destructor)(const BindStateBase*));
+  BindStateBase(InvokeFuncStorage polymorphic_invoke,
+                void (*destructor)(const BindStateBase*),
+                bool (*query_cancellation_traits)(const BindStateBase*,
+                                                  CancellationQueryMode mode));
+
+  ~BindStateBase() = default;
+
+  friend struct BindStateBaseRefCountTraits;
+  friend class RefCountedThreadSafe<BindStateBase, BindStateBaseRefCountTraits>;
+
   friend class CallbackBase;
+  friend class CallbackBaseCopyable;
 
-  void AddRef();
-  void Release();
+  // Allowlist subclasses that access the destructor of BindStateBase.
+  template <typename Functor, typename... BoundArgs>
+  friend struct BindState;
+  friend struct ::base::FakeBindState;
 
-  AtomicRefCount ref_count_;
+  bool IsCancelled() const {
+    return query_cancellation_traits_(this, IS_CANCELLED);
+  }
+
+  bool MaybeValid() const {
+    return query_cancellation_traits_(this, MAYBE_VALID);
+  }
+
+  // In C++, it is safe to cast function pointers to function pointers of
+  // another type. It is not okay to use void*. We create a InvokeFuncStorage
+  // that that can store our function pointer, and then cast it back to
+  // the original type on usage.
+  InvokeFuncStorage polymorphic_invoke_;
 
   // Pointer to a function that will properly destroy |this|.
-  void (*destructor_)(BindStateBase*);
-
-  DISALLOW_COPY_AND_ASSIGN(BindStateBase);
+  void (*destructor_)(const BindStateBase*);
+  bool (*query_cancellation_traits_)(const BindStateBase*,
+                                     CancellationQueryMode mode);
 };
 
 // Holds the Callback methods that don't require specialization to reduce
 // template bloat.
+// CallbackBase<MoveOnly> is a direct base class of MoveOnly callbacks, and
+// CallbackBase<Copyable> uses CallbackBase<MoveOnly> for its implementation.
 class CallbackBase {
  public:
+  inline CallbackBase(CallbackBase&& c) noexcept;
+  CallbackBase& operator=(CallbackBase&& c) noexcept;
+
+  explicit CallbackBase(const CallbackBaseCopyable& c);
+  CallbackBase& operator=(const CallbackBaseCopyable& c);
+
+  explicit CallbackBase(CallbackBaseCopyable&& c) noexcept;
+  CallbackBase& operator=(CallbackBaseCopyable&& c) noexcept;
+
   // Returns true if Callback is null (doesn't refer to anything).
-  bool is_null() const { return bind_state_.get() == NULL; }
+  bool is_null() const { return !bind_state_; }
+  explicit operator bool() const { return !is_null(); }
+
+  // Returns true if the callback invocation will be nop due to an cancellation.
+  // It's invalid to call this on uninitialized callback.
+  //
+  // Must be called on the Callback's destination sequence.
+  bool IsCancelled() const;
+
+  // If this returns false, the callback invocation will be a nop due to a
+  // cancellation. This may(!) still return true, even on a cancelled callback.
+  //
+  // This function is thread-safe.
+  bool MaybeValid() const;
 
   // Returns the Callback into an uninitialized state.
   void Reset();
 
  protected:
-  // In C++, it is safe to cast function pointers to function pointers of
-  // another type. It is not okay to use void*. We create a InvokeFuncStorage
-  // that that can store our function pointer, and then cast it back to
-  // the original type on usage.
-  typedef void (*InvokeFuncStorage)(void);
+  friend class FinallyExecutorCommon;
+  friend class ThenAndCatchExecutorCommon;
+
+  template <typename ReturnType>
+  friend class PostTaskExecutor;
+
+  using InvokeFuncStorage = BindStateBase::InvokeFuncStorage;
 
   // Returns true if this callback equals |other|. |other| may be null.
-  bool Equals(const CallbackBase& other) const;
+  bool EqualsInternal(const CallbackBase& other) const;
+
+  constexpr inline CallbackBase();
 
   // Allow initializing of |bind_state_| via the constructor to avoid default
-  // initialization of the scoped_refptr.  We do not also initialize
-  // |polymorphic_invoke_| here because doing a normal assignment in the
-  // derived Callback templates makes for much nicer compiler errors.
-  explicit CallbackBase(BindStateBase* bind_state);
+  // initialization of the scoped_refptr.
+  explicit inline CallbackBase(BindStateBase* bind_state);
+
+  InvokeFuncStorage polymorphic_invoke() const {
+    return bind_state_->polymorphic_invoke_;
+  }
 
   // Force the destructor to be instantiated inside this translation unit so
   // that our subclasses will not get inlined versions.  Avoids more template
@@ -109,115 +193,82 @@
   ~CallbackBase();
 
   scoped_refptr<BindStateBase> bind_state_;
-  InvokeFuncStorage polymorphic_invoke_;
 };
 
-// A helper template to determine if given type is non-const move-only-type,
-// i.e. if a value of the given type should be passed via .Pass() in a
-// destructive way.
-template <typename T>
-struct IsMoveOnlyType {
-  template <typename U>
-  static YesType Test(const typename U::MoveOnlyTypeForCPP03*);
+constexpr CallbackBase::CallbackBase() = default;
+CallbackBase::CallbackBase(CallbackBase&&) noexcept = default;
+CallbackBase::CallbackBase(BindStateBase* bind_state)
+    : bind_state_(AdoptRef(bind_state)) {}
 
-  template <typename U>
-  static NoType Test(...);
+// CallbackBase<Copyable> is a direct base class of Copyable Callbacks.
+class CallbackBaseCopyable : public CallbackBase {
+ public:
+  CallbackBaseCopyable(const CallbackBaseCopyable& c);
+  CallbackBaseCopyable(CallbackBaseCopyable&& c) noexcept = default;
+  CallbackBaseCopyable& operator=(const CallbackBaseCopyable& c);
+  CallbackBaseCopyable& operator=(CallbackBaseCopyable&& c) noexcept;
 
-  static const bool value =
-      sizeof(Test<T>(0)) == sizeof(YesType) && !is_const<T>::value;
+ protected:
+  constexpr CallbackBaseCopyable() = default;
+  explicit CallbackBaseCopyable(BindStateBase* bind_state)
+      : CallbackBase(bind_state) {}
+  ~CallbackBaseCopyable() = default;
 };
 
-// This is a typetraits object that's used to take an argument type, and
-// extract a suitable type for storing and forwarding arguments.
-//
-// In particular, it strips off references, and converts arrays to
-// pointers for storage; and it avoids accidentally trying to create a
-// "reference of a reference" if the argument is a reference type.
-//
-// This array type becomes an issue for storage because we are passing bound
-// parameters by const reference. In this case, we end up passing an actual
-// array type in the initializer list which C++ does not allow.  This will
-// break passing of C-string literals.
-template <typename T, bool is_move_only = IsMoveOnlyType<T>::value>
-struct CallbackParamTraits {
-  typedef const T& ForwardType;
-  typedef T StorageType;
+// Helpers for the `Then()` implementation.
+template <typename OriginalCallback, typename ThenCallback>
+struct ThenHelper;
+
+// Specialization when original callback returns `void`.
+template <template <typename> class OriginalCallback,
+          template <typename>
+          class ThenCallback,
+          typename... OriginalArgs,
+          typename ThenR,
+          typename... ThenArgs>
+struct ThenHelper<OriginalCallback<void(OriginalArgs...)>,
+                  ThenCallback<ThenR(ThenArgs...)>> {
+  static_assert(sizeof...(ThenArgs) == 0,
+                "|then| callback cannot accept parameters if |this| has a "
+                "void return type.");
+
+  static auto CreateTrampoline() {
+    return [](OriginalCallback<void(OriginalArgs...)> c1,
+              ThenCallback<ThenR(ThenArgs...)> c2, OriginalArgs... c1_args) {
+      std::move(c1).Run(std::forward<OriginalArgs>(c1_args)...);
+      return std::move(c2).Run();
+    };
+  }
 };
 
-// The Storage should almost be impossible to trigger unless someone manually
-// specifies type of the bind parameters.  However, in case they do,
-// this will guard against us accidentally storing a reference parameter.
-//
-// The ForwardType should only be used for unbound arguments.
-template <typename T>
-struct CallbackParamTraits<T&, false> {
-  typedef T& ForwardType;
-  typedef T StorageType;
+// Specialization when original callback returns a non-void type.
+template <template <typename> class OriginalCallback,
+          template <typename>
+          class ThenCallback,
+          typename OriginalR,
+          typename... OriginalArgs,
+          typename ThenR,
+          typename... ThenArgs>
+struct ThenHelper<OriginalCallback<OriginalR(OriginalArgs...)>,
+                  ThenCallback<ThenR(ThenArgs...)>> {
+  static_assert(sizeof...(ThenArgs) == 1,
+                "|then| callback must accept exactly one parameter if |this| "
+                "has a non-void return type.");
+  // TODO(dcheng): This should probably check is_convertible as well (same with
+  // `AssertBindArgsValidity`).
+  static_assert(std::is_constructible<ThenArgs..., OriginalR&&>::value,
+                "|then| callback's parameter must be constructible from "
+                "return type of |this|.");
+
+  static auto CreateTrampoline() {
+    return [](OriginalCallback<OriginalR(OriginalArgs...)> c1,
+              ThenCallback<ThenR(ThenArgs...)> c2, OriginalArgs... c1_args) {
+      return std::move(c2).Run(
+          std::move(c1).Run(std::forward<OriginalArgs>(c1_args)...));
+    };
+  }
 };
 
-// Note that for array types, we implicitly add a const in the conversion. This
-// means that it is not possible to bind array arguments to functions that take
-// a non-const pointer. Trying to specialize the template based on a "const
-// T[n]" does not seem to match correctly, so we are stuck with this
-// restriction.
-template <typename T, size_t n>
-struct CallbackParamTraits<T[n], false> {
-  typedef const T* ForwardType;
-  typedef const T* StorageType;
-};
-
-// See comment for CallbackParamTraits<T[n]>.
-template <typename T>
-struct CallbackParamTraits<T[], false> {
-  typedef const T* ForwardType;
-  typedef const T* StorageType;
-};
-
-// Parameter traits for movable-but-not-copyable scopers.
-//
-// Callback<>/Bind() understands movable-but-not-copyable semantics where
-// the type cannot be copied but can still have its state destructively
-// transferred (aka. moved) to another instance of the same type by calling a
-// helper function.  When used with Bind(), this signifies transferal of the
-// object's state to the target function.
-//
-// For these types, the ForwardType must not be a const reference, or a
-// reference.  A const reference is inappropriate, and would break const
-// correctness, because we are implementing a destructive move.  A non-const
-// reference cannot be used with temporaries which means the result of a
-// function or a cast would not be usable with Callback<> or Bind().
-template <typename T>
-struct CallbackParamTraits<T, true> {
-  typedef T ForwardType;
-  typedef T StorageType;
-};
-
-// CallbackForward() is a very limited simulation of C++11's std::forward()
-// used by the Callback/Bind system for a set of movable-but-not-copyable
-// types.  It is needed because forwarding a movable-but-not-copyable
-// argument to another function requires us to invoke the proper move
-// operator to create a rvalue version of the type.  The supported types are
-// whitelisted below as overloads of the CallbackForward() function. The
-// default template compiles out to be a no-op.
-//
-// In C++11, std::forward would replace all uses of this function.  However, it
-// is impossible to implement a general std::forward with C++11 due to a lack
-// of rvalue references.
-//
-// In addition to Callback/Bind, this is used by PostTaskAndReplyWithResult to
-// simulate std::forward() and forward the result of one Callback as a
-// parameter to another callback. This is to support Callbacks that return
-// the movable-but-not-copyable types whitelisted above.
-template <typename T>
-typename enable_if<!IsMoveOnlyType<T>::value, T>::type& CallbackForward(T& t) {
-  return t;
-}
-
-template <typename T>
-typename enable_if<IsMoveOnlyType<T>::value, T>::type CallbackForward(T& t) {
-  return t.Pass();
-}
-
 }  // namespace cef_internal
 }  // namespace base
 
diff --git a/src/include/base/internal/cef_lock_impl.h b/src/include/base/internal/cef_lock_impl.h
index 470547f..606e586 100644
--- a/src/include/base/internal/cef_lock_impl.h
+++ b/src/include/base/internal/cef_lock_impl.h
@@ -40,8 +40,6 @@
 #include <pthread.h>
 #endif
 
-#include "include/base/cef_macros.h"
-
 namespace base {
 namespace cef_internal {
 
@@ -57,6 +55,10 @@
 #endif
 
   LockImpl();
+
+  LockImpl(const LockImpl&) = delete;
+  LockImpl& operator=(const LockImpl&) = delete;
+
   ~LockImpl();
 
   // If the lock is not held, take it and return true.  If the lock is already
@@ -77,8 +79,6 @@
 
  private:
   NativeHandle native_handle_;
-
-  DISALLOW_COPY_AND_ASSIGN(LockImpl);
 };
 
 }  // namespace cef_internal
diff --git a/src/include/base/internal/cef_raw_scoped_refptr_mismatch_checker.h b/src/include/base/internal/cef_raw_scoped_refptr_mismatch_checker.h
index 9f2f932..078d89c 100644
--- a/src/include/base/internal/cef_raw_scoped_refptr_mismatch_checker.h
+++ b/src/include/base/internal/cef_raw_scoped_refptr_mismatch_checker.h
@@ -32,10 +32,7 @@
 #ifndef CEF_INCLUDE_BASE_INTERNAL_CEF_RAW_SCOPED_REFPTR_MISMATCH_CHECKER_H_
 #define CEF_INCLUDE_BASE_INTERNAL_CEF_RAW_SCOPED_REFPTR_MISMATCH_CHECKER_H_
 
-#include "include/base/cef_build.h"
-#include "include/base/cef_ref_counted.h"
-#include "include/base/cef_template_util.h"
-#include "include/base/cef_tuple.h"
+#include <type_traits>
 
 // It is dangerous to post a task with a T* argument where T is a subtype of
 // RefCounted(Base|ThreadSafeBase), since by the time the parameter is used, the
@@ -46,132 +43,27 @@
 
 namespace base {
 
+// This is a base internal implementation file used by task.h and callback.h.
+// Not for public consumption, so we wrap it in namespace internal.
 namespace cef_internal {
 
+template <typename T, typename = void>
+struct IsRefCountedType : std::false_type {};
+
 template <typename T>
-struct NeedsScopedRefptrButGetsRawPtr {
-#if defined(OS_WIN)
-  enum { value = base::false_type::value };
-#else
-  enum {
-    // Human readable translation: you needed to be a scoped_refptr if you are a
-    // raw pointer type and are convertible to a RefCounted(Base|ThreadSafeBase)
-    // type.
-    value = (is_pointer<T>::value &&
-             (is_convertible<T, subtle::RefCountedBase*>::value ||
-              is_convertible<T, subtle::RefCountedThreadSafeBase*>::value))
-  };
-#endif
-};
+struct IsRefCountedType<T,
+                        std::void_t<decltype(std::declval<T*>()->AddRef()),
+                                    decltype(std::declval<T*>()->Release())>>
+    : std::true_type {};
 
-template <typename Params>
-struct ParamsUseScopedRefptrCorrectly {
-  enum { value = 0 };
-};
-
-template <>
-struct ParamsUseScopedRefptrCorrectly<Tuple0> {
-  enum { value = 1 };
-};
-
-template <typename A>
-struct ParamsUseScopedRefptrCorrectly<Tuple1<A>> {
-  enum { value = !NeedsScopedRefptrButGetsRawPtr<A>::value };
-};
-
-template <typename A, typename B>
-struct ParamsUseScopedRefptrCorrectly<Tuple2<A, B>> {
-  enum {
-    value = !(NeedsScopedRefptrButGetsRawPtr<A>::value ||
-              NeedsScopedRefptrButGetsRawPtr<B>::value)
-  };
-};
-
-template <typename A, typename B, typename C>
-struct ParamsUseScopedRefptrCorrectly<Tuple3<A, B, C>> {
-  enum {
-    value = !(NeedsScopedRefptrButGetsRawPtr<A>::value ||
-              NeedsScopedRefptrButGetsRawPtr<B>::value ||
-              NeedsScopedRefptrButGetsRawPtr<C>::value)
-  };
-};
-
-template <typename A, typename B, typename C, typename D>
-struct ParamsUseScopedRefptrCorrectly<Tuple4<A, B, C, D>> {
-  enum {
-    value = !(NeedsScopedRefptrButGetsRawPtr<A>::value ||
-              NeedsScopedRefptrButGetsRawPtr<B>::value ||
-              NeedsScopedRefptrButGetsRawPtr<C>::value ||
-              NeedsScopedRefptrButGetsRawPtr<D>::value)
-  };
-};
-
-template <typename A, typename B, typename C, typename D, typename E>
-struct ParamsUseScopedRefptrCorrectly<Tuple5<A, B, C, D, E>> {
-  enum {
-    value = !(NeedsScopedRefptrButGetsRawPtr<A>::value ||
-              NeedsScopedRefptrButGetsRawPtr<B>::value ||
-              NeedsScopedRefptrButGetsRawPtr<C>::value ||
-              NeedsScopedRefptrButGetsRawPtr<D>::value ||
-              NeedsScopedRefptrButGetsRawPtr<E>::value)
-  };
-};
-
-template <typename A,
-          typename B,
-          typename C,
-          typename D,
-          typename E,
-          typename F>
-struct ParamsUseScopedRefptrCorrectly<Tuple6<A, B, C, D, E, F>> {
-  enum {
-    value = !(NeedsScopedRefptrButGetsRawPtr<A>::value ||
-              NeedsScopedRefptrButGetsRawPtr<B>::value ||
-              NeedsScopedRefptrButGetsRawPtr<C>::value ||
-              NeedsScopedRefptrButGetsRawPtr<D>::value ||
-              NeedsScopedRefptrButGetsRawPtr<E>::value ||
-              NeedsScopedRefptrButGetsRawPtr<F>::value)
-  };
-};
-
-template <typename A,
-          typename B,
-          typename C,
-          typename D,
-          typename E,
-          typename F,
-          typename G>
-struct ParamsUseScopedRefptrCorrectly<Tuple7<A, B, C, D, E, F, G>> {
-  enum {
-    value = !(NeedsScopedRefptrButGetsRawPtr<A>::value ||
-              NeedsScopedRefptrButGetsRawPtr<B>::value ||
-              NeedsScopedRefptrButGetsRawPtr<C>::value ||
-              NeedsScopedRefptrButGetsRawPtr<D>::value ||
-              NeedsScopedRefptrButGetsRawPtr<E>::value ||
-              NeedsScopedRefptrButGetsRawPtr<F>::value ||
-              NeedsScopedRefptrButGetsRawPtr<G>::value)
-  };
-};
-
-template <typename A,
-          typename B,
-          typename C,
-          typename D,
-          typename E,
-          typename F,
-          typename G,
-          typename H>
-struct ParamsUseScopedRefptrCorrectly<Tuple8<A, B, C, D, E, F, G, H>> {
-  enum {
-    value = !(NeedsScopedRefptrButGetsRawPtr<A>::value ||
-              NeedsScopedRefptrButGetsRawPtr<B>::value ||
-              NeedsScopedRefptrButGetsRawPtr<C>::value ||
-              NeedsScopedRefptrButGetsRawPtr<D>::value ||
-              NeedsScopedRefptrButGetsRawPtr<E>::value ||
-              NeedsScopedRefptrButGetsRawPtr<F>::value ||
-              NeedsScopedRefptrButGetsRawPtr<G>::value ||
-              NeedsScopedRefptrButGetsRawPtr<H>::value)
-  };
+// Human readable translation: you needed to be a scoped_refptr if you are a raw
+// pointer type and are convertible to a RefCounted(Base|ThreadSafeBase) type.
+template <typename T>
+struct NeedsScopedRefptrButGetsRawPtr
+    : std::conjunction<std::is_pointer<T>,
+                       IsRefCountedType<std::remove_pointer_t<T>>> {
+  static_assert(!std::is_reference<T>::value,
+                "NeedsScopedRefptrButGetsRawPtr requires non-reference type.");
 };
 
 }  // namespace cef_internal
diff --git a/src/include/base/internal/cef_scoped_block_mac.h b/src/include/base/internal/cef_scoped_block_mac.h
new file mode 100644
index 0000000..4e255d1
--- /dev/null
+++ b/src/include/base/internal/cef_scoped_block_mac.h
@@ -0,0 +1,67 @@
+// Copyright (c) 2013 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.
+
+// Do not include this header file directly. Use base/mac/scoped_block.h
+// instead.
+
+#ifndef CEF_INCLUDE_BASE_INTERNAL_CEF_SCOPED_BLOCK_MAC_H_
+#define CEF_INCLUDE_BASE_INTERNAL_CEF_SCOPED_BLOCK_MAC_H_
+
+#include <Block.h>
+
+#include "include/base/cef_scoped_typeref_mac.h"
+
+#if defined(__has_feature) && __has_feature(objc_arc)
+#error \
+    "Cannot include include/base/internal/cef_scoped_block_mac.h in file built with ARC."
+#endif
+
+namespace base {
+namespace mac {
+
+namespace cef_internal {
+
+template <typename B>
+struct ScopedBlockTraits {
+  static B InvalidValue() { return nullptr; }
+  static B Retain(B block) { return Block_copy(block); }
+  static void Release(B block) { Block_release(block); }
+};
+
+}  // namespace cef_internal
+
+// ScopedBlock<> is patterned after ScopedCFTypeRef<>, but uses Block_copy() and
+// Block_release() instead of CFRetain() and CFRelease().
+template <typename B>
+using ScopedBlock = ScopedTypeRef<B, cef_internal::ScopedBlockTraits<B>>;
+
+}  // namespace mac
+}  // namespace base
+
+#endif  // CEF_INCLUDE_BASE_INTERNAL_CEF_SCOPED_BLOCK_MAC_H_
diff --git a/src/include/cef_request_callback.h b/src/include/base/internal/cef_scoped_policy.h
similarity index 60%
copy from src/include/cef_request_callback.h
copy to src/include/base/internal/cef_scoped_policy.h
index 68094de..8ef4fb2 100644
--- a/src/include/cef_request_callback.h
+++ b/src/include/base/internal/cef_scoped_policy.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved.
+// 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
@@ -26,38 +26,28 @@
 // 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.
-//
-// ---------------------------------------------------------------------------
-//
-// The contents of this file must follow a specific format in order to
-// support the CEF translator tool. See the translator.README.txt file in the
-// tools directory for more information.
-//
 
-#ifndef CEF_INCLUDE_CEF_REQUEST_CALLBACK_H_
-#define CEF_INCLUDE_CEF_REQUEST_CALLBACK_H_
-#pragma once
+// Do not include this header file directly. Use base/memory/scoped_policy.h
+// instead.
 
-#include "include/cef_base.h"
+#ifndef CEF_INCLUDE_BASE_INTERNAL_CEF_SCOPED_POLICY_H_
+#define CEF_INCLUDE_BASE_INTERNAL_CEF_SCOPED_POLICY_H_
 
-///
-// Callback interface used for asynchronous continuation of url requests.
-///
-/*--cef(source=library)--*/
-class CefRequestCallback : public virtual CefBaseRefCounted {
- public:
-  ///
-  // Continue the url request. If |allow| is true the request will be continued.
-  // Otherwise, the request will be canceled.
-  ///
-  /*--cef(capi_name=cont)--*/
-  virtual void Continue(bool allow) = 0;
+namespace base {
+namespace scoped_policy {
 
-  ///
-  // Cancel the url request.
-  ///
-  /*--cef()--*/
-  virtual void Cancel() = 0;
+// Defines the ownership policy for a scoped object.
+enum OwnershipPolicy {
+  // The scoped object takes ownership of an object by taking over an existing
+  // ownership claim.
+  ASSUME,
+
+  // The scoped object will retain the object and any initial ownership is
+  // not changed.
+  RETAIN
 };
 
-#endif  // CEF_INCLUDE_CEF_REQUEST_CALLBACK_H_
+}  // namespace scoped_policy
+}  // namespace base
+
+#endif  // CEF_INCLUDE_BASE_INTERNAL_CEF_SCOPED_POLICY_H_
diff --git a/src/include/capi/cef_accessibility_handler_capi.h b/src/include/capi/cef_accessibility_handler_capi.h
index 3bb8363..120714a 100644
--- a/src/include/capi/cef_accessibility_handler_capi.h
+++ b/src/include/capi/cef_accessibility_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=00d5124d346e3f3cc3f53d67bcb766d1d798bf12$
+// $hash=0ac3c8ca887778a840c65108d56038d4d776e073$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_ACCESSIBILITY_HANDLER_CAPI_H_
@@ -47,27 +47,27 @@
 #endif
 
 ///
-// Implement this structure to receive accessibility notification when
-// accessibility events have been registered. The functions of this structure
-// will be called on the UI thread.
+/// Implement this structure to receive accessibility notification when
+/// accessibility events have been registered. The functions of this structure
+/// will be called on the UI thread.
 ///
 typedef struct _cef_accessibility_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called after renderer process sends accessibility tree changes to the
-  // browser process.
+  /// Called after renderer process sends accessibility tree changes to the
+  /// browser process.
   ///
   void(CEF_CALLBACK* on_accessibility_tree_change)(
       struct _cef_accessibility_handler_t* self,
       struct _cef_value_t* value);
 
   ///
-  // Called after renderer process sends accessibility location changes to the
-  // browser process.
+  /// Called after renderer process sends accessibility location changes to the
+  /// browser process.
   ///
   void(CEF_CALLBACK* on_accessibility_location_change)(
       struct _cef_accessibility_handler_t* self,
diff --git a/src/include/capi/cef_app_capi.h b/src/include/capi/cef_app_capi.h
index 033ebb0..f1b58c5 100644
--- a/src/include/capi/cef_app_capi.h
+++ b/src/include/capi/cef_app_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=04cfae434fe901644c1c78f1c30c0921518cc666$
+// $hash=9b523fbf312a8a0cb1c743a3c8aca7bc9cc22bbc$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_APP_CAPI_H_
@@ -54,25 +54,26 @@
 struct _cef_app_t;
 
 ///
-// Implement this structure to provide handler implementations. Methods will be
-// called by the process and/or thread indicated.
+/// Implement this structure to provide handler implementations. Methods will be
+/// called by the process and/or thread indicated.
 ///
 typedef struct _cef_app_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Provides an opportunity to view and/or modify command-line arguments before
-  // processing by CEF and Chromium. The |process_type| value will be NULL for
-  // the browser process. Do not keep a reference to the cef_command_line_t
-  // object passed to this function. The CefSettings.command_line_args_disabled
-  // value can be used to start with an NULL command-line object. Any values
-  // specified in CefSettings that equate to command-line arguments will be set
-  // before this function is called. Be cautious when using this function to
-  // modify command-line arguments for non-browser processes as this may result
-  // in undefined behavior including crashes.
+  /// Provides an opportunity to view and/or modify command-line arguments
+  /// before processing by CEF and Chromium. The |process_type| value will be
+  /// NULL for the browser process. Do not keep a reference to the
+  /// cef_command_line_t object passed to this function. The
+  /// cef_settings_t.command_line_args_disabled value can be used to start with
+  /// an NULL command-line object. Any values specified in CefSettings that
+  /// equate to command-line arguments will be set before this function is
+  /// called. Be cautious when using this function to modify command-line
+  /// arguments for non-browser processes as this may result in undefined
+  /// behavior including crashes.
   ///
   void(CEF_CALLBACK* on_before_command_line_processing)(
       struct _cef_app_t* self,
@@ -80,119 +81,107 @@
       struct _cef_command_line_t* command_line);
 
   ///
-  // Provides an opportunity to register custom schemes. Do not keep a reference
-  // to the |registrar| object. This function is called on the main thread for
-  // each process and the registered schemes should be the same across all
-  // processes.
+  /// Provides an opportunity to register custom schemes. Do not keep a
+  /// reference to the |registrar| object. This function is called on the main
+  /// thread for each process and the registered schemes should be the same
+  /// across all processes.
   ///
   void(CEF_CALLBACK* on_register_custom_schemes)(
       struct _cef_app_t* self,
       struct _cef_scheme_registrar_t* registrar);
 
   ///
-  // Return the handler for resource bundle events. If
-  // CefSettings.pack_loading_disabled is true (1) a handler must be returned.
-  // If no handler is returned resources will be loaded from pack files. This
-  // function is called by the browser and render processes on multiple threads.
+  /// Return the handler for resource bundle events. If
+  /// cef_settings_t.pack_loading_disabled is true (1) a handler must be
+  /// returned. If no handler is returned resources will be loaded from pack
+  /// files. This function is called by the browser and render processes on
+  /// multiple threads.
   ///
   struct _cef_resource_bundle_handler_t*(
       CEF_CALLBACK* get_resource_bundle_handler)(struct _cef_app_t* self);
 
   ///
-  // Return the handler for functionality specific to the browser process. This
-  // function is called on multiple threads in the browser process.
+  /// Return the handler for functionality specific to the browser process. This
+  /// function is called on multiple threads in the browser process.
   ///
   struct _cef_browser_process_handler_t*(
       CEF_CALLBACK* get_browser_process_handler)(struct _cef_app_t* self);
 
   ///
-  // Return the handler for functionality specific to the render process. This
-  // function is called on the render process main thread.
+  /// Return the handler for functionality specific to the render process. This
+  /// function is called on the render process main thread.
   ///
   struct _cef_render_process_handler_t*(
       CEF_CALLBACK* get_render_process_handler)(struct _cef_app_t* self);
 } cef_app_t;
 
 ///
-// This function should be called from the application entry point function to
-// execute a secondary process. It can be used to run secondary processes from
-// the browser client executable (default behavior) or from a separate
-// executable specified by the CefSettings.browser_subprocess_path value. If
-// called for the browser process (identified by no "type" command-line value)
-// it will return immediately with a value of -1. If called for a recognized
-// secondary process it will block until the process should exit and then return
-// the process exit code. The |application| parameter may be NULL. The
-// |windows_sandbox_info| parameter is only used on Windows and may be NULL (see
-// cef_sandbox_win.h for details).
+/// This function should be called from the application entry point function to
+/// execute a secondary process. It can be used to run secondary processes from
+/// the browser client executable (default behavior) or from a separate
+/// executable specified by the cef_settings_t.browser_subprocess_path value. If
+/// called for the browser process (identified by no "type" command-line value)
+/// it will return immediately with a value of -1. If called for a recognized
+/// secondary process it will block until the process should exit and then
+/// return the process exit code. The |application| parameter may be NULL. The
+/// |windows_sandbox_info| parameter is only used on Windows and may be NULL
+/// (see cef_sandbox_win.h for details).
 ///
-CEF_EXPORT int cef_execute_process(const struct _cef_main_args_t* args,
+CEF_EXPORT int cef_execute_process(const cef_main_args_t* args,
                                    cef_app_t* application,
                                    void* windows_sandbox_info);
 
 ///
-// This function should be called on the main application thread to initialize
-// the CEF browser process. The |application| parameter may be NULL. A return
-// value of true (1) indicates that it succeeded and false (0) indicates that it
-// failed. The |windows_sandbox_info| parameter is only used on Windows and may
-// be NULL (see cef_sandbox_win.h for details).
+/// This function should be called on the main application thread to initialize
+/// the CEF browser process. The |application| parameter may be NULL. A return
+/// value of true (1) indicates that it succeeded and false (0) indicates that
+/// it failed. The |windows_sandbox_info| parameter is only used on Windows and
+/// may be NULL (see cef_sandbox_win.h for details).
 ///
-CEF_EXPORT int cef_initialize(const struct _cef_main_args_t* args,
+CEF_EXPORT int cef_initialize(const cef_main_args_t* args,
                               const struct _cef_settings_t* settings,
                               cef_app_t* application,
                               void* windows_sandbox_info);
 
 ///
-// This function should be called on the main application thread to shut down
-// the CEF browser process before the application exits.
+/// This function should be called on the main application thread to shut down
+/// the CEF browser process before the application exits.
 ///
-CEF_EXPORT void cef_shutdown();
+CEF_EXPORT void cef_shutdown(void);
 
 ///
-// Perform a single iteration of CEF message loop processing. This function is
-// provided for cases where the CEF message loop must be integrated into an
-// existing application message loop. Use of this function is not recommended
-// for most users; use either the cef_run_message_loop() function or
-// CefSettings.multi_threaded_message_loop if possible. When using this function
-// care must be taken to balance performance against excessive CPU usage. It is
-// recommended to enable the CefSettings.external_message_pump option when using
-// this function so that
-// cef_browser_process_handler_t::on_schedule_message_pump_work() callbacks can
-// facilitate the scheduling process. This function should only be called on the
-// main application thread and only if cef_initialize() is called with a
-// CefSettings.multi_threaded_message_loop value of false (0). This function
-// will not block.
+/// Perform a single iteration of CEF message loop processing. This function is
+/// provided for cases where the CEF message loop must be integrated into an
+/// existing application message loop. Use of this function is not recommended
+/// for most users; use either the cef_run_message_loop() function or
+/// cef_settings_t.multi_threaded_message_loop if possible. When using this
+/// function care must be taken to balance performance against excessive CPU
+/// usage. It is recommended to enable the cef_settings_t.external_message_pump
+/// option when using this function so that
+/// cef_browser_process_handler_t::on_schedule_message_pump_work() callbacks can
+/// facilitate the scheduling process. This function should only be called on
+/// the main application thread and only if cef_initialize() is called with a
+/// cef_settings_t.multi_threaded_message_loop value of false (0). This function
+/// will not block.
 ///
-CEF_EXPORT void cef_do_message_loop_work();
+CEF_EXPORT void cef_do_message_loop_work(void);
 
 ///
-// Run the CEF message loop. Use this function instead of an application-
-// provided message loop to get the best balance between performance and CPU
-// usage. This function should only be called on the main application thread and
-// only if cef_initialize() is called with a
-// CefSettings.multi_threaded_message_loop value of false (0). This function
-// will block until a quit message is received by the system.
+/// Run the CEF message loop. Use this function instead of an application-
+/// provided message loop to get the best balance between performance and CPU
+/// usage. This function should only be called on the main application thread
+/// and only if cef_initialize() is called with a
+/// cef_settings_t.multi_threaded_message_loop value of false (0). This function
+/// will block until a quit message is received by the system.
 ///
-CEF_EXPORT void cef_run_message_loop();
+CEF_EXPORT void cef_run_message_loop(void);
 
 ///
-// Quit the CEF message loop that was started by calling cef_run_message_loop().
-// This function should only be called on the main application thread and only
-// if cef_run_message_loop() was used.
+/// Quit the CEF message loop that was started by calling
+/// cef_run_message_loop(). This function should only be called on the main
+/// application thread and only if cef_run_message_loop() was used.
 ///
-CEF_EXPORT void cef_quit_message_loop();
-
-///
-// Set to true (1) before calling Windows APIs like TrackPopupMenu that enter a
-// modal message loop. Set to false (0) after exiting the modal message loop.
-///
-CEF_EXPORT void cef_set_osmodal_loop(int osModalLoop);
-
-///
-// Call during process startup to enable High-DPI support on Windows 7 or newer.
-// Older versions of Windows should be left DPI-unaware because they do not
-// support DirectWrite and GDI fonts are kerned very badly.
-///
-CEF_EXPORT void cef_enable_highdpi_support();
+CEF_EXPORT void cef_quit_message_loop(void);
 
 #ifdef __cplusplus
 }
diff --git a/src/include/capi/cef_audio_handler_capi.h b/src/include/capi/cef_audio_handler_capi.h
index 1f6783b..03c9233 100644
--- a/src/include/capi/cef_audio_handler_capi.h
+++ b/src/include/capi/cef_audio_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=430877d950508a545d0baa18c8c8c0d2d183fec4$
+// $hash=932c3ecb22fd26322d96d0e01459122aadafd302$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_AUDIO_HANDLER_CAPI_H_
@@ -48,30 +48,30 @@
 #endif
 
 ///
-// Implement this structure to handle audio events.
+/// Implement this structure to handle audio events.
 ///
 typedef struct _cef_audio_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called on the UI thread to allow configuration of audio stream parameters.
-  // Return true (1) to proceed with audio stream capture, or false (0) to
-  // cancel it. All members of |params| can optionally be configured here, but
-  // they are also pre-filled with some sensible defaults.
+  /// Called on the UI thread to allow configuration of audio stream parameters.
+  /// Return true (1) to proceed with audio stream capture, or false (0) to
+  /// cancel it. All members of |params| can optionally be configured here, but
+  /// they are also pre-filled with some sensible defaults.
   ///
   int(CEF_CALLBACK* get_audio_parameters)(struct _cef_audio_handler_t* self,
                                           struct _cef_browser_t* browser,
                                           cef_audio_parameters_t* params);
 
   ///
-  // Called on a browser audio capture thread when the browser starts streaming
-  // audio. OnAudioSteamStopped will always be called after
-  // OnAudioStreamStarted; both functions may be called multiple times for the
-  // same browser. |params| contains the audio parameters like sample rate and
-  // channel layout. |channels| is the number of channels.
+  /// Called on a browser audio capture thread when the browser starts streaming
+  /// audio. OnAudioStreamStopped will always be called after
+  /// OnAudioStreamStarted; both functions may be called multiple times for the
+  /// same browser. |params| contains the audio parameters like sample rate and
+  /// channel layout. |channels| is the number of channels.
   ///
   void(CEF_CALLBACK* on_audio_stream_started)(
       struct _cef_audio_handler_t* self,
@@ -80,34 +80,34 @@
       int channels);
 
   ///
-  // Called on the audio stream thread when a PCM packet is received for the
-  // stream. |data| is an array representing the raw PCM data as a floating
-  // point type, i.e. 4-byte value(s). |frames| is the number of frames in the
-  // PCM packet. |pts| is the presentation timestamp (in milliseconds since the
-  // Unix Epoch) and represents the time at which the decompressed packet should
-  // be presented to the user. Based on |frames| and the |channel_layout| value
-  // passed to OnAudioStreamStarted you can calculate the size of the |data|
-  // array in bytes.
+  /// Called on the audio stream thread when a PCM packet is received for the
+  /// stream. |data| is an array representing the raw PCM data as a floating
+  /// point type, i.e. 4-byte value(s). |frames| is the number of frames in the
+  /// PCM packet. |pts| is the presentation timestamp (in milliseconds since the
+  /// Unix Epoch) and represents the time at which the decompressed packet
+  /// should be presented to the user. Based on |frames| and the
+  /// |channel_layout| value passed to OnAudioStreamStarted you can calculate
+  /// the size of the |data| array in bytes.
   ///
   void(CEF_CALLBACK* on_audio_stream_packet)(struct _cef_audio_handler_t* self,
                                              struct _cef_browser_t* browser,
                                              const float** data,
                                              int frames,
-                                             int64 pts);
+                                             int64_t pts);
 
   ///
-  // Called on the UI thread when the stream has stopped. OnAudioSteamStopped
-  // will always be called after OnAudioStreamStarted; both functions may be
-  // called multiple times for the same stream.
+  /// Called on the UI thread when the stream has stopped. OnAudioSteamStopped
+  /// will always be called after OnAudioStreamStarted; both functions may be
+  /// called multiple times for the same stream.
   ///
   void(CEF_CALLBACK* on_audio_stream_stopped)(struct _cef_audio_handler_t* self,
                                               struct _cef_browser_t* browser);
 
   ///
-  // Called on the UI or audio stream thread when an error occurred. During the
-  // stream creation phase this callback will be called on the UI thread while
-  // in the capturing phase it will be called on the audio stream thread. The
-  // stream will be stopped immediately.
+  /// Called on the UI or audio stream thread when an error occurred. During the
+  /// stream creation phase this callback will be called on the UI thread while
+  /// in the capturing phase it will be called on the audio stream thread. The
+  /// stream will be stopped immediately.
   ///
   void(CEF_CALLBACK* on_audio_stream_error)(struct _cef_audio_handler_t* self,
                                             struct _cef_browser_t* browser,
diff --git a/src/include/capi/cef_auth_callback_capi.h b/src/include/capi/cef_auth_callback_capi.h
index 5e7ea36..6e74c0a 100644
--- a/src/include/capi/cef_auth_callback_capi.h
+++ b/src/include/capi/cef_auth_callback_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=58be0e24b46373bbdad28031891396ea246f446c$
+// $hash=4b9c31ef9a23f899c6d8cd3da49934a41f1bd231$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_AUTH_CALLBACK_CAPI_H_
@@ -47,24 +47,24 @@
 #endif
 
 ///
-// Callback structure used for asynchronous continuation of authentication
-// requests.
+/// Callback structure used for asynchronous continuation of authentication
+/// requests.
 ///
 typedef struct _cef_auth_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Continue the authentication request.
+  /// Continue the authentication request.
   ///
   void(CEF_CALLBACK* cont)(struct _cef_auth_callback_t* self,
                            const cef_string_t* username,
                            const cef_string_t* password);
 
   ///
-  // Cancel the authentication request.
+  /// Cancel the authentication request.
   ///
   void(CEF_CALLBACK* cancel)(struct _cef_auth_callback_t* self);
 } cef_auth_callback_t;
diff --git a/src/include/capi/cef_browser_capi.h b/src/include/capi/cef_browser_capi.h
index 4336c8d..cf64c83 100644
--- a/src/include/capi/cef_browser_capi.h
+++ b/src/include/capi/cef_browser_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=6cb00a0fa3631a46903abb3a783f315895511db2$
+// $hash=eed525e9abcbf8e8b959067e0056ca470c5210c7$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_BROWSER_CAPI_H_
@@ -57,170 +57,179 @@
 struct _cef_client_t;
 
 ///
-// Structure used to represent a browser window. When used in the browser
-// process the functions of this structure may be called on any thread unless
-// otherwise indicated in the comments. When used in the render process the
-// functions of this structure may only be called on the main thread.
+/// Structure used to represent a browser. When used in the browser process the
+/// functions of this structure may be called on any thread unless otherwise
+/// indicated in the comments. When used in the render process the functions of
+/// this structure may only be called on the main thread.
 ///
 typedef struct _cef_browser_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns the browser host object. This function can only be called in the
-  // browser process.
+  /// True if this object is currently valid. This will return false (0) after
+  /// cef_life_span_handler_t::OnBeforeClose is called.
+  ///
+  int(CEF_CALLBACK* is_valid)(struct _cef_browser_t* self);
+
+  ///
+  /// Returns the browser host object. This function can only be called in the
+  /// browser process.
   ///
   struct _cef_browser_host_t*(CEF_CALLBACK* get_host)(
       struct _cef_browser_t* self);
 
   ///
-  // Returns true (1) if the browser can navigate backwards.
+  /// Returns true (1) if the browser can navigate backwards.
   ///
   int(CEF_CALLBACK* can_go_back)(struct _cef_browser_t* self);
 
   ///
-  // Navigate backwards.
+  /// Navigate backwards.
   ///
   void(CEF_CALLBACK* go_back)(struct _cef_browser_t* self);
 
   ///
-  // Returns true (1) if the browser can navigate forwards.
+  /// Returns true (1) if the browser can navigate forwards.
   ///
   int(CEF_CALLBACK* can_go_forward)(struct _cef_browser_t* self);
 
   ///
-  // Navigate forwards.
+  /// Navigate forwards.
   ///
   void(CEF_CALLBACK* go_forward)(struct _cef_browser_t* self);
 
   ///
-  // Returns true (1) if the browser is currently loading.
+  /// Returns true (1) if the browser is currently loading.
   ///
   int(CEF_CALLBACK* is_loading)(struct _cef_browser_t* self);
 
   ///
-  // Reload the current page.
+  /// Reload the current page.
   ///
   void(CEF_CALLBACK* reload)(struct _cef_browser_t* self);
 
   ///
-  // Reload the current page ignoring any cached data.
+  /// Reload the current page ignoring any cached data.
   ///
   void(CEF_CALLBACK* reload_ignore_cache)(struct _cef_browser_t* self);
 
   ///
-  // Stop loading the page.
+  /// Stop loading the page.
   ///
   void(CEF_CALLBACK* stop_load)(struct _cef_browser_t* self);
 
   ///
-  // Returns the globally unique identifier for this browser. This value is also
-  // used as the tabId for extension APIs.
+  /// Returns the globally unique identifier for this browser. This value is
+  /// also used as the tabId for extension APIs.
   ///
   int(CEF_CALLBACK* get_identifier)(struct _cef_browser_t* self);
 
   ///
-  // Returns true (1) if this object is pointing to the same handle as |that|
-  // object.
+  /// Returns true (1) if this object is pointing to the same handle as |that|
+  /// object.
   ///
   int(CEF_CALLBACK* is_same)(struct _cef_browser_t* self,
                              struct _cef_browser_t* that);
 
   ///
-  // Returns true (1) if the window is a popup window.
+  /// Returns true (1) if the browser is a popup.
   ///
   int(CEF_CALLBACK* is_popup)(struct _cef_browser_t* self);
 
   ///
-  // Returns true (1) if a document has been loaded in the browser.
+  /// Returns true (1) if a document has been loaded in the browser.
   ///
   int(CEF_CALLBACK* has_document)(struct _cef_browser_t* self);
 
   ///
-  // Returns the main (top-level) frame for the browser window.
+  /// Returns the main (top-level) frame for the browser. In the browser process
+  /// this will return a valid object until after
+  /// cef_life_span_handler_t::OnBeforeClose is called. In the renderer process
+  /// this will return NULL if the main frame is hosted in a different renderer
+  /// process (e.g. for cross-origin sub-frames). The main frame object will
+  /// change during cross-origin navigation or re-navigation after renderer
+  /// process termination (due to crashes, etc).
   ///
   struct _cef_frame_t*(CEF_CALLBACK* get_main_frame)(
       struct _cef_browser_t* self);
 
   ///
-  // Returns the focused frame for the browser window.
+  /// Returns the focused frame for the browser.
   ///
   struct _cef_frame_t*(CEF_CALLBACK* get_focused_frame)(
       struct _cef_browser_t* self);
 
   ///
-  // Returns the frame with the specified identifier, or NULL if not found.
+  /// Returns the frame with the specified identifier, or NULL if not found.
   ///
   struct _cef_frame_t*(CEF_CALLBACK* get_frame_byident)(
       struct _cef_browser_t* self,
-      int64 identifier);
+      int64_t identifier);
 
   ///
-  // Returns the frame with the specified name, or NULL if not found.
+  /// Returns the frame with the specified name, or NULL if not found.
   ///
   struct _cef_frame_t*(CEF_CALLBACK* get_frame)(struct _cef_browser_t* self,
                                                 const cef_string_t* name);
 
   ///
-  // Returns the number of frames that currently exist.
+  /// Returns the number of frames that currently exist.
   ///
   size_t(CEF_CALLBACK* get_frame_count)(struct _cef_browser_t* self);
 
   ///
-  // Returns the identifiers of all existing frames.
+  /// Returns the identifiers of all existing frames.
   ///
   void(CEF_CALLBACK* get_frame_identifiers)(struct _cef_browser_t* self,
                                             size_t* identifiersCount,
-                                            int64* identifiers);
+                                            int64_t* identifiers);
 
   ///
-  // Returns the names of all existing frames.
+  /// Returns the names of all existing frames.
   ///
   void(CEF_CALLBACK* get_frame_names)(struct _cef_browser_t* self,
                                       cef_string_list_t names);
 } cef_browser_t;
 
 ///
-// Callback structure for cef_browser_host_t::RunFileDialog. The functions of
-// this structure will be called on the browser process UI thread.
+/// Callback structure for cef_browser_host_t::RunFileDialog. The functions of
+/// this structure will be called on the browser process UI thread.
 ///
 typedef struct _cef_run_file_dialog_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called asynchronously after the file dialog is dismissed.
-  // |selected_accept_filter| is the 0-based index of the value selected from
-  // the accept filters array passed to cef_browser_host_t::RunFileDialog.
-  // |file_paths| will be a single value or a list of values depending on the
-  // dialog mode. If the selection was cancelled |file_paths| will be NULL.
+  /// Called asynchronously after the file dialog is dismissed. |file_paths|
+  /// will be a single value or a list of values depending on the dialog mode.
+  /// If the selection was cancelled |file_paths| will be NULL.
   ///
   void(CEF_CALLBACK* on_file_dialog_dismissed)(
       struct _cef_run_file_dialog_callback_t* self,
-      int selected_accept_filter,
       cef_string_list_t file_paths);
 } cef_run_file_dialog_callback_t;
 
 ///
-// Callback structure for cef_browser_host_t::GetNavigationEntries. The
-// functions of this structure will be called on the browser process UI thread.
+/// Callback structure for cef_browser_host_t::GetNavigationEntries. The
+/// functions of this structure will be called on the browser process UI thread.
 ///
 typedef struct _cef_navigation_entry_visitor_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Method that will be executed. Do not keep a reference to |entry| outside of
-  // this callback. Return true (1) to continue visiting entries or false (0) to
-  // stop. |current| is true (1) if this entry is the currently loaded
-  // navigation entry. |index| is the 0-based index of this entry and |total| is
-  // the total number of entries.
+  /// Method that will be executed. Do not keep a reference to |entry| outside
+  /// of this callback. Return true (1) to continue visiting entries or false
+  /// (0) to stop. |current| is true (1) if this entry is the currently loaded
+  /// navigation entry. |index| is the 0-based index of this entry and |total|
+  /// is the total number of entries.
   ///
   int(CEF_CALLBACK* visit)(struct _cef_navigation_entry_visitor_t* self,
                            struct _cef_navigation_entry_t* entry,
@@ -230,19 +239,19 @@
 } cef_navigation_entry_visitor_t;
 
 ///
-// Callback structure for cef_browser_host_t::PrintToPDF. The functions of this
-// structure will be called on the browser process UI thread.
+/// Callback structure for cef_browser_host_t::PrintToPDF. The functions of this
+/// structure will be called on the browser process UI thread.
 ///
 typedef struct _cef_pdf_print_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Method that will be executed when the PDF printing has completed. |path| is
-  // the output path. |ok| will be true (1) if the printing completed
-  // successfully or false (0) otherwise.
+  /// Method that will be executed when the PDF printing has completed. |path|
+  /// is the output path. |ok| will be true (1) if the printing completed
+  /// successfully or false (0) otherwise.
   ///
   void(CEF_CALLBACK* on_pdf_print_finished)(
       struct _cef_pdf_print_callback_t* self,
@@ -251,20 +260,20 @@
 } cef_pdf_print_callback_t;
 
 ///
-// Callback structure for cef_browser_host_t::DownloadImage. The functions of
-// this structure will be called on the browser process UI thread.
+/// Callback structure for cef_browser_host_t::DownloadImage. The functions of
+/// this structure will be called on the browser process UI thread.
 ///
 typedef struct _cef_download_image_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Method that will be executed when the image download has completed.
-  // |image_url| is the URL that was downloaded and |http_status_code| is the
-  // resulting HTTP status code. |image| is the resulting image, possibly at
-  // multiple scale factors, or NULL if the download failed.
+  /// Method that will be executed when the image download has completed.
+  /// |image_url| is the URL that was downloaded and |http_status_code| is the
+  /// resulting HTTP status code. |image| is the resulting image, possibly at
+  /// multiple scale factors, or NULL if the download failed.
   ///
   void(CEF_CALLBACK* on_download_image_finished)(
       struct _cef_download_image_callback_t* self,
@@ -274,114 +283,139 @@
 } cef_download_image_callback_t;
 
 ///
-// Structure used to represent the browser process aspects of a browser window.
-// The functions of this structure can only be called in the browser process.
-// They may be called on any thread in that process unless otherwise indicated
-// in the comments.
+/// Structure used to represent the browser process aspects of a browser. The
+/// functions of this structure can only be called in the browser process. They
+/// may be called on any thread in that process unless otherwise indicated in
+/// the comments.
 ///
 typedef struct _cef_browser_host_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns the hosted browser object.
+  /// Returns the hosted browser object.
   ///
   struct _cef_browser_t*(CEF_CALLBACK* get_browser)(
       struct _cef_browser_host_t* self);
 
   ///
-  // Request that the browser close. The JavaScript 'onbeforeunload' event will
-  // be fired. If |force_close| is false (0) the event handler, if any, will be
-  // allowed to prompt the user and the user can optionally cancel the close. If
-  // |force_close| is true (1) the prompt will not be displayed and the close
-  // will proceed. Results in a call to cef_life_span_handler_t::do_close() if
-  // the event handler allows the close or if |force_close| is true (1). See
-  // cef_life_span_handler_t::do_close() documentation for additional usage
-  // information.
+  /// Request that the browser close. The JavaScript 'onbeforeunload' event will
+  /// be fired. If |force_close| is false (0) the event handler, if any, will be
+  /// allowed to prompt the user and the user can optionally cancel the close.
+  /// If |force_close| is true (1) the prompt will not be displayed and the
+  /// close will proceed. Results in a call to
+  /// cef_life_span_handler_t::do_close() if the event handler allows the close
+  /// or if |force_close| is true (1). See cef_life_span_handler_t::do_close()
+  /// documentation for additional usage information.
   ///
   void(CEF_CALLBACK* close_browser)(struct _cef_browser_host_t* self,
                                     int force_close);
 
   ///
-  // Helper for closing a browser. Call this function from the top-level window
-  // close handler. Internally this calls CloseBrowser(false (0)) if the close
-  // has not yet been initiated. This function returns false (0) while the close
-  // is pending and true (1) after the close has completed. See close_browser()
-  // and cef_life_span_handler_t::do_close() documentation for additional usage
-  // information. This function must be called on the browser process UI thread.
+  /// Helper for closing a browser. Call this function from the top-level window
+  /// close handler (if any). Internally this calls CloseBrowser(false (0)) if
+  /// the close has not yet been initiated. This function returns false (0)
+  /// while the close is pending and true (1) after the close has completed. See
+  /// close_browser() and cef_life_span_handler_t::do_close() documentation for
+  /// additional usage information. This function must be called on the browser
+  /// process UI thread.
   ///
   int(CEF_CALLBACK* try_close_browser)(struct _cef_browser_host_t* self);
 
   ///
-  // Set whether the browser is focused.
+  /// Set whether the browser is focused.
   ///
   void(CEF_CALLBACK* set_focus)(struct _cef_browser_host_t* self, int focus);
 
   ///
-  // Retrieve the window handle for this browser. If this browser is wrapped in
-  // a cef_browser_view_t this function should be called on the browser process
-  // UI thread and it will return the handle for the top-level native window.
+  /// Retrieve the window handle (if any) for this browser. If this browser is
+  /// wrapped in a cef_browser_view_t this function should be called on the
+  /// browser process UI thread and it will return the handle for the top-level
+  /// native window.
   ///
   cef_window_handle_t(CEF_CALLBACK* get_window_handle)(
       struct _cef_browser_host_t* self);
 
   ///
-  // Retrieve the window handle of the browser that opened this browser. Will
-  // return NULL for non-popup windows or if this browser is wrapped in a
-  // cef_browser_view_t. This function can be used in combination with custom
-  // handling of modal windows.
+  /// Retrieve the window handle (if any) of the browser that opened this
+  /// browser. Will return NULL for non-popup browsers or if this browser is
+  /// wrapped in a cef_browser_view_t. This function can be used in combination
+  /// with custom handling of modal windows.
   ///
   cef_window_handle_t(CEF_CALLBACK* get_opener_window_handle)(
       struct _cef_browser_host_t* self);
 
   ///
-  // Returns true (1) if this browser is wrapped in a cef_browser_view_t.
+  /// Returns true (1) if this browser is wrapped in a cef_browser_view_t.
   ///
   int(CEF_CALLBACK* has_view)(struct _cef_browser_host_t* self);
 
   ///
-  // Returns the client for this browser.
+  /// Returns the client for this browser.
   ///
   struct _cef_client_t*(CEF_CALLBACK* get_client)(
       struct _cef_browser_host_t* self);
 
   ///
-  // Returns the request context for this browser.
+  /// Returns the request context for this browser.
   ///
   struct _cef_request_context_t*(CEF_CALLBACK* get_request_context)(
       struct _cef_browser_host_t* self);
 
   ///
-  // Get the current zoom level. The default zoom level is 0.0. This function
-  // can only be called on the UI thread.
+  /// Returns true (1) if this browser can execute the specified zoom command.
+  /// This function can only be called on the UI thread.
+  ///
+  int(CEF_CALLBACK* can_zoom)(struct _cef_browser_host_t* self,
+                              cef_zoom_command_t command);
+
+  ///
+  /// Execute a zoom command in this browser. If called on the UI thread the
+  /// change will be applied immediately. Otherwise, the change will be applied
+  /// asynchronously on the UI thread.
+  ///
+  void(CEF_CALLBACK* zoom)(struct _cef_browser_host_t* self,
+                           cef_zoom_command_t command);
+
+  ///
+  /// Get the default zoom level. This value will be 0.0 by default but can be
+  /// configured with the Chrome runtime. This function can only be called on
+  /// the UI thread.
+  ///
+  double(CEF_CALLBACK* get_default_zoom_level)(
+      struct _cef_browser_host_t* self);
+
+  ///
+  /// Get the current zoom level. This function can only be called on the UI
+  /// thread.
   ///
   double(CEF_CALLBACK* get_zoom_level)(struct _cef_browser_host_t* self);
 
   ///
-  // Change the zoom level to the specified value. Specify 0.0 to reset the zoom
-  // level. If called on the UI thread the change will be applied immediately.
-  // Otherwise, the change will be applied asynchronously on the UI thread.
+  /// Change the zoom level to the specified value. Specify 0.0 to reset the
+  /// zoom level to the default. If called on the UI thread the change will be
+  /// applied immediately. Otherwise, the change will be applied asynchronously
+  /// on the UI thread.
   ///
   void(CEF_CALLBACK* set_zoom_level)(struct _cef_browser_host_t* self,
                                      double zoomLevel);
 
   ///
-  // Call to run a file chooser dialog. Only a single file chooser dialog may be
-  // pending at any given time. |mode| represents the type of dialog to display.
-  // |title| to the title to be used for the dialog and may be NULL to show the
-  // default title ("Open" or "Save" depending on the mode). |default_file_path|
-  // is the path with optional directory and/or file name component that will be
-  // initially selected in the dialog. |accept_filters| are used to restrict the
-  // selectable file types and may any combination of (a) valid lower-cased MIME
-  // types (e.g. "text/*" or "image/*"), (b) individual file extensions (e.g.
-  // ".txt" or ".png"), or (c) combined description and file extension delimited
-  // using "|" and ";" (e.g. "Image Types|.png;.gif;.jpg").
-  // |selected_accept_filter| is the 0-based index of the filter that will be
-  // selected by default. |callback| will be executed after the dialog is
-  // dismissed or immediately if another dialog is already pending. The dialog
-  // will be initiated asynchronously on the UI thread.
+  /// Call to run a file chooser dialog. Only a single file chooser dialog may
+  /// be pending at any given time. |mode| represents the type of dialog to
+  /// display. |title| to the title to be used for the dialog and may be NULL to
+  /// show the default title ("Open" or "Save" depending on the mode).
+  /// |default_file_path| is the path with optional directory and/or file name
+  /// component that will be initially selected in the dialog. |accept_filters|
+  /// are used to restrict the selectable file types and may any combination of
+  /// (a) valid lower-cased MIME types (e.g. "text/*" or "image/*"), (b)
+  /// individual file extensions (e.g. ".txt" or ".png"), or (c) combined
+  /// description and file extension delimited using "|" and ";" (e.g. "Image
+  /// Types|.png;.gif;.jpg"). |callback| will be executed after the dialog is
+  /// dismissed or immediately if another dialog is already pending. The dialog
+  /// will be initiated asynchronously on the UI thread.
   ///
   void(CEF_CALLBACK* run_file_dialog)(
       struct _cef_browser_host_t* self,
@@ -389,45 +423,44 @@
       const cef_string_t* title,
       const cef_string_t* default_file_path,
       cef_string_list_t accept_filters,
-      int selected_accept_filter,
       struct _cef_run_file_dialog_callback_t* callback);
 
   ///
-  // Download the file at |url| using cef_download_handler_t.
+  /// Download the file at |url| using cef_download_handler_t.
   ///
   void(CEF_CALLBACK* start_download)(struct _cef_browser_host_t* self,
                                      const cef_string_t* url);
 
   ///
-  // Download |image_url| and execute |callback| on completion with the images
-  // received from the renderer. If |is_favicon| is true (1) then cookies are
-  // not sent and not accepted during download. Images with density independent
-  // pixel (DIP) sizes larger than |max_image_size| are filtered out from the
-  // image results. Versions of the image at different scale factors may be
-  // downloaded up to the maximum scale factor supported by the system. If there
-  // are no image results <= |max_image_size| then the smallest image is resized
-  // to |max_image_size| and is the only result. A |max_image_size| of 0 means
-  // unlimited. If |bypass_cache| is true (1) then |image_url| is requested from
-  // the server even if it is present in the browser cache.
+  /// Download |image_url| and execute |callback| on completion with the images
+  /// received from the renderer. If |is_favicon| is true (1) then cookies are
+  /// not sent and not accepted during download. Images with density independent
+  /// pixel (DIP) sizes larger than |max_image_size| are filtered out from the
+  /// image results. Versions of the image at different scale factors may be
+  /// downloaded up to the maximum scale factor supported by the system. If
+  /// there are no image results <= |max_image_size| then the smallest image is
+  /// resized to |max_image_size| and is the only result. A |max_image_size| of
+  /// 0 means unlimited. If |bypass_cache| is true (1) then |image_url| is
+  /// requested from the server even if it is present in the browser cache.
   ///
   void(CEF_CALLBACK* download_image)(
       struct _cef_browser_host_t* self,
       const cef_string_t* image_url,
       int is_favicon,
-      uint32 max_image_size,
+      uint32_t max_image_size,
       int bypass_cache,
       struct _cef_download_image_callback_t* callback);
 
   ///
-  // Print the current browser contents.
+  /// Print the current browser contents.
   ///
   void(CEF_CALLBACK* print)(struct _cef_browser_host_t* self);
 
   ///
-  // Print the current browser contents to the PDF file specified by |path| and
-  // execute |callback| on completion. The caller is responsible for deleting
-  // |path| when done. For PDF printing to work on Linux you must implement the
-  // cef_print_handler_t::GetPdfPaperSize function.
+  /// Print the current browser contents to the PDF file specified by |path| and
+  /// execute |callback| on completion. The caller is responsible for deleting
+  /// |path| when done. For PDF printing to work on Linux you must implement the
+  /// cef_print_handler_t::GetPdfPaperSize function.
   ///
   void(CEF_CALLBACK* print_to_pdf)(
       struct _cef_browser_host_t* self,
@@ -436,37 +469,34 @@
       struct _cef_pdf_print_callback_t* callback);
 
   ///
-  // Search for |searchText|. |identifier| must be a unique ID and these IDs
-  // must strictly increase so that newer requests always have greater IDs than
-  // older requests. If |identifier| is zero or less than the previous ID value
-  // then it will be automatically assigned a new valid ID. |forward| indicates
-  // whether to search forward or backward within the page. |matchCase|
-  // indicates whether the search should be case-sensitive. |findNext| indicates
-  // whether this is the first request or a follow-up. The cef_find_handler_t
-  // instance, if any, returned via cef_client_t::GetFindHandler will be called
-  // to report find results.
+  /// Search for |searchText|. |forward| indicates whether to search forward or
+  /// backward within the page. |matchCase| indicates whether the search should
+  /// be case-sensitive. |findNext| indicates whether this is the first request
+  /// or a follow-up. The search will be restarted if |searchText| or
+  /// |matchCase| change. The search will be stopped if |searchText| is NULL.
+  /// The cef_find_handler_t instance, if any, returned via
+  /// cef_client_t::GetFindHandler will be called to report find results.
   ///
   void(CEF_CALLBACK* find)(struct _cef_browser_host_t* self,
-                           int identifier,
                            const cef_string_t* searchText,
                            int forward,
                            int matchCase,
                            int findNext);
 
   ///
-  // Cancel all searches that are currently going on.
+  /// Cancel all searches that are currently going on.
   ///
   void(CEF_CALLBACK* stop_finding)(struct _cef_browser_host_t* self,
                                    int clearSelection);
 
   ///
-  // Open developer tools (DevTools) in its own browser. The DevTools browser
-  // will remain associated with this browser. If the DevTools browser is
-  // already open then it will be focused, in which case the |windowInfo|,
-  // |client| and |settings| parameters will be ignored. If |inspect_element_at|
-  // is non-NULL then the element at the specified (x,y) location will be
-  // inspected. The |windowInfo| parameter will be ignored if this browser is
-  // wrapped in a cef_browser_view_t.
+  /// Open developer tools (DevTools) in its own browser. The DevTools browser
+  /// will remain associated with this browser. If the DevTools browser is
+  /// already open then it will be focused, in which case the |windowInfo|,
+  /// |client| and |settings| parameters will be ignored. If
+  /// |inspect_element_at| is non-NULL then the element at the specified (x,y)
+  /// location will be inspected. The |windowInfo| parameter will be ignored if
+  /// this browser is wrapped in a cef_browser_view_t.
   ///
   void(CEF_CALLBACK* show_dev_tools)(
       struct _cef_browser_host_t* self,
@@ -476,64 +506,65 @@
       const cef_point_t* inspect_element_at);
 
   ///
-  // Explicitly close the associated DevTools browser, if any.
+  /// Explicitly close the associated DevTools browser, if any.
   ///
   void(CEF_CALLBACK* close_dev_tools)(struct _cef_browser_host_t* self);
 
   ///
-  // Returns true (1) if this browser currently has an associated DevTools
-  // browser. Must be called on the browser process UI thread.
+  /// Returns true (1) if this browser currently has an associated DevTools
+  /// browser. Must be called on the browser process UI thread.
   ///
   int(CEF_CALLBACK* has_dev_tools)(struct _cef_browser_host_t* self);
 
   ///
-  // Send a function call message over the DevTools protocol. |message| must be
-  // a UTF8-encoded JSON dictionary that contains "id" (int), "function"
-  // (string) and "params" (dictionary, optional) values. See the DevTools
-  // protocol documentation at https://chromedevtools.github.io/devtools-
-  // protocol/ for details of supported functions and the expected "params"
-  // dictionary contents. |message| will be copied if necessary. This function
-  // will return true (1) if called on the UI thread and the message was
-  // successfully submitted for validation, otherwise false (0). Validation will
-  // be applied asynchronously and any messages that fail due to formatting
-  // errors or missing parameters may be discarded without notification. Prefer
-  // ExecuteDevToolsMethod if a more structured approach to message formatting
-  // is desired.
-  //
-  // Every valid function call will result in an asynchronous function result or
-  // error message that references the sent message "id". Event messages are
-  // received while notifications are enabled (for example, between function
-  // calls for "Page.enable" and "Page.disable"). All received messages will be
-  // delivered to the observer(s) registered with AddDevToolsMessageObserver.
-  // See cef_dev_tools_message_observer_t::OnDevToolsMessage documentation for
-  // details of received message contents.
-  //
-  // Usage of the SendDevToolsMessage, ExecuteDevToolsMethod and
-  // AddDevToolsMessageObserver functions does not require an active DevTools
-  // front-end or remote-debugging session. Other active DevTools sessions will
-  // continue to function independently. However, any modification of global
-  // browser state by one session may not be reflected in the UI of other
-  // sessions.
-  //
-  // Communication with the DevTools front-end (when displayed) can be logged
-  // for development purposes by passing the `--devtools-protocol-log-
-  // file=<path>` command-line flag.
+  /// Send a function call message over the DevTools protocol. |message| must be
+  /// a UTF8-encoded JSON dictionary that contains "id" (int), "function"
+  /// (string) and "params" (dictionary, optional) values. See the DevTools
+  /// protocol documentation at https://chromedevtools.github.io/devtools-
+  /// protocol/ for details of supported functions and the expected "params"
+  /// dictionary contents. |message| will be copied if necessary. This function
+  /// will return true (1) if called on the UI thread and the message was
+  /// successfully submitted for validation, otherwise false (0). Validation
+  /// will be applied asynchronously and any messages that fail due to
+  /// formatting errors or missing parameters may be discarded without
+  /// notification. Prefer ExecuteDevToolsMethod if a more structured approach
+  /// to message formatting is desired.
+  ///
+  /// Every valid function call will result in an asynchronous function result
+  /// or error message that references the sent message "id". Event messages are
+  /// received while notifications are enabled (for example, between function
+  /// calls for "Page.enable" and "Page.disable"). All received messages will be
+  /// delivered to the observer(s) registered with AddDevToolsMessageObserver.
+  /// See cef_dev_tools_message_observer_t::OnDevToolsMessage documentation for
+  /// details of received message contents.
+  ///
+  /// Usage of the SendDevToolsMessage, ExecuteDevToolsMethod and
+  /// AddDevToolsMessageObserver functions does not require an active DevTools
+  /// front-end or remote-debugging session. Other active DevTools sessions will
+  /// continue to function independently. However, any modification of global
+  /// browser state by one session may not be reflected in the UI of other
+  /// sessions.
+  ///
+  /// Communication with the DevTools front-end (when displayed) can be logged
+  /// for development purposes by passing the `--devtools-protocol-log-
+  /// file=<path>` command-line flag.
   ///
   int(CEF_CALLBACK* send_dev_tools_message)(struct _cef_browser_host_t* self,
                                             const void* message,
                                             size_t message_size);
 
   ///
-  // Execute a function call over the DevTools protocol. This is a more
-  // structured version of SendDevToolsMessage. |message_id| is an incremental
-  // number that uniquely identifies the message (pass 0 to have the next number
-  // assigned automatically based on previous values). |function| is the
-  // function name. |params| are the function parameters, which may be NULL. See
-  // the DevTools protocol documentation (linked above) for details of supported
-  // functions and the expected |params| dictionary contents. This function will
-  // return the assigned message ID if called on the UI thread and the message
-  // was successfully submitted for validation, otherwise 0. See the
-  // SendDevToolsMessage documentation for additional usage information.
+  /// Execute a function call over the DevTools protocol. This is a more
+  /// structured version of SendDevToolsMessage. |message_id| is an incremental
+  /// number that uniquely identifies the message (pass 0 to have the next
+  /// number assigned automatically based on previous values). |function| is the
+  /// function name. |params| are the function parameters, which may be NULL.
+  /// See the DevTools protocol documentation (linked above) for details of
+  /// supported functions and the expected |params| dictionary contents. This
+  /// function will return the assigned message ID if called on the UI thread
+  /// and the message was successfully submitted for validation, otherwise 0.
+  /// See the SendDevToolsMessage documentation for additional usage
+  /// information.
   ///
   int(CEF_CALLBACK* execute_dev_tools_method)(
       struct _cef_browser_host_t* self,
@@ -542,20 +573,20 @@
       struct _cef_dictionary_value_t* params);
 
   ///
-  // Add an observer for DevTools protocol messages (function results and
-  // events). The observer will remain registered until the returned
-  // Registration object is destroyed. See the SendDevToolsMessage documentation
-  // for additional usage information.
+  /// Add an observer for DevTools protocol messages (function results and
+  /// events). The observer will remain registered until the returned
+  /// Registration object is destroyed. See the SendDevToolsMessage
+  /// documentation for additional usage information.
   ///
   struct _cef_registration_t*(CEF_CALLBACK* add_dev_tools_message_observer)(
       struct _cef_browser_host_t* self,
       struct _cef_dev_tools_message_observer_t* observer);
 
   ///
-  // Retrieve a snapshot of current navigation entries as values sent to the
-  // specified visitor. If |current_only| is true (1) only the current
-  // navigation entry will be sent, otherwise all navigation entries will be
-  // sent.
+  /// Retrieve a snapshot of current navigation entries as values sent to the
+  /// specified visitor. If |current_only| is true (1) only the current
+  /// navigation entry will be sent, otherwise all navigation entries will be
+  /// sent.
   ///
   void(CEF_CALLBACK* get_navigation_entries)(
       struct _cef_browser_host_t* self,
@@ -563,184 +594,166 @@
       int current_only);
 
   ///
-  // Set whether mouse cursor change is disabled.
-  ///
-  void(CEF_CALLBACK* set_mouse_cursor_change_disabled)(
-      struct _cef_browser_host_t* self,
-      int disabled);
-
-  ///
-  // Returns true (1) if mouse cursor change is disabled.
-  ///
-  int(CEF_CALLBACK* is_mouse_cursor_change_disabled)(
-      struct _cef_browser_host_t* self);
-
-  ///
-  // If a misspelled word is currently selected in an editable node calling this
-  // function will replace it with the specified |word|.
+  /// If a misspelled word is currently selected in an editable node calling
+  /// this function will replace it with the specified |word|.
   ///
   void(CEF_CALLBACK* replace_misspelling)(struct _cef_browser_host_t* self,
                                           const cef_string_t* word);
 
   ///
-  // Add the specified |word| to the spelling dictionary.
+  /// Add the specified |word| to the spelling dictionary.
   ///
   void(CEF_CALLBACK* add_word_to_dictionary)(struct _cef_browser_host_t* self,
                                              const cef_string_t* word);
 
   ///
-  // Returns true (1) if window rendering is disabled.
+  /// Returns true (1) if window rendering is disabled.
   ///
   int(CEF_CALLBACK* is_window_rendering_disabled)(
       struct _cef_browser_host_t* self);
 
   ///
-  // Notify the browser that the widget has been resized. The browser will first
-  // call cef_render_handler_t::GetViewRect to get the new size and then call
-  // cef_render_handler_t::OnPaint asynchronously with the updated regions. This
-  // function is only used when window rendering is disabled.
+  /// Notify the browser that the widget has been resized. The browser will
+  /// first call cef_render_handler_t::GetViewRect to get the new size and then
+  /// call cef_render_handler_t::OnPaint asynchronously with the updated
+  /// regions. This function is only used when window rendering is disabled.
   ///
   void(CEF_CALLBACK* was_resized)(struct _cef_browser_host_t* self);
 
   ///
-  // Notify the browser that it has been hidden or shown. Layouting and
-  // cef_render_handler_t::OnPaint notification will stop when the browser is
-  // hidden. This function is only used when window rendering is disabled.
+  /// Notify the browser that it has been hidden or shown. Layouting and
+  /// cef_render_handler_t::OnPaint notification will stop when the browser is
+  /// hidden. This function is only used when window rendering is disabled.
   ///
   void(CEF_CALLBACK* was_hidden)(struct _cef_browser_host_t* self, int hidden);
 
   ///
-  // Send a notification to the browser that the screen info has changed. The
-  // browser will then call cef_render_handler_t::GetScreenInfo to update the
-  // screen information with the new values. This simulates moving the webview
-  // window from one display to another, or changing the properties of the
-  // current display. This function is only used when window rendering is
-  // disabled.
+  /// Send a notification to the browser that the screen info has changed. The
+  /// browser will then call cef_render_handler_t::GetScreenInfo to update the
+  /// screen information with the new values. This simulates moving the webview
+  /// window from one display to another, or changing the properties of the
+  /// current display. This function is only used when window rendering is
+  /// disabled.
   ///
   void(CEF_CALLBACK* notify_screen_info_changed)(
       struct _cef_browser_host_t* self);
 
   ///
-  // Invalidate the view. The browser will call cef_render_handler_t::OnPaint
-  // asynchronously. This function is only used when window rendering is
-  // disabled.
+  /// Invalidate the view. The browser will call cef_render_handler_t::OnPaint
+  /// asynchronously. This function is only used when window rendering is
+  /// disabled.
   ///
   void(CEF_CALLBACK* invalidate)(struct _cef_browser_host_t* self,
                                  cef_paint_element_type_t type);
 
   ///
-  // Issue a BeginFrame request to Chromium.  Only valid when
-  // cef_window_tInfo::external_begin_frame_enabled is set to true (1).
+  /// Issue a BeginFrame request to Chromium.  Only valid when
+  /// cef_window_tInfo::external_begin_frame_enabled is set to true (1).
   ///
   void(CEF_CALLBACK* send_external_begin_frame)(
       struct _cef_browser_host_t* self);
 
   ///
-  // Send a key event to the browser.
+  /// Send a key event to the browser.
   ///
   void(CEF_CALLBACK* send_key_event)(struct _cef_browser_host_t* self,
-                                     const struct _cef_key_event_t* event);
+                                     const cef_key_event_t* event);
 
   ///
-  // Send a mouse click event to the browser. The |x| and |y| coordinates are
-  // relative to the upper-left corner of the view.
+  /// Send a mouse click event to the browser. The |x| and |y| coordinates are
+  /// relative to the upper-left corner of the view.
   ///
-  void(CEF_CALLBACK* send_mouse_click_event)(
-      struct _cef_browser_host_t* self,
-      const struct _cef_mouse_event_t* event,
-      cef_mouse_button_type_t type,
-      int mouseUp,
-      int clickCount);
+  void(CEF_CALLBACK* send_mouse_click_event)(struct _cef_browser_host_t* self,
+                                             const cef_mouse_event_t* event,
+                                             cef_mouse_button_type_t type,
+                                             int mouseUp,
+                                             int clickCount);
 
   ///
-  // Send a mouse move event to the browser. The |x| and |y| coordinates are
-  // relative to the upper-left corner of the view.
+  /// Send a mouse move event to the browser. The |x| and |y| coordinates are
+  /// relative to the upper-left corner of the view.
   ///
-  void(CEF_CALLBACK* send_mouse_move_event)(
-      struct _cef_browser_host_t* self,
-      const struct _cef_mouse_event_t* event,
-      int mouseLeave);
+  void(CEF_CALLBACK* send_mouse_move_event)(struct _cef_browser_host_t* self,
+                                            const cef_mouse_event_t* event,
+                                            int mouseLeave);
 
   ///
-  // Send a mouse wheel event to the browser. The |x| and |y| coordinates are
-  // relative to the upper-left corner of the view. The |deltaX| and |deltaY|
-  // values represent the movement delta in the X and Y directions respectively.
-  // In order to scroll inside select popups with window rendering disabled
-  // cef_render_handler_t::GetScreenPoint should be implemented properly.
+  /// Send a mouse wheel event to the browser. The |x| and |y| coordinates are
+  /// relative to the upper-left corner of the view. The |deltaX| and |deltaY|
+  /// values represent the movement delta in the X and Y directions
+  /// respectively. In order to scroll inside select popups with window
+  /// rendering disabled cef_render_handler_t::GetScreenPoint should be
+  /// implemented properly.
   ///
-  void(CEF_CALLBACK* send_mouse_wheel_event)(
-      struct _cef_browser_host_t* self,
-      const struct _cef_mouse_event_t* event,
-      int deltaX,
-      int deltaY);
+  void(CEF_CALLBACK* send_mouse_wheel_event)(struct _cef_browser_host_t* self,
+                                             const cef_mouse_event_t* event,
+                                             int deltaX,
+                                             int deltaY);
 
   ///
-  // Send a touch event to the browser for a windowless browser.
+  /// Send a touch event to the browser for a windowless browser.
   ///
   void(CEF_CALLBACK* send_touch_event)(struct _cef_browser_host_t* self,
-                                       const struct _cef_touch_event_t* event);
+                                       const cef_touch_event_t* event);
 
   ///
-  // Send a focus event to the browser.
-  ///
-  void(CEF_CALLBACK* send_focus_event)(struct _cef_browser_host_t* self,
-                                       int setFocus);
-
-  ///
-  // Send a capture lost event to the browser.
+  /// Send a capture lost event to the browser.
   ///
   void(CEF_CALLBACK* send_capture_lost_event)(struct _cef_browser_host_t* self);
 
   ///
-  // Notify the browser that the window hosting it is about to be moved or
-  // resized. This function is only used on Windows and Linux.
+  /// Notify the browser that the window hosting it is about to be moved or
+  /// resized. This function is only used on Windows and Linux.
   ///
   void(CEF_CALLBACK* notify_move_or_resize_started)(
       struct _cef_browser_host_t* self);
 
   ///
-  // Returns the maximum rate in frames per second (fps) that
-  // cef_render_handler_t:: OnPaint will be called for a windowless browser. The
-  // actual fps may be lower if the browser cannot generate frames at the
-  // requested rate. The minimum value is 1 and the maximum value is 60 (default
-  // 30). This function can only be called on the UI thread.
+  /// Returns the maximum rate in frames per second (fps) that
+  /// cef_render_handler_t::OnPaint will be called for a windowless browser. The
+  /// actual fps may be lower if the browser cannot generate frames at the
+  /// requested rate. The minimum value is 1 and the maximum value is 60
+  /// (default 30). This function can only be called on the UI thread.
   ///
   int(CEF_CALLBACK* get_windowless_frame_rate)(
       struct _cef_browser_host_t* self);
 
   ///
-  // Set the maximum rate in frames per second (fps) that cef_render_handler_t::
-  // OnPaint will be called for a windowless browser. The actual fps may be
-  // lower if the browser cannot generate frames at the requested rate. The
-  // minimum value is 1 and the maximum value is 60 (default 30). Can also be
-  // set at browser creation via cef_browser_tSettings.windowless_frame_rate.
+  /// Set the maximum rate in frames per second (fps) that
+  /// cef_render_handler_t:: OnPaint will be called for a windowless browser.
+  /// The actual fps may be lower if the browser cannot generate frames at the
+  /// requested rate. The minimum value is 1 and the maximum value is 60
+  /// (default 30). Can also be set at browser creation via
+  /// cef_browser_tSettings.windowless_frame_rate.
   ///
   void(CEF_CALLBACK* set_windowless_frame_rate)(
       struct _cef_browser_host_t* self,
       int frame_rate);
 
   ///
-  // Begins a new composition or updates the existing composition. Blink has a
-  // special node (a composition node) that allows the input function to change
-  // text without affecting other DOM nodes. |text| is the optional text that
-  // will be inserted into the composition node. |underlines| is an optional set
-  // of ranges that will be underlined in the resulting text.
-  // |replacement_range| is an optional range of the existing text that will be
-  // replaced. |selection_range| is an optional range of the resulting text that
-  // will be selected after insertion or replacement. The |replacement_range|
-  // value is only used on OS X.
-  //
-  // This function may be called multiple times as the composition changes. When
-  // the client is done making changes the composition should either be canceled
-  // or completed. To cancel the composition call ImeCancelComposition. To
-  // complete the composition call either ImeCommitText or
-  // ImeFinishComposingText. Completion is usually signaled when:
-  //   A. The client receives a WM_IME_COMPOSITION message with a GCS_RESULTSTR
-  //      flag (on Windows), or;
-  //   B. The client receives a "commit" signal of GtkIMContext (on Linux), or;
-  //   C. insertText of NSTextInput is called (on Mac).
-  //
-  // This function is only used when window rendering is disabled.
+  /// Begins a new composition or updates the existing composition. Blink has a
+  /// special node (a composition node) that allows the input function to change
+  /// text without affecting other DOM nodes. |text| is the optional text that
+  /// will be inserted into the composition node. |underlines| is an optional
+  /// set of ranges that will be underlined in the resulting text.
+  /// |replacement_range| is an optional range of the existing text that will be
+  /// replaced. |selection_range| is an optional range of the resulting text
+  /// that will be selected after insertion or replacement. The
+  /// |replacement_range| value is only used on OS X.
+  ///
+  /// This function may be called multiple times as the composition changes.
+  /// When the client is done making changes the composition should either be
+  /// canceled or completed. To cancel the composition call
+  /// ImeCancelComposition. To complete the composition call either
+  /// ImeCommitText or ImeFinishComposingText. Completion is usually signaled
+  /// when:
+  ///
+  /// 1. The client receives a WM_IME_COMPOSITION message with a GCS_RESULTSTR
+  ///    flag (on Windows), or;
+  /// 2. The client receives a "commit" signal of GtkIMContext (on Linux), or;
+  /// 3. insertText of NSTextInput is called (on Mac).
+  ///
+  /// This function is only used when window rendering is disabled.
   ///
   void(CEF_CALLBACK* ime_set_composition)(
       struct _cef_browser_host_t* self,
@@ -751,13 +764,13 @@
       const cef_range_t* selection_range);
 
   ///
-  // Completes the existing composition by optionally inserting the specified
-  // |text| into the composition node. |replacement_range| is an optional range
-  // of the existing text that will be replaced. |relative_cursor_pos| is where
-  // the cursor will be positioned relative to the current cursor position. See
-  // comments on ImeSetComposition for usage. The |replacement_range| and
-  // |relative_cursor_pos| values are only used on OS X. This function is only
-  // used when window rendering is disabled.
+  /// Completes the existing composition by optionally inserting the specified
+  /// |text| into the composition node. |replacement_range| is an optional range
+  /// of the existing text that will be replaced. |relative_cursor_pos| is where
+  /// the cursor will be positioned relative to the current cursor position. See
+  /// comments on ImeSetComposition for usage. The |replacement_range| and
+  /// |relative_cursor_pos| values are only used on OS X. This function is only
+  /// used when window rendering is disabled.
   ///
   void(CEF_CALLBACK* ime_commit_text)(struct _cef_browser_host_t* self,
                                       const cef_string_t* text,
@@ -765,73 +778,73 @@
                                       int relative_cursor_pos);
 
   ///
-  // Completes the existing composition by applying the current composition node
-  // contents. If |keep_selection| is false (0) the current selection, if any,
-  // will be discarded. See comments on ImeSetComposition for usage. This
-  // function is only used when window rendering is disabled.
+  /// Completes the existing composition by applying the current composition
+  /// node contents. If |keep_selection| is false (0) the current selection, if
+  /// any, will be discarded. See comments on ImeSetComposition for usage. This
+  /// function is only used when window rendering is disabled.
   ///
   void(CEF_CALLBACK* ime_finish_composing_text)(
       struct _cef_browser_host_t* self,
       int keep_selection);
 
   ///
-  // Cancels the existing composition and discards the composition node contents
-  // without applying them. See comments on ImeSetComposition for usage. This
-  // function is only used when window rendering is disabled.
+  /// Cancels the existing composition and discards the composition node
+  /// contents without applying them. See comments on ImeSetComposition for
+  /// usage. This function is only used when window rendering is disabled.
   ///
   void(CEF_CALLBACK* ime_cancel_composition)(struct _cef_browser_host_t* self);
 
   ///
-  // Call this function when the user drags the mouse into the web view (before
-  // calling DragTargetDragOver/DragTargetLeave/DragTargetDrop). |drag_data|
-  // should not contain file contents as this type of data is not allowed to be
-  // dragged into the web view. File contents can be removed using
-  // cef_drag_data_t::ResetFileContents (for example, if |drag_data| comes from
-  // cef_render_handler_t::StartDragging). This function is only used when
-  // window rendering is disabled.
+  /// Call this function when the user drags the mouse into the web view (before
+  /// calling DragTargetDragOver/DragTargetLeave/DragTargetDrop). |drag_data|
+  /// should not contain file contents as this type of data is not allowed to be
+  /// dragged into the web view. File contents can be removed using
+  /// cef_drag_data_t::ResetFileContents (for example, if |drag_data| comes from
+  /// cef_render_handler_t::StartDragging). This function is only used when
+  /// window rendering is disabled.
   ///
   void(CEF_CALLBACK* drag_target_drag_enter)(
       struct _cef_browser_host_t* self,
       struct _cef_drag_data_t* drag_data,
-      const struct _cef_mouse_event_t* event,
+      const cef_mouse_event_t* event,
       cef_drag_operations_mask_t allowed_ops);
 
   ///
-  // Call this function each time the mouse is moved across the web view during
-  // a drag operation (after calling DragTargetDragEnter and before calling
-  // DragTargetDragLeave/DragTargetDrop). This function is only used when window
-  // rendering is disabled.
+  /// Call this function each time the mouse is moved across the web view during
+  /// a drag operation (after calling DragTargetDragEnter and before calling
+  /// DragTargetDragLeave/DragTargetDrop). This function is only used when
+  /// window rendering is disabled.
   ///
   void(CEF_CALLBACK* drag_target_drag_over)(
       struct _cef_browser_host_t* self,
-      const struct _cef_mouse_event_t* event,
+      const cef_mouse_event_t* event,
       cef_drag_operations_mask_t allowed_ops);
 
   ///
-  // Call this function when the user drags the mouse out of the web view (after
-  // calling DragTargetDragEnter). This function is only used when window
-  // rendering is disabled.
+  /// Call this function when the user drags the mouse out of the web view
+  /// (after calling DragTargetDragEnter). This function is only used when
+  /// window rendering is disabled.
   ///
   void(CEF_CALLBACK* drag_target_drag_leave)(struct _cef_browser_host_t* self);
 
   ///
-  // Call this function when the user completes the drag operation by dropping
-  // the object onto the web view (after calling DragTargetDragEnter). The
-  // object being dropped is |drag_data|, given as an argument to the previous
-  // DragTargetDragEnter call. This function is only used when window rendering
-  // is disabled.
+  /// Call this function when the user completes the drag operation by dropping
+  /// the object onto the web view (after calling DragTargetDragEnter). The
+  /// object being dropped is |drag_data|, given as an argument to the previous
+  /// DragTargetDragEnter call. This function is only used when window rendering
+  /// is disabled.
   ///
   void(CEF_CALLBACK* drag_target_drop)(struct _cef_browser_host_t* self,
-                                       const struct _cef_mouse_event_t* event);
+                                       const cef_mouse_event_t* event);
 
   ///
-  // Call this function when the drag operation started by a
-  // cef_render_handler_t::StartDragging call has ended either in a drop or by
-  // being cancelled. |x| and |y| are mouse coordinates relative to the upper-
-  // left corner of the view. If the web view is both the drag source and the
-  // drag target then all DragTarget* functions should be called before
-  // DragSource* mthods. This function is only used when window rendering is
-  // disabled.
+  /// Call this function when the drag operation started by a
+  /// cef_render_handler_t::StartDragging call has ended either in a drop or by
+  /// being cancelled. |x| and |y| are mouse coordinates relative to the upper-
+  /// left corner of the view. If the web view is both the drag source and the
+  /// drag target then all DragTarget* functions should be called before
+  /// DragSource* mthods. This function is only used when window rendering is
+  /// disabled.
   ///
   void(CEF_CALLBACK* drag_source_ended_at)(struct _cef_browser_host_t* self,
                                            int x,
@@ -839,55 +852,55 @@
                                            cef_drag_operations_mask_t op);
 
   ///
-  // Call this function when the drag operation started by a
-  // cef_render_handler_t::StartDragging call has completed. This function may
-  // be called immediately without first calling DragSourceEndedAt to cancel a
-  // drag operation. If the web view is both the drag source and the drag target
-  // then all DragTarget* functions should be called before DragSource* mthods.
-  // This function is only used when window rendering is disabled.
+  /// Call this function when the drag operation started by a
+  /// cef_render_handler_t::StartDragging call has completed. This function may
+  /// be called immediately without first calling DragSourceEndedAt to cancel a
+  /// drag operation. If the web view is both the drag source and the drag
+  /// target then all DragTarget* functions should be called before DragSource*
+  /// mthods. This function is only used when window rendering is disabled.
   ///
   void(CEF_CALLBACK* drag_source_system_drag_ended)(
       struct _cef_browser_host_t* self);
 
   ///
-  // Returns the current visible navigation entry for this browser. This
-  // function can only be called on the UI thread.
+  /// Returns the current visible navigation entry for this browser. This
+  /// function can only be called on the UI thread.
   ///
   struct _cef_navigation_entry_t*(CEF_CALLBACK* get_visible_navigation_entry)(
       struct _cef_browser_host_t* self);
 
   ///
-  // Set accessibility state for all frames. |accessibility_state| may be
-  // default, enabled or disabled. If |accessibility_state| is STATE_DEFAULT
-  // then accessibility will be disabled by default and the state may be further
-  // controlled with the "force-renderer-accessibility" and "disable-renderer-
-  // accessibility" command-line switches. If |accessibility_state| is
-  // STATE_ENABLED then accessibility will be enabled. If |accessibility_state|
-  // is STATE_DISABLED then accessibility will be completely disabled.
-  //
-  // For windowed browsers accessibility will be enabled in Complete mode (which
-  // corresponds to kAccessibilityModeComplete in Chromium). In this mode all
-  // platform accessibility objects will be created and managed by Chromium's
-  // internal implementation. The client needs only to detect the screen reader
-  // and call this function appropriately. For example, on macOS the client can
-  // handle the @"AXEnhancedUserStructure" accessibility attribute to detect
-  // VoiceOver state changes and on Windows the client can handle WM_GETOBJECT
-  // with OBJID_CLIENT to detect accessibility readers.
-  //
-  // For windowless browsers accessibility will be enabled in TreeOnly mode
-  // (which corresponds to kAccessibilityModeWebContentsOnly in Chromium). In
-  // this mode renderer accessibility is enabled, the full tree is computed, and
-  // events are passed to CefAccessibiltyHandler, but platform accessibility
-  // objects are not created. The client may implement platform accessibility
-  // objects using CefAccessibiltyHandler callbacks if desired.
+  /// Set accessibility state for all frames. |accessibility_state| may be
+  /// default, enabled or disabled. If |accessibility_state| is STATE_DEFAULT
+  /// then accessibility will be disabled by default and the state may be
+  /// further controlled with the "force-renderer-accessibility" and "disable-
+  /// renderer-accessibility" command-line switches. If |accessibility_state| is
+  /// STATE_ENABLED then accessibility will be enabled. If |accessibility_state|
+  /// is STATE_DISABLED then accessibility will be completely disabled.
+  ///
+  /// For windowed browsers accessibility will be enabled in Complete mode
+  /// (which corresponds to kAccessibilityModeComplete in Chromium). In this
+  /// mode all platform accessibility objects will be created and managed by
+  /// Chromium's internal implementation. The client needs only to detect the
+  /// screen reader and call this function appropriately. For example, on macOS
+  /// the client can handle the @"AXEnhancedUserStructure" accessibility
+  /// attribute to detect VoiceOver state changes and on Windows the client can
+  /// handle WM_GETOBJECT with OBJID_CLIENT to detect accessibility readers.
+  ///
+  /// For windowless browsers accessibility will be enabled in TreeOnly mode
+  /// (which corresponds to kAccessibilityModeWebContentsOnly in Chromium). In
+  /// this mode renderer accessibility is enabled, the full tree is computed,
+  /// and events are passed to CefAccessibiltyHandler, but platform
+  /// accessibility objects are not created. The client may implement platform
+  /// accessibility objects using CefAccessibiltyHandler callbacks if desired.
   ///
   void(CEF_CALLBACK* set_accessibility_state)(struct _cef_browser_host_t* self,
                                               cef_state_t accessibility_state);
 
   ///
-  // Enable notifications of auto resize via
-  // cef_display_handler_t::OnAutoResize. Notifications are disabled by default.
-  // |min_size| and |max_size| define the range of allowed sizes.
+  /// Enable notifications of auto resize via
+  /// cef_display_handler_t::OnAutoResize. Notifications are disabled by
+  /// default. |min_size| and |max_size| define the range of allowed sizes.
   ///
   void(CEF_CALLBACK* set_auto_resize_enabled)(struct _cef_browser_host_t* self,
                                               int enabled,
@@ -895,41 +908,83 @@
                                               const cef_size_t* max_size);
 
   ///
-  // Returns the extension hosted in this browser or NULL if no extension is
-  // hosted. See cef_request_context_t::LoadExtension for details.
+  /// Returns the extension hosted in this browser or NULL if no extension is
+  /// hosted. See cef_request_context_t::LoadExtension for details.
   ///
   struct _cef_extension_t*(CEF_CALLBACK* get_extension)(
       struct _cef_browser_host_t* self);
 
   ///
-  // Returns true (1) if this browser is hosting an extension background script.
-  // Background hosts do not have a window and are not displayable. See
-  // cef_request_context_t::LoadExtension for details.
+  /// Returns true (1) if this browser is hosting an extension background
+  /// script. Background hosts do not have a window and are not displayable. See
+  /// cef_request_context_t::LoadExtension for details.
   ///
   int(CEF_CALLBACK* is_background_host)(struct _cef_browser_host_t* self);
 
   ///
-  //  Set whether the browser's audio is muted.
+  /// Set whether the browser's audio is muted.
   ///
   void(CEF_CALLBACK* set_audio_muted)(struct _cef_browser_host_t* self,
                                       int mute);
 
   ///
-  // Returns true (1) if the browser's audio is muted.  This function can only
-  // be called on the UI thread.
+  /// Returns true (1) if the browser's audio is muted.  This function can only
+  /// be called on the UI thread.
   ///
   int(CEF_CALLBACK* is_audio_muted)(struct _cef_browser_host_t* self);
+
+  ///
+  /// Returns true (1) if the renderer is currently in browser fullscreen. This
+  /// differs from window fullscreen in that browser fullscreen is entered using
+  /// the JavaScript Fullscreen API and modifies CSS attributes such as the
+  /// ::backdrop pseudo-element and :fullscreen pseudo-structure. This function
+  /// can only be called on the UI thread.
+  ///
+  int(CEF_CALLBACK* is_fullscreen)(struct _cef_browser_host_t* self);
+
+  ///
+  /// Requests the renderer to exit browser fullscreen. In most cases exiting
+  /// window fullscreen should also exit browser fullscreen. With the Alloy
+  /// runtime this function should be called in response to a user action such
+  /// as clicking the green traffic light button on MacOS
+  /// (cef_window_delegate_t::OnWindowFullscreenTransition callback) or pressing
+  /// the "ESC" key (cef_keyboard_handler_t::OnPreKeyEvent callback). With the
+  /// Chrome runtime these standard exit actions are handled internally but
+  /// new/additional user actions can use this function. Set |will_cause_resize|
+  /// to true (1) if exiting browser fullscreen will cause a view resize.
+  ///
+  void(CEF_CALLBACK* exit_fullscreen)(struct _cef_browser_host_t* self,
+                                      int will_cause_resize);
+
+  ///
+  /// Returns true (1) if a Chrome command is supported and enabled. Values for
+  /// |command_id| can be found in the cef_command_ids.h file. This function can
+  /// only be called on the UI thread. Only used with the Chrome runtime.
+  ///
+  int(CEF_CALLBACK* can_execute_chrome_command)(
+      struct _cef_browser_host_t* self,
+      int command_id);
+
+  ///
+  /// Execute a Chrome command. Values for |command_id| can be found in the
+  /// cef_command_ids.h file. |disposition| provides information about the
+  /// intended command target. Only used with the Chrome runtime.
+  ///
+  void(CEF_CALLBACK* execute_chrome_command)(
+      struct _cef_browser_host_t* self,
+      int command_id,
+      cef_window_open_disposition_t disposition);
 } cef_browser_host_t;
 
 ///
-// Create a new browser window using the window parameters specified by
-// |windowInfo|. All values will be copied internally and the actual window will
-// be created on the UI thread. If |request_context| is NULL the global request
-// context will be used. This function can be called on any browser process
-// thread and will not block. The optional |extra_info| parameter provides an
-// opportunity to specify extra information specific to the created browser that
-// will be passed to cef_render_process_handler_t::on_browser_created() in the
-// render process.
+/// Create a new browser using the window parameters specified by |windowInfo|.
+/// All values will be copied internally and the actual window (if any) will be
+/// created on the UI thread. If |request_context| is NULL the global request
+/// context will be used. This function can be called on any browser process
+/// thread and will not block. The optional |extra_info| parameter provides an
+/// opportunity to specify extra information specific to the created browser
+/// that will be passed to cef_render_process_handler_t::on_browser_created() in
+/// the render process.
 ///
 CEF_EXPORT int cef_browser_host_create_browser(
     const cef_window_info_t* windowInfo,
@@ -940,12 +995,12 @@
     struct _cef_request_context_t* request_context);
 
 ///
-// Create a new browser window using the window parameters specified by
-// |windowInfo|. If |request_context| is NULL the global request context will be
-// used. This function can only be called on the browser process UI thread. The
-// optional |extra_info| parameter provides an opportunity to specify extra
-// information specific to the created browser that will be passed to
-// cef_render_process_handler_t::on_browser_created() in the render process.
+/// Create a new browser using the window parameters specified by |windowInfo|.
+/// If |request_context| is NULL the global request context will be used. This
+/// function can only be called on the browser process UI thread. The optional
+/// |extra_info| parameter provides an opportunity to specify extra information
+/// specific to the created browser that will be passed to
+/// cef_render_process_handler_t::on_browser_created() in the render process.
 ///
 CEF_EXPORT cef_browser_t* cef_browser_host_create_browser_sync(
     const cef_window_info_t* windowInfo,
diff --git a/src/include/capi/cef_browser_process_handler_capi.h b/src/include/capi/cef_browser_process_handler_capi.h
index 2d9ee46..42324c0 100644
--- a/src/include/capi/cef_browser_process_handler_capi.h
+++ b/src/include/capi/cef_browser_process_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=b15ba2c750f5227b6b40fea59965817ba4431ee0$
+// $hash=a146316e075450f0a6f37cb45d14e15e0ac7be08$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_BROWSER_PROCESS_HANDLER_CAPI_H_
@@ -41,8 +41,9 @@
 #pragma once
 
 #include "include/capi/cef_base_capi.h"
+#include "include/capi/cef_client_capi.h"
 #include "include/capi/cef_command_line_capi.h"
-#include "include/capi/cef_print_handler_capi.h"
+#include "include/capi/cef_preference_capi.h"
 #include "include/capi/cef_values_capi.h"
 
 #ifdef __cplusplus
@@ -50,68 +51,87 @@
 #endif
 
 ///
-// Structure used to implement browser process callbacks. The functions of this
-// structure will be called on the browser process main thread unless otherwise
-// indicated.
+/// Structure used to implement browser process callbacks. The functions of this
+/// structure will be called on the browser process main thread unless otherwise
+/// indicated.
 ///
 typedef struct _cef_browser_process_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called on the browser process UI thread immediately after the CEF context
-  // has been initialized.
+  /// Provides an opportunity to register custom preferences prior to global and
+  /// request context initialization.
+  ///
+  /// If |type| is CEF_PREFERENCES_TYPE_GLOBAL the registered preferences can be
+  /// accessed via cef_preference_manager_t::GetGlobalPreferences after
+  /// OnContextInitialized is called. Global preferences are registered a single
+  /// time at application startup. See related cef_settings_t.cache_path and
+  /// cef_settings_t.persist_user_preferences configuration.
+  ///
+  /// If |type| is CEF_PREFERENCES_TYPE_REQUEST_CONTEXT the preferences can be
+  /// accessed via the cef_request_context_t after
+  /// cef_request_context_handler_t::OnRequestContextInitialized is called.
+  /// Request context preferences are registered each time a new
+  /// cef_request_context_t is created. It is intended but not required that all
+  /// request contexts have the same registered preferences. See related
+  /// cef_request_context_settings_t.cache_path and
+  /// cef_request_context_settings_t.persist_user_preferences configuration.
+  ///
+  /// Do not keep a reference to the |registrar| object. This function is called
+  /// on the browser process UI thread.
+  ///
+  void(CEF_CALLBACK* on_register_custom_preferences)(
+      struct _cef_browser_process_handler_t* self,
+      cef_preferences_type_t type,
+      struct _cef_preference_registrar_t* registrar);
+
+  ///
+  /// Called on the browser process UI thread immediately after the CEF context
+  /// has been initialized.
   ///
   void(CEF_CALLBACK* on_context_initialized)(
       struct _cef_browser_process_handler_t* self);
 
   ///
-  // Called before a child process is launched. Will be called on the browser
-  // process UI thread when launching a render process and on the browser
-  // process IO thread when launching a GPU or plugin process. Provides an
-  // opportunity to modify the child process command line. Do not keep a
-  // reference to |command_line| outside of this function.
+  /// Called before a child process is launched. Will be called on the browser
+  /// process UI thread when launching a render process and on the browser
+  /// process IO thread when launching a GPU process. Provides an opportunity to
+  /// modify the child process command line. Do not keep a reference to
+  /// |command_line| outside of this function.
   ///
   void(CEF_CALLBACK* on_before_child_process_launch)(
       struct _cef_browser_process_handler_t* self,
       struct _cef_command_line_t* command_line);
 
   ///
-  // Called on the browser process IO thread after the main thread has been
-  // created for a new render process. Provides an opportunity to specify extra
-  // information that will be passed to
-  // cef_render_process_handler_t::on_render_thread_created() in the render
-  // process. Do not keep a reference to |extra_info| outside of this function.
-  ///
-  void(CEF_CALLBACK* on_render_process_thread_created)(
-      struct _cef_browser_process_handler_t* self,
-      struct _cef_list_value_t* extra_info);
-
-  ///
-  // Return the handler for printing on Linux. If a print handler is not
-  // provided then printing will not be supported on the Linux platform.
-  ///
-  struct _cef_print_handler_t*(CEF_CALLBACK* get_print_handler)(
-      struct _cef_browser_process_handler_t* self);
-
-  ///
-  // Called from any thread when work has been scheduled for the browser process
-  // main (UI) thread. This callback is used in combination with CefSettings.
-  // external_message_pump and cef_do_message_loop_work() in cases where the CEF
-  // message loop must be integrated into an existing application message loop
-  // (see additional comments and warnings on CefDoMessageLoopWork). This
-  // callback should schedule a cef_do_message_loop_work() call to happen on the
-  // main (UI) thread. |delay_ms| is the requested delay in milliseconds. If
-  // |delay_ms| is <= 0 then the call should happen reasonably soon. If
-  // |delay_ms| is > 0 then the call should be scheduled to happen after the
-  // specified delay and any currently pending scheduled call should be
-  // cancelled.
+  /// Called from any thread when work has been scheduled for the browser
+  /// process main (UI) thread. This callback is used in combination with
+  /// cef_settings_t.external_message_pump and cef_do_message_loop_work() in
+  /// cases where the CEF message loop must be integrated into an existing
+  /// application message loop (see additional comments and warnings on
+  /// CefDoMessageLoopWork). This callback should schedule a
+  /// cef_do_message_loop_work() call to happen on the main (UI) thread.
+  /// |delay_ms| is the requested delay in milliseconds. If |delay_ms| is <= 0
+  /// then the call should happen reasonably soon. If |delay_ms| is > 0 then the
+  /// call should be scheduled to happen after the specified delay and any
+  /// currently pending scheduled call should be cancelled.
   ///
   void(CEF_CALLBACK* on_schedule_message_pump_work)(
       struct _cef_browser_process_handler_t* self,
-      int64 delay_ms);
+      int64_t delay_ms);
+
+  ///
+  /// Return the default client for use with a newly created browser window. If
+  /// null is returned the browser will be unmanaged (no callbacks will be
+  /// executed for that browser) and application shutdown will be blocked until
+  /// the browser window is closed manually. This function is currently only
+  /// used with the chrome runtime.
+  ///
+  struct _cef_client_t*(CEF_CALLBACK* get_default_client)(
+      struct _cef_browser_process_handler_t* self);
 } cef_browser_process_handler_t;
 
 #ifdef __cplusplus
diff --git a/src/include/capi/cef_callback_capi.h b/src/include/capi/cef_callback_capi.h
index 02b41ee..d5086aa 100644
--- a/src/include/capi/cef_callback_capi.h
+++ b/src/include/capi/cef_callback_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=5c540e617cf2782876defad365e85cd43932ffce$
+// $hash=4fd98ff68ecb42677c3344b75e26d4787161b0d2$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_CALLBACK_CAPI_H_
@@ -47,36 +47,36 @@
 #endif
 
 ///
-// Generic callback structure used for asynchronous continuation.
+/// Generic callback structure used for asynchronous continuation.
 ///
 typedef struct _cef_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Continue processing.
+  /// Continue processing.
   ///
   void(CEF_CALLBACK* cont)(struct _cef_callback_t* self);
 
   ///
-  // Cancel processing.
+  /// Cancel processing.
   ///
   void(CEF_CALLBACK* cancel)(struct _cef_callback_t* self);
 } cef_callback_t;
 
 ///
-// Generic callback structure used for asynchronous completion.
+/// Generic callback structure used for asynchronous completion.
 ///
 typedef struct _cef_completion_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Method that will be called once the task is complete.
+  /// Method that will be called once the task is complete.
   ///
   void(CEF_CALLBACK* on_complete)(struct _cef_completion_callback_t* self);
 } cef_completion_callback_t;
diff --git a/src/include/capi/cef_client_capi.h b/src/include/capi/cef_client_capi.h
index a7eb509..e85a33b 100644
--- a/src/include/capi/cef_client_capi.h
+++ b/src/include/capi/cef_client_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=8d4cb3e0bbf230804c93898daa4a8b2866a2c1ce$
+// $hash=eb9dcb574252483dfab12834af93ba14138d4089$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_CLIENT_CAPI_H_
@@ -42,6 +42,7 @@
 
 #include "include/capi/cef_audio_handler_capi.h"
 #include "include/capi/cef_base_capi.h"
+#include "include/capi/cef_command_handler_capi.h"
 #include "include/capi/cef_context_menu_handler_capi.h"
 #include "include/capi/cef_dialog_handler_capi.h"
 #include "include/capi/cef_display_handler_capi.h"
@@ -49,10 +50,13 @@
 #include "include/capi/cef_drag_handler_capi.h"
 #include "include/capi/cef_find_handler_capi.h"
 #include "include/capi/cef_focus_handler_capi.h"
+#include "include/capi/cef_frame_handler_capi.h"
 #include "include/capi/cef_jsdialog_handler_capi.h"
 #include "include/capi/cef_keyboard_handler_capi.h"
 #include "include/capi/cef_life_span_handler_capi.h"
 #include "include/capi/cef_load_handler_capi.h"
+#include "include/capi/cef_permission_handler_capi.h"
+#include "include/capi/cef_print_handler_capi.h"
 #include "include/capi/cef_process_message_capi.h"
 #include "include/capi/cef_render_handler_capi.h"
 #include "include/capi/cef_request_handler_capi.h"
@@ -62,106 +66,134 @@
 #endif
 
 ///
-// Implement this structure to provide handler implementations.
+/// Implement this structure to provide handler implementations.
 ///
 typedef struct _cef_client_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Return the handler for audio rendering events.
+  /// Return the handler for audio rendering events.
   ///
   struct _cef_audio_handler_t*(CEF_CALLBACK* get_audio_handler)(
       struct _cef_client_t* self);
 
   ///
-  // Return the handler for context menus. If no handler is provided the default
-  // implementation will be used.
+  /// Return the handler for commands. If no handler is provided the default
+  /// implementation will be used.
+  ///
+  struct _cef_command_handler_t*(CEF_CALLBACK* get_command_handler)(
+      struct _cef_client_t* self);
+
+  ///
+  /// Return the handler for context menus. If no handler is provided the
+  /// default implementation will be used.
   ///
   struct _cef_context_menu_handler_t*(CEF_CALLBACK* get_context_menu_handler)(
       struct _cef_client_t* self);
 
   ///
-  // Return the handler for dialogs. If no handler is provided the default
-  // implementation will be used.
+  /// Return the handler for dialogs. If no handler is provided the default
+  /// implementation will be used.
   ///
   struct _cef_dialog_handler_t*(CEF_CALLBACK* get_dialog_handler)(
       struct _cef_client_t* self);
 
   ///
-  // Return the handler for browser display state events.
+  /// Return the handler for browser display state events.
   ///
   struct _cef_display_handler_t*(CEF_CALLBACK* get_display_handler)(
       struct _cef_client_t* self);
 
   ///
-  // Return the handler for download events. If no handler is returned downloads
-  // will not be allowed.
+  /// Return the handler for download events. If no handler is returned
+  /// downloads will not be allowed.
   ///
   struct _cef_download_handler_t*(CEF_CALLBACK* get_download_handler)(
       struct _cef_client_t* self);
 
   ///
-  // Return the handler for drag events.
+  /// Return the handler for drag events.
   ///
   struct _cef_drag_handler_t*(CEF_CALLBACK* get_drag_handler)(
       struct _cef_client_t* self);
 
   ///
-  // Return the handler for find result events.
+  /// Return the handler for find result events.
   ///
   struct _cef_find_handler_t*(CEF_CALLBACK* get_find_handler)(
       struct _cef_client_t* self);
 
   ///
-  // Return the handler for focus events.
+  /// Return the handler for focus events.
   ///
   struct _cef_focus_handler_t*(CEF_CALLBACK* get_focus_handler)(
       struct _cef_client_t* self);
 
   ///
-  // Return the handler for JavaScript dialogs. If no handler is provided the
-  // default implementation will be used.
+  /// Return the handler for events related to cef_frame_t lifespan. This
+  /// function will be called once during cef_browser_t creation and the result
+  /// will be cached for performance reasons.
+  ///
+  struct _cef_frame_handler_t*(CEF_CALLBACK* get_frame_handler)(
+      struct _cef_client_t* self);
+
+  ///
+  /// Return the handler for permission requests.
+  ///
+  struct _cef_permission_handler_t*(CEF_CALLBACK* get_permission_handler)(
+      struct _cef_client_t* self);
+
+  ///
+  /// Return the handler for JavaScript dialogs. If no handler is provided the
+  /// default implementation will be used.
   ///
   struct _cef_jsdialog_handler_t*(CEF_CALLBACK* get_jsdialog_handler)(
       struct _cef_client_t* self);
 
   ///
-  // Return the handler for keyboard events.
+  /// Return the handler for keyboard events.
   ///
   struct _cef_keyboard_handler_t*(CEF_CALLBACK* get_keyboard_handler)(
       struct _cef_client_t* self);
 
   ///
-  // Return the handler for browser life span events.
+  /// Return the handler for browser life span events.
   ///
   struct _cef_life_span_handler_t*(CEF_CALLBACK* get_life_span_handler)(
       struct _cef_client_t* self);
 
   ///
-  // Return the handler for browser load status events.
+  /// Return the handler for browser load status events.
   ///
   struct _cef_load_handler_t*(CEF_CALLBACK* get_load_handler)(
       struct _cef_client_t* self);
 
   ///
-  // Return the handler for off-screen rendering events.
+  /// Return the handler for printing on Linux. If a print handler is not
+  /// provided then printing will not be supported on the Linux platform.
+  ///
+  struct _cef_print_handler_t*(CEF_CALLBACK* get_print_handler)(
+      struct _cef_client_t* self);
+
+  ///
+  /// Return the handler for off-screen rendering events.
   ///
   struct _cef_render_handler_t*(CEF_CALLBACK* get_render_handler)(
       struct _cef_client_t* self);
 
   ///
-  // Return the handler for browser request events.
+  /// Return the handler for browser request events.
   ///
   struct _cef_request_handler_t*(CEF_CALLBACK* get_request_handler)(
       struct _cef_client_t* self);
 
   ///
-  // Called when a new message is received from a different process. Return true
-  // (1) if the message was handled or false (0) otherwise. Do not keep a
-  // reference to or attempt to access the message outside of this callback.
+  /// Called when a new message is received from a different process. Return
+  /// true (1) if the message was handled or false (0) otherwise.  It is safe to
+  /// keep a reference to |message| outside of this callback.
   ///
   int(CEF_CALLBACK* on_process_message_received)(
       struct _cef_client_t* self,
diff --git a/src/include/capi/cef_command_handler_capi.h b/src/include/capi/cef_command_handler_capi.h
new file mode 100644
index 0000000..db3a793
--- /dev/null
+++ b/src/include/capi/cef_command_handler_capi.h
@@ -0,0 +1,120 @@
+// Copyright (c) 2023 Marshall A. Greenblatt. 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 file was generated by the CEF translator tool and should not edited
+// by hand. See the translator.README.txt file in the tools directory for
+// more information.
+//
+// $hash=0cbb756a64d2aca1075480b5188b36cae533864d$
+//
+
+#ifndef CEF_INCLUDE_CAPI_CEF_COMMAND_HANDLER_CAPI_H_
+#define CEF_INCLUDE_CAPI_CEF_COMMAND_HANDLER_CAPI_H_
+#pragma once
+
+#include "include/capi/cef_base_capi.h"
+#include "include/capi/cef_browser_capi.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+///
+/// Implement this structure to handle events related to commands. The functions
+/// of this structure will be called on the UI thread.
+///
+typedef struct _cef_command_handler_t {
+  ///
+  /// Base structure.
+  ///
+  cef_base_ref_counted_t base;
+
+  ///
+  /// Called to execute a Chrome command triggered via menu selection or
+  /// keyboard shortcut. Values for |command_id| can be found in the
+  /// cef_command_ids.h file. |disposition| provides information about the
+  /// intended command target. Return true (1) if the command was handled or
+  /// false (0) for the default implementation. For context menu commands this
+  /// will be called after cef_context_menu_handler_t::OnContextMenuCommand.
+  /// Only used with the Chrome runtime.
+  ///
+  int(CEF_CALLBACK* on_chrome_command)(
+      struct _cef_command_handler_t* self,
+      struct _cef_browser_t* browser,
+      int command_id,
+      cef_window_open_disposition_t disposition);
+
+  ///
+  /// Called to check if a Chrome app menu item should be visible. Values for
+  /// |command_id| can be found in the cef_command_ids.h file. Only called for
+  /// menu items that would be visible by default. Only used with the Chrome
+  /// runtime.
+  ///
+  int(CEF_CALLBACK* is_chrome_app_menu_item_visible)(
+      struct _cef_command_handler_t* self,
+      struct _cef_browser_t* browser,
+      int command_id);
+
+  ///
+  /// Called to check if a Chrome app menu item should be enabled. Values for
+  /// |command_id| can be found in the cef_command_ids.h file. Only called for
+  /// menu items that would be enabled by default. Only used with the Chrome
+  /// runtime.
+  ///
+  int(CEF_CALLBACK* is_chrome_app_menu_item_enabled)(
+      struct _cef_command_handler_t* self,
+      struct _cef_browser_t* browser,
+      int command_id);
+
+  ///
+  /// Called during browser creation to check if a Chrome page action icon
+  /// should be visible. Only called for icons that would be visible by default.
+  /// Only used with the Chrome runtime.
+  ///
+  int(CEF_CALLBACK* is_chrome_page_action_icon_visible)(
+      struct _cef_command_handler_t* self,
+      cef_chrome_page_action_icon_type_t icon_type);
+
+  ///
+  /// Called during browser creation to check if a Chrome toolbar button should
+  /// be visible. Only called for buttons that would be visible by default. Only
+  /// used with the Chrome runtime.
+  ///
+  int(CEF_CALLBACK* is_chrome_toolbar_button_visible)(
+      struct _cef_command_handler_t* self,
+      cef_chrome_toolbar_button_type_t button_type);
+} cef_command_handler_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // CEF_INCLUDE_CAPI_CEF_COMMAND_HANDLER_CAPI_H_
diff --git a/src/include/capi/cef_command_line_capi.h b/src/include/capi/cef_command_line_capi.h
index 3ffc030..3379baa 100644
--- a/src/include/capi/cef_command_line_capi.h
+++ b/src/include/capi/cef_command_line_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=72ba5fe0cc6fe8081ec7b2b556e9022d1c6e8c61$
+// $hash=ac8fd3a7da20cff1fe2f20a75b045bf27c0312f2$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_COMMAND_LINE_CAPI_H_
@@ -47,103 +47,104 @@
 #endif
 
 ///
-// Structure used to create and/or parse command line arguments. Arguments with
-// '--', '-' and, on Windows, '/' prefixes are considered switches. Switches
-// will always precede any arguments without switch prefixes. Switches can
-// optionally have a value specified using the '=' delimiter (e.g.
-// "-switch=value"). An argument of "--" will terminate switch parsing with all
-// subsequent tokens, regardless of prefix, being interpreted as non-switch
-// arguments. Switch names are considered case-insensitive. This structure can
-// be used before cef_initialize() is called.
+/// Structure used to create and/or parse command line arguments. Arguments with
+/// "--", "-" and, on Windows, "/" prefixes are considered switches. Switches
+/// will always precede any arguments without switch prefixes. Switches can
+/// optionally have a value specified using the "=" delimiter (e.g.
+/// "-switch=value"). An argument of "--" will terminate switch parsing with all
+/// subsequent tokens, regardless of prefix, being interpreted as non-switch
+/// arguments. Switch names should be lowercase ASCII and will be converted to
+/// such if necessary. Switch values will retain the original case and UTF8
+/// encoding. This structure can be used before cef_initialize() is called.
 ///
 typedef struct _cef_command_line_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns true (1) if this object is valid. Do not call any other functions
-  // if this function returns false (0).
+  /// Returns true (1) if this object is valid. Do not call any other functions
+  /// if this function returns false (0).
   ///
   int(CEF_CALLBACK* is_valid)(struct _cef_command_line_t* self);
 
   ///
-  // Returns true (1) if the values of this object are read-only. Some APIs may
-  // expose read-only objects.
+  /// Returns true (1) if the values of this object are read-only. Some APIs may
+  /// expose read-only objects.
   ///
   int(CEF_CALLBACK* is_read_only)(struct _cef_command_line_t* self);
 
   ///
-  // Returns a writable copy of this object.
+  /// Returns a writable copy of this object.
   ///
   struct _cef_command_line_t*(CEF_CALLBACK* copy)(
       struct _cef_command_line_t* self);
 
   ///
-  // Initialize the command line with the specified |argc| and |argv| values.
-  // The first argument must be the name of the program. This function is only
-  // supported on non-Windows platforms.
+  /// Initialize the command line with the specified |argc| and |argv| values.
+  /// The first argument must be the name of the program. This function is only
+  /// supported on non-Windows platforms.
   ///
   void(CEF_CALLBACK* init_from_argv)(struct _cef_command_line_t* self,
                                      int argc,
                                      const char* const* argv);
 
   ///
-  // Initialize the command line with the string returned by calling
-  // GetCommandLineW(). This function is only supported on Windows.
+  /// Initialize the command line with the string returned by calling
+  /// GetCommandLineW(). This function is only supported on Windows.
   ///
   void(CEF_CALLBACK* init_from_string)(struct _cef_command_line_t* self,
                                        const cef_string_t* command_line);
 
   ///
-  // Reset the command-line switches and arguments but leave the program
-  // component unchanged.
+  /// Reset the command-line switches and arguments but leave the program
+  /// component unchanged.
   ///
   void(CEF_CALLBACK* reset)(struct _cef_command_line_t* self);
 
   ///
-  // Retrieve the original command line string as a vector of strings. The argv
-  // array: { program, [(--|-|/)switch[=value]]*, [--], [argument]* }
+  /// Retrieve the original command line string as a vector of strings. The argv
+  /// array: `{ program, [(--|-|/)switch[=value]]*, [--], [argument]* }`
   ///
   void(CEF_CALLBACK* get_argv)(struct _cef_command_line_t* self,
                                cef_string_list_t argv);
 
   ///
-  // Constructs and returns the represented command line string. Use this
-  // function cautiously because quoting behavior is unclear.
+  /// Constructs and returns the represented command line string. Use this
+  /// function cautiously because quoting behavior is unclear.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_command_line_string)(
       struct _cef_command_line_t* self);
 
   ///
-  // Get the program part of the command line string (the first item).
+  /// Get the program part of the command line string (the first item).
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_program)(
       struct _cef_command_line_t* self);
 
   ///
-  // Set the program part of the command line string (the first item).
+  /// Set the program part of the command line string (the first item).
   ///
   void(CEF_CALLBACK* set_program)(struct _cef_command_line_t* self,
                                   const cef_string_t* program);
 
   ///
-  // Returns true (1) if the command line has switches.
+  /// Returns true (1) if the command line has switches.
   ///
   int(CEF_CALLBACK* has_switches)(struct _cef_command_line_t* self);
 
   ///
-  // Returns true (1) if the command line contains the given switch.
+  /// Returns true (1) if the command line contains the given switch.
   ///
   int(CEF_CALLBACK* has_switch)(struct _cef_command_line_t* self,
                                 const cef_string_t* name);
 
   ///
-  // Returns the value associated with the given switch. If the switch has no
-  // value or isn't present this function returns the NULL string.
+  /// Returns the value associated with the given switch. If the switch has no
+  /// value or isn't present this function returns the NULL string.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_switch_value)(
@@ -151,61 +152,61 @@
       const cef_string_t* name);
 
   ///
-  // Returns the map of switch names and values. If a switch has no value an
-  // NULL string is returned.
+  /// Returns the map of switch names and values. If a switch has no value an
+  /// NULL string is returned.
   ///
   void(CEF_CALLBACK* get_switches)(struct _cef_command_line_t* self,
                                    cef_string_map_t switches);
 
   ///
-  // Add a switch to the end of the command line. If the switch has no value
-  // pass an NULL value string.
+  /// Add a switch to the end of the command line.
   ///
   void(CEF_CALLBACK* append_switch)(struct _cef_command_line_t* self,
                                     const cef_string_t* name);
 
   ///
-  // Add a switch with the specified value to the end of the command line.
+  /// Add a switch with the specified value to the end of the command line. If
+  /// the switch has no value pass an NULL value string.
   ///
   void(CEF_CALLBACK* append_switch_with_value)(struct _cef_command_line_t* self,
                                                const cef_string_t* name,
                                                const cef_string_t* value);
 
   ///
-  // True if there are remaining command line arguments.
+  /// True if there are remaining command line arguments.
   ///
   int(CEF_CALLBACK* has_arguments)(struct _cef_command_line_t* self);
 
   ///
-  // Get the remaining command line arguments.
+  /// Get the remaining command line arguments.
   ///
   void(CEF_CALLBACK* get_arguments)(struct _cef_command_line_t* self,
                                     cef_string_list_t arguments);
 
   ///
-  // Add an argument to the end of the command line.
+  /// Add an argument to the end of the command line.
   ///
   void(CEF_CALLBACK* append_argument)(struct _cef_command_line_t* self,
                                       const cef_string_t* argument);
 
   ///
-  // Insert a command before the current command. Common for debuggers, like
-  // "valgrind" or "gdb --args".
+  /// Insert a command before the current command. Common for debuggers, like
+  /// "valgrind" or "gdb --args".
   ///
   void(CEF_CALLBACK* prepend_wrapper)(struct _cef_command_line_t* self,
                                       const cef_string_t* wrapper);
 } cef_command_line_t;
 
 ///
-// Create a new cef_command_line_t instance.
+/// Create a new cef_command_line_t instance.
 ///
-CEF_EXPORT cef_command_line_t* cef_command_line_create();
+CEF_EXPORT cef_command_line_t* cef_command_line_create(void);
 
 ///
-// Returns the singleton global cef_command_line_t object. The returned object
-// will be read-only.
+/// Returns the singleton global cef_command_line_t object. The returned object
+/// will be read-only.
 ///
-CEF_EXPORT cef_command_line_t* cef_command_line_get_global();
+CEF_EXPORT cef_command_line_t* cef_command_line_get_global(void);
 
 #ifdef __cplusplus
 }
diff --git a/src/include/capi/cef_context_menu_handler_capi.h b/src/include/capi/cef_context_menu_handler_capi.h
index e4cb71b..bc27333 100644
--- a/src/include/capi/cef_context_menu_handler_capi.h
+++ b/src/include/capi/cef_context_menu_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=fcb0328c54e5f629c24bfd232d75c31c372ab6ac$
+// $hash=c82f41d81f5afa5ed6995693e012c13d2a609f88$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_CONTEXT_MENU_HANDLER_CAPI_H_
@@ -52,44 +52,67 @@
 struct _cef_context_menu_params_t;
 
 ///
-// Callback structure used for continuation of custom context menu display.
+/// Callback structure used for continuation of custom context menu display.
 ///
 typedef struct _cef_run_context_menu_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Complete context menu display by selecting the specified |command_id| and
-  // |event_flags|.
+  /// Complete context menu display by selecting the specified |command_id| and
+  /// |event_flags|.
   ///
   void(CEF_CALLBACK* cont)(struct _cef_run_context_menu_callback_t* self,
                            int command_id,
                            cef_event_flags_t event_flags);
 
   ///
-  // Cancel context menu display.
+  /// Cancel context menu display.
   ///
   void(CEF_CALLBACK* cancel)(struct _cef_run_context_menu_callback_t* self);
 } cef_run_context_menu_callback_t;
 
 ///
-// Implement this structure to handle context menu events. The functions of this
-// structure will be called on the UI thread.
+/// Callback structure used for continuation of custom quick menu display.
 ///
-typedef struct _cef_context_menu_handler_t {
+typedef struct _cef_run_quick_menu_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called before a context menu is displayed. |params| provides information
-  // about the context menu state. |model| initially contains the default
-  // context menu. The |model| can be cleared to show no context menu or
-  // modified to show a custom menu. Do not keep references to |params| or
-  // |model| outside of this callback.
+  /// Complete quick menu display by selecting the specified |command_id| and
+  /// |event_flags|.
+  ///
+  void(CEF_CALLBACK* cont)(struct _cef_run_quick_menu_callback_t* self,
+                           int command_id,
+                           cef_event_flags_t event_flags);
+
+  ///
+  /// Cancel quick menu display.
+  ///
+  void(CEF_CALLBACK* cancel)(struct _cef_run_quick_menu_callback_t* self);
+} cef_run_quick_menu_callback_t;
+
+///
+/// Implement this structure to handle context menu events. The functions of
+/// this structure will be called on the UI thread.
+///
+typedef struct _cef_context_menu_handler_t {
+  ///
+  /// Base structure.
+  ///
+  cef_base_ref_counted_t base;
+
+  ///
+  /// Called before a context menu is displayed. |params| provides information
+  /// about the context menu state. |model| initially contains the default
+  /// context menu. The |model| can be cleared to show no context menu or
+  /// modified to show a custom menu. Do not keep references to |params| or
+  /// |model| outside of this callback.
   ///
   void(CEF_CALLBACK* on_before_context_menu)(
       struct _cef_context_menu_handler_t* self,
@@ -99,12 +122,12 @@
       struct _cef_menu_model_t* model);
 
   ///
-  // Called to allow custom display of the context menu. |params| provides
-  // information about the context menu state. |model| contains the context menu
-  // model resulting from OnBeforeContextMenu. For custom display return true
-  // (1) and execute |callback| either synchronously or asynchronously with the
-  // selected command ID. For default display return false (0). Do not keep
-  // references to |params| or |model| outside of this callback.
+  /// Called to allow custom display of the context menu. |params| provides
+  /// information about the context menu state. |model| contains the context
+  /// menu model resulting from OnBeforeContextMenu. For custom display return
+  /// true (1) and execute |callback| either synchronously or asynchronously
+  /// with the selected command ID. For default display return false (0). Do not
+  /// keep references to |params| or |model| outside of this callback.
   ///
   int(CEF_CALLBACK* run_context_menu)(
       struct _cef_context_menu_handler_t* self,
@@ -115,13 +138,13 @@
       struct _cef_run_context_menu_callback_t* callback);
 
   ///
-  // Called to execute a command selected from the context menu. Return true (1)
-  // if the command was handled or false (0) for the default implementation. See
-  // cef_menu_id_t for the command ids that have default implementations. All
-  // user-defined command ids should be between MENU_ID_USER_FIRST and
-  // MENU_ID_USER_LAST. |params| will have the same values as what was passed to
-  // on_before_context_menu(). Do not keep a reference to |params| outside of
-  // this callback.
+  /// Called to execute a command selected from the context menu. Return true
+  /// (1) if the command was handled or false (0) for the default
+  /// implementation. See cef_menu_id_t for the command ids that have default
+  /// implementations. All user-defined command ids should be between
+  /// MENU_ID_USER_FIRST and MENU_ID_USER_LAST. |params| will have the same
+  /// values as what was passed to on_before_context_menu(). Do not keep a
+  /// reference to |params| outside of this callback.
   ///
   int(CEF_CALLBACK* on_context_menu_command)(
       struct _cef_context_menu_handler_t* self,
@@ -132,173 +155,209 @@
       cef_event_flags_t event_flags);
 
   ///
-  // Called when the context menu is dismissed irregardless of whether the menu
-  // was NULL or a command was selected.
+  /// Called when the context menu is dismissed irregardless of whether the menu
+  /// was canceled or a command was selected.
   ///
   void(CEF_CALLBACK* on_context_menu_dismissed)(
       struct _cef_context_menu_handler_t* self,
       struct _cef_browser_t* browser,
       struct _cef_frame_t* frame);
+
+  ///
+  /// Called to allow custom display of the quick menu for a windowless browser.
+  /// |location| is the top left corner of the selected region. |size| is the
+  /// size of the selected region. |edit_state_flags| is a combination of flags
+  /// that represent the state of the quick menu. Return true (1) if the menu
+  /// will be handled and execute |callback| either synchronously or
+  /// asynchronously with the selected command ID. Return false (0) to cancel
+  /// the menu.
+  ///
+  int(CEF_CALLBACK* run_quick_menu)(
+      struct _cef_context_menu_handler_t* self,
+      struct _cef_browser_t* browser,
+      struct _cef_frame_t* frame,
+      const cef_point_t* location,
+      const cef_size_t* size,
+      cef_quick_menu_edit_state_flags_t edit_state_flags,
+      struct _cef_run_quick_menu_callback_t* callback);
+
+  ///
+  /// Called to execute a command selected from the quick menu for a windowless
+  /// browser. Return true (1) if the command was handled or false (0) for the
+  /// default implementation. See cef_menu_id_t for command IDs that have
+  /// default implementations.
+  ///
+  int(CEF_CALLBACK* on_quick_menu_command)(
+      struct _cef_context_menu_handler_t* self,
+      struct _cef_browser_t* browser,
+      struct _cef_frame_t* frame,
+      int command_id,
+      cef_event_flags_t event_flags);
+
+  ///
+  /// Called when the quick menu for a windowless browser is dismissed
+  /// irregardless of whether the menu was canceled or a command was selected.
+  ///
+  void(CEF_CALLBACK* on_quick_menu_dismissed)(
+      struct _cef_context_menu_handler_t* self,
+      struct _cef_browser_t* browser,
+      struct _cef_frame_t* frame);
 } cef_context_menu_handler_t;
 
 ///
-// Provides information about the context menu state. The ethods of this
-// structure can only be accessed on browser process the UI thread.
+/// Provides information about the context menu state. The functions of this
+/// structure can only be accessed on browser process the UI thread.
 ///
 typedef struct _cef_context_menu_params_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns the X coordinate of the mouse where the context menu was invoked.
-  // Coords are relative to the associated RenderView's origin.
+  /// Returns the X coordinate of the mouse where the context menu was invoked.
+  /// Coords are relative to the associated RenderView's origin.
   ///
   int(CEF_CALLBACK* get_xcoord)(struct _cef_context_menu_params_t* self);
 
   ///
-  // Returns the Y coordinate of the mouse where the context menu was invoked.
-  // Coords are relative to the associated RenderView's origin.
+  /// Returns the Y coordinate of the mouse where the context menu was invoked.
+  /// Coords are relative to the associated RenderView's origin.
   ///
   int(CEF_CALLBACK* get_ycoord)(struct _cef_context_menu_params_t* self);
 
   ///
-  // Returns flags representing the type of node that the context menu was
-  // invoked on.
+  /// Returns flags representing the type of node that the context menu was
+  /// invoked on.
   ///
   cef_context_menu_type_flags_t(CEF_CALLBACK* get_type_flags)(
       struct _cef_context_menu_params_t* self);
 
   ///
-  // Returns the URL of the link, if any, that encloses the node that the
-  // context menu was invoked on.
+  /// Returns the URL of the link, if any, that encloses the node that the
+  /// context menu was invoked on.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_link_url)(
       struct _cef_context_menu_params_t* self);
 
   ///
-  // Returns the link URL, if any, to be used ONLY for "copy link address". We
-  // don't validate this field in the frontend process.
+  /// Returns the link URL, if any, to be used ONLY for "copy link address". We
+  /// don't validate this field in the frontend process.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_unfiltered_link_url)(
       struct _cef_context_menu_params_t* self);
 
   ///
-  // Returns the source URL, if any, for the element that the context menu was
-  // invoked on. Example of elements with source URLs are img, audio, and video.
+  /// Returns the source URL, if any, for the element that the context menu was
+  /// invoked on. Example of elements with source URLs are img, audio, and
+  /// video.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_source_url)(
       struct _cef_context_menu_params_t* self);
 
   ///
-  // Returns true (1) if the context menu was invoked on an image which has non-
-  // NULL contents.
+  /// Returns true (1) if the context menu was invoked on an image which has
+  /// non-NULL contents.
   ///
   int(CEF_CALLBACK* has_image_contents)(
       struct _cef_context_menu_params_t* self);
 
   ///
-  // Returns the title text or the alt text if the context menu was invoked on
-  // an image.
+  /// Returns the title text or the alt text if the context menu was invoked on
+  /// an image.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_title_text)(
       struct _cef_context_menu_params_t* self);
 
   ///
-  // Returns the URL of the top level page that the context menu was invoked on.
+  /// Returns the URL of the top level page that the context menu was invoked
+  /// on.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_page_url)(
       struct _cef_context_menu_params_t* self);
 
   ///
-  // Returns the URL of the subframe that the context menu was invoked on.
+  /// Returns the URL of the subframe that the context menu was invoked on.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_frame_url)(
       struct _cef_context_menu_params_t* self);
 
   ///
-  // Returns the character encoding of the subframe that the context menu was
-  // invoked on.
+  /// Returns the character encoding of the subframe that the context menu was
+  /// invoked on.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_frame_charset)(
       struct _cef_context_menu_params_t* self);
 
   ///
-  // Returns the type of context node that the context menu was invoked on.
+  /// Returns the type of context node that the context menu was invoked on.
   ///
   cef_context_menu_media_type_t(CEF_CALLBACK* get_media_type)(
       struct _cef_context_menu_params_t* self);
 
   ///
-  // Returns flags representing the actions supported by the media element, if
-  // any, that the context menu was invoked on.
+  /// Returns flags representing the actions supported by the media element, if
+  /// any, that the context menu was invoked on.
   ///
   cef_context_menu_media_state_flags_t(CEF_CALLBACK* get_media_state_flags)(
       struct _cef_context_menu_params_t* self);
 
   ///
-  // Returns the text of the selection, if any, that the context menu was
-  // invoked on.
+  /// Returns the text of the selection, if any, that the context menu was
+  /// invoked on.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_selection_text)(
       struct _cef_context_menu_params_t* self);
 
   ///
-  // Returns the text of the misspelled word, if any, that the context menu was
-  // invoked on.
+  /// Returns the text of the misspelled word, if any, that the context menu was
+  /// invoked on.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_misspelled_word)(
       struct _cef_context_menu_params_t* self);
 
   ///
-  // Returns true (1) if suggestions exist, false (0) otherwise. Fills in
-  // |suggestions| from the spell check service for the misspelled word if there
-  // is one.
+  /// Returns true (1) if suggestions exist, false (0) otherwise. Fills in
+  /// |suggestions| from the spell check service for the misspelled word if
+  /// there is one.
   ///
   int(CEF_CALLBACK* get_dictionary_suggestions)(
       struct _cef_context_menu_params_t* self,
       cef_string_list_t suggestions);
 
   ///
-  // Returns true (1) if the context menu was invoked on an editable node.
+  /// Returns true (1) if the context menu was invoked on an editable node.
   ///
   int(CEF_CALLBACK* is_editable)(struct _cef_context_menu_params_t* self);
 
   ///
-  // Returns true (1) if the context menu was invoked on an editable node where
-  // spell-check is enabled.
+  /// Returns true (1) if the context menu was invoked on an editable node where
+  /// spell-check is enabled.
   ///
   int(CEF_CALLBACK* is_spell_check_enabled)(
       struct _cef_context_menu_params_t* self);
 
   ///
-  // Returns flags representing the actions supported by the editable node, if
-  // any, that the context menu was invoked on.
+  /// Returns flags representing the actions supported by the editable node, if
+  /// any, that the context menu was invoked on.
   ///
   cef_context_menu_edit_state_flags_t(CEF_CALLBACK* get_edit_state_flags)(
       struct _cef_context_menu_params_t* self);
 
   ///
-  // Returns true (1) if the context menu contains items specified by the
-  // renderer process (for example, plugin placeholder or pepper plugin menu
-  // items).
+  /// Returns true (1) if the context menu contains items specified by the
+  /// renderer process.
   ///
   int(CEF_CALLBACK* is_custom_menu)(struct _cef_context_menu_params_t* self);
-
-  ///
-  // Returns true (1) if the context menu was invoked from a pepper plugin.
-  ///
-  int(CEF_CALLBACK* is_pepper_menu)(struct _cef_context_menu_params_t* self);
 } cef_context_menu_params_t;
 
 #ifdef __cplusplus
diff --git a/src/include/capi/cef_cookie_capi.h b/src/include/capi/cef_cookie_capi.h
index 7a4a13e..1be978b 100644
--- a/src/include/capi/cef_cookie_capi.h
+++ b/src/include/capi/cef_cookie_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=2f5721138da26a9d7cce300a635b58dae9f51a4a$
+// $hash=598c6f530b2e2553197d8c6a72ad9e2bf72b5443$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_COOKIE_CAPI_H_
@@ -52,44 +52,29 @@
 struct _cef_set_cookie_callback_t;
 
 ///
-// Structure used for managing cookies. The functions of this structure may be
-// called on any thread unless otherwise indicated.
+/// Structure used for managing cookies. The functions of this structure may be
+/// called on any thread unless otherwise indicated.
 ///
 typedef struct _cef_cookie_manager_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Set the schemes supported by this manager. If |include_defaults| is true
-  // (1) the default schemes ("http", "https", "ws" and "wss") will also be
-  // supported. Calling this function with an NULL |schemes| value and
-  // |include_defaults| set to false (0) will disable all loading and saving of
-  // cookies for this manager. If |callback| is non-NULL it will be executed
-  // asnychronously on the UI thread after the change has been applied. Must be
-  // called before any cookies are accessed.
-  ///
-  void(CEF_CALLBACK* set_supported_schemes)(
-      struct _cef_cookie_manager_t* self,
-      cef_string_list_t schemes,
-      int include_defaults,
-      struct _cef_completion_callback_t* callback);
-
-  ///
-  // Visit all cookies on the UI thread. The returned cookies are ordered by
-  // longest path, then by earliest creation date. Returns false (0) if cookies
-  // cannot be accessed.
+  /// Visit all cookies on the UI thread. The returned cookies are ordered by
+  /// longest path, then by earliest creation date. Returns false (0) if cookies
+  /// cannot be accessed.
   ///
   int(CEF_CALLBACK* visit_all_cookies)(struct _cef_cookie_manager_t* self,
                                        struct _cef_cookie_visitor_t* visitor);
 
   ///
-  // Visit a subset of cookies on the UI thread. The results are filtered by the
-  // given url scheme, host, domain and path. If |includeHttpOnly| is true (1)
-  // HTTP-only cookies will also be included in the results. The returned
-  // cookies are ordered by longest path, then by earliest creation date.
-  // Returns false (0) if cookies cannot be accessed.
+  /// Visit a subset of cookies on the UI thread. The results are filtered by
+  /// the given url scheme, host, domain and path. If |includeHttpOnly| is true
+  /// (1) HTTP-only cookies will also be included in the results. The returned
+  /// cookies are ordered by longest path, then by earliest creation date.
+  /// Returns false (0) if cookies cannot be accessed.
   ///
   int(CEF_CALLBACK* visit_url_cookies)(struct _cef_cookie_manager_t* self,
                                        const cef_string_t* url,
@@ -97,13 +82,13 @@
                                        struct _cef_cookie_visitor_t* visitor);
 
   ///
-  // Sets a cookie given a valid URL and explicit user-provided cookie
-  // attributes. This function expects each attribute to be well-formed. It will
-  // check for disallowed characters (e.g. the ';' character is disallowed
-  // within the cookie value attribute) and fail without setting the cookie if
-  // such characters are found. If |callback| is non-NULL it will be executed
-  // asnychronously on the UI thread after the cookie has been set. Returns
-  // false (0) if an invalid URL is specified or if cookies cannot be accessed.
+  /// Sets a cookie given a valid URL and explicit user-provided cookie
+  /// attributes. This function expects each attribute to be well-formed. It
+  /// will check for disallowed characters (e.g. the ';' character is disallowed
+  /// within the cookie value attribute) and fail without setting the cookie if
+  /// such characters are found. If |callback| is non-NULL it will be executed
+  /// asnychronously on the UI thread after the cookie has been set. Returns
+  /// false (0) if an invalid URL is specified or if cookies cannot be accessed.
   ///
   int(CEF_CALLBACK* set_cookie)(struct _cef_cookie_manager_t* self,
                                 const cef_string_t* url,
@@ -111,15 +96,15 @@
                                 struct _cef_set_cookie_callback_t* callback);
 
   ///
-  // Delete all cookies that match the specified parameters. If both |url| and
-  // |cookie_name| values are specified all host and domain cookies matching
-  // both will be deleted. If only |url| is specified all host cookies (but not
-  // domain cookies) irrespective of path will be deleted. If |url| is NULL all
-  // cookies for all hosts and domains will be deleted. If |callback| is non-
-  // NULL it will be executed asnychronously on the UI thread after the cookies
-  // have been deleted. Returns false (0) if a non-NULL invalid URL is specified
-  // or if cookies cannot be accessed. Cookies can alternately be deleted using
-  // the Visit*Cookies() functions.
+  /// Delete all cookies that match the specified parameters. If both |url| and
+  /// |cookie_name| values are specified all host and domain cookies matching
+  /// both will be deleted. If only |url| is specified all host cookies (but not
+  /// domain cookies) irrespective of path will be deleted. If |url| is NULL all
+  /// cookies for all hosts and domains will be deleted. If |callback| is non-
+  /// NULL it will be executed asnychronously on the UI thread after the cookies
+  /// have been deleted. Returns false (0) if a non-NULL invalid URL is
+  /// specified or if cookies cannot be accessed. Cookies can alternately be
+  /// deleted using the Visit*Cookies() functions.
   ///
   int(CEF_CALLBACK* delete_cookies)(
       struct _cef_cookie_manager_t* self,
@@ -128,41 +113,41 @@
       struct _cef_delete_cookies_callback_t* callback);
 
   ///
-  // Flush the backing store (if any) to disk. If |callback| is non-NULL it will
-  // be executed asnychronously on the UI thread after the flush is complete.
-  // Returns false (0) if cookies cannot be accessed.
+  /// Flush the backing store (if any) to disk. If |callback| is non-NULL it
+  /// will be executed asnychronously on the UI thread after the flush is
+  /// complete. Returns false (0) if cookies cannot be accessed.
   ///
   int(CEF_CALLBACK* flush_store)(struct _cef_cookie_manager_t* self,
                                  struct _cef_completion_callback_t* callback);
 } cef_cookie_manager_t;
 
 ///
-// Returns the global cookie manager. By default data will be stored at
-// CefSettings.cache_path if specified or in memory otherwise. If |callback| is
-// non-NULL it will be executed asnychronously on the UI thread after the
-// manager's storage has been initialized. Using this function is equivalent to
-// calling cef_request_context_t::cef_request_context_get_global_context()->GetD
-// efaultCookieManager().
+/// Returns the global cookie manager. By default data will be stored at
+/// cef_settings_t.cache_path if specified or in memory otherwise. If |callback|
+/// is non-NULL it will be executed asnychronously on the UI thread after the
+/// manager's storage has been initialized. Using this function is equivalent to
+/// calling cef_request_context_t::cef_request_context_get_global_context()->Get
+/// DefaultCookieManager().
 ///
 CEF_EXPORT cef_cookie_manager_t* cef_cookie_manager_get_global_manager(
     struct _cef_completion_callback_t* callback);
 
 ///
-// Structure to implement for visiting cookie values. The functions of this
-// structure will always be called on the UI thread.
+/// Structure to implement for visiting cookie values. The functions of this
+/// structure will always be called on the UI thread.
 ///
 typedef struct _cef_cookie_visitor_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Method that will be called once for each cookie. |count| is the 0-based
-  // index for the current cookie. |total| is the total number of cookies. Set
-  // |deleteCookie| to true (1) to delete the cookie currently being visited.
-  // Return false (0) to stop visiting cookies. This function may never be
-  // called if no cookies are found.
+  /// Method that will be called once for each cookie. |count| is the 0-based
+  /// index for the current cookie. |total| is the total number of cookies. Set
+  /// |deleteCookie| to true (1) to delete the cookie currently being visited.
+  /// Return false (0) to stop visiting cookies. This function may never be
+  /// called if no cookies are found.
   ///
   int(CEF_CALLBACK* visit)(struct _cef_cookie_visitor_t* self,
                            const struct _cef_cookie_t* cookie,
@@ -172,36 +157,36 @@
 } cef_cookie_visitor_t;
 
 ///
-// Structure to implement to be notified of asynchronous completion via
-// cef_cookie_manager_t::set_cookie().
+/// Structure to implement to be notified of asynchronous completion via
+/// cef_cookie_manager_t::set_cookie().
 ///
 typedef struct _cef_set_cookie_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Method that will be called upon completion. |success| will be true (1) if
-  // the cookie was set successfully.
+  /// Method that will be called upon completion. |success| will be true (1) if
+  /// the cookie was set successfully.
   ///
   void(CEF_CALLBACK* on_complete)(struct _cef_set_cookie_callback_t* self,
                                   int success);
 } cef_set_cookie_callback_t;
 
 ///
-// Structure to implement to be notified of asynchronous completion via
-// cef_cookie_manager_t::delete_cookies().
+/// Structure to implement to be notified of asynchronous completion via
+/// cef_cookie_manager_t::delete_cookies().
 ///
 typedef struct _cef_delete_cookies_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Method that will be called upon completion. |num_deleted| will be the
-  // number of cookies that were deleted.
+  /// Method that will be called upon completion. |num_deleted| will be the
+  /// number of cookies that were deleted.
   ///
   void(CEF_CALLBACK* on_complete)(struct _cef_delete_cookies_callback_t* self,
                                   int num_deleted);
diff --git a/src/include/capi/cef_crash_util_capi.h b/src/include/capi/cef_crash_util_capi.h
index 98a3be5..ce6ce04 100644
--- a/src/include/capi/cef_crash_util_capi.h
+++ b/src/include/capi/cef_crash_util_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=2b24c7d99c59c669719b822f5ea19763d140b001$
+// $hash=22cfd717df9032a01214d9abfe3e0e51949b3319$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_CRASH_UTIL_CAPI_H_
@@ -47,99 +47,102 @@
 #endif
 
 ///
-// Crash reporting is configured using an INI-style config file named
-// "crash_reporter.cfg". On Windows and Linux this file must be placed next to
-// the main application executable. On macOS this file must be placed in the
-// top-level app bundle Resources directory (e.g.
-// "<appname>.app/Contents/Resources"). File contents are as follows:
-//
-//  # Comments start with a hash character and must be on their own line.
-//
-//  [Config]
-//  ProductName=<Value of the "prod" crash key; defaults to "cef">
-//  ProductVersion=<Value of the "ver" crash key; defaults to the CEF version>
-//  AppName=<Windows only; App-specific folder name component for storing crash
-//           information; default to "CEF">
-//  ExternalHandler=<Windows only; Name of the external handler exe to use
-//                   instead of re-launching the main exe; default to empty>
-//  BrowserCrashForwardingEnabled=<macOS only; True if browser process crashes
-//                                 should be forwarded to the system crash
-//                                 reporter; default to false>
-//  ServerURL=<crash server URL; default to empty>
-//  RateLimitEnabled=<True if uploads should be rate limited; default to true>
-//  MaxUploadsPerDay=<Max uploads per 24 hours, used if rate limit is enabled;
-//                    default to 5>
-//  MaxDatabaseSizeInMb=<Total crash report disk usage greater than this value
-//                       will cause older reports to be deleted; default to 20>
-//  MaxDatabaseAgeInDays=<Crash reports older than this value will be deleted;
-//                        default to 5>
-//
-//  [CrashKeys]
-//  my_key1=<small|medium|large>
-//  my_key2=<small|medium|large>
-//
-// Config section:
-//
-// If "ProductName" and/or "ProductVersion" are set then the specified values
-// will be included in the crash dump metadata. On macOS if these values are set
-// to NULL then they will be retrieved from the Info.plist file using the
-// "CFBundleName" and "CFBundleShortVersionString" keys respectively.
-//
-// If "AppName" is set on Windows then crash report information (metrics,
-// database and dumps) will be stored locally on disk under the
-// "C:\Users\[CurrentUser]\AppData\Local\[AppName]\User Data" folder. On other
-// platforms the CefSettings.user_data_path value will be used.
-//
-// If "ExternalHandler" is set on Windows then the specified exe will be
-// launched as the crashpad-handler instead of re-launching the main process
-// exe. The value can be an absolute path or a path relative to the main exe
-// directory. On Linux the CefSettings.browser_subprocess_path value will be
-// used. On macOS the existing subprocess app bundle will be used.
-//
-// If "BrowserCrashForwardingEnabled" is set to true (1) on macOS then browser
-// process crashes will be forwarded to the system crash reporter. This results
-// in the crash UI dialog being displayed to the user and crash reports being
-// logged under "~/Library/Logs/DiagnosticReports". Forwarding of crash reports
-// from non-browser processes and Debug builds is always disabled.
-//
-// If "ServerURL" is set then crashes will be uploaded as a multi-part POST
-// request to the specified URL. Otherwise, reports will only be stored locally
-// on disk.
-//
-// If "RateLimitEnabled" is set to true (1) then crash report uploads will be
-// rate limited as follows:
-//  1. If "MaxUploadsPerDay" is set to a positive value then at most the
-//     specified number of crashes will be uploaded in each 24 hour period.
-//  2. If crash upload fails due to a network or server error then an
-//     incremental backoff delay up to a maximum of 24 hours will be applied for
-//     retries.
-//  3. If a backoff delay is applied and "MaxUploadsPerDay" is > 1 then the
-//     "MaxUploadsPerDay" value will be reduced to 1 until the client is
-//     restarted. This helps to avoid an upload flood when the network or
-//     server error is resolved.
-// Rate limiting is not supported on Linux.
-//
-// If "MaxDatabaseSizeInMb" is set to a positive value then crash report storage
-// on disk will be limited to that size in megabytes. For example, on Windows
-// each dump is about 600KB so a "MaxDatabaseSizeInMb" value of 20 equates to
-// about 34 crash reports stored on disk. Not supported on Linux.
-//
-// If "MaxDatabaseAgeInDays" is set to a positive value then crash reports older
-// than the specified age in days will be deleted. Not supported on Linux.
-//
-// CrashKeys section:
-//
-// A maximum of 26 crash keys of each size can be specified for use by the
-// application. Crash key values will be truncated based on the specified size
-// (small = 64 bytes, medium = 256 bytes, large = 1024 bytes). The value of
-// crash keys can be set from any thread or process using the
-// CefSetCrashKeyValue function. These key/value pairs will be sent to the crash
-// server along with the crash dump file.
+/// Crash reporting is configured using an INI-style config file named
+/// "crash_reporter.cfg". On Windows and Linux this file must be placed next to
+/// the main application executable. On macOS this file must be placed in the
+/// top-level app bundle Resources directory (e.g.
+/// "<appname>.app/Contents/Resources"). File contents are as follows:
 ///
-CEF_EXPORT int cef_crash_reporting_enabled();
+/// <pre>
+///  # Comments start with a hash character and must be on their own line.
+///
+///  [Config]
+///  ProductName=<Value of the "prod" crash key; defaults to "cef">
+///  ProductVersion=<Value of the "ver" crash key; defaults to the CEF version>
+///  AppName=<Windows only; App-specific folder name component for storing crash
+///           information; default to "CEF">
+///  ExternalHandler=<Windows only; Name of the external handler exe to use
+///                   instead of re-launching the main exe; default to empty>
+///  BrowserCrashForwardingEnabled=<macOS only; True if browser process crashes
+///                                 should be forwarded to the system crash
+///                                 reporter; default to false>
+///  ServerURL=<crash server URL; default to empty>
+///  RateLimitEnabled=<True if uploads should be rate limited; default to true>
+///  MaxUploadsPerDay=<Max uploads per 24 hours, used if rate limit is enabled;
+///                    default to 5>
+///  MaxDatabaseSizeInMb=<Total crash report disk usage greater than this value
+///                       will cause older reports to be deleted; default to 20>
+///  MaxDatabaseAgeInDays=<Crash reports older than this value will be deleted;
+///                        default to 5>
+///
+///  [CrashKeys]
+///  my_key1=<small|medium|large>
+///  my_key2=<small|medium|large>
+/// </pre>
+///
+/// <b>Config section:</b>
+///
+/// If "ProductName" and/or "ProductVersion" are set then the specified values
+/// will be included in the crash dump metadata. On macOS if these values are
+/// set to NULL then they will be retrieved from the Info.plist file using the
+/// "CFBundleName" and "CFBundleShortVersionString" keys respectively.
+///
+/// If "AppName" is set on Windows then crash report information (metrics,
+/// database and dumps) will be stored locally on disk under the
+/// "C:\Users\[CurrentUser]\AppData\Local\[AppName]\User Data" folder. On other
+/// platforms the cef_settings_t.root_cache_path value will be used.
+///
+/// If "ExternalHandler" is set on Windows then the specified exe will be
+/// launched as the crashpad-handler instead of re-launching the main process
+/// exe. The value can be an absolute path or a path relative to the main exe
+/// directory. On Linux the cef_settings_t.browser_subprocess_path value will be
+/// used. On macOS the existing subprocess app bundle will be used.
+///
+/// If "BrowserCrashForwardingEnabled" is set to true (1) on macOS then browser
+/// process crashes will be forwarded to the system crash reporter. This results
+/// in the crash UI dialog being displayed to the user and crash reports being
+/// logged under "~/Library/Logs/DiagnosticReports". Forwarding of crash reports
+/// from non-browser processes and Debug builds is always disabled.
+///
+/// If "ServerURL" is set then crashes will be uploaded as a multi-part POST
+/// request to the specified URL. Otherwise, reports will only be stored locally
+/// on disk.
+///
+/// If "RateLimitEnabled" is set to true (1) then crash report uploads will be
+/// rate limited as follows:
+///  1. If "MaxUploadsPerDay" is set to a positive value then at most the
+///     specified number of crashes will be uploaded in each 24 hour period.
+///  2. If crash upload fails due to a network or server error then an
+///     incremental backoff delay up to a maximum of 24 hours will be applied
+///     for retries.
+///  3. If a backoff delay is applied and "MaxUploadsPerDay" is > 1 then the
+///     "MaxUploadsPerDay" value will be reduced to 1 until the client is
+///     restarted. This helps to avoid an upload flood when the network or
+///     server error is resolved.
+/// Rate limiting is not supported on Linux.
+///
+/// If "MaxDatabaseSizeInMb" is set to a positive value then crash report
+/// storage on disk will be limited to that size in megabytes. For example, on
+/// Windows each dump is about 600KB so a "MaxDatabaseSizeInMb" value of 20
+/// equates to about 34 crash reports stored on disk. Not supported on Linux.
+///
+/// If "MaxDatabaseAgeInDays" is set to a positive value then crash reports
+/// older than the specified age in days will be deleted. Not supported on
+/// Linux.
+///
+/// <b>CrashKeys section:</b>
+///
+/// A maximum of 26 crash keys of each size can be specified for use by the
+/// application. Crash key values will be truncated based on the specified size
+/// (small = 64 bytes, medium = 256 bytes, large = 1024 bytes). The value of
+/// crash keys can be set from any thread or process using the
+/// CefSetCrashKeyValue function. These key/value pairs will be sent to the
+/// crash server along with the crash dump file.
+///
+CEF_EXPORT int cef_crash_reporting_enabled(void);
 
 ///
-// Sets or clears a specific key-value pair from the crash metadata.
+/// Sets or clears a specific key-value pair from the crash metadata.
 ///
 CEF_EXPORT void cef_set_crash_key_value(const cef_string_t* key,
                                         const cef_string_t* value);
diff --git a/src/include/capi/cef_devtools_message_observer_capi.h b/src/include/capi/cef_devtools_message_observer_capi.h
index bb0a21c..ee61835 100644
--- a/src/include/capi/cef_devtools_message_observer_capi.h
+++ b/src/include/capi/cef_devtools_message_observer_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=86906c2e971fea7e479738f59bbf85d71ce31953$
+// $hash=777485120b9a9df0f890579ee698d33f273819c5$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_DEVTOOLS_MESSAGE_OBSERVER_CAPI_H_
@@ -49,35 +49,36 @@
 struct _cef_browser_t;
 
 ///
-// Callback structure for cef_browser_host_t::AddDevToolsMessageObserver. The
-// functions of this structure will be called on the browser process UI thread.
+/// Callback structure for cef_browser_host_t::AddDevToolsMessageObserver. The
+/// functions of this structure will be called on the browser process UI thread.
 ///
 typedef struct _cef_dev_tools_message_observer_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Method that will be called on receipt of a DevTools protocol message.
-  // |browser| is the originating browser instance. |message| is a UTF8-encoded
-  // JSON dictionary representing either a function result or an event.
-  // |message| is only valid for the scope of this callback and should be copied
-  // if necessary. Return true (1) if the message was handled or false (0) if
-  // the message should be further processed and passed to the
-  // OnDevToolsMethodResult or OnDevToolsEvent functions as appropriate.
-  //
-  // Method result dictionaries include an "id" (int) value that identifies the
-  // orginating function call sent from cef_browser_host_t::SendDevToolsMessage,
-  // and optionally either a "result" (dictionary) or "error" (dictionary)
-  // value. The "error" dictionary will contain "code" (int) and "message"
-  // (string) values. Event dictionaries include a "function" (string) value and
-  // optionally a "params" (dictionary) value. See the DevTools protocol
-  // documentation at https://chromedevtools.github.io/devtools-protocol/ for
-  // details of supported function calls and the expected "result" or "params"
-  // dictionary contents. JSON dictionaries can be parsed using the CefParseJSON
-  // function if desired, however be aware of performance considerations when
-  // parsing large messages (some of which may exceed 1MB in size).
+  /// Method that will be called on receipt of a DevTools protocol message.
+  /// |browser| is the originating browser instance. |message| is a UTF8-encoded
+  /// JSON dictionary representing either a function result or an event.
+  /// |message| is only valid for the scope of this callback and should be
+  /// copied if necessary. Return true (1) if the message was handled or false
+  /// (0) if the message should be further processed and passed to the
+  /// OnDevToolsMethodResult or OnDevToolsEvent functions as appropriate.
+  ///
+  /// Method result dictionaries include an "id" (int) value that identifies the
+  /// orginating function call sent from
+  /// cef_browser_host_t::SendDevToolsMessage, and optionally either a "result"
+  /// (dictionary) or "error" (dictionary) value. The "error" dictionary will
+  /// contain "code" (int) and "message" (string) values. Event dictionaries
+  /// include a "function" (string) value and optionally a "params" (dictionary)
+  /// value. See the DevTools protocol documentation at
+  /// https://chromedevtools.github.io/devtools-protocol/ for details of
+  /// supported function calls and the expected "result" or "params" dictionary
+  /// contents. JSON dictionaries can be parsed using the CefParseJSON function
+  /// if desired, however be aware of performance considerations when parsing
+  /// large messages (some of which may exceed 1MB in size).
   ///
   int(CEF_CALLBACK* on_dev_tools_message)(
       struct _cef_dev_tools_message_observer_t* self,
@@ -86,16 +87,16 @@
       size_t message_size);
 
   ///
-  // Method that will be called after attempted execution of a DevTools protocol
-  // function. |browser| is the originating browser instance. |message_id| is
-  // the "id" value that identifies the originating function call message. If
-  // the function succeeded |success| will be true (1) and |result| will be the
-  // UTF8-encoded JSON "result" dictionary value (which may be NULL). If the
-  // function failed |success| will be false (0) and |result| will be the
-  // UTF8-encoded JSON "error" dictionary value. |result| is only valid for the
-  // scope of this callback and should be copied if necessary. See the
-  // OnDevToolsMessage documentation for additional details on |result|
-  // contents.
+  /// Method that will be called after attempted execution of a DevTools
+  /// protocol function. |browser| is the originating browser instance.
+  /// |message_id| is the "id" value that identifies the originating function
+  /// call message. If the function succeeded |success| will be true (1) and
+  /// |result| will be the UTF8-encoded JSON "result" dictionary value (which
+  /// may be NULL). If the function failed |success| will be false (0) and
+  /// |result| will be the UTF8-encoded JSON "error" dictionary value. |result|
+  /// is only valid for the scope of this callback and should be copied if
+  /// necessary. See the OnDevToolsMessage documentation for additional details
+  /// on |result| contents.
   ///
   void(CEF_CALLBACK* on_dev_tools_method_result)(
       struct _cef_dev_tools_message_observer_t* self,
@@ -106,12 +107,12 @@
       size_t result_size);
 
   ///
-  // Method that will be called on receipt of a DevTools protocol event.
-  // |browser| is the originating browser instance. |function| is the "function"
-  // value. |params| is the UTF8-encoded JSON "params" dictionary value (which
-  // may be NULL). |params| is only valid for the scope of this callback and
-  // should be copied if necessary. See the OnDevToolsMessage documentation for
-  // additional details on |params| contents.
+  /// Method that will be called on receipt of a DevTools protocol event.
+  /// |browser| is the originating browser instance. |function| is the
+  /// "function" value. |params| is the UTF8-encoded JSON "params" dictionary
+  /// value (which may be NULL). |params| is only valid for the scope of this
+  /// callback and should be copied if necessary. See the OnDevToolsMessage
+  /// documentation for additional details on |params| contents.
   ///
   void(CEF_CALLBACK* on_dev_tools_event)(
       struct _cef_dev_tools_message_observer_t* self,
@@ -121,19 +122,19 @@
       size_t params_size);
 
   ///
-  // Method that will be called when the DevTools agent has attached. |browser|
-  // is the originating browser instance. This will generally occur in response
-  // to the first message sent while the agent is detached.
+  /// Method that will be called when the DevTools agent has attached. |browser|
+  /// is the originating browser instance. This will generally occur in response
+  /// to the first message sent while the agent is detached.
   ///
   void(CEF_CALLBACK* on_dev_tools_agent_attached)(
       struct _cef_dev_tools_message_observer_t* self,
       struct _cef_browser_t* browser);
 
   ///
-  // Method that will be called when the DevTools agent has detached. |browser|
-  // is the originating browser instance. Any function results that were pending
-  // before the agent became detached will not be delivered, and any active
-  // event subscriptions will be canceled.
+  /// Method that will be called when the DevTools agent has detached. |browser|
+  /// is the originating browser instance. Any function results that were
+  /// pending before the agent became detached will not be delivered, and any
+  /// active event subscriptions will be canceled.
   ///
   void(CEF_CALLBACK* on_dev_tools_agent_detached)(
       struct _cef_dev_tools_message_observer_t* self,
diff --git a/src/include/capi/cef_dialog_handler_capi.h b/src/include/capi/cef_dialog_handler_capi.h
index 93258f1..82281ad 100644
--- a/src/include/capi/cef_dialog_handler_capi.h
+++ b/src/include/capi/cef_dialog_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=3253c217564ae9a85a1e971298c32a35e4cad136$
+// $hash=69545645f079f4593d9cbb6d8a36535c209245f7$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_DIALOG_HANDLER_CAPI_H_
@@ -48,55 +48,51 @@
 #endif
 
 ///
-// Callback structure for asynchronous continuation of file dialog requests.
+/// Callback structure for asynchronous continuation of file dialog requests.
 ///
 typedef struct _cef_file_dialog_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Continue the file selection. |selected_accept_filter| should be the 0-based
-  // index of the value selected from the accept filters array passed to
-  // cef_dialog_handler_t::OnFileDialog. |file_paths| should be a single value
-  // or a list of values depending on the dialog mode. An NULL |file_paths|
-  // value is treated the same as calling cancel().
+  /// Continue the file selection. |file_paths| should be a single value or a
+  /// list of values depending on the dialog mode. An NULL |file_paths| value is
+  /// treated the same as calling cancel().
   ///
   void(CEF_CALLBACK* cont)(struct _cef_file_dialog_callback_t* self,
-                           int selected_accept_filter,
                            cef_string_list_t file_paths);
 
   ///
-  // Cancel the file selection.
+  /// Cancel the file selection.
   ///
   void(CEF_CALLBACK* cancel)(struct _cef_file_dialog_callback_t* self);
 } cef_file_dialog_callback_t;
 
 ///
-// Implement this structure to handle dialog events. The functions of this
-// structure will be called on the browser process UI thread.
+/// Implement this structure to handle dialog events. The functions of this
+/// structure will be called on the browser process UI thread.
 ///
 typedef struct _cef_dialog_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called to run a file chooser dialog. |mode| represents the type of dialog
-  // to display. |title| to the title to be used for the dialog and may be NULL
-  // to show the default title ("Open" or "Save" depending on the mode).
-  // |default_file_path| is the path with optional directory and/or file name
-  // component that should be initially selected in the dialog. |accept_filters|
-  // are used to restrict the selectable file types and may any combination of
-  // (a) valid lower-cased MIME types (e.g. "text/*" or "image/*"), (b)
-  // individual file extensions (e.g. ".txt" or ".png"), or (c) combined
-  // description and file extension delimited using "|" and ";" (e.g. "Image
-  // Types|.png;.gif;.jpg"). |selected_accept_filter| is the 0-based index of
-  // the filter that should be selected by default. To display a custom dialog
-  // return true (1) and execute |callback| either inline or at a later time. To
-  // display the default dialog return false (0).
+  /// Called to run a file chooser dialog. |mode| represents the type of dialog
+  /// to display. |title| to the title to be used for the dialog and may be NULL
+  /// to show the default title ("Open" or "Save" depending on the mode).
+  /// |default_file_path| is the path with optional directory and/or file name
+  /// component that should be initially selected in the dialog.
+  /// |accept_filters| are used to restrict the selectable file types and may
+  /// any combination of (a) valid lower-cased MIME types (e.g. "text/*" or
+  /// "image/*"), (b) individual file extensions (e.g. ".txt" or ".png"), or (c)
+  /// combined description and file extension delimited using "|" and ";" (e.g.
+  /// "Image Types|.png;.gif;.jpg"). To display a custom dialog return true (1)
+  /// and execute |callback| either inline or at a later time. To display the
+  /// default dialog return false (0).
   ///
   int(CEF_CALLBACK* on_file_dialog)(
       struct _cef_dialog_handler_t* self,
@@ -105,7 +101,6 @@
       const cef_string_t* title,
       const cef_string_t* default_file_path,
       cef_string_list_t accept_filters,
-      int selected_accept_filter,
       struct _cef_file_dialog_callback_t* callback);
 } cef_dialog_handler_t;
 
diff --git a/src/include/capi/cef_display_handler_capi.h b/src/include/capi/cef_display_handler_capi.h
index d74f4a2..2b53b98 100644
--- a/src/include/capi/cef_display_handler_capi.h
+++ b/src/include/capi/cef_display_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=951c936c8070dbf9bd246cc766b81cdfe06a3d81$
+// $hash=5374127458a7cac3ee9b4d2b4ad8a6f5ca81ec52$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_DISPLAY_HANDLER_CAPI_H_
@@ -49,17 +49,17 @@
 #endif
 
 ///
-// Implement this structure to handle events related to browser display state.
-// The functions of this structure will be called on the UI thread.
+/// Implement this structure to handle events related to browser display state.
+/// The functions of this structure will be called on the UI thread.
 ///
 typedef struct _cef_display_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called when a frame's address has changed.
+  /// Called when a frame's address has changed.
   ///
   void(CEF_CALLBACK* on_address_change)(struct _cef_display_handler_t* self,
                                         struct _cef_browser_t* browser,
@@ -67,25 +67,30 @@
                                         const cef_string_t* url);
 
   ///
-  // Called when the page title changes.
+  /// Called when the page title changes.
   ///
   void(CEF_CALLBACK* on_title_change)(struct _cef_display_handler_t* self,
                                       struct _cef_browser_t* browser,
                                       const cef_string_t* title);
 
   ///
-  // Called when the page icon changes.
+  /// Called when the page icon changes.
   ///
   void(CEF_CALLBACK* on_favicon_urlchange)(struct _cef_display_handler_t* self,
                                            struct _cef_browser_t* browser,
                                            cef_string_list_t icon_urls);
 
   ///
-  // Called when web content in the page has toggled fullscreen mode. If
-  // |fullscreen| is true (1) the content will automatically be sized to fill
-  // the browser content area. If |fullscreen| is false (0) the content will
-  // automatically return to its original size and position. The client is
-  // responsible for resizing the browser if desired.
+  /// Called when web content in the page has toggled fullscreen mode. If
+  /// |fullscreen| is true (1) the content will automatically be sized to fill
+  /// the browser content area. If |fullscreen| is false (0) the content will
+  /// automatically return to its original size and position. With the Alloy
+  /// runtime the client is responsible for triggering the fullscreen transition
+  /// (for example, by calling cef_window_t::SetFullscreen when using Views).
+  /// With the Chrome runtime the fullscreen transition will be triggered
+  /// automatically. The cef_window_delegate_t::OnWindowFullscreenTransition
+  /// function will be called during the fullscreen transition for notification
+  /// purposes.
   ///
   void(CEF_CALLBACK* on_fullscreen_mode_change)(
       struct _cef_display_handler_t* self,
@@ -93,28 +98,28 @@
       int fullscreen);
 
   ///
-  // Called when the browser is about to display a tooltip. |text| contains the
-  // text that will be displayed in the tooltip. To handle the display of the
-  // tooltip yourself return true (1). Otherwise, you can optionally modify
-  // |text| and then return false (0) to allow the browser to display the
-  // tooltip. When window rendering is disabled the application is responsible
-  // for drawing tooltips and the return value is ignored.
+  /// Called when the browser is about to display a tooltip. |text| contains the
+  /// text that will be displayed in the tooltip. To handle the display of the
+  /// tooltip yourself return true (1). Otherwise, you can optionally modify
+  /// |text| and then return false (0) to allow the browser to display the
+  /// tooltip. When window rendering is disabled the application is responsible
+  /// for drawing tooltips and the return value is ignored.
   ///
   int(CEF_CALLBACK* on_tooltip)(struct _cef_display_handler_t* self,
                                 struct _cef_browser_t* browser,
                                 cef_string_t* text);
 
   ///
-  // Called when the browser receives a status message. |value| contains the
-  // text that will be displayed in the status message.
+  /// Called when the browser receives a status message. |value| contains the
+  /// text that will be displayed in the status message.
   ///
   void(CEF_CALLBACK* on_status_message)(struct _cef_display_handler_t* self,
                                         struct _cef_browser_t* browser,
                                         const cef_string_t* value);
 
   ///
-  // Called to display a console message. Return true (1) to stop the message
-  // from being output to the console.
+  /// Called to display a console message. Return true (1) to stop the message
+  /// from being output to the console.
   ///
   int(CEF_CALLBACK* on_console_message)(struct _cef_display_handler_t* self,
                                         struct _cef_browser_t* browser,
@@ -124,23 +129,46 @@
                                         int line);
 
   ///
-  // Called when auto-resize is enabled via
-  // cef_browser_host_t::SetAutoResizeEnabled and the contents have auto-
-  // resized. |new_size| will be the desired size in view coordinates. Return
-  // true (1) if the resize was handled or false (0) for default handling.
+  /// Called when auto-resize is enabled via
+  /// cef_browser_host_t::SetAutoResizeEnabled and the contents have auto-
+  /// resized. |new_size| will be the desired size in view coordinates. Return
+  /// true (1) if the resize was handled or false (0) for default handling.
   ///
   int(CEF_CALLBACK* on_auto_resize)(struct _cef_display_handler_t* self,
                                     struct _cef_browser_t* browser,
                                     const cef_size_t* new_size);
 
   ///
-  // Called when the overall page loading progress has changed. |progress|
-  // ranges from 0.0 to 1.0.
+  /// Called when the overall page loading progress has changed. |progress|
+  /// ranges from 0.0 to 1.0.
   ///
   void(CEF_CALLBACK* on_loading_progress_change)(
       struct _cef_display_handler_t* self,
       struct _cef_browser_t* browser,
       double progress);
+
+  ///
+  /// Called when the browser's cursor has changed. If |type| is CT_CUSTOM then
+  /// |custom_cursor_info| will be populated with the custom cursor information.
+  /// Return true (1) if the cursor change was handled or false (0) for default
+  /// handling.
+  ///
+  int(CEF_CALLBACK* on_cursor_change)(
+      struct _cef_display_handler_t* self,
+      struct _cef_browser_t* browser,
+      cef_cursor_handle_t cursor,
+      cef_cursor_type_t type,
+      const cef_cursor_info_t* custom_cursor_info);
+
+  ///
+  /// Called when the browser's access to an audio and/or video source has
+  /// changed.
+  ///
+  void(CEF_CALLBACK* on_media_access_change)(
+      struct _cef_display_handler_t* self,
+      struct _cef_browser_t* browser,
+      int has_video_access,
+      int has_audio_access);
 } cef_display_handler_t;
 
 #ifdef __cplusplus
diff --git a/src/include/capi/cef_dom_capi.h b/src/include/capi/cef_dom_capi.h
index 54122f4..3c15aef 100644
--- a/src/include/capi/cef_dom_capi.h
+++ b/src/include/capi/cef_dom_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=055c506e7950abba3ec1c12adbbb1a9989cf5ac5$
+// $hash=f18407bec715e682d5745aeb155a0113473723dd$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_DOM_CAPI_H_
@@ -50,120 +50,120 @@
 struct _cef_domnode_t;
 
 ///
-// Structure to implement for visiting the DOM. The functions of this structure
-// will be called on the render process main thread.
+/// Structure to implement for visiting the DOM. The functions of this structure
+/// will be called on the render process main thread.
 ///
 typedef struct _cef_domvisitor_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Method executed for visiting the DOM. The document object passed to this
-  // function represents a snapshot of the DOM at the time this function is
-  // executed. DOM objects are only valid for the scope of this function. Do not
-  // keep references to or attempt to access any DOM objects outside the scope
-  // of this function.
+  /// Method executed for visiting the DOM. The document object passed to this
+  /// function represents a snapshot of the DOM at the time this function is
+  /// executed. DOM objects are only valid for the scope of this function. Do
+  /// not keep references to or attempt to access any DOM objects outside the
+  /// scope of this function.
   ///
   void(CEF_CALLBACK* visit)(struct _cef_domvisitor_t* self,
                             struct _cef_domdocument_t* document);
 } cef_domvisitor_t;
 
 ///
-// Structure used to represent a DOM document. The functions of this structure
-// should only be called on the render process main thread thread.
+/// Structure used to represent a DOM document. The functions of this structure
+/// should only be called on the render process main thread thread.
 ///
 typedef struct _cef_domdocument_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns the document type.
+  /// Returns the document type.
   ///
   cef_dom_document_type_t(CEF_CALLBACK* get_type)(
       struct _cef_domdocument_t* self);
 
   ///
-  // Returns the root document node.
+  /// Returns the root document node.
   ///
   struct _cef_domnode_t*(CEF_CALLBACK* get_document)(
       struct _cef_domdocument_t* self);
 
   ///
-  // Returns the BODY node of an HTML document.
+  /// Returns the BODY node of an HTML document.
   ///
   struct _cef_domnode_t*(CEF_CALLBACK* get_body)(
       struct _cef_domdocument_t* self);
 
   ///
-  // Returns the HEAD node of an HTML document.
+  /// Returns the HEAD node of an HTML document.
   ///
   struct _cef_domnode_t*(CEF_CALLBACK* get_head)(
       struct _cef_domdocument_t* self);
 
   ///
-  // Returns the title of an HTML document.
+  /// Returns the title of an HTML document.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_title)(
       struct _cef_domdocument_t* self);
 
   ///
-  // Returns the document element with the specified ID value.
+  /// Returns the document element with the specified ID value.
   ///
   struct _cef_domnode_t*(CEF_CALLBACK* get_element_by_id)(
       struct _cef_domdocument_t* self,
       const cef_string_t* id);
 
   ///
-  // Returns the node that currently has keyboard focus.
+  /// Returns the node that currently has keyboard focus.
   ///
   struct _cef_domnode_t*(CEF_CALLBACK* get_focused_node)(
       struct _cef_domdocument_t* self);
 
   ///
-  // Returns true (1) if a portion of the document is selected.
+  /// Returns true (1) if a portion of the document is selected.
   ///
   int(CEF_CALLBACK* has_selection)(struct _cef_domdocument_t* self);
 
   ///
-  // Returns the selection offset within the start node.
+  /// Returns the selection offset within the start node.
   ///
   int(CEF_CALLBACK* get_selection_start_offset)(
       struct _cef_domdocument_t* self);
 
   ///
-  // Returns the selection offset within the end node.
+  /// Returns the selection offset within the end node.
   ///
   int(CEF_CALLBACK* get_selection_end_offset)(struct _cef_domdocument_t* self);
 
   ///
-  // Returns the contents of this selection as markup.
+  /// Returns the contents of this selection as markup.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_selection_as_markup)(
       struct _cef_domdocument_t* self);
 
   ///
-  // Returns the contents of this selection as text.
+  /// Returns the contents of this selection as text.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_selection_as_text)(
       struct _cef_domdocument_t* self);
 
   ///
-  // Returns the base URL for the document.
+  /// Returns the base URL for the document.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_base_url)(
       struct _cef_domdocument_t* self);
 
   ///
-  // Returns a complete URL based on the document base URL and the specified
-  // partial URL.
+  /// Returns a complete URL based on the document base URL and the specified
+  /// partial URL.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_complete_url)(
@@ -172,141 +172,138 @@
 } cef_domdocument_t;
 
 ///
-// Structure used to represent a DOM node. The functions of this structure
-// should only be called on the render process main thread.
+/// Structure used to represent a DOM node. The functions of this structure
+/// should only be called on the render process main thread.
 ///
 typedef struct _cef_domnode_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns the type for this node.
+  /// Returns the type for this node.
   ///
   cef_dom_node_type_t(CEF_CALLBACK* get_type)(struct _cef_domnode_t* self);
 
   ///
-  // Returns true (1) if this is a text node.
+  /// Returns true (1) if this is a text node.
   ///
   int(CEF_CALLBACK* is_text)(struct _cef_domnode_t* self);
 
   ///
-  // Returns true (1) if this is an element node.
+  /// Returns true (1) if this is an element node.
   ///
   int(CEF_CALLBACK* is_element)(struct _cef_domnode_t* self);
 
   ///
-  // Returns true (1) if this is an editable node.
+  /// Returns true (1) if this is an editable node.
   ///
   int(CEF_CALLBACK* is_editable)(struct _cef_domnode_t* self);
 
   ///
-  // Returns true (1) if this is a form control element node.
+  /// Returns true (1) if this is a form control element node.
   ///
   int(CEF_CALLBACK* is_form_control_element)(struct _cef_domnode_t* self);
 
   ///
-  // Returns the type of this form control element node.
+  /// Returns the type of this form control element node.
   ///
-  // The resulting string must be freed by calling cef_string_userfree_free().
-  cef_string_userfree_t(CEF_CALLBACK* get_form_control_element_type)(
+  cef_dom_form_control_type_t(CEF_CALLBACK* get_form_control_element_type)(
       struct _cef_domnode_t* self);
 
   ///
-  // Returns true (1) if this object is pointing to the same handle as |that|
-  // object.
+  /// Returns true (1) if this object is pointing to the same handle as |that|
+  /// object.
   ///
   int(CEF_CALLBACK* is_same)(struct _cef_domnode_t* self,
                              struct _cef_domnode_t* that);
 
   ///
-  // Returns the name of this node.
+  /// Returns the name of this node.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_name)(struct _cef_domnode_t* self);
 
   ///
-  // Returns the value of this node.
+  /// Returns the value of this node.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_value)(struct _cef_domnode_t* self);
 
   ///
-  // Set the value of this node. Returns true (1) on success.
+  /// Set the value of this node. Returns true (1) on success.
   ///
   int(CEF_CALLBACK* set_value)(struct _cef_domnode_t* self,
                                const cef_string_t* value);
 
   ///
-  // Returns the contents of this node as markup.
+  /// Returns the contents of this node as markup.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_as_markup)(
       struct _cef_domnode_t* self);
 
   ///
-  // Returns the document associated with this node.
+  /// Returns the document associated with this node.
   ///
   struct _cef_domdocument_t*(CEF_CALLBACK* get_document)(
       struct _cef_domnode_t* self);
 
   ///
-  // Returns the parent node.
+  /// Returns the parent node.
   ///
   struct _cef_domnode_t*(CEF_CALLBACK* get_parent)(struct _cef_domnode_t* self);
 
   ///
-  // Returns the previous sibling node.
+  /// Returns the previous sibling node.
   ///
   struct _cef_domnode_t*(CEF_CALLBACK* get_previous_sibling)(
       struct _cef_domnode_t* self);
 
   ///
-  // Returns the next sibling node.
+  /// Returns the next sibling node.
   ///
   struct _cef_domnode_t*(CEF_CALLBACK* get_next_sibling)(
       struct _cef_domnode_t* self);
 
   ///
-  // Returns true (1) if this node has child nodes.
+  /// Returns true (1) if this node has child nodes.
   ///
   int(CEF_CALLBACK* has_children)(struct _cef_domnode_t* self);
 
   ///
-  // Return the first child node.
+  /// Return the first child node.
   ///
   struct _cef_domnode_t*(CEF_CALLBACK* get_first_child)(
       struct _cef_domnode_t* self);
 
   ///
-  // Returns the last child node.
+  /// Returns the last child node.
   ///
   struct _cef_domnode_t*(CEF_CALLBACK* get_last_child)(
       struct _cef_domnode_t* self);
 
-  // The following functions are valid only for element nodes.
-
   ///
-  // Returns the tag name of this element.
+  /// Returns the tag name of this element.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_element_tag_name)(
       struct _cef_domnode_t* self);
 
   ///
-  // Returns true (1) if this element has attributes.
+  /// Returns true (1) if this element has attributes.
   ///
   int(CEF_CALLBACK* has_element_attributes)(struct _cef_domnode_t* self);
 
   ///
-  // Returns true (1) if this element has an attribute named |attrName|.
+  /// Returns true (1) if this element has an attribute named |attrName|.
   ///
   int(CEF_CALLBACK* has_element_attribute)(struct _cef_domnode_t* self,
                                            const cef_string_t* attrName);
 
   ///
-  // Returns the element attribute named |attrName|.
+  /// Returns the element attribute named |attrName|.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_element_attribute)(
@@ -314,28 +311,29 @@
       const cef_string_t* attrName);
 
   ///
-  // Returns a map of all element attributes.
+  /// Returns a map of all element attributes.
   ///
   void(CEF_CALLBACK* get_element_attributes)(struct _cef_domnode_t* self,
                                              cef_string_map_t attrMap);
 
   ///
-  // Set the value for the element attribute named |attrName|. Returns true (1)
-  // on success.
+  /// Set the value for the element attribute named |attrName|. Returns true (1)
+  /// on success.
   ///
   int(CEF_CALLBACK* set_element_attribute)(struct _cef_domnode_t* self,
                                            const cef_string_t* attrName,
                                            const cef_string_t* value);
 
   ///
-  // Returns the inner text of the element.
+  /// Returns the inner text of the element.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_element_inner_text)(
       struct _cef_domnode_t* self);
 
   ///
-  // Returns the bounds of the element.
+  /// Returns the bounds of the element in device pixels. Use
+  /// "window.devicePixelRatio" to convert to/from CSS pixels.
   ///
   cef_rect_t(CEF_CALLBACK* get_element_bounds)(struct _cef_domnode_t* self);
 } cef_domnode_t;
diff --git a/src/include/capi/cef_download_handler_capi.h b/src/include/capi/cef_download_handler_capi.h
index bc57341..5979513 100644
--- a/src/include/capi/cef_download_handler_capi.h
+++ b/src/include/capi/cef_download_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=3399f17cc69d8fbd5c09f63f81680aa1f68454f0$
+// $hash=f1f6a110a7ce15611a7062b3d7fe8b5c630f2980$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_DOWNLOAD_HANDLER_CAPI_H_
@@ -49,19 +49,19 @@
 #endif
 
 ///
-// Callback structure used to asynchronously continue a download.
+/// Callback structure used to asynchronously continue a download.
 ///
 typedef struct _cef_before_download_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Call to continue the download. Set |download_path| to the full file path
-  // for the download including the file name or leave blank to use the
-  // suggested name and the default temp directory. Set |show_dialog| to true
-  // (1) if you do wish to show the default "Save As" dialog.
+  /// Call to continue the download. Set |download_path| to the full file path
+  /// for the download including the file name or leave blank to use the
+  /// suggested name and the default temp directory. Set |show_dialog| to true
+  /// (1) if you do wish to show the default "Save As" dialog.
   ///
   void(CEF_CALLBACK* cont)(struct _cef_before_download_callback_t* self,
                            const cef_string_t* download_path,
@@ -69,46 +69,58 @@
 } cef_before_download_callback_t;
 
 ///
-// Callback structure used to asynchronously cancel a download.
+/// Callback structure used to asynchronously cancel a download.
 ///
 typedef struct _cef_download_item_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Call to cancel the download.
+  /// Call to cancel the download.
   ///
   void(CEF_CALLBACK* cancel)(struct _cef_download_item_callback_t* self);
 
   ///
-  // Call to pause the download.
+  /// Call to pause the download.
   ///
   void(CEF_CALLBACK* pause)(struct _cef_download_item_callback_t* self);
 
   ///
-  // Call to resume the download.
+  /// Call to resume the download.
   ///
   void(CEF_CALLBACK* resume)(struct _cef_download_item_callback_t* self);
 } cef_download_item_callback_t;
 
 ///
-// Structure used to handle file downloads. The functions of this structure will
-// called on the browser process UI thread.
+/// Structure used to handle file downloads. The functions of this structure
+/// will called on the browser process UI thread.
 ///
 typedef struct _cef_download_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called before a download begins. |suggested_name| is the suggested name for
-  // the download file. By default the download will be canceled. Execute
-  // |callback| either asynchronously or in this function to continue the
-  // download if desired. Do not keep a reference to |download_item| outside of
-  // this function.
+  /// Called before a download begins in response to a user-initiated action
+  /// (e.g. alt + link click or link click that returns a `Content-Disposition:
+  /// attachment` response from the server). |url| is the target download URL
+  /// and |request_function| is the target function (GET, POST, etc). Return
+  /// true (1) to proceed with the download or false (0) to cancel the download.
+  ///
+  int(CEF_CALLBACK* can_download)(struct _cef_download_handler_t* self,
+                                  struct _cef_browser_t* browser,
+                                  const cef_string_t* url,
+                                  const cef_string_t* request_method);
+
+  ///
+  /// Called before a download begins. |suggested_name| is the suggested name
+  /// for the download file. By default the download will be canceled. Execute
+  /// |callback| either asynchronously or in this function to continue the
+  /// download if desired. Do not keep a reference to |download_item| outside of
+  /// this function.
   ///
   void(CEF_CALLBACK* on_before_download)(
       struct _cef_download_handler_t* self,
@@ -118,11 +130,11 @@
       struct _cef_before_download_callback_t* callback);
 
   ///
-  // Called when a download's status or progress information has been updated.
-  // This may be called multiple times before and after on_before_download().
-  // Execute |callback| either asynchronously or in this function to cancel the
-  // download if desired. Do not keep a reference to |download_item| outside of
-  // this function.
+  /// Called when a download's status or progress information has been updated.
+  /// This may be called multiple times before and after on_before_download().
+  /// Execute |callback| either asynchronously or in this function to cancel the
+  /// download if desired. Do not keep a reference to |download_item| outside of
+  /// this function.
   ///
   void(CEF_CALLBACK* on_download_updated)(
       struct _cef_download_handler_t* self,
diff --git a/src/include/capi/cef_download_item_capi.h b/src/include/capi/cef_download_item_capi.h
index e422cc1..059d962 100644
--- a/src/include/capi/cef_download_item_capi.h
+++ b/src/include/capi/cef_download_item_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=d6366977af5e2a3a71b4f57042208ff7ed524c6c$
+// $hash=c4ecfde5d6791400c4b3fd466e7d3676d51cf8d8$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_DOWNLOAD_ITEM_CAPI_H_
@@ -47,108 +47,120 @@
 #endif
 
 ///
-// Structure used to represent a download item.
+/// Structure used to represent a download item.
 ///
 typedef struct _cef_download_item_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns true (1) if this object is valid. Do not call any other functions
-  // if this function returns false (0).
+  /// Returns true (1) if this object is valid. Do not call any other functions
+  /// if this function returns false (0).
   ///
   int(CEF_CALLBACK* is_valid)(struct _cef_download_item_t* self);
 
   ///
-  // Returns true (1) if the download is in progress.
+  /// Returns true (1) if the download is in progress.
   ///
   int(CEF_CALLBACK* is_in_progress)(struct _cef_download_item_t* self);
 
   ///
-  // Returns true (1) if the download is complete.
+  /// Returns true (1) if the download is complete.
   ///
   int(CEF_CALLBACK* is_complete)(struct _cef_download_item_t* self);
 
   ///
-  // Returns true (1) if the download has been canceled or interrupted.
+  /// Returns true (1) if the download has been canceled.
   ///
   int(CEF_CALLBACK* is_canceled)(struct _cef_download_item_t* self);
 
   ///
-  // Returns a simple speed estimate in bytes/s.
+  /// Returns true (1) if the download has been interrupted.
   ///
-  int64(CEF_CALLBACK* get_current_speed)(struct _cef_download_item_t* self);
+  int(CEF_CALLBACK* is_interrupted)(struct _cef_download_item_t* self);
 
   ///
-  // Returns the rough percent complete or -1 if the receive total size is
-  // unknown.
+  /// Returns the most recent interrupt reason.
+  ///
+  cef_download_interrupt_reason_t(CEF_CALLBACK* get_interrupt_reason)(
+      struct _cef_download_item_t* self);
+
+  ///
+  /// Returns a simple speed estimate in bytes/s.
+  ///
+  int64_t(CEF_CALLBACK* get_current_speed)(struct _cef_download_item_t* self);
+
+  ///
+  /// Returns the rough percent complete or -1 if the receive total size is
+  /// unknown.
   ///
   int(CEF_CALLBACK* get_percent_complete)(struct _cef_download_item_t* self);
 
   ///
-  // Returns the total number of bytes.
+  /// Returns the total number of bytes.
   ///
-  int64(CEF_CALLBACK* get_total_bytes)(struct _cef_download_item_t* self);
+  int64_t(CEF_CALLBACK* get_total_bytes)(struct _cef_download_item_t* self);
 
   ///
-  // Returns the number of received bytes.
+  /// Returns the number of received bytes.
   ///
-  int64(CEF_CALLBACK* get_received_bytes)(struct _cef_download_item_t* self);
+  int64_t(CEF_CALLBACK* get_received_bytes)(struct _cef_download_item_t* self);
 
   ///
-  // Returns the time that the download started.
+  /// Returns the time that the download started.
   ///
-  cef_time_t(CEF_CALLBACK* get_start_time)(struct _cef_download_item_t* self);
+  cef_basetime_t(CEF_CALLBACK* get_start_time)(
+      struct _cef_download_item_t* self);
 
   ///
-  // Returns the time that the download ended.
+  /// Returns the time that the download ended.
   ///
-  cef_time_t(CEF_CALLBACK* get_end_time)(struct _cef_download_item_t* self);
+  cef_basetime_t(CEF_CALLBACK* get_end_time)(struct _cef_download_item_t* self);
 
   ///
-  // Returns the full path to the downloaded or downloading file.
+  /// Returns the full path to the downloaded or downloading file.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_full_path)(
       struct _cef_download_item_t* self);
 
   ///
-  // Returns the unique identifier for this download.
+  /// Returns the unique identifier for this download.
   ///
-  uint32(CEF_CALLBACK* get_id)(struct _cef_download_item_t* self);
+  uint32_t(CEF_CALLBACK* get_id)(struct _cef_download_item_t* self);
 
   ///
-  // Returns the URL.
+  /// Returns the URL.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_url)(
       struct _cef_download_item_t* self);
 
   ///
-  // Returns the original URL before any redirections.
+  /// Returns the original URL before any redirections.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_original_url)(
       struct _cef_download_item_t* self);
 
   ///
-  // Returns the suggested file name.
+  /// Returns the suggested file name.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_suggested_file_name)(
       struct _cef_download_item_t* self);
 
   ///
-  // Returns the content disposition.
+  /// Returns the content disposition.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_content_disposition)(
       struct _cef_download_item_t* self);
 
   ///
-  // Returns the mime type.
+  /// Returns the mime type.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_mime_type)(
diff --git a/src/include/capi/cef_drag_data_capi.h b/src/include/capi/cef_drag_data_capi.h
index e181709..59ae13b 100644
--- a/src/include/capi/cef_drag_data_capi.h
+++ b/src/include/capi/cef_drag_data_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=6c8c654be3e69d872b3cfa6bdfb1adf615bff3ac$
+// $hash=8d00465ba004758f464cdb8b1fbd02cd26323ace$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_DRAG_DATA_CAPI_H_
@@ -49,177 +49,189 @@
 #endif
 
 ///
-// Structure used to represent drag data. The functions of this structure may be
-// called on any thread.
+/// Structure used to represent drag data. The functions of this structure may
+/// be called on any thread.
 ///
 typedef struct _cef_drag_data_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns a copy of the current object.
+  /// Returns a copy of the current object.
   ///
   struct _cef_drag_data_t*(CEF_CALLBACK* clone)(struct _cef_drag_data_t* self);
 
   ///
-  // Returns true (1) if this object is read-only.
+  /// Returns true (1) if this object is read-only.
   ///
   int(CEF_CALLBACK* is_read_only)(struct _cef_drag_data_t* self);
 
   ///
-  // Returns true (1) if the drag data is a link.
+  /// Returns true (1) if the drag data is a link.
   ///
   int(CEF_CALLBACK* is_link)(struct _cef_drag_data_t* self);
 
   ///
-  // Returns true (1) if the drag data is a text or html fragment.
+  /// Returns true (1) if the drag data is a text or html fragment.
   ///
   int(CEF_CALLBACK* is_fragment)(struct _cef_drag_data_t* self);
 
   ///
-  // Returns true (1) if the drag data is a file.
+  /// Returns true (1) if the drag data is a file.
   ///
   int(CEF_CALLBACK* is_file)(struct _cef_drag_data_t* self);
 
   ///
-  // Return the link URL that is being dragged.
+  /// Return the link URL that is being dragged.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_link_url)(
       struct _cef_drag_data_t* self);
 
   ///
-  // Return the title associated with the link being dragged.
+  /// Return the title associated with the link being dragged.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_link_title)(
       struct _cef_drag_data_t* self);
 
   ///
-  // Return the metadata, if any, associated with the link being dragged.
+  /// Return the metadata, if any, associated with the link being dragged.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_link_metadata)(
       struct _cef_drag_data_t* self);
 
   ///
-  // Return the plain text fragment that is being dragged.
+  /// Return the plain text fragment that is being dragged.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_fragment_text)(
       struct _cef_drag_data_t* self);
 
   ///
-  // Return the text/html fragment that is being dragged.
+  /// Return the text/html fragment that is being dragged.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_fragment_html)(
       struct _cef_drag_data_t* self);
 
   ///
-  // Return the base URL that the fragment came from. This value is used for
-  // resolving relative URLs and may be NULL.
+  /// Return the base URL that the fragment came from. This value is used for
+  /// resolving relative URLs and may be NULL.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_fragment_base_url)(
       struct _cef_drag_data_t* self);
 
   ///
-  // Return the name of the file being dragged out of the browser window.
+  /// Return the name of the file being dragged out of the browser window.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_file_name)(
       struct _cef_drag_data_t* self);
 
   ///
-  // Write the contents of the file being dragged out of the web view into
-  // |writer|. Returns the number of bytes sent to |writer|. If |writer| is NULL
-  // this function will return the size of the file contents in bytes. Call
-  // get_file_name() to get a suggested name for the file.
+  /// Write the contents of the file being dragged out of the web view into
+  /// |writer|. Returns the number of bytes sent to |writer|. If |writer| is
+  /// NULL this function will return the size of the file contents in bytes.
+  /// Call get_file_name() to get a suggested name for the file.
   ///
   size_t(CEF_CALLBACK* get_file_contents)(struct _cef_drag_data_t* self,
                                           struct _cef_stream_writer_t* writer);
 
   ///
-  // Retrieve the list of file names that are being dragged into the browser
-  // window.
+  /// Retrieve the list of file names that are being dragged into the browser
+  /// window.
   ///
   int(CEF_CALLBACK* get_file_names)(struct _cef_drag_data_t* self,
                                     cef_string_list_t names);
 
   ///
-  // Set the link URL that is being dragged.
+  /// Retrieve the list of file paths that are being dragged into the browser
+  /// window.
+  ///
+  int(CEF_CALLBACK* get_file_paths)(struct _cef_drag_data_t* self,
+                                    cef_string_list_t paths);
+
+  ///
+  /// Set the link URL that is being dragged.
   ///
   void(CEF_CALLBACK* set_link_url)(struct _cef_drag_data_t* self,
                                    const cef_string_t* url);
 
   ///
-  // Set the title associated with the link being dragged.
+  /// Set the title associated with the link being dragged.
   ///
   void(CEF_CALLBACK* set_link_title)(struct _cef_drag_data_t* self,
                                      const cef_string_t* title);
 
   ///
-  // Set the metadata associated with the link being dragged.
+  /// Set the metadata associated with the link being dragged.
   ///
   void(CEF_CALLBACK* set_link_metadata)(struct _cef_drag_data_t* self,
                                         const cef_string_t* data);
 
   ///
-  // Set the plain text fragment that is being dragged.
+  /// Set the plain text fragment that is being dragged.
   ///
   void(CEF_CALLBACK* set_fragment_text)(struct _cef_drag_data_t* self,
                                         const cef_string_t* text);
 
   ///
-  // Set the text/html fragment that is being dragged.
+  /// Set the text/html fragment that is being dragged.
   ///
   void(CEF_CALLBACK* set_fragment_html)(struct _cef_drag_data_t* self,
                                         const cef_string_t* html);
 
   ///
-  // Set the base URL that the fragment came from.
+  /// Set the base URL that the fragment came from.
   ///
   void(CEF_CALLBACK* set_fragment_base_url)(struct _cef_drag_data_t* self,
                                             const cef_string_t* base_url);
 
   ///
-  // Reset the file contents. You should do this before calling
-  // cef_browser_host_t::DragTargetDragEnter as the web view does not allow us
-  // to drag in this kind of data.
+  /// Reset the file contents. You should do this before calling
+  /// cef_browser_host_t::DragTargetDragEnter as the web view does not allow us
+  /// to drag in this kind of data.
   ///
   void(CEF_CALLBACK* reset_file_contents)(struct _cef_drag_data_t* self);
 
   ///
-  // Add a file that is being dragged into the webview.
+  /// Add a file that is being dragged into the webview.
   ///
   void(CEF_CALLBACK* add_file)(struct _cef_drag_data_t* self,
                                const cef_string_t* path,
                                const cef_string_t* display_name);
 
   ///
-  // Get the image representation of drag data. May return NULL if no image
-  // representation is available.
+  /// Clear list of filenames.
+  ///
+  void(CEF_CALLBACK* clear_filenames)(struct _cef_drag_data_t* self);
+
+  ///
+  /// Get the image representation of drag data. May return NULL if no image
+  /// representation is available.
   ///
   struct _cef_image_t*(CEF_CALLBACK* get_image)(struct _cef_drag_data_t* self);
 
   ///
-  // Get the image hotspot (drag start location relative to image dimensions).
+  /// Get the image hotspot (drag start location relative to image dimensions).
   ///
   cef_point_t(CEF_CALLBACK* get_image_hotspot)(struct _cef_drag_data_t* self);
 
   ///
-  // Returns true (1) if an image representation of drag data is available.
+  /// Returns true (1) if an image representation of drag data is available.
   ///
   int(CEF_CALLBACK* has_image)(struct _cef_drag_data_t* self);
 } cef_drag_data_t;
 
 ///
-// Create a new cef_drag_data_t object.
+/// Create a new cef_drag_data_t object.
 ///
-CEF_EXPORT cef_drag_data_t* cef_drag_data_create();
+CEF_EXPORT cef_drag_data_t* cef_drag_data_create(void);
 
 #ifdef __cplusplus
 }
diff --git a/src/include/capi/cef_drag_handler_capi.h b/src/include/capi/cef_drag_handler_capi.h
index 7a6430e..a5023e0 100644
--- a/src/include/capi/cef_drag_handler_capi.h
+++ b/src/include/capi/cef_drag_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=78022908355fbf836799545e67ce2e4663b85fdf$
+// $hash=ad16b0f4320d7b363efb152a65e3ce142882b9d9$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_DRAG_HANDLER_CAPI_H_
@@ -50,20 +50,20 @@
 #endif
 
 ///
-// Implement this structure to handle events related to dragging. The functions
-// of this structure will be called on the UI thread.
+/// Implement this structure to handle events related to dragging. The functions
+/// of this structure will be called on the UI thread.
 ///
 typedef struct _cef_drag_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called when an external drag event enters the browser window. |dragData|
-  // contains the drag event data and |mask| represents the type of drag
-  // operation. Return false (0) for default drag handling behavior or true (1)
-  // to cancel the drag event.
+  /// Called when an external drag event enters the browser window. |dragData|
+  /// contains the drag event data and |mask| represents the type of drag
+  /// operation. Return false (0) for default drag handling behavior or true (1)
+  /// to cancel the drag event.
   ///
   int(CEF_CALLBACK* on_drag_enter)(struct _cef_drag_handler_t* self,
                                    struct _cef_browser_t* browser,
@@ -71,11 +71,11 @@
                                    cef_drag_operations_mask_t mask);
 
   ///
-  // Called whenever draggable regions for the browser window change. These can
-  // be specified using the '-webkit-app-region: drag/no-drag' CSS-property. If
-  // draggable regions are never defined in a document this function will also
-  // never be called. If the last draggable region is removed from a document
-  // this function will be called with an NULL vector.
+  /// Called whenever draggable regions for the browser window change. These can
+  /// be specified using the '-webkit-app-region: drag/no-drag' CSS-property. If
+  /// draggable regions are never defined in a document this function will also
+  /// never be called. If the last draggable region is removed from a document
+  /// this function will be called with an NULL vector.
   ///
   void(CEF_CALLBACK* on_draggable_regions_changed)(
       struct _cef_drag_handler_t* self,
diff --git a/src/include/capi/cef_extension_capi.h b/src/include/capi/cef_extension_capi.h
index ccef427..a945b9b 100644
--- a/src/include/capi/cef_extension_capi.h
+++ b/src/include/capi/cef_extension_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=b50087959cb679e4132f0fccfd23f01f76079018$
+// $hash=c81a74622b987483e5fcd2c508aec5c13e12389b$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_EXTENSION_CAPI_H_
@@ -51,74 +51,74 @@
 struct _cef_request_context_t;
 
 ///
-// Object representing an extension. Methods may be called on any thread unless
-// otherwise indicated.
+/// Object representing an extension. Methods may be called on any thread unless
+/// otherwise indicated.
 ///
 typedef struct _cef_extension_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns the unique extension identifier. This is calculated based on the
-  // extension public key, if available, or on the extension path. See
-  // https://developer.chrome.com/extensions/manifest/key for details.
+  /// Returns the unique extension identifier. This is calculated based on the
+  /// extension public key, if available, or on the extension path. See
+  /// https://developer.chrome.com/extensions/manifest/key for details.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_identifier)(
       struct _cef_extension_t* self);
 
   ///
-  // Returns the absolute path to the extension directory on disk. This value
-  // will be prefixed with PK_DIR_RESOURCES if a relative path was passed to
-  // cef_request_context_t::LoadExtension.
+  /// Returns the absolute path to the extension directory on disk. This value
+  /// will be prefixed with PK_DIR_RESOURCES if a relative path was passed to
+  /// cef_request_context_t::LoadExtension.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_path)(struct _cef_extension_t* self);
 
   ///
-  // Returns the extension manifest contents as a cef_dictionary_value_t object.
-  // See https://developer.chrome.com/extensions/manifest for details.
+  /// Returns the extension manifest contents as a cef_dictionary_value_t
+  /// object. See https://developer.chrome.com/extensions/manifest for details.
   ///
   struct _cef_dictionary_value_t*(CEF_CALLBACK* get_manifest)(
       struct _cef_extension_t* self);
 
   ///
-  // Returns true (1) if this object is the same extension as |that| object.
-  // Extensions are considered the same if identifier, path and loader context
-  // match.
+  /// Returns true (1) if this object is the same extension as |that| object.
+  /// Extensions are considered the same if identifier, path and loader context
+  /// match.
   ///
   int(CEF_CALLBACK* is_same)(struct _cef_extension_t* self,
                              struct _cef_extension_t* that);
 
   ///
-  // Returns the handler for this extension. Will return NULL for internal
-  // extensions or if no handler was passed to
-  // cef_request_context_t::LoadExtension.
+  /// Returns the handler for this extension. Will return NULL for internal
+  /// extensions or if no handler was passed to
+  /// cef_request_context_t::LoadExtension.
   ///
   struct _cef_extension_handler_t*(CEF_CALLBACK* get_handler)(
       struct _cef_extension_t* self);
 
   ///
-  // Returns the request context that loaded this extension. Will return NULL
-  // for internal extensions or if the extension has been unloaded. See the
-  // cef_request_context_t::LoadExtension documentation for more information
-  // about loader contexts. Must be called on the browser process UI thread.
+  /// Returns the request context that loaded this extension. Will return NULL
+  /// for internal extensions or if the extension has been unloaded. See the
+  /// cef_request_context_t::LoadExtension documentation for more information
+  /// about loader contexts. Must be called on the browser process UI thread.
   ///
   struct _cef_request_context_t*(CEF_CALLBACK* get_loader_context)(
       struct _cef_extension_t* self);
 
   ///
-  // Returns true (1) if this extension is currently loaded. Must be called on
-  // the browser process UI thread.
+  /// Returns true (1) if this extension is currently loaded. Must be called on
+  /// the browser process UI thread.
   ///
   int(CEF_CALLBACK* is_loaded)(struct _cef_extension_t* self);
 
   ///
-  // Unload this extension if it is not an internal extension and is currently
-  // loaded. Will result in a call to
-  // cef_extension_handler_t::OnExtensionUnloaded on success.
+  /// Unload this extension if it is not an internal extension and is currently
+  /// loaded. Will result in a call to
+  /// cef_extension_handler_t::OnExtensionUnloaded on success.
   ///
   void(CEF_CALLBACK* unload)(struct _cef_extension_t* self);
 } cef_extension_t;
diff --git a/src/include/capi/cef_extension_handler_capi.h b/src/include/capi/cef_extension_handler_capi.h
index 4b3dfde..ab29f34 100644
--- a/src/include/capi/cef_extension_handler_capi.h
+++ b/src/include/capi/cef_extension_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=a13b5b607d5a2108fac5fe75f5ebd2ede7eaef6a$
+// $hash=ad6d3845b150f22b88a71dafa601ef01c9579824$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_EXTENSION_HANDLER_CAPI_H_
@@ -52,75 +52,76 @@
 struct _cef_client_t;
 
 ///
-// Callback structure used for asynchronous continuation of
-// cef_extension_handler_t::GetExtensionResource.
+/// Callback structure used for asynchronous continuation of
+/// cef_extension_handler_t::GetExtensionResource.
 ///
 typedef struct _cef_get_extension_resource_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Continue the request. Read the resource contents from |stream|.
+  /// Continue the request. Read the resource contents from |stream|.
   ///
   void(CEF_CALLBACK* cont)(struct _cef_get_extension_resource_callback_t* self,
                            struct _cef_stream_reader_t* stream);
 
   ///
-  // Cancel the request.
+  /// Cancel the request.
   ///
   void(CEF_CALLBACK* cancel)(
       struct _cef_get_extension_resource_callback_t* self);
 } cef_get_extension_resource_callback_t;
 
 ///
-// Implement this structure to handle events related to browser extensions. The
-// functions of this structure will be called on the UI thread. See
-// cef_request_context_t::LoadExtension for information about extension loading.
+/// Implement this structure to handle events related to browser extensions. The
+/// functions of this structure will be called on the UI thread. See
+/// cef_request_context_t::LoadExtension for information about extension
+/// loading.
 ///
 typedef struct _cef_extension_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called if the cef_request_context_t::LoadExtension request fails. |result|
-  // will be the error code.
+  /// Called if the cef_request_context_t::LoadExtension request fails. |result|
+  /// will be the error code.
   ///
   void(CEF_CALLBACK* on_extension_load_failed)(
       struct _cef_extension_handler_t* self,
       cef_errorcode_t result);
 
   ///
-  // Called if the cef_request_context_t::LoadExtension request succeeds.
-  // |extension| is the loaded extension.
+  /// Called if the cef_request_context_t::LoadExtension request succeeds.
+  /// |extension| is the loaded extension.
   ///
   void(CEF_CALLBACK* on_extension_loaded)(struct _cef_extension_handler_t* self,
                                           struct _cef_extension_t* extension);
 
   ///
-  // Called after the cef_extension_t::Unload request has completed.
+  /// Called after the cef_extension_t::Unload request has completed.
   ///
   void(CEF_CALLBACK* on_extension_unloaded)(
       struct _cef_extension_handler_t* self,
       struct _cef_extension_t* extension);
 
   ///
-  // Called when an extension needs a browser to host a background script
-  // specified via the "background" manifest key. The browser will have no
-  // visible window and cannot be displayed. |extension| is the extension that
-  // is loading the background script. |url| is an internally generated
-  // reference to an HTML page that will be used to load the background script
-  // via a <script> src attribute. To allow creation of the browser optionally
-  // modify |client| and |settings| and return false (0). To cancel creation of
-  // the browser (and consequently cancel load of the background script) return
-  // true (1). Successful creation will be indicated by a call to
-  // cef_life_span_handler_t::OnAfterCreated, and
-  // cef_browser_host_t::IsBackgroundHost will return true (1) for the resulting
-  // browser. See https://developer.chrome.com/extensions/event_pages for more
-  // information about extension background script usage.
+  /// Called when an extension needs a browser to host a background script
+  /// specified via the "background" manifest key. The browser will have no
+  /// visible window and cannot be displayed. |extension| is the extension that
+  /// is loading the background script. |url| is an internally generated
+  /// reference to an HTML page that will be used to load the background script
+  /// via a "<script>" src attribute. To allow creation of the browser
+  /// optionally modify |client| and |settings| and return false (0). To cancel
+  /// creation of the browser (and consequently cancel load of the background
+  /// script) return true (1). Successful creation will be indicated by a call
+  /// to cef_life_span_handler_t::OnAfterCreated, and
+  /// cef_browser_host_t::IsBackgroundHost will return true (1) for the
+  /// resulting browser. See https://developer.chrome.com/extensions/event_pages
+  /// for more information about extension background script usage.
   ///
   int(CEF_CALLBACK* on_before_background_browser)(
       struct _cef_extension_handler_t* self,
@@ -130,19 +131,19 @@
       struct _cef_browser_settings_t* settings);
 
   ///
-  // Called when an extension API (e.g. chrome.tabs.create) requests creation of
-  // a new browser. |extension| and |browser| are the source of the API call.
-  // |active_browser| may optionally be specified via the windowId property or
-  // returned via the get_active_browser() callback and provides the default
-  // |client| and |settings| values for the new browser. |index| is the position
-  // value optionally specified via the index property. |url| is the URL that
-  // will be loaded in the browser. |active| is true (1) if the new browser
-  // should be active when opened.  To allow creation of the browser optionally
-  // modify |windowInfo|, |client| and |settings| and return false (0). To
-  // cancel creation of the browser return true (1). Successful creation will be
-  // indicated by a call to cef_life_span_handler_t::OnAfterCreated. Any
-  // modifications to |windowInfo| will be ignored if |active_browser| is
-  // wrapped in a cef_browser_view_t.
+  /// Called when an extension API (e.g. chrome.tabs.create) requests creation
+  /// of a new browser. |extension| and |browser| are the source of the API
+  /// call. |active_browser| may optionally be specified via the windowId
+  /// property or returned via the get_active_browser() callback and provides
+  /// the default |client| and |settings| values for the new browser. |index| is
+  /// the position value optionally specified via the index property. |url| is
+  /// the URL that will be loaded in the browser. |active| is true (1) if the
+  /// new browser should be active when opened.  To allow creation of the
+  /// browser optionally modify |windowInfo|, |client| and |settings| and return
+  /// false (0). To cancel creation of the browser return true (1). Successful
+  /// creation will be indicated by a call to
+  /// cef_life_span_handler_t::OnAfterCreated. Any modifications to |windowInfo|
+  /// will be ignored if |active_browser| is wrapped in a cef_browser_view_t.
   ///
   int(CEF_CALLBACK* on_before_browser)(
       struct _cef_extension_handler_t* self,
@@ -157,13 +158,13 @@
       struct _cef_browser_settings_t* settings);
 
   ///
-  // Called when no tabId is specified to an extension API call that accepts a
-  // tabId parameter (e.g. chrome.tabs.*). |extension| and |browser| are the
-  // source of the API call. Return the browser that will be acted on by the API
-  // call or return NULL to act on |browser|. The returned browser must share
-  // the same cef_request_context_t as |browser|. Incognito browsers should not
-  // be considered unless the source extension has incognito access enabled, in
-  // which case |include_incognito| will be true (1).
+  /// Called when no tabId is specified to an extension API call that accepts a
+  /// tabId parameter (e.g. chrome.tabs.*). |extension| and |browser| are the
+  /// source of the API call. Return the browser that will be acted on by the
+  /// API call or return NULL to act on |browser|. The returned browser must
+  /// share the same cef_request_context_t as |browser|. Incognito browsers
+  /// should not be considered unless the source extension has incognito access
+  /// enabled, in which case |include_incognito| will be true (1).
   ///
   struct _cef_browser_t*(CEF_CALLBACK* get_active_browser)(
       struct _cef_extension_handler_t* self,
@@ -172,12 +173,12 @@
       int include_incognito);
 
   ///
-  // Called when the tabId associated with |target_browser| is specified to an
-  // extension API call that accepts a tabId parameter (e.g. chrome.tabs.*).
-  // |extension| and |browser| are the source of the API call. Return true (1)
-  // to allow access of false (0) to deny access. Access to incognito browsers
-  // should not be allowed unless the source extension has incognito access
-  // enabled, in which case |include_incognito| will be true (1).
+  /// Called when the tabId associated with |target_browser| is specified to an
+  /// extension API call that accepts a tabId parameter (e.g. chrome.tabs.*).
+  /// |extension| and |browser| are the source of the API call. Return true (1)
+  /// to allow access of false (0) to deny access. Access to incognito browsers
+  /// should not be allowed unless the source extension has incognito access
+  /// enabled, in which case |include_incognito| will be true (1).
   ///
   int(CEF_CALLBACK* can_access_browser)(struct _cef_extension_handler_t* self,
                                         struct _cef_extension_t* extension,
@@ -186,14 +187,15 @@
                                         struct _cef_browser_t* target_browser);
 
   ///
-  // Called to retrieve an extension resource that would normally be loaded from
-  // disk (e.g. if a file parameter is specified to chrome.tabs.executeScript).
-  // |extension| and |browser| are the source of the resource request. |file| is
-  // the requested relative file path. To handle the resource request return
-  // true (1) and execute |callback| either synchronously or asynchronously. For
-  // the default behavior which reads the resource from the extension directory
-  // on disk return false (0). Localization substitutions will not be applied to
-  // resources handled via this function.
+  /// Called to retrieve an extension resource that would normally be loaded
+  /// from disk (e.g. if a file parameter is specified to
+  /// chrome.tabs.executeScript). |extension| and |browser| are the source of
+  /// the resource request. |file| is the requested relative file path. To
+  /// handle the resource request return true (1) and execute |callback| either
+  /// synchronously or asynchronously. For the default behavior which reads the
+  /// resource from the extension directory on disk return false (0).
+  /// Localization substitutions will not be applied to resources handled via
+  /// this function.
   ///
   int(CEF_CALLBACK* get_extension_resource)(
       struct _cef_extension_handler_t* self,
diff --git a/src/include/capi/cef_file_util_capi.h b/src/include/capi/cef_file_util_capi.h
index ce603b3..daad7a5 100644
--- a/src/include/capi/cef_file_util_capi.h
+++ b/src/include/capi/cef_file_util_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=c930140791b9e7d4238110e24fe17b9566a34ec9$
+// $hash=4e0e0abcb72327998df950e618b147b196e76b60$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_FILE_UTIL_CAPI_H_
@@ -47,40 +47,40 @@
 #endif
 
 ///
-// Creates a directory and all parent directories if they don't already exist.
-// Returns true (1) on successful creation or if the directory already exists.
-// The directory is only readable by the current user. Calling this function on
-// the browser process UI or IO threads is not allowed.
+/// Creates a directory and all parent directories if they don't already exist.
+/// Returns true (1) on successful creation or if the directory already exists.
+/// The directory is only readable by the current user. Calling this function on
+/// the browser process UI or IO threads is not allowed.
 ///
 CEF_EXPORT int cef_create_directory(const cef_string_t* full_path);
 
 ///
-// Get the temporary directory provided by the system.
-//
-// WARNING: In general, you should use the temp directory variants below instead
-// of this function. Those variants will ensure that the proper permissions are
-// set so that other users on the system can't edit them while they're open
-// (which could lead to security issues).
+/// Get the temporary directory provided by the system.
+///
+/// WARNING: In general, you should use the temp directory variants below
+/// instead of this function. Those variants will ensure that the proper
+/// permissions are set so that other users on the system can't edit them while
+/// they're open (which could lead to security issues).
 ///
 CEF_EXPORT int cef_get_temp_directory(cef_string_t* temp_dir);
 
 ///
-// Creates a new directory. On Windows if |prefix| is provided the new directory
-// name is in the format of "prefixyyyy". Returns true (1) on success and sets
-// |new_temp_path| to the full path of the directory that was created. The
-// directory is only readable by the current user. Calling this function on the
-// browser process UI or IO threads is not allowed.
+/// Creates a new directory. On Windows if |prefix| is provided the new
+/// directory name is in the format of "prefixyyyy". Returns true (1) on success
+/// and sets |new_temp_path| to the full path of the directory that was created.
+/// The directory is only readable by the current user. Calling this function on
+/// the browser process UI or IO threads is not allowed.
 ///
 CEF_EXPORT int cef_create_new_temp_directory(const cef_string_t* prefix,
                                              cef_string_t* new_temp_path);
 
 ///
-// Creates a directory within another directory. Extra characters will be
-// appended to |prefix| to ensure that the new directory does not have the same
-// name as an existing directory. Returns true (1) on success and sets |new_dir|
-// to the full path of the directory that was created. The directory is only
-// readable by the current user. Calling this function on the browser process UI
-// or IO threads is not allowed.
+/// Creates a directory within another directory. Extra characters will be
+/// appended to |prefix| to ensure that the new directory does not have the same
+/// name as an existing directory. Returns true (1) on success and sets
+/// |new_dir| to the full path of the directory that was created. The directory
+/// is only readable by the current user. Calling this function on the browser
+/// process UI or IO threads is not allowed.
 ///
 CEF_EXPORT int cef_create_temp_directory_in_directory(
     const cef_string_t* base_dir,
@@ -88,39 +88,40 @@
     cef_string_t* new_dir);
 
 ///
-// Returns true (1) if the given path exists and is a directory. Calling this
-// function on the browser process UI or IO threads is not allowed.
+/// Returns true (1) if the given path exists and is a directory. Calling this
+/// function on the browser process UI or IO threads is not allowed.
 ///
 CEF_EXPORT int cef_directory_exists(const cef_string_t* path);
 
 ///
-// Deletes the given path whether it's a file or a directory. If |path| is a
-// directory all contents will be deleted.  If |recursive| is true (1) any sub-
-// directories and their contents will also be deleted (equivalent to executing
-// "rm -rf", so use with caution). On POSIX environments if |path| is a symbolic
-// link then only the symlink will be deleted. Returns true (1) on successful
-// deletion or if |path| does not exist. Calling this function on the browser
-// process UI or IO threads is not allowed.
+/// Deletes the given path whether it's a file or a directory. If |path| is a
+/// directory all contents will be deleted.  If |recursive| is true (1) any sub-
+/// directories and their contents will also be deleted (equivalent to executing
+/// "rm -rf", so use with caution). On POSIX environments if |path| is a
+/// symbolic link then only the symlink will be deleted. Returns true (1) on
+/// successful deletion or if |path| does not exist. Calling this function on
+/// the browser process UI or IO threads is not allowed.
 ///
 CEF_EXPORT int cef_delete_file(const cef_string_t* path, int recursive);
 
 ///
-// Writes the contents of |src_dir| into a zip archive at |dest_file|. If
-// |include_hidden_files| is true (1) files starting with "." will be included.
-// Returns true (1) on success.  Calling this function on the browser process UI
-// or IO threads is not allowed.
+/// Writes the contents of |src_dir| into a zip archive at |dest_file|. If
+/// |include_hidden_files| is true (1) files starting with "." will be included.
+/// Returns true (1) on success.  Calling this function on the browser process
+/// UI or IO threads is not allowed.
 ///
 CEF_EXPORT int cef_zip_directory(const cef_string_t* src_dir,
                                  const cef_string_t* dest_file,
                                  int include_hidden_files);
 
 ///
-// Loads the existing "Certificate Revocation Lists" file that is managed by
-// Google Chrome. This file can generally be found in Chrome's User Data
-// directory (e.g. "C:\Users\[User]\AppData\Local\Google\Chrome\User Data\" on
-// Windows) and is updated periodically by Chrome's component updater service.
-// Must be called in the browser process after the context has been initialized.
-// See https://dev.chromium.org/Home/chromium-security/crlsets for background.
+/// Loads the existing "Certificate Revocation Lists" file that is managed by
+/// Google Chrome. This file can generally be found in Chrome's User Data
+/// directory (e.g. "C:\Users\[User]\AppData\Local\Google\Chrome\User Data\" on
+/// Windows) and is updated periodically by Chrome's component updater service.
+/// Must be called in the browser process after the context has been
+/// initialized. See https://dev.chromium.org/Home/chromium-security/crlsets for
+/// background.
 ///
 CEF_EXPORT void cef_load_crlsets_file(const cef_string_t* path);
 
diff --git a/src/include/capi/cef_find_handler_capi.h b/src/include/capi/cef_find_handler_capi.h
index c7be471..94450d2 100644
--- a/src/include/capi/cef_find_handler_capi.h
+++ b/src/include/capi/cef_find_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=2aa57426a91e10985a5e92830bc3bcd9287708d4$
+// $hash=8149c82dd6671d676ee62cb6749bf30b32a5832c$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_FIND_HANDLER_CAPI_H_
@@ -48,22 +48,23 @@
 #endif
 
 ///
-// Implement this structure to handle events related to find results. The
-// functions of this structure will be called on the UI thread.
+/// Implement this structure to handle events related to find results. The
+/// functions of this structure will be called on the UI thread.
 ///
 typedef struct _cef_find_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called to report find results returned by cef_browser_host_t::find().
-  // |identifer| is the identifier passed to find(), |count| is the number of
-  // matches currently identified, |selectionRect| is the location of where the
-  // match was found (in window coordinates), |activeMatchOrdinal| is the
-  // current position in the search results, and |finalUpdate| is true (1) if
-  // this is the last find notification.
+  /// Called to report find results returned by cef_browser_host_t::find().
+  /// |identifer| is a unique incremental identifier for the currently active
+  /// search, |count| is the number of matches currently identified,
+  /// |selectionRect| is the location of where the match was found (in window
+  /// coordinates), |activeMatchOrdinal| is the current position in the search
+  /// results, and |finalUpdate| is true (1) if this is the last find
+  /// notification.
   ///
   void(CEF_CALLBACK* on_find_result)(struct _cef_find_handler_t* self,
                                      struct _cef_browser_t* browser,
diff --git a/src/include/capi/cef_focus_handler_capi.h b/src/include/capi/cef_focus_handler_capi.h
index a5c2ecc..f7b699d 100644
--- a/src/include/capi/cef_focus_handler_capi.h
+++ b/src/include/capi/cef_focus_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=091dd994f37070e9d7c27d0e2f7411ea9cf068f5$
+// $hash=53ec33c8937c735f646f9e0a14a416218e32887c$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_FOCUS_HANDLER_CAPI_H_
@@ -50,36 +50,37 @@
 #endif
 
 ///
-// Implement this structure to handle events related to focus. The functions of
-// this structure will be called on the UI thread.
+/// Implement this structure to handle events related to focus. The functions of
+/// this structure will be called on the UI thread.
 ///
 typedef struct _cef_focus_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called when the browser component is about to loose focus. For instance, if
-  // focus was on the last HTML element and the user pressed the TAB key. |next|
-  // will be true (1) if the browser is giving focus to the next component and
-  // false (0) if the browser is giving focus to the previous component.
+  /// Called when the browser component is about to loose focus. For instance,
+  /// if focus was on the last HTML element and the user pressed the TAB key.
+  /// |next| will be true (1) if the browser is giving focus to the next
+  /// component and false (0) if the browser is giving focus to the previous
+  /// component.
   ///
   void(CEF_CALLBACK* on_take_focus)(struct _cef_focus_handler_t* self,
                                     struct _cef_browser_t* browser,
                                     int next);
 
   ///
-  // Called when the browser component is requesting focus. |source| indicates
-  // where the focus request is originating from. Return false (0) to allow the
-  // focus to be set or true (1) to cancel setting the focus.
+  /// Called when the browser component is requesting focus. |source| indicates
+  /// where the focus request is originating from. Return false (0) to allow the
+  /// focus to be set or true (1) to cancel setting the focus.
   ///
   int(CEF_CALLBACK* on_set_focus)(struct _cef_focus_handler_t* self,
                                   struct _cef_browser_t* browser,
                                   cef_focus_source_t source);
 
   ///
-  // Called when the browser component has received focus.
+  /// Called when the browser component has received focus.
   ///
   void(CEF_CALLBACK* on_got_focus)(struct _cef_focus_handler_t* self,
                                    struct _cef_browser_t* browser);
diff --git a/src/include/capi/cef_frame_capi.h b/src/include/capi/cef_frame_capi.h
index 3be029d..ae169cf 100644
--- a/src/include/capi/cef_frame_capi.h
+++ b/src/include/capi/cef_frame_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=d8f114b44d02d96b5da0ec399c99091b9ceb6871$
+// $hash=1ad87e4addc2f05497671bc59dc7fd315e0603f3$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_FRAME_CAPI_H_
@@ -57,100 +57,100 @@
 struct _cef_v8context_t;
 
 ///
-// Structure used to represent a frame in the browser window. When used in the
-// browser process the functions of this structure may be called on any thread
-// unless otherwise indicated in the comments. When used in the render process
-// the functions of this structure may only be called on the main thread.
+/// Structure used to represent a frame in the browser window. When used in the
+/// browser process the functions of this structure may be called on any thread
+/// unless otherwise indicated in the comments. When used in the render process
+/// the functions of this structure may only be called on the main thread.
 ///
 typedef struct _cef_frame_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // True if this object is currently attached to a valid frame.
+  /// True if this object is currently attached to a valid frame.
   ///
   int(CEF_CALLBACK* is_valid)(struct _cef_frame_t* self);
 
   ///
-  // Execute undo in this frame.
+  /// Execute undo in this frame.
   ///
   void(CEF_CALLBACK* undo)(struct _cef_frame_t* self);
 
   ///
-  // Execute redo in this frame.
+  /// Execute redo in this frame.
   ///
   void(CEF_CALLBACK* redo)(struct _cef_frame_t* self);
 
   ///
-  // Execute cut in this frame.
+  /// Execute cut in this frame.
   ///
   void(CEF_CALLBACK* cut)(struct _cef_frame_t* self);
 
   ///
-  // Execute copy in this frame.
+  /// Execute copy in this frame.
   ///
   void(CEF_CALLBACK* copy)(struct _cef_frame_t* self);
 
   ///
-  // Execute paste in this frame.
+  /// Execute paste in this frame.
   ///
   void(CEF_CALLBACK* paste)(struct _cef_frame_t* self);
 
   ///
-  // Execute delete in this frame.
+  /// Execute delete in this frame.
   ///
   void(CEF_CALLBACK* del)(struct _cef_frame_t* self);
 
   ///
-  // Execute select all in this frame.
+  /// Execute select all in this frame.
   ///
   void(CEF_CALLBACK* select_all)(struct _cef_frame_t* self);
 
   ///
-  // Save this frame's HTML source to a temporary file and open it in the
-  // default text viewing application. This function can only be called from the
-  // browser process.
+  /// Save this frame's HTML source to a temporary file and open it in the
+  /// default text viewing application. This function can only be called from
+  /// the browser process.
   ///
   void(CEF_CALLBACK* view_source)(struct _cef_frame_t* self);
 
   ///
-  // Retrieve this frame's HTML source as a string sent to the specified
-  // visitor.
+  /// Retrieve this frame's HTML source as a string sent to the specified
+  /// visitor.
   ///
   void(CEF_CALLBACK* get_source)(struct _cef_frame_t* self,
                                  struct _cef_string_visitor_t* visitor);
 
   ///
-  // Retrieve this frame's display text as a string sent to the specified
-  // visitor.
+  /// Retrieve this frame's display text as a string sent to the specified
+  /// visitor.
   ///
   void(CEF_CALLBACK* get_text)(struct _cef_frame_t* self,
                                struct _cef_string_visitor_t* visitor);
 
   ///
-  // Load the request represented by the |request| object.
-  //
-  // WARNING: This function will fail with "bad IPC message" reason
-  // INVALID_INITIATOR_ORIGIN (213) unless you first navigate to the request
-  // origin using some other mechanism (LoadURL, link click, etc).
+  /// Load the request represented by the |request| object.
+  ///
+  /// WARNING: This function will fail with "bad IPC message" reason
+  /// INVALID_INITIATOR_ORIGIN (213) unless you first navigate to the request
+  /// origin using some other mechanism (LoadURL, link click, etc).
   ///
   void(CEF_CALLBACK* load_request)(struct _cef_frame_t* self,
                                    struct _cef_request_t* request);
 
   ///
-  // Load the specified |url|.
+  /// Load the specified |url|.
   ///
   void(CEF_CALLBACK* load_url)(struct _cef_frame_t* self,
                                const cef_string_t* url);
 
   ///
-  // Execute a string of JavaScript code in this frame. The |script_url|
-  // parameter is the URL where the script in question can be found, if any. The
-  // renderer may request this URL to show the developer the source of the
-  // error.  The |start_line| parameter is the base line number to use for error
-  // reporting.
+  /// Execute a string of JavaScript code in this frame. The |script_url|
+  /// parameter is the URL where the script in question can be found, if any.
+  /// The renderer may request this URL to show the developer the source of the
+  /// error.  The |start_line| parameter is the base line number to use for
+  /// error reporting.
   ///
   void(CEF_CALLBACK* execute_java_script)(struct _cef_frame_t* self,
                                           const cef_string_t* code,
@@ -158,83 +158,76 @@
                                           int start_line);
 
   ///
-  // Returns true (1) if this is the main (top-level) frame.
+  /// Returns true (1) if this is the main (top-level) frame.
   ///
   int(CEF_CALLBACK* is_main)(struct _cef_frame_t* self);
 
   ///
-  // Returns true (1) if this is the focused frame.
+  /// Returns true (1) if this is the focused frame.
   ///
   int(CEF_CALLBACK* is_focused)(struct _cef_frame_t* self);
 
   ///
-  // Returns the name for this frame. If the frame has an assigned name (for
-  // example, set via the iframe "name" attribute) then that value will be
-  // returned. Otherwise a unique name will be constructed based on the frame
-  // parent hierarchy. The main (top-level) frame will always have an NULL name
-  // value.
+  /// Returns the name for this frame. If the frame has an assigned name (for
+  /// example, set via the iframe "name" attribute) then that value will be
+  /// returned. Otherwise a unique name will be constructed based on the frame
+  /// parent hierarchy. The main (top-level) frame will always have an NULL name
+  /// value.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_name)(struct _cef_frame_t* self);
 
   ///
-  // Returns the globally unique identifier for this frame or < 0 if the
-  // underlying frame does not yet exist.
+  /// Returns the globally unique identifier for this frame or < 0 if the
+  /// underlying frame does not yet exist.
   ///
-  int64(CEF_CALLBACK* get_identifier)(struct _cef_frame_t* self);
+  int64_t(CEF_CALLBACK* get_identifier)(struct _cef_frame_t* self);
 
   ///
-  // Returns the parent of this frame or NULL if this is the main (top-level)
-  // frame.
+  /// Returns the parent of this frame or NULL if this is the main (top-level)
+  /// frame.
   ///
   struct _cef_frame_t*(CEF_CALLBACK* get_parent)(struct _cef_frame_t* self);
 
   ///
-  // Returns the URL currently loaded in this frame.
+  /// Returns the URL currently loaded in this frame.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_url)(struct _cef_frame_t* self);
 
   ///
-  // Returns the browser that this frame belongs to.
+  /// Returns the browser that this frame belongs to.
   ///
   struct _cef_browser_t*(CEF_CALLBACK* get_browser)(struct _cef_frame_t* self);
 
   ///
-  // Get the V8 context associated with the frame. This function can only be
-  // called from the render process.
+  /// Get the V8 context associated with the frame. This function can only be
+  /// called from the render process.
   ///
   struct _cef_v8context_t*(CEF_CALLBACK* get_v8context)(
       struct _cef_frame_t* self);
 
   ///
-  // Visit the DOM document. This function can only be called from the render
-  // process.
+  /// Visit the DOM document. This function can only be called from the render
+  /// process.
   ///
   void(CEF_CALLBACK* visit_dom)(struct _cef_frame_t* self,
                                 struct _cef_domvisitor_t* visitor);
 
   ///
-  // Create a new URL request that will be treated as originating from this
-  // frame and the associated browser. This request may be intercepted by the
-  // client via cef_resource_request_handler_t or cef_scheme_handler_factory_t.
-  // Use cef_urlrequest_t::Create instead if you do not want the request to have
-  // this association, in which case it may be handled differently (see
-  // documentation on that function). Requests may originate from both the
-  // browser process and the render process.
-  //
-  // For requests originating from the browser process:
-  //   - POST data may only contain a single element of type PDE_TYPE_FILE or
-  //     PDE_TYPE_BYTES.
-  // For requests originating from the render process:
-  //   - POST data may only contain a single element of type PDE_TYPE_BYTES.
-  //   - If the response contains Content-Disposition or Mime-Type header values
-  //     that would not normally be rendered then the response may receive
-  //     special handling inside the browser (for example, via the file download
-  //     code path instead of the URL request code path).
-  //
-  // The |request| object will be marked as read-only after calling this
-  // function.
+  /// Create a new URL request that will be treated as originating from this
+  /// frame and the associated browser. Use cef_urlrequest_t::Create instead if
+  /// you do not want the request to have this association, in which case it may
+  /// be handled differently (see documentation on that function). A request
+  /// created with this function may only originate from the browser process,
+  /// and will behave as follows:
+  ///   - It may be intercepted by the client via CefResourceRequestHandler or
+  ///     CefSchemeHandlerFactory.
+  ///   - POST data may only contain a single element of type PDE_TYPE_FILE or
+  ///     PDE_TYPE_BYTES.
+  ///
+  /// The |request| object will be marked as read-only after calling this
+  /// function.
   ///
   struct _cef_urlrequest_t*(CEF_CALLBACK* create_urlrequest)(
       struct _cef_frame_t* self,
@@ -242,10 +235,12 @@
       struct _cef_urlrequest_client_t* client);
 
   ///
-  // Send a message to the specified |target_process|. Message delivery is not
-  // guaranteed in all cases (for example, if the browser is closing,
-  // navigating, or if the target process crashes). Send an ACK message back
-  // from the target process if confirmation is required.
+  /// Send a message to the specified |target_process|. Ownership of the message
+  /// contents will be transferred and the |message| reference will be
+  /// invalidated. Message delivery is not guaranteed in all cases (for example,
+  /// if the browser is closing, navigating, or if the target process crashes).
+  /// Send an ACK message back from the target process if confirmation is
+  /// required.
   ///
   void(CEF_CALLBACK* send_process_message)(
       struct _cef_frame_t* self,
diff --git a/src/include/capi/cef_frame_handler_capi.h b/src/include/capi/cef_frame_handler_capi.h
new file mode 100644
index 0000000..94b3b88
--- /dev/null
+++ b/src/include/capi/cef_frame_handler_capi.h
@@ -0,0 +1,202 @@
+// Copyright (c) 2023 Marshall A. Greenblatt. 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 file was generated by the CEF translator tool and should not edited
+// by hand. See the translator.README.txt file in the tools directory for
+// more information.
+//
+// $hash=4cdadeb6439415d60ec32249c3a0b6457dd586f7$
+//
+
+#ifndef CEF_INCLUDE_CAPI_CEF_FRAME_HANDLER_CAPI_H_
+#define CEF_INCLUDE_CAPI_CEF_FRAME_HANDLER_CAPI_H_
+#pragma once
+
+#include "include/capi/cef_base_capi.h"
+#include "include/capi/cef_browser_capi.h"
+#include "include/capi/cef_frame_capi.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+///
+/// Implement this structure to handle events related to cef_frame_t life span.
+/// The order of callbacks is:
+///
+/// (1) During initial cef_browser_host_t creation and navigation of the main
+/// frame: - cef_frame_handler_t::OnFrameCreated => The initial main frame
+/// object has been
+///   created. Any commands will be queued until the frame is attached.
+/// - cef_frame_handler_t::OnMainFrameChanged => The initial main frame object
+/// has
+///   been assigned to the browser.
+/// - cef_life_span_handler_t::OnAfterCreated => The browser is now valid and
+/// can be
+///   used.
+/// - cef_frame_handler_t::OnFrameAttached => The initial main frame object is
+/// now
+///   connected to its peer in the renderer process. Commands can be routed.
+///
+/// (2) During further cef_browser_host_t navigation/loading of the main frame
+///     and/or sub-frames:
+/// - cef_frame_handler_t::OnFrameCreated => A new main frame or sub-frame
+/// object
+///   has been created. Any commands will be queued until the frame is attached.
+/// - cef_frame_handler_t::OnFrameAttached => A new main frame or sub-frame
+/// object
+///   is now connected to its peer in the renderer process. Commands can be
+///   routed.
+/// - cef_frame_handler_t::OnFrameDetached => An existing main frame or sub-
+/// frame
+///   object has lost its connection to the renderer process. If multiple
+///   objects are detached at the same time then notifications will be sent for
+///   any sub-frame objects before the main frame object. Commands can no longer
+///   be routed and will be discarded.
+/// - cef_frame_handler_t::OnMainFrameChanged => A new main frame object has
+/// been
+///   assigned to the browser. This will only occur with cross-origin navigation
+///   or re-navigation after renderer process termination (due to crashes, etc).
+///
+/// (3) During final cef_browser_host_t destruction of the main frame: -
+/// cef_frame_handler_t::OnFrameDetached => Any sub-frame objects have lost
+/// their
+///   connection to the renderer process. Commands can no longer be routed and
+///   will be discarded.
+/// - cef_life_span_handler_t::OnBeforeClose => The browser has been destroyed.
+/// - cef_frame_handler_t::OnFrameDetached => The main frame object have lost
+/// its
+///   connection to the renderer process. Notifications will be sent for any
+///   sub-frame objects before the main frame object. Commands can no longer be
+///   routed and will be discarded.
+/// - cef_frame_handler_t::OnMainFrameChanged => The final main frame object has
+///   been removed from the browser.
+///
+/// Cross-origin navigation and/or loading receives special handling.
+///
+/// When the main frame navigates to a different origin the OnMainFrameChanged
+/// callback (2) will be executed with the old and new main frame objects.
+///
+/// When a new sub-frame is loaded in, or an existing sub-frame is navigated to,
+/// a different origin from the parent frame, a temporary sub-frame object will
+/// first be created in the parent's renderer process. That temporary sub-frame
+/// will then be discarded after the real cross-origin sub-frame is created in
+/// the new/target renderer process. The client will receive cross-origin
+/// navigation callbacks (2) for the transition from the temporary sub-frame to
+/// the real sub-frame. The temporary sub-frame will not recieve or execute
+/// commands during this transitional period (any sent commands will be
+/// discarded).
+///
+/// When a new popup browser is created in a different origin from the parent
+/// browser, a temporary main frame object for the popup will first be created
+/// in the parent's renderer process. That temporary main frame will then be
+/// discarded after the real cross-origin main frame is created in the
+/// new/target renderer process. The client will recieve creation and initial
+/// navigation callbacks (1) for the temporary main frame, followed by cross-
+/// origin navigation callbacks (2) for the transition from the temporary main
+/// frame to the real main frame. The temporary main frame may receive and
+/// execute commands during this transitional period (any sent commands may be
+/// executed, but the behavior is potentially undesirable since they execute in
+/// the parent browser's renderer process and not the new/target renderer
+/// process).
+///
+/// Callbacks will not be executed for placeholders that may be created during
+/// pre-commit navigation for sub-frames that do not yet exist in the renderer
+/// process. Placeholders will have cef_frame_t::get_identifier() == -4.
+///
+/// The functions of this structure will be called on the UI thread unless
+/// otherwise indicated.
+///
+typedef struct _cef_frame_handler_t {
+  ///
+  /// Base structure.
+  ///
+  cef_base_ref_counted_t base;
+
+  ///
+  /// Called when a new frame is created. This will be the first notification
+  /// that references |frame|. Any commands that require transport to the
+  /// associated renderer process (LoadRequest, SendProcessMessage, GetSource,
+  /// etc.) will be queued until OnFrameAttached is called for |frame|.
+  ///
+  void(CEF_CALLBACK* on_frame_created)(struct _cef_frame_handler_t* self,
+                                       struct _cef_browser_t* browser,
+                                       struct _cef_frame_t* frame);
+
+  ///
+  /// Called when a frame can begin routing commands to/from the associated
+  /// renderer process. |reattached| will be true (1) if the frame was re-
+  /// attached after exiting the BackForwardCache. Any commands that were queued
+  /// have now been dispatched.
+  ///
+  void(CEF_CALLBACK* on_frame_attached)(struct _cef_frame_handler_t* self,
+                                        struct _cef_browser_t* browser,
+                                        struct _cef_frame_t* frame,
+                                        int reattached);
+
+  ///
+  /// Called when a frame loses its connection to the renderer process and will
+  /// be destroyed. Any pending or future commands will be discarded and
+  /// cef_frame_t::is_valid() will now return false (0) for |frame|. If called
+  /// after cef_life_span_handler_t::on_before_close() during browser
+  /// destruction then cef_browser_t::is_valid() will return false (0) for
+  /// |browser|.
+  ///
+  void(CEF_CALLBACK* on_frame_detached)(struct _cef_frame_handler_t* self,
+                                        struct _cef_browser_t* browser,
+                                        struct _cef_frame_t* frame);
+
+  ///
+  /// Called when the main frame changes due to (a) initial browser creation,
+  /// (b) final browser destruction, (c) cross-origin navigation or (d) re-
+  /// navigation after renderer process termination (due to crashes, etc).
+  /// |old_frame| will be NULL and |new_frame| will be non-NULL when a main
+  /// frame is assigned to |browser| for the first time. |old_frame| will be
+  /// non-NULL and |new_frame| will be NULL and  when a main frame is removed
+  /// from |browser| for the last time. Both |old_frame| and |new_frame| will be
+  /// non-NULL for cross-origin navigations or re-navigation after renderer
+  /// process termination. This function will be called after on_frame_created()
+  /// for |new_frame| and/or after on_frame_detached() for |old_frame|. If
+  /// called after cef_life_span_handler_t::on_before_close() during browser
+  /// destruction then cef_browser_t::is_valid() will return false (0) for
+  /// |browser|.
+  ///
+  void(CEF_CALLBACK* on_main_frame_changed)(struct _cef_frame_handler_t* self,
+                                            struct _cef_browser_t* browser,
+                                            struct _cef_frame_t* old_frame,
+                                            struct _cef_frame_t* new_frame);
+} cef_frame_handler_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // CEF_INCLUDE_CAPI_CEF_FRAME_HANDLER_CAPI_H_
diff --git a/src/include/capi/cef_request_callback_capi.h b/src/include/capi/cef_i18n_util_capi.h
similarity index 70%
rename from src/include/capi/cef_request_callback_capi.h
rename to src/include/capi/cef_i18n_util_capi.h
index 36316e9..3aab714 100644
--- a/src/include/capi/cef_request_callback_capi.h
+++ b/src/include/capi/cef_i18n_util_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,11 +33,11 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=3efd81a4bfdfca579a77f14bd37b8192122ebda4$
+// $hash=c564ee1f32a0ef05fe49fc779af5bc0b0e1b36d6$
 //
 
-#ifndef CEF_INCLUDE_CAPI_CEF_REQUEST_CALLBACK_CAPI_H_
-#define CEF_INCLUDE_CAPI_CEF_REQUEST_CALLBACK_CAPI_H_
+#ifndef CEF_INCLUDE_CAPI_CEF_I18N_UTIL_CAPI_H_
+#define CEF_INCLUDE_CAPI_CEF_I18N_UTIL_CAPI_H_
 #pragma once
 
 #include "include/capi/cef_base_capi.h"
@@ -47,28 +47,12 @@
 #endif
 
 ///
-// Callback structure used for asynchronous continuation of url requests.
+/// Returns true (1) if the application text direction is right-to-left.
 ///
-typedef struct _cef_request_callback_t {
-  ///
-  // Base structure.
-  ///
-  cef_base_ref_counted_t base;
-
-  ///
-  // Continue the url request. If |allow| is true (1) the request will be
-  // continued. Otherwise, the request will be canceled.
-  ///
-  void(CEF_CALLBACK* cont)(struct _cef_request_callback_t* self, int allow);
-
-  ///
-  // Cancel the url request.
-  ///
-  void(CEF_CALLBACK* cancel)(struct _cef_request_callback_t* self);
-} cef_request_callback_t;
+CEF_EXPORT int cef_is_rtl(void);
 
 #ifdef __cplusplus
 }
 #endif
 
-#endif  // CEF_INCLUDE_CAPI_CEF_REQUEST_CALLBACK_CAPI_H_
+#endif  // CEF_INCLUDE_CAPI_CEF_I18N_UTIL_CAPI_H_
diff --git a/src/include/capi/cef_image_capi.h b/src/include/capi/cef_image_capi.h
index d3836d6..9d4a0a9 100644
--- a/src/include/capi/cef_image_capi.h
+++ b/src/include/capi/cef_image_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=5afa8e95e6e7bddbd3c442e99b4c2843efb18c49$
+// $hash=99c94b208f9b184985220493bba4ea08e6786046$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_IMAGE_CAPI_H_
@@ -48,37 +48,37 @@
 #endif
 
 ///
-// Container for a single image represented at different scale factors. All
-// image representations should be the same size in density independent pixel
-// (DIP) units. For example, if the image at scale factor 1.0 is 100x100 pixels
-// then the image at scale factor 2.0 should be 200x200 pixels -- both images
-// will display with a DIP size of 100x100 units. The functions of this
-// structure can be called on any browser process thread.
+/// Container for a single image represented at different scale factors. All
+/// image representations should be the same size in density independent pixel
+/// (DIP) units. For example, if the image at scale factor 1.0 is 100x100 pixels
+/// then the image at scale factor 2.0 should be 200x200 pixels -- both images
+/// will display with a DIP size of 100x100 units. The functions of this
+/// structure can be called on any browser process thread.
 ///
 typedef struct _cef_image_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns true (1) if this Image is NULL.
+  /// Returns true (1) if this Image is NULL.
   ///
   int(CEF_CALLBACK* is_empty)(struct _cef_image_t* self);
 
   ///
-  // Returns true (1) if this Image and |that| Image share the same underlying
-  // storage. Will also return true (1) if both images are NULL.
+  /// Returns true (1) if this Image and |that| Image share the same underlying
+  /// storage. Will also return true (1) if both images are NULL.
   ///
   int(CEF_CALLBACK* is_same)(struct _cef_image_t* self,
                              struct _cef_image_t* that);
 
   ///
-  // Add a bitmap image representation for |scale_factor|. Only 32-bit RGBA/BGRA
-  // formats are supported. |pixel_width| and |pixel_height| are the bitmap
-  // representation size in pixel coordinates. |pixel_data| is the array of
-  // pixel data and should be |pixel_width| x |pixel_height| x 4 bytes in size.
-  // |color_type| and |alpha_type| values specify the pixel format.
+  /// Add a bitmap image representation for |scale_factor|. Only 32-bit
+  /// RGBA/BGRA formats are supported. |pixel_width| and |pixel_height| are the
+  /// bitmap representation size in pixel coordinates. |pixel_data| is the array
+  /// of pixel data and should be |pixel_width| x |pixel_height| x 4 bytes in
+  /// size. |color_type| and |alpha_type| values specify the pixel format.
   ///
   int(CEF_CALLBACK* add_bitmap)(struct _cef_image_t* self,
                                 float scale_factor,
@@ -90,9 +90,9 @@
                                 size_t pixel_data_size);
 
   ///
-  // Add a PNG image representation for |scale_factor|. |png_data| is the image
-  // data of size |png_data_size|. Any alpha transparency in the PNG data will
-  // be maintained.
+  /// Add a PNG image representation for |scale_factor|. |png_data| is the image
+  /// data of size |png_data_size|. Any alpha transparency in the PNG data will
+  /// be maintained.
   ///
   int(CEF_CALLBACK* add_png)(struct _cef_image_t* self,
                              float scale_factor,
@@ -100,9 +100,9 @@
                              size_t png_data_size);
 
   ///
-  // Create a JPEG image representation for |scale_factor|. |jpeg_data| is the
-  // image data of size |jpeg_data_size|. The JPEG format does not support
-  // transparency so the alpha byte will be set to 0xFF for all pixels.
+  /// Create a JPEG image representation for |scale_factor|. |jpeg_data| is the
+  /// image data of size |jpeg_data_size|. The JPEG format does not support
+  /// transparency so the alpha byte will be set to 0xFF for all pixels.
   ///
   int(CEF_CALLBACK* add_jpeg)(struct _cef_image_t* self,
                               float scale_factor,
@@ -110,33 +110,34 @@
                               size_t jpeg_data_size);
 
   ///
-  // Returns the image width in density independent pixel (DIP) units.
+  /// Returns the image width in density independent pixel (DIP) units.
   ///
   size_t(CEF_CALLBACK* get_width)(struct _cef_image_t* self);
 
   ///
-  // Returns the image height in density independent pixel (DIP) units.
+  /// Returns the image height in density independent pixel (DIP) units.
   ///
   size_t(CEF_CALLBACK* get_height)(struct _cef_image_t* self);
 
   ///
-  // Returns true (1) if this image contains a representation for
-  // |scale_factor|.
+  /// Returns true (1) if this image contains a representation for
+  /// |scale_factor|.
   ///
   int(CEF_CALLBACK* has_representation)(struct _cef_image_t* self,
                                         float scale_factor);
 
   ///
-  // Removes the representation for |scale_factor|. Returns true (1) on success.
+  /// Removes the representation for |scale_factor|. Returns true (1) on
+  /// success.
   ///
   int(CEF_CALLBACK* remove_representation)(struct _cef_image_t* self,
                                            float scale_factor);
 
   ///
-  // Returns information for the representation that most closely matches
-  // |scale_factor|. |actual_scale_factor| is the actual scale factor for the
-  // representation. |pixel_width| and |pixel_height| are the representation
-  // size in pixel coordinates. Returns true (1) on success.
+  /// Returns information for the representation that most closely matches
+  /// |scale_factor|. |actual_scale_factor| is the actual scale factor for the
+  /// representation. |pixel_width| and |pixel_height| are the representation
+  /// size in pixel coordinates. Returns true (1) on success.
   ///
   int(CEF_CALLBACK* get_representation_info)(struct _cef_image_t* self,
                                              float scale_factor,
@@ -145,12 +146,12 @@
                                              int* pixel_height);
 
   ///
-  // Returns the bitmap representation that most closely matches |scale_factor|.
-  // Only 32-bit RGBA/BGRA formats are supported. |color_type| and |alpha_type|
-  // values specify the desired output pixel format. |pixel_width| and
-  // |pixel_height| are the output representation size in pixel coordinates.
-  // Returns a cef_binary_value_t containing the pixel data on success or NULL
-  // on failure.
+  /// Returns the bitmap representation that most closely matches
+  /// |scale_factor|. Only 32-bit RGBA/BGRA formats are supported. |color_type|
+  /// and |alpha_type| values specify the desired output pixel format.
+  /// |pixel_width| and |pixel_height| are the output representation size in
+  /// pixel coordinates. Returns a cef_binary_value_t containing the pixel data
+  /// on success or NULL on failure.
   ///
   struct _cef_binary_value_t*(CEF_CALLBACK* get_as_bitmap)(
       struct _cef_image_t* self,
@@ -161,12 +162,12 @@
       int* pixel_height);
 
   ///
-  // Returns the PNG representation that most closely matches |scale_factor|. If
-  // |with_transparency| is true (1) any alpha transparency in the image will be
-  // represented in the resulting PNG data. |pixel_width| and |pixel_height| are
-  // the output representation size in pixel coordinates. Returns a
-  // cef_binary_value_t containing the PNG image data on success or NULL on
-  // failure.
+  /// Returns the PNG representation that most closely matches |scale_factor|.
+  /// If |with_transparency| is true (1) any alpha transparency in the image
+  /// will be represented in the resulting PNG data. |pixel_width| and
+  /// |pixel_height| are the output representation size in pixel coordinates.
+  /// Returns a cef_binary_value_t containing the PNG image data on success or
+  /// NULL on failure.
   ///
   struct _cef_binary_value_t*(CEF_CALLBACK* get_as_png)(
       struct _cef_image_t* self,
@@ -176,13 +177,13 @@
       int* pixel_height);
 
   ///
-  // Returns the JPEG representation that most closely matches |scale_factor|.
-  // |quality| determines the compression level with 0 == lowest and 100 ==
-  // highest. The JPEG format does not support alpha transparency and the alpha
-  // channel, if any, will be discarded. |pixel_width| and |pixel_height| are
-  // the output representation size in pixel coordinates. Returns a
-  // cef_binary_value_t containing the JPEG image data on success or NULL on
-  // failure.
+  /// Returns the JPEG representation that most closely matches |scale_factor|.
+  /// |quality| determines the compression level with 0 == lowest and 100 ==
+  /// highest. The JPEG format does not support alpha transparency and the alpha
+  /// channel, if any, will be discarded. |pixel_width| and |pixel_height| are
+  /// the output representation size in pixel coordinates. Returns a
+  /// cef_binary_value_t containing the JPEG image data on success or NULL on
+  /// failure.
   ///
   struct _cef_binary_value_t*(CEF_CALLBACK* get_as_jpeg)(
       struct _cef_image_t* self,
@@ -193,10 +194,10 @@
 } cef_image_t;
 
 ///
-// Create a new cef_image_t. It will initially be NULL. Use the Add*() functions
-// to add representations at different scale factors.
+/// Create a new cef_image_t. It will initially be NULL. Use the Add*()
+/// functions to add representations at different scale factors.
 ///
-CEF_EXPORT cef_image_t* cef_image_create();
+CEF_EXPORT cef_image_t* cef_image_create(void);
 
 #ifdef __cplusplus
 }
diff --git a/src/include/capi/cef_jsdialog_handler_capi.h b/src/include/capi/cef_jsdialog_handler_capi.h
index 0aed471..a490ddd 100644
--- a/src/include/capi/cef_jsdialog_handler_capi.h
+++ b/src/include/capi/cef_jsdialog_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=e68da1a5db612699b7b727edea2bb629f5d67103$
+// $hash=e9fb0354243611f3a4de508923a4e01dab42f82d$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_JSDIALOG_HANDLER_CAPI_H_
@@ -48,18 +48,19 @@
 #endif
 
 ///
-// Callback structure used for asynchronous continuation of JavaScript dialog
-// requests.
+/// Callback structure used for asynchronous continuation of JavaScript dialog
+/// requests.
 ///
 typedef struct _cef_jsdialog_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Continue the JS dialog request. Set |success| to true (1) if the OK button
-  // was pressed. The |user_input| value should be specified for prompt dialogs.
+  /// Continue the JS dialog request. Set |success| to true (1) if the OK button
+  /// was pressed. The |user_input| value should be specified for prompt
+  /// dialogs.
   ///
   void(CEF_CALLBACK* cont)(struct _cef_jsdialog_callback_t* self,
                            int success,
@@ -67,31 +68,31 @@
 } cef_jsdialog_callback_t;
 
 ///
-// Implement this structure to handle events related to JavaScript dialogs. The
-// functions of this structure will be called on the UI thread.
+/// Implement this structure to handle events related to JavaScript dialogs. The
+/// functions of this structure will be called on the UI thread.
 ///
 typedef struct _cef_jsdialog_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called to run a JavaScript dialog. If |origin_url| is non-NULL it can be
-  // passed to the CefFormatUrlForSecurityDisplay function to retrieve a secure
-  // and user-friendly display string. The |default_prompt_text| value will be
-  // specified for prompt dialogs only. Set |suppress_message| to true (1) and
-  // return false (0) to suppress the message (suppressing messages is
-  // preferable to immediately executing the callback as this is used to detect
-  // presumably malicious behavior like spamming alert messages in
-  // onbeforeunload). Set |suppress_message| to false (0) and return false (0)
-  // to use the default implementation (the default implementation will show one
-  // modal dialog at a time and suppress any additional dialog requests until
-  // the displayed dialog is dismissed). Return true (1) if the application will
-  // use a custom dialog or if the callback has been executed immediately.
-  // Custom dialogs may be either modal or modeless. If a custom dialog is used
-  // the application must execute |callback| once the custom dialog is
-  // dismissed.
+  /// Called to run a JavaScript dialog. If |origin_url| is non-NULL it can be
+  /// passed to the CefFormatUrlForSecurityDisplay function to retrieve a secure
+  /// and user-friendly display string. The |default_prompt_text| value will be
+  /// specified for prompt dialogs only. Set |suppress_message| to true (1) and
+  /// return false (0) to suppress the message (suppressing messages is
+  /// preferable to immediately executing the callback as this is used to detect
+  /// presumably malicious behavior like spamming alert messages in
+  /// onbeforeunload). Set |suppress_message| to false (0) and return false (0)
+  /// to use the default implementation (the default implementation will show
+  /// one modal dialog at a time and suppress any additional dialog requests
+  /// until the displayed dialog is dismissed). Return true (1) if the
+  /// application will use a custom dialog or if the callback has been executed
+  /// immediately. Custom dialogs may be either modal or modeless. If a custom
+  /// dialog is used the application must execute |callback| once the custom
+  /// dialog is dismissed.
   ///
   int(CEF_CALLBACK* on_jsdialog)(struct _cef_jsdialog_handler_t* self,
                                  struct _cef_browser_t* browser,
@@ -103,12 +104,12 @@
                                  int* suppress_message);
 
   ///
-  // Called to run a dialog asking the user if they want to leave a page. Return
-  // false (0) to use the default dialog implementation. Return true (1) if the
-  // application will use a custom dialog or if the callback has been executed
-  // immediately. Custom dialogs may be either modal or modeless. If a custom
-  // dialog is used the application must execute |callback| once the custom
-  // dialog is dismissed.
+  /// Called to run a dialog asking the user if they want to leave a page.
+  /// Return false (0) to use the default dialog implementation. Return true (1)
+  /// if the application will use a custom dialog or if the callback has been
+  /// executed immediately. Custom dialogs may be either modal or modeless. If a
+  /// custom dialog is used the application must execute |callback| once the
+  /// custom dialog is dismissed.
   ///
   int(CEF_CALLBACK* on_before_unload_dialog)(
       struct _cef_jsdialog_handler_t* self,
@@ -118,16 +119,16 @@
       struct _cef_jsdialog_callback_t* callback);
 
   ///
-  // Called to cancel any pending dialogs and reset any saved dialog state. Will
-  // be called due to events like page navigation irregardless of whether any
-  // dialogs are currently pending.
+  /// Called to cancel any pending dialogs and reset any saved dialog state.
+  /// Will be called due to events like page navigation irregardless of whether
+  /// any dialogs are currently pending.
   ///
   void(CEF_CALLBACK* on_reset_dialog_state)(
       struct _cef_jsdialog_handler_t* self,
       struct _cef_browser_t* browser);
 
   ///
-  // Called when the default implementation dialog is closed.
+  /// Called when the dialog is closed.
   ///
   void(CEF_CALLBACK* on_dialog_closed)(struct _cef_jsdialog_handler_t* self,
                                        struct _cef_browser_t* browser);
diff --git a/src/include/capi/cef_keyboard_handler_capi.h b/src/include/capi/cef_keyboard_handler_capi.h
index 356803d..7ff37b4 100644
--- a/src/include/capi/cef_keyboard_handler_capi.h
+++ b/src/include/capi/cef_keyboard_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=70108de432674485dee079e541e0dacd6a437961$
+// $hash=10fb708c5f550403205a976924abf1886bf3dfa7$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_KEYBOARD_HANDLER_CAPI_H_
@@ -48,37 +48,38 @@
 #endif
 
 ///
-// Implement this structure to handle events related to keyboard input. The
-// functions of this structure will be called on the UI thread.
+/// Implement this structure to handle events related to keyboard input. The
+/// functions of this structure will be called on the UI thread.
 ///
 typedef struct _cef_keyboard_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called before a keyboard event is sent to the renderer. |event| contains
-  // information about the keyboard event. |os_event| is the operating system
-  // event message, if any. Return true (1) if the event was handled or false
-  // (0) otherwise. If the event will be handled in on_key_event() as a keyboard
-  // shortcut set |is_keyboard_shortcut| to true (1) and return false (0).
+  /// Called before a keyboard event is sent to the renderer. |event| contains
+  /// information about the keyboard event. |os_event| is the operating system
+  /// event message, if any. Return true (1) if the event was handled or false
+  /// (0) otherwise. If the event will be handled in on_key_event() as a
+  /// keyboard shortcut set |is_keyboard_shortcut| to true (1) and return false
+  /// (0).
   ///
   int(CEF_CALLBACK* on_pre_key_event)(struct _cef_keyboard_handler_t* self,
                                       struct _cef_browser_t* browser,
-                                      const struct _cef_key_event_t* event,
+                                      const cef_key_event_t* event,
                                       cef_event_handle_t os_event,
                                       int* is_keyboard_shortcut);
 
   ///
-  // Called after the renderer and JavaScript in the page has had a chance to
-  // handle the event. |event| contains information about the keyboard event.
-  // |os_event| is the operating system event message, if any. Return true (1)
-  // if the keyboard event was handled or false (0) otherwise.
+  /// Called after the renderer and JavaScript in the page has had a chance to
+  /// handle the event. |event| contains information about the keyboard event.
+  /// |os_event| is the operating system event message, if any. Return true (1)
+  /// if the keyboard event was handled or false (0) otherwise.
   ///
   int(CEF_CALLBACK* on_key_event)(struct _cef_keyboard_handler_t* self,
                                   struct _cef_browser_t* browser,
-                                  const struct _cef_key_event_t* event,
+                                  const cef_key_event_t* event,
                                   cef_event_handle_t os_event);
 } cef_keyboard_handler_t;
 
diff --git a/src/include/capi/cef_life_span_handler_capi.h b/src/include/capi/cef_life_span_handler_capi.h
index c691fcf..a12b086 100644
--- a/src/include/capi/cef_life_span_handler_capi.h
+++ b/src/include/capi/cef_life_span_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=d6e91d55d41f729dca94ba5766f57849f29d0796$
+// $hash=32a0c21a71aa7137fa9660b942f597705bc8b05e$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_LIFE_SPAN_HANDLER_CAPI_H_
@@ -50,40 +50,40 @@
 struct _cef_client_t;
 
 ///
-// Implement this structure to handle events related to browser life span. The
-// functions of this structure will be called on the UI thread unless otherwise
-// indicated.
+/// Implement this structure to handle events related to browser life span. The
+/// functions of this structure will be called on the UI thread unless otherwise
+/// indicated.
 ///
 typedef struct _cef_life_span_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called on the UI thread before a new popup browser is created. The
-  // |browser| and |frame| values represent the source of the popup request. The
-  // |target_url| and |target_frame_name| values indicate where the popup
-  // browser should navigate and may be NULL if not specified with the request.
-  // The |target_disposition| value indicates where the user intended to open
-  // the popup (e.g. current tab, new tab, etc). The |user_gesture| value will
-  // be true (1) if the popup was opened via explicit user gesture (e.g.
-  // clicking a link) or false (0) if the popup opened automatically (e.g. via
-  // the DomContentLoaded event). The |popupFeatures| structure contains
-  // additional information about the requested popup window. To allow creation
-  // of the popup browser optionally modify |windowInfo|, |client|, |settings|
-  // and |no_javascript_access| and return false (0). To cancel creation of the
-  // popup browser return true (1). The |client| and |settings| values will
-  // default to the source browser's values. If the |no_javascript_access| value
-  // is set to false (0) the new browser will not be scriptable and may not be
-  // hosted in the same renderer process as the source browser. Any
-  // modifications to |windowInfo| will be ignored if the parent browser is
-  // wrapped in a cef_browser_view_t. Popup browser creation will be canceled if
-  // the parent browser is destroyed before the popup browser creation completes
-  // (indicated by a call to OnAfterCreated for the popup browser). The
-  // |extra_info| parameter provides an opportunity to specify extra information
-  // specific to the created popup browser that will be passed to
-  // cef_render_process_handler_t::on_browser_created() in the render process.
+  /// Called on the UI thread before a new popup browser is created. The
+  /// |browser| and |frame| values represent the source of the popup request.
+  /// The |target_url| and |target_frame_name| values indicate where the popup
+  /// browser should navigate and may be NULL if not specified with the request.
+  /// The |target_disposition| value indicates where the user intended to open
+  /// the popup (e.g. current tab, new tab, etc). The |user_gesture| value will
+  /// be true (1) if the popup was opened via explicit user gesture (e.g.
+  /// clicking a link) or false (0) if the popup opened automatically (e.g. via
+  /// the DomContentLoaded event). The |popupFeatures| structure contains
+  /// additional information about the requested popup window. To allow creation
+  /// of the popup browser optionally modify |windowInfo|, |client|, |settings|
+  /// and |no_javascript_access| and return false (0). To cancel creation of the
+  /// popup browser return true (1). The |client| and |settings| values will
+  /// default to the source browser's values. If the |no_javascript_access|
+  /// value is set to false (0) the new browser will not be scriptable and may
+  /// not be hosted in the same renderer process as the source browser. Any
+  /// modifications to |windowInfo| will be ignored if the parent browser is
+  /// wrapped in a cef_browser_view_t. Popup browser creation will be canceled
+  /// if the parent browser is destroyed before the popup browser creation
+  /// completes (indicated by a call to OnAfterCreated for the popup browser).
+  /// The |extra_info| parameter provides an opportunity to specify extra
+  /// information specific to the created popup browser that will be passed to
+  /// cef_render_process_handler_t::on_browser_created() in the render process.
   ///
   int(CEF_CALLBACK* on_before_popup)(
       struct _cef_life_span_handler_t* self,
@@ -93,7 +93,7 @@
       const cef_string_t* target_frame_name,
       cef_window_open_disposition_t target_disposition,
       int user_gesture,
-      const struct _cef_popup_features_t* popupFeatures,
+      const cef_popup_features_t* popupFeatures,
       struct _cef_window_info_t* windowInfo,
       struct _cef_client_t** client,
       struct _cef_browser_settings_t* settings,
@@ -101,114 +101,146 @@
       int* no_javascript_access);
 
   ///
-  // Called after a new browser is created. This callback will be the first
-  // notification that references |browser|.
+  /// Called on the UI thread before a new DevTools popup browser is created.
+  /// The |browser| value represents the source of the popup request. Optionally
+  /// modify |windowInfo|, |client|, |settings| and |extra_info| values. The
+  /// |client|, |settings| and |extra_info| values will default to the source
+  /// browser's values. Any modifications to |windowInfo| will be ignored if the
+  /// parent browser is Views-hosted (wrapped in a cef_browser_view_t).
+  ///
+  /// The |extra_info| parameter provides an opportunity to specify extra
+  /// information specific to the created popup browser that will be passed to
+  /// cef_render_process_handler_t::on_browser_created() in the render process.
+  /// The existing |extra_info| object, if any, will be read-only but may be
+  /// replaced with a new object.
+  ///
+  /// Views-hosted source browsers will create Views-hosted DevTools popups
+  /// unless |use_default_window| is set to to true (1). DevTools popups can be
+  /// blocked by returning true (1) from cef_command_handler_t::OnChromeCommand
+  /// for IDC_DEV_TOOLS. Only used with the Chrome runtime.
+  ///
+  void(CEF_CALLBACK* on_before_dev_tools_popup)(
+      struct _cef_life_span_handler_t* self,
+      struct _cef_browser_t* browser,
+      struct _cef_window_info_t* windowInfo,
+      struct _cef_client_t** client,
+      struct _cef_browser_settings_t* settings,
+      struct _cef_dictionary_value_t** extra_info,
+      int* use_default_window);
+
+  ///
+  /// Called after a new browser is created. It is now safe to begin performing
+  /// actions with |browser|. cef_frame_handler_t callbacks related to initial
+  /// main frame creation will arrive before this callback. See
+  /// cef_frame_handler_t documentation for additional usage information.
   ///
   void(CEF_CALLBACK* on_after_created)(struct _cef_life_span_handler_t* self,
                                        struct _cef_browser_t* browser);
 
   ///
-  // Called when a browser has recieved a request to close. This may result
-  // directly from a call to cef_browser_host_t::*close_browser() or indirectly
-  // if the browser is parented to a top-level window created by CEF and the
-  // user attempts to close that window (by clicking the 'X', for example). The
-  // do_close() function will be called after the JavaScript 'onunload' event
-  // has been fired.
-  //
-  // An application should handle top-level owner window close notifications by
-  // calling cef_browser_host_t::try_close_browser() or
-  // cef_browser_host_t::CloseBrowser(false (0)) instead of allowing the window
-  // to close immediately (see the examples below). This gives CEF an
-  // opportunity to process the 'onbeforeunload' event and optionally cancel the
-  // close before do_close() is called.
-  //
-  // When windowed rendering is enabled CEF will internally create a window or
-  // view to host the browser. In that case returning false (0) from do_close()
-  // will send the standard close notification to the browser's top-level owner
-  // window (e.g. WM_CLOSE on Windows, performClose: on OS X, "delete_event" on
-  // Linux or cef_window_delegate_t::can_close() callback from Views). If the
-  // browser's host window/view has already been destroyed (via view hierarchy
-  // tear-down, for example) then do_close() will not be called for that browser
-  // since is no longer possible to cancel the close.
-  //
-  // When windowed rendering is disabled returning false (0) from do_close()
-  // will cause the browser object to be destroyed immediately.
-  //
-  // If the browser's top-level owner window requires a non-standard close
-  // notification then send that notification from do_close() and return true
-  // (1).
-  //
-  // The cef_life_span_handler_t::on_before_close() function will be called
-  // after do_close() (if do_close() is called) and immediately before the
-  // browser object is destroyed. The application should only exit after
-  // on_before_close() has been called for all existing browsers.
-  //
-  // The below examples describe what should happen during window close when the
-  // browser is parented to an application-provided top-level window.
-  //
-  // Example 1: Using cef_browser_host_t::try_close_browser(). This is
-  // recommended for clients using standard close handling and windows created
-  // on the browser process UI thread. 1.  User clicks the window close button
-  // which sends a close notification to
-  //     the application's top-level window.
-  // 2.  Application's top-level window receives the close notification and
-  //     calls TryCloseBrowser() (which internally calls CloseBrowser(false)).
-  //     TryCloseBrowser() returns false so the client cancels the window close.
-  // 3.  JavaScript 'onbeforeunload' handler executes and shows the close
-  //     confirmation dialog (which can be overridden via
-  //     CefJSDialogHandler::OnBeforeUnloadDialog()).
-  // 4.  User approves the close. 5.  JavaScript 'onunload' handler executes. 6.
-  // CEF sends a close notification to the application's top-level window
-  //     (because DoClose() returned false by default).
-  // 7.  Application's top-level window receives the close notification and
-  //     calls TryCloseBrowser(). TryCloseBrowser() returns true so the client
-  //     allows the window close.
-  // 8.  Application's top-level window is destroyed. 9.  Application's
-  // on_before_close() handler is called and the browser object
-  //     is destroyed.
-  // 10. Application exits by calling cef_quit_message_loop() if no other
-  // browsers
-  //     exist.
-  //
-  // Example 2: Using cef_browser_host_t::CloseBrowser(false (0)) and
-  // implementing the do_close() callback. This is recommended for clients using
-  // non-standard close handling or windows that were not created on the browser
-  // process UI thread. 1.  User clicks the window close button which sends a
-  // close notification to
-  //     the application's top-level window.
-  // 2.  Application's top-level window receives the close notification and:
-  //     A. Calls CefBrowserHost::CloseBrowser(false).
-  //     B. Cancels the window close.
-  // 3.  JavaScript 'onbeforeunload' handler executes and shows the close
-  //     confirmation dialog (which can be overridden via
-  //     CefJSDialogHandler::OnBeforeUnloadDialog()).
-  // 4.  User approves the close. 5.  JavaScript 'onunload' handler executes. 6.
-  // Application's do_close() handler is called. Application will:
-  //     A. Set a flag to indicate that the next close attempt will be allowed.
-  //     B. Return false.
-  // 7.  CEF sends an close notification to the application's top-level window.
-  // 8.  Application's top-level window receives the close notification and
-  //     allows the window to close based on the flag from #6B.
-  // 9.  Application's top-level window is destroyed. 10. Application's
-  // on_before_close() handler is called and the browser object
-  //     is destroyed.
-  // 11. Application exits by calling cef_quit_message_loop() if no other
-  // browsers
-  //     exist.
+  /// Called when a browser has recieved a request to close. This may result
+  /// directly from a call to cef_browser_host_t::*close_browser() or indirectly
+  /// if the browser is parented to a top-level window created by CEF and the
+  /// user attempts to close that window (by clicking the 'X', for example). The
+  /// do_close() function will be called after the JavaScript 'onunload' event
+  /// has been fired.
+  ///
+  /// An application should handle top-level owner window close notifications by
+  /// calling cef_browser_host_t::try_close_browser() or
+  /// cef_browser_host_t::CloseBrowser(false (0)) instead of allowing the window
+  /// to close immediately (see the examples below). This gives CEF an
+  /// opportunity to process the 'onbeforeunload' event and optionally cancel
+  /// the close before do_close() is called.
+  ///
+  /// When windowed rendering is enabled CEF will internally create a window or
+  /// view to host the browser. In that case returning false (0) from do_close()
+  /// will send the standard close notification to the browser's top-level owner
+  /// window (e.g. WM_CLOSE on Windows, performClose: on OS X, "delete_event" on
+  /// Linux or cef_window_delegate_t::can_close() callback from Views). If the
+  /// browser's host window/view has already been destroyed (via view hierarchy
+  /// tear-down, for example) then do_close() will not be called for that
+  /// browser since is no longer possible to cancel the close.
+  ///
+  /// When windowed rendering is disabled returning false (0) from do_close()
+  /// will cause the browser object to be destroyed immediately.
+  ///
+  /// If the browser's top-level owner window requires a non-standard close
+  /// notification then send that notification from do_close() and return true
+  /// (1).
+  ///
+  /// The cef_life_span_handler_t::on_before_close() function will be called
+  /// after do_close() (if do_close() is called) and immediately before the
+  /// browser object is destroyed. The application should only exit after
+  /// on_before_close() has been called for all existing browsers.
+  ///
+  /// The below examples describe what should happen during window close when
+  /// the browser is parented to an application-provided top-level window.
+  ///
+  /// Example 1: Using cef_browser_host_t::try_close_browser(). This is
+  /// recommended for clients using standard close handling and windows created
+  /// on the browser process UI thread. 1.  User clicks the window close button
+  /// which sends a close notification
+  ///     to the application's top-level window.
+  /// 2.  Application's top-level window receives the close notification and
+  ///     calls TryCloseBrowser() (which internally calls CloseBrowser(false)).
+  ///     TryCloseBrowser() returns false so the client cancels the window
+  ///     close.
+  /// 3.  JavaScript 'onbeforeunload' handler executes and shows the close
+  ///     confirmation dialog (which can be overridden via
+  ///     CefJSDialogHandler::OnBeforeUnloadDialog()).
+  /// 4.  User approves the close. 5.  JavaScript 'onunload' handler executes.
+  /// 6.  CEF sends a close notification to the application's top-level window
+  ///     (because DoClose() returned false by default).
+  /// 7.  Application's top-level window receives the close notification and
+  ///     calls TryCloseBrowser(). TryCloseBrowser() returns true so the client
+  ///     allows the window close.
+  /// 8.  Application's top-level window is destroyed. 9.  Application's
+  /// on_before_close() handler is called and the browser object
+  ///     is destroyed.
+  /// 10. Application exits by calling cef_quit_message_loop() if no other
+  /// browsers
+  ///     exist.
+  ///
+  /// Example 2: Using cef_browser_host_t::CloseBrowser(false (0)) and
+  /// implementing the do_close() callback. This is recommended for clients
+  /// using non-standard close handling or windows that were not created on the
+  /// browser process UI thread. 1.  User clicks the window close button which
+  /// sends a close notification
+  ///     to the application's top-level window.
+  /// 2.  Application's top-level window receives the close notification and:
+  ///     A. Calls CefBrowserHost::CloseBrowser(false).
+  ///     B. Cancels the window close.
+  /// 3.  JavaScript 'onbeforeunload' handler executes and shows the close
+  ///     confirmation dialog (which can be overridden via
+  ///     CefJSDialogHandler::OnBeforeUnloadDialog()).
+  /// 4.  User approves the close. 5.  JavaScript 'onunload' handler executes.
+  /// 6.  Application's do_close() handler is called. Application will:
+  ///     A. Set a flag to indicate that the next close attempt will be allowed.
+  ///     B. Return false.
+  /// 7.  CEF sends an close notification to the application's top-level window.
+  /// 8.  Application's top-level window receives the close notification and
+  ///     allows the window to close based on the flag from #6B.
+  /// 9.  Application's top-level window is destroyed. 10. Application's
+  /// on_before_close() handler is called and the browser object
+  ///     is destroyed.
+  /// 11. Application exits by calling cef_quit_message_loop() if no other
+  /// browsers
+  ///     exist.
   ///
   int(CEF_CALLBACK* do_close)(struct _cef_life_span_handler_t* self,
                               struct _cef_browser_t* browser);
 
   ///
-  // Called just before a browser is destroyed. Release all references to the
-  // browser object and do not attempt to execute any functions on the browser
-  // object (other than GetIdentifier or IsSame) after this callback returns.
-  // This callback will be the last notification that references |browser| on
-  // the UI thread. Any in-progress network requests associated with |browser|
-  // will be aborted when the browser is destroyed, and
-  // cef_resource_request_handler_t callbacks related to those requests may
-  // still arrive on the IO thread after this function is called. See do_close()
-  // documentation for additional usage information.
+  /// Called just before a browser is destroyed. Release all references to the
+  /// browser object and do not attempt to execute any functions on the browser
+  /// object (other than IsValid, GetIdentifier or IsSame) after this callback
+  /// returns. cef_frame_handler_t callbacks related to final main frame
+  /// destruction will arrive after this callback and cef_browser_t::IsValid
+  /// will return false (0) at that time. Any in-progress network requests
+  /// associated with |browser| will be aborted when the browser is destroyed,
+  /// and cef_resource_request_handler_t callbacks related to those requests may
+  /// still arrive on the IO thread after this callback. See cef_frame_handler_t
+  /// and do_close() documentation for additional usage information.
   ///
   void(CEF_CALLBACK* on_before_close)(struct _cef_life_span_handler_t* self,
                                       struct _cef_browser_t* browser);
diff --git a/src/include/capi/cef_load_handler_capi.h b/src/include/capi/cef_load_handler_capi.h
index 186eea3..3667b86 100644
--- a/src/include/capi/cef_load_handler_capi.h
+++ b/src/include/capi/cef_load_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=fa3cb1461b9d363c6c7d961f9e291c2fe736170e$
+// $hash=1ee684174554f7d1cf8899992705d072c1c56ae7$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_LOAD_HANDLER_CAPI_H_
@@ -49,22 +49,22 @@
 #endif
 
 ///
-// Implement this structure to handle events related to browser load status. The
-// functions of this structure will be called on the browser process UI thread
-// or render process main thread (TID_RENDERER).
+/// Implement this structure to handle events related to browser load status.
+/// The functions of this structure will be called on the browser process UI
+/// thread or render process main thread (TID_RENDERER).
 ///
 typedef struct _cef_load_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called when the loading state has changed. This callback will be executed
-  // twice -- once when loading is initiated either programmatically or by user
-  // action, and once when loading is terminated due to completion, cancellation
-  // of failure. It will be called before any calls to OnLoadStart and after all
-  // calls to OnLoadError and/or OnLoadEnd.
+  /// Called when the loading state has changed. This callback will be executed
+  /// twice -- once when loading is initiated either programmatically or by user
+  /// action, and once when loading is terminated due to completion,
+  /// cancellation of failure. It will be called before any calls to OnLoadStart
+  /// and after all calls to OnLoadError and/or OnLoadEnd.
   ///
   void(CEF_CALLBACK* on_loading_state_change)(struct _cef_load_handler_t* self,
                                               struct _cef_browser_t* browser,
@@ -73,16 +73,16 @@
                                               int canGoForward);
 
   ///
-  // Called after a navigation has been committed and before the browser begins
-  // loading contents in the frame. The |frame| value will never be NULL -- call
-  // the is_main() function to check if this frame is the main frame.
-  // |transition_type| provides information about the source of the navigation
-  // and an accurate value is only available in the browser process. Multiple
-  // frames may be loading at the same time. Sub-frames may start or continue
-  // loading after the main frame load has ended. This function will not be
-  // called for same page navigations (fragments, history state, etc.) or for
-  // navigations that fail or are canceled before commit. For notification of
-  // overall browser load status use OnLoadingStateChange instead.
+  /// Called after a navigation has been committed and before the browser begins
+  /// loading contents in the frame. The |frame| value will never be NULL --
+  /// call the is_main() function to check if this frame is the main frame.
+  /// |transition_type| provides information about the source of the navigation
+  /// and an accurate value is only available in the browser process. Multiple
+  /// frames may be loading at the same time. Sub-frames may start or continue
+  /// loading after the main frame load has ended. This function will not be
+  /// called for same page navigations (fragments, history state, etc.) or for
+  /// navigations that fail or are canceled before commit. For notification of
+  /// overall browser load status use OnLoadingStateChange instead.
   ///
   void(CEF_CALLBACK* on_load_start)(struct _cef_load_handler_t* self,
                                     struct _cef_browser_t* browser,
@@ -90,14 +90,14 @@
                                     cef_transition_type_t transition_type);
 
   ///
-  // Called when the browser is done loading a frame. The |frame| value will
-  // never be NULL -- call the is_main() function to check if this frame is the
-  // main frame. Multiple frames may be loading at the same time. Sub-frames may
-  // start or continue loading after the main frame load has ended. This
-  // function will not be called for same page navigations (fragments, history
-  // state, etc.) or for navigations that fail or are canceled before commit.
-  // For notification of overall browser load status use OnLoadingStateChange
-  // instead.
+  /// Called when the browser is done loading a frame. The |frame| value will
+  /// never be NULL -- call the is_main() function to check if this frame is the
+  /// main frame. Multiple frames may be loading at the same time. Sub-frames
+  /// may start or continue loading after the main frame load has ended. This
+  /// function will not be called for same page navigations (fragments, history
+  /// state, etc.) or for navigations that fail or are canceled before commit.
+  /// For notification of overall browser load status use OnLoadingStateChange
+  /// instead.
   ///
   void(CEF_CALLBACK* on_load_end)(struct _cef_load_handler_t* self,
                                   struct _cef_browser_t* browser,
@@ -105,11 +105,11 @@
                                   int httpStatusCode);
 
   ///
-  // Called when a navigation fails or is canceled. This function may be called
-  // by itself if before commit or in combination with OnLoadStart/OnLoadEnd if
-  // after commit. |errorCode| is the error code number, |errorText| is the
-  // error text and |failedUrl| is the URL that failed to load. See
-  // net\base\net_error_list.h for complete descriptions of the error codes.
+  /// Called when a navigation fails or is canceled. This function may be called
+  /// by itself if before commit or in combination with OnLoadStart/OnLoadEnd if
+  /// after commit. |errorCode| is the error code number, |errorText| is the
+  /// error text and |failedUrl| is the URL that failed to load. See
+  /// net\base\net_error_list.h for complete descriptions of the error codes.
   ///
   void(CEF_CALLBACK* on_load_error)(struct _cef_load_handler_t* self,
                                     struct _cef_browser_t* browser,
diff --git a/src/include/capi/cef_media_access_handler_capi.h b/src/include/capi/cef_media_access_handler_capi.h
new file mode 100644
index 0000000..3b8c9a8
--- /dev/null
+++ b/src/include/capi/cef_media_access_handler_capi.h
@@ -0,0 +1,108 @@
+// Copyright (c) 2022 Marshall A. Greenblatt. 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 file was generated by the CEF translator tool and should not edited
+// by hand. See the translator.README.txt file in the tools directory for
+// more information.
+//
+// $hash=91101808168ec0faf1f39b1924579e31478a6616$
+//
+
+#ifndef CEF_INCLUDE_CAPI_CEF_MEDIA_ACCESS_HANDLER_CAPI_H_
+#define CEF_INCLUDE_CAPI_CEF_MEDIA_ACCESS_HANDLER_CAPI_H_
+#pragma once
+
+#include "include/capi/cef_base_capi.h"
+#include "include/capi/cef_browser_capi.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+///
+// Callback structure used for asynchronous continuation of media access
+// permission requests.
+///
+typedef struct _cef_media_access_callback_t {
+  ///
+  // Base structure.
+  ///
+  cef_base_ref_counted_t base;
+
+  ///
+  // Call to allow or deny media access. If this callback was initiated in
+  // response to a getUserMedia (indicated by
+  // CEF_MEDIA_PERMISSION_DEVICE_AUDIO_CAPTURE and/or
+  // CEF_MEDIA_PERMISSION_DEVICE_VIDEO_CAPTURE being set) the
+  // |allowed_permissions| are required to match those given in
+  // |required_permissions| in the OnRequestMediaAccessPermission.
+  ///
+  void(CEF_CALLBACK* cont)(struct _cef_media_access_callback_t* self,
+                           int allowed_permissions);
+
+  ///
+  // Cancel the media access request.
+  ///
+  void(CEF_CALLBACK* cancel)(struct _cef_media_access_callback_t* self);
+} cef_media_access_callback_t;
+
+///
+// Implement this structure to handle events related to media access permission
+// requests. The functions of this structure will be called on the browser
+// process UI thread.
+///
+typedef struct _cef_media_access_handler_t {
+  ///
+  // Base structure.
+  ///
+  cef_base_ref_counted_t base;
+
+  ///
+  // Called when a page requests permission to access media. |requesting_url| is
+  // the URL requesting permission. Return true (1) and call
+  // cef_media_access_callback_t::cont() either in this function or at a later
+  // time to continue or cancel the request. Return false (0) to cancel the
+  // request immediately.
+  ///
+  int(CEF_CALLBACK* on_request_media_access_permission)(
+      struct _cef_media_access_handler_t* self,
+      struct _cef_browser_t* browser,
+      struct _cef_frame_t* frame,
+      const cef_string_t* requesting_url,
+      int32_t requested_permissions,
+      struct _cef_media_access_callback_t* callback);
+} cef_media_access_handler_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // CEF_INCLUDE_CAPI_CEF_MEDIA_ACCESS_HANDLER_CAPI_H_
diff --git a/src/include/capi/cef_media_router_capi.h b/src/include/capi/cef_media_router_capi.h
index a26f12e..27f9d0e 100644
--- a/src/include/capi/cef_media_router_capi.h
+++ b/src/include/capi/cef_media_router_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=9d5077fdb3fe7fa0ff1141f839988ac821eba4bf$
+// $hash=de4a9b856c6951231f446991a9b1efb89096ad3b$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_MEDIA_ROUTER_CAPI_H_
@@ -41,6 +41,7 @@
 #pragma once
 
 #include "include/capi/cef_base_capi.h"
+#include "include/capi/cef_callback_capi.h"
 #include "include/capi/cef_registration_capi.h"
 
 #ifdef __cplusplus
@@ -55,46 +56,46 @@
 struct _cef_media_source_t;
 
 ///
-// Supports discovery of and communication with media devices on the local
-// network via the Cast and DIAL protocols. The functions of this structure may
-// be called on any browser process thread unless otherwise indicated.
+/// Supports discovery of and communication with media devices on the local
+/// network via the Cast and DIAL protocols. The functions of this structure may
+/// be called on any browser process thread unless otherwise indicated.
 ///
 typedef struct _cef_media_router_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Add an observer for MediaRouter events. The observer will remain registered
-  // until the returned Registration object is destroyed.
+  /// Add an observer for MediaRouter events. The observer will remain
+  /// registered until the returned Registration object is destroyed.
   ///
   struct _cef_registration_t*(CEF_CALLBACK* add_observer)(
       struct _cef_media_router_t* self,
       struct _cef_media_observer_t* observer);
 
   ///
-  // Returns a MediaSource object for the specified media source URN. Supported
-  // URN schemes include "cast:" and "dial:", and will be already known by the
-  // client application (e.g. "cast:<appId>?clientId=<clientId>").
+  /// Returns a MediaSource object for the specified media source URN. Supported
+  /// URN schemes include "cast:" and "dial:", and will be already known by the
+  /// client application (e.g. "cast:<appId>?clientId=<clientId>").
   ///
   struct _cef_media_source_t*(CEF_CALLBACK* get_source)(
       struct _cef_media_router_t* self,
       const cef_string_t* urn);
 
   ///
-  // Trigger an asynchronous call to cef_media_observer_t::OnSinks on all
-  // registered observers.
+  /// Trigger an asynchronous call to cef_media_observer_t::OnSinks on all
+  /// registered observers.
   ///
   void(CEF_CALLBACK* notify_current_sinks)(struct _cef_media_router_t* self);
 
   ///
-  // Create a new route between |source| and |sink|. Source and sink must be
-  // valid, compatible (as reported by cef_media_sink_t::IsCompatibleWith), and
-  // a route between them must not already exist. |callback| will be executed on
-  // success or failure. If route creation succeeds it will also trigger an
-  // asynchronous call to cef_media_observer_t::OnRoutes on all registered
-  // observers.
+  /// Create a new route between |source| and |sink|. Source and sink must be
+  /// valid, compatible (as reported by cef_media_sink_t::IsCompatibleWith), and
+  /// a route between them must not already exist. |callback| will be executed
+  /// on success or failure. If route creation succeeds it will also trigger an
+  /// asynchronous call to cef_media_observer_t::OnRoutes on all registered
+  /// observers.
   ///
   void(CEF_CALLBACK* create_route)(
       struct _cef_media_router_t* self,
@@ -103,48 +104,51 @@
       struct _cef_media_route_create_callback_t* callback);
 
   ///
-  // Trigger an asynchronous call to cef_media_observer_t::OnRoutes on all
-  // registered observers.
+  /// Trigger an asynchronous call to cef_media_observer_t::OnRoutes on all
+  /// registered observers.
   ///
   void(CEF_CALLBACK* notify_current_routes)(struct _cef_media_router_t* self);
 } cef_media_router_t;
 
 ///
-// Returns the MediaRouter object associated with the global request context.
-// Equivalent to calling cef_request_context_t::cef_request_context_get_global_c
-// ontext()->get_media_router().
+/// Returns the MediaRouter object associated with the global request context.
+/// If |callback| is non-NULL it will be executed asnychronously on the UI
+/// thread after the manager's storage has been initialized. Equivalent to
+/// calling cef_request_context_t::cef_request_context_get_global_context()->get
+/// _media_router().
 ///
-CEF_EXPORT cef_media_router_t* cef_media_router_get_global();
+CEF_EXPORT cef_media_router_t* cef_media_router_get_global(
+    struct _cef_completion_callback_t* callback);
 
 ///
-// Implemented by the client to observe MediaRouter events and registered via
-// cef_media_router_t::AddObserver. The functions of this structure will be
-// called on the browser process UI thread.
+/// Implemented by the client to observe MediaRouter events and registered via
+/// cef_media_router_t::AddObserver. The functions of this structure will be
+/// called on the browser process UI thread.
 ///
 typedef struct _cef_media_observer_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // The list of available media sinks has changed or
-  // cef_media_router_t::NotifyCurrentSinks was called.
+  /// The list of available media sinks has changed or
+  /// cef_media_router_t::NotifyCurrentSinks was called.
   ///
   void(CEF_CALLBACK* on_sinks)(struct _cef_media_observer_t* self,
                                size_t sinksCount,
                                struct _cef_media_sink_t* const* sinks);
 
   ///
-  // The list of available media routes has changed or
-  // cef_media_router_t::NotifyCurrentRoutes was called.
+  /// The list of available media routes has changed or
+  /// cef_media_router_t::NotifyCurrentRoutes was called.
   ///
   void(CEF_CALLBACK* on_routes)(struct _cef_media_observer_t* self,
                                 size_t routesCount,
                                 struct _cef_media_route_t* const* routes);
 
   ///
-  // The connection state of |route| has changed.
+  /// The connection state of |route| has changed.
   ///
   void(CEF_CALLBACK* on_route_state_changed)(
       struct _cef_media_observer_t* self,
@@ -152,8 +156,8 @@
       cef_media_route_connection_state_t state);
 
   ///
-  // A message was recieved over |route|. |message| is only valid for the scope
-  // of this callback and should be copied if necessary.
+  /// A message was recieved over |route|. |message| is only valid for the scope
+  /// of this callback and should be copied if necessary.
   ///
   void(CEF_CALLBACK* on_route_message_received)(
       struct _cef_media_observer_t* self,
@@ -163,65 +167,65 @@
 } cef_media_observer_t;
 
 ///
-// Represents the route between a media source and sink. Instances of this
-// object are created via cef_media_router_t::CreateRoute and retrieved via
-// cef_media_observer_t::OnRoutes. Contains the status and metadata of a routing
-// operation. The functions of this structure may be called on any browser
-// process thread unless otherwise indicated.
+/// Represents the route between a media source and sink. Instances of this
+/// object are created via cef_media_router_t::CreateRoute and retrieved via
+/// cef_media_observer_t::OnRoutes. Contains the status and metadata of a
+/// routing operation. The functions of this structure may be called on any
+/// browser process thread unless otherwise indicated.
 ///
 typedef struct _cef_media_route_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns the ID for this route.
+  /// Returns the ID for this route.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_id)(struct _cef_media_route_t* self);
 
   ///
-  // Returns the source associated with this route.
+  /// Returns the source associated with this route.
   ///
   struct _cef_media_source_t*(CEF_CALLBACK* get_source)(
       struct _cef_media_route_t* self);
 
   ///
-  // Returns the sink associated with this route.
+  /// Returns the sink associated with this route.
   ///
   struct _cef_media_sink_t*(CEF_CALLBACK* get_sink)(
       struct _cef_media_route_t* self);
 
   ///
-  // Send a message over this route. |message| will be copied if necessary.
+  /// Send a message over this route. |message| will be copied if necessary.
   ///
   void(CEF_CALLBACK* send_route_message)(struct _cef_media_route_t* self,
                                          const void* message,
                                          size_t message_size);
 
   ///
-  // Terminate this route. Will result in an asynchronous call to
-  // cef_media_observer_t::OnRoutes on all registered observers.
+  /// Terminate this route. Will result in an asynchronous call to
+  /// cef_media_observer_t::OnRoutes on all registered observers.
   ///
   void(CEF_CALLBACK* terminate)(struct _cef_media_route_t* self);
 } cef_media_route_t;
 
 ///
-// Callback structure for cef_media_router_t::CreateRoute. The functions of this
-// structure will be called on the browser process UI thread.
+/// Callback structure for cef_media_router_t::CreateRoute. The functions of
+/// this structure will be called on the browser process UI thread.
 ///
 typedef struct _cef_media_route_create_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Method that will be executed when the route creation has finished. |result|
-  // will be CEF_MRCR_OK if the route creation succeeded. |error| will be a
-  // description of the error if the route creation failed. |route| is the
-  // resulting route, or NULL if the route creation failed.
+  /// Method that will be executed when the route creation has finished.
+  /// |result| will be CEF_MRCR_OK if the route creation succeeded. |error| will
+  /// be a description of the error if the route creation failed. |route| is the
+  /// resulting route, or NULL if the route creation failed.
   ///
   void(CEF_CALLBACK* on_media_route_create_finished)(
       struct _cef_media_route_create_callback_t* self,
@@ -231,83 +235,71 @@
 } cef_media_route_create_callback_t;
 
 ///
-// Represents a sink to which media can be routed. Instances of this object are
-// retrieved via cef_media_observer_t::OnSinks. The functions of this structure
-// may be called on any browser process thread unless otherwise indicated.
+/// Represents a sink to which media can be routed. Instances of this object are
+/// retrieved via cef_media_observer_t::OnSinks. The functions of this structure
+/// may be called on any browser process thread unless otherwise indicated.
 ///
 typedef struct _cef_media_sink_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns the ID for this sink.
+  /// Returns the ID for this sink.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_id)(struct _cef_media_sink_t* self);
 
   ///
-  // Returns true (1) if this sink is valid.
-  ///
-  int(CEF_CALLBACK* is_valid)(struct _cef_media_sink_t* self);
-
-  ///
-  // Returns the name of this sink.
+  /// Returns the name of this sink.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_name)(struct _cef_media_sink_t* self);
 
   ///
-  // Returns the description of this sink.
-  ///
-  // The resulting string must be freed by calling cef_string_userfree_free().
-  cef_string_userfree_t(CEF_CALLBACK* get_description)(
-      struct _cef_media_sink_t* self);
-
-  ///
-  // Returns the icon type for this sink.
+  /// Returns the icon type for this sink.
   ///
   cef_media_sink_icon_type_t(CEF_CALLBACK* get_icon_type)(
       struct _cef_media_sink_t* self);
 
   ///
-  // Asynchronously retrieves device info.
+  /// Asynchronously retrieves device info.
   ///
   void(CEF_CALLBACK* get_device_info)(
       struct _cef_media_sink_t* self,
       struct _cef_media_sink_device_info_callback_t* callback);
 
   ///
-  // Returns true (1) if this sink accepts content via Cast.
+  /// Returns true (1) if this sink accepts content via Cast.
   ///
   int(CEF_CALLBACK* is_cast_sink)(struct _cef_media_sink_t* self);
 
   ///
-  // Returns true (1) if this sink accepts content via DIAL.
+  /// Returns true (1) if this sink accepts content via DIAL.
   ///
   int(CEF_CALLBACK* is_dial_sink)(struct _cef_media_sink_t* self);
 
   ///
-  // Returns true (1) if this sink is compatible with |source|.
+  /// Returns true (1) if this sink is compatible with |source|.
   ///
   int(CEF_CALLBACK* is_compatible_with)(struct _cef_media_sink_t* self,
                                         struct _cef_media_source_t* source);
 } cef_media_sink_t;
 
 ///
-// Callback structure for cef_media_sink_t::GetDeviceInfo. The functions of this
-// structure will be called on the browser process UI thread.
+/// Callback structure for cef_media_sink_t::GetDeviceInfo. The functions of
+/// this structure will be called on the browser process UI thread.
 ///
 typedef struct _cef_media_sink_device_info_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Method that will be executed asyncronously once device information has been
-  // retrieved.
+  /// Method that will be executed asyncronously once device information has
+  /// been retrieved.
   ///
   void(CEF_CALLBACK* on_media_sink_device_info)(
       struct _cef_media_sink_device_info_callback_t* self,
@@ -315,35 +307,30 @@
 } cef_media_sink_device_info_callback_t;
 
 ///
-// Represents a source from which media can be routed. Instances of this object
-// are retrieved via cef_media_router_t::GetSource. The functions of this
-// structure may be called on any browser process thread unless otherwise
-// indicated.
+/// Represents a source from which media can be routed. Instances of this object
+/// are retrieved via cef_media_router_t::GetSource. The functions of this
+/// structure may be called on any browser process thread unless otherwise
+/// indicated.
 ///
 typedef struct _cef_media_source_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns the ID (media source URN or URL) for this source.
+  /// Returns the ID (media source URN or URL) for this source.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_id)(struct _cef_media_source_t* self);
 
   ///
-  // Returns true (1) if this source is valid.
-  ///
-  int(CEF_CALLBACK* is_valid)(struct _cef_media_source_t* self);
-
-  ///
-  // Returns true (1) if this source outputs its content via Cast.
+  /// Returns true (1) if this source outputs its content via Cast.
   ///
   int(CEF_CALLBACK* is_cast_source)(struct _cef_media_source_t* self);
 
   ///
-  // Returns true (1) if this source outputs its content via DIAL.
+  /// Returns true (1) if this source outputs its content via DIAL.
   ///
   int(CEF_CALLBACK* is_dial_source)(struct _cef_media_source_t* self);
 } cef_media_source_t;
diff --git a/src/include/capi/cef_menu_model_capi.h b/src/include/capi/cef_menu_model_capi.h
index 6af46d0..8b5bd66 100644
--- a/src/include/capi/cef_menu_model_capi.h
+++ b/src/include/capi/cef_menu_model_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=cce24dba079162b10f359769eea176c4009b5ce5$
+// $hash=d70b78b8108bb08b4f53b2627ed4ebfdffece7c1$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_MENU_MODEL_CAPI_H_
@@ -48,54 +48,54 @@
 #endif
 
 ///
-// Supports creation and modification of menus. See cef_menu_id_t for the
-// command ids that have default implementations. All user-defined command ids
-// should be between MENU_ID_USER_FIRST and MENU_ID_USER_LAST. The functions of
-// this structure can only be accessed on the browser process the UI thread.
+/// Supports creation and modification of menus. See cef_menu_id_t for the
+/// command ids that have default implementations. All user-defined command ids
+/// should be between MENU_ID_USER_FIRST and MENU_ID_USER_LAST. The functions of
+/// this structure can only be accessed on the browser process the UI thread.
 ///
 typedef struct _cef_menu_model_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns true (1) if this menu is a submenu.
+  /// Returns true (1) if this menu is a submenu.
   ///
   int(CEF_CALLBACK* is_sub_menu)(struct _cef_menu_model_t* self);
 
   ///
-  // Clears the menu. Returns true (1) on success.
+  /// Clears the menu. Returns true (1) on success.
   ///
   int(CEF_CALLBACK* clear)(struct _cef_menu_model_t* self);
 
   ///
-  // Returns the number of items in this menu.
+  /// Returns the number of items in this menu.
   ///
-  int(CEF_CALLBACK* get_count)(struct _cef_menu_model_t* self);
+  size_t(CEF_CALLBACK* get_count)(struct _cef_menu_model_t* self);
 
   ///
-  // Add a separator to the menu. Returns true (1) on success.
+  /// Add a separator to the menu. Returns true (1) on success.
   ///
   int(CEF_CALLBACK* add_separator)(struct _cef_menu_model_t* self);
 
   ///
-  // Add an item to the menu. Returns true (1) on success.
+  /// Add an item to the menu. Returns true (1) on success.
   ///
   int(CEF_CALLBACK* add_item)(struct _cef_menu_model_t* self,
                               int command_id,
                               const cef_string_t* label);
 
   ///
-  // Add a check item to the menu. Returns true (1) on success.
+  /// Add a check item to the menu. Returns true (1) on success.
   ///
   int(CEF_CALLBACK* add_check_item)(struct _cef_menu_model_t* self,
                                     int command_id,
                                     const cef_string_t* label);
 
   ///
-  // Add a radio item to the menu. Only a single item with the specified
-  // |group_id| can be checked at a time. Returns true (1) on success.
+  /// Add a radio item to the menu. Only a single item with the specified
+  /// |group_id| can be checked at a time. Returns true (1) on success.
   ///
   int(CEF_CALLBACK* add_radio_item)(struct _cef_menu_model_t* self,
                                     int command_id,
@@ -103,7 +103,7 @@
                                     int group_id);
 
   ///
-  // Add a sub-menu to the menu. The new sub-menu is returned.
+  /// Add a sub-menu to the menu. The new sub-menu is returned.
   ///
   struct _cef_menu_model_t*(CEF_CALLBACK* add_sub_menu)(
       struct _cef_menu_model_t* self,
@@ -111,260 +111,266 @@
       const cef_string_t* label);
 
   ///
-  // Insert a separator in the menu at the specified |index|. Returns true (1)
-  // on success.
+  /// Insert a separator in the menu at the specified |index|. Returns true (1)
+  /// on success.
   ///
   int(CEF_CALLBACK* insert_separator_at)(struct _cef_menu_model_t* self,
-                                         int index);
+                                         size_t index);
 
   ///
-  // Insert an item in the menu at the specified |index|. Returns true (1) on
-  // success.
+  /// Insert an item in the menu at the specified |index|. Returns true (1) on
+  /// success.
   ///
   int(CEF_CALLBACK* insert_item_at)(struct _cef_menu_model_t* self,
-                                    int index,
+                                    size_t index,
                                     int command_id,
                                     const cef_string_t* label);
 
   ///
-  // Insert a check item in the menu at the specified |index|. Returns true (1)
-  // on success.
+  /// Insert a check item in the menu at the specified |index|. Returns true (1)
+  /// on success.
   ///
   int(CEF_CALLBACK* insert_check_item_at)(struct _cef_menu_model_t* self,
-                                          int index,
+                                          size_t index,
                                           int command_id,
                                           const cef_string_t* label);
 
   ///
-  // Insert a radio item in the menu at the specified |index|. Only a single
-  // item with the specified |group_id| can be checked at a time. Returns true
-  // (1) on success.
+  /// Insert a radio item in the menu at the specified |index|. Only a single
+  /// item with the specified |group_id| can be checked at a time. Returns true
+  /// (1) on success.
   ///
   int(CEF_CALLBACK* insert_radio_item_at)(struct _cef_menu_model_t* self,
-                                          int index,
+                                          size_t index,
                                           int command_id,
                                           const cef_string_t* label,
                                           int group_id);
 
   ///
-  // Insert a sub-menu in the menu at the specified |index|. The new sub-menu is
-  // returned.
+  /// Insert a sub-menu in the menu at the specified |index|. The new sub-menu
+  /// is returned.
   ///
   struct _cef_menu_model_t*(CEF_CALLBACK* insert_sub_menu_at)(
       struct _cef_menu_model_t* self,
-      int index,
+      size_t index,
       int command_id,
       const cef_string_t* label);
 
   ///
-  // Removes the item with the specified |command_id|. Returns true (1) on
-  // success.
+  /// Removes the item with the specified |command_id|. Returns true (1) on
+  /// success.
   ///
   int(CEF_CALLBACK* remove)(struct _cef_menu_model_t* self, int command_id);
 
   ///
-  // Removes the item at the specified |index|. Returns true (1) on success.
+  /// Removes the item at the specified |index|. Returns true (1) on success.
   ///
-  int(CEF_CALLBACK* remove_at)(struct _cef_menu_model_t* self, int index);
+  int(CEF_CALLBACK* remove_at)(struct _cef_menu_model_t* self, size_t index);
 
   ///
-  // Returns the index associated with the specified |command_id| or -1 if not
-  // found due to the command id not existing in the menu.
+  /// Returns the index associated with the specified |command_id| or -1 if not
+  /// found due to the command id not existing in the menu.
   ///
   int(CEF_CALLBACK* get_index_of)(struct _cef_menu_model_t* self,
                                   int command_id);
 
   ///
-  // Returns the command id at the specified |index| or -1 if not found due to
-  // invalid range or the index being a separator.
+  /// Returns the command id at the specified |index| or -1 if not found due to
+  /// invalid range or the index being a separator.
   ///
   int(CEF_CALLBACK* get_command_id_at)(struct _cef_menu_model_t* self,
-                                       int index);
+                                       size_t index);
 
   ///
-  // Sets the command id at the specified |index|. Returns true (1) on success.
+  /// Sets the command id at the specified |index|. Returns true (1) on success.
   ///
   int(CEF_CALLBACK* set_command_id_at)(struct _cef_menu_model_t* self,
-                                       int index,
+                                       size_t index,
                                        int command_id);
 
   ///
-  // Returns the label for the specified |command_id| or NULL if not found.
+  /// Returns the label for the specified |command_id| or NULL if not found.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_label)(struct _cef_menu_model_t* self,
                                                  int command_id);
 
   ///
-  // Returns the label at the specified |index| or NULL if not found due to
-  // invalid range or the index being a separator.
+  /// Returns the label at the specified |index| or NULL if not found due to
+  /// invalid range or the index being a separator.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(
-      CEF_CALLBACK* get_label_at)(struct _cef_menu_model_t* self, int index);
+      CEF_CALLBACK* get_label_at)(struct _cef_menu_model_t* self, size_t index);
 
   ///
-  // Sets the label for the specified |command_id|. Returns true (1) on success.
+  /// Sets the label for the specified |command_id|. Returns true (1) on
+  /// success.
   ///
   int(CEF_CALLBACK* set_label)(struct _cef_menu_model_t* self,
                                int command_id,
                                const cef_string_t* label);
 
   ///
-  // Set the label at the specified |index|. Returns true (1) on success.
+  /// Set the label at the specified |index|. Returns true (1) on success.
   ///
   int(CEF_CALLBACK* set_label_at)(struct _cef_menu_model_t* self,
-                                  int index,
+                                  size_t index,
                                   const cef_string_t* label);
 
   ///
-  // Returns the item type for the specified |command_id|.
+  /// Returns the item type for the specified |command_id|.
   ///
   cef_menu_item_type_t(CEF_CALLBACK* get_type)(struct _cef_menu_model_t* self,
                                                int command_id);
 
   ///
-  // Returns the item type at the specified |index|.
+  /// Returns the item type at the specified |index|.
   ///
   cef_menu_item_type_t(
-      CEF_CALLBACK* get_type_at)(struct _cef_menu_model_t* self, int index);
+      CEF_CALLBACK* get_type_at)(struct _cef_menu_model_t* self, size_t index);
 
   ///
-  // Returns the group id for the specified |command_id| or -1 if invalid.
+  /// Returns the group id for the specified |command_id| or -1 if invalid.
   ///
   int(CEF_CALLBACK* get_group_id)(struct _cef_menu_model_t* self,
                                   int command_id);
 
   ///
-  // Returns the group id at the specified |index| or -1 if invalid.
+  /// Returns the group id at the specified |index| or -1 if invalid.
   ///
-  int(CEF_CALLBACK* get_group_id_at)(struct _cef_menu_model_t* self, int index);
+  int(CEF_CALLBACK* get_group_id_at)(struct _cef_menu_model_t* self,
+                                     size_t index);
 
   ///
-  // Sets the group id for the specified |command_id|. Returns true (1) on
-  // success.
+  /// Sets the group id for the specified |command_id|. Returns true (1) on
+  /// success.
   ///
   int(CEF_CALLBACK* set_group_id)(struct _cef_menu_model_t* self,
                                   int command_id,
                                   int group_id);
 
   ///
-  // Sets the group id at the specified |index|. Returns true (1) on success.
+  /// Sets the group id at the specified |index|. Returns true (1) on success.
   ///
   int(CEF_CALLBACK* set_group_id_at)(struct _cef_menu_model_t* self,
-                                     int index,
+                                     size_t index,
                                      int group_id);
 
   ///
-  // Returns the submenu for the specified |command_id| or NULL if invalid.
+  /// Returns the submenu for the specified |command_id| or NULL if invalid.
   ///
   struct _cef_menu_model_t*(CEF_CALLBACK* get_sub_menu)(
       struct _cef_menu_model_t* self,
       int command_id);
 
   ///
-  // Returns the submenu at the specified |index| or NULL if invalid.
+  /// Returns the submenu at the specified |index| or NULL if invalid.
   ///
-  struct _cef_menu_model_t*(
-      CEF_CALLBACK* get_sub_menu_at)(struct _cef_menu_model_t* self, int index);
+  struct _cef_menu_model_t*(CEF_CALLBACK* get_sub_menu_at)(
+      struct _cef_menu_model_t* self,
+      size_t index);
 
   ///
-  // Returns true (1) if the specified |command_id| is visible.
+  /// Returns true (1) if the specified |command_id| is visible.
   ///
   int(CEF_CALLBACK* is_visible)(struct _cef_menu_model_t* self, int command_id);
 
   ///
-  // Returns true (1) if the specified |index| is visible.
+  /// Returns true (1) if the specified |index| is visible.
   ///
-  int(CEF_CALLBACK* is_visible_at)(struct _cef_menu_model_t* self, int index);
+  int(CEF_CALLBACK* is_visible_at)(struct _cef_menu_model_t* self,
+                                   size_t index);
 
   ///
-  // Change the visibility of the specified |command_id|. Returns true (1) on
-  // success.
+  /// Change the visibility of the specified |command_id|. Returns true (1) on
+  /// success.
   ///
   int(CEF_CALLBACK* set_visible)(struct _cef_menu_model_t* self,
                                  int command_id,
                                  int visible);
 
   ///
-  // Change the visibility at the specified |index|. Returns true (1) on
-  // success.
+  /// Change the visibility at the specified |index|. Returns true (1) on
+  /// success.
   ///
   int(CEF_CALLBACK* set_visible_at)(struct _cef_menu_model_t* self,
-                                    int index,
+                                    size_t index,
                                     int visible);
 
   ///
-  // Returns true (1) if the specified |command_id| is enabled.
+  /// Returns true (1) if the specified |command_id| is enabled.
   ///
   int(CEF_CALLBACK* is_enabled)(struct _cef_menu_model_t* self, int command_id);
 
   ///
-  // Returns true (1) if the specified |index| is enabled.
+  /// Returns true (1) if the specified |index| is enabled.
   ///
-  int(CEF_CALLBACK* is_enabled_at)(struct _cef_menu_model_t* self, int index);
+  int(CEF_CALLBACK* is_enabled_at)(struct _cef_menu_model_t* self,
+                                   size_t index);
 
   ///
-  // Change the enabled status of the specified |command_id|. Returns true (1)
-  // on success.
+  /// Change the enabled status of the specified |command_id|. Returns true (1)
+  /// on success.
   ///
   int(CEF_CALLBACK* set_enabled)(struct _cef_menu_model_t* self,
                                  int command_id,
                                  int enabled);
 
   ///
-  // Change the enabled status at the specified |index|. Returns true (1) on
-  // success.
+  /// Change the enabled status at the specified |index|. Returns true (1) on
+  /// success.
   ///
   int(CEF_CALLBACK* set_enabled_at)(struct _cef_menu_model_t* self,
-                                    int index,
+                                    size_t index,
                                     int enabled);
 
   ///
-  // Returns true (1) if the specified |command_id| is checked. Only applies to
-  // check and radio items.
+  /// Returns true (1) if the specified |command_id| is checked. Only applies to
+  /// check and radio items.
   ///
   int(CEF_CALLBACK* is_checked)(struct _cef_menu_model_t* self, int command_id);
 
   ///
-  // Returns true (1) if the specified |index| is checked. Only applies to check
-  // and radio items.
+  /// Returns true (1) if the specified |index| is checked. Only applies to
+  /// check and radio items.
   ///
-  int(CEF_CALLBACK* is_checked_at)(struct _cef_menu_model_t* self, int index);
+  int(CEF_CALLBACK* is_checked_at)(struct _cef_menu_model_t* self,
+                                   size_t index);
 
   ///
-  // Check the specified |command_id|. Only applies to check and radio items.
-  // Returns true (1) on success.
+  /// Check the specified |command_id|. Only applies to check and radio items.
+  /// Returns true (1) on success.
   ///
   int(CEF_CALLBACK* set_checked)(struct _cef_menu_model_t* self,
                                  int command_id,
                                  int checked);
 
   ///
-  // Check the specified |index|. Only applies to check and radio items. Returns
-  // true (1) on success.
+  /// Check the specified |index|. Only applies to check and radio items.
+  /// Returns true (1) on success.
   ///
   int(CEF_CALLBACK* set_checked_at)(struct _cef_menu_model_t* self,
-                                    int index,
+                                    size_t index,
                                     int checked);
 
   ///
-  // Returns true (1) if the specified |command_id| has a keyboard accelerator
-  // assigned.
+  /// Returns true (1) if the specified |command_id| has a keyboard accelerator
+  /// assigned.
   ///
   int(CEF_CALLBACK* has_accelerator)(struct _cef_menu_model_t* self,
                                      int command_id);
 
   ///
-  // Returns true (1) if the specified |index| has a keyboard accelerator
-  // assigned.
+  /// Returns true (1) if the specified |index| has a keyboard accelerator
+  /// assigned.
   ///
   int(CEF_CALLBACK* has_accelerator_at)(struct _cef_menu_model_t* self,
-                                        int index);
+                                        size_t index);
 
   ///
-  // Set the keyboard accelerator for the specified |command_id|. |key_code| can
-  // be any virtual key or character value. Returns true (1) on success.
+  /// Set the keyboard accelerator for the specified |command_id|. |key_code|
+  /// can be any virtual key or character value. Returns true (1) on success.
   ///
   int(CEF_CALLBACK* set_accelerator)(struct _cef_menu_model_t* self,
                                      int command_id,
@@ -374,33 +380,33 @@
                                      int alt_pressed);
 
   ///
-  // Set the keyboard accelerator at the specified |index|. |key_code| can be
-  // any virtual key or character value. Returns true (1) on success.
+  /// Set the keyboard accelerator at the specified |index|. |key_code| can be
+  /// any virtual key or character value. Returns true (1) on success.
   ///
   int(CEF_CALLBACK* set_accelerator_at)(struct _cef_menu_model_t* self,
-                                        int index,
+                                        size_t index,
                                         int key_code,
                                         int shift_pressed,
                                         int ctrl_pressed,
                                         int alt_pressed);
 
   ///
-  // Remove the keyboard accelerator for the specified |command_id|. Returns
-  // true (1) on success.
+  /// Remove the keyboard accelerator for the specified |command_id|. Returns
+  /// true (1) on success.
   ///
   int(CEF_CALLBACK* remove_accelerator)(struct _cef_menu_model_t* self,
                                         int command_id);
 
   ///
-  // Remove the keyboard accelerator at the specified |index|. Returns true (1)
-  // on success.
+  /// Remove the keyboard accelerator at the specified |index|. Returns true (1)
+  /// on success.
   ///
   int(CEF_CALLBACK* remove_accelerator_at)(struct _cef_menu_model_t* self,
-                                           int index);
+                                           size_t index);
 
   ///
-  // Retrieves the keyboard accelerator for the specified |command_id|. Returns
-  // true (1) on success.
+  /// Retrieves the keyboard accelerator for the specified |command_id|. Returns
+  /// true (1) on success.
   ///
   int(CEF_CALLBACK* get_accelerator)(struct _cef_menu_model_t* self,
                                      int command_id,
@@ -410,21 +416,21 @@
                                      int* alt_pressed);
 
   ///
-  // Retrieves the keyboard accelerator for the specified |index|. Returns true
-  // (1) on success.
+  /// Retrieves the keyboard accelerator for the specified |index|. Returns true
+  /// (1) on success.
   ///
   int(CEF_CALLBACK* get_accelerator_at)(struct _cef_menu_model_t* self,
-                                        int index,
+                                        size_t index,
                                         int* key_code,
                                         int* shift_pressed,
                                         int* ctrl_pressed,
                                         int* alt_pressed);
 
   ///
-  // Set the explicit color for |command_id| and |color_type| to |color|.
-  // Specify a |color| value of 0 to remove the explicit color. If no explicit
-  // color or default color is set for |color_type| then the system color will
-  // be used. Returns true (1) on success.
+  /// Set the explicit color for |command_id| and |color_type| to |color|.
+  /// Specify a |color| value of 0 to remove the explicit color. If no explicit
+  /// color or default color is set for |color_type| then the system color will
+  /// be used. Returns true (1) on success.
   ///
   int(CEF_CALLBACK* set_color)(struct _cef_menu_model_t* self,
                                int command_id,
@@ -432,11 +438,11 @@
                                cef_color_t color);
 
   ///
-  // Set the explicit color for |command_id| and |index| to |color|. Specify a
-  // |color| value of 0 to remove the explicit color. Specify an |index| value
-  // of -1 to set the default color for items that do not have an explicit color
-  // set. If no explicit color or default color is set for |color_type| then the
-  // system color will be used. Returns true (1) on success.
+  /// Set the explicit color for |command_id| and |index| to |color|. Specify a
+  /// |color| value of 0 to remove the explicit color. Specify an |index| value
+  /// of -1 to set the default color for items that do not have an explicit
+  /// color set. If no explicit color or default color is set for |color_type|
+  /// then the system color will be used. Returns true (1) on success.
   ///
   int(CEF_CALLBACK* set_color_at)(struct _cef_menu_model_t* self,
                                   int index,
@@ -444,9 +450,9 @@
                                   cef_color_t color);
 
   ///
-  // Returns in |color| the color that was explicitly set for |command_id| and
-  // |color_type|. If a color was not set then 0 will be returned in |color|.
-  // Returns true (1) on success.
+  /// Returns in |color| the color that was explicitly set for |command_id| and
+  /// |color_type|. If a color was not set then 0 will be returned in |color|.
+  /// Returns true (1) on success.
   ///
   int(CEF_CALLBACK* get_color)(struct _cef_menu_model_t* self,
                                int command_id,
@@ -454,10 +460,10 @@
                                cef_color_t* color);
 
   ///
-  // Returns in |color| the color that was explicitly set for |command_id| and
-  // |color_type|. Specify an |index| value of -1 to return the default color in
-  // |color|. If a color was not set then 0 will be returned in |color|. Returns
-  // true (1) on success.
+  /// Returns in |color| the color that was explicitly set for |command_id| and
+  /// |color_type|. Specify an |index| value of -1 to return the default color
+  /// in |color|. If a color was not set then 0 will be returned in |color|.
+  /// Returns true (1) on success.
   ///
   int(CEF_CALLBACK* get_color_at)(struct _cef_menu_model_t* self,
                                   int index,
@@ -465,33 +471,33 @@
                                   cef_color_t* color);
 
   ///
-  // Sets the font list for the specified |command_id|. If |font_list| is NULL
-  // the system font will be used. Returns true (1) on success. The format is
-  // "<FONT_FAMILY_LIST>,[STYLES] <SIZE>", where: - FONT_FAMILY_LIST is a comma-
-  // separated list of font family names, - STYLES is an optional space-
-  // separated list of style names (case-sensitive
-  //   "Bold" and "Italic" are supported), and
-  // - SIZE is an integer font size in pixels with the suffix "px".
-  //
-  // Here are examples of valid font description strings: - "Arial, Helvetica,
-  // Bold Italic 14px" - "Arial, 14px"
+  /// Sets the font list for the specified |command_id|. If |font_list| is NULL
+  /// the system font will be used. Returns true (1) on success. The format is
+  /// "<FONT_FAMILY_LIST>,[STYLES] <SIZE>", where: - FONT_FAMILY_LIST is a
+  /// comma-separated list of font family names, - STYLES is an optional space-
+  /// separated list of style names
+  ///   (case-sensitive "Bold" and "Italic" are supported), and
+  /// - SIZE is an integer font size in pixels with the suffix "px".
+  ///
+  /// Here are examples of valid font description strings: - "Arial, Helvetica,
+  /// Bold Italic 14px" - "Arial, 14px"
   ///
   int(CEF_CALLBACK* set_font_list)(struct _cef_menu_model_t* self,
                                    int command_id,
                                    const cef_string_t* font_list);
 
   ///
-  // Sets the font list for the specified |index|. Specify an |index| value of
-  // -1 to set the default font. If |font_list| is NULL the system font will be
-  // used. Returns true (1) on success. The format is
-  // "<FONT_FAMILY_LIST>,[STYLES] <SIZE>", where: - FONT_FAMILY_LIST is a comma-
-  // separated list of font family names, - STYLES is an optional space-
-  // separated list of style names (case-sensitive
-  //   "Bold" and "Italic" are supported), and
-  // - SIZE is an integer font size in pixels with the suffix "px".
-  //
-  // Here are examples of valid font description strings: - "Arial, Helvetica,
-  // Bold Italic 14px" - "Arial, 14px"
+  /// Sets the font list for the specified |index|. Specify an |index| value of
+  /// -1 to set the default font. If |font_list| is NULL the system font will be
+  /// used. Returns true (1) on success. The format is
+  /// "<FONT_FAMILY_LIST>,[STYLES] <SIZE>", where: - FONT_FAMILY_LIST is a
+  /// comma-separated list of font family names, - STYLES is an optional space-
+  /// separated list of style names
+  ///   (case-sensitive "Bold" and "Italic" are supported), and
+  /// - SIZE is an integer font size in pixels with the suffix "px".
+  ///
+  /// Here are examples of valid font description strings: - "Arial, Helvetica,
+  /// Bold Italic 14px" - "Arial, 14px"
   ///
   int(CEF_CALLBACK* set_font_list_at)(struct _cef_menu_model_t* self,
                                       int index,
@@ -499,7 +505,7 @@
 } cef_menu_model_t;
 
 ///
-// Create a new MenuModel with the specified |delegate|.
+/// Create a new MenuModel with the specified |delegate|.
 ///
 CEF_EXPORT cef_menu_model_t* cef_menu_model_create(
     struct _cef_menu_model_delegate_t* delegate);
diff --git a/src/include/capi/cef_menu_model_delegate_capi.h b/src/include/capi/cef_menu_model_delegate_capi.h
index 1d9b0f8..dd339c1 100644
--- a/src/include/capi/cef_menu_model_delegate_capi.h
+++ b/src/include/capi/cef_menu_model_delegate_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=071ec8a0e17d3b33acbf36c7ccc26d0995657cf3$
+// $hash=933a90dfb7b94a3aba7f2944e4540662dc8c79d7$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_MENU_MODEL_DELEGATE_CAPI_H_
@@ -49,19 +49,19 @@
 struct _cef_menu_model_t;
 
 ///
-// Implement this structure to handle menu model events. The functions of this
-// structure will be called on the browser process UI thread unless otherwise
-// indicated.
+/// Implement this structure to handle menu model events. The functions of this
+/// structure will be called on the browser process UI thread unless otherwise
+/// indicated.
 ///
 typedef struct _cef_menu_model_delegate_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Perform the action associated with the specified |command_id| and optional
-  // |event_flags|.
+  /// Perform the action associated with the specified |command_id| and optional
+  /// |event_flags|.
   ///
   void(CEF_CALLBACK* execute_command)(struct _cef_menu_model_delegate_t* self,
                                       struct _cef_menu_model_t* menu_model,
@@ -69,8 +69,8 @@
                                       cef_event_flags_t event_flags);
 
   ///
-  // Called when the user moves the mouse outside the menu and over the owning
-  // window.
+  /// Called when the user moves the mouse outside the menu and over the owning
+  /// window.
   ///
   void(CEF_CALLBACK* mouse_outside_menu)(
       struct _cef_menu_model_delegate_t* self,
@@ -78,8 +78,8 @@
       const cef_point_t* screen_point);
 
   ///
-  // Called on unhandled open submenu keyboard commands. |is_rtl| will be true
-  // (1) if the menu is displaying a right-to-left language.
+  /// Called on unhandled open submenu keyboard commands. |is_rtl| will be true
+  /// (1) if the menu is displaying a right-to-left language.
   ///
   void(CEF_CALLBACK* unhandled_open_submenu)(
       struct _cef_menu_model_delegate_t* self,
@@ -87,8 +87,8 @@
       int is_rtl);
 
   ///
-  // Called on unhandled close submenu keyboard commands. |is_rtl| will be true
-  // (1) if the menu is displaying a right-to-left language.
+  /// Called on unhandled close submenu keyboard commands. |is_rtl| will be true
+  /// (1) if the menu is displaying a right-to-left language.
   ///
   void(CEF_CALLBACK* unhandled_close_submenu)(
       struct _cef_menu_model_delegate_t* self,
@@ -96,20 +96,20 @@
       int is_rtl);
 
   ///
-  // The menu is about to show.
+  /// The menu is about to show.
   ///
   void(CEF_CALLBACK* menu_will_show)(struct _cef_menu_model_delegate_t* self,
                                      struct _cef_menu_model_t* menu_model);
 
   ///
-  // The menu has closed.
+  /// The menu has closed.
   ///
   void(CEF_CALLBACK* menu_closed)(struct _cef_menu_model_delegate_t* self,
                                   struct _cef_menu_model_t* menu_model);
 
   ///
-  // Optionally modify a menu item label. Return true (1) if |label| was
-  // modified.
+  /// Optionally modify a menu item label. Return true (1) if |label| was
+  /// modified.
   ///
   int(CEF_CALLBACK* format_label)(struct _cef_menu_model_delegate_t* self,
                                   struct _cef_menu_model_t* menu_model,
diff --git a/src/include/capi/cef_navigation_entry_capi.h b/src/include/capi/cef_navigation_entry_capi.h
index 6dc23c9..863c11d 100644
--- a/src/include/capi/cef_navigation_entry_capi.h
+++ b/src/include/capi/cef_navigation_entry_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=c6252024911652a4881d753aeeeb2615e6be3904$
+// $hash=d33771c31b7b0964aa2ccf1c2bc2ca1226194977$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_NAVIGATION_ENTRY_CAPI_H_
@@ -48,78 +48,79 @@
 #endif
 
 ///
-// Structure used to represent an entry in navigation history.
+/// Structure used to represent an entry in navigation history.
 ///
 typedef struct _cef_navigation_entry_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns true (1) if this object is valid. Do not call any other functions
-  // if this function returns false (0).
+  /// Returns true (1) if this object is valid. Do not call any other functions
+  /// if this function returns false (0).
   ///
   int(CEF_CALLBACK* is_valid)(struct _cef_navigation_entry_t* self);
 
   ///
-  // Returns the actual URL of the page. For some pages this may be data: URL or
-  // similar. Use get_display_url() to return a display-friendly version.
+  /// Returns the actual URL of the page. For some pages this may be data: URL
+  /// or similar. Use get_display_url() to return a display-friendly version.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_url)(
       struct _cef_navigation_entry_t* self);
 
   ///
-  // Returns a display-friendly version of the URL.
+  /// Returns a display-friendly version of the URL.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_display_url)(
       struct _cef_navigation_entry_t* self);
 
   ///
-  // Returns the original URL that was entered by the user before any redirects.
+  /// Returns the original URL that was entered by the user before any
+  /// redirects.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_original_url)(
       struct _cef_navigation_entry_t* self);
 
   ///
-  // Returns the title set by the page. This value may be NULL.
+  /// Returns the title set by the page. This value may be NULL.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_title)(
       struct _cef_navigation_entry_t* self);
 
   ///
-  // Returns the transition type which indicates what the user did to move to
-  // this page from the previous page.
+  /// Returns the transition type which indicates what the user did to move to
+  /// this page from the previous page.
   ///
   cef_transition_type_t(CEF_CALLBACK* get_transition_type)(
       struct _cef_navigation_entry_t* self);
 
   ///
-  // Returns true (1) if this navigation includes post data.
+  /// Returns true (1) if this navigation includes post data.
   ///
   int(CEF_CALLBACK* has_post_data)(struct _cef_navigation_entry_t* self);
 
   ///
-  // Returns the time for the last known successful navigation completion. A
-  // navigation may be completed more than once if the page is reloaded. May be
-  // 0 if the navigation has not yet completed.
+  /// Returns the time for the last known successful navigation completion. A
+  /// navigation may be completed more than once if the page is reloaded. May be
+  /// 0 if the navigation has not yet completed.
   ///
-  cef_time_t(CEF_CALLBACK* get_completion_time)(
+  cef_basetime_t(CEF_CALLBACK* get_completion_time)(
       struct _cef_navigation_entry_t* self);
 
   ///
-  // Returns the HTTP status code for the last known successful navigation
-  // response. May be 0 if the response has not yet been received or if the
-  // navigation has not yet completed.
+  /// Returns the HTTP status code for the last known successful navigation
+  /// response. May be 0 if the response has not yet been received or if the
+  /// navigation has not yet completed.
   ///
   int(CEF_CALLBACK* get_http_status_code)(struct _cef_navigation_entry_t* self);
 
   ///
-  // Returns the SSL information for this navigation entry.
+  /// Returns the SSL information for this navigation entry.
   ///
   struct _cef_sslstatus_t*(CEF_CALLBACK* get_sslstatus)(
       struct _cef_navigation_entry_t* self);
diff --git a/src/include/capi/cef_origin_whitelist_capi.h b/src/include/capi/cef_origin_whitelist_capi.h
index 6742165..f10a37a 100644
--- a/src/include/capi/cef_origin_whitelist_capi.h
+++ b/src/include/capi/cef_origin_whitelist_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=8a26e2f8273298dcf44d6fbf32fd565f6aaa912c$
+// $hash=9330c709713a10c1e6b55278428e65c07f4c9dfb$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_ORIGIN_WHITELIST_CAPI_H_
@@ -47,40 +47,41 @@
 #endif
 
 ///
-// Add an entry to the cross-origin access whitelist.
-//
-// The same-origin policy restricts how scripts hosted from different origins
-// (scheme + domain + port) can communicate. By default, scripts can only access
-// resources with the same origin. Scripts hosted on the HTTP and HTTPS schemes
-// (but no other schemes) can use the "Access-Control-Allow-Origin" header to
-// allow cross-origin requests. For example, https://source.example.com can make
-// XMLHttpRequest requests on http://target.example.com if the
-// http://target.example.com request returns an "Access-Control-Allow-Origin:
-// https://source.example.com" response header.
-//
-// Scripts in separate frames or iframes and hosted from the same protocol and
-// domain suffix can execute cross-origin JavaScript if both pages set the
-// document.domain value to the same domain suffix. For example,
-// scheme://foo.example.com and scheme://bar.example.com can communicate using
-// JavaScript if both domains set document.domain="example.com".
-//
-// This function is used to allow access to origins that would otherwise violate
-// the same-origin policy. Scripts hosted underneath the fully qualified
-// |source_origin| URL (like http://www.example.com) will be allowed access to
-// all resources hosted on the specified |target_protocol| and |target_domain|.
-// If |target_domain| is non-NULL and |allow_target_subdomains| if false (0)
-// only exact domain matches will be allowed. If |target_domain| contains a top-
-// level domain component (like "example.com") and |allow_target_subdomains| is
-// true (1) sub-domain matches will be allowed. If |target_domain| is NULL and
-// |allow_target_subdomains| if true (1) all domains and IP addresses will be
-// allowed.
-//
-// This function cannot be used to bypass the restrictions on local or display
-// isolated schemes. See the comments on CefRegisterCustomScheme for more
-// information.
-//
-// This function may be called on any thread. Returns false (0) if
-// |source_origin| is invalid or the whitelist cannot be accessed.
+/// Add an entry to the cross-origin access whitelist.
+///
+/// The same-origin policy restricts how scripts hosted from different origins
+/// (scheme + domain + port) can communicate. By default, scripts can only
+/// access resources with the same origin. Scripts hosted on the HTTP and HTTPS
+/// schemes (but no other schemes) can use the "Access-Control-Allow-Origin"
+/// header to allow cross-origin requests. For example,
+/// https://source.example.com can make XMLHttpRequest requests on
+/// http://target.example.com if the http://target.example.com request returns
+/// an "Access-Control-Allow-Origin: https://source.example.com" response
+/// header.
+///
+/// Scripts in separate frames or iframes and hosted from the same protocol and
+/// domain suffix can execute cross-origin JavaScript if both pages set the
+/// document.domain value to the same domain suffix. For example,
+/// scheme://foo.example.com and scheme://bar.example.com can communicate using
+/// JavaScript if both domains set document.domain="example.com".
+///
+/// This function is used to allow access to origins that would otherwise
+/// violate the same-origin policy. Scripts hosted underneath the fully
+/// qualified |source_origin| URL (like http://www.example.com) will be allowed
+/// access to all resources hosted on the specified |target_protocol| and
+/// |target_domain|. If |target_domain| is non-NULL and
+/// |allow_target_subdomains| is false (0) only exact domain matches will be
+/// allowed. If |target_domain| contains a top- level domain component (like
+/// "example.com") and |allow_target_subdomains| is true (1) sub-domain matches
+/// will be allowed. If |target_domain| is NULL and |allow_target_subdomains| if
+/// true (1) all domains and IP addresses will be allowed.
+///
+/// This function cannot be used to bypass the restrictions on local or display
+/// isolated schemes. See the comments on CefRegisterCustomScheme for more
+/// information.
+///
+/// This function may be called on any thread. Returns false (0) if
+/// |source_origin| is invalid or the whitelist cannot be accessed.
 ///
 CEF_EXPORT int cef_add_cross_origin_whitelist_entry(
     const cef_string_t* source_origin,
@@ -89,8 +90,8 @@
     int allow_target_subdomains);
 
 ///
-// Remove an entry from the cross-origin access whitelist. Returns false (0) if
-// |source_origin| is invalid or the whitelist cannot be accessed.
+/// Remove an entry from the cross-origin access whitelist. Returns false (0) if
+/// |source_origin| is invalid or the whitelist cannot be accessed.
 ///
 CEF_EXPORT int cef_remove_cross_origin_whitelist_entry(
     const cef_string_t* source_origin,
@@ -99,10 +100,10 @@
     int allow_target_subdomains);
 
 ///
-// Remove all entries from the cross-origin access whitelist. Returns false (0)
-// if the whitelist cannot be accessed.
+/// Remove all entries from the cross-origin access whitelist. Returns false (0)
+/// if the whitelist cannot be accessed.
 ///
-CEF_EXPORT int cef_clear_cross_origin_whitelist();
+CEF_EXPORT int cef_clear_cross_origin_whitelist(void);
 
 #ifdef __cplusplus
 }
diff --git a/src/include/capi/cef_parser_capi.h b/src/include/capi/cef_parser_capi.h
index 51e51bb..a6410c2 100644
--- a/src/include/capi/cef_parser_capi.h
+++ b/src/include/capi/cef_parser_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=14cf03e02d8ca3416e65f756470afd8185c7bc78$
+// $hash=5d6dad4bfaeef0117d068b6e67a8da7490fe7c2d$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_PARSER_CAPI_H_
@@ -47,84 +47,92 @@
 #endif
 
 ///
-// Parse the specified |url| into its component parts. Returns false (0) if the
-// URL is NULL or invalid.
+/// Combines specified |base_url| and |relative_url| into |resolved_url|.
+/// Returns false (0) if one of the URLs is NULL or invalid.
+///
+CEF_EXPORT int cef_resolve_url(const cef_string_t* base_url,
+                               const cef_string_t* relative_url,
+                               cef_string_t* resolved_url);
+
+///
+/// Parse the specified |url| into its component parts. Returns false (0) if the
+/// URL is NULL or invalid.
 ///
 CEF_EXPORT int cef_parse_url(const cef_string_t* url,
                              struct _cef_urlparts_t* parts);
 
 ///
-// Creates a URL from the specified |parts|, which must contain a non-NULL spec
-// or a non-NULL host and path (at a minimum), but not both. Returns false (0)
-// if |parts| isn't initialized as described.
+/// Creates a URL from the specified |parts|, which must contain a non-NULL spec
+/// or a non-NULL host and path (at a minimum), but not both. Returns false (0)
+/// if |parts| isn't initialized as described.
 ///
 CEF_EXPORT int cef_create_url(const struct _cef_urlparts_t* parts,
                               cef_string_t* url);
 
 ///
-// This is a convenience function for formatting a URL in a concise and human-
-// friendly way to help users make security-related decisions (or in other
-// circumstances when people need to distinguish sites, origins, or otherwise-
-// simplified URLs from each other). Internationalized domain names (IDN) may be
-// presented in Unicode if the conversion is considered safe. The returned value
-// will (a) omit the path for standard schemes, excepting file and filesystem,
-// and (b) omit the port if it is the default for the scheme. Do not use this
-// for URLs which will be parsed or sent to other applications.
+/// This is a convenience function for formatting a URL in a concise and human-
+/// friendly way to help users make security-related decisions (or in other
+/// circumstances when people need to distinguish sites, origins, or otherwise-
+/// simplified URLs from each other). Internationalized domain names (IDN) may
+/// be presented in Unicode if the conversion is considered safe. The returned
+/// value will (a) omit the path for standard schemes, excepting file and
+/// filesystem, and (b) omit the port if it is the default for the scheme. Do
+/// not use this for URLs which will be parsed or sent to other applications.
 ///
 // The resulting string must be freed by calling cef_string_userfree_free().
 CEF_EXPORT cef_string_userfree_t
 cef_format_url_for_security_display(const cef_string_t* origin_url);
 
 ///
-// Returns the mime type for the specified file extension or an NULL string if
-// unknown.
+/// Returns the mime type for the specified file extension or an NULL string if
+/// unknown.
 ///
 // The resulting string must be freed by calling cef_string_userfree_free().
 CEF_EXPORT cef_string_userfree_t
 cef_get_mime_type(const cef_string_t* extension);
 
 ///
-// Get the extensions associated with the given mime type. This should be passed
-// in lower case. There could be multiple extensions for a given mime type, like
-// "html,htm" for "text/html", or "txt,text,html,..." for "text/*". Any existing
-// elements in the provided vector will not be erased.
+/// Get the extensions associated with the given mime type. This should be
+/// passed in lower case. There could be multiple extensions for a given mime
+/// type, like "html,htm" for "text/html", or "txt,text,html,..." for "text/*".
+/// Any existing elements in the provided vector will not be erased.
 ///
 CEF_EXPORT void cef_get_extensions_for_mime_type(const cef_string_t* mime_type,
                                                  cef_string_list_t extensions);
 
 ///
-// Encodes |data| as a base64 string.
+/// Encodes |data| as a base64 string.
 ///
 // The resulting string must be freed by calling cef_string_userfree_free().
 CEF_EXPORT cef_string_userfree_t cef_base64encode(const void* data,
                                                   size_t data_size);
 
 ///
-// Decodes the base64 encoded string |data|. The returned value will be NULL if
-// the decoding fails.
+/// Decodes the base64 encoded string |data|. The returned value will be NULL if
+/// the decoding fails.
 ///
 CEF_EXPORT struct _cef_binary_value_t* cef_base64decode(
     const cef_string_t* data);
 
 ///
-// Escapes characters in |text| which are unsuitable for use as a query
-// parameter value. Everything except alphanumerics and -_.!~*'() will be
-// converted to "%XX". If |use_plus| is true (1) spaces will change to "+". The
-// result is basically the same as encodeURIComponent in Javacript.
+/// Escapes characters in |text| which are unsuitable for use as a query
+/// parameter value. Everything except alphanumerics and -_.!~*'() will be
+/// converted to "%XX". If |use_plus| is true (1) spaces will change to "+". The
+/// result is basically the same as encodeURIComponent in Javacript.
 ///
 // The resulting string must be freed by calling cef_string_userfree_free().
 CEF_EXPORT cef_string_userfree_t cef_uriencode(const cef_string_t* text,
                                                int use_plus);
 
 ///
-// Unescapes |text| and returns the result. Unescaping consists of looking for
-// the exact pattern "%XX" where each X is a hex digit and converting to the
-// character with the numerical value of those digits (e.g. "i%20=%203%3b"
-// unescapes to "i = 3;"). If |convert_to_utf8| is true (1) this function will
-// attempt to interpret the initial decoded result as UTF-8. If the result is
-// convertable into UTF-8 it will be returned as converted. Otherwise the
-// initial decoded result will be returned.  The |unescape_rule| parameter
-// supports further customization the decoding process.
+/// Unescapes |text| and returns the result. Unescaping consists of looking for
+/// the exact pattern "%XX" where each X is a hex digit and converting to the
+/// character with the numerical value of those digits (e.g. "i%20=%203%3b"
+/// unescapes to "i = 3;"). If |convert_to_utf8| is true (1) this function will
+/// attempt to interpret the initial decoded result as UTF-8. If the result is
+/// convertable into UTF-8 it will be returned as converted. Otherwise the
+/// initial decoded result will be returned.  The |unescape_rule| parameter
+/// supports further customization the decoding process.
 ///
 // The resulting string must be freed by calling cef_string_userfree_free().
 CEF_EXPORT cef_string_userfree_t
@@ -133,17 +141,17 @@
               cef_uri_unescape_rule_t unescape_rule);
 
 ///
-// Parses the specified |json_string| and returns a dictionary or list
-// representation. If JSON parsing fails this function returns NULL.
+/// Parses the specified |json_string| and returns a dictionary or list
+/// representation. If JSON parsing fails this function returns NULL.
 ///
 CEF_EXPORT struct _cef_value_t* cef_parse_json(
     const cef_string_t* json_string,
     cef_json_parser_options_t options);
 
 ///
-// Parses the specified UTF8-encoded |json| buffer of size |json_size| and
-// returns a dictionary or list representation. If JSON parsing fails this
-// function returns NULL.
+/// Parses the specified UTF8-encoded |json| buffer of size |json_size| and
+/// returns a dictionary or list representation. If JSON parsing fails this
+/// function returns NULL.
 ///
 CEF_EXPORT struct _cef_value_t* cef_parse_json_buffer(
     const void* json,
@@ -151,21 +159,19 @@
     cef_json_parser_options_t options);
 
 ///
-// Parses the specified |json_string| and returns a dictionary or list
-// representation. If JSON parsing fails this function returns NULL and
-// populates |error_code_out| and |error_msg_out| with an error code and a
-// formatted error message respectively.
+/// Parses the specified |json_string| and returns a dictionary or list
+/// representation. If JSON parsing fails this function returns NULL and
+/// populates |error_msg_out| with a formatted error message.
 ///
 CEF_EXPORT struct _cef_value_t* cef_parse_jsonand_return_error(
     const cef_string_t* json_string,
     cef_json_parser_options_t options,
-    cef_json_parser_error_t* error_code_out,
     cef_string_t* error_msg_out);
 
 ///
-// Generates a JSON string from the specified root |node| which should be a
-// dictionary or list value. Returns an NULL string on failure. This function
-// requires exclusive access to |node| including any underlying data.
+/// Generates a JSON string from the specified root |node| which should be a
+/// dictionary or list value. Returns an NULL string on failure. This function
+/// requires exclusive access to |node| including any underlying data.
 ///
 // The resulting string must be freed by calling cef_string_userfree_free().
 CEF_EXPORT cef_string_userfree_t
diff --git a/src/include/capi/cef_path_util_capi.h b/src/include/capi/cef_path_util_capi.h
index f4405be..5706b83 100644
--- a/src/include/capi/cef_path_util_capi.h
+++ b/src/include/capi/cef_path_util_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=1b218a91d7f3ba0e68f0c3be21a0df91e515d28a$
+// $hash=70b306534b9cb8334c9ea260feacfd8f2f503292$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_PATH_UTIL_CAPI_H_
@@ -47,8 +47,8 @@
 #endif
 
 ///
-// Retrieve the path associated with the specified |key|. Returns true (1) on
-// success. Can be called on any thread in the browser process.
+/// Retrieve the path associated with the specified |key|. Returns true (1) on
+/// success. Can be called on any thread in the browser process.
 ///
 CEF_EXPORT int cef_get_path(cef_path_key_t key, cef_string_t* path);
 
diff --git a/src/include/capi/cef_permission_handler_capi.h b/src/include/capi/cef_permission_handler_capi.h
new file mode 100644
index 0000000..44f211a
--- /dev/null
+++ b/src/include/capi/cef_permission_handler_capi.h
@@ -0,0 +1,164 @@
+// Copyright (c) 2023 Marshall A. Greenblatt. 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 file was generated by the CEF translator tool and should not edited
+// by hand. See the translator.README.txt file in the tools directory for
+// more information.
+//
+// $hash=012d76416d19b590f29c013c44ceec1674593022$
+//
+
+#ifndef CEF_INCLUDE_CAPI_CEF_PERMISSION_HANDLER_CAPI_H_
+#define CEF_INCLUDE_CAPI_CEF_PERMISSION_HANDLER_CAPI_H_
+#pragma once
+
+#include "include/capi/cef_base_capi.h"
+#include "include/capi/cef_browser_capi.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+///
+/// Callback structure used for asynchronous continuation of media access
+/// permission requests.
+///
+typedef struct _cef_media_access_callback_t {
+  ///
+  /// Base structure.
+  ///
+  cef_base_ref_counted_t base;
+
+  ///
+  /// Call to allow or deny media access. If this callback was initiated in
+  /// response to a getUserMedia (indicated by
+  /// CEF_MEDIA_PERMISSION_DEVICE_AUDIO_CAPTURE and/or
+  /// CEF_MEDIA_PERMISSION_DEVICE_VIDEO_CAPTURE being set) then
+  /// |allowed_permissions| must match |required_permissions| passed to
+  /// OnRequestMediaAccessPermission.
+  ///
+  void(CEF_CALLBACK* cont)(struct _cef_media_access_callback_t* self,
+                           uint32_t allowed_permissions);
+
+  ///
+  /// Cancel the media access request.
+  ///
+  void(CEF_CALLBACK* cancel)(struct _cef_media_access_callback_t* self);
+} cef_media_access_callback_t;
+
+///
+/// Callback structure used for asynchronous continuation of permission prompts.
+///
+typedef struct _cef_permission_prompt_callback_t {
+  ///
+  /// Base structure.
+  ///
+  cef_base_ref_counted_t base;
+
+  ///
+  /// Complete the permissions request with the specified |result|.
+  ///
+  void(CEF_CALLBACK* cont)(struct _cef_permission_prompt_callback_t* self,
+                           cef_permission_request_result_t result);
+} cef_permission_prompt_callback_t;
+
+///
+/// Implement this structure to handle events related to permission requests.
+/// The functions of this structure will be called on the browser process UI
+/// thread.
+///
+typedef struct _cef_permission_handler_t {
+  ///
+  /// Base structure.
+  ///
+  cef_base_ref_counted_t base;
+
+  ///
+  /// Called when a page requests permission to access media.
+  /// |requesting_origin| is the URL origin requesting permission.
+  /// |requested_permissions| is a combination of values from
+  /// cef_media_access_permission_types_t that represent the requested
+  /// permissions. Return true (1) and call cef_media_access_callback_t
+  /// functions either in this function or at a later time to continue or cancel
+  /// the request. Return false (0) to proceed with default handling. With the
+  /// Chrome runtime, default handling will display the permission request UI.
+  /// With the Alloy runtime, default handling will deny the request. This
+  /// function will not be called if the "--enable-media-stream" command-line
+  /// switch is used to grant all permissions.
+  ///
+  int(CEF_CALLBACK* on_request_media_access_permission)(
+      struct _cef_permission_handler_t* self,
+      struct _cef_browser_t* browser,
+      struct _cef_frame_t* frame,
+      const cef_string_t* requesting_origin,
+      uint32_t requested_permissions,
+      struct _cef_media_access_callback_t* callback);
+
+  ///
+  /// Called when a page should show a permission prompt. |prompt_id| uniquely
+  /// identifies the prompt. |requesting_origin| is the URL origin requesting
+  /// permission. |requested_permissions| is a combination of values from
+  /// cef_permission_request_types_t that represent the requested permissions.
+  /// Return true (1) and call cef_permission_prompt_callback_t::Continue either
+  /// in this function or at a later time to continue or cancel the request.
+  /// Return false (0) to proceed with default handling. With the Chrome
+  /// runtime, default handling will display the permission prompt UI. With the
+  /// Alloy runtime, default handling is CEF_PERMISSION_RESULT_IGNORE.
+  ///
+  int(CEF_CALLBACK* on_show_permission_prompt)(
+      struct _cef_permission_handler_t* self,
+      struct _cef_browser_t* browser,
+      uint64_t prompt_id,
+      const cef_string_t* requesting_origin,
+      uint32_t requested_permissions,
+      struct _cef_permission_prompt_callback_t* callback);
+
+  ///
+  /// Called when a permission prompt handled via OnShowPermissionPrompt is
+  /// dismissed. |prompt_id| will match the value that was passed to
+  /// OnShowPermissionPrompt. |result| will be the value passed to
+  /// cef_permission_prompt_callback_t::Continue or CEF_PERMISSION_RESULT_IGNORE
+  /// if the dialog was dismissed for other reasons such as navigation, browser
+  /// closure, etc. This function will not be called if OnShowPermissionPrompt
+  /// returned false (0) for |prompt_id|.
+  ///
+  void(CEF_CALLBACK* on_dismiss_permission_prompt)(
+      struct _cef_permission_handler_t* self,
+      struct _cef_browser_t* browser,
+      uint64_t prompt_id,
+      cef_permission_request_result_t result);
+} cef_permission_handler_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // CEF_INCLUDE_CAPI_CEF_PERMISSION_HANDLER_CAPI_H_
diff --git a/src/include/capi/cef_preference_capi.h b/src/include/capi/cef_preference_capi.h
new file mode 100644
index 0000000..fa6d9bd
--- /dev/null
+++ b/src/include/capi/cef_preference_capi.h
@@ -0,0 +1,148 @@
+// Copyright (c) 2023 Marshall A. Greenblatt. 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 file was generated by the CEF translator tool and should not edited
+// by hand. See the translator.README.txt file in the tools directory for
+// more information.
+//
+// $hash=922659242ea25c52d02884a7cc5918d086cbfaca$
+//
+
+#ifndef CEF_INCLUDE_CAPI_CEF_PREFERENCE_CAPI_H_
+#define CEF_INCLUDE_CAPI_CEF_PREFERENCE_CAPI_H_
+#pragma once
+
+#include "include/capi/cef_base_capi.h"
+#include "include/capi/cef_values_capi.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+///
+/// Structure that manages custom preference registrations.
+///
+typedef struct _cef_preference_registrar_t {
+  ///
+  /// Base structure.
+  ///
+  cef_base_scoped_t base;
+
+  ///
+  /// Register a preference with the specified |name| and |default_value|. To
+  /// avoid conflicts with built-in preferences the |name| value should contain
+  /// an application-specific prefix followed by a period (e.g. "myapp.value").
+  /// The contents of |default_value| will be copied. The data type for the
+  /// preference will be inferred from |default_value|'s type and cannot be
+  /// changed after registration. Returns true (1) on success. Returns false (0)
+  /// if |name| is already registered or if |default_value| has an invalid type.
+  /// This function must be called from within the scope of the
+  /// cef_browser_process_handler_t::OnRegisterCustomPreferences callback.
+  ///
+  int(CEF_CALLBACK* add_preference)(struct _cef_preference_registrar_t* self,
+                                    const cef_string_t* name,
+                                    struct _cef_value_t* default_value);
+} cef_preference_registrar_t;
+
+///
+/// Manage access to preferences. Many built-in preferences are registered by
+/// Chromium. Custom preferences can be registered in
+/// cef_browser_process_handler_t::OnRegisterCustomPreferences.
+///
+typedef struct _cef_preference_manager_t {
+  ///
+  /// Base structure.
+  ///
+  cef_base_ref_counted_t base;
+
+  ///
+  /// Returns true (1) if a preference with the specified |name| exists. This
+  /// function must be called on the browser process UI thread.
+  ///
+  int(CEF_CALLBACK* has_preference)(struct _cef_preference_manager_t* self,
+                                    const cef_string_t* name);
+
+  ///
+  /// Returns the value for the preference with the specified |name|. Returns
+  /// NULL if the preference does not exist. The returned object contains a copy
+  /// of the underlying preference value and modifications to the returned
+  /// object will not modify the underlying preference value. This function must
+  /// be called on the browser process UI thread.
+  ///
+  struct _cef_value_t*(CEF_CALLBACK* get_preference)(
+      struct _cef_preference_manager_t* self,
+      const cef_string_t* name);
+
+  ///
+  /// Returns all preferences as a dictionary. If |include_defaults| is true (1)
+  /// then preferences currently at their default value will be included. The
+  /// returned object contains a copy of the underlying preference values and
+  /// modifications to the returned object will not modify the underlying
+  /// preference values. This function must be called on the browser process UI
+  /// thread.
+  ///
+  struct _cef_dictionary_value_t*(CEF_CALLBACK* get_all_preferences)(
+      struct _cef_preference_manager_t* self,
+      int include_defaults);
+
+  ///
+  /// Returns true (1) if the preference with the specified |name| can be
+  /// modified using SetPreference. As one example preferences set via the
+  /// command-line usually cannot be modified. This function must be called on
+  /// the browser process UI thread.
+  ///
+  int(CEF_CALLBACK* can_set_preference)(struct _cef_preference_manager_t* self,
+                                        const cef_string_t* name);
+
+  ///
+  /// Set the |value| associated with preference |name|. Returns true (1) if the
+  /// value is set successfully and false (0) otherwise. If |value| is NULL the
+  /// preference will be restored to its default value. If setting the
+  /// preference fails then |error| will be populated with a detailed
+  /// description of the problem. This function must be called on the browser
+  /// process UI thread.
+  ///
+  int(CEF_CALLBACK* set_preference)(struct _cef_preference_manager_t* self,
+                                    const cef_string_t* name,
+                                    struct _cef_value_t* value,
+                                    cef_string_t* error);
+} cef_preference_manager_t;
+
+///
+/// Returns the global preference manager object.
+///
+CEF_EXPORT cef_preference_manager_t* cef_preference_manager_get_global(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // CEF_INCLUDE_CAPI_CEF_PREFERENCE_CAPI_H_
diff --git a/src/include/capi/cef_preference_manager_capi.h b/src/include/capi/cef_preference_manager_capi.h
new file mode 100644
index 0000000..f3d979c
--- /dev/null
+++ b/src/include/capi/cef_preference_manager_capi.h
@@ -0,0 +1,116 @@
+// Copyright (c) 2022 Marshall A. Greenblatt. 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 file was generated by the CEF translator tool and should not edited
+// by hand. See the translator.README.txt file in the tools directory for
+// more information.
+//
+// $hash=1f5dd49cfc5aeb4b673c10750de01768f5cd2694$
+//
+
+#ifndef CEF_INCLUDE_CAPI_CEF_PREFERENCE_MANAGER_CAPI_H_
+#define CEF_INCLUDE_CAPI_CEF_PREFERENCE_MANAGER_CAPI_H_
+#pragma once
+
+#include "include/capi/cef_base_capi.h"
+#include "include/capi/cef_values_capi.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+///
+/// Manage access to preferences.
+///
+typedef struct _cef_preference_manager_t {
+  ///
+  /// Base structure.
+  ///
+  cef_base_ref_counted_t base;
+
+  ///
+  /// Returns true (1) if a preference with the specified |name| exists. This
+  /// function must be called on the browser process UI thread.
+  ///
+  int(CEF_CALLBACK* has_preference)(struct _cef_preference_manager_t* self,
+                                    const cef_string_t* name);
+
+  ///
+  /// Returns the value for the preference with the specified |name|. Returns
+  /// NULL if the preference does not exist. The returned object contains a copy
+  /// of the underlying preference value and modifications to the returned
+  /// object will not modify the underlying preference value. This function must
+  /// be called on the browser process UI thread.
+  ///
+  struct _cef_value_t*(CEF_CALLBACK* get_preference)(
+      struct _cef_preference_manager_t* self,
+      const cef_string_t* name);
+
+  ///
+  /// Returns all preferences as a dictionary. If |include_defaults| is true (1)
+  /// then preferences currently at their default value will be included. The
+  /// returned object contains a copy of the underlying preference values and
+  /// modifications to the returned object will not modify the underlying
+  /// preference values. This function must be called on the browser process UI
+  /// thread.
+  ///
+  struct _cef_dictionary_value_t*(CEF_CALLBACK* get_all_preferences)(
+      struct _cef_preference_manager_t* self,
+      int include_defaults);
+
+  ///
+  /// Returns true (1) if the preference with the specified |name| can be
+  /// modified using SetPreference. As one example preferences set via the
+  /// command-line usually cannot be modified. This function must be called on
+  /// the browser process UI thread.
+  ///
+  int(CEF_CALLBACK* can_set_preference)(struct _cef_preference_manager_t* self,
+                                        const cef_string_t* name);
+
+  ///
+  /// Set the |value| associated with preference |name|. Returns true (1) if the
+  /// value is set successfully and false (0) otherwise. If |value| is NULL the
+  /// preference will be restored to its default value. If setting the
+  /// preference fails then |error| will be populated with a detailed
+  /// description of the problem. This function must be called on the browser
+  /// process UI thread.
+  ///
+  int(CEF_CALLBACK* set_preference)(struct _cef_preference_manager_t* self,
+                                    const cef_string_t* name,
+                                    struct _cef_value_t* value,
+                                    cef_string_t* error);
+} cef_preference_manager_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // CEF_INCLUDE_CAPI_CEF_PREFERENCE_MANAGER_CAPI_H_
diff --git a/src/include/capi/cef_print_handler_capi.h b/src/include/capi/cef_print_handler_capi.h
index 8876ab6..47e69b1 100644
--- a/src/include/capi/cef_print_handler_capi.h
+++ b/src/include/capi/cef_print_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=b8d7be1399d3426a3f872b12bc1438e041a16308$
+// $hash=d09937fb047debd9da39c4072a434659b3c5682c$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_PRINT_HANDLER_CAPI_H_
@@ -49,65 +49,66 @@
 #endif
 
 ///
-// Callback structure for asynchronous continuation of print dialog requests.
+/// Callback structure for asynchronous continuation of print dialog requests.
 ///
 typedef struct _cef_print_dialog_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Continue printing with the specified |settings|.
+  /// Continue printing with the specified |settings|.
   ///
   void(CEF_CALLBACK* cont)(struct _cef_print_dialog_callback_t* self,
                            struct _cef_print_settings_t* settings);
 
   ///
-  // Cancel the printing.
+  /// Cancel the printing.
   ///
   void(CEF_CALLBACK* cancel)(struct _cef_print_dialog_callback_t* self);
 } cef_print_dialog_callback_t;
 
 ///
-// Callback structure for asynchronous continuation of print job requests.
+/// Callback structure for asynchronous continuation of print job requests.
 ///
 typedef struct _cef_print_job_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Indicate completion of the print job.
+  /// Indicate completion of the print job.
   ///
   void(CEF_CALLBACK* cont)(struct _cef_print_job_callback_t* self);
 } cef_print_job_callback_t;
 
 ///
-// Implement this structure to handle printing on Linux. Each browser will have
-// only one print job in progress at a time. The functions of this structure
-// will be called on the browser process UI thread.
+/// Implement this structure to handle printing on Linux. Each browser will have
+/// only one print job in progress at a time. The functions of this structure
+/// will be called on the browser process UI thread.
 ///
 typedef struct _cef_print_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called when printing has started for the specified |browser|. This function
-  // will be called before the other OnPrint*() functions and irrespective of
-  // how printing was initiated (e.g. cef_browser_host_t::print(), JavaScript
-  // window.print() or PDF extension print button).
+  /// Called when printing has started for the specified |browser|. This
+  /// function will be called before the other OnPrint*() functions and
+  /// irrespective of how printing was initiated (e.g.
+  /// cef_browser_host_t::print(), JavaScript window.print() or PDF extension
+  /// print button).
   ///
   void(CEF_CALLBACK* on_print_start)(struct _cef_print_handler_t* self,
                                      struct _cef_browser_t* browser);
 
   ///
-  // Synchronize |settings| with client state. If |get_defaults| is true (1)
-  // then populate |settings| with the default print settings. Do not keep a
-  // reference to |settings| outside of this callback.
+  /// Synchronize |settings| with client state. If |get_defaults| is true (1)
+  /// then populate |settings| with the default print settings. Do not keep a
+  /// reference to |settings| outside of this callback.
   ///
   void(CEF_CALLBACK* on_print_settings)(struct _cef_print_handler_t* self,
                                         struct _cef_browser_t* browser,
@@ -115,9 +116,9 @@
                                         int get_defaults);
 
   ///
-  // Show the print dialog. Execute |callback| once the dialog is dismissed.
-  // Return true (1) if the dialog will be displayed or false (0) to cancel the
-  // printing immediately.
+  /// Show the print dialog. Execute |callback| once the dialog is dismissed.
+  /// Return true (1) if the dialog will be displayed or false (0) to cancel the
+  /// printing immediately.
   ///
   int(CEF_CALLBACK* on_print_dialog)(
       struct _cef_print_handler_t* self,
@@ -126,9 +127,9 @@
       struct _cef_print_dialog_callback_t* callback);
 
   ///
-  // Send the print job to the printer. Execute |callback| once the job is
-  // completed. Return true (1) if the job will proceed or false (0) to cancel
-  // the job immediately.
+  /// Send the print job to the printer. Execute |callback| once the job is
+  /// completed. Return true (1) if the job will proceed or false (0) to cancel
+  /// the job immediately.
   ///
   int(CEF_CALLBACK* on_print_job)(struct _cef_print_handler_t* self,
                                   struct _cef_browser_t* browser,
@@ -137,17 +138,18 @@
                                   struct _cef_print_job_callback_t* callback);
 
   ///
-  // Reset client state related to printing.
+  /// Reset client state related to printing.
   ///
   void(CEF_CALLBACK* on_print_reset)(struct _cef_print_handler_t* self,
                                      struct _cef_browser_t* browser);
 
   ///
-  // Return the PDF paper size in device units. Used in combination with
-  // cef_browser_host_t::print_to_pdf().
+  /// Return the PDF paper size in device units. Used in combination with
+  /// cef_browser_host_t::print_to_pdf().
   ///
   cef_size_t(CEF_CALLBACK* get_pdf_paper_size)(
       struct _cef_print_handler_t* self,
+      struct _cef_browser_t* browser,
       int device_units_per_inch);
 } cef_print_handler_t;
 
diff --git a/src/include/capi/cef_print_settings_capi.h b/src/include/capi/cef_print_settings_capi.h
index 3b3d0c1..14a52f3 100644
--- a/src/include/capi/cef_print_settings_capi.h
+++ b/src/include/capi/cef_print_settings_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=8f7d7993691e07f4a8a42d63522c751cfba3c168$
+// $hash=46508464579e797d4684f4a7facdb39f9bdb312b$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_PRINT_SETTINGS_CAPI_H_
@@ -47,41 +47,41 @@
 #endif
 
 ///
-// Structure representing print settings.
+/// Structure representing print settings.
 ///
 typedef struct _cef_print_settings_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns true (1) if this object is valid. Do not call any other functions
-  // if this function returns false (0).
+  /// Returns true (1) if this object is valid. Do not call any other functions
+  /// if this function returns false (0).
   ///
   int(CEF_CALLBACK* is_valid)(struct _cef_print_settings_t* self);
 
   ///
-  // Returns true (1) if the values of this object are read-only. Some APIs may
-  // expose read-only objects.
+  /// Returns true (1) if the values of this object are read-only. Some APIs may
+  /// expose read-only objects.
   ///
   int(CEF_CALLBACK* is_read_only)(struct _cef_print_settings_t* self);
 
   ///
-  // Set the page orientation.
+  /// Set the page orientation.
   ///
   void(CEF_CALLBACK* set_orientation)(struct _cef_print_settings_t* self,
                                       int landscape);
 
   ///
-  // Returns true (1) if the orientation is landscape.
+  /// Returns true (1) if the orientation is landscape.
   ///
   int(CEF_CALLBACK* is_landscape)(struct _cef_print_settings_t* self);
 
   ///
-  // Set the printer printable area in device units. Some platforms already
-  // provide flipped area. Set |landscape_needs_flip| to false (0) on those
-  // platforms to avoid double flipping.
+  /// Set the printer printable area in device units. Some platforms already
+  /// provide flipped area. Set |landscape_needs_flip| to false (0) on those
+  /// platforms to avoid double flipping.
   ///
   void(CEF_CALLBACK* set_printer_printable_area)(
       struct _cef_print_settings_t* self,
@@ -90,110 +90,110 @@
       int landscape_needs_flip);
 
   ///
-  // Set the device name.
+  /// Set the device name.
   ///
   void(CEF_CALLBACK* set_device_name)(struct _cef_print_settings_t* self,
                                       const cef_string_t* name);
 
   ///
-  // Get the device name.
+  /// Get the device name.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_device_name)(
       struct _cef_print_settings_t* self);
 
   ///
-  // Set the DPI (dots per inch).
+  /// Set the DPI (dots per inch).
   ///
   void(CEF_CALLBACK* set_dpi)(struct _cef_print_settings_t* self, int dpi);
 
   ///
-  // Get the DPI (dots per inch).
+  /// Get the DPI (dots per inch).
   ///
   int(CEF_CALLBACK* get_dpi)(struct _cef_print_settings_t* self);
 
   ///
-  // Set the page ranges.
+  /// Set the page ranges.
   ///
   void(CEF_CALLBACK* set_page_ranges)(struct _cef_print_settings_t* self,
                                       size_t rangesCount,
                                       cef_range_t const* ranges);
 
   ///
-  // Returns the number of page ranges that currently exist.
+  /// Returns the number of page ranges that currently exist.
   ///
   size_t(CEF_CALLBACK* get_page_ranges_count)(
       struct _cef_print_settings_t* self);
 
   ///
-  // Retrieve the page ranges.
+  /// Retrieve the page ranges.
   ///
   void(CEF_CALLBACK* get_page_ranges)(struct _cef_print_settings_t* self,
                                       size_t* rangesCount,
                                       cef_range_t* ranges);
 
   ///
-  // Set whether only the selection will be printed.
+  /// Set whether only the selection will be printed.
   ///
   void(CEF_CALLBACK* set_selection_only)(struct _cef_print_settings_t* self,
                                          int selection_only);
 
   ///
-  // Returns true (1) if only the selection will be printed.
+  /// Returns true (1) if only the selection will be printed.
   ///
   int(CEF_CALLBACK* is_selection_only)(struct _cef_print_settings_t* self);
 
   ///
-  // Set whether pages will be collated.
+  /// Set whether pages will be collated.
   ///
   void(CEF_CALLBACK* set_collate)(struct _cef_print_settings_t* self,
                                   int collate);
 
   ///
-  // Returns true (1) if pages will be collated.
+  /// Returns true (1) if pages will be collated.
   ///
   int(CEF_CALLBACK* will_collate)(struct _cef_print_settings_t* self);
 
   ///
-  // Set the color model.
+  /// Set the color model.
   ///
   void(CEF_CALLBACK* set_color_model)(struct _cef_print_settings_t* self,
                                       cef_color_model_t model);
 
   ///
-  // Get the color model.
+  /// Get the color model.
   ///
   cef_color_model_t(CEF_CALLBACK* get_color_model)(
       struct _cef_print_settings_t* self);
 
   ///
-  // Set the number of copies.
+  /// Set the number of copies.
   ///
   void(CEF_CALLBACK* set_copies)(struct _cef_print_settings_t* self,
                                  int copies);
 
   ///
-  // Get the number of copies.
+  /// Get the number of copies.
   ///
   int(CEF_CALLBACK* get_copies)(struct _cef_print_settings_t* self);
 
   ///
-  // Set the duplex mode.
+  /// Set the duplex mode.
   ///
   void(CEF_CALLBACK* set_duplex_mode)(struct _cef_print_settings_t* self,
                                       cef_duplex_mode_t mode);
 
   ///
-  // Get the duplex mode.
+  /// Get the duplex mode.
   ///
   cef_duplex_mode_t(CEF_CALLBACK* get_duplex_mode)(
       struct _cef_print_settings_t* self);
 } cef_print_settings_t;
 
 ///
-// Create a new cef_print_settings_t object.
+/// Create a new cef_print_settings_t object.
 ///
-CEF_EXPORT cef_print_settings_t* cef_print_settings_create();
+CEF_EXPORT cef_print_settings_t* cef_print_settings_create(void);
 
 #ifdef __cplusplus
 }
diff --git a/src/include/capi/cef_process_message_capi.h b/src/include/capi/cef_process_message_capi.h
index aff3b40..586014c 100644
--- a/src/include/capi/cef_process_message_capi.h
+++ b/src/include/capi/cef_process_message_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=79ec6d99ea47e1cf9b2cca0433704f205e14d3bd$
+// $hash=e20a8d6a5803dae5ba156adde40c8b964899b176$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_PROCESS_MESSAGE_CAPI_H_
@@ -41,6 +41,7 @@
 #pragma once
 
 #include "include/capi/cef_base_capi.h"
+#include "include/capi/cef_shared_memory_region_capi.h"
 #include "include/capi/cef_values_capi.h"
 
 #ifdef __cplusplus
@@ -48,48 +49,57 @@
 #endif
 
 ///
-// Structure representing a message. Can be used on any process and thread.
+/// Structure representing a message. Can be used on any process and thread.
 ///
 typedef struct _cef_process_message_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns true (1) if this object is valid. Do not call any other functions
-  // if this function returns false (0).
+  /// Returns true (1) if this object is valid. Do not call any other functions
+  /// if this function returns false (0).
   ///
   int(CEF_CALLBACK* is_valid)(struct _cef_process_message_t* self);
 
   ///
-  // Returns true (1) if the values of this object are read-only. Some APIs may
-  // expose read-only objects.
+  /// Returns true (1) if the values of this object are read-only. Some APIs may
+  /// expose read-only objects.
   ///
   int(CEF_CALLBACK* is_read_only)(struct _cef_process_message_t* self);
 
   ///
-  // Returns a writable copy of this object.
+  /// Returns a writable copy of this object. Returns nullptr when message
+  /// contains a shared memory region.
   ///
   struct _cef_process_message_t*(CEF_CALLBACK* copy)(
       struct _cef_process_message_t* self);
 
   ///
-  // Returns the message name.
+  /// Returns the message name.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_name)(
       struct _cef_process_message_t* self);
 
   ///
-  // Returns the list of arguments.
+  /// Returns the list of arguments. Returns nullptr when message contains a
+  /// shared memory region.
   ///
   struct _cef_list_value_t*(CEF_CALLBACK* get_argument_list)(
       struct _cef_process_message_t* self);
+
+  ///
+  /// Returns the shared memory region. Returns nullptr when message contains an
+  /// argument list.
+  ///
+  struct _cef_shared_memory_region_t*(CEF_CALLBACK* get_shared_memory_region)(
+      struct _cef_process_message_t* self);
 } cef_process_message_t;
 
 ///
-// Create a new cef_process_message_t object with the specified name.
+/// Create a new cef_process_message_t object with the specified name.
 ///
 CEF_EXPORT cef_process_message_t* cef_process_message_create(
     const cef_string_t* name);
diff --git a/src/include/capi/cef_process_util_capi.h b/src/include/capi/cef_process_util_capi.h
index 1a8a003..2ae2c57 100644
--- a/src/include/capi/cef_process_util_capi.h
+++ b/src/include/capi/cef_process_util_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=75b16fd9d592c1d22b94d740e1deb61efe3afb97$
+// $hash=88c42c5f216798304b07bfe985296014cf65996c$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_PROCESS_UTIL_CAPI_H_
@@ -47,14 +47,14 @@
 #endif
 
 ///
-// Launches the process specified via |command_line|. Returns true (1) upon
-// success. Must be called on the browser process TID_PROCESS_LAUNCHER thread.
-//
-// Unix-specific notes: - All file descriptors open in the parent process will
-// be closed in the
-//   child process except for stdin, stdout, and stderr.
-// - If the first argument on the command line does not contain a slash,
-//   PATH will be searched. (See man execvp.)
+/// Launches the process specified via |command_line|. Returns true (1) upon
+/// success. Must be called on the browser process TID_PROCESS_LAUNCHER thread.
+///
+/// Unix-specific notes: - All file descriptors open in the parent process will
+/// be closed in the
+///   child process except for stdin, stdout, and stderr.
+/// - If the first argument on the command line does not contain a slash,
+///   PATH will be searched. (See man execvp.)
 ///
 CEF_EXPORT int cef_launch_process(struct _cef_command_line_t* command_line);
 
diff --git a/src/include/capi/cef_registration_capi.h b/src/include/capi/cef_registration_capi.h
index 8b7354a..4ac84d6 100644
--- a/src/include/capi/cef_registration_capi.h
+++ b/src/include/capi/cef_registration_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=029e237cf80f94a25453bac5a9b1e0765bb56f37$
+// $hash=b1b38a3171dd3626029e70e75b482dfa3531215b$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_REGISTRATION_CAPI_H_
@@ -47,11 +47,11 @@
 #endif
 
 ///
-// Generic callback structure used for managing the lifespan of a registration.
+/// Generic callback structure used for managing the lifespan of a registration.
 ///
 typedef struct _cef_registration_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 } cef_registration_t;
diff --git a/src/include/capi/cef_render_handler_capi.h b/src/include/capi/cef_render_handler_capi.h
index df7e88f..ccd3d23 100644
--- a/src/include/capi/cef_render_handler_capi.h
+++ b/src/include/capi/cef_render_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=e642fc1fe3b97a90c0eae7f0fc0a5cfd385e3e17$
+// $hash=32d8176f39b05487bae048990b2dee3212ae3b78$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_RENDER_HANDLER_CAPI_H_
@@ -50,42 +50,44 @@
 #endif
 
 ///
-// Implement this structure to handle events when window rendering is disabled.
-// The functions of this structure will be called on the UI thread.
+/// Implement this structure to handle events when window rendering is disabled.
+/// The functions of this structure will be called on the UI thread.
 ///
 typedef struct _cef_render_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Return the handler for accessibility notifications. If no handler is
-  // provided the default implementation will be used.
+  /// Return the handler for accessibility notifications. If no handler is
+  /// provided the default implementation will be used.
   ///
   struct _cef_accessibility_handler_t*(CEF_CALLBACK* get_accessibility_handler)(
       struct _cef_render_handler_t* self);
 
   ///
-  // Called to retrieve the root window rectangle in screen coordinates. Return
-  // true (1) if the rectangle was provided. If this function returns false (0)
-  // the rectangle from GetViewRect will be used.
+  /// Called to retrieve the root window rectangle in screen DIP coordinates.
+  /// Return true (1) if the rectangle was provided. If this function returns
+  /// false (0) the rectangle from GetViewRect will be used.
   ///
   int(CEF_CALLBACK* get_root_screen_rect)(struct _cef_render_handler_t* self,
                                           struct _cef_browser_t* browser,
                                           cef_rect_t* rect);
 
   ///
-  // Called to retrieve the view rectangle which is relative to screen
-  // coordinates. This function must always provide a non-NULL rectangle.
+  /// Called to retrieve the view rectangle in screen DIP coordinates. This
+  /// function must always provide a non-NULL rectangle.
   ///
   void(CEF_CALLBACK* get_view_rect)(struct _cef_render_handler_t* self,
                                     struct _cef_browser_t* browser,
                                     cef_rect_t* rect);
 
   ///
-  // Called to retrieve the translation from view coordinates to actual screen
-  // coordinates. Return true (1) if the screen coordinates were provided.
+  /// Called to retrieve the translation from view DIP coordinates to screen
+  /// coordinates. Windows/Linux should provide screen device (pixel)
+  /// coordinates and MacOS should provide screen DIP coordinates. Return true
+  /// (1) if the requested coordinates were provided.
   ///
   int(CEF_CALLBACK* get_screen_point)(struct _cef_render_handler_t* self,
                                       struct _cef_browser_t* browser,
@@ -95,44 +97,44 @@
                                       int* screenY);
 
   ///
-  // Called to allow the client to fill in the CefScreenInfo object with
-  // appropriate values. Return true (1) if the |screen_info| structure has been
-  // modified.
-  //
-  // If the screen info rectangle is left NULL the rectangle from GetViewRect
-  // will be used. If the rectangle is still NULL or invalid popups may not be
-  // drawn correctly.
+  /// Called to allow the client to fill in the CefScreenInfo object with
+  /// appropriate values. Return true (1) if the |screen_info| structure has
+  /// been modified.
+  ///
+  /// If the screen info rectangle is left NULL the rectangle from GetViewRect
+  /// will be used. If the rectangle is still NULL or invalid popups may not be
+  /// drawn correctly.
   ///
   int(CEF_CALLBACK* get_screen_info)(struct _cef_render_handler_t* self,
                                      struct _cef_browser_t* browser,
-                                     struct _cef_screen_info_t* screen_info);
+                                     cef_screen_info_t* screen_info);
 
   ///
-  // Called when the browser wants to show or hide the popup widget. The popup
-  // should be shown if |show| is true (1) and hidden if |show| is false (0).
+  /// Called when the browser wants to show or hide the popup widget. The popup
+  /// should be shown if |show| is true (1) and hidden if |show| is false (0).
   ///
   void(CEF_CALLBACK* on_popup_show)(struct _cef_render_handler_t* self,
                                     struct _cef_browser_t* browser,
                                     int show);
 
   ///
-  // Called when the browser wants to move or resize the popup widget. |rect|
-  // contains the new location and size in view coordinates.
+  /// Called when the browser wants to move or resize the popup widget. |rect|
+  /// contains the new location and size in view coordinates.
   ///
   void(CEF_CALLBACK* on_popup_size)(struct _cef_render_handler_t* self,
                                     struct _cef_browser_t* browser,
                                     const cef_rect_t* rect);
 
   ///
-  // Called when an element should be painted. Pixel values passed to this
-  // function are scaled relative to view coordinates based on the value of
-  // CefScreenInfo.device_scale_factor returned from GetScreenInfo. |type|
-  // indicates whether the element is the view or the popup widget. |buffer|
-  // contains the pixel data for the whole image. |dirtyRects| contains the set
-  // of rectangles in pixel coordinates that need to be repainted. |buffer| will
-  // be |width|*|height|*4 bytes in size and represents a BGRA image with an
-  // upper-left origin. This function is only called when
-  // cef_window_tInfo::shared_texture_enabled is set to false (0).
+  /// Called when an element should be painted. Pixel values passed to this
+  /// function are scaled relative to view coordinates based on the value of
+  /// CefScreenInfo.device_scale_factor returned from GetScreenInfo. |type|
+  /// indicates whether the element is the view or the popup widget. |buffer|
+  /// contains the pixel data for the whole image. |dirtyRects| contains the set
+  /// of rectangles in pixel coordinates that need to be repainted. |buffer|
+  /// will be |width|*|height|*4 bytes in size and represents a BGRA image with
+  /// an upper-left origin. This function is only called when
+  /// cef_window_tInfo::shared_texture_enabled is set to false (0).
   ///
   void(CEF_CALLBACK* on_paint)(struct _cef_render_handler_t* self,
                                struct _cef_browser_t* browser,
@@ -144,13 +146,13 @@
                                int height);
 
   ///
-  // Called when an element has been rendered to the shared texture handle.
-  // |type| indicates whether the element is the view or the popup widget.
-  // |dirtyRects| contains the set of rectangles in pixel coordinates that need
-  // to be repainted. |shared_handle| is the handle for a D3D11 Texture2D that
-  // can be accessed via ID3D11Device using the OpenSharedResource function.
-  // This function is only called when cef_window_tInfo::shared_texture_enabled
-  // is set to true (1), and is currently only supported on Windows.
+  /// Called when an element has been rendered to the shared texture handle.
+  /// |type| indicates whether the element is the view or the popup widget.
+  /// |dirtyRects| contains the set of rectangles in pixel coordinates that need
+  /// to be repainted. |shared_handle| is the handle for a D3D11 Texture2D that
+  /// can be accessed via ID3D11Device using the OpenSharedResource function.
+  /// This function is only called when cef_window_tInfo::shared_texture_enabled
+  /// is set to true (1), and is currently only supported on Windows.
   ///
   void(CEF_CALLBACK* on_accelerated_paint)(struct _cef_render_handler_t* self,
                                            struct _cef_browser_t* browser,
@@ -160,29 +162,37 @@
                                            void* shared_handle);
 
   ///
-  // Called when the browser's cursor has changed. If |type| is CT_CUSTOM then
-  // |custom_cursor_info| will be populated with the custom cursor information.
+  /// Called to retrieve the size of the touch handle for the specified
+  /// |orientation|.
   ///
-  void(CEF_CALLBACK* on_cursor_change)(
+  void(CEF_CALLBACK* get_touch_handle_size)(
       struct _cef_render_handler_t* self,
       struct _cef_browser_t* browser,
-      cef_cursor_handle_t cursor,
-      cef_cursor_type_t type,
-      const struct _cef_cursor_info_t* custom_cursor_info);
+      cef_horizontal_alignment_t orientation,
+      cef_size_t* size);
 
   ///
-  // Called when the user starts dragging content in the web view. Contextual
-  // information about the dragged content is supplied by |drag_data|. (|x|,
-  // |y|) is the drag start location in screen coordinates. OS APIs that run a
-  // system message loop may be used within the StartDragging call.
-  //
-  // Return false (0) to abort the drag operation. Don't call any of
-  // cef_browser_host_t::DragSource*Ended* functions after returning false (0).
-  //
-  // Return true (1) to handle the drag operation. Call
-  // cef_browser_host_t::DragSourceEndedAt and DragSourceSystemDragEnded either
-  // synchronously or asynchronously to inform the web view that the drag
-  // operation has ended.
+  /// Called when touch handle state is updated. The client is responsible for
+  /// rendering the touch handles.
+  ///
+  void(CEF_CALLBACK* on_touch_handle_state_changed)(
+      struct _cef_render_handler_t* self,
+      struct _cef_browser_t* browser,
+      const cef_touch_handle_state_t* state);
+
+  ///
+  /// Called when the user starts dragging content in the web view. Contextual
+  /// information about the dragged content is supplied by |drag_data|. (|x|,
+  /// |y|) is the drag start location in screen coordinates. OS APIs that run a
+  /// system message loop may be used within the StartDragging call.
+  ///
+  /// Return false (0) to abort the drag operation. Don't call any of
+  /// cef_browser_host_t::DragSource*Ended* functions after returning false (0).
+  ///
+  /// Return true (1) to handle the drag operation. Call
+  /// cef_browser_host_t::DragSourceEndedAt and DragSourceSystemDragEnded either
+  /// synchronously or asynchronously to inform the web view that the drag
+  /// operation has ended.
   ///
   int(CEF_CALLBACK* start_dragging)(struct _cef_render_handler_t* self,
                                     struct _cef_browser_t* browser,
@@ -192,16 +202,16 @@
                                     int y);
 
   ///
-  // Called when the web view wants to update the mouse cursor during a drag &
-  // drop operation. |operation| describes the allowed operation (none, move,
-  // copy, link).
+  /// Called when the web view wants to update the mouse cursor during a drag &
+  /// drop operation. |operation| describes the allowed operation (none, move,
+  /// copy, link).
   ///
   void(CEF_CALLBACK* update_drag_cursor)(struct _cef_render_handler_t* self,
                                          struct _cef_browser_t* browser,
                                          cef_drag_operations_mask_t operation);
 
   ///
-  // Called when the scroll offset has changed.
+  /// Called when the scroll offset has changed.
   ///
   void(CEF_CALLBACK* on_scroll_offset_changed)(
       struct _cef_render_handler_t* self,
@@ -210,9 +220,9 @@
       double y);
 
   ///
-  // Called when the IME composition range has changed. |selected_range| is the
-  // range of characters that have been selected. |character_bounds| is the
-  // bounds of each character in view coordinates.
+  /// Called when the IME composition range has changed. |selected_range| is the
+  /// range of characters that have been selected. |character_bounds| is the
+  /// bounds of each character in view coordinates.
   ///
   void(CEF_CALLBACK* on_ime_composition_range_changed)(
       struct _cef_render_handler_t* self,
@@ -222,9 +232,9 @@
       cef_rect_t const* character_bounds);
 
   ///
-  // Called when text selection has changed for the specified |browser|.
-  // |selected_text| is the currently selected text and |selected_range| is the
-  // character range.
+  /// Called when text selection has changed for the specified |browser|.
+  /// |selected_text| is the currently selected text and |selected_range| is the
+  /// character range.
   ///
   void(CEF_CALLBACK* on_text_selection_changed)(
       struct _cef_render_handler_t* self,
@@ -233,10 +243,10 @@
       const cef_range_t* selected_range);
 
   ///
-  // Called when an on-screen keyboard should be shown or hidden for the
-  // specified |browser|. |input_mode| specifies what kind of keyboard should be
-  // opened. If |input_mode| is CEF_TEXT_INPUT_MODE_NONE, any existing keyboard
-  // for this browser should be hidden.
+  /// Called when an on-screen keyboard should be shown or hidden for the
+  /// specified |browser|. |input_mode| specifies what kind of keyboard should
+  /// be opened. If |input_mode| is CEF_TEXT_INPUT_MODE_NONE, any existing
+  /// keyboard for this browser should be hidden.
   ///
   void(CEF_CALLBACK* on_virtual_keyboard_requested)(
       struct _cef_render_handler_t* self,
diff --git a/src/include/capi/cef_render_process_handler_capi.h b/src/include/capi/cef_render_process_handler_capi.h
index e23d499..f9c86c9 100644
--- a/src/include/capi/cef_render_process_handler_capi.h
+++ b/src/include/capi/cef_render_process_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=3630a82a4ea731b43ed4ba468a57c5dfe15f8679$
+// $hash=d807c7566ce3085243e9e7ea279fee7241acfc5f$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_RENDER_PROCESS_HANDLER_CAPI_H_
@@ -54,40 +54,30 @@
 #endif
 
 ///
-// Structure used to implement render process callbacks. The functions of this
-// structure will be called on the render process main thread (TID_RENDERER)
-// unless otherwise indicated.
+/// Structure used to implement render process callbacks. The functions of this
+/// structure will be called on the render process main thread (TID_RENDERER)
+/// unless otherwise indicated.
 ///
 typedef struct _cef_render_process_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called after the render process main thread has been created. |extra_info|
-  // is a read-only value originating from
-  // cef_browser_process_handler_t::on_render_process_thread_created(). Do not
-  // keep a reference to |extra_info| outside of this function.
-  ///
-  void(CEF_CALLBACK* on_render_thread_created)(
-      struct _cef_render_process_handler_t* self,
-      struct _cef_list_value_t* extra_info);
-
-  ///
-  // Called after WebKit has been initialized.
+  /// Called after WebKit has been initialized.
   ///
   void(CEF_CALLBACK* on_web_kit_initialized)(
       struct _cef_render_process_handler_t* self);
 
   ///
-  // Called after a browser has been created. When browsing cross-origin a new
-  // browser will be created before the old browser with the same identifier is
-  // destroyed. |extra_info| is a read-only value originating from
-  // cef_browser_host_t::cef_browser_host_create_browser(),
-  // cef_browser_host_t::cef_browser_host_create_browser_sync(),
-  // cef_life_span_handler_t::on_before_popup() or
-  // cef_browser_view_t::cef_browser_view_create().
+  /// Called after a browser has been created. When browsing cross-origin a new
+  /// browser will be created before the old browser with the same identifier is
+  /// destroyed. |extra_info| is an optional read-only value originating from
+  /// cef_browser_host_t::cef_browser_host_create_browser(),
+  /// cef_browser_host_t::cef_browser_host_create_browser_sync(),
+  /// cef_life_span_handler_t::on_before_popup() or
+  /// cef_browser_view_t::cef_browser_view_create().
   ///
   void(CEF_CALLBACK* on_browser_created)(
       struct _cef_render_process_handler_t* self,
@@ -95,25 +85,25 @@
       struct _cef_dictionary_value_t* extra_info);
 
   ///
-  // Called before a browser is destroyed.
+  /// Called before a browser is destroyed.
   ///
   void(CEF_CALLBACK* on_browser_destroyed)(
       struct _cef_render_process_handler_t* self,
       struct _cef_browser_t* browser);
 
   ///
-  // Return the handler for browser load status events.
+  /// Return the handler for browser load status events.
   ///
   struct _cef_load_handler_t*(CEF_CALLBACK* get_load_handler)(
       struct _cef_render_process_handler_t* self);
 
   ///
-  // Called immediately after the V8 context for a frame has been created. To
-  // retrieve the JavaScript 'window' object use the
-  // cef_v8context_t::get_global() function. V8 handles can only be accessed
-  // from the thread on which they are created. A task runner for posting tasks
-  // on the associated thread can be retrieved via the
-  // cef_v8context_t::get_task_runner() function.
+  /// Called immediately after the V8 context for a frame has been created. To
+  /// retrieve the JavaScript 'window' object use the
+  /// cef_v8context_t::get_global() function. V8 handles can only be accessed
+  /// from the thread on which they are created. A task runner for posting tasks
+  /// on the associated thread can be retrieved via the
+  /// cef_v8context_t::get_task_runner() function.
   ///
   void(CEF_CALLBACK* on_context_created)(
       struct _cef_render_process_handler_t* self,
@@ -122,8 +112,8 @@
       struct _cef_v8context_t* context);
 
   ///
-  // Called immediately before the V8 context for a frame is released. No
-  // references to the context should be kept after this function is called.
+  /// Called immediately before the V8 context for a frame is released. No
+  /// references to the context should be kept after this function is called.
   ///
   void(CEF_CALLBACK* on_context_released)(
       struct _cef_render_process_handler_t* self,
@@ -132,9 +122,9 @@
       struct _cef_v8context_t* context);
 
   ///
-  // Called for global uncaught exceptions in a frame. Execution of this
-  // callback is disabled by default. To enable set
-  // CefSettings.uncaught_exception_stack_size > 0.
+  /// Called for global uncaught exceptions in a frame. Execution of this
+  /// callback is disabled by default. To enable set
+  /// cef_settings_t.uncaught_exception_stack_size > 0.
   ///
   void(CEF_CALLBACK* on_uncaught_exception)(
       struct _cef_render_process_handler_t* self,
@@ -145,12 +135,12 @@
       struct _cef_v8stack_trace_t* stackTrace);
 
   ///
-  // Called when a new node in the the browser gets focus. The |node| value may
-  // be NULL if no specific node has gained focus. The node object passed to
-  // this function represents a snapshot of the DOM at the time this function is
-  // executed. DOM objects are only valid for the scope of this function. Do not
-  // keep references to or attempt to access any DOM objects outside the scope
-  // of this function.
+  /// Called when a new node in the the browser gets focus. The |node| value may
+  /// be NULL if no specific node has gained focus. The node object passed to
+  /// this function represents a snapshot of the DOM at the time this function
+  /// is executed. DOM objects are only valid for the scope of this function. Do
+  /// not keep references to or attempt to access any DOM objects outside the
+  /// scope of this function.
   ///
   void(CEF_CALLBACK* on_focused_node_changed)(
       struct _cef_render_process_handler_t* self,
@@ -159,9 +149,9 @@
       struct _cef_domnode_t* node);
 
   ///
-  // Called when a new message is received from a different process. Return true
-  // (1) if the message was handled or false (0) otherwise. Do not keep a
-  // reference to or attempt to access the message outside of this callback.
+  /// Called when a new message is received from a different process. Return
+  /// true (1) if the message was handled or false (0) otherwise. It is safe to
+  /// keep a reference to |message| outside of this callback.
   ///
   int(CEF_CALLBACK* on_process_message_received)(
       struct _cef_render_process_handler_t* self,
diff --git a/src/include/capi/cef_request_capi.h b/src/include/capi/cef_request_capi.h
index 9904974..50df9f0 100644
--- a/src/include/capi/cef_request_capi.h
+++ b/src/include/capi/cef_request_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=b3725b8fa4118936caacda69504dc597f3620d82$
+// $hash=241f8b8ba0a4555f8ad8ed1d60345ae83d4d62f4$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_REQUEST_CAPI_H_
@@ -50,96 +50,96 @@
 struct _cef_post_data_t;
 
 ///
-// Structure used to represent a web request. The functions of this structure
-// may be called on any thread.
+/// Structure used to represent a web request. The functions of this structure
+/// may be called on any thread.
 ///
 typedef struct _cef_request_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns true (1) if this object is read-only.
+  /// Returns true (1) if this object is read-only.
   ///
   int(CEF_CALLBACK* is_read_only)(struct _cef_request_t* self);
 
   ///
-  // Get the fully qualified URL.
+  /// Get the fully qualified URL.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_url)(struct _cef_request_t* self);
 
   ///
-  // Set the fully qualified URL.
+  /// Set the fully qualified URL.
   ///
   void(CEF_CALLBACK* set_url)(struct _cef_request_t* self,
                               const cef_string_t* url);
 
   ///
-  // Get the request function type. The value will default to POST if post data
-  // is provided and GET otherwise.
+  /// Get the request function type. The value will default to POST if post data
+  /// is provided and GET otherwise.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_method)(struct _cef_request_t* self);
 
   ///
-  // Set the request function type.
+  /// Set the request function type.
   ///
   void(CEF_CALLBACK* set_method)(struct _cef_request_t* self,
                                  const cef_string_t* method);
 
   ///
-  // Set the referrer URL and policy. If non-NULL the referrer URL must be fully
-  // qualified with an HTTP or HTTPS scheme component. Any username, password or
-  // ref component will be removed.
+  /// Set the referrer URL and policy. If non-NULL the referrer URL must be
+  /// fully qualified with an HTTP or HTTPS scheme component. Any username,
+  /// password or ref component will be removed.
   ///
   void(CEF_CALLBACK* set_referrer)(struct _cef_request_t* self,
                                    const cef_string_t* referrer_url,
                                    cef_referrer_policy_t policy);
 
   ///
-  // Get the referrer URL.
+  /// Get the referrer URL.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_referrer_url)(
       struct _cef_request_t* self);
 
   ///
-  // Get the referrer policy.
+  /// Get the referrer policy.
   ///
   cef_referrer_policy_t(CEF_CALLBACK* get_referrer_policy)(
       struct _cef_request_t* self);
 
   ///
-  // Get the post data.
+  /// Get the post data.
   ///
   struct _cef_post_data_t*(CEF_CALLBACK* get_post_data)(
       struct _cef_request_t* self);
 
   ///
-  // Set the post data.
+  /// Set the post data.
   ///
   void(CEF_CALLBACK* set_post_data)(struct _cef_request_t* self,
                                     struct _cef_post_data_t* postData);
 
   ///
-  // Get the header values. Will not include the Referer value if any.
+  /// Get the header values. Will not include the Referer value if any.
   ///
   void(CEF_CALLBACK* get_header_map)(struct _cef_request_t* self,
                                      cef_string_multimap_t headerMap);
 
   ///
-  // Set the header values. If a Referer value exists in the header map it will
-  // be removed and ignored.
+  /// Set the header values. If a Referer value exists in the header map it will
+  /// be removed and ignored.
   ///
   void(CEF_CALLBACK* set_header_map)(struct _cef_request_t* self,
                                      cef_string_multimap_t headerMap);
 
   ///
-  // Returns the first header value for |name| or an NULL string if not found.
-  // Will not return the Referer value if any. Use GetHeaderMap instead if
-  // |name| might have multiple values.
+  /// Returns the first header value for |name| or an NULL string if not found.
+  /// Will not return the Referer value if any. Use GetHeaderMap instead if
+  /// |name| might have multiple values.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_header_by_name)(
@@ -147,10 +147,10 @@
       const cef_string_t* name);
 
   ///
-  // Set the header |name| to |value|. If |overwrite| is true (1) any existing
-  // values will be replaced with the new value. If |overwrite| is false (0) any
-  // existing values will not be overwritten. The Referer value cannot be set
-  // using this function.
+  /// Set the header |name| to |value|. If |overwrite| is true (1) any existing
+  /// values will be replaced with the new value. If |overwrite| is false (0)
+  /// any existing values will not be overwritten. The Referer value cannot be
+  /// set using this function.
   ///
   void(CEF_CALLBACK* set_header_by_name)(struct _cef_request_t* self,
                                          const cef_string_t* name,
@@ -158,7 +158,7 @@
                                          int overwrite);
 
   ///
-  // Set all values at one time.
+  /// Set all values at one time.
   ///
   void(CEF_CALLBACK* set)(struct _cef_request_t* self,
                           const cef_string_t* url,
@@ -167,174 +167,176 @@
                           cef_string_multimap_t headerMap);
 
   ///
-  // Get the flags used in combination with cef_urlrequest_t. See
-  // cef_urlrequest_flags_t for supported values.
+  /// Get the flags used in combination with cef_urlrequest_t. See
+  /// cef_urlrequest_flags_t for supported values.
   ///
   int(CEF_CALLBACK* get_flags)(struct _cef_request_t* self);
 
   ///
-  // Set the flags used in combination with cef_urlrequest_t.  See
-  // cef_urlrequest_flags_t for supported values.
+  /// Set the flags used in combination with cef_urlrequest_t.  See
+  /// cef_urlrequest_flags_t for supported values.
   ///
   void(CEF_CALLBACK* set_flags)(struct _cef_request_t* self, int flags);
 
   ///
-  // Get the URL to the first party for cookies used in combination with
-  // cef_urlrequest_t.
+  /// Get the URL to the first party for cookies used in combination with
+  /// cef_urlrequest_t.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_first_party_for_cookies)(
       struct _cef_request_t* self);
 
   ///
-  // Set the URL to the first party for cookies used in combination with
-  // cef_urlrequest_t.
+  /// Set the URL to the first party for cookies used in combination with
+  /// cef_urlrequest_t.
   ///
   void(CEF_CALLBACK* set_first_party_for_cookies)(struct _cef_request_t* self,
                                                   const cef_string_t* url);
 
   ///
-  // Get the resource type for this request. Only available in the browser
-  // process.
+  /// Get the resource type for this request. Only available in the browser
+  /// process.
   ///
   cef_resource_type_t(CEF_CALLBACK* get_resource_type)(
       struct _cef_request_t* self);
 
   ///
-  // Get the transition type for this request. Only available in the browser
-  // process and only applies to requests that represent a main frame or sub-
-  // frame navigation.
+  /// Get the transition type for this request. Only available in the browser
+  /// process and only applies to requests that represent a main frame or sub-
+  /// frame navigation.
   ///
   cef_transition_type_t(CEF_CALLBACK* get_transition_type)(
       struct _cef_request_t* self);
 
   ///
-  // Returns the globally unique identifier for this request or 0 if not
-  // specified. Can be used by cef_resource_request_handler_t implementations in
-  // the browser process to track a single request across multiple callbacks.
+  /// Returns the globally unique identifier for this request or 0 if not
+  /// specified. Can be used by cef_resource_request_handler_t implementations
+  /// in the browser process to track a single request across multiple
+  /// callbacks.
   ///
-  uint64(CEF_CALLBACK* get_identifier)(struct _cef_request_t* self);
+  uint64_t(CEF_CALLBACK* get_identifier)(struct _cef_request_t* self);
 } cef_request_t;
 
 ///
-// Create a new cef_request_t object.
+/// Create a new cef_request_t object.
 ///
-CEF_EXPORT cef_request_t* cef_request_create();
+CEF_EXPORT cef_request_t* cef_request_create(void);
 
 ///
-// Structure used to represent post data for a web request. The functions of
-// this structure may be called on any thread.
+/// Structure used to represent post data for a web request. The functions of
+/// this structure may be called on any thread.
 ///
 typedef struct _cef_post_data_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns true (1) if this object is read-only.
+  /// Returns true (1) if this object is read-only.
   ///
   int(CEF_CALLBACK* is_read_only)(struct _cef_post_data_t* self);
 
   ///
-  // Returns true (1) if the underlying POST data includes elements that are not
-  // represented by this cef_post_data_t object (for example, multi-part file
-  // upload data). Modifying cef_post_data_t objects with excluded elements may
-  // result in the request failing.
+  /// Returns true (1) if the underlying POST data includes elements that are
+  /// not represented by this cef_post_data_t object (for example, multi-part
+  /// file upload data). Modifying cef_post_data_t objects with excluded
+  /// elements may result in the request failing.
   ///
   int(CEF_CALLBACK* has_excluded_elements)(struct _cef_post_data_t* self);
 
   ///
-  // Returns the number of existing post data elements.
+  /// Returns the number of existing post data elements.
   ///
   size_t(CEF_CALLBACK* get_element_count)(struct _cef_post_data_t* self);
 
   ///
-  // Retrieve the post data elements.
+  /// Retrieve the post data elements.
   ///
   void(CEF_CALLBACK* get_elements)(struct _cef_post_data_t* self,
                                    size_t* elementsCount,
                                    struct _cef_post_data_element_t** elements);
 
   ///
-  // Remove the specified post data element.  Returns true (1) if the removal
-  // succeeds.
+  /// Remove the specified post data element.  Returns true (1) if the removal
+  /// succeeds.
   ///
   int(CEF_CALLBACK* remove_element)(struct _cef_post_data_t* self,
                                     struct _cef_post_data_element_t* element);
 
   ///
-  // Add the specified post data element.  Returns true (1) if the add succeeds.
+  /// Add the specified post data element.  Returns true (1) if the add
+  /// succeeds.
   ///
   int(CEF_CALLBACK* add_element)(struct _cef_post_data_t* self,
                                  struct _cef_post_data_element_t* element);
 
   ///
-  // Remove all existing post data elements.
+  /// Remove all existing post data elements.
   ///
   void(CEF_CALLBACK* remove_elements)(struct _cef_post_data_t* self);
 } cef_post_data_t;
 
 ///
-// Create a new cef_post_data_t object.
+/// Create a new cef_post_data_t object.
 ///
-CEF_EXPORT cef_post_data_t* cef_post_data_create();
+CEF_EXPORT cef_post_data_t* cef_post_data_create(void);
 
 ///
-// Structure used to represent a single element in the request post data. The
-// functions of this structure may be called on any thread.
+/// Structure used to represent a single element in the request post data. The
+/// functions of this structure may be called on any thread.
 ///
 typedef struct _cef_post_data_element_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns true (1) if this object is read-only.
+  /// Returns true (1) if this object is read-only.
   ///
   int(CEF_CALLBACK* is_read_only)(struct _cef_post_data_element_t* self);
 
   ///
-  // Remove all contents from the post data element.
+  /// Remove all contents from the post data element.
   ///
   void(CEF_CALLBACK* set_to_empty)(struct _cef_post_data_element_t* self);
 
   ///
-  // The post data element will represent a file.
+  /// The post data element will represent a file.
   ///
   void(CEF_CALLBACK* set_to_file)(struct _cef_post_data_element_t* self,
                                   const cef_string_t* fileName);
 
   ///
-  // The post data element will represent bytes.  The bytes passed in will be
-  // copied.
+  /// The post data element will represent bytes.  The bytes passed in will be
+  /// copied.
   ///
   void(CEF_CALLBACK* set_to_bytes)(struct _cef_post_data_element_t* self,
                                    size_t size,
                                    const void* bytes);
 
   ///
-  // Return the type of this post data element.
+  /// Return the type of this post data element.
   ///
   cef_postdataelement_type_t(CEF_CALLBACK* get_type)(
       struct _cef_post_data_element_t* self);
 
   ///
-  // Return the file name.
+  /// Return the file name.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_file)(
       struct _cef_post_data_element_t* self);
 
   ///
-  // Return the number of bytes.
+  /// Return the number of bytes.
   ///
   size_t(CEF_CALLBACK* get_bytes_count)(struct _cef_post_data_element_t* self);
 
   ///
-  // Read up to |size| bytes into |bytes| and return the number of bytes
-  // actually read.
+  /// Read up to |size| bytes into |bytes| and return the number of bytes
+  /// actually read.
   ///
   size_t(CEF_CALLBACK* get_bytes)(struct _cef_post_data_element_t* self,
                                   size_t size,
@@ -342,9 +344,9 @@
 } cef_post_data_element_t;
 
 ///
-// Create a new cef_post_data_element_t object.
+/// Create a new cef_post_data_element_t object.
 ///
-CEF_EXPORT cef_post_data_element_t* cef_post_data_element_create();
+CEF_EXPORT cef_post_data_element_t* cef_post_data_element_create(void);
 
 #ifdef __cplusplus
 }
diff --git a/src/include/capi/cef_request_context_capi.h b/src/include/capi/cef_request_context_capi.h
index 679204c..2222666 100644
--- a/src/include/capi/cef_request_context_capi.h
+++ b/src/include/capi/cef_request_context_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=7ce0953f069204a4dd2037c4a05ac9454c5e66a6$
+// $hash=1c3c3dfb4bde6cd45278c6a80fbc53f624017c44$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_REQUEST_CONTEXT_CAPI_H_
@@ -45,6 +45,7 @@
 #include "include/capi/cef_extension_capi.h"
 #include "include/capi/cef_extension_handler_capi.h"
 #include "include/capi/cef_media_router_capi.h"
+#include "include/capi/cef_preference_capi.h"
 #include "include/capi/cef_values_capi.h"
 
 #ifdef __cplusplus
@@ -55,18 +56,18 @@
 struct _cef_scheme_handler_factory_t;
 
 ///
-// Callback structure for cef_request_context_t::ResolveHost.
+/// Callback structure for cef_request_context_t::ResolveHost.
 ///
 typedef struct _cef_resolve_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called on the UI thread after the ResolveHost request has completed.
-  // |result| will be the result code. |resolved_ips| will be the list of
-  // resolved IP addresses or NULL if the resolution failed.
+  /// Called on the UI thread after the ResolveHost request has completed.
+  /// |result| will be the result code. |resolved_ips| will be the list of
+  /// resolved IP addresses or NULL if the resolution failed.
   ///
   void(CEF_CALLBACK* on_resolve_completed)(struct _cef_resolve_callback_t* self,
                                            cef_errorcode_t result,
@@ -74,83 +75,83 @@
 } cef_resolve_callback_t;
 
 ///
-// A request context provides request handling for a set of related browser or
-// URL request objects. A request context can be specified when creating a new
-// browser via the cef_browser_host_t static factory functions or when creating
-// a new URL request via the cef_urlrequest_t static factory functions. Browser
-// objects with different request contexts will never be hosted in the same
-// render process. Browser objects with the same request context may or may not
-// be hosted in the same render process depending on the process model. Browser
-// objects created indirectly via the JavaScript window.open function or
-// targeted links will share the same render process and the same request
-// context as the source browser. When running in single-process mode there is
-// only a single render process (the main process) and so all browsers created
-// in single-process mode will share the same request context. This will be the
-// first request context passed into a cef_browser_host_t static factory
-// function and all other request context objects will be ignored.
+/// A request context provides request handling for a set of related browser or
+/// URL request objects. A request context can be specified when creating a new
+/// browser via the cef_browser_host_t static factory functions or when creating
+/// a new URL request via the cef_urlrequest_t static factory functions. Browser
+/// objects with different request contexts will never be hosted in the same
+/// render process. Browser objects with the same request context may or may not
+/// be hosted in the same render process depending on the process model. Browser
+/// objects created indirectly via the JavaScript window.open function or
+/// targeted links will share the same render process and the same request
+/// context as the source browser. When running in single-process mode there is
+/// only a single render process (the main process) and so all browsers created
+/// in single-process mode will share the same request context. This will be the
+/// first request context passed into a cef_browser_host_t static factory
+/// function and all other request context objects will be ignored.
 ///
 typedef struct _cef_request_context_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
-  cef_base_ref_counted_t base;
+  cef_preference_manager_t base;
 
   ///
-  // Returns true (1) if this object is pointing to the same context as |that|
-  // object.
+  /// Returns true (1) if this object is pointing to the same context as |that|
+  /// object.
   ///
   int(CEF_CALLBACK* is_same)(struct _cef_request_context_t* self,
                              struct _cef_request_context_t* other);
 
   ///
-  // Returns true (1) if this object is sharing the same storage as |that|
-  // object.
+  /// Returns true (1) if this object is sharing the same storage as |that|
+  /// object.
   ///
   int(CEF_CALLBACK* is_sharing_with)(struct _cef_request_context_t* self,
                                      struct _cef_request_context_t* other);
 
   ///
-  // Returns true (1) if this object is the global context. The global context
-  // is used by default when creating a browser or URL request with a NULL
-  // context argument.
+  /// Returns true (1) if this object is the global context. The global context
+  /// is used by default when creating a browser or URL request with a NULL
+  /// context argument.
   ///
   int(CEF_CALLBACK* is_global)(struct _cef_request_context_t* self);
 
   ///
-  // Returns the handler for this context if any.
+  /// Returns the handler for this context if any.
   ///
   struct _cef_request_context_handler_t*(CEF_CALLBACK* get_handler)(
       struct _cef_request_context_t* self);
 
   ///
-  // Returns the cache path for this object. If NULL an "incognito mode" in-
-  // memory cache is being used.
+  /// Returns the cache path for this object. If NULL an "incognito mode" in-
+  /// memory cache is being used.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_cache_path)(
       struct _cef_request_context_t* self);
 
   ///
-  // Returns the cookie manager for this object. If |callback| is non-NULL it
-  // will be executed asnychronously on the IO thread after the manager's
-  // storage has been initialized.
+  /// Returns the cookie manager for this object. If |callback| is non-NULL it
+  /// will be executed asnychronously on the UI thread after the manager's
+  /// storage has been initialized.
   ///
   struct _cef_cookie_manager_t*(CEF_CALLBACK* get_cookie_manager)(
       struct _cef_request_context_t* self,
       struct _cef_completion_callback_t* callback);
 
   ///
-  // Register a scheme handler factory for the specified |scheme_name| and
-  // optional |domain_name|. An NULL |domain_name| value for a standard scheme
-  // will cause the factory to match all domain names. The |domain_name| value
-  // will be ignored for non-standard schemes. If |scheme_name| is a built-in
-  // scheme and no handler is returned by |factory| then the built-in scheme
-  // handler factory will be called. If |scheme_name| is a custom scheme then
-  // you must also implement the cef_app_t::on_register_custom_schemes()
-  // function in all processes. This function may be called multiple times to
-  // change or remove the factory that matches the specified |scheme_name| and
-  // optional |domain_name|. Returns false (0) if an error occurs. This function
-  // may be called on any thread in the browser process.
+  /// Register a scheme handler factory for the specified |scheme_name| and
+  /// optional |domain_name|. An NULL |domain_name| value for a standard scheme
+  /// will cause the factory to match all domain names. The |domain_name| value
+  /// will be ignored for non-standard schemes. If |scheme_name| is a built-in
+  /// scheme and no handler is returned by |factory| then the built-in scheme
+  /// handler factory will be called. If |scheme_name| is a custom scheme then
+  /// you must also implement the cef_app_t::on_register_custom_schemes()
+  /// function in all processes. This function may be called multiple times to
+  /// change or remove the factory that matches the specified |scheme_name| and
+  /// optional |domain_name|. Returns false (0) if an error occurs. This
+  /// function may be called on any thread in the browser process.
   ///
   int(CEF_CALLBACK* register_scheme_handler_factory)(
       struct _cef_request_context_t* self,
@@ -159,160 +160,98 @@
       struct _cef_scheme_handler_factory_t* factory);
 
   ///
-  // Clear all registered scheme handler factories. Returns false (0) on error.
-  // This function may be called on any thread in the browser process.
+  /// Clear all registered scheme handler factories. Returns false (0) on error.
+  /// This function may be called on any thread in the browser process.
   ///
   int(CEF_CALLBACK* clear_scheme_handler_factories)(
       struct _cef_request_context_t* self);
 
   ///
-  // Tells all renderer processes associated with this context to throw away
-  // their plugin list cache. If |reload_pages| is true (1) they will also
-  // reload all pages with plugins.
-  // cef_request_context_handler_t::OnBeforePluginLoad may be called to rebuild
-  // the plugin list cache.
-  ///
-  void(CEF_CALLBACK* purge_plugin_list_cache)(
-      struct _cef_request_context_t* self,
-      int reload_pages);
-
-  ///
-  // Returns true (1) if a preference with the specified |name| exists. This
-  // function must be called on the browser process UI thread.
-  ///
-  int(CEF_CALLBACK* has_preference)(struct _cef_request_context_t* self,
-                                    const cef_string_t* name);
-
-  ///
-  // Returns the value for the preference with the specified |name|. Returns
-  // NULL if the preference does not exist. The returned object contains a copy
-  // of the underlying preference value and modifications to the returned object
-  // will not modify the underlying preference value. This function must be
-  // called on the browser process UI thread.
-  ///
-  struct _cef_value_t*(CEF_CALLBACK* get_preference)(
-      struct _cef_request_context_t* self,
-      const cef_string_t* name);
-
-  ///
-  // Returns all preferences as a dictionary. If |include_defaults| is true (1)
-  // then preferences currently at their default value will be included. The
-  // returned object contains a copy of the underlying preference values and
-  // modifications to the returned object will not modify the underlying
-  // preference values. This function must be called on the browser process UI
-  // thread.
-  ///
-  struct _cef_dictionary_value_t*(CEF_CALLBACK* get_all_preferences)(
-      struct _cef_request_context_t* self,
-      int include_defaults);
-
-  ///
-  // Returns true (1) if the preference with the specified |name| can be
-  // modified using SetPreference. As one example preferences set via the
-  // command-line usually cannot be modified. This function must be called on
-  // the browser process UI thread.
-  ///
-  int(CEF_CALLBACK* can_set_preference)(struct _cef_request_context_t* self,
-                                        const cef_string_t* name);
-
-  ///
-  // Set the |value| associated with preference |name|. Returns true (1) if the
-  // value is set successfully and false (0) otherwise. If |value| is NULL the
-  // preference will be restored to its default value. If setting the preference
-  // fails then |error| will be populated with a detailed description of the
-  // problem. This function must be called on the browser process UI thread.
-  ///
-  int(CEF_CALLBACK* set_preference)(struct _cef_request_context_t* self,
-                                    const cef_string_t* name,
-                                    struct _cef_value_t* value,
-                                    cef_string_t* error);
-
-  ///
-  // Clears all certificate exceptions that were added as part of handling
-  // cef_request_handler_t::on_certificate_error(). If you call this it is
-  // recommended that you also call close_all_connections() or you risk not
-  // being prompted again for server certificates if you reconnect quickly. If
-  // |callback| is non-NULL it will be executed on the UI thread after
-  // completion.
+  /// Clears all certificate exceptions that were added as part of handling
+  /// cef_request_handler_t::on_certificate_error(). If you call this it is
+  /// recommended that you also call close_all_connections() or you risk not
+  /// being prompted again for server certificates if you reconnect quickly. If
+  /// |callback| is non-NULL it will be executed on the UI thread after
+  /// completion.
   ///
   void(CEF_CALLBACK* clear_certificate_exceptions)(
       struct _cef_request_context_t* self,
       struct _cef_completion_callback_t* callback);
 
   ///
-  // Clears all HTTP authentication credentials that were added as part of
-  // handling GetAuthCredentials. If |callback| is non-NULL it will be executed
-  // on the UI thread after completion.
+  /// Clears all HTTP authentication credentials that were added as part of
+  /// handling GetAuthCredentials. If |callback| is non-NULL it will be executed
+  /// on the UI thread after completion.
   ///
   void(CEF_CALLBACK* clear_http_auth_credentials)(
       struct _cef_request_context_t* self,
       struct _cef_completion_callback_t* callback);
 
   ///
-  // Clears all active and idle connections that Chromium currently has. This is
-  // only recommended if you have released all other CEF objects but don't yet
-  // want to call cef_shutdown(). If |callback| is non-NULL it will be executed
-  // on the UI thread after completion.
+  /// Clears all active and idle connections that Chromium currently has. This
+  /// is only recommended if you have released all other CEF objects but don't
+  /// yet want to call cef_shutdown(). If |callback| is non-NULL it will be
+  /// executed on the UI thread after completion.
   ///
   void(CEF_CALLBACK* close_all_connections)(
       struct _cef_request_context_t* self,
       struct _cef_completion_callback_t* callback);
 
   ///
-  // Attempts to resolve |origin| to a list of associated IP addresses.
-  // |callback| will be executed on the UI thread after completion.
+  /// Attempts to resolve |origin| to a list of associated IP addresses.
+  /// |callback| will be executed on the UI thread after completion.
   ///
   void(CEF_CALLBACK* resolve_host)(struct _cef_request_context_t* self,
                                    const cef_string_t* origin,
                                    struct _cef_resolve_callback_t* callback);
 
   ///
-  // Load an extension.
-  //
-  // If extension resources will be read from disk using the default load
-  // implementation then |root_directory| should be the absolute path to the
-  // extension resources directory and |manifest| should be NULL. If extension
-  // resources will be provided by the client (e.g. via cef_request_handler_t
-  // and/or cef_extension_handler_t) then |root_directory| should be a path
-  // component unique to the extension (if not absolute this will be internally
-  // prefixed with the PK_DIR_RESOURCES path) and |manifest| should contain the
-  // contents that would otherwise be read from the "manifest.json" file on
-  // disk.
-  //
-  // The loaded extension will be accessible in all contexts sharing the same
-  // storage (HasExtension returns true (1)). However, only the context on which
-  // this function was called is considered the loader (DidLoadExtension returns
-  // true (1)) and only the loader will receive cef_request_context_handler_t
-  // callbacks for the extension.
-  //
-  // cef_extension_handler_t::OnExtensionLoaded will be called on load success
-  // or cef_extension_handler_t::OnExtensionLoadFailed will be called on load
-  // failure.
-  //
-  // If the extension specifies a background script via the "background"
-  // manifest key then cef_extension_handler_t::OnBeforeBackgroundBrowser will
-  // be called to create the background browser. See that function for
-  // additional information about background scripts.
-  //
-  // For visible extension views the client application should evaluate the
-  // manifest to determine the correct extension URL to load and then pass that
-  // URL to the cef_browser_host_t::CreateBrowser* function after the extension
-  // has loaded. For example, the client can look for the "browser_action"
-  // manifest key as documented at
-  // https://developer.chrome.com/extensions/browserAction. Extension URLs take
-  // the form "chrome-extension://<extension_id>/<path>".
-  //
-  // Browsers that host extensions differ from normal browsers as follows:
-  //  - Can access chrome.* JavaScript APIs if allowed by the manifest. Visit
-  //    chrome://extensions-support for the list of extension APIs currently
-  //    supported by CEF.
-  //  - Main frame navigation to non-extension content is blocked.
-  //  - Pinch-zooming is disabled.
-  //  - CefBrowserHost::GetExtension returns the hosted extension.
-  //  - CefBrowserHost::IsBackgroundHost returns true for background hosts.
-  //
-  // See https://developer.chrome.com/extensions for extension implementation
-  // and usage documentation.
+  /// Load an extension.
+  ///
+  /// If extension resources will be read from disk using the default load
+  /// implementation then |root_directory| should be the absolute path to the
+  /// extension resources directory and |manifest| should be NULL. If extension
+  /// resources will be provided by the client (e.g. via cef_request_handler_t
+  /// and/or cef_extension_handler_t) then |root_directory| should be a path
+  /// component unique to the extension (if not absolute this will be internally
+  /// prefixed with the PK_DIR_RESOURCES path) and |manifest| should contain the
+  /// contents that would otherwise be read from the "manifest.json" file on
+  /// disk.
+  ///
+  /// The loaded extension will be accessible in all contexts sharing the same
+  /// storage (HasExtension returns true (1)). However, only the context on
+  /// which this function was called is considered the loader (DidLoadExtension
+  /// returns true (1)) and only the loader will receive
+  /// cef_request_context_handler_t callbacks for the extension.
+  ///
+  /// cef_extension_handler_t::OnExtensionLoaded will be called on load success
+  /// or cef_extension_handler_t::OnExtensionLoadFailed will be called on load
+  /// failure.
+  ///
+  /// If the extension specifies a background script via the "background"
+  /// manifest key then cef_extension_handler_t::OnBeforeBackgroundBrowser will
+  /// be called to create the background browser. See that function for
+  /// additional information about background scripts.
+  ///
+  /// For visible extension views the client application should evaluate the
+  /// manifest to determine the correct extension URL to load and then pass that
+  /// URL to the cef_browser_host_t::CreateBrowser* function after the extension
+  /// has loaded. For example, the client can look for the "browser_action"
+  /// manifest key as documented at
+  /// https://developer.chrome.com/extensions/browserAction. Extension URLs take
+  /// the form "chrome-extension://<extension_id>/<path>".
+  ///
+  /// Browsers that host extensions differ from normal browsers as follows:
+  ///  - Can access chrome.* JavaScript APIs if allowed by the manifest. Visit
+  ///    chrome://extensions-support for the list of extension APIs currently
+  ///    supported by CEF.
+  ///  - Main frame navigation to non-extension content is blocked.
+  ///  - Pinch-zooming is disabled.
+  ///  - CefBrowserHost::GetExtension returns the hosted extension.
+  ///  - CefBrowserHost::IsBackgroundHost returns true for background hosts.
+  ///
+  /// See https://developer.chrome.com/extensions for extension implementation
+  /// and usage documentation.
   ///
   void(CEF_CALLBACK* load_extension)(struct _cef_request_context_t* self,
                                      const cef_string_t* root_directory,
@@ -320,64 +259,133 @@
                                      struct _cef_extension_handler_t* handler);
 
   ///
-  // Returns true (1) if this context was used to load the extension identified
-  // by |extension_id|. Other contexts sharing the same storage will also have
-  // access to the extension (see HasExtension). This function must be called on
-  // the browser process UI thread.
+  /// Returns true (1) if this context was used to load the extension identified
+  /// by |extension_id|. Other contexts sharing the same storage will also have
+  /// access to the extension (see HasExtension). This function must be called
+  /// on the browser process UI thread.
   ///
   int(CEF_CALLBACK* did_load_extension)(struct _cef_request_context_t* self,
                                         const cef_string_t* extension_id);
 
   ///
-  // Returns true (1) if this context has access to the extension identified by
-  // |extension_id|. This may not be the context that was used to load the
-  // extension (see DidLoadExtension). This function must be called on the
-  // browser process UI thread.
+  /// Returns true (1) if this context has access to the extension identified by
+  /// |extension_id|. This may not be the context that was used to load the
+  /// extension (see DidLoadExtension). This function must be called on the
+  /// browser process UI thread.
   ///
   int(CEF_CALLBACK* has_extension)(struct _cef_request_context_t* self,
                                    const cef_string_t* extension_id);
 
   ///
-  // Retrieve the list of all extensions that this context has access to (see
-  // HasExtension). |extension_ids| will be populated with the list of extension
-  // ID values. Returns true (1) on success. This function must be called on the
-  // browser process UI thread.
+  /// Retrieve the list of all extensions that this context has access to (see
+  /// HasExtension). |extension_ids| will be populated with the list of
+  /// extension ID values. Returns true (1) on success. This function must be
+  /// called on the browser process UI thread.
   ///
   int(CEF_CALLBACK* get_extensions)(struct _cef_request_context_t* self,
                                     cef_string_list_t extension_ids);
 
   ///
-  // Returns the extension matching |extension_id| or NULL if no matching
-  // extension is accessible in this context (see HasExtension). This function
-  // must be called on the browser process UI thread.
+  /// Returns the extension matching |extension_id| or NULL if no matching
+  /// extension is accessible in this context (see HasExtension). This function
+  /// must be called on the browser process UI thread.
   ///
   struct _cef_extension_t*(CEF_CALLBACK* get_extension)(
       struct _cef_request_context_t* self,
       const cef_string_t* extension_id);
 
   ///
-  // Returns the MediaRouter object associated with this context.
+  /// Returns the MediaRouter object associated with this context.  If
+  /// |callback| is non-NULL it will be executed asnychronously on the UI thread
+  /// after the manager's context has been initialized.
   ///
   struct _cef_media_router_t*(CEF_CALLBACK* get_media_router)(
-      struct _cef_request_context_t* self);
+      struct _cef_request_context_t* self,
+      struct _cef_completion_callback_t* callback);
+
+  ///
+  /// Returns the current value for |content_type| that applies for the
+  /// specified URLs. If both URLs are NULL the default value will be returned.
+  /// Returns nullptr if no value is configured. Must be called on the browser
+  /// process UI thread.
+  ///
+  struct _cef_value_t*(CEF_CALLBACK* get_website_setting)(
+      struct _cef_request_context_t* self,
+      const cef_string_t* requesting_url,
+      const cef_string_t* top_level_url,
+      cef_content_setting_types_t content_type);
+
+  ///
+  /// Sets the current value for |content_type| for the specified URLs in the
+  /// default scope. If both URLs are NULL, and the context is not incognito,
+  /// the default value will be set. Pass nullptr for |value| to remove the
+  /// default value for this content type.
+  ///
+  /// WARNING: Incorrect usage of this function may cause instability or
+  /// security issues in Chromium. Make sure that you first understand the
+  /// potential impact of any changes to |content_type| by reviewing the related
+  /// source code in Chromium. For example, if you plan to modify
+  /// CEF_CONTENT_SETTING_TYPE_POPUPS, first review and understand the usage of
+  /// ContentSettingsType::POPUPS in Chromium:
+  /// https://source.chromium.org/search?q=ContentSettingsType::POPUPS
+  ///
+  void(CEF_CALLBACK* set_website_setting)(
+      struct _cef_request_context_t* self,
+      const cef_string_t* requesting_url,
+      const cef_string_t* top_level_url,
+      cef_content_setting_types_t content_type,
+      struct _cef_value_t* value);
+
+  ///
+  /// Returns the current value for |content_type| that applies for the
+  /// specified URLs. If both URLs are NULL the default value will be returned.
+  /// Returns CEF_CONTENT_SETTING_VALUE_DEFAULT if no value is configured. Must
+  /// be called on the browser process UI thread.
+  ///
+  cef_content_setting_values_t(CEF_CALLBACK* get_content_setting)(
+      struct _cef_request_context_t* self,
+      const cef_string_t* requesting_url,
+      const cef_string_t* top_level_url,
+      cef_content_setting_types_t content_type);
+
+  ///
+  /// Sets the current value for |content_type| for the specified URLs in the
+  /// default scope. If both URLs are NULL, and the context is not incognito,
+  /// the default value will be set. Pass CEF_CONTENT_SETTING_VALUE_DEFAULT for
+  /// |value| to use the default value for this content type.
+  ///
+  /// WARNING: Incorrect usage of this function may cause instability or
+  /// security issues in Chromium. Make sure that you first understand the
+  /// potential impact of any changes to |content_type| by reviewing the related
+  /// source code in Chromium. For example, if you plan to modify
+  /// CEF_CONTENT_SETTING_TYPE_POPUPS, first review and understand the usage of
+  /// ContentSettingsType::POPUPS in Chromium:
+  /// https://source.chromium.org/search?q=ContentSettingsType::POPUPS
+  ///
+  void(CEF_CALLBACK* set_content_setting)(
+      struct _cef_request_context_t* self,
+      const cef_string_t* requesting_url,
+      const cef_string_t* top_level_url,
+      cef_content_setting_types_t content_type,
+      cef_content_setting_values_t value);
 } cef_request_context_t;
 
 ///
-// Returns the global context object.
+/// Returns the global context object.
 ///
-CEF_EXPORT cef_request_context_t* cef_request_context_get_global_context();
+CEF_EXPORT cef_request_context_t* cef_request_context_get_global_context(void);
 
 ///
-// Creates a new context object with the specified |settings| and optional
-// |handler|.
+/// Creates a new context object with the specified |settings| and optional
+/// |handler|.
 ///
 CEF_EXPORT cef_request_context_t* cef_request_context_create_context(
     const struct _cef_request_context_settings_t* settings,
     struct _cef_request_context_handler_t* handler);
 
 ///
-// Creates a new context object that shares storage with |other| and uses an
-// optional |handler|.
+/// Creates a new context object that shares storage with |other| and uses an
+/// optional |handler|.
 ///
 CEF_EXPORT cef_request_context_t* cef_create_context_shared(
     cef_request_context_t* other,
diff --git a/src/include/capi/cef_request_context_handler_capi.h b/src/include/capi/cef_request_context_handler_capi.h
index 2d94686..d7e06f8 100644
--- a/src/include/capi/cef_request_context_handler_capi.h
+++ b/src/include/capi/cef_request_context_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=e758d8c53334b91bce818cc6e9f84915778d7827$
+// $hash=b0b532a12106d960adc446b980affeee12b93ae3$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_REQUEST_CONTEXT_HANDLER_CAPI_H_
@@ -43,78 +43,51 @@
 #include "include/capi/cef_base_capi.h"
 #include "include/capi/cef_browser_capi.h"
 #include "include/capi/cef_frame_capi.h"
+#include "include/capi/cef_preference_capi.h"
 #include "include/capi/cef_request_capi.h"
 #include "include/capi/cef_resource_request_handler_capi.h"
-#include "include/capi/cef_web_plugin_capi.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 ///
-// Implement this structure to provide handler implementations. The handler
-// instance will not be released until all objects related to the context have
-// been destroyed.
+/// Implement this structure to provide handler implementations. The handler
+/// instance will not be released until all objects related to the context have
+/// been destroyed.
 ///
 typedef struct _cef_request_context_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called on the browser process UI thread immediately after the request
-  // context has been initialized.
+  /// Called on the browser process UI thread immediately after the request
+  /// context has been initialized.
   ///
   void(CEF_CALLBACK* on_request_context_initialized)(
       struct _cef_request_context_handler_t* self,
       struct _cef_request_context_t* request_context);
 
   ///
-  // Called on multiple browser process threads before a plugin instance is
-  // loaded. |mime_type| is the mime type of the plugin that will be loaded.
-  // |plugin_url| is the content URL that the plugin will load and may be NULL.
-  // |is_main_frame| will be true (1) if the plugin is being loaded in the main
-  // (top-level) frame, |top_origin_url| is the URL for the top-level frame that
-  // contains the plugin when loading a specific plugin instance or NULL when
-  // building the initial list of enabled plugins for 'navigator.plugins'
-  // JavaScript state. |plugin_info| includes additional information about the
-  // plugin that will be loaded. |plugin_policy| is the recommended policy.
-  // Modify |plugin_policy| and return true (1) to change the policy. Return
-  // false (0) to use the recommended policy. The default plugin policy can be
-  // set at runtime using the `--plugin-policy=[allow|detect|block]` command-
-  // line flag. Decisions to mark a plugin as disabled by setting
-  // |plugin_policy| to PLUGIN_POLICY_DISABLED may be cached when
-  // |top_origin_url| is NULL. To purge the plugin list cache and potentially
-  // trigger new calls to this function call
-  // cef_request_context_t::PurgePluginListCache.
-  ///
-  int(CEF_CALLBACK* on_before_plugin_load)(
-      struct _cef_request_context_handler_t* self,
-      const cef_string_t* mime_type,
-      const cef_string_t* plugin_url,
-      int is_main_frame,
-      const cef_string_t* top_origin_url,
-      struct _cef_web_plugin_info_t* plugin_info,
-      cef_plugin_policy_t* plugin_policy);
-
-  ///
-  // Called on the browser process IO thread before a resource request is
-  // initiated. The |browser| and |frame| values represent the source of the
-  // request, and may be NULL for requests originating from service workers or
-  // cef_urlrequest_t. |request| represents the request contents and cannot be
-  // modified in this callback. |is_navigation| will be true (1) if the resource
-  // request is a navigation. |is_download| will be true (1) if the resource
-  // request is a download. |request_initiator| is the origin (scheme + domain)
-  // of the page that initiated the request. Set |disable_default_handling| to
-  // true (1) to disable default handling of the request, in which case it will
-  // need to be handled via cef_resource_request_handler_t::GetResourceHandler
-  // or it will be canceled. To allow the resource load to proceed with default
-  // handling return NULL. To specify a handler for the resource return a
-  // cef_resource_request_handler_t object. This function will not be called if
-  // the client associated with |browser| returns a non-NULL value from
-  // cef_request_handler_t::GetResourceRequestHandler for the same request
-  // (identified by cef_request_t::GetIdentifier).
+  /// Called on the browser process IO thread before a resource request is
+  /// initiated. The |browser| and |frame| values represent the source of the
+  /// request, and may be NULL for requests originating from service workers or
+  /// cef_urlrequest_t. |request| represents the request contents and cannot be
+  /// modified in this callback. |is_navigation| will be true (1) if the
+  /// resource request is a navigation. |is_download| will be true (1) if the
+  /// resource request is a download. |request_initiator| is the origin (scheme
+  /// + domain) of the page that initiated the request. Set
+  /// |disable_default_handling| to true (1) to disable default handling of the
+  /// request, in which case it will need to be handled via
+  /// cef_resource_request_handler_t::GetResourceHandler or it will be canceled.
+  /// To allow the resource load to proceed with default handling return NULL.
+  /// To specify a handler for the resource return a
+  /// cef_resource_request_handler_t object. This function will not be called if
+  /// the client associated with |browser| returns a non-NULL value from
+  /// cef_request_handler_t::GetResourceRequestHandler for the same request
+  /// (identified by cef_request_t::GetIdentifier).
   ///
   struct _cef_resource_request_handler_t*(
       CEF_CALLBACK* get_resource_request_handler)(
diff --git a/src/include/capi/cef_request_handler_capi.h b/src/include/capi/cef_request_handler_capi.h
index cd6be4f..9dd95a1 100644
--- a/src/include/capi/cef_request_handler_capi.h
+++ b/src/include/capi/cef_request_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=0167eb1abe614bd6391d273a8085fa3e53e7c217$
+// $hash=092d897e223273a940ed623547d82645f764519c$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_REQUEST_HANDLER_CAPI_H_
@@ -43,8 +43,8 @@
 #include "include/capi/cef_auth_callback_capi.h"
 #include "include/capi/cef_base_capi.h"
 #include "include/capi/cef_browser_capi.h"
+#include "include/capi/cef_callback_capi.h"
 #include "include/capi/cef_frame_capi.h"
-#include "include/capi/cef_request_callback_capi.h"
 #include "include/capi/cef_request_capi.h"
 #include "include/capi/cef_resource_request_handler_capi.h"
 #include "include/capi/cef_ssl_info_capi.h"
@@ -55,17 +55,17 @@
 #endif
 
 ///
-// Callback structure used to select a client certificate for authentication.
+/// Callback structure used to select a client certificate for authentication.
 ///
 typedef struct _cef_select_client_certificate_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Chooses the specified certificate for client certificate authentication.
-  // NULL value means that no client certificate should be used.
+  /// Chooses the specified certificate for client certificate authentication.
+  /// NULL value means that no client certificate should be used.
   ///
   void(CEF_CALLBACK* select)(
       struct _cef_select_client_certificate_callback_t* self,
@@ -73,26 +73,27 @@
 } cef_select_client_certificate_callback_t;
 
 ///
-// Implement this structure to handle events related to browser requests. The
-// functions of this structure will be called on the thread indicated.
+/// Implement this structure to handle events related to browser requests. The
+/// functions of this structure will be called on the thread indicated.
 ///
 typedef struct _cef_request_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called on the UI thread before browser navigation. Return true (1) to
-  // cancel the navigation or false (0) to allow the navigation to proceed. The
-  // |request| object cannot be modified in this callback.
-  // cef_load_handler_t::OnLoadingStateChange will be called twice in all cases.
-  // If the navigation is allowed cef_load_handler_t::OnLoadStart and
-  // cef_load_handler_t::OnLoadEnd will be called. If the navigation is canceled
-  // cef_load_handler_t::OnLoadError will be called with an |errorCode| value of
-  // ERR_ABORTED. The |user_gesture| value will be true (1) if the browser
-  // navigated via explicit user gesture (e.g. clicking a link) or false (0) if
-  // it navigated automatically (e.g. via the DomContentLoaded event).
+  /// Called on the UI thread before browser navigation. Return true (1) to
+  /// cancel the navigation or false (0) to allow the navigation to proceed. The
+  /// |request| object cannot be modified in this callback.
+  /// cef_load_handler_t::OnLoadingStateChange will be called twice in all
+  /// cases. If the navigation is allowed cef_load_handler_t::OnLoadStart and
+  /// cef_load_handler_t::OnLoadEnd will be called. If the navigation is
+  /// canceled cef_load_handler_t::OnLoadError will be called with an
+  /// |errorCode| value of ERR_ABORTED. The |user_gesture| value will be true
+  /// (1) if the browser navigated via explicit user gesture (e.g. clicking a
+  /// link) or false (0) if it navigated automatically (e.g. via the
+  /// DomContentLoaded event).
   ///
   int(CEF_CALLBACK* on_before_browse)(struct _cef_request_handler_t* self,
                                       struct _cef_browser_t* browser,
@@ -102,20 +103,20 @@
                                       int is_redirect);
 
   ///
-  // Called on the UI thread before OnBeforeBrowse in certain limited cases
-  // where navigating a new or different browser might be desirable. This
-  // includes user-initiated navigation that might open in a special way (e.g.
-  // links clicked via middle-click or ctrl + left-click) and certain types of
-  // cross-origin navigation initiated from the renderer process (e.g.
-  // navigating the top-level frame to/from a file URL). The |browser| and
-  // |frame| values represent the source of the navigation. The
-  // |target_disposition| value indicates where the user intended to navigate
-  // the browser based on standard Chromium behaviors (e.g. current tab, new
-  // tab, etc). The |user_gesture| value will be true (1) if the browser
-  // navigated via explicit user gesture (e.g. clicking a link) or false (0) if
-  // it navigated automatically (e.g. via the DomContentLoaded event). Return
-  // true (1) to cancel the navigation or false (0) to allow the navigation to
-  // proceed in the source browser's top-level frame.
+  /// Called on the UI thread before OnBeforeBrowse in certain limited cases
+  /// where navigating a new or different browser might be desirable. This
+  /// includes user-initiated navigation that might open in a special way (e.g.
+  /// links clicked via middle-click or ctrl + left-click) and certain types of
+  /// cross-origin navigation initiated from the renderer process (e.g.
+  /// navigating the top-level frame to/from a file URL). The |browser| and
+  /// |frame| values represent the source of the navigation. The
+  /// |target_disposition| value indicates where the user intended to navigate
+  /// the browser based on standard Chromium behaviors (e.g. current tab, new
+  /// tab, etc). The |user_gesture| value will be true (1) if the browser
+  /// navigated via explicit user gesture (e.g. clicking a link) or false (0) if
+  /// it navigated automatically (e.g. via the DomContentLoaded event). Return
+  /// true (1) to cancel the navigation or false (0) to allow the navigation to
+  /// proceed in the source browser's top-level frame.
   ///
   int(CEF_CALLBACK* on_open_urlfrom_tab)(
       struct _cef_request_handler_t* self,
@@ -126,20 +127,20 @@
       int user_gesture);
 
   ///
-  // Called on the browser process IO thread before a resource request is
-  // initiated. The |browser| and |frame| values represent the source of the
-  // request. |request| represents the request contents and cannot be modified
-  // in this callback. |is_navigation| will be true (1) if the resource request
-  // is a navigation. |is_download| will be true (1) if the resource request is
-  // a download. |request_initiator| is the origin (scheme + domain) of the page
-  // that initiated the request. Set |disable_default_handling| to true (1) to
-  // disable default handling of the request, in which case it will need to be
-  // handled via cef_resource_request_handler_t::GetResourceHandler or it will
-  // be canceled. To allow the resource load to proceed with default handling
-  // return NULL. To specify a handler for the resource return a
-  // cef_resource_request_handler_t object. If this callback returns NULL the
-  // same function will be called on the associated
-  // cef_request_context_handler_t, if any.
+  /// Called on the browser process IO thread before a resource request is
+  /// initiated. The |browser| and |frame| values represent the source of the
+  /// request. |request| represents the request contents and cannot be modified
+  /// in this callback. |is_navigation| will be true (1) if the resource request
+  /// is a navigation. |is_download| will be true (1) if the resource request is
+  /// a download. |request_initiator| is the origin (scheme + domain) of the
+  /// page that initiated the request. Set |disable_default_handling| to true
+  /// (1) to disable default handling of the request, in which case it will need
+  /// to be handled via cef_resource_request_handler_t::GetResourceHandler or it
+  /// will be canceled. To allow the resource load to proceed with default
+  /// handling return NULL. To specify a handler for the resource return a
+  /// cef_resource_request_handler_t object. If this callback returns NULL the
+  /// same function will be called on the associated
+  /// cef_request_context_handler_t, if any.
   ///
   struct _cef_resource_request_handler_t*(
       CEF_CALLBACK* get_resource_request_handler)(
@@ -153,16 +154,16 @@
       int* disable_default_handling);
 
   ///
-  // Called on the IO thread when the browser needs credentials from the user.
-  // |origin_url| is the origin making this authentication request. |isProxy|
-  // indicates whether the host is a proxy server. |host| contains the hostname
-  // and |port| contains the port number. |realm| is the realm of the challenge
-  // and may be NULL. |scheme| is the authentication scheme used, such as
-  // "basic" or "digest", and will be NULL if the source of the request is an
-  // FTP server. Return true (1) to continue the request and call
-  // cef_auth_callback_t::cont() either in this function or at a later time when
-  // the authentication information is available. Return false (0) to cancel the
-  // request immediately.
+  /// Called on the IO thread when the browser needs credentials from the user.
+  /// |origin_url| is the origin making this authentication request. |isProxy|
+  /// indicates whether the host is a proxy server. |host| contains the hostname
+  /// and |port| contains the port number. |realm| is the realm of the challenge
+  /// and may be NULL. |scheme| is the authentication scheme used, such as
+  /// "basic" or "digest", and will be NULL if the source of the request is an
+  /// FTP server. Return true (1) to continue the request and call
+  /// cef_auth_callback_t::cont() either in this function or at a later time
+  /// when the authentication information is available. Return false (0) to
+  /// cancel the request immediately.
   ///
   int(CEF_CALLBACK* get_auth_credentials)(
       struct _cef_request_handler_t* self,
@@ -176,48 +177,32 @@
       struct _cef_auth_callback_t* callback);
 
   ///
-  // Called on the IO thread when JavaScript requests a specific storage quota
-  // size via the webkitStorageInfo.requestQuota function. |origin_url| is the
-  // origin of the page making the request. |new_size| is the requested quota
-  // size in bytes. Return true (1) to continue the request and call
-  // cef_request_callback_t::cont() either in this function or at a later time
-  // to grant or deny the request. Return false (0) to cancel the request
-  // immediately.
+  /// Called on the UI thread to handle requests for URLs with an invalid SSL
+  /// certificate. Return true (1) and call cef_callback_t functions either in
+  /// this function or at a later time to continue or cancel the request. Return
+  /// false (0) to cancel the request immediately. If
+  /// cef_settings_t.ignore_certificate_errors is set all invalid certificates
+  /// will be accepted without calling this function.
   ///
-  int(CEF_CALLBACK* on_quota_request)(struct _cef_request_handler_t* self,
-                                      struct _cef_browser_t* browser,
-                                      const cef_string_t* origin_url,
-                                      int64 new_size,
-                                      struct _cef_request_callback_t* callback);
+  int(CEF_CALLBACK* on_certificate_error)(struct _cef_request_handler_t* self,
+                                          struct _cef_browser_t* browser,
+                                          cef_errorcode_t cert_error,
+                                          const cef_string_t* request_url,
+                                          struct _cef_sslinfo_t* ssl_info,
+                                          struct _cef_callback_t* callback);
 
   ///
-  // Called on the UI thread to handle requests for URLs with an invalid SSL
-  // certificate. Return true (1) and call cef_request_callback_t::cont() either
-  // in this function or at a later time to continue or cancel the request.
-  // Return false (0) to cancel the request immediately. If
-  // CefSettings.ignore_certificate_errors is set all invalid certificates will
-  // be accepted without calling this function.
-  ///
-  int(CEF_CALLBACK* on_certificate_error)(
-      struct _cef_request_handler_t* self,
-      struct _cef_browser_t* browser,
-      cef_errorcode_t cert_error,
-      const cef_string_t* request_url,
-      struct _cef_sslinfo_t* ssl_info,
-      struct _cef_request_callback_t* callback);
-
-  ///
-  // Called on the UI thread when a client certificate is being requested for
-  // authentication. Return false (0) to use the default behavior and
-  // automatically select the first certificate available. Return true (1) and
-  // call cef_select_client_certificate_callback_t::Select either in this
-  // function or at a later time to select a certificate. Do not call Select or
-  // call it with NULL to continue without using any certificate. |isProxy|
-  // indicates whether the host is an HTTPS proxy or the origin server. |host|
-  // and |port| contains the hostname and port of the SSL server. |certificates|
-  // is the list of certificates to choose from; this list has already been
-  // pruned by Chromium so that it only contains certificates from issuers that
-  // the server trusts.
+  /// Called on the UI thread when a client certificate is being requested for
+  /// authentication. Return false (0) to use the default behavior and
+  /// automatically select the first certificate available. Return true (1) and
+  /// call cef_select_client_certificate_callback_t::Select either in this
+  /// function or at a later time to select a certificate. Do not call Select or
+  /// call it with NULL to continue without using any certificate. |isProxy|
+  /// indicates whether the host is an HTTPS proxy or the origin server. |host|
+  /// and |port| contains the hostname and port of the SSL server.
+  /// |certificates| is the list of certificates to choose from; this list has
+  /// already been pruned by Chromium so that it only contains certificates from
+  /// issuers that the server trusts.
   ///
   int(CEF_CALLBACK* on_select_client_certificate)(
       struct _cef_request_handler_t* self,
@@ -230,24 +215,16 @@
       struct _cef_select_client_certificate_callback_t* callback);
 
   ///
-  // Called on the browser process UI thread when a plugin has crashed.
-  // |plugin_path| is the path of the plugin that crashed.
-  ///
-  void(CEF_CALLBACK* on_plugin_crashed)(struct _cef_request_handler_t* self,
-                                        struct _cef_browser_t* browser,
-                                        const cef_string_t* plugin_path);
-
-  ///
-  // Called on the browser process UI thread when the render view associated
-  // with |browser| is ready to receive/handle IPC messages in the render
-  // process.
+  /// Called on the browser process UI thread when the render view associated
+  /// with |browser| is ready to receive/handle IPC messages in the render
+  /// process.
   ///
   void(CEF_CALLBACK* on_render_view_ready)(struct _cef_request_handler_t* self,
                                            struct _cef_browser_t* browser);
 
   ///
-  // Called on the browser process UI thread when the render process terminates
-  // unexpectedly. |status| indicates how the process terminated.
+  /// Called on the browser process UI thread when the render process terminates
+  /// unexpectedly. |status| indicates how the process terminated.
   ///
   void(CEF_CALLBACK* on_render_process_terminated)(
       struct _cef_request_handler_t* self,
@@ -255,8 +232,8 @@
       cef_termination_status_t status);
 
   ///
-  // Called on the browser process UI thread when the window.document object of
-  // the main frame has been created.
+  /// Called on the browser process UI thread when the window.document object of
+  /// the main frame has been created.
   ///
   void(CEF_CALLBACK* on_document_available_in_main_frame)(
       struct _cef_request_handler_t* self,
diff --git a/src/include/capi/cef_resource_bundle_capi.h b/src/include/capi/cef_resource_bundle_capi.h
index 3a88870..b06728c 100644
--- a/src/include/capi/cef_resource_bundle_capi.h
+++ b/src/include/capi/cef_resource_bundle_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=b9577b495df3990284d4e4a3db2824196175dc91$
+// $hash=e8e8dd2730a47aad9414f7bfc2e6ad96aba2c875$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_RESOURCE_BUNDLE_CAPI_H_
@@ -41,28 +41,29 @@
 #pragma once
 
 #include "include/capi/cef_base_capi.h"
+#include "include/capi/cef_values_capi.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 ///
-// Structure used for retrieving resources from the resource bundle (*.pak)
-// files loaded by CEF during startup or via the cef_resource_bundle_handler_t
-// returned from cef_app_t::GetResourceBundleHandler. See CefSettings for
-// additional options related to resource bundle loading. The functions of this
-// structure may be called on any thread unless otherwise indicated.
+/// Structure used for retrieving resources from the resource bundle (*.pak)
+/// files loaded by CEF during startup or via the cef_resource_bundle_handler_t
+/// returned from cef_app_t::GetResourceBundleHandler. See CefSettings for
+/// additional options related to resource bundle loading. The functions of this
+/// structure may be called on any thread unless otherwise indicated.
 ///
 typedef struct _cef_resource_bundle_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns the localized string for the specified |string_id| or an NULL
-  // string if the value is not found. Include cef_pack_strings.h for a listing
-  // of valid string ID values.
+  /// Returns the localized string for the specified |string_id| or an NULL
+  /// string if the value is not found. Include cef_pack_strings.h for a listing
+  /// of valid string ID values.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_localized_string)(
@@ -70,40 +71,31 @@
       int string_id);
 
   ///
-  // Retrieves the contents of the specified scale independent |resource_id|. If
-  // the value is found then |data| and |data_size| will be populated and this
-  // function will return true (1). If the value is not found then this function
-  // will return false (0). The returned |data| pointer will remain resident in
-  // memory and should not be freed. Include cef_pack_resources.h for a listing
-  // of valid resource ID values.
+  /// Returns a cef_binary_value_t containing the decompressed contents of the
+  /// specified scale independent |resource_id| or NULL if not found. Include
+  /// cef_pack_resources.h for a listing of valid resource ID values.
   ///
-  int(CEF_CALLBACK* get_data_resource)(struct _cef_resource_bundle_t* self,
-                                       int resource_id,
-                                       void** data,
-                                       size_t* data_size);
+  struct _cef_binary_value_t*(CEF_CALLBACK* get_data_resource)(
+      struct _cef_resource_bundle_t* self,
+      int resource_id);
 
   ///
-  // Retrieves the contents of the specified |resource_id| nearest the scale
-  // factor |scale_factor|. Use a |scale_factor| value of SCALE_FACTOR_NONE for
-  // scale independent resources or call GetDataResource instead. If the value
-  // is found then |data| and |data_size| will be populated and this function
-  // will return true (1). If the value is not found then this function will
-  // return false (0). The returned |data| pointer will remain resident in
-  // memory and should not be freed. Include cef_pack_resources.h for a listing
-  // of valid resource ID values.
+  /// Returns a cef_binary_value_t containing the decompressed contents of the
+  /// specified |resource_id| nearest the scale factor |scale_factor| or NULL if
+  /// not found. Use a |scale_factor| value of SCALE_FACTOR_NONE for scale
+  /// independent resources or call GetDataResource instead.Include
+  /// cef_pack_resources.h for a listing of valid resource ID values.
   ///
-  int(CEF_CALLBACK* get_data_resource_for_scale)(
+  struct _cef_binary_value_t*(CEF_CALLBACK* get_data_resource_for_scale)(
       struct _cef_resource_bundle_t* self,
       int resource_id,
-      cef_scale_factor_t scale_factor,
-      void** data,
-      size_t* data_size);
+      cef_scale_factor_t scale_factor);
 } cef_resource_bundle_t;
 
 ///
-// Returns the global resource bundle instance.
+/// Returns the global resource bundle instance.
 ///
-CEF_EXPORT cef_resource_bundle_t* cef_resource_bundle_get_global();
+CEF_EXPORT cef_resource_bundle_t* cef_resource_bundle_get_global(void);
 
 #ifdef __cplusplus
 }
diff --git a/src/include/capi/cef_resource_bundle_handler_capi.h b/src/include/capi/cef_resource_bundle_handler_capi.h
index 1cbae99..bc9eea5 100644
--- a/src/include/capi/cef_resource_bundle_handler_capi.h
+++ b/src/include/capi/cef_resource_bundle_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=fd90a707c59a8c04b1b1bfc6129a90e27934f501$
+// $hash=00023b2ec108ae6e4bd282d16e82032cdc99d548$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_RESOURCE_BUNDLE_HANDLER_CAPI_H_
@@ -47,21 +47,21 @@
 #endif
 
 ///
-// Structure used to implement a custom resource bundle structure. See
-// CefSettings for additional options related to resource bundle loading. The
-// functions of this structure may be called on multiple threads.
+/// Structure used to implement a custom resource bundle structure. See
+/// CefSettings for additional options related to resource bundle loading. The
+/// functions of this structure may be called on multiple threads.
 ///
 typedef struct _cef_resource_bundle_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called to retrieve a localized translation for the specified |string_id|.
-  // To provide the translation set |string| to the translation string and
-  // return true (1). To use the default translation return false (0). Include
-  // cef_pack_strings.h for a listing of valid string ID values.
+  /// Called to retrieve a localized translation for the specified |string_id|.
+  /// To provide the translation set |string| to the translation string and
+  /// return true (1). To use the default translation return false (0). Include
+  /// cef_pack_strings.h for a listing of valid string ID values.
   ///
   int(CEF_CALLBACK* get_localized_string)(
       struct _cef_resource_bundle_handler_t* self,
@@ -69,12 +69,12 @@
       cef_string_t* string);
 
   ///
-  // Called to retrieve data for the specified scale independent |resource_id|.
-  // To provide the resource data set |data| and |data_size| to the data pointer
-  // and size respectively and return true (1). To use the default resource data
-  // return false (0). The resource data will not be copied and must remain
-  // resident in memory. Include cef_pack_resources.h for a listing of valid
-  // resource ID values.
+  /// Called to retrieve data for the specified scale independent |resource_id|.
+  /// To provide the resource data set |data| and |data_size| to the data
+  /// pointer and size respectively and return true (1). To use the default
+  /// resource data return false (0). The resource data will not be copied and
+  /// must remain resident in memory. Include cef_pack_resources.h for a listing
+  /// of valid resource ID values.
   ///
   int(CEF_CALLBACK* get_data_resource)(
       struct _cef_resource_bundle_handler_t* self,
@@ -83,12 +83,12 @@
       size_t* data_size);
 
   ///
-  // Called to retrieve data for the specified |resource_id| nearest the scale
-  // factor |scale_factor|. To provide the resource data set |data| and
-  // |data_size| to the data pointer and size respectively and return true (1).
-  // To use the default resource data return false (0). The resource data will
-  // not be copied and must remain resident in memory. Include
-  // cef_pack_resources.h for a listing of valid resource ID values.
+  /// Called to retrieve data for the specified |resource_id| nearest the scale
+  /// factor |scale_factor|. To provide the resource data set |data| and
+  /// |data_size| to the data pointer and size respectively and return true (1).
+  /// To use the default resource data return false (0). The resource data will
+  /// not be copied and must remain resident in memory. Include
+  /// cef_pack_resources.h for a listing of valid resource ID values.
   ///
   int(CEF_CALLBACK* get_data_resource_for_scale)(
       struct _cef_resource_bundle_handler_t* self,
diff --git a/src/include/capi/cef_resource_handler_capi.h b/src/include/capi/cef_resource_handler_capi.h
index 1dc34f4..355fecc 100644
--- a/src/include/capi/cef_resource_handler_capi.h
+++ b/src/include/capi/cef_resource_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=5241e3dd5d3fa0b17dd6d6ea2f30734a32150c88$
+// $hash=ca5c224b373452158904b0f859f126f36c927f93$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_RESOURCE_HANDLER_CAPI_H_
@@ -52,63 +52,64 @@
 #endif
 
 ///
-// Callback for asynchronous continuation of cef_resource_handler_t::skip().
+/// Callback for asynchronous continuation of cef_resource_handler_t::skip().
 ///
 typedef struct _cef_resource_skip_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Callback for asynchronous continuation of skip(). If |bytes_skipped| > 0
-  // then either skip() will be called again until the requested number of bytes
-  // have been skipped or the request will proceed. If |bytes_skipped| <= 0 the
-  // request will fail with ERR_REQUEST_RANGE_NOT_SATISFIABLE.
+  /// Callback for asynchronous continuation of skip(). If |bytes_skipped| > 0
+  /// then either skip() will be called again until the requested number of
+  /// bytes have been skipped or the request will proceed. If |bytes_skipped| <=
+  /// 0 the request will fail with ERR_REQUEST_RANGE_NOT_SATISFIABLE.
   ///
   void(CEF_CALLBACK* cont)(struct _cef_resource_skip_callback_t* self,
-                           int64 bytes_skipped);
+                           int64_t bytes_skipped);
 } cef_resource_skip_callback_t;
 
 ///
-// Callback for asynchronous continuation of cef_resource_handler_t::read().
+/// Callback for asynchronous continuation of cef_resource_handler_t::read().
 ///
 typedef struct _cef_resource_read_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Callback for asynchronous continuation of read(). If |bytes_read| == 0 the
-  // response will be considered complete. If |bytes_read| > 0 then read() will
-  // be called again until the request is complete (based on either the result
-  // or the expected content length). If |bytes_read| < 0 then the request will
-  // fail and the |bytes_read| value will be treated as the error code.
+  /// Callback for asynchronous continuation of read(). If |bytes_read| == 0 the
+  /// response will be considered complete. If |bytes_read| > 0 then read() will
+  /// be called again until the request is complete (based on either the result
+  /// or the expected content length). If |bytes_read| < 0 then the request will
+  /// fail and the |bytes_read| value will be treated as the error code.
   ///
   void(CEF_CALLBACK* cont)(struct _cef_resource_read_callback_t* self,
                            int bytes_read);
 } cef_resource_read_callback_t;
 
 ///
-// Structure used to implement a custom request handler structure. The functions
-// of this structure will be called on the IO thread unless otherwise indicated.
+/// Structure used to implement a custom request handler structure. The
+/// functions of this structure will be called on the IO thread unless otherwise
+/// indicated.
 ///
 typedef struct _cef_resource_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Open the response stream. To handle the request immediately set
-  // |handle_request| to true (1) and return true (1). To decide at a later time
-  // set |handle_request| to false (0), return true (1), and execute |callback|
-  // to continue or cancel the request. To cancel the request immediately set
-  // |handle_request| to true (1) and return false (0). This function will be
-  // called in sequence but not from a dedicated thread. For backwards
-  // compatibility set |handle_request| to false (0) and return false (0) and
-  // the ProcessRequest function will be called.
+  /// Open the response stream. To handle the request immediately set
+  /// |handle_request| to true (1) and return true (1). To decide at a later
+  /// time set |handle_request| to false (0), return true (1), and execute
+  /// |callback| to continue or cancel the request. To cancel the request
+  /// immediately set |handle_request| to true (1) and return false (0). This
+  /// function will be called in sequence but not from a dedicated thread. For
+  /// backwards compatibility set |handle_request| to false (0) and return false
+  /// (0) and the ProcessRequest function will be called.
   ///
   int(CEF_CALLBACK* open)(struct _cef_resource_handler_t* self,
                           struct _cef_request_t* request,
@@ -116,64 +117,64 @@
                           struct _cef_callback_t* callback);
 
   ///
-  // Begin processing the request. To handle the request return true (1) and
-  // call cef_callback_t::cont() once the response header information is
-  // available (cef_callback_t::cont() can also be called from inside this
-  // function if header information is available immediately). To cancel the
-  // request return false (0).
-  //
-  // WARNING: This function is deprecated. Use Open instead.
+  /// Begin processing the request. To handle the request return true (1) and
+  /// call cef_callback_t::cont() once the response header information is
+  /// available (cef_callback_t::cont() can also be called from inside this
+  /// function if header information is available immediately). To cancel the
+  /// request return false (0).
+  ///
+  /// WARNING: This function is deprecated. Use Open instead.
   ///
   int(CEF_CALLBACK* process_request)(struct _cef_resource_handler_t* self,
                                      struct _cef_request_t* request,
                                      struct _cef_callback_t* callback);
 
   ///
-  // Retrieve response header information. If the response length is not known
-  // set |response_length| to -1 and read_response() will be called until it
-  // returns false (0). If the response length is known set |response_length| to
-  // a positive value and read_response() will be called until it returns false
-  // (0) or the specified number of bytes have been read. Use the |response|
-  // object to set the mime type, http status code and other optional header
-  // values. To redirect the request to a new URL set |redirectUrl| to the new
-  // URL. |redirectUrl| can be either a relative or fully qualified URL. It is
-  // also possible to set |response| to a redirect http status code and pass the
-  // new URL via a Location header. Likewise with |redirectUrl| it is valid to
-  // set a relative or fully qualified URL as the Location header value. If an
-  // error occured while setting up the request you can call set_error() on
-  // |response| to indicate the error condition.
+  /// Retrieve response header information. If the response length is not known
+  /// set |response_length| to -1 and read_response() will be called until it
+  /// returns false (0). If the response length is known set |response_length|
+  /// to a positive value and read_response() will be called until it returns
+  /// false (0) or the specified number of bytes have been read. Use the
+  /// |response| object to set the mime type, http status code and other
+  /// optional header values. To redirect the request to a new URL set
+  /// |redirectUrl| to the new URL. |redirectUrl| can be either a relative or
+  /// fully qualified URL. It is also possible to set |response| to a redirect
+  /// http status code and pass the new URL via a Location header. Likewise with
+  /// |redirectUrl| it is valid to set a relative or fully qualified URL as the
+  /// Location header value. If an error occured while setting up the request
+  /// you can call set_error() on |response| to indicate the error condition.
   ///
   void(CEF_CALLBACK* get_response_headers)(struct _cef_resource_handler_t* self,
                                            struct _cef_response_t* response,
-                                           int64* response_length,
+                                           int64_t* response_length,
                                            cef_string_t* redirectUrl);
 
   ///
-  // Skip response data when requested by a Range header. Skip over and discard
-  // |bytes_to_skip| bytes of response data. If data is available immediately
-  // set |bytes_skipped| to the number of bytes skipped and return true (1). To
-  // read the data at a later time set |bytes_skipped| to 0, return true (1) and
-  // execute |callback| when the data is available. To indicate failure set
-  // |bytes_skipped| to < 0 (e.g. -2 for ERR_FAILED) and return false (0). This
-  // function will be called in sequence but not from a dedicated thread.
+  /// Skip response data when requested by a Range header. Skip over and discard
+  /// |bytes_to_skip| bytes of response data. If data is available immediately
+  /// set |bytes_skipped| to the number of bytes skipped and return true (1). To
+  /// read the data at a later time set |bytes_skipped| to 0, return true (1)
+  /// and execute |callback| when the data is available. To indicate failure set
+  /// |bytes_skipped| to < 0 (e.g. -2 for ERR_FAILED) and return false (0). This
+  /// function will be called in sequence but not from a dedicated thread.
   ///
   int(CEF_CALLBACK* skip)(struct _cef_resource_handler_t* self,
-                          int64 bytes_to_skip,
-                          int64* bytes_skipped,
+                          int64_t bytes_to_skip,
+                          int64_t* bytes_skipped,
                           struct _cef_resource_skip_callback_t* callback);
 
   ///
-  // Read response data. If data is available immediately copy up to
-  // |bytes_to_read| bytes into |data_out|, set |bytes_read| to the number of
-  // bytes copied, and return true (1). To read the data at a later time keep a
-  // pointer to |data_out|, set |bytes_read| to 0, return true (1) and execute
-  // |callback| when the data is available (|data_out| will remain valid until
-  // the callback is executed). To indicate response completion set |bytes_read|
-  // to 0 and return false (0). To indicate failure set |bytes_read| to < 0
-  // (e.g. -2 for ERR_FAILED) and return false (0). This function will be called
-  // in sequence but not from a dedicated thread. For backwards compatibility
-  // set |bytes_read| to -1 and return false (0) and the ReadResponse function
-  // will be called.
+  /// Read response data. If data is available immediately copy up to
+  /// |bytes_to_read| bytes into |data_out|, set |bytes_read| to the number of
+  /// bytes copied, and return true (1). To read the data at a later time keep a
+  /// pointer to |data_out|, set |bytes_read| to 0, return true (1) and execute
+  /// |callback| when the data is available (|data_out| will remain valid until
+  /// the callback is executed). To indicate response completion set
+  /// |bytes_read| to 0 and return false (0). To indicate failure set
+  /// |bytes_read| to < 0 (e.g. -2 for ERR_FAILED) and return false (0). This
+  /// function will be called in sequence but not from a dedicated thread. For
+  /// backwards compatibility set |bytes_read| to -1 and return false (0) and
+  /// the ReadResponse function will be called.
   ///
   int(CEF_CALLBACK* read)(struct _cef_resource_handler_t* self,
                           void* data_out,
@@ -182,13 +183,13 @@
                           struct _cef_resource_read_callback_t* callback);
 
   ///
-  // Read response data. If data is available immediately copy up to
-  // |bytes_to_read| bytes into |data_out|, set |bytes_read| to the number of
-  // bytes copied, and return true (1). To read the data at a later time set
-  // |bytes_read| to 0, return true (1) and call cef_callback_t::cont() when the
-  // data is available. To indicate response completion return false (0).
-  //
-  // WARNING: This function is deprecated. Use Skip and Read instead.
+  /// Read response data. If data is available immediately copy up to
+  /// |bytes_to_read| bytes into |data_out|, set |bytes_read| to the number of
+  /// bytes copied, and return true (1). To read the data at a later time set
+  /// |bytes_read| to 0, return true (1) and call cef_callback_t::cont() when
+  /// the data is available. To indicate response completion return false (0).
+  ///
+  /// WARNING: This function is deprecated. Use Skip and Read instead.
   ///
   int(CEF_CALLBACK* read_response)(struct _cef_resource_handler_t* self,
                                    void* data_out,
@@ -197,7 +198,7 @@
                                    struct _cef_callback_t* callback);
 
   ///
-  // Request processing has been canceled.
+  /// Request processing has been canceled.
   ///
   void(CEF_CALLBACK* cancel)(struct _cef_resource_handler_t* self);
 } cef_resource_handler_t;
diff --git a/src/include/capi/cef_resource_request_handler_capi.h b/src/include/capi/cef_resource_request_handler_capi.h
index 428df69..b6b735c 100644
--- a/src/include/capi/cef_resource_request_handler_capi.h
+++ b/src/include/capi/cef_resource_request_handler_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=afc96f188710bd336d09ce479a650aaa3a55357a$
+// $hash=757155e6dbceef47938fd562f7f5f48a609ce288$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_RESOURCE_REQUEST_HANDLER_CAPI_H_
@@ -42,8 +42,8 @@
 
 #include "include/capi/cef_base_capi.h"
 #include "include/capi/cef_browser_capi.h"
+#include "include/capi/cef_callback_capi.h"
 #include "include/capi/cef_frame_capi.h"
-#include "include/capi/cef_request_callback_capi.h"
 #include "include/capi/cef_request_capi.h"
 #include "include/capi/cef_resource_handler_capi.h"
 #include "include/capi/cef_response_capi.h"
@@ -56,23 +56,23 @@
 struct _cef_cookie_access_filter_t;
 
 ///
-// Implement this structure to handle events related to browser requests. The
-// functions of this structure will be called on the IO thread unless otherwise
-// indicated.
+/// Implement this structure to handle events related to browser requests. The
+/// functions of this structure will be called on the IO thread unless otherwise
+/// indicated.
 ///
 typedef struct _cef_resource_request_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called on the IO thread before a resource request is loaded. The |browser|
-  // and |frame| values represent the source of the request, and may be NULL for
-  // requests originating from service workers or cef_urlrequest_t. To
-  // optionally filter cookies for the request return a
-  // cef_cookie_access_filter_t object. The |request| object cannot not be
-  // modified in this callback.
+  /// Called on the IO thread before a resource request is loaded. The |browser|
+  /// and |frame| values represent the source of the request, and may be NULL
+  /// for requests originating from service workers or cef_urlrequest_t. To
+  /// optionally filter cookies for the request return a
+  /// cef_cookie_access_filter_t object. The |request| object cannot not be
+  /// modified in this callback.
   ///
   struct _cef_cookie_access_filter_t*(CEF_CALLBACK* get_cookie_access_filter)(
       struct _cef_resource_request_handler_t* self,
@@ -81,30 +81,30 @@
       struct _cef_request_t* request);
 
   ///
-  // Called on the IO thread before a resource request is loaded. The |browser|
-  // and |frame| values represent the source of the request, and may be NULL for
-  // requests originating from service workers or cef_urlrequest_t. To redirect
-  // or change the resource load optionally modify |request|. Modification of
-  // the request URL will be treated as a redirect. Return RV_CONTINUE to
-  // continue the request immediately. Return RV_CONTINUE_ASYNC and call
-  // cef_request_callback_t:: cont() at a later time to continue or cancel the
-  // request asynchronously. Return RV_CANCEL to cancel the request immediately.
-  //
+  /// Called on the IO thread before a resource request is loaded. The |browser|
+  /// and |frame| values represent the source of the request, and may be NULL
+  /// for requests originating from service workers or cef_urlrequest_t. To
+  /// redirect or change the resource load optionally modify |request|.
+  /// Modification of the request URL will be treated as a redirect. Return
+  /// RV_CONTINUE to continue the request immediately. Return RV_CONTINUE_ASYNC
+  /// and call cef_callback_t functions at a later time to continue or cancel
+  /// the request asynchronously. Return RV_CANCEL to cancel the request
+  /// immediately.
   ///
   cef_return_value_t(CEF_CALLBACK* on_before_resource_load)(
       struct _cef_resource_request_handler_t* self,
       struct _cef_browser_t* browser,
       struct _cef_frame_t* frame,
       struct _cef_request_t* request,
-      struct _cef_request_callback_t* callback);
+      struct _cef_callback_t* callback);
 
   ///
-  // Called on the IO thread before a resource is loaded. The |browser| and
-  // |frame| values represent the source of the request, and may be NULL for
-  // requests originating from service workers or cef_urlrequest_t. To allow the
-  // resource to load using the default network loader return NULL. To specify a
-  // handler for the resource return a cef_resource_handler_t object. The
-  // |request| object cannot not be modified in this callback.
+  /// Called on the IO thread before a resource is loaded. The |browser| and
+  /// |frame| values represent the source of the request, and may be NULL for
+  /// requests originating from service workers or cef_urlrequest_t. To allow
+  /// the resource to load using the default network loader return NULL. To
+  /// specify a handler for the resource return a cef_resource_handler_t object.
+  /// The |request| object cannot not be modified in this callback.
   ///
   struct _cef_resource_handler_t*(CEF_CALLBACK* get_resource_handler)(
       struct _cef_resource_request_handler_t* self,
@@ -113,14 +113,14 @@
       struct _cef_request_t* request);
 
   ///
-  // Called on the IO thread when a resource load is redirected. The |browser|
-  // and |frame| values represent the source of the request, and may be NULL for
-  // requests originating from service workers or cef_urlrequest_t. The
-  // |request| parameter will contain the old URL and other request-related
-  // information. The |response| parameter will contain the response that
-  // resulted in the redirect. The |new_url| parameter will contain the new URL
-  // and can be changed if desired. The |request| and |response| objects cannot
-  // be modified in this callback.
+  /// Called on the IO thread when a resource load is redirected. The |browser|
+  /// and |frame| values represent the source of the request, and may be NULL
+  /// for requests originating from service workers or cef_urlrequest_t. The
+  /// |request| parameter will contain the old URL and other request-related
+  /// information. The |response| parameter will contain the response that
+  /// resulted in the redirect. The |new_url| parameter will contain the new URL
+  /// and can be changed if desired. The |request| and |response| objects cannot
+  /// be modified in this callback.
   ///
   void(CEF_CALLBACK* on_resource_redirect)(
       struct _cef_resource_request_handler_t* self,
@@ -131,17 +131,18 @@
       cef_string_t* new_url);
 
   ///
-  // Called on the IO thread when a resource response is received. The |browser|
-  // and |frame| values represent the source of the request, and may be NULL for
-  // requests originating from service workers or cef_urlrequest_t. To allow the
-  // resource load to proceed without modification return false (0). To redirect
-  // or retry the resource load optionally modify |request| and return true (1).
-  // Modification of the request URL will be treated as a redirect. Requests
-  // handled using the default network loader cannot be redirected in this
-  // callback. The |response| object cannot be modified in this callback.
-  //
-  // WARNING: Redirecting using this function is deprecated. Use
-  // OnBeforeResourceLoad or GetResourceHandler to perform redirects.
+  /// Called on the IO thread when a resource response is received. The
+  /// |browser| and |frame| values represent the source of the request, and may
+  /// be NULL for requests originating from service workers or cef_urlrequest_t.
+  /// To allow the resource load to proceed without modification return false
+  /// (0). To redirect or retry the resource load optionally modify |request|
+  /// and return true (1). Modification of the request URL will be treated as a
+  /// redirect. Requests handled using the default network loader cannot be
+  /// redirected in this callback. The |response| object cannot be modified in
+  /// this callback.
+  ///
+  /// WARNING: Redirecting using this function is deprecated. Use
+  /// OnBeforeResourceLoad or GetResourceHandler to perform redirects.
   ///
   int(CEF_CALLBACK* on_resource_response)(
       struct _cef_resource_request_handler_t* self,
@@ -151,11 +152,11 @@
       struct _cef_response_t* response);
 
   ///
-  // Called on the IO thread to optionally filter resource response content. The
-  // |browser| and |frame| values represent the source of the request, and may
-  // be NULL for requests originating from service workers or cef_urlrequest_t.
-  // |request| and |response| represent the request and response respectively
-  // and cannot be modified in this callback.
+  /// Called on the IO thread to optionally filter resource response content.
+  /// The |browser| and |frame| values represent the source of the request, and
+  /// may be NULL for requests originating from service workers or
+  /// cef_urlrequest_t. |request| and |response| represent the request and
+  /// response respectively and cannot be modified in this callback.
   ///
   struct _cef_response_filter_t*(CEF_CALLBACK* get_resource_response_filter)(
       struct _cef_resource_request_handler_t* self,
@@ -165,20 +166,20 @@
       struct _cef_response_t* response);
 
   ///
-  // Called on the IO thread when a resource load has completed. The |browser|
-  // and |frame| values represent the source of the request, and may be NULL for
-  // requests originating from service workers or cef_urlrequest_t. |request|
-  // and |response| represent the request and response respectively and cannot
-  // be modified in this callback. |status| indicates the load completion
-  // status. |received_content_length| is the number of response bytes actually
-  // read. This function will be called for all requests, including requests
-  // that are aborted due to CEF shutdown or destruction of the associated
-  // browser. In cases where the associated browser is destroyed this callback
-  // may arrive after the cef_life_span_handler_t::OnBeforeClose callback for
-  // that browser. The cef_frame_t::IsValid function can be used to test for
-  // this situation, and care should be taken not to call |browser| or |frame|
-  // functions that modify state (like LoadURL, SendProcessMessage, etc.) if the
-  // frame is invalid.
+  /// Called on the IO thread when a resource load has completed. The |browser|
+  /// and |frame| values represent the source of the request, and may be NULL
+  /// for requests originating from service workers or cef_urlrequest_t.
+  /// |request| and |response| represent the request and response respectively
+  /// and cannot be modified in this callback. |status| indicates the load
+  /// completion status. |received_content_length| is the number of response
+  /// bytes actually read. This function will be called for all requests,
+  /// including requests that are aborted due to CEF shutdown or destruction of
+  /// the associated browser. In cases where the associated browser is destroyed
+  /// this callback may arrive after the cef_life_span_handler_t::OnBeforeClose
+  /// callback for that browser. The cef_frame_t::IsValid function can be used
+  /// to test for this situation, and care should be taken not to call |browser|
+  /// or |frame| functions that modify state (like LoadURL, SendProcessMessage,
+  /// etc.) if the frame is invalid.
   ///
   void(CEF_CALLBACK* on_resource_load_complete)(
       struct _cef_resource_request_handler_t* self,
@@ -187,17 +188,17 @@
       struct _cef_request_t* request,
       struct _cef_response_t* response,
       cef_urlrequest_status_t status,
-      int64 received_content_length);
+      int64_t received_content_length);
 
   ///
-  // Called on the IO thread to handle requests for URLs with an unknown
-  // protocol component. The |browser| and |frame| values represent the source
-  // of the request, and may be NULL for requests originating from service
-  // workers or cef_urlrequest_t. |request| cannot be modified in this callback.
-  // Set |allow_os_execution| to true (1) to attempt execution via the
-  // registered OS protocol handler, if any. SECURITY WARNING: YOU SHOULD USE
-  // THIS METHOD TO ENFORCE RESTRICTIONS BASED ON SCHEME, HOST OR OTHER URL
-  // ANALYSIS BEFORE ALLOWING OS EXECUTION.
+  /// Called on the IO thread to handle requests for URLs with an unknown
+  /// protocol component. The |browser| and |frame| values represent the source
+  /// of the request, and may be NULL for requests originating from service
+  /// workers or cef_urlrequest_t. |request| cannot be modified in this
+  /// callback. Set |allow_os_execution| to true (1) to attempt execution via
+  /// the registered OS protocol handler, if any. SECURITY WARNING: YOU SHOULD
+  /// USE THIS METHOD TO ENFORCE RESTRICTIONS BASED ON SCHEME, HOST OR OTHER URL
+  /// ANALYSIS BEFORE ALLOWING OS EXECUTION.
   ///
   void(CEF_CALLBACK* on_protocol_execution)(
       struct _cef_resource_request_handler_t* self,
@@ -208,22 +209,22 @@
 } cef_resource_request_handler_t;
 
 ///
-// Implement this structure to filter cookies that may be sent or received from
-// resource requests. The functions of this structure will be called on the IO
-// thread unless otherwise indicated.
+/// Implement this structure to filter cookies that may be sent or received from
+/// resource requests. The functions of this structure will be called on the IO
+/// thread unless otherwise indicated.
 ///
 typedef struct _cef_cookie_access_filter_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called on the IO thread before a resource request is sent. The |browser|
-  // and |frame| values represent the source of the request, and may be NULL for
-  // requests originating from service workers or cef_urlrequest_t. |request|
-  // cannot be modified in this callback. Return true (1) if the specified
-  // cookie can be sent with the request or false (0) otherwise.
+  /// Called on the IO thread before a resource request is sent. The |browser|
+  /// and |frame| values represent the source of the request, and may be NULL
+  /// for requests originating from service workers or cef_urlrequest_t.
+  /// |request| cannot be modified in this callback. Return true (1) if the
+  /// specified cookie can be sent with the request or false (0) otherwise.
   ///
   int(CEF_CALLBACK* can_send_cookie)(struct _cef_cookie_access_filter_t* self,
                                      struct _cef_browser_t* browser,
@@ -232,12 +233,12 @@
                                      const struct _cef_cookie_t* cookie);
 
   ///
-  // Called on the IO thread after a resource response is received. The
-  // |browser| and |frame| values represent the source of the request, and may
-  // be NULL for requests originating from service workers or cef_urlrequest_t.
-  // |request| cannot be modified in this callback. Return true (1) if the
-  // specified cookie returned with the response can be saved or false (0)
-  // otherwise.
+  /// Called on the IO thread after a resource response is received. The
+  /// |browser| and |frame| values represent the source of the request, and may
+  /// be NULL for requests originating from service workers or cef_urlrequest_t.
+  /// |request| cannot be modified in this callback. Return true (1) if the
+  /// specified cookie returned with the response can be saved or false (0)
+  /// otherwise.
   ///
   int(CEF_CALLBACK* can_save_cookie)(struct _cef_cookie_access_filter_t* self,
                                      struct _cef_browser_t* browser,
diff --git a/src/include/capi/cef_response_capi.h b/src/include/capi/cef_response_capi.h
index d7b0da4..d8c4b65 100644
--- a/src/include/capi/cef_response_capi.h
+++ b/src/include/capi/cef_response_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=2bccae35945ecea55c4c79bba840b44a691f1aa3$
+// $hash=7fbcd399c08dc39e33a7d0400a49f2e3a551bd02$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_RESPONSE_CAPI_H_
@@ -47,83 +47,83 @@
 #endif
 
 ///
-// Structure used to represent a web response. The functions of this structure
-// may be called on any thread.
+/// Structure used to represent a web response. The functions of this structure
+/// may be called on any thread.
 ///
 typedef struct _cef_response_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns true (1) if this object is read-only.
+  /// Returns true (1) if this object is read-only.
   ///
   int(CEF_CALLBACK* is_read_only)(struct _cef_response_t* self);
 
   ///
-  // Get the response error code. Returns ERR_NONE if there was no error.
+  /// Get the response error code. Returns ERR_NONE if there was no error.
   ///
   cef_errorcode_t(CEF_CALLBACK* get_error)(struct _cef_response_t* self);
 
   ///
-  // Set the response error code. This can be used by custom scheme handlers to
-  // return errors during initial request processing.
+  /// Set the response error code. This can be used by custom scheme handlers to
+  /// return errors during initial request processing.
   ///
   void(CEF_CALLBACK* set_error)(struct _cef_response_t* self,
                                 cef_errorcode_t error);
 
   ///
-  // Get the response status code.
+  /// Get the response status code.
   ///
   int(CEF_CALLBACK* get_status)(struct _cef_response_t* self);
 
   ///
-  // Set the response status code.
+  /// Set the response status code.
   ///
   void(CEF_CALLBACK* set_status)(struct _cef_response_t* self, int status);
 
   ///
-  // Get the response status text.
+  /// Get the response status text.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_status_text)(
       struct _cef_response_t* self);
 
   ///
-  // Set the response status text.
+  /// Set the response status text.
   ///
   void(CEF_CALLBACK* set_status_text)(struct _cef_response_t* self,
                                       const cef_string_t* statusText);
 
   ///
-  // Get the response mime type.
+  /// Get the response mime type.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_mime_type)(
       struct _cef_response_t* self);
 
   ///
-  // Set the response mime type.
+  /// Set the response mime type.
   ///
   void(CEF_CALLBACK* set_mime_type)(struct _cef_response_t* self,
                                     const cef_string_t* mimeType);
 
   ///
-  // Get the response charset.
+  /// Get the response charset.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_charset)(
       struct _cef_response_t* self);
 
   ///
-  // Set the response charset.
+  /// Set the response charset.
   ///
   void(CEF_CALLBACK* set_charset)(struct _cef_response_t* self,
                                   const cef_string_t* charset);
 
   ///
-  // Get the value for the specified response header field.
+  /// Get the value for the specified response header field.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_header_by_name)(
@@ -131,9 +131,9 @@
       const cef_string_t* name);
 
   ///
-  // Set the header |name| to |value|. If |overwrite| is true (1) any existing
-  // values will be replaced with the new value. If |overwrite| is false (0) any
-  // existing values will not be overwritten.
+  /// Set the header |name| to |value|. If |overwrite| is true (1) any existing
+  /// values will be replaced with the new value. If |overwrite| is false (0)
+  /// any existing values will not be overwritten.
   ///
   void(CEF_CALLBACK* set_header_by_name)(struct _cef_response_t* self,
                                          const cef_string_t* name,
@@ -141,34 +141,34 @@
                                          int overwrite);
 
   ///
-  // Get all response header fields.
+  /// Get all response header fields.
   ///
   void(CEF_CALLBACK* get_header_map)(struct _cef_response_t* self,
                                      cef_string_multimap_t headerMap);
 
   ///
-  // Set all response header fields.
+  /// Set all response header fields.
   ///
   void(CEF_CALLBACK* set_header_map)(struct _cef_response_t* self,
                                      cef_string_multimap_t headerMap);
 
   ///
-  // Get the resolved URL after redirects or changed as a result of HSTS.
+  /// Get the resolved URL after redirects or changed as a result of HSTS.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_url)(struct _cef_response_t* self);
 
   ///
-  // Set the resolved URL after redirects or changed as a result of HSTS.
+  /// Set the resolved URL after redirects or changed as a result of HSTS.
   ///
   void(CEF_CALLBACK* set_url)(struct _cef_response_t* self,
                               const cef_string_t* url);
 } cef_response_t;
 
 ///
-// Create a new cef_response_t object.
+/// Create a new cef_response_t object.
 ///
-CEF_EXPORT cef_response_t* cef_response_create();
+CEF_EXPORT cef_response_t* cef_response_create(void);
 
 #ifdef __cplusplus
 }
diff --git a/src/include/capi/cef_response_filter_capi.h b/src/include/capi/cef_response_filter_capi.h
index fcb4f3a..c8a57de 100644
--- a/src/include/capi/cef_response_filter_capi.h
+++ b/src/include/capi/cef_response_filter_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=5b2602702a13a71ac012808eecb09bb8b9494551$
+// $hash=2c9b14a86ee6777e4834eadcfc95802f2dedb11a$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_RESPONSE_FILTER_CAPI_H_
@@ -47,51 +47,51 @@
 #endif
 
 ///
-// Implement this structure to filter resource response content. The functions
-// of this structure will be called on the browser process IO thread.
+/// Implement this structure to filter resource response content. The functions
+/// of this structure will be called on the browser process IO thread.
 ///
 typedef struct _cef_response_filter_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Initialize the response filter. Will only be called a single time. The
-  // filter will not be installed if this function returns false (0).
+  /// Initialize the response filter. Will only be called a single time. The
+  /// filter will not be installed if this function returns false (0).
   ///
   int(CEF_CALLBACK* init_filter)(struct _cef_response_filter_t* self);
 
   ///
-  // Called to filter a chunk of data. Expected usage is as follows:
-  //
-  //  A. Read input data from |data_in| and set |data_in_read| to the number of
-  //     bytes that were read up to a maximum of |data_in_size|. |data_in| will
-  //     be NULL if |data_in_size| is zero.
-  //  B. Write filtered output data to |data_out| and set |data_out_written| to
-  //     the number of bytes that were written up to a maximum of
-  //     |data_out_size|. If no output data was written then all data must be
-  //     read from |data_in| (user must set |data_in_read| = |data_in_size|).
-  //  C. Return RESPONSE_FILTER_DONE if all output data was written or
-  //     RESPONSE_FILTER_NEED_MORE_DATA if output data is still pending.
-  //
-  // This function will be called repeatedly until the input buffer has been
-  // fully read (user sets |data_in_read| = |data_in_size|) and there is no more
-  // input data to filter (the resource response is complete). This function may
-  // then be called an additional time with an NULL input buffer if the user
-  // filled the output buffer (set |data_out_written| = |data_out_size|) and
-  // returned RESPONSE_FILTER_NEED_MORE_DATA to indicate that output data is
-  // still pending.
-  //
-  // Calls to this function will stop when one of the following conditions is
-  // met:
-  //
-  //  A. There is no more input data to filter (the resource response is
-  //     complete) and the user sets |data_out_written| = 0 or returns
-  //     RESPONSE_FILTER_DONE to indicate that all data has been written, or;
-  //  B. The user returns RESPONSE_FILTER_ERROR to indicate an error.
-  //
-  // Do not keep a reference to the buffers passed to this function.
+  /// Called to filter a chunk of data. Expected usage is as follows:
+  ///
+  ///  1. Read input data from |data_in| and set |data_in_read| to the number of
+  ///     bytes that were read up to a maximum of |data_in_size|. |data_in| will
+  ///     be NULL if |data_in_size| is zero.
+  ///  2. Write filtered output data to |data_out| and set |data_out_written| to
+  ///     the number of bytes that were written up to a maximum of
+  ///     |data_out_size|. If no output data was written then all data must be
+  ///     read from |data_in| (user must set |data_in_read| = |data_in_size|).
+  ///  3. Return RESPONSE_FILTER_DONE if all output data was written or
+  ///     RESPONSE_FILTER_NEED_MORE_DATA if output data is still pending.
+  ///
+  /// This function will be called repeatedly until the input buffer has been
+  /// fully read (user sets |data_in_read| = |data_in_size|) and there is no
+  /// more input data to filter (the resource response is complete). This
+  /// function may then be called an additional time with an NULL input buffer
+  /// if the user filled the output buffer (set |data_out_written| =
+  /// |data_out_size|) and returned RESPONSE_FILTER_NEED_MORE_DATA to indicate
+  /// that output data is still pending.
+  ///
+  /// Calls to this function will stop when one of the following conditions is
+  /// met:
+  ///
+  ///  1. There is no more input data to filter (the resource response is
+  ///     complete) and the user sets |data_out_written| = 0 or returns
+  ///     RESPONSE_FILTER_DONE to indicate that all data has been written, or;
+  ///  2. The user returns RESPONSE_FILTER_ERROR to indicate an error.
+  ///
+  /// Do not keep a reference to the buffers passed to this function.
   ///
   cef_response_filter_status_t(CEF_CALLBACK* filter)(
       struct _cef_response_filter_t* self,
diff --git a/src/include/capi/cef_scheme_capi.h b/src/include/capi/cef_scheme_capi.h
index d288091..5f87962 100644
--- a/src/include/capi/cef_scheme_capi.h
+++ b/src/include/capi/cef_scheme_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=d93b4ad0b71ffe0a05326b39c3ed0bdb26a73fac$
+// $hash=6b6a7f754abc9ee5d6f775ba9eee802d3244faf5$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_SCHEME_CAPI_H_
@@ -54,23 +54,23 @@
 struct _cef_scheme_handler_factory_t;
 
 ///
-// Structure that manages custom scheme registrations.
+/// Structure that manages custom scheme registrations.
 ///
 typedef struct _cef_scheme_registrar_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_scoped_t base;
 
   ///
-  // Register a custom scheme. This function should not be called for the built-
-  // in HTTP, HTTPS, FILE, FTP, ABOUT and DATA schemes.
-  //
-  // See cef_scheme_options_t for possible values for |options|.
-  //
-  // This function may be called on any thread. It should only be called once
-  // per unique |scheme_name| value. If |scheme_name| is already registered or
-  // if an error occurs this function will return false (0).
+  /// Register a custom scheme. This function should not be called for the
+  /// built-in HTTP, HTTPS, FILE, FTP, ABOUT and DATA schemes.
+  ///
+  /// See cef_scheme_options_t for possible values for |options|.
+  ///
+  /// This function may be called on any thread. It should only be called once
+  /// per unique |scheme_name| value. If |scheme_name| is already registered or
+  /// if an error occurs this function will return false (0).
   ///
   int(CEF_CALLBACK* add_custom_scheme)(struct _cef_scheme_registrar_t* self,
                                        const cef_string_t* scheme_name,
@@ -78,23 +78,23 @@
 } cef_scheme_registrar_t;
 
 ///
-// Structure that creates cef_resource_handler_t instances for handling scheme
-// requests. The functions of this structure will always be called on the IO
-// thread.
+/// Structure that creates cef_resource_handler_t instances for handling scheme
+/// requests. The functions of this structure will always be called on the IO
+/// thread.
 ///
 typedef struct _cef_scheme_handler_factory_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Return a new resource handler instance to handle the request or an NULL
-  // reference to allow default handling of the request. |browser| and |frame|
-  // will be the browser window and frame respectively that originated the
-  // request or NULL if the request did not originate from a browser window (for
-  // example, if the request came from cef_urlrequest_t). The |request| object
-  // passed to this function cannot be modified.
+  /// Return a new resource handler instance to handle the request or an NULL
+  /// reference to allow default handling of the request. |browser| and |frame|
+  /// will be the browser window and frame respectively that originated the
+  /// request or NULL if the request did not originate from a browser window
+  /// (for example, if the request came from cef_urlrequest_t). The |request|
+  /// object passed to this function cannot be modified.
   ///
   struct _cef_resource_handler_t*(CEF_CALLBACK* create)(
       struct _cef_scheme_handler_factory_t* self,
@@ -105,19 +105,19 @@
 } cef_scheme_handler_factory_t;
 
 ///
-// Register a scheme handler factory with the global request context. An NULL
-// |domain_name| value for a standard scheme will cause the factory to match all
-// domain names. The |domain_name| value will be ignored for non-standard
-// schemes. If |scheme_name| is a built-in scheme and no handler is returned by
-// |factory| then the built-in scheme handler factory will be called. If
-// |scheme_name| is a custom scheme then you must also implement the
-// cef_app_t::on_register_custom_schemes() function in all processes. This
-// function may be called multiple times to change or remove the factory that
-// matches the specified |scheme_name| and optional |domain_name|. Returns false
-// (0) if an error occurs. This function may be called on any thread in the
-// browser process. Using this function is equivalent to calling cef_request_con
-// text_t::cef_request_context_get_global_context()->register_scheme_handler_fac
-// tory().
+/// Register a scheme handler factory with the global request context. An NULL
+/// |domain_name| value for a standard scheme will cause the factory to match
+/// all domain names. The |domain_name| value will be ignored for non-standard
+/// schemes. If |scheme_name| is a built-in scheme and no handler is returned by
+/// |factory| then the built-in scheme handler factory will be called. If
+/// |scheme_name| is a custom scheme then you must also implement the
+/// cef_app_t::on_register_custom_schemes() function in all processes. This
+/// function may be called multiple times to change or remove the factory that
+/// matches the specified |scheme_name| and optional |domain_name|. Returns
+/// false (0) if an error occurs. This function may be called on any thread in
+/// the browser process. Using this function is equivalent to calling cef_reques
+/// t_context_t::cef_request_context_get_global_context()->register_scheme_handl
+/// er_factory().
 ///
 CEF_EXPORT int cef_register_scheme_handler_factory(
     const cef_string_t* scheme_name,
@@ -125,13 +125,13 @@
     cef_scheme_handler_factory_t* factory);
 
 ///
-// Clear all scheme handler factories registered with the global request
-// context. Returns false (0) on error. This function may be called on any
-// thread in the browser process. Using this function is equivalent to calling c
-// ef_request_context_t::cef_request_context_get_global_context()->clear_scheme_
-// handler_factories().
+/// Clear all scheme handler factories registered with the global request
+/// context. Returns false (0) on error. This function may be called on any
+/// thread in the browser process. Using this function is equivalent to calling
+/// cef_request_context_t::cef_request_context_get_global_context()->clear_schem
+/// e_handler_factories().
 ///
-CEF_EXPORT int cef_clear_scheme_handler_factories();
+CEF_EXPORT int cef_clear_scheme_handler_factories(void);
 
 #ifdef __cplusplus
 }
diff --git a/src/include/capi/cef_server_capi.h b/src/include/capi/cef_server_capi.h
index 86571db..a0644c1 100644
--- a/src/include/capi/cef_server_capi.h
+++ b/src/include/capi/cef_server_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=ffd489adc301ed88e1f30f8f38cec1730411a4b5$
+// $hash=d0563a0850f6118c850ab01c553142d2e890703e$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_SERVER_CAPI_H_
@@ -52,64 +52,64 @@
 struct _cef_server_handler_t;
 
 ///
-// Structure representing a server that supports HTTP and WebSocket requests.
-// Server capacity is limited and is intended to handle only a small number of
-// simultaneous connections (e.g. for communicating between applications on
-// localhost). The functions of this structure are safe to call from any thread
-// in the brower process unless otherwise indicated.
+/// Structure representing a server that supports HTTP and WebSocket requests.
+/// Server capacity is limited and is intended to handle only a small number of
+/// simultaneous connections (e.g. for communicating between applications on
+/// localhost). The functions of this structure are safe to call from any thread
+/// in the brower process unless otherwise indicated.
 ///
 typedef struct _cef_server_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns the task runner for the dedicated server thread.
+  /// Returns the task runner for the dedicated server thread.
   ///
   struct _cef_task_runner_t*(CEF_CALLBACK* get_task_runner)(
       struct _cef_server_t* self);
 
   ///
-  // Stop the server and shut down the dedicated server thread. See
-  // cef_server_handler_t::OnServerCreated documentation for a description of
-  // server lifespan.
+  /// Stop the server and shut down the dedicated server thread. See
+  /// cef_server_handler_t::OnServerCreated documentation for a description of
+  /// server lifespan.
   ///
   void(CEF_CALLBACK* shutdown)(struct _cef_server_t* self);
 
   ///
-  // Returns true (1) if the server is currently running and accepting incoming
-  // connections. See cef_server_handler_t::OnServerCreated documentation for a
-  // description of server lifespan. This function must be called on the
-  // dedicated server thread.
+  /// Returns true (1) if the server is currently running and accepting incoming
+  /// connections. See cef_server_handler_t::OnServerCreated documentation for a
+  /// description of server lifespan. This function must be called on the
+  /// dedicated server thread.
   ///
   int(CEF_CALLBACK* is_running)(struct _cef_server_t* self);
 
   ///
-  // Returns the server address including the port number.
+  /// Returns the server address including the port number.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_address)(struct _cef_server_t* self);
 
   ///
-  // Returns true (1) if the server currently has a connection. This function
-  // must be called on the dedicated server thread.
+  /// Returns true (1) if the server currently has a connection. This function
+  /// must be called on the dedicated server thread.
   ///
   int(CEF_CALLBACK* has_connection)(struct _cef_server_t* self);
 
   ///
-  // Returns true (1) if |connection_id| represents a valid connection. This
-  // function must be called on the dedicated server thread.
+  /// Returns true (1) if |connection_id| represents a valid connection. This
+  /// function must be called on the dedicated server thread.
   ///
   int(CEF_CALLBACK* is_valid_connection)(struct _cef_server_t* self,
                                          int connection_id);
 
   ///
-  // Send an HTTP 200 "OK" response to the connection identified by
-  // |connection_id|. |content_type| is the response content type (e.g.
-  // "text/html"), |data| is the response content, and |data_size| is the size
-  // of |data| in bytes. The contents of |data| will be copied. The connection
-  // will be closed automatically after the response is sent.
+  /// Send an HTTP 200 "OK" response to the connection identified by
+  /// |connection_id|. |content_type| is the response content type (e.g.
+  /// "text/html"), |data| is the response content, and |data_size| is the size
+  /// of |data| in bytes. The contents of |data| will be copied. The connection
+  /// will be closed automatically after the response is sent.
   ///
   void(CEF_CALLBACK* send_http200response)(struct _cef_server_t* self,
                                            int connection_id,
@@ -118,51 +118,51 @@
                                            size_t data_size);
 
   ///
-  // Send an HTTP 404 "Not Found" response to the connection identified by
-  // |connection_id|. The connection will be closed automatically after the
-  // response is sent.
+  /// Send an HTTP 404 "Not Found" response to the connection identified by
+  /// |connection_id|. The connection will be closed automatically after the
+  /// response is sent.
   ///
   void(CEF_CALLBACK* send_http404response)(struct _cef_server_t* self,
                                            int connection_id);
 
   ///
-  // Send an HTTP 500 "Internal Server Error" response to the connection
-  // identified by |connection_id|. |error_message| is the associated error
-  // message. The connection will be closed automatically after the response is
-  // sent.
+  /// Send an HTTP 500 "Internal Server Error" response to the connection
+  /// identified by |connection_id|. |error_message| is the associated error
+  /// message. The connection will be closed automatically after the response is
+  /// sent.
   ///
   void(CEF_CALLBACK* send_http500response)(struct _cef_server_t* self,
                                            int connection_id,
                                            const cef_string_t* error_message);
 
   ///
-  // Send a custom HTTP response to the connection identified by
-  // |connection_id|. |response_code| is the HTTP response code sent in the
-  // status line (e.g. 200), |content_type| is the response content type sent as
-  // the "Content-Type" header (e.g. "text/html"), |content_length| is the
-  // expected content length, and |extra_headers| is the map of extra response
-  // headers. If |content_length| is >= 0 then the "Content-Length" header will
-  // be sent. If |content_length| is 0 then no content is expected and the
-  // connection will be closed automatically after the response is sent. If
-  // |content_length| is < 0 then no "Content-Length" header will be sent and
-  // the client will continue reading until the connection is closed. Use the
-  // SendRawData function to send the content, if applicable, and call
-  // CloseConnection after all content has been sent.
+  /// Send a custom HTTP response to the connection identified by
+  /// |connection_id|. |response_code| is the HTTP response code sent in the
+  /// status line (e.g. 200), |content_type| is the response content type sent
+  /// as the "Content-Type" header (e.g. "text/html"), |content_length| is the
+  /// expected content length, and |extra_headers| is the map of extra response
+  /// headers. If |content_length| is >= 0 then the "Content-Length" header will
+  /// be sent. If |content_length| is 0 then no content is expected and the
+  /// connection will be closed automatically after the response is sent. If
+  /// |content_length| is < 0 then no "Content-Length" header will be sent and
+  /// the client will continue reading until the connection is closed. Use the
+  /// SendRawData function to send the content, if applicable, and call
+  /// CloseConnection after all content has been sent.
   ///
   void(CEF_CALLBACK* send_http_response)(struct _cef_server_t* self,
                                          int connection_id,
                                          int response_code,
                                          const cef_string_t* content_type,
-                                         int64 content_length,
+                                         int64_t content_length,
                                          cef_string_multimap_t extra_headers);
 
   ///
-  // Send raw data directly to the connection identified by |connection_id|.
-  // |data| is the raw data and |data_size| is the size of |data| in bytes. The
-  // contents of |data| will be copied. No validation of |data| is performed
-  // internally so the client should be careful to send the amount indicated by
-  // the "Content-Length" header, if specified. See SendHttpResponse
-  // documentation for intended usage.
+  /// Send raw data directly to the connection identified by |connection_id|.
+  /// |data| is the raw data and |data_size| is the size of |data| in bytes. The
+  /// contents of |data| will be copied. No validation of |data| is performed
+  /// internally so the client should be careful to send the amount indicated by
+  /// the "Content-Length" header, if specified. See SendHttpResponse
+  /// documentation for intended usage.
   ///
   void(CEF_CALLBACK* send_raw_data)(struct _cef_server_t* self,
                                     int connection_id,
@@ -170,17 +170,17 @@
                                     size_t data_size);
 
   ///
-  // Close the connection identified by |connection_id|. See SendHttpResponse
-  // documentation for intended usage.
+  /// Close the connection identified by |connection_id|. See SendHttpResponse
+  /// documentation for intended usage.
   ///
   void(CEF_CALLBACK* close_connection)(struct _cef_server_t* self,
                                        int connection_id);
 
   ///
-  // Send a WebSocket message to the connection identified by |connection_id|.
-  // |data| is the response content and |data_size| is the size of |data| in
-  // bytes. The contents of |data| will be copied. See
-  // cef_server_handler_t::OnWebSocketRequest documentation for intended usage.
+  /// Send a WebSocket message to the connection identified by |connection_id|.
+  /// |data| is the response content and |data_size| is the size of |data| in
+  /// bytes. The contents of |data| will be copied. See
+  /// cef_server_handler_t::OnWebSocketRequest documentation for intended usage.
   ///
   void(CEF_CALLBACK* send_web_socket_message)(struct _cef_server_t* self,
                                               int connection_id,
@@ -189,85 +189,86 @@
 } cef_server_t;
 
 ///
-// Create a new server that binds to |address| and |port|. |address| must be a
-// valid IPv4 or IPv6 address (e.g. 127.0.0.1 or ::1) and |port| must be a port
-// number outside of the reserved range (e.g. between 1025 and 65535 on most
-// platforms). |backlog| is the maximum number of pending connections. A new
-// thread will be created for each CreateServer call (the "dedicated server
-// thread"). It is therefore recommended to use a different cef_server_handler_t
-// instance for each CreateServer call to avoid thread safety issues in the
-// cef_server_handler_t implementation. The
-// cef_server_handler_t::OnServerCreated function will be called on the
-// dedicated server thread to report success or failure. See
-// cef_server_handler_t::OnServerCreated documentation for a description of
-// server lifespan.
+/// Create a new server that binds to |address| and |port|. |address| must be a
+/// valid IPv4 or IPv6 address (e.g. 127.0.0.1 or ::1) and |port| must be a port
+/// number outside of the reserved range (e.g. between 1025 and 65535 on most
+/// platforms). |backlog| is the maximum number of pending connections. A new
+/// thread will be created for each CreateServer call (the "dedicated server
+/// thread"). It is therefore recommended to use a different
+/// cef_server_handler_t instance for each CreateServer call to avoid thread
+/// safety issues in the cef_server_handler_t implementation. The
+/// cef_server_handler_t::OnServerCreated function will be called on the
+/// dedicated server thread to report success or failure. See
+/// cef_server_handler_t::OnServerCreated documentation for a description of
+/// server lifespan.
 ///
 CEF_EXPORT void cef_server_create(const cef_string_t* address,
-                                  uint16 port,
+                                  uint16_t port,
                                   int backlog,
                                   struct _cef_server_handler_t* handler);
 
 ///
-// Implement this structure to handle HTTP server requests. A new thread will be
-// created for each cef_server_t::CreateServer call (the "dedicated server
-// thread"), and the functions of this structure will be called on that thread.
-// It is therefore recommended to use a different cef_server_handler_t instance
-// for each cef_server_t::CreateServer call to avoid thread safety issues in the
-// cef_server_handler_t implementation.
+/// Implement this structure to handle HTTP server requests. A new thread will
+/// be created for each cef_server_t::CreateServer call (the "dedicated server
+/// thread"), and the functions of this structure will be called on that thread.
+/// It is therefore recommended to use a different cef_server_handler_t instance
+/// for each cef_server_t::CreateServer call to avoid thread safety issues in
+/// the cef_server_handler_t implementation.
 ///
 typedef struct _cef_server_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called when |server| is created. If the server was started successfully
-  // then cef_server_t::IsRunning will return true (1). The server will continue
-  // running until cef_server_t::Shutdown is called, after which time
-  // OnServerDestroyed will be called. If the server failed to start then
-  // OnServerDestroyed will be called immediately after this function returns.
+  /// Called when |server| is created. If the server was started successfully
+  /// then cef_server_t::IsRunning will return true (1). The server will
+  /// continue running until cef_server_t::Shutdown is called, after which time
+  /// OnServerDestroyed will be called. If the server failed to start then
+  /// OnServerDestroyed will be called immediately after this function returns.
   ///
   void(CEF_CALLBACK* on_server_created)(struct _cef_server_handler_t* self,
                                         struct _cef_server_t* server);
 
   ///
-  // Called when |server| is destroyed. The server thread will be stopped after
-  // this function returns. The client should release any references to |server|
-  // when this function is called. See OnServerCreated documentation for a
-  // description of server lifespan.
+  /// Called when |server| is destroyed. The server thread will be stopped after
+  /// this function returns. The client should release any references to
+  /// |server| when this function is called. See OnServerCreated documentation
+  /// for a description of server lifespan.
   ///
   void(CEF_CALLBACK* on_server_destroyed)(struct _cef_server_handler_t* self,
                                           struct _cef_server_t* server);
 
   ///
-  // Called when a client connects to |server|. |connection_id| uniquely
-  // identifies the connection. Each call to this function will have a matching
-  // call to OnClientDisconnected.
+  /// Called when a client connects to |server|. |connection_id| uniquely
+  /// identifies the connection. Each call to this function will have a matching
+  /// call to OnClientDisconnected.
   ///
   void(CEF_CALLBACK* on_client_connected)(struct _cef_server_handler_t* self,
                                           struct _cef_server_t* server,
                                           int connection_id);
 
   ///
-  // Called when a client disconnects from |server|. |connection_id| uniquely
-  // identifies the connection. The client should release any data associated
-  // with |connection_id| when this function is called and |connection_id|
-  // should no longer be passed to cef_server_t functions. Disconnects can
-  // originate from either the client or the server. For example, the server
-  // will disconnect automatically after a cef_server_t::SendHttpXXXResponse
-  // function is called.
+  /// Called when a client disconnects from |server|. |connection_id| uniquely
+  /// identifies the connection. The client should release any data associated
+  /// with |connection_id| when this function is called and |connection_id|
+  /// should no longer be passed to cef_server_t functions. Disconnects can
+  /// originate from either the client or the server. For example, the server
+  /// will disconnect automatically after a cef_server_t::SendHttpXXXResponse
+  /// function is called.
   ///
   void(CEF_CALLBACK* on_client_disconnected)(struct _cef_server_handler_t* self,
                                              struct _cef_server_t* server,
                                              int connection_id);
 
   ///
-  // Called when |server| receives an HTTP request. |connection_id| uniquely
-  // identifies the connection, |client_address| is the requesting IPv4 or IPv6
-  // client address including port number, and |request| contains the request
-  // contents (URL, function, headers and optional POST data). Call cef_server_t
-  // functions either synchronously or asynchronusly to send a response.
+  /// Called when |server| receives an HTTP request. |connection_id| uniquely
+  /// identifies the connection, |client_address| is the requesting IPv4 or IPv6
+  /// client address including port number, and |request| contains the request
+  /// contents (URL, function, headers and optional POST data). Call
+  /// cef_server_t functions either synchronously or asynchronusly to send a
+  /// response.
   ///
   void(CEF_CALLBACK* on_http_request)(struct _cef_server_handler_t* self,
                                       struct _cef_server_t* server,
@@ -276,18 +277,18 @@
                                       struct _cef_request_t* request);
 
   ///
-  // Called when |server| receives a WebSocket request. |connection_id| uniquely
-  // identifies the connection, |client_address| is the requesting IPv4 or IPv6
-  // client address including port number, and |request| contains the request
-  // contents (URL, function, headers and optional POST data). Execute
-  // |callback| either synchronously or asynchronously to accept or decline the
-  // WebSocket connection. If the request is accepted then OnWebSocketConnected
-  // will be called after the WebSocket has connected and incoming messages will
-  // be delivered to the OnWebSocketMessage callback. If the request is declined
-  // then the client will be disconnected and OnClientDisconnected will be
-  // called. Call the cef_server_t::SendWebSocketMessage function after
-  // receiving the OnWebSocketConnected callback to respond with WebSocket
-  // messages.
+  /// Called when |server| receives a WebSocket request. |connection_id|
+  /// uniquely identifies the connection, |client_address| is the requesting
+  /// IPv4 or IPv6 client address including port number, and |request| contains
+  /// the request contents (URL, function, headers and optional POST data).
+  /// Execute |callback| either synchronously or asynchronously to accept or
+  /// decline the WebSocket connection. If the request is accepted then
+  /// OnWebSocketConnected will be called after the WebSocket has connected and
+  /// incoming messages will be delivered to the OnWebSocketMessage callback. If
+  /// the request is declined then the client will be disconnected and
+  /// OnClientDisconnected will be called. Call the
+  /// cef_server_t::SendWebSocketMessage function after receiving the
+  /// OnWebSocketConnected callback to respond with WebSocket messages.
   ///
   void(CEF_CALLBACK* on_web_socket_request)(struct _cef_server_handler_t* self,
                                             struct _cef_server_t* server,
@@ -297,9 +298,9 @@
                                             struct _cef_callback_t* callback);
 
   ///
-  // Called after the client has accepted the WebSocket connection for |server|
-  // and |connection_id| via the OnWebSocketRequest callback. See
-  // OnWebSocketRequest documentation for intended usage.
+  /// Called after the client has accepted the WebSocket connection for |server|
+  /// and |connection_id| via the OnWebSocketRequest callback. See
+  /// OnWebSocketRequest documentation for intended usage.
   ///
   void(CEF_CALLBACK* on_web_socket_connected)(
       struct _cef_server_handler_t* self,
@@ -307,11 +308,11 @@
       int connection_id);
 
   ///
-  // Called when |server| receives an WebSocket message. |connection_id|
-  // uniquely identifies the connection, |data| is the message content and
-  // |data_size| is the size of |data| in bytes. Do not keep a reference to
-  // |data| outside of this function. See OnWebSocketRequest documentation for
-  // intended usage.
+  /// Called when |server| receives an WebSocket message. |connection_id|
+  /// uniquely identifies the connection, |data| is the message content and
+  /// |data_size| is the size of |data| in bytes. Do not keep a reference to
+  /// |data| outside of this function. See OnWebSocketRequest documentation for
+  /// intended usage.
   ///
   void(CEF_CALLBACK* on_web_socket_message)(struct _cef_server_handler_t* self,
                                             struct _cef_server_t* server,
diff --git a/src/include/capi/cef_request_callback_capi.h b/src/include/capi/cef_shared_memory_region_capi.h
similarity index 67%
copy from src/include/capi/cef_request_callback_capi.h
copy to src/include/capi/cef_shared_memory_region_capi.h
index 36316e9..fbc1312 100644
--- a/src/include/capi/cef_request_callback_capi.h
+++ b/src/include/capi/cef_shared_memory_region_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,11 +33,11 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=3efd81a4bfdfca579a77f14bd37b8192122ebda4$
+// $hash=dfa2f2d57339e05592d7ee5f4c4c54dd0932cd94$
 //
 
-#ifndef CEF_INCLUDE_CAPI_CEF_REQUEST_CALLBACK_CAPI_H_
-#define CEF_INCLUDE_CAPI_CEF_REQUEST_CALLBACK_CAPI_H_
+#ifndef CEF_INCLUDE_CAPI_CEF_SHARED_MEMORY_REGION_CAPI_H_
+#define CEF_INCLUDE_CAPI_CEF_SHARED_MEMORY_REGION_CAPI_H_
 #pragma once
 
 #include "include/capi/cef_base_capi.h"
@@ -47,28 +47,33 @@
 #endif
 
 ///
-// Callback structure used for asynchronous continuation of url requests.
+/// Structure that wraps platform-dependent share memory region mapping.
 ///
-typedef struct _cef_request_callback_t {
+typedef struct _cef_shared_memory_region_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Continue the url request. If |allow| is true (1) the request will be
-  // continued. Otherwise, the request will be canceled.
+  /// Returns true (1) if the mapping is valid.
   ///
-  void(CEF_CALLBACK* cont)(struct _cef_request_callback_t* self, int allow);
+  int(CEF_CALLBACK* is_valid)(struct _cef_shared_memory_region_t* self);
 
   ///
-  // Cancel the url request.
+  /// Returns the size of the mapping in bytes. Returns 0 for invalid instances.
   ///
-  void(CEF_CALLBACK* cancel)(struct _cef_request_callback_t* self);
-} cef_request_callback_t;
+  size_t(CEF_CALLBACK* size)(struct _cef_shared_memory_region_t* self);
+
+  ///
+  /// Returns the pointer to the memory. Returns nullptr for invalid instances.
+  /// The returned pointer is only valid for the life span of this object.
+  ///
+  void*(CEF_CALLBACK* memory)(struct _cef_shared_memory_region_t* self);
+} cef_shared_memory_region_t;
 
 #ifdef __cplusplus
 }
 #endif
 
-#endif  // CEF_INCLUDE_CAPI_CEF_REQUEST_CALLBACK_CAPI_H_
+#endif  // CEF_INCLUDE_CAPI_CEF_SHARED_MEMORY_REGION_CAPI_H_
diff --git a/src/include/capi/cef_shared_process_message_builder_capi.h b/src/include/capi/cef_shared_process_message_builder_capi.h
new file mode 100644
index 0000000..1b57064
--- /dev/null
+++ b/src/include/capi/cef_shared_process_message_builder_capi.h
@@ -0,0 +1,101 @@
+// Copyright (c) 2023 Marshall A. Greenblatt. 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 file was generated by the CEF translator tool and should not edited
+// by hand. See the translator.README.txt file in the tools directory for
+// more information.
+//
+// $hash=1a2d8806256d04362f181350db2835850cb3e0ae$
+//
+
+#ifndef CEF_INCLUDE_CAPI_CEF_SHARED_PROCESS_MESSAGE_BUILDER_CAPI_H_
+#define CEF_INCLUDE_CAPI_CEF_SHARED_PROCESS_MESSAGE_BUILDER_CAPI_H_
+#pragma once
+
+#include "include/capi/cef_process_message_capi.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+///
+/// Structure that builds a cef_process_message_t containing a shared memory
+/// region. This structure is not thread-safe but may be used exclusively on a
+/// different thread from the one which constructed it.
+///
+typedef struct _cef_shared_process_message_builder_t {
+  ///
+  /// Base structure.
+  ///
+  cef_base_ref_counted_t base;
+
+  ///
+  /// Returns true (1) if the builder is valid.
+  ///
+  int(CEF_CALLBACK* is_valid)(
+      struct _cef_shared_process_message_builder_t* self);
+
+  ///
+  /// Returns the size of the shared memory region in bytes. Returns 0 for
+  /// invalid instances.
+  ///
+  size_t(CEF_CALLBACK* size)(
+      struct _cef_shared_process_message_builder_t* self);
+
+  ///
+  /// Returns the pointer to the writable memory. Returns nullptr for invalid
+  /// instances. The returned pointer is only valid for the life span of this
+  /// object.
+  ///
+  void*(CEF_CALLBACK* memory)(
+      struct _cef_shared_process_message_builder_t* self);
+
+  ///
+  /// Creates a new cef_process_message_t from the data provided to the builder.
+  /// Returns nullptr for invalid instances. Invalidates the builder instance.
+  ///
+  struct _cef_process_message_t*(CEF_CALLBACK* build)(
+      struct _cef_shared_process_message_builder_t* self);
+} cef_shared_process_message_builder_t;
+
+///
+/// Creates a new cef_shared_process_message_builder_t with the specified |name|
+/// and shared memory region of specified |byte_size|.
+///
+CEF_EXPORT cef_shared_process_message_builder_t*
+cef_shared_process_message_builder_create(const cef_string_t* name,
+                                          size_t byte_size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // CEF_INCLUDE_CAPI_CEF_SHARED_PROCESS_MESSAGE_BUILDER_CAPI_H_
diff --git a/src/include/capi/cef_ssl_info_capi.h b/src/include/capi/cef_ssl_info_capi.h
index da83e0b..54b2009 100644
--- a/src/include/capi/cef_ssl_info_capi.h
+++ b/src/include/capi/cef_ssl_info_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=badaadcff4641fea876fb626b8ffe5a6f34a376c$
+// $hash=99dff3042ea437ecf5771eff9b3cab4c22190534$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_SSL_INFO_CAPI_H_
@@ -49,29 +49,29 @@
 #endif
 
 ///
-// Structure representing SSL information.
+/// Structure representing SSL information.
 ///
 typedef struct _cef_sslinfo_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns a bitmask containing any and all problems verifying the server
-  // certificate.
+  /// Returns a bitmask containing any and all problems verifying the server
+  /// certificate.
   ///
   cef_cert_status_t(CEF_CALLBACK* get_cert_status)(struct _cef_sslinfo_t* self);
 
   ///
-  // Returns the X.509 certificate.
+  /// Returns the X.509 certificate.
   ///
   struct _cef_x509certificate_t*(CEF_CALLBACK* get_x509certificate)(
       struct _cef_sslinfo_t* self);
 } cef_sslinfo_t;
 
 ///
-// Returns true (1) if the certificate status represents an error.
+/// Returns true (1) if the certificate status represents an error.
 ///
 CEF_EXPORT int cef_is_cert_status_error(cef_cert_status_t status);
 
diff --git a/src/include/capi/cef_ssl_status_capi.h b/src/include/capi/cef_ssl_status_capi.h
index df49ac9..0c6c4b7 100644
--- a/src/include/capi/cef_ssl_status_capi.h
+++ b/src/include/capi/cef_ssl_status_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=3755121a7b89de52a67885ac1c6d12de23f4b657$
+// $hash=034a68aa4901cde95e12a7900cfc65753fbde345$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_SSL_STATUS_CAPI_H_
@@ -49,40 +49,40 @@
 #endif
 
 ///
-// Structure representing the SSL information for a navigation entry.
+/// Structure representing the SSL information for a navigation entry.
 ///
 typedef struct _cef_sslstatus_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns true (1) if the status is related to a secure SSL/TLS connection.
+  /// Returns true (1) if the status is related to a secure SSL/TLS connection.
   ///
   int(CEF_CALLBACK* is_secure_connection)(struct _cef_sslstatus_t* self);
 
   ///
-  // Returns a bitmask containing any and all problems verifying the server
-  // certificate.
+  /// Returns a bitmask containing any and all problems verifying the server
+  /// certificate.
   ///
   cef_cert_status_t(CEF_CALLBACK* get_cert_status)(
       struct _cef_sslstatus_t* self);
 
   ///
-  // Returns the SSL version used for the SSL connection.
+  /// Returns the SSL version used for the SSL connection.
   ///
   cef_ssl_version_t(CEF_CALLBACK* get_sslversion)(
       struct _cef_sslstatus_t* self);
 
   ///
-  // Returns a bitmask containing the page security content status.
+  /// Returns a bitmask containing the page security content status.
   ///
   cef_ssl_content_status_t(CEF_CALLBACK* get_content_status)(
       struct _cef_sslstatus_t* self);
 
   ///
-  // Returns the X.509 certificate.
+  /// Returns the X.509 certificate.
   ///
   struct _cef_x509certificate_t*(CEF_CALLBACK* get_x509certificate)(
       struct _cef_sslstatus_t* self);
diff --git a/src/include/capi/cef_stream_capi.h b/src/include/capi/cef_stream_capi.h
index d1f779d..e3cd57b 100644
--- a/src/include/capi/cef_stream_capi.h
+++ b/src/include/capi/cef_stream_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=bd5bbcdc385f83512bf64304e180f1a05b765c16$
+// $hash=5632e62f83aac60e62db9d7f308563fed3285c65$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_STREAM_CAPI_H_
@@ -47,17 +47,17 @@
 #endif
 
 ///
-// Structure the client can implement to provide a custom stream reader. The
-// functions of this structure may be called on any thread.
+/// Structure the client can implement to provide a custom stream reader. The
+/// functions of this structure may be called on any thread.
 ///
 typedef struct _cef_read_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Read raw binary data.
+  /// Read raw binary data.
   ///
   size_t(CEF_CALLBACK* read)(struct _cef_read_handler_t* self,
                              void* ptr,
@@ -65,43 +65,44 @@
                              size_t n);
 
   ///
-  // Seek to the specified offset position. |whence| may be any one of SEEK_CUR,
-  // SEEK_END or SEEK_SET. Return zero on success and non-zero on failure.
+  /// Seek to the specified offset position. |whence| may be any one of
+  /// SEEK_CUR, SEEK_END or SEEK_SET. Return zero on success and non-zero on
+  /// failure.
   ///
   int(CEF_CALLBACK* seek)(struct _cef_read_handler_t* self,
-                          int64 offset,
+                          int64_t offset,
                           int whence);
 
   ///
-  // Return the current offset position.
+  /// Return the current offset position.
   ///
-  int64(CEF_CALLBACK* tell)(struct _cef_read_handler_t* self);
+  int64_t(CEF_CALLBACK* tell)(struct _cef_read_handler_t* self);
 
   ///
-  // Return non-zero if at end of file.
+  /// Return non-zero if at end of file.
   ///
   int(CEF_CALLBACK* eof)(struct _cef_read_handler_t* self);
 
   ///
-  // Return true (1) if this handler performs work like accessing the file
-  // system which may block. Used as a hint for determining the thread to access
-  // the handler from.
+  /// Return true (1) if this handler performs work like accessing the file
+  /// system which may block. Used as a hint for determining the thread to
+  /// access the handler from.
   ///
   int(CEF_CALLBACK* may_block)(struct _cef_read_handler_t* self);
 } cef_read_handler_t;
 
 ///
-// Structure used to read data from a stream. The functions of this structure
-// may be called on any thread.
+/// Structure used to read data from a stream. The functions of this structure
+/// may be called on any thread.
 ///
 typedef struct _cef_stream_reader_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Read raw binary data.
+  /// Read raw binary data.
   ///
   size_t(CEF_CALLBACK* read)(struct _cef_stream_reader_t* self,
                              void* ptr,
@@ -109,61 +110,62 @@
                              size_t n);
 
   ///
-  // Seek to the specified offset position. |whence| may be any one of SEEK_CUR,
-  // SEEK_END or SEEK_SET. Returns zero on success and non-zero on failure.
+  /// Seek to the specified offset position. |whence| may be any one of
+  /// SEEK_CUR, SEEK_END or SEEK_SET. Returns zero on success and non-zero on
+  /// failure.
   ///
   int(CEF_CALLBACK* seek)(struct _cef_stream_reader_t* self,
-                          int64 offset,
+                          int64_t offset,
                           int whence);
 
   ///
-  // Return the current offset position.
+  /// Return the current offset position.
   ///
-  int64(CEF_CALLBACK* tell)(struct _cef_stream_reader_t* self);
+  int64_t(CEF_CALLBACK* tell)(struct _cef_stream_reader_t* self);
 
   ///
-  // Return non-zero if at end of file.
+  /// Return non-zero if at end of file.
   ///
   int(CEF_CALLBACK* eof)(struct _cef_stream_reader_t* self);
 
   ///
-  // Returns true (1) if this reader performs work like accessing the file
-  // system which may block. Used as a hint for determining the thread to access
-  // the reader from.
+  /// Returns true (1) if this reader performs work like accessing the file
+  /// system which may block. Used as a hint for determining the thread to
+  /// access the reader from.
   ///
   int(CEF_CALLBACK* may_block)(struct _cef_stream_reader_t* self);
 } cef_stream_reader_t;
 
 ///
-// Create a new cef_stream_reader_t object from a file.
+/// Create a new cef_stream_reader_t object from a file.
 ///
 CEF_EXPORT cef_stream_reader_t* cef_stream_reader_create_for_file(
     const cef_string_t* fileName);
 
 ///
-// Create a new cef_stream_reader_t object from data.
+/// Create a new cef_stream_reader_t object from data.
 ///
 CEF_EXPORT cef_stream_reader_t* cef_stream_reader_create_for_data(void* data,
                                                                   size_t size);
 
 ///
-// Create a new cef_stream_reader_t object from a custom handler.
+/// Create a new cef_stream_reader_t object from a custom handler.
 ///
 CEF_EXPORT cef_stream_reader_t* cef_stream_reader_create_for_handler(
     cef_read_handler_t* handler);
 
 ///
-// Structure the client can implement to provide a custom stream writer. The
-// functions of this structure may be called on any thread.
+/// Structure the client can implement to provide a custom stream writer. The
+/// functions of this structure may be called on any thread.
 ///
 typedef struct _cef_write_handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Write raw binary data.
+  /// Write raw binary data.
   ///
   size_t(CEF_CALLBACK* write)(struct _cef_write_handler_t* self,
                               const void* ptr,
@@ -171,43 +173,44 @@
                               size_t n);
 
   ///
-  // Seek to the specified offset position. |whence| may be any one of SEEK_CUR,
-  // SEEK_END or SEEK_SET. Return zero on success and non-zero on failure.
+  /// Seek to the specified offset position. |whence| may be any one of
+  /// SEEK_CUR, SEEK_END or SEEK_SET. Return zero on success and non-zero on
+  /// failure.
   ///
   int(CEF_CALLBACK* seek)(struct _cef_write_handler_t* self,
-                          int64 offset,
+                          int64_t offset,
                           int whence);
 
   ///
-  // Return the current offset position.
+  /// Return the current offset position.
   ///
-  int64(CEF_CALLBACK* tell)(struct _cef_write_handler_t* self);
+  int64_t(CEF_CALLBACK* tell)(struct _cef_write_handler_t* self);
 
   ///
-  // Flush the stream.
+  /// Flush the stream.
   ///
   int(CEF_CALLBACK* flush)(struct _cef_write_handler_t* self);
 
   ///
-  // Return true (1) if this handler performs work like accessing the file
-  // system which may block. Used as a hint for determining the thread to access
-  // the handler from.
+  /// Return true (1) if this handler performs work like accessing the file
+  /// system which may block. Used as a hint for determining the thread to
+  /// access the handler from.
   ///
   int(CEF_CALLBACK* may_block)(struct _cef_write_handler_t* self);
 } cef_write_handler_t;
 
 ///
-// Structure used to write data to a stream. The functions of this structure may
-// be called on any thread.
+/// Structure used to write data to a stream. The functions of this structure
+/// may be called on any thread.
 ///
 typedef struct _cef_stream_writer_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Write raw binary data.
+  /// Write raw binary data.
   ///
   size_t(CEF_CALLBACK* write)(struct _cef_stream_writer_t* self,
                               const void* ptr,
@@ -215,39 +218,40 @@
                               size_t n);
 
   ///
-  // Seek to the specified offset position. |whence| may be any one of SEEK_CUR,
-  // SEEK_END or SEEK_SET. Returns zero on success and non-zero on failure.
+  /// Seek to the specified offset position. |whence| may be any one of
+  /// SEEK_CUR, SEEK_END or SEEK_SET. Returns zero on success and non-zero on
+  /// failure.
   ///
   int(CEF_CALLBACK* seek)(struct _cef_stream_writer_t* self,
-                          int64 offset,
+                          int64_t offset,
                           int whence);
 
   ///
-  // Return the current offset position.
+  /// Return the current offset position.
   ///
-  int64(CEF_CALLBACK* tell)(struct _cef_stream_writer_t* self);
+  int64_t(CEF_CALLBACK* tell)(struct _cef_stream_writer_t* self);
 
   ///
-  // Flush the stream.
+  /// Flush the stream.
   ///
   int(CEF_CALLBACK* flush)(struct _cef_stream_writer_t* self);
 
   ///
-  // Returns true (1) if this writer performs work like accessing the file
-  // system which may block. Used as a hint for determining the thread to access
-  // the writer from.
+  /// Returns true (1) if this writer performs work like accessing the file
+  /// system which may block. Used as a hint for determining the thread to
+  /// access the writer from.
   ///
   int(CEF_CALLBACK* may_block)(struct _cef_stream_writer_t* self);
 } cef_stream_writer_t;
 
 ///
-// Create a new cef_stream_writer_t object for a file.
+/// Create a new cef_stream_writer_t object for a file.
 ///
 CEF_EXPORT cef_stream_writer_t* cef_stream_writer_create_for_file(
     const cef_string_t* fileName);
 
 ///
-// Create a new cef_stream_writer_t object for a custom handler.
+/// Create a new cef_stream_writer_t object for a custom handler.
 ///
 CEF_EXPORT cef_stream_writer_t* cef_stream_writer_create_for_handler(
     cef_write_handler_t* handler);
diff --git a/src/include/capi/cef_string_visitor_capi.h b/src/include/capi/cef_string_visitor_capi.h
index 0a7ba35..5ea9b38 100644
--- a/src/include/capi/cef_string_visitor_capi.h
+++ b/src/include/capi/cef_string_visitor_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=bba3a9719860f9a81c63cbb052a4c501416b2ada$
+// $hash=6a22e5144c0254acb09656e6e41eedd05f2dd7e7$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_STRING_VISITOR_CAPI_H_
@@ -47,16 +47,16 @@
 #endif
 
 ///
-// Implement this structure to receive string values asynchronously.
+/// Implement this structure to receive string values asynchronously.
 ///
 typedef struct _cef_string_visitor_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Method that will be executed.
+  /// Method that will be executed.
   ///
   void(CEF_CALLBACK* visit)(struct _cef_string_visitor_t* self,
                             const cef_string_t* string);
diff --git a/src/include/capi/cef_task_capi.h b/src/include/capi/cef_task_capi.h
index c52a549..dbe5f44 100644
--- a/src/include/capi/cef_task_capi.h
+++ b/src/include/capi/cef_task_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=025daa5db3bf16029953da7703e3e5968bd97fe2$
+// $hash=fc609ce5aa3bc51e5cef1f9174dbfc5cff0a0689$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_TASK_CAPI_H_
@@ -47,109 +47,109 @@
 #endif
 
 ///
-// Implement this structure for asynchronous task execution. If the task is
-// posted successfully and if the associated message loop is still running then
-// the execute() function will be called on the target thread. If the task fails
-// to post then the task object may be destroyed on the source thread instead of
-// the target thread. For this reason be cautious when performing work in the
-// task object destructor.
+/// Implement this structure for asynchronous task execution. If the task is
+/// posted successfully and if the associated message loop is still running then
+/// the execute() function will be called on the target thread. If the task
+/// fails to post then the task object may be destroyed on the source thread
+/// instead of the target thread. For this reason be cautious when performing
+/// work in the task object destructor.
 ///
 typedef struct _cef_task_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Method that will be executed on the target thread.
+  /// Method that will be executed on the target thread.
   ///
   void(CEF_CALLBACK* execute)(struct _cef_task_t* self);
 } cef_task_t;
 
 ///
-// Structure that asynchronously executes tasks on the associated thread. It is
-// safe to call the functions of this structure on any thread.
-//
-// CEF maintains multiple internal threads that are used for handling different
-// types of tasks in different processes. The cef_thread_id_t definitions in
-// cef_types.h list the common CEF threads. Task runners are also available for
-// other CEF threads as appropriate (for example, V8 WebWorker threads).
+/// Structure that asynchronously executes tasks on the associated thread. It is
+/// safe to call the functions of this structure on any thread.
+///
+/// CEF maintains multiple internal threads that are used for handling different
+/// types of tasks in different processes. The cef_thread_id_t definitions in
+/// cef_types.h list the common CEF threads. Task runners are also available for
+/// other CEF threads as appropriate (for example, V8 WebWorker threads).
 ///
 typedef struct _cef_task_runner_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns true (1) if this object is pointing to the same task runner as
-  // |that| object.
+  /// Returns true (1) if this object is pointing to the same task runner as
+  /// |that| object.
   ///
   int(CEF_CALLBACK* is_same)(struct _cef_task_runner_t* self,
                              struct _cef_task_runner_t* that);
 
   ///
-  // Returns true (1) if this task runner belongs to the current thread.
+  /// Returns true (1) if this task runner belongs to the current thread.
   ///
   int(CEF_CALLBACK* belongs_to_current_thread)(struct _cef_task_runner_t* self);
 
   ///
-  // Returns true (1) if this task runner is for the specified CEF thread.
+  /// Returns true (1) if this task runner is for the specified CEF thread.
   ///
   int(CEF_CALLBACK* belongs_to_thread)(struct _cef_task_runner_t* self,
                                        cef_thread_id_t threadId);
 
   ///
-  // Post a task for execution on the thread associated with this task runner.
-  // Execution will occur asynchronously.
+  /// Post a task for execution on the thread associated with this task runner.
+  /// Execution will occur asynchronously.
   ///
   int(CEF_CALLBACK* post_task)(struct _cef_task_runner_t* self,
                                struct _cef_task_t* task);
 
   ///
-  // Post a task for delayed execution on the thread associated with this task
-  // runner. Execution will occur asynchronously. Delayed tasks are not
-  // supported on V8 WebWorker threads and will be executed without the
-  // specified delay.
+  /// Post a task for delayed execution on the thread associated with this task
+  /// runner. Execution will occur asynchronously. Delayed tasks are not
+  /// supported on V8 WebWorker threads and will be executed without the
+  /// specified delay.
   ///
   int(CEF_CALLBACK* post_delayed_task)(struct _cef_task_runner_t* self,
                                        struct _cef_task_t* task,
-                                       int64 delay_ms);
+                                       int64_t delay_ms);
 } cef_task_runner_t;
 
 ///
-// Returns the task runner for the current thread. Only CEF threads will have
-// task runners. An NULL reference will be returned if this function is called
-// on an invalid thread.
+/// Returns the task runner for the current thread. Only CEF threads will have
+/// task runners. An NULL reference will be returned if this function is called
+/// on an invalid thread.
 ///
-CEF_EXPORT cef_task_runner_t* cef_task_runner_get_for_current_thread();
+CEF_EXPORT cef_task_runner_t* cef_task_runner_get_for_current_thread(void);
 
 ///
-// Returns the task runner for the specified CEF thread.
+/// Returns the task runner for the specified CEF thread.
 ///
 CEF_EXPORT cef_task_runner_t* cef_task_runner_get_for_thread(
     cef_thread_id_t threadId);
 
 ///
-// Returns true (1) if called on the specified thread. Equivalent to using
-// cef_task_runner_t::GetForThread(threadId)->belongs_to_current_thread().
+/// Returns true (1) if called on the specified thread. Equivalent to using
+/// cef_task_runner_t::GetForThread(threadId)->belongs_to_current_thread().
 ///
 CEF_EXPORT int cef_currently_on(cef_thread_id_t threadId);
 
 ///
-// Post a task for execution on the specified thread. Equivalent to using
-// cef_task_runner_t::GetForThread(threadId)->PostTask(task).
+/// Post a task for execution on the specified thread. Equivalent to using
+/// cef_task_runner_t::GetForThread(threadId)->PostTask(task).
 ///
 CEF_EXPORT int cef_post_task(cef_thread_id_t threadId, cef_task_t* task);
 
 ///
-// Post a task for delayed execution on the specified thread. Equivalent to
-// using cef_task_runner_t::GetForThread(threadId)->PostDelayedTask(task,
-// delay_ms).
+/// Post a task for delayed execution on the specified thread. Equivalent to
+/// using cef_task_runner_t::GetForThread(threadId)->PostDelayedTask(task,
+/// delay_ms).
 ///
 CEF_EXPORT int cef_post_delayed_task(cef_thread_id_t threadId,
                                      cef_task_t* task,
-                                     int64 delay_ms);
+                                     int64_t delay_ms);
 
 #ifdef __cplusplus
 }
diff --git a/src/include/capi/cef_thread_capi.h b/src/include/capi/cef_thread_capi.h
index 1a9e9a3..adfb79a 100644
--- a/src/include/capi/cef_thread_capi.h
+++ b/src/include/capi/cef_thread_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=370cdeaa3252a9ed0e1a627d858dcab23af24ee1$
+// $hash=b111114b291d3b91c526e6b3da5741959469ec4a$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_THREAD_CAPI_H_
@@ -48,60 +48,60 @@
 #endif
 
 ///
-// A simple thread abstraction that establishes a message loop on a new thread.
-// The consumer uses cef_task_runner_t to execute code on the thread's message
-// loop. The thread is terminated when the cef_thread_t object is destroyed or
-// stop() is called. All pending tasks queued on the thread's message loop will
-// run to completion before the thread is terminated. cef_thread_create() can be
-// called on any valid CEF thread in either the browser or render process. This
-// structure should only be used for tasks that require a dedicated thread. In
-// most cases you can post tasks to an existing CEF thread instead of creating a
-// new one; see cef_task.h for details.
+/// A simple thread abstraction that establishes a message loop on a new thread.
+/// The consumer uses cef_task_runner_t to execute code on the thread's message
+/// loop. The thread is terminated when the cef_thread_t object is destroyed or
+/// stop() is called. All pending tasks queued on the thread's message loop will
+/// run to completion before the thread is terminated. cef_thread_create() can
+/// be called on any valid CEF thread in either the browser or render process.
+/// This structure should only be used for tasks that require a dedicated
+/// thread. In most cases you can post tasks to an existing CEF thread instead
+/// of creating a new one; see cef_task.h for details.
 ///
 typedef struct _cef_thread_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns the cef_task_runner_t that will execute code on this thread's
-  // message loop. This function is safe to call from any thread.
+  /// Returns the cef_task_runner_t that will execute code on this thread's
+  /// message loop. This function is safe to call from any thread.
   ///
   struct _cef_task_runner_t*(CEF_CALLBACK* get_task_runner)(
       struct _cef_thread_t* self);
 
   ///
-  // Returns the platform thread ID. It will return the same value after stop()
-  // is called. This function is safe to call from any thread.
+  /// Returns the platform thread ID. It will return the same value after stop()
+  /// is called. This function is safe to call from any thread.
   ///
   cef_platform_thread_id_t(CEF_CALLBACK* get_platform_thread_id)(
       struct _cef_thread_t* self);
 
   ///
-  // Stop and join the thread. This function must be called from the same thread
-  // that called cef_thread_create(). Do not call this function if
-  // cef_thread_create() was called with a |stoppable| value of false (0).
+  /// Stop and join the thread. This function must be called from the same
+  /// thread that called cef_thread_create(). Do not call this function if
+  /// cef_thread_create() was called with a |stoppable| value of false (0).
   ///
   void(CEF_CALLBACK* stop)(struct _cef_thread_t* self);
 
   ///
-  // Returns true (1) if the thread is currently running. This function must be
-  // called from the same thread that called cef_thread_create().
+  /// Returns true (1) if the thread is currently running. This function must be
+  /// called from the same thread that called cef_thread_create().
   ///
   int(CEF_CALLBACK* is_running)(struct _cef_thread_t* self);
 } cef_thread_t;
 
 ///
-// Create and start a new thread. This function does not block waiting for the
-// thread to run initialization. |display_name| is the name that will be used to
-// identify the thread. |priority| is the thread execution priority.
-// |message_loop_type| indicates the set of asynchronous events that the thread
-// can process. If |stoppable| is true (1) the thread will stopped and joined on
-// destruction or when stop() is called; otherwise, the the thread cannot be
-// stopped and will be leaked on shutdown. On Windows the |com_init_mode| value
-// specifies how COM will be initialized for the thread. If |com_init_mode| is
-// set to COM_INIT_MODE_STA then |message_loop_type| must be set to ML_TYPE_UI.
+/// Create and start a new thread. This function does not block waiting for the
+/// thread to run initialization. |display_name| is the name that will be used
+/// to identify the thread. |priority| is the thread execution priority.
+/// |message_loop_type| indicates the set of asynchronous events that the thread
+/// can process. If |stoppable| is true (1) the thread will stopped and joined
+/// on destruction or when stop() is called; otherwise, the thread cannot be
+/// stopped and will be leaked on shutdown. On Windows the |com_init_mode| value
+/// specifies how COM will be initialized for the thread. If |com_init_mode| is
+/// set to COM_INIT_MODE_STA then |message_loop_type| must be set to ML_TYPE_UI.
 ///
 CEF_EXPORT cef_thread_t* cef_thread_create(
     const cef_string_t* display_name,
diff --git a/src/include/capi/cef_trace_capi.h b/src/include/capi/cef_trace_capi.h
index 336e08b..7c3645d 100644
--- a/src/include/capi/cef_trace_capi.h
+++ b/src/include/capi/cef_trace_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=b1b96b7cb636afbd201b88bc1544afc58099c0b6$
+// $hash=28e2d2d86dffdfdad0f275a444656a0638b44d0e$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_TRACE_CAPI_H_
@@ -48,20 +48,20 @@
 #endif
 
 ///
-// Implement this structure to receive notification when tracing has completed.
-// The functions of this structure will be called on the browser process UI
-// thread.
+/// Implement this structure to receive notification when tracing has completed.
+/// The functions of this structure will be called on the browser process UI
+/// thread.
 ///
 typedef struct _cef_end_tracing_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called after all processes have sent their trace data. |tracing_file| is
-  // the path at which tracing data was written. The client is responsible for
-  // deleting |tracing_file|.
+  /// Called after all processes have sent their trace data. |tracing_file| is
+  /// the path at which tracing data was written. The client is responsible for
+  /// deleting |tracing_file|.
   ///
   void(CEF_CALLBACK* on_end_tracing_complete)(
       struct _cef_end_tracing_callback_t* self,
@@ -69,47 +69,47 @@
 } cef_end_tracing_callback_t;
 
 ///
-// Start tracing events on all processes. Tracing is initialized asynchronously
-// and |callback| will be executed on the UI thread after initialization is
-// complete.
-//
-// If CefBeginTracing was called previously, or if a CefEndTracingAsync call is
-// pending, CefBeginTracing will fail and return false (0).
-//
-// |categories| is a comma-delimited list of category wildcards. A category can
-// have an optional '-' prefix to make it an excluded category. Having both
-// included and excluded categories in the same list is not supported.
-//
-// Example: "test_MyTest*" Example: "test_MyTest*,test_OtherStuff" Example:
-// "-excluded_category1,-excluded_category2"
-//
-// This function must be called on the browser process UI thread.
+/// Start tracing events on all processes. Tracing is initialized asynchronously
+/// and |callback| will be executed on the UI thread after initialization is
+/// complete.
+///
+/// If CefBeginTracing was called previously, or if a CefEndTracingAsync call is
+/// pending, CefBeginTracing will fail and return false (0).
+///
+/// |categories| is a comma-delimited list of category wildcards. A category can
+/// have an optional '-' prefix to make it an excluded category. Having both
+/// included and excluded categories in the same list is not supported.
+///
+/// Examples: - "test_MyTest*" - "test_MyTest*,test_OtherStuff" -
+/// "-excluded_category1,-excluded_category2"
+///
+/// This function must be called on the browser process UI thread.
 ///
 CEF_EXPORT int cef_begin_tracing(const cef_string_t* categories,
                                  struct _cef_completion_callback_t* callback);
 
 ///
-// Stop tracing events on all processes.
-//
-// This function will fail and return false (0) if a previous call to
-// CefEndTracingAsync is already pending or if CefBeginTracing was not called.
-//
-// |tracing_file| is the path at which tracing data will be written and
-// |callback| is the callback that will be executed once all processes have sent
-// their trace data. If |tracing_file| is NULL a new temporary file path will be
-// used. If |callback| is NULL no trace data will be written.
-//
-// This function must be called on the browser process UI thread.
+/// Stop tracing events on all processes.
+///
+/// This function will fail and return false (0) if a previous call to
+/// CefEndTracingAsync is already pending or if CefBeginTracing was not called.
+///
+/// |tracing_file| is the path at which tracing data will be written and
+/// |callback| is the callback that will be executed once all processes have
+/// sent their trace data. If |tracing_file| is NULL a new temporary file path
+/// will be used. If |callback| is NULL no trace data will be written.
+///
+/// This function must be called on the browser process UI thread.
 ///
 CEF_EXPORT int cef_end_tracing(const cef_string_t* tracing_file,
                                cef_end_tracing_callback_t* callback);
 
 ///
-// Returns the current system trace time or, if none is defined, the current
-// high-res time. Can be used by clients to synchronize with the time
-// information in trace events.
+/// Returns the current system trace time or, if none is defined, the current
+/// high-res time. Can be used by clients to synchronize with the time
+/// information in trace events.
 ///
-CEF_EXPORT int64 cef_now_from_system_trace_time();
+CEF_EXPORT int64_t cef_now_from_system_trace_time(void);
 
 #ifdef __cplusplus
 }
diff --git a/src/include/capi/cef_urlrequest_capi.h b/src/include/capi/cef_urlrequest_capi.h
index 81eeaa6..6db921d 100644
--- a/src/include/capi/cef_urlrequest_capi.h
+++ b/src/include/capi/cef_urlrequest_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=63d875f5a922dd2c2e1efaaf0ddaa20475f79ef8$
+// $hash=b038ad859f1dad2d8ba63589da118898350b309c$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_URLREQUEST_CAPI_H_
@@ -53,84 +53,78 @@
 struct _cef_urlrequest_client_t;
 
 ///
-// Structure used to make a URL request. URL requests are not associated with a
-// browser instance so no cef_client_t callbacks will be executed. URL requests
-// can be created on any valid CEF thread in either the browser or render
-// process. Once created the functions of the URL request object must be
-// accessed on the same thread that created it.
+/// Structure used to make a URL request. URL requests are not associated with a
+/// browser instance so no cef_client_t callbacks will be executed. URL requests
+/// can be created on any valid CEF thread in either the browser or render
+/// process. Once created the functions of the URL request object must be
+/// accessed on the same thread that created it.
 ///
 typedef struct _cef_urlrequest_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns the request object used to create this URL request. The returned
-  // object is read-only and should not be modified.
+  /// Returns the request object used to create this URL request. The returned
+  /// object is read-only and should not be modified.
   ///
   struct _cef_request_t*(CEF_CALLBACK* get_request)(
       struct _cef_urlrequest_t* self);
 
   ///
-  // Returns the client.
+  /// Returns the client.
   ///
   struct _cef_urlrequest_client_t*(CEF_CALLBACK* get_client)(
       struct _cef_urlrequest_t* self);
 
   ///
-  // Returns the request status.
+  /// Returns the request status.
   ///
   cef_urlrequest_status_t(CEF_CALLBACK* get_request_status)(
       struct _cef_urlrequest_t* self);
 
   ///
-  // Returns the request error if status is UR_CANCELED or UR_FAILED, or 0
-  // otherwise.
+  /// Returns the request error if status is UR_CANCELED or UR_FAILED, or 0
+  /// otherwise.
   ///
   cef_errorcode_t(CEF_CALLBACK* get_request_error)(
       struct _cef_urlrequest_t* self);
 
   ///
-  // Returns the response, or NULL if no response information is available.
-  // Response information will only be available after the upload has completed.
-  // The returned object is read-only and should not be modified.
+  /// Returns the response, or NULL if no response information is available.
+  /// Response information will only be available after the upload has
+  /// completed. The returned object is read-only and should not be modified.
   ///
   struct _cef_response_t*(CEF_CALLBACK* get_response)(
       struct _cef_urlrequest_t* self);
 
   ///
-  // Returns true (1) if the response body was served from the cache. This
-  // includes responses for which revalidation was required.
+  /// Returns true (1) if the response body was served from the cache. This
+  /// includes responses for which revalidation was required.
   ///
   int(CEF_CALLBACK* response_was_cached)(struct _cef_urlrequest_t* self);
 
   ///
-  // Cancel the request.
+  /// Cancel the request.
   ///
   void(CEF_CALLBACK* cancel)(struct _cef_urlrequest_t* self);
 } cef_urlrequest_t;
 
 ///
-// Create a new URL request that is not associated with a specific browser or
-// frame. Use cef_frame_t::CreateURLRequest instead if you want the request to
-// have this association, in which case it may be handled differently (see
-// documentation on that function). Requests may originate from the both browser
-// process and the render process.
-//
-// For requests originating from the browser process:
-//   - It may be intercepted by the client via CefResourceRequestHandler or
-//     CefSchemeHandlerFactory.
-//   - POST data may only contain only a single element of type PDE_TYPE_FILE
-//     or PDE_TYPE_BYTES.
-//   - If |request_context| is empty the global request context will be used.
-// For requests originating from the render process:
-//   - It cannot be intercepted by the client so only http(s) and blob schemes
-//     are supported.
-//   - POST data may only contain a single element of type PDE_TYPE_BYTES.
-//   - The |request_context| parameter must be NULL.
-//
-// The |request| object will be marked as read-only after calling this function.
+/// Create a new URL request that is not associated with a specific browser or
+/// frame. Use cef_frame_t::CreateURLRequest instead if you want the request to
+/// have this association, in which case it may be handled differently (see
+/// documentation on that function). A request created with this function may
+/// only originate from the browser process, and will behave as follows:
+///   - It may be intercepted by the client via CefResourceRequestHandler or
+///     CefSchemeHandlerFactory.
+///   - POST data may only contain only a single element of type PDE_TYPE_FILE
+///     or PDE_TYPE_BYTES.
+///   - If |request_context| is empty the global request context will be used.
+///
+/// The |request| object will be marked as read-only after calling this
+/// function.
 ///
 CEF_EXPORT cef_urlrequest_t* cef_urlrequest_create(
     struct _cef_request_t* request,
@@ -138,50 +132,50 @@
     struct _cef_request_context_t* request_context);
 
 ///
-// Structure that should be implemented by the cef_urlrequest_t client. The
-// functions of this structure will be called on the same thread that created
-// the request unless otherwise documented.
+/// Structure that should be implemented by the cef_urlrequest_t client. The
+/// functions of this structure will be called on the same thread that created
+/// the request unless otherwise documented.
 ///
 typedef struct _cef_urlrequest_client_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Notifies the client that the request has completed. Use the
-  // cef_urlrequest_t::GetRequestStatus function to determine if the request was
-  // successful or not.
+  /// Notifies the client that the request has completed. Use the
+  /// cef_urlrequest_t::GetRequestStatus function to determine if the request
+  /// was successful or not.
   ///
   void(CEF_CALLBACK* on_request_complete)(struct _cef_urlrequest_client_t* self,
                                           struct _cef_urlrequest_t* request);
 
   ///
-  // Notifies the client of upload progress. |current| denotes the number of
-  // bytes sent so far and |total| is the total size of uploading data (or -1 if
-  // chunked upload is enabled). This function will only be called if the
-  // UR_FLAG_REPORT_UPLOAD_PROGRESS flag is set on the request.
+  /// Notifies the client of upload progress. |current| denotes the number of
+  /// bytes sent so far and |total| is the total size of uploading data (or -1
+  /// if chunked upload is enabled). This function will only be called if the
+  /// UR_FLAG_REPORT_UPLOAD_PROGRESS flag is set on the request.
   ///
   void(CEF_CALLBACK* on_upload_progress)(struct _cef_urlrequest_client_t* self,
                                          struct _cef_urlrequest_t* request,
-                                         int64 current,
-                                         int64 total);
+                                         int64_t current,
+                                         int64_t total);
 
   ///
-  // Notifies the client of download progress. |current| denotes the number of
-  // bytes received up to the call and |total| is the expected total size of the
-  // response (or -1 if not determined).
+  /// Notifies the client of download progress. |current| denotes the number of
+  /// bytes received up to the call and |total| is the expected total size of
+  /// the response (or -1 if not determined).
   ///
   void(CEF_CALLBACK* on_download_progress)(
       struct _cef_urlrequest_client_t* self,
       struct _cef_urlrequest_t* request,
-      int64 current,
-      int64 total);
+      int64_t current,
+      int64_t total);
 
   ///
-  // Called when some part of the response is read. |data| contains the current
-  // bytes received since the last call. This function will not be called if the
-  // UR_FLAG_NO_DOWNLOAD_DATA flag is set on the request.
+  /// Called when some part of the response is read. |data| contains the current
+  /// bytes received since the last call. This function will not be called if
+  /// the UR_FLAG_NO_DOWNLOAD_DATA flag is set on the request.
   ///
   void(CEF_CALLBACK* on_download_data)(struct _cef_urlrequest_client_t* self,
                                        struct _cef_urlrequest_t* request,
@@ -189,15 +183,16 @@
                                        size_t data_length);
 
   ///
-  // Called on the IO thread when the browser needs credentials from the user.
-  // |isProxy| indicates whether the host is a proxy server. |host| contains the
-  // hostname and |port| contains the port number. Return true (1) to continue
-  // the request and call cef_auth_callback_t::cont() when the authentication
-  // information is available. If the request has an associated browser/frame
-  // then returning false (0) will result in a call to GetAuthCredentials on the
-  // cef_request_handler_t associated with that browser, if any. Otherwise,
-  // returning false (0) will cancel the request immediately. This function will
-  // only be called for requests initiated from the browser process.
+  /// Called on the IO thread when the browser needs credentials from the user.
+  /// |isProxy| indicates whether the host is a proxy server. |host| contains
+  /// the hostname and |port| contains the port number. Return true (1) to
+  /// continue the request and call cef_auth_callback_t::cont() when the
+  /// authentication information is available. If the request has an associated
+  /// browser/frame then returning false (0) will result in a call to
+  /// GetAuthCredentials on the cef_request_handler_t associated with that
+  /// browser, if any. Otherwise, returning false (0) will cancel the request
+  /// immediately. This function will only be called for requests initiated from
+  /// the browser process.
   ///
   int(CEF_CALLBACK* get_auth_credentials)(
       struct _cef_urlrequest_client_t* self,
diff --git a/src/include/capi/cef_v8_capi.h b/src/include/capi/cef_v8_capi.h
index c54f309..98cec92 100644
--- a/src/include/capi/cef_v8_capi.h
+++ b/src/include/capi/cef_v8_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=3bb8f9801a153172981120926c7a5629e08d7131$
+// $hash=865ca5bff4a0867d0c25cb41bd2aa808cf3fddbd$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_V8_CAPI_H_
@@ -55,82 +55,82 @@
 struct _cef_v8value_t;
 
 ///
-// Structure representing a V8 context handle. V8 handles can only be accessed
-// from the thread on which they are created. Valid threads for creating a V8
-// handle include the render process main thread (TID_RENDERER) and WebWorker
-// threads. A task runner for posting tasks on the associated thread can be
-// retrieved via the cef_v8context_t::get_task_runner() function.
+/// Structure representing a V8 context handle. V8 handles can only be accessed
+/// from the thread on which they are created. Valid threads for creating a V8
+/// handle include the render process main thread (TID_RENDERER) and WebWorker
+/// threads. A task runner for posting tasks on the associated thread can be
+/// retrieved via the cef_v8context_t::get_task_runner() function.
 ///
 typedef struct _cef_v8context_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns the task runner associated with this context. V8 handles can only
-  // be accessed from the thread on which they are created. This function can be
-  // called on any render process thread.
+  /// Returns the task runner associated with this context. V8 handles can only
+  /// be accessed from the thread on which they are created. This function can
+  /// be called on any render process thread.
   ///
   struct _cef_task_runner_t*(CEF_CALLBACK* get_task_runner)(
       struct _cef_v8context_t* self);
 
   ///
-  // Returns true (1) if the underlying handle is valid and it can be accessed
-  // on the current thread. Do not call any other functions if this function
-  // returns false (0).
+  /// Returns true (1) if the underlying handle is valid and it can be accessed
+  /// on the current thread. Do not call any other functions if this function
+  /// returns false (0).
   ///
   int(CEF_CALLBACK* is_valid)(struct _cef_v8context_t* self);
 
   ///
-  // Returns the browser for this context. This function will return an NULL
-  // reference for WebWorker contexts.
+  /// Returns the browser for this context. This function will return an NULL
+  /// reference for WebWorker contexts.
   ///
   struct _cef_browser_t*(CEF_CALLBACK* get_browser)(
       struct _cef_v8context_t* self);
 
   ///
-  // Returns the frame for this context. This function will return an NULL
-  // reference for WebWorker contexts.
+  /// Returns the frame for this context. This function will return an NULL
+  /// reference for WebWorker contexts.
   ///
   struct _cef_frame_t*(CEF_CALLBACK* get_frame)(struct _cef_v8context_t* self);
 
   ///
-  // Returns the global object for this context. The context must be entered
-  // before calling this function.
+  /// Returns the global object for this context. The context must be entered
+  /// before calling this function.
   ///
   struct _cef_v8value_t*(CEF_CALLBACK* get_global)(
       struct _cef_v8context_t* self);
 
   ///
-  // Enter this context. A context must be explicitly entered before creating a
-  // V8 Object, Array, Function or Date asynchronously. exit() must be called
-  // the same number of times as enter() before releasing this context. V8
-  // objects belong to the context in which they are created. Returns true (1)
-  // if the scope was entered successfully.
+  /// Enter this context. A context must be explicitly entered before creating a
+  /// V8 Object, Array, Function or Date asynchronously. exit() must be called
+  /// the same number of times as enter() before releasing this context. V8
+  /// objects belong to the context in which they are created. Returns true (1)
+  /// if the scope was entered successfully.
   ///
   int(CEF_CALLBACK* enter)(struct _cef_v8context_t* self);
 
   ///
-  // Exit this context. Call this function only after calling enter(). Returns
-  // true (1) if the scope was exited successfully.
+  /// Exit this context. Call this function only after calling enter(). Returns
+  /// true (1) if the scope was exited successfully.
   ///
   int(CEF_CALLBACK* exit)(struct _cef_v8context_t* self);
 
   ///
-  // Returns true (1) if this object is pointing to the same handle as |that|
-  // object.
+  /// Returns true (1) if this object is pointing to the same handle as |that|
+  /// object.
   ///
   int(CEF_CALLBACK* is_same)(struct _cef_v8context_t* self,
                              struct _cef_v8context_t* that);
 
   ///
-  // Execute a string of JavaScript code in this V8 context. The |script_url|
-  // parameter is the URL where the script in question can be found, if any. The
-  // |start_line| parameter is the base line number to use for error reporting.
-  // On success |retval| will be set to the return value, if any, and the
-  // function will return true (1). On failure |exception| will be set to the
-  // exception, if any, and the function will return false (0).
+  /// Execute a string of JavaScript code in this V8 context. The |script_url|
+  /// parameter is the URL where the script in question can be found, if any.
+  /// The |start_line| parameter is the base line number to use for error
+  /// reporting. On success |retval| will be set to the return value, if any,
+  /// and the function will return true (1). On failure |exception| will be set
+  /// to the exception, if any, and the function will return false (0).
   ///
   int(CEF_CALLBACK* eval)(struct _cef_v8context_t* self,
                           const cef_string_t* code,
@@ -141,37 +141,37 @@
 } cef_v8context_t;
 
 ///
-// Returns the current (top) context object in the V8 context stack.
+/// Returns the current (top) context object in the V8 context stack.
 ///
-CEF_EXPORT cef_v8context_t* cef_v8context_get_current_context();
+CEF_EXPORT cef_v8context_t* cef_v8context_get_current_context(void);
 
 ///
-// Returns the entered (bottom) context object in the V8 context stack.
+/// Returns the entered (bottom) context object in the V8 context stack.
 ///
-CEF_EXPORT cef_v8context_t* cef_v8context_get_entered_context();
+CEF_EXPORT cef_v8context_t* cef_v8context_get_entered_context(void);
 
 ///
-// Returns true (1) if V8 is currently inside a context.
+/// Returns true (1) if V8 is currently inside a context.
 ///
-CEF_EXPORT int cef_v8context_in_context();
+CEF_EXPORT int cef_v8context_in_context(void);
 
 ///
-// Structure that should be implemented to handle V8 function calls. The
-// functions of this structure will be called on the thread associated with the
-// V8 function.
+/// Structure that should be implemented to handle V8 function calls. The
+/// functions of this structure will be called on the thread associated with the
+/// V8 function.
 ///
 typedef struct _cef_v8handler_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Handle execution of the function identified by |name|. |object| is the
-  // receiver ('this' object) of the function. |arguments| is the list of
-  // arguments passed to the function. If execution succeeds set |retval| to the
-  // function return value. If execution fails set |exception| to the exception
-  // that will be thrown. Return true (1) if execution was handled.
+  /// Handle execution of the function identified by |name|. |object| is the
+  /// receiver ('this' object) of the function. |arguments| is the list of
+  /// arguments passed to the function. If execution succeeds set |retval| to
+  /// the function return value. If execution fails set |exception| to the
+  /// exception that will be thrown. Return true (1) if execution was handled.
   ///
   int(CEF_CALLBACK* execute)(struct _cef_v8handler_t* self,
                              const cef_string_t* name,
@@ -183,23 +183,23 @@
 } cef_v8handler_t;
 
 ///
-// Structure that should be implemented to handle V8 accessor calls. Accessor
-// identifiers are registered by calling cef_v8value_t::set_value(). The
-// functions of this structure will be called on the thread associated with the
-// V8 accessor.
+/// Structure that should be implemented to handle V8 accessor calls. Accessor
+/// identifiers are registered by calling cef_v8value_t::set_value(). The
+/// functions of this structure will be called on the thread associated with the
+/// V8 accessor.
 ///
 typedef struct _cef_v8accessor_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Handle retrieval the accessor value identified by |name|. |object| is the
-  // receiver ('this' object) of the accessor. If retrieval succeeds set
-  // |retval| to the return value. If retrieval fails set |exception| to the
-  // exception that will be thrown. Return true (1) if accessor retrieval was
-  // handled.
+  /// Handle retrieval the accessor value identified by |name|. |object| is the
+  /// receiver ('this' object) of the accessor. If retrieval succeeds set
+  /// |retval| to the return value. If retrieval fails set |exception| to the
+  /// exception that will be thrown. Return true (1) if accessor retrieval was
+  /// handled.
   ///
   int(CEF_CALLBACK* get)(struct _cef_v8accessor_t* self,
                          const cef_string_t* name,
@@ -208,11 +208,11 @@
                          cef_string_t* exception);
 
   ///
-  // Handle assignment of the accessor value identified by |name|. |object| is
-  // the receiver ('this' object) of the accessor. |value| is the new value
-  // being assigned to the accessor. If assignment fails set |exception| to the
-  // exception that will be thrown. Return true (1) if accessor assignment was
-  // handled.
+  /// Handle assignment of the accessor value identified by |name|. |object| is
+  /// the receiver ('this' object) of the accessor. |value| is the new value
+  /// being assigned to the accessor. If assignment fails set |exception| to the
+  /// exception that will be thrown. Return true (1) if accessor assignment was
+  /// handled.
   ///
   int(CEF_CALLBACK* set)(struct _cef_v8accessor_t* self,
                          const cef_string_t* name,
@@ -222,27 +222,27 @@
 } cef_v8accessor_t;
 
 ///
-// Structure that should be implemented to handle V8 interceptor calls. The
-// functions of this structure will be called on the thread associated with the
-// V8 interceptor. Interceptor's named property handlers (with first argument of
-// type CefString) are called when object is indexed by string. Indexed property
-// handlers (with first argument of type int) are called when object is indexed
-// by integer.
+/// Structure that should be implemented to handle V8 interceptor calls. The
+/// functions of this structure will be called on the thread associated with the
+/// V8 interceptor. Interceptor's named property handlers (with first argument
+/// of type CefString) are called when object is indexed by string. Indexed
+/// property handlers (with first argument of type int) are called when object
+/// is indexed by integer.
 ///
 typedef struct _cef_v8interceptor_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Handle retrieval of the interceptor value identified by |name|. |object| is
-  // the receiver ('this' object) of the interceptor. If retrieval succeeds, set
-  // |retval| to the return value. If the requested value does not exist, don't
-  // set either |retval| or |exception|. If retrieval fails, set |exception| to
-  // the exception that will be thrown. If the property has an associated
-  // accessor, it will be called only if you don't set |retval|. Return true (1)
-  // if interceptor retrieval was handled, false (0) otherwise.
+  /// Handle retrieval of the interceptor value identified by |name|. |object|
+  /// is the receiver ('this' object) of the interceptor. If retrieval succeeds,
+  /// set |retval| to the return value. If the requested value does not exist,
+  /// don't set either |retval| or |exception|. If retrieval fails, set
+  /// |exception| to the exception that will be thrown. If the property has an
+  /// associated accessor, it will be called only if you don't set |retval|.
+  /// Return true (1) if interceptor retrieval was handled, false (0) otherwise.
   ///
   int(CEF_CALLBACK* get_byname)(struct _cef_v8interceptor_t* self,
                                 const cef_string_t* name,
@@ -251,12 +251,12 @@
                                 cef_string_t* exception);
 
   ///
-  // Handle retrieval of the interceptor value identified by |index|. |object|
-  // is the receiver ('this' object) of the interceptor. If retrieval succeeds,
-  // set |retval| to the return value. If the requested value does not exist,
-  // don't set either |retval| or |exception|. If retrieval fails, set
-  // |exception| to the exception that will be thrown. Return true (1) if
-  // interceptor retrieval was handled, false (0) otherwise.
+  /// Handle retrieval of the interceptor value identified by |index|. |object|
+  /// is the receiver ('this' object) of the interceptor. If retrieval succeeds,
+  /// set |retval| to the return value. If the requested value does not exist,
+  /// don't set either |retval| or |exception|. If retrieval fails, set
+  /// |exception| to the exception that will be thrown. Return true (1) if
+  /// interceptor retrieval was handled, false (0) otherwise.
   ///
   int(CEF_CALLBACK* get_byindex)(struct _cef_v8interceptor_t* self,
                                  int index,
@@ -265,12 +265,12 @@
                                  cef_string_t* exception);
 
   ///
-  // Handle assignment of the interceptor value identified by |name|. |object|
-  // is the receiver ('this' object) of the interceptor. |value| is the new
-  // value being assigned to the interceptor. If assignment fails, set
-  // |exception| to the exception that will be thrown. This setter will always
-  // be called, even when the property has an associated accessor. Return true
-  // (1) if interceptor assignment was handled, false (0) otherwise.
+  /// Handle assignment of the interceptor value identified by |name|. |object|
+  /// is the receiver ('this' object) of the interceptor. |value| is the new
+  /// value being assigned to the interceptor. If assignment fails, set
+  /// |exception| to the exception that will be thrown. This setter will always
+  /// be called, even when the property has an associated accessor. Return true
+  /// (1) if interceptor assignment was handled, false (0) otherwise.
   ///
   int(CEF_CALLBACK* set_byname)(struct _cef_v8interceptor_t* self,
                                 const cef_string_t* name,
@@ -279,11 +279,11 @@
                                 cef_string_t* exception);
 
   ///
-  // Handle assignment of the interceptor value identified by |index|. |object|
-  // is the receiver ('this' object) of the interceptor. |value| is the new
-  // value being assigned to the interceptor. If assignment fails, set
-  // |exception| to the exception that will be thrown. Return true (1) if
-  // interceptor assignment was handled, false (0) otherwise.
+  /// Handle assignment of the interceptor value identified by |index|. |object|
+  /// is the receiver ('this' object) of the interceptor. |value| is the new
+  /// value being assigned to the interceptor. If assignment fails, set
+  /// |exception| to the exception that will be thrown. Return true (1) if
+  /// interceptor assignment was handled, false (0) otherwise.
   ///
   int(CEF_CALLBACK* set_byindex)(struct _cef_v8interceptor_t* self,
                                  int index,
@@ -293,81 +293,81 @@
 } cef_v8interceptor_t;
 
 ///
-// Structure representing a V8 exception. The functions of this structure may be
-// called on any render process thread.
+/// Structure representing a V8 exception. The functions of this structure may
+/// be called on any render process thread.
 ///
 typedef struct _cef_v8exception_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns the exception message.
+  /// Returns the exception message.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_message)(
       struct _cef_v8exception_t* self);
 
   ///
-  // Returns the line of source code that the exception occurred within.
+  /// Returns the line of source code that the exception occurred within.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_source_line)(
       struct _cef_v8exception_t* self);
 
   ///
-  // Returns the resource name for the script from where the function causing
-  // the error originates.
+  /// Returns the resource name for the script from where the function causing
+  /// the error originates.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_script_resource_name)(
       struct _cef_v8exception_t* self);
 
   ///
-  // Returns the 1-based number of the line where the error occurred or 0 if the
-  // line number is unknown.
+  /// Returns the 1-based number of the line where the error occurred or 0 if
+  /// the line number is unknown.
   ///
   int(CEF_CALLBACK* get_line_number)(struct _cef_v8exception_t* self);
 
   ///
-  // Returns the index within the script of the first character where the error
-  // occurred.
+  /// Returns the index within the script of the first character where the error
+  /// occurred.
   ///
   int(CEF_CALLBACK* get_start_position)(struct _cef_v8exception_t* self);
 
   ///
-  // Returns the index within the script of the last character where the error
-  // occurred.
+  /// Returns the index within the script of the last character where the error
+  /// occurred.
   ///
   int(CEF_CALLBACK* get_end_position)(struct _cef_v8exception_t* self);
 
   ///
-  // Returns the index within the line of the first character where the error
-  // occurred.
+  /// Returns the index within the line of the first character where the error
+  /// occurred.
   ///
   int(CEF_CALLBACK* get_start_column)(struct _cef_v8exception_t* self);
 
   ///
-  // Returns the index within the line of the last character where the error
-  // occurred.
+  /// Returns the index within the line of the last character where the error
+  /// occurred.
   ///
   int(CEF_CALLBACK* get_end_column)(struct _cef_v8exception_t* self);
 } cef_v8exception_t;
 
 ///
-// Callback structure that is passed to cef_v8value_t::CreateArrayBuffer.
+/// Callback structure that is passed to cef_v8value_t::CreateArrayBuffer.
 ///
 typedef struct _cef_v8array_buffer_release_callback_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Called to release |buffer| when the ArrayBuffer JS object is garbage
-  // collected. |buffer| is the value that was passed to CreateArrayBuffer along
-  // with this object.
+  /// Called to release |buffer| when the ArrayBuffer JS object is garbage
+  /// collected. |buffer| is the value that was passed to CreateArrayBuffer
+  /// along with this object.
   ///
   void(CEF_CALLBACK* release_buffer)(
       struct _cef_v8array_buffer_release_callback_t* self,
@@ -375,216 +375,217 @@
 } cef_v8array_buffer_release_callback_t;
 
 ///
-// Structure representing a V8 value handle. V8 handles can only be accessed
-// from the thread on which they are created. Valid threads for creating a V8
-// handle include the render process main thread (TID_RENDERER) and WebWorker
-// threads. A task runner for posting tasks on the associated thread can be
-// retrieved via the cef_v8context_t::get_task_runner() function.
+/// Structure representing a V8 value handle. V8 handles can only be accessed
+/// from the thread on which they are created. Valid threads for creating a V8
+/// handle include the render process main thread (TID_RENDERER) and WebWorker
+/// threads. A task runner for posting tasks on the associated thread can be
+/// retrieved via the cef_v8context_t::get_task_runner() function.
 ///
 typedef struct _cef_v8value_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns true (1) if the underlying handle is valid and it can be accessed
-  // on the current thread. Do not call any other functions if this function
-  // returns false (0).
+  /// Returns true (1) if the underlying handle is valid and it can be accessed
+  /// on the current thread. Do not call any other functions if this function
+  /// returns false (0).
   ///
   int(CEF_CALLBACK* is_valid)(struct _cef_v8value_t* self);
 
   ///
-  // True if the value type is undefined.
+  /// True if the value type is undefined.
   ///
   int(CEF_CALLBACK* is_undefined)(struct _cef_v8value_t* self);
 
   ///
-  // True if the value type is null.
+  /// True if the value type is null.
   ///
   int(CEF_CALLBACK* is_null)(struct _cef_v8value_t* self);
 
   ///
-  // True if the value type is bool.
+  /// True if the value type is bool.
   ///
   int(CEF_CALLBACK* is_bool)(struct _cef_v8value_t* self);
 
   ///
-  // True if the value type is int.
+  /// True if the value type is int.
   ///
   int(CEF_CALLBACK* is_int)(struct _cef_v8value_t* self);
 
   ///
-  // True if the value type is unsigned int.
+  /// True if the value type is unsigned int.
   ///
   int(CEF_CALLBACK* is_uint)(struct _cef_v8value_t* self);
 
   ///
-  // True if the value type is double.
+  /// True if the value type is double.
   ///
   int(CEF_CALLBACK* is_double)(struct _cef_v8value_t* self);
 
   ///
-  // True if the value type is Date.
+  /// True if the value type is Date.
   ///
   int(CEF_CALLBACK* is_date)(struct _cef_v8value_t* self);
 
   ///
-  // True if the value type is string.
+  /// True if the value type is string.
   ///
   int(CEF_CALLBACK* is_string)(struct _cef_v8value_t* self);
 
   ///
-  // True if the value type is object.
+  /// True if the value type is object.
   ///
   int(CEF_CALLBACK* is_object)(struct _cef_v8value_t* self);
 
   ///
-  // True if the value type is array.
+  /// True if the value type is array.
   ///
   int(CEF_CALLBACK* is_array)(struct _cef_v8value_t* self);
 
   ///
-  // True if the value type is an ArrayBuffer.
+  /// True if the value type is an ArrayBuffer.
   ///
   int(CEF_CALLBACK* is_array_buffer)(struct _cef_v8value_t* self);
 
   ///
-  // True if the value type is function.
+  /// True if the value type is function.
   ///
   int(CEF_CALLBACK* is_function)(struct _cef_v8value_t* self);
 
   ///
-  // Returns true (1) if this object is pointing to the same handle as |that|
-  // object.
+  /// True if the value type is a Promise.
+  ///
+  int(CEF_CALLBACK* is_promise)(struct _cef_v8value_t* self);
+
+  ///
+  /// Returns true (1) if this object is pointing to the same handle as |that|
+  /// object.
   ///
   int(CEF_CALLBACK* is_same)(struct _cef_v8value_t* self,
                              struct _cef_v8value_t* that);
 
   ///
-  // Return a bool value.
+  /// Return a bool value.
   ///
   int(CEF_CALLBACK* get_bool_value)(struct _cef_v8value_t* self);
 
   ///
-  // Return an int value.
+  /// Return an int value.
   ///
-  int32(CEF_CALLBACK* get_int_value)(struct _cef_v8value_t* self);
+  int32_t(CEF_CALLBACK* get_int_value)(struct _cef_v8value_t* self);
 
   ///
-  // Return an unsigned int value.
+  /// Return an unsigned int value.
   ///
-  uint32(CEF_CALLBACK* get_uint_value)(struct _cef_v8value_t* self);
+  uint32_t(CEF_CALLBACK* get_uint_value)(struct _cef_v8value_t* self);
 
   ///
-  // Return a double value.
+  /// Return a double value.
   ///
   double(CEF_CALLBACK* get_double_value)(struct _cef_v8value_t* self);
 
   ///
-  // Return a Date value.
+  /// Return a Date value.
   ///
-  cef_time_t(CEF_CALLBACK* get_date_value)(struct _cef_v8value_t* self);
+  cef_basetime_t(CEF_CALLBACK* get_date_value)(struct _cef_v8value_t* self);
 
   ///
-  // Return a string value.
+  /// Return a string value.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_string_value)(
       struct _cef_v8value_t* self);
 
-  // OBJECT METHODS - These functions are only available on objects. Arrays and
-  // functions are also objects. String- and integer-based keys can be used
-  // interchangably with the framework converting between them as necessary.
-
   ///
-  // Returns true (1) if this is a user created object.
+  /// Returns true (1) if this is a user created object.
   ///
   int(CEF_CALLBACK* is_user_created)(struct _cef_v8value_t* self);
 
   ///
-  // Returns true (1) if the last function call resulted in an exception. This
-  // attribute exists only in the scope of the current CEF value object.
+  /// Returns true (1) if the last function call resulted in an exception. This
+  /// attribute exists only in the scope of the current CEF value object.
   ///
   int(CEF_CALLBACK* has_exception)(struct _cef_v8value_t* self);
 
   ///
-  // Returns the exception resulting from the last function call. This attribute
-  // exists only in the scope of the current CEF value object.
+  /// Returns the exception resulting from the last function call. This
+  /// attribute exists only in the scope of the current CEF value object.
   ///
   struct _cef_v8exception_t*(CEF_CALLBACK* get_exception)(
       struct _cef_v8value_t* self);
 
   ///
-  // Clears the last exception and returns true (1) on success.
+  /// Clears the last exception and returns true (1) on success.
   ///
   int(CEF_CALLBACK* clear_exception)(struct _cef_v8value_t* self);
 
   ///
-  // Returns true (1) if this object will re-throw future exceptions. This
-  // attribute exists only in the scope of the current CEF value object.
+  /// Returns true (1) if this object will re-throw future exceptions. This
+  /// attribute exists only in the scope of the current CEF value object.
   ///
   int(CEF_CALLBACK* will_rethrow_exceptions)(struct _cef_v8value_t* self);
 
   ///
-  // Set whether this object will re-throw future exceptions. By default
-  // exceptions are not re-thrown. If a exception is re-thrown the current
-  // context should not be accessed again until after the exception has been
-  // caught and not re-thrown. Returns true (1) on success. This attribute
-  // exists only in the scope of the current CEF value object.
+  /// Set whether this object will re-throw future exceptions. By default
+  /// exceptions are not re-thrown. If a exception is re-thrown the current
+  /// context should not be accessed again until after the exception has been
+  /// caught and not re-thrown. Returns true (1) on success. This attribute
+  /// exists only in the scope of the current CEF value object.
   ///
   int(CEF_CALLBACK* set_rethrow_exceptions)(struct _cef_v8value_t* self,
                                             int rethrow);
 
   ///
-  // Returns true (1) if the object has a value with the specified identifier.
+  /// Returns true (1) if the object has a value with the specified identifier.
   ///
   int(CEF_CALLBACK* has_value_bykey)(struct _cef_v8value_t* self,
                                      const cef_string_t* key);
 
   ///
-  // Returns true (1) if the object has a value with the specified identifier.
+  /// Returns true (1) if the object has a value with the specified identifier.
   ///
   int(CEF_CALLBACK* has_value_byindex)(struct _cef_v8value_t* self, int index);
 
   ///
-  // Deletes the value with the specified identifier and returns true (1) on
-  // success. Returns false (0) if this function is called incorrectly or an
-  // exception is thrown. For read-only and don't-delete values this function
-  // will return true (1) even though deletion failed.
+  /// Deletes the value with the specified identifier and returns true (1) on
+  /// success. Returns false (0) if this function is called incorrectly or an
+  /// exception is thrown. For read-only and don't-delete values this function
+  /// will return true (1) even though deletion failed.
   ///
   int(CEF_CALLBACK* delete_value_bykey)(struct _cef_v8value_t* self,
                                         const cef_string_t* key);
 
   ///
-  // Deletes the value with the specified identifier and returns true (1) on
-  // success. Returns false (0) if this function is called incorrectly, deletion
-  // fails or an exception is thrown. For read-only and don't-delete values this
-  // function will return true (1) even though deletion failed.
+  /// Deletes the value with the specified identifier and returns true (1) on
+  /// success. Returns false (0) if this function is called incorrectly,
+  /// deletion fails or an exception is thrown. For read-only and don't-delete
+  /// values this function will return true (1) even though deletion failed.
   ///
   int(CEF_CALLBACK* delete_value_byindex)(struct _cef_v8value_t* self,
                                           int index);
 
   ///
-  // Returns the value with the specified identifier on success. Returns NULL if
-  // this function is called incorrectly or an exception is thrown.
+  /// Returns the value with the specified identifier on success. Returns NULL
+  /// if this function is called incorrectly or an exception is thrown.
   ///
   struct _cef_v8value_t*(CEF_CALLBACK* get_value_bykey)(
       struct _cef_v8value_t* self,
       const cef_string_t* key);
 
   ///
-  // Returns the value with the specified identifier on success. Returns NULL if
-  // this function is called incorrectly or an exception is thrown.
+  /// Returns the value with the specified identifier on success. Returns NULL
+  /// if this function is called incorrectly or an exception is thrown.
   ///
   struct _cef_v8value_t*(
       CEF_CALLBACK* get_value_byindex)(struct _cef_v8value_t* self, int index);
 
   ///
-  // Associates a value with the specified identifier and returns true (1) on
-  // success. Returns false (0) if this function is called incorrectly or an
-  // exception is thrown. For read-only values this function will return true
-  // (1) even though assignment failed.
+  /// Associates a value with the specified identifier and returns true (1) on
+  /// success. Returns false (0) if this function is called incorrectly or an
+  /// exception is thrown. For read-only values this function will return true
+  /// (1) even though assignment failed.
   ///
   int(CEF_CALLBACK* set_value_bykey)(struct _cef_v8value_t* self,
                                      const cef_string_t* key,
@@ -592,21 +593,21 @@
                                      cef_v8_propertyattribute_t attribute);
 
   ///
-  // Associates a value with the specified identifier and returns true (1) on
-  // success. Returns false (0) if this function is called incorrectly or an
-  // exception is thrown. For read-only values this function will return true
-  // (1) even though assignment failed.
+  /// Associates a value with the specified identifier and returns true (1) on
+  /// success. Returns false (0) if this function is called incorrectly or an
+  /// exception is thrown. For read-only values this function will return true
+  /// (1) even though assignment failed.
   ///
   int(CEF_CALLBACK* set_value_byindex)(struct _cef_v8value_t* self,
                                        int index,
                                        struct _cef_v8value_t* value);
 
   ///
-  // Registers an identifier and returns true (1) on success. Access to the
-  // identifier will be forwarded to the cef_v8accessor_t instance passed to
-  // cef_v8value_t::cef_v8value_create_object(). Returns false (0) if this
-  // function is called incorrectly or an exception is thrown. For read-only
-  // values this function will return true (1) even though assignment failed.
+  /// Registers an identifier and returns true (1) on success. Access to the
+  /// identifier will be forwarded to the cef_v8accessor_t instance passed to
+  /// cef_v8value_t::cef_v8value_create_object(). Returns false (0) if this
+  /// function is called incorrectly or an exception is thrown. For read-only
+  /// values this function will return true (1) even though assignment failed.
   ///
   int(CEF_CALLBACK* set_value_byaccessor)(struct _cef_v8value_t* self,
                                           const cef_string_t* key,
@@ -614,99 +615,106 @@
                                           cef_v8_propertyattribute_t attribute);
 
   ///
-  // Read the keys for the object's values into the specified vector. Integer-
-  // based keys will also be returned as strings.
+  /// Read the keys for the object's values into the specified vector. Integer-
+  /// based keys will also be returned as strings.
   ///
   int(CEF_CALLBACK* get_keys)(struct _cef_v8value_t* self,
                               cef_string_list_t keys);
 
   ///
-  // Sets the user data for this object and returns true (1) on success. Returns
-  // false (0) if this function is called incorrectly. This function can only be
-  // called on user created objects.
+  /// Sets the user data for this object and returns true (1) on success.
+  /// Returns false (0) if this function is called incorrectly. This function
+  /// can only be called on user created objects.
   ///
   int(CEF_CALLBACK* set_user_data)(struct _cef_v8value_t* self,
                                    struct _cef_base_ref_counted_t* user_data);
 
   ///
-  // Returns the user data, if any, assigned to this object.
+  /// Returns the user data, if any, assigned to this object.
   ///
   struct _cef_base_ref_counted_t*(CEF_CALLBACK* get_user_data)(
       struct _cef_v8value_t* self);
 
   ///
-  // Returns the amount of externally allocated memory registered for the
-  // object.
+  /// Returns the amount of externally allocated memory registered for the
+  /// object.
   ///
   int(CEF_CALLBACK* get_externally_allocated_memory)(
       struct _cef_v8value_t* self);
 
   ///
-  // Adjusts the amount of registered external memory for the object. Used to
-  // give V8 an indication of the amount of externally allocated memory that is
-  // kept alive by JavaScript objects. V8 uses this information to decide when
-  // to perform global garbage collection. Each cef_v8value_t tracks the amount
-  // of external memory associated with it and automatically decreases the
-  // global total by the appropriate amount on its destruction.
-  // |change_in_bytes| specifies the number of bytes to adjust by. This function
-  // returns the number of bytes associated with the object after the
-  // adjustment. This function can only be called on user created objects.
+  /// Adjusts the amount of registered external memory for the object. Used to
+  /// give V8 an indication of the amount of externally allocated memory that is
+  /// kept alive by JavaScript objects. V8 uses this information to decide when
+  /// to perform global garbage collection. Each cef_v8value_t tracks the amount
+  /// of external memory associated with it and automatically decreases the
+  /// global total by the appropriate amount on its destruction.
+  /// |change_in_bytes| specifies the number of bytes to adjust by. This
+  /// function returns the number of bytes associated with the object after the
+  /// adjustment. This function can only be called on user created objects.
   ///
   int(CEF_CALLBACK* adjust_externally_allocated_memory)(
       struct _cef_v8value_t* self,
       int change_in_bytes);
 
-  // ARRAY METHODS - These functions are only available on arrays.
-
   ///
-  // Returns the number of elements in the array.
+  /// Returns the number of elements in the array.
   ///
   int(CEF_CALLBACK* get_array_length)(struct _cef_v8value_t* self);
 
-  // ARRAY BUFFER METHODS - These functions are only available on ArrayBuffers.
-
   ///
-  // Returns the ReleaseCallback object associated with the ArrayBuffer or NULL
-  // if the ArrayBuffer was not created with CreateArrayBuffer.
+  /// Returns the ReleaseCallback object associated with the ArrayBuffer or NULL
+  /// if the ArrayBuffer was not created with CreateArrayBuffer.
   ///
   struct _cef_v8array_buffer_release_callback_t*(
       CEF_CALLBACK* get_array_buffer_release_callback)(
       struct _cef_v8value_t* self);
 
   ///
-  // Prevent the ArrayBuffer from using it's memory block by setting the length
-  // to zero. This operation cannot be undone. If the ArrayBuffer was created
-  // with CreateArrayBuffer then
-  // cef_v8array_buffer_release_callback_t::ReleaseBuffer will be called to
-  // release the underlying buffer.
+  /// Prevent the ArrayBuffer from using it's memory block by setting the length
+  /// to zero. This operation cannot be undone. If the ArrayBuffer was created
+  /// with CreateArrayBuffer then
+  /// cef_v8array_buffer_release_callback_t::ReleaseBuffer will be called to
+  /// release the underlying buffer.
   ///
   int(CEF_CALLBACK* neuter_array_buffer)(struct _cef_v8value_t* self);
 
-  // FUNCTION METHODS - These functions are only available on functions.
+  ///
+  /// Returns the length (in bytes) of the ArrayBuffer.
+  ///
+  size_t(CEF_CALLBACK* get_array_buffer_byte_length)(
+      struct _cef_v8value_t* self);
 
   ///
-  // Returns the function name.
+  /// Returns a pointer to the beginning of the memory block for this
+  /// ArrayBuffer backing store. The returned pointer is valid as long as the
+  /// cef_v8value_t is alive.
+  ///
+  void*(CEF_CALLBACK* get_array_buffer_data)(struct _cef_v8value_t* self);
+
+  ///
+  /// Returns the function name.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_function_name)(
       struct _cef_v8value_t* self);
 
   ///
-  // Returns the function handler or NULL if not a CEF-created function.
+  /// Returns the function handler or NULL if not a CEF-created function.
   ///
   struct _cef_v8handler_t*(CEF_CALLBACK* get_function_handler)(
       struct _cef_v8value_t* self);
 
   ///
-  // Execute the function using the current V8 context. This function should
-  // only be called from within the scope of a cef_v8handler_t or
-  // cef_v8accessor_t callback, or in combination with calling enter() and
-  // exit() on a stored cef_v8context_t reference. |object| is the receiver
-  // ('this' object) of the function. If |object| is NULL the current context's
-  // global object will be used. |arguments| is the list of arguments that will
-  // be passed to the function. Returns the function return value on success.
-  // Returns NULL if this function is called incorrectly or an exception is
-  // thrown.
+  /// Execute the function using the current V8 context. This function should
+  /// only be called from within the scope of a cef_v8handler_t or
+  /// cef_v8accessor_t callback, or in combination with calling enter() and
+  /// exit() on a stored cef_v8context_t reference. |object| is the receiver
+  /// ('this' object) of the function. If |object| is NULL the current context's
+  /// global object will be used. |arguments| is the list of arguments that will
+  /// be passed to the function. Returns the function return value on success.
+  /// Returns NULL if this function is called incorrectly or an exception is
+  /// thrown.
   ///
   struct _cef_v8value_t*(CEF_CALLBACK* execute_function)(
       struct _cef_v8value_t* self,
@@ -715,12 +723,12 @@
       struct _cef_v8value_t* const* arguments);
 
   ///
-  // Execute the function using the specified V8 context. |object| is the
-  // receiver ('this' object) of the function. If |object| is NULL the specified
-  // context's global object will be used. |arguments| is the list of arguments
-  // that will be passed to the function. Returns the function return value on
-  // success. Returns NULL if this function is called incorrectly or an
-  // exception is thrown.
+  /// Execute the function using the specified V8 context. |object| is the
+  /// receiver ('this' object) of the function. If |object| is NULL the
+  /// specified context's global object will be used. |arguments| is the list of
+  /// arguments that will be passed to the function. Returns the function return
+  /// value on success. Returns NULL if this function is called incorrectly or
+  /// an exception is thrown.
   ///
   struct _cef_v8value_t*(CEF_CALLBACK* execute_function_with_context)(
       struct _cef_v8value_t* self,
@@ -728,81 +736,102 @@
       struct _cef_v8value_t* object,
       size_t argumentsCount,
       struct _cef_v8value_t* const* arguments);
+
+  ///
+  /// Resolve the Promise using the current V8 context. This function should
+  /// only be called from within the scope of a cef_v8handler_t or
+  /// cef_v8accessor_t callback, or in combination with calling enter() and
+  /// exit() on a stored cef_v8context_t reference. |arg| is the argument passed
+  /// to the resolved promise. Returns true (1) on success. Returns false (0) if
+  /// this function is called incorrectly or an exception is thrown.
+  ///
+  int(CEF_CALLBACK* resolve_promise)(struct _cef_v8value_t* self,
+                                     struct _cef_v8value_t* arg);
+
+  ///
+  /// Reject the Promise using the current V8 context. This function should only
+  /// be called from within the scope of a cef_v8handler_t or cef_v8accessor_t
+  /// callback, or in combination with calling enter() and exit() on a stored
+  /// cef_v8context_t reference. Returns true (1) on success. Returns false (0)
+  /// if this function is called incorrectly or an exception is thrown.
+  ///
+  int(CEF_CALLBACK* reject_promise)(struct _cef_v8value_t* self,
+                                    const cef_string_t* errorMsg);
 } cef_v8value_t;
 
 ///
-// Create a new cef_v8value_t object of type undefined.
+/// Create a new cef_v8value_t object of type undefined.
 ///
-CEF_EXPORT cef_v8value_t* cef_v8value_create_undefined();
+CEF_EXPORT cef_v8value_t* cef_v8value_create_undefined(void);
 
 ///
-// Create a new cef_v8value_t object of type null.
+/// Create a new cef_v8value_t object of type null.
 ///
-CEF_EXPORT cef_v8value_t* cef_v8value_create_null();
+CEF_EXPORT cef_v8value_t* cef_v8value_create_null(void);
 
 ///
-// Create a new cef_v8value_t object of type bool.
+/// Create a new cef_v8value_t object of type bool.
 ///
 CEF_EXPORT cef_v8value_t* cef_v8value_create_bool(int value);
 
 ///
-// Create a new cef_v8value_t object of type int.
+/// Create a new cef_v8value_t object of type int.
 ///
-CEF_EXPORT cef_v8value_t* cef_v8value_create_int(int32 value);
+CEF_EXPORT cef_v8value_t* cef_v8value_create_int(int32_t value);
 
 ///
-// Create a new cef_v8value_t object of type unsigned int.
+/// Create a new cef_v8value_t object of type unsigned int.
 ///
-CEF_EXPORT cef_v8value_t* cef_v8value_create_uint(uint32 value);
+CEF_EXPORT cef_v8value_t* cef_v8value_create_uint(uint32_t value);
 
 ///
-// Create a new cef_v8value_t object of type double.
+/// Create a new cef_v8value_t object of type double.
 ///
 CEF_EXPORT cef_v8value_t* cef_v8value_create_double(double value);
 
 ///
-// Create a new cef_v8value_t object of type Date. This function should only be
-// called from within the scope of a cef_render_process_handler_t,
-// cef_v8handler_t or cef_v8accessor_t callback, or in combination with calling
-// enter() and exit() on a stored cef_v8context_t reference.
+/// Create a new cef_v8value_t object of type Date. This function should only be
+/// called from within the scope of a cef_render_process_handler_t,
+/// cef_v8handler_t or cef_v8accessor_t callback, or in combination with calling
+/// enter() and exit() on a stored cef_v8context_t reference.
 ///
-CEF_EXPORT cef_v8value_t* cef_v8value_create_date(const cef_time_t* date);
+CEF_EXPORT cef_v8value_t* cef_v8value_create_date(cef_basetime_t date);
 
 ///
-// Create a new cef_v8value_t object of type string.
+/// Create a new cef_v8value_t object of type string.
 ///
 CEF_EXPORT cef_v8value_t* cef_v8value_create_string(const cef_string_t* value);
 
 ///
-// Create a new cef_v8value_t object of type object with optional accessor
-// and/or interceptor. This function should only be called from within the scope
-// of a cef_render_process_handler_t, cef_v8handler_t or cef_v8accessor_t
-// callback, or in combination with calling enter() and exit() on a stored
-// cef_v8context_t reference.
+/// Create a new cef_v8value_t object of type object with optional accessor
+/// and/or interceptor. This function should only be called from within the
+/// scope of a cef_render_process_handler_t, cef_v8handler_t or cef_v8accessor_t
+/// callback, or in combination with calling enter() and exit() on a stored
+/// cef_v8context_t reference.
 ///
 CEF_EXPORT cef_v8value_t* cef_v8value_create_object(
     cef_v8accessor_t* accessor,
     cef_v8interceptor_t* interceptor);
 
 ///
-// Create a new cef_v8value_t object of type array with the specified |length|.
-// If |length| is negative the returned array will have length 0. This function
-// should only be called from within the scope of a
-// cef_render_process_handler_t, cef_v8handler_t or cef_v8accessor_t callback,
-// or in combination with calling enter() and exit() on a stored cef_v8context_t
-// reference.
+/// Create a new cef_v8value_t object of type array with the specified |length|.
+/// If |length| is negative the returned array will have length 0. This function
+/// should only be called from within the scope of a
+/// cef_render_process_handler_t, cef_v8handler_t or cef_v8accessor_t callback,
+/// or in combination with calling enter() and exit() on a stored
+/// cef_v8context_t reference.
 ///
 CEF_EXPORT cef_v8value_t* cef_v8value_create_array(int length);
 
 ///
-// Create a new cef_v8value_t object of type ArrayBuffer which wraps the
-// provided |buffer| of size |length| bytes. The ArrayBuffer is externalized,
-// meaning that it does not own |buffer|. The caller is responsible for freeing
-// |buffer| when requested via a call to cef_v8array_buffer_release_callback_t::
-// ReleaseBuffer. This function should only be called from within the scope of a
-// cef_render_process_handler_t, cef_v8handler_t or cef_v8accessor_t callback,
-// or in combination with calling enter() and exit() on a stored cef_v8context_t
-// reference.
+/// Create a new cef_v8value_t object of type ArrayBuffer which wraps the
+/// provided |buffer| of size |length| bytes. The ArrayBuffer is externalized,
+/// meaning that it does not own |buffer|. The caller is responsible for freeing
+/// |buffer| when requested via a call to
+/// cef_v8array_buffer_release_callback_t::ReleaseBuffer. This function should
+/// only be called from within the scope of a cef_render_process_handler_t,
+/// cef_v8handler_t or cef_v8accessor_t callback, or in combination with calling
+/// enter() and exit() on a stored cef_v8context_t reference.
 ///
 CEF_EXPORT cef_v8value_t* cef_v8value_create_array_buffer(
     void* buffer,
@@ -810,172 +839,182 @@
     cef_v8array_buffer_release_callback_t* release_callback);
 
 ///
-// Create a new cef_v8value_t object of type function. This function should only
-// be called from within the scope of a cef_render_process_handler_t,
-// cef_v8handler_t or cef_v8accessor_t callback, or in combination with calling
-// enter() and exit() on a stored cef_v8context_t reference.
+/// Create a new cef_v8value_t object of type function. This function should
+/// only be called from within the scope of a cef_render_process_handler_t,
+/// cef_v8handler_t or cef_v8accessor_t callback, or in combination with calling
+/// enter() and exit() on a stored cef_v8context_t reference.
 ///
 CEF_EXPORT cef_v8value_t* cef_v8value_create_function(const cef_string_t* name,
                                                       cef_v8handler_t* handler);
 
 ///
-// Structure representing a V8 stack trace handle. V8 handles can only be
-// accessed from the thread on which they are created. Valid threads for
-// creating a V8 handle include the render process main thread (TID_RENDERER)
-// and WebWorker threads. A task runner for posting tasks on the associated
-// thread can be retrieved via the cef_v8context_t::get_task_runner() function.
+/// Create a new cef_v8value_t object of type Promise. This function should only
+/// be called from within the scope of a cef_render_process_handler_t,
+/// cef_v8handler_t or cef_v8accessor_t callback, or in combination with calling
+/// enter() and exit() on a stored cef_v8context_t reference.
+///
+CEF_EXPORT cef_v8value_t* cef_v8value_create_promise(void);
+
+///
+/// Structure representing a V8 stack trace handle. V8 handles can only be
+/// accessed from the thread on which they are created. Valid threads for
+/// creating a V8 handle include the render process main thread (TID_RENDERER)
+/// and WebWorker threads. A task runner for posting tasks on the associated
+/// thread can be retrieved via the cef_v8context_t::get_task_runner() function.
 ///
 typedef struct _cef_v8stack_trace_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns true (1) if the underlying handle is valid and it can be accessed
-  // on the current thread. Do not call any other functions if this function
-  // returns false (0).
+  /// Returns true (1) if the underlying handle is valid and it can be accessed
+  /// on the current thread. Do not call any other functions if this function
+  /// returns false (0).
   ///
   int(CEF_CALLBACK* is_valid)(struct _cef_v8stack_trace_t* self);
 
   ///
-  // Returns the number of stack frames.
+  /// Returns the number of stack frames.
   ///
   int(CEF_CALLBACK* get_frame_count)(struct _cef_v8stack_trace_t* self);
 
   ///
-  // Returns the stack frame at the specified 0-based index.
+  /// Returns the stack frame at the specified 0-based index.
   ///
   struct _cef_v8stack_frame_t*(
       CEF_CALLBACK* get_frame)(struct _cef_v8stack_trace_t* self, int index);
 } cef_v8stack_trace_t;
 
 ///
-// Returns the stack trace for the currently active context. |frame_limit| is
-// the maximum number of frames that will be captured.
+/// Returns the stack trace for the currently active context. |frame_limit| is
+/// the maximum number of frames that will be captured.
 ///
 CEF_EXPORT cef_v8stack_trace_t* cef_v8stack_trace_get_current(int frame_limit);
 
 ///
-// Structure representing a V8 stack frame handle. V8 handles can only be
-// accessed from the thread on which they are created. Valid threads for
-// creating a V8 handle include the render process main thread (TID_RENDERER)
-// and WebWorker threads. A task runner for posting tasks on the associated
-// thread can be retrieved via the cef_v8context_t::get_task_runner() function.
+/// Structure representing a V8 stack frame handle. V8 handles can only be
+/// accessed from the thread on which they are created. Valid threads for
+/// creating a V8 handle include the render process main thread (TID_RENDERER)
+/// and WebWorker threads. A task runner for posting tasks on the associated
+/// thread can be retrieved via the cef_v8context_t::get_task_runner() function.
 ///
 typedef struct _cef_v8stack_frame_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns true (1) if the underlying handle is valid and it can be accessed
-  // on the current thread. Do not call any other functions if this function
-  // returns false (0).
+  /// Returns true (1) if the underlying handle is valid and it can be accessed
+  /// on the current thread. Do not call any other functions if this function
+  /// returns false (0).
   ///
   int(CEF_CALLBACK* is_valid)(struct _cef_v8stack_frame_t* self);
 
   ///
-  // Returns the name of the resource script that contains the function.
+  /// Returns the name of the resource script that contains the function.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_script_name)(
       struct _cef_v8stack_frame_t* self);
 
   ///
-  // Returns the name of the resource script that contains the function or the
-  // sourceURL value if the script name is undefined and its source ends with a
-  // "//@ sourceURL=..." string.
+  /// Returns the name of the resource script that contains the function or the
+  /// sourceURL value if the script name is undefined and its source ends with a
+  /// "//@ sourceURL=..." string.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_script_name_or_source_url)(
       struct _cef_v8stack_frame_t* self);
 
   ///
-  // Returns the name of the function.
+  /// Returns the name of the function.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_function_name)(
       struct _cef_v8stack_frame_t* self);
 
   ///
-  // Returns the 1-based line number for the function call or 0 if unknown.
+  /// Returns the 1-based line number for the function call or 0 if unknown.
   ///
   int(CEF_CALLBACK* get_line_number)(struct _cef_v8stack_frame_t* self);
 
   ///
-  // Returns the 1-based column offset on the line for the function call or 0 if
-  // unknown.
+  /// Returns the 1-based column offset on the line for the function call or 0
+  /// if unknown.
   ///
   int(CEF_CALLBACK* get_column)(struct _cef_v8stack_frame_t* self);
 
   ///
-  // Returns true (1) if the function was compiled using eval().
+  /// Returns true (1) if the function was compiled using eval().
   ///
   int(CEF_CALLBACK* is_eval)(struct _cef_v8stack_frame_t* self);
 
   ///
-  // Returns true (1) if the function was called as a constructor via "new".
+  /// Returns true (1) if the function was called as a constructor via "new".
   ///
   int(CEF_CALLBACK* is_constructor)(struct _cef_v8stack_frame_t* self);
 } cef_v8stack_frame_t;
 
 ///
-// Register a new V8 extension with the specified JavaScript extension code and
-// handler. Functions implemented by the handler are prototyped using the
-// keyword 'native'. The calling of a native function is restricted to the scope
-// in which the prototype of the native function is defined. This function may
-// only be called on the render process main thread.
-//
-// Example JavaScript extension code: <pre>
-//   // create the 'example' global object if it doesn't already exist.
-//   if (!example)
-//     example = {};
-//   // create the 'example.test' global object if it doesn't already exist.
-//   if (!example.test)
-//     example.test = {};
-//   (function() {
-//     // Define the function 'example.test.myfunction'.
-//     example.test.myfunction = function() {
-//       // Call CefV8Handler::Execute() with the function name 'MyFunction'
-//       // and no arguments.
-//       native function MyFunction();
-//       return MyFunction();
-//     };
-//     // Define the getter function for parameter 'example.test.myparam'.
-//     example.test.__defineGetter__('myparam', function() {
-//       // Call CefV8Handler::Execute() with the function name 'GetMyParam'
-//       // and no arguments.
-//       native function GetMyParam();
-//       return GetMyParam();
-//     });
-//     // Define the setter function for parameter 'example.test.myparam'.
-//     example.test.__defineSetter__('myparam', function(b) {
-//       // Call CefV8Handler::Execute() with the function name 'SetMyParam'
-//       // and a single argument.
-//       native function SetMyParam();
-//       if(b) SetMyParam(b);
-//     });
-//
-//     // Extension definitions can also contain normal JavaScript variables
-//     // and functions.
-//     var myint = 0;
-//     example.test.increment = function() {
-//       myint += 1;
-//       return myint;
-//     };
-//   })();
-// </pre> Example usage in the page: <pre>
-//   // Call the function.
-//   example.test.myfunction();
-//   // Set the parameter.
-//   example.test.myparam = value;
-//   // Get the parameter.
-//   value = example.test.myparam;
-//   // Call another function.
-//   example.test.increment();
-// </pre>
+/// Register a new V8 extension with the specified JavaScript extension code and
+/// handler. Functions implemented by the handler are prototyped using the
+/// keyword 'native'. The calling of a native function is restricted to the
+/// scope in which the prototype of the native function is defined. This
+/// function may only be called on the render process main thread.
+///
+/// Example JavaScript extension code: <pre>
+///   // create the 'example' global object if it doesn't already exist.
+///   if (!example)
+///     example = {};
+///   // create the 'example.test' global object if it doesn't already exist.
+///   if (!example.test)
+///     example.test = {};
+///   (function() {
+///     // Define the function 'example.test.myfunction'.
+///     example.test.myfunction = function() {
+///       // Call CefV8Handler::Execute() with the function name 'MyFunction'
+///       // and no arguments.
+///       native function MyFunction();
+///       return MyFunction();
+///     };
+///     // Define the getter function for parameter 'example.test.myparam'.
+///     example.test.__defineGetter__('myparam', function() {
+///       // Call CefV8Handler::Execute() with the function name 'GetMyParam'
+///       // and no arguments.
+///       native function GetMyParam();
+///       return GetMyParam();
+///     });
+///     // Define the setter function for parameter 'example.test.myparam'.
+///     example.test.__defineSetter__('myparam', function(b) {
+///       // Call CefV8Handler::Execute() with the function name 'SetMyParam'
+///       // and a single argument.
+///       native function SetMyParam();
+///       if(b) SetMyParam(b);
+///     });
+///
+///     // Extension definitions can also contain normal JavaScript variables
+///     // and functions.
+///     var myint = 0;
+///     example.test.increment = function() {
+///       myint += 1;
+///       return myint;
+///     };
+///   })();
+/// </pre>
+///
+/// Example usage in the page: <pre>
+///   // Call the function.
+///   example.test.myfunction();
+///   // Set the parameter.
+///   example.test.myparam = value;
+///   // Get the parameter.
+///   value = example.test.myparam;
+///   // Call another function.
+///   example.test.increment();
+/// </pre>
 ///
 CEF_EXPORT int cef_register_extension(const cef_string_t* extension_name,
                                       const cef_string_t* javascript_code,
diff --git a/src/include/capi/cef_values_capi.h b/src/include/capi/cef_values_capi.h
index c12867b..0534745 100644
--- a/src/include/capi/cef_values_capi.h
+++ b/src/include/capi/cef_values_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=22f935968cd7f2549def42f5d84694311bde125e$
+// $hash=7b8fee9d4a0530782ed62f5741820708f110e24e$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_VALUES_CAPI_H_
@@ -51,226 +51,234 @@
 struct _cef_list_value_t;
 
 ///
-// Structure that wraps other data value types. Complex types (binary,
-// dictionary and list) will be referenced but not owned by this object. Can be
-// used on any process and thread.
+/// Structure that wraps other data value types. Complex types (binary,
+/// dictionary and list) will be referenced but not owned by this object. Can be
+/// used on any process and thread.
 ///
 typedef struct _cef_value_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns true (1) if the underlying data is valid. This will always be true
-  // (1) for simple types. For complex types (binary, dictionary and list) the
-  // underlying data may become invalid if owned by another object (e.g. list or
-  // dictionary) and that other object is then modified or destroyed. This value
-  // object can be re-used by calling Set*() even if the underlying data is
-  // invalid.
+  /// Returns true (1) if the underlying data is valid. This will always be true
+  /// (1) for simple types. For complex types (binary, dictionary and list) the
+  /// underlying data may become invalid if owned by another object (e.g. list
+  /// or dictionary) and that other object is then modified or destroyed. This
+  /// value object can be re-used by calling Set*() even if the underlying data
+  /// is invalid.
   ///
   int(CEF_CALLBACK* is_valid)(struct _cef_value_t* self);
 
   ///
-  // Returns true (1) if the underlying data is owned by another object.
+  /// Returns true (1) if the underlying data is owned by another object.
   ///
   int(CEF_CALLBACK* is_owned)(struct _cef_value_t* self);
 
   ///
-  // Returns true (1) if the underlying data is read-only. Some APIs may expose
-  // read-only objects.
+  /// Returns true (1) if the underlying data is read-only. Some APIs may expose
+  /// read-only objects.
   ///
   int(CEF_CALLBACK* is_read_only)(struct _cef_value_t* self);
 
   ///
-  // Returns true (1) if this object and |that| object have the same underlying
-  // data. If true (1) modifications to this object will also affect |that|
-  // object and vice-versa.
+  /// Returns true (1) if this object and |that| object have the same underlying
+  /// data. If true (1) modifications to this object will also affect |that|
+  /// object and vice-versa.
   ///
   int(CEF_CALLBACK* is_same)(struct _cef_value_t* self,
                              struct _cef_value_t* that);
 
   ///
-  // Returns true (1) if this object and |that| object have an equivalent
-  // underlying value but are not necessarily the same object.
+  /// Returns true (1) if this object and |that| object have an equivalent
+  /// underlying value but are not necessarily the same object.
   ///
   int(CEF_CALLBACK* is_equal)(struct _cef_value_t* self,
                               struct _cef_value_t* that);
 
   ///
-  // Returns a copy of this object. The underlying data will also be copied.
+  /// Returns a copy of this object. The underlying data will also be copied.
   ///
   struct _cef_value_t*(CEF_CALLBACK* copy)(struct _cef_value_t* self);
 
   ///
-  // Returns the underlying value type.
+  /// Returns the underlying value type.
   ///
   cef_value_type_t(CEF_CALLBACK* get_type)(struct _cef_value_t* self);
 
   ///
-  // Returns the underlying value as type bool.
+  /// Returns the underlying value as type bool.
   ///
   int(CEF_CALLBACK* get_bool)(struct _cef_value_t* self);
 
   ///
-  // Returns the underlying value as type int.
+  /// Returns the underlying value as type int.
   ///
   int(CEF_CALLBACK* get_int)(struct _cef_value_t* self);
 
   ///
-  // Returns the underlying value as type double.
+  /// Returns the underlying value as type double.
   ///
   double(CEF_CALLBACK* get_double)(struct _cef_value_t* self);
 
   ///
-  // Returns the underlying value as type string.
+  /// Returns the underlying value as type string.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_string)(struct _cef_value_t* self);
 
   ///
-  // Returns the underlying value as type binary. The returned reference may
-  // become invalid if the value is owned by another object or if ownership is
-  // transferred to another object in the future. To maintain a reference to the
-  // value after assigning ownership to a dictionary or list pass this object to
-  // the set_value() function instead of passing the returned reference to
-  // set_binary().
+  /// Returns the underlying value as type binary. The returned reference may
+  /// become invalid if the value is owned by another object or if ownership is
+  /// transferred to another object in the future. To maintain a reference to
+  /// the value after assigning ownership to a dictionary or list pass this
+  /// object to the set_value() function instead of passing the returned
+  /// reference to set_binary().
   ///
   struct _cef_binary_value_t*(CEF_CALLBACK* get_binary)(
       struct _cef_value_t* self);
 
   ///
-  // Returns the underlying value as type dictionary. The returned reference may
-  // become invalid if the value is owned by another object or if ownership is
-  // transferred to another object in the future. To maintain a reference to the
-  // value after assigning ownership to a dictionary or list pass this object to
-  // the set_value() function instead of passing the returned reference to
-  // set_dictionary().
+  /// Returns the underlying value as type dictionary. The returned reference
+  /// may become invalid if the value is owned by another object or if ownership
+  /// is transferred to another object in the future. To maintain a reference to
+  /// the value after assigning ownership to a dictionary or list pass this
+  /// object to the set_value() function instead of passing the returned
+  /// reference to set_dictionary().
   ///
   struct _cef_dictionary_value_t*(CEF_CALLBACK* get_dictionary)(
       struct _cef_value_t* self);
 
   ///
-  // Returns the underlying value as type list. The returned reference may
-  // become invalid if the value is owned by another object or if ownership is
-  // transferred to another object in the future. To maintain a reference to the
-  // value after assigning ownership to a dictionary or list pass this object to
-  // the set_value() function instead of passing the returned reference to
-  // set_list().
+  /// Returns the underlying value as type list. The returned reference may
+  /// become invalid if the value is owned by another object or if ownership is
+  /// transferred to another object in the future. To maintain a reference to
+  /// the value after assigning ownership to a dictionary or list pass this
+  /// object to the set_value() function instead of passing the returned
+  /// reference to set_list().
   ///
   struct _cef_list_value_t*(CEF_CALLBACK* get_list)(struct _cef_value_t* self);
 
   ///
-  // Sets the underlying value as type null. Returns true (1) if the value was
-  // set successfully.
+  /// Sets the underlying value as type null. Returns true (1) if the value was
+  /// set successfully.
   ///
   int(CEF_CALLBACK* set_null)(struct _cef_value_t* self);
 
   ///
-  // Sets the underlying value as type bool. Returns true (1) if the value was
-  // set successfully.
+  /// Sets the underlying value as type bool. Returns true (1) if the value was
+  /// set successfully.
   ///
   int(CEF_CALLBACK* set_bool)(struct _cef_value_t* self, int value);
 
   ///
-  // Sets the underlying value as type int. Returns true (1) if the value was
-  // set successfully.
+  /// Sets the underlying value as type int. Returns true (1) if the value was
+  /// set successfully.
   ///
   int(CEF_CALLBACK* set_int)(struct _cef_value_t* self, int value);
 
   ///
-  // Sets the underlying value as type double. Returns true (1) if the value was
-  // set successfully.
+  /// Sets the underlying value as type double. Returns true (1) if the value
+  /// was set successfully.
   ///
   int(CEF_CALLBACK* set_double)(struct _cef_value_t* self, double value);
 
   ///
-  // Sets the underlying value as type string. Returns true (1) if the value was
-  // set successfully.
+  /// Sets the underlying value as type string. Returns true (1) if the value
+  /// was set successfully.
   ///
   int(CEF_CALLBACK* set_string)(struct _cef_value_t* self,
                                 const cef_string_t* value);
 
   ///
-  // Sets the underlying value as type binary. Returns true (1) if the value was
-  // set successfully. This object keeps a reference to |value| and ownership of
-  // the underlying data remains unchanged.
+  /// Sets the underlying value as type binary. Returns true (1) if the value
+  /// was set successfully. This object keeps a reference to |value| and
+  /// ownership of the underlying data remains unchanged.
   ///
   int(CEF_CALLBACK* set_binary)(struct _cef_value_t* self,
                                 struct _cef_binary_value_t* value);
 
   ///
-  // Sets the underlying value as type dict. Returns true (1) if the value was
-  // set successfully. This object keeps a reference to |value| and ownership of
-  // the underlying data remains unchanged.
+  /// Sets the underlying value as type dict. Returns true (1) if the value was
+  /// set successfully. This object keeps a reference to |value| and ownership
+  /// of the underlying data remains unchanged.
   ///
   int(CEF_CALLBACK* set_dictionary)(struct _cef_value_t* self,
                                     struct _cef_dictionary_value_t* value);
 
   ///
-  // Sets the underlying value as type list. Returns true (1) if the value was
-  // set successfully. This object keeps a reference to |value| and ownership of
-  // the underlying data remains unchanged.
+  /// Sets the underlying value as type list. Returns true (1) if the value was
+  /// set successfully. This object keeps a reference to |value| and ownership
+  /// of the underlying data remains unchanged.
   ///
   int(CEF_CALLBACK* set_list)(struct _cef_value_t* self,
                               struct _cef_list_value_t* value);
 } cef_value_t;
 
 ///
-// Creates a new object.
+/// Creates a new object.
 ///
-CEF_EXPORT cef_value_t* cef_value_create();
+CEF_EXPORT cef_value_t* cef_value_create(void);
 
 ///
-// Structure representing a binary value. Can be used on any process and thread.
+/// Structure representing a binary value. Can be used on any process and
+/// thread.
 ///
 typedef struct _cef_binary_value_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns true (1) if this object is valid. This object may become invalid if
-  // the underlying data is owned by another object (e.g. list or dictionary)
-  // and that other object is then modified or destroyed. Do not call any other
-  // functions if this function returns false (0).
+  /// Returns true (1) if this object is valid. This object may become invalid
+  /// if the underlying data is owned by another object (e.g. list or
+  /// dictionary) and that other object is then modified or destroyed. Do not
+  /// call any other functions if this function returns false (0).
   ///
   int(CEF_CALLBACK* is_valid)(struct _cef_binary_value_t* self);
 
   ///
-  // Returns true (1) if this object is currently owned by another object.
+  /// Returns true (1) if this object is currently owned by another object.
   ///
   int(CEF_CALLBACK* is_owned)(struct _cef_binary_value_t* self);
 
   ///
-  // Returns true (1) if this object and |that| object have the same underlying
-  // data.
+  /// Returns true (1) if this object and |that| object have the same underlying
+  /// data.
   ///
   int(CEF_CALLBACK* is_same)(struct _cef_binary_value_t* self,
                              struct _cef_binary_value_t* that);
 
   ///
-  // Returns true (1) if this object and |that| object have an equivalent
-  // underlying value but are not necessarily the same object.
+  /// Returns true (1) if this object and |that| object have an equivalent
+  /// underlying value but are not necessarily the same object.
   ///
   int(CEF_CALLBACK* is_equal)(struct _cef_binary_value_t* self,
                               struct _cef_binary_value_t* that);
 
   ///
-  // Returns a copy of this object. The data in this object will also be copied.
+  /// Returns a copy of this object. The data in this object will also be
+  /// copied.
   ///
   struct _cef_binary_value_t*(CEF_CALLBACK* copy)(
       struct _cef_binary_value_t* self);
 
   ///
-  // Returns the data size.
+  /// Returns a pointer to the beginning of the memory block. The returned
+  /// pointer is valid as long as the cef_binary_value_t is alive.
+  ///
+  const void*(CEF_CALLBACK* get_raw_data)(struct _cef_binary_value_t* self);
+
+  ///
+  /// Returns the data size.
   ///
   size_t(CEF_CALLBACK* get_size)(struct _cef_binary_value_t* self);
 
   ///
-  // Read up to |buffer_size| number of bytes into |buffer|. Reading begins at
-  // the specified byte |data_offset|. Returns the number of bytes read.
+  /// Read up to |buffer_size| number of bytes into |buffer|. Reading begins at
+  /// the specified byte |data_offset|. Returns the number of bytes read.
   ///
   size_t(CEF_CALLBACK* get_data)(struct _cef_binary_value_t* self,
                                  void* buffer,
@@ -279,130 +287,130 @@
 } cef_binary_value_t;
 
 ///
-// Creates a new object that is not owned by any other object. The specified
-// |data| will be copied.
+/// Creates a new object that is not owned by any other object. The specified
+/// |data| will be copied.
 ///
 CEF_EXPORT cef_binary_value_t* cef_binary_value_create(const void* data,
                                                        size_t data_size);
 
 ///
-// Structure representing a dictionary value. Can be used on any process and
-// thread.
+/// Structure representing a dictionary value. Can be used on any process and
+/// thread.
 ///
 typedef struct _cef_dictionary_value_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns true (1) if this object is valid. This object may become invalid if
-  // the underlying data is owned by another object (e.g. list or dictionary)
-  // and that other object is then modified or destroyed. Do not call any other
-  // functions if this function returns false (0).
+  /// Returns true (1) if this object is valid. This object may become invalid
+  /// if the underlying data is owned by another object (e.g. list or
+  /// dictionary) and that other object is then modified or destroyed. Do not
+  /// call any other functions if this function returns false (0).
   ///
   int(CEF_CALLBACK* is_valid)(struct _cef_dictionary_value_t* self);
 
   ///
-  // Returns true (1) if this object is currently owned by another object.
+  /// Returns true (1) if this object is currently owned by another object.
   ///
   int(CEF_CALLBACK* is_owned)(struct _cef_dictionary_value_t* self);
 
   ///
-  // Returns true (1) if the values of this object are read-only. Some APIs may
-  // expose read-only objects.
+  /// Returns true (1) if the values of this object are read-only. Some APIs may
+  /// expose read-only objects.
   ///
   int(CEF_CALLBACK* is_read_only)(struct _cef_dictionary_value_t* self);
 
   ///
-  // Returns true (1) if this object and |that| object have the same underlying
-  // data. If true (1) modifications to this object will also affect |that|
-  // object and vice-versa.
+  /// Returns true (1) if this object and |that| object have the same underlying
+  /// data. If true (1) modifications to this object will also affect |that|
+  /// object and vice-versa.
   ///
   int(CEF_CALLBACK* is_same)(struct _cef_dictionary_value_t* self,
                              struct _cef_dictionary_value_t* that);
 
   ///
-  // Returns true (1) if this object and |that| object have an equivalent
-  // underlying value but are not necessarily the same object.
+  /// Returns true (1) if this object and |that| object have an equivalent
+  /// underlying value but are not necessarily the same object.
   ///
   int(CEF_CALLBACK* is_equal)(struct _cef_dictionary_value_t* self,
                               struct _cef_dictionary_value_t* that);
 
   ///
-  // Returns a writable copy of this object. If |exclude_NULL_children| is true
-  // (1) any NULL dictionaries or lists will be excluded from the copy.
+  /// Returns a writable copy of this object. If |exclude_NULL_children| is true
+  /// (1) any NULL dictionaries or lists will be excluded from the copy.
   ///
   struct _cef_dictionary_value_t*(CEF_CALLBACK* copy)(
       struct _cef_dictionary_value_t* self,
       int exclude_empty_children);
 
   ///
-  // Returns the number of values.
+  /// Returns the number of values.
   ///
   size_t(CEF_CALLBACK* get_size)(struct _cef_dictionary_value_t* self);
 
   ///
-  // Removes all values. Returns true (1) on success.
+  /// Removes all values. Returns true (1) on success.
   ///
   int(CEF_CALLBACK* clear)(struct _cef_dictionary_value_t* self);
 
   ///
-  // Returns true (1) if the current dictionary has a value for the given key.
+  /// Returns true (1) if the current dictionary has a value for the given key.
   ///
   int(CEF_CALLBACK* has_key)(struct _cef_dictionary_value_t* self,
                              const cef_string_t* key);
 
   ///
-  // Reads all keys for this dictionary into the specified vector.
+  /// Reads all keys for this dictionary into the specified vector.
   ///
   int(CEF_CALLBACK* get_keys)(struct _cef_dictionary_value_t* self,
                               cef_string_list_t keys);
 
   ///
-  // Removes the value at the specified key. Returns true (1) is the value was
-  // removed successfully.
+  /// Removes the value at the specified key. Returns true (1) is the value was
+  /// removed successfully.
   ///
   int(CEF_CALLBACK* remove)(struct _cef_dictionary_value_t* self,
                             const cef_string_t* key);
 
   ///
-  // Returns the value type for the specified key.
+  /// Returns the value type for the specified key.
   ///
   cef_value_type_t(CEF_CALLBACK* get_type)(struct _cef_dictionary_value_t* self,
                                            const cef_string_t* key);
 
   ///
-  // Returns the value at the specified key. For simple types the returned value
-  // will copy existing data and modifications to the value will not modify this
-  // object. For complex types (binary, dictionary and list) the returned value
-  // will reference existing data and modifications to the value will modify
-  // this object.
+  /// Returns the value at the specified key. For simple types the returned
+  /// value will copy existing data and modifications to the value will not
+  /// modify this object. For complex types (binary, dictionary and list) the
+  /// returned value will reference existing data and modifications to the value
+  /// will modify this object.
   ///
   struct _cef_value_t*(CEF_CALLBACK* get_value)(
       struct _cef_dictionary_value_t* self,
       const cef_string_t* key);
 
   ///
-  // Returns the value at the specified key as type bool.
+  /// Returns the value at the specified key as type bool.
   ///
   int(CEF_CALLBACK* get_bool)(struct _cef_dictionary_value_t* self,
                               const cef_string_t* key);
 
   ///
-  // Returns the value at the specified key as type int.
+  /// Returns the value at the specified key as type int.
   ///
   int(CEF_CALLBACK* get_int)(struct _cef_dictionary_value_t* self,
                              const cef_string_t* key);
 
   ///
-  // Returns the value at the specified key as type double.
+  /// Returns the value at the specified key as type double.
   ///
   double(CEF_CALLBACK* get_double)(struct _cef_dictionary_value_t* self,
                                    const cef_string_t* key);
 
   ///
-  // Returns the value at the specified key as type string.
+  /// Returns the value at the specified key as type string.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_string)(
@@ -410,110 +418,110 @@
       const cef_string_t* key);
 
   ///
-  // Returns the value at the specified key as type binary. The returned value
-  // will reference existing data.
+  /// Returns the value at the specified key as type binary. The returned value
+  /// will reference existing data.
   ///
   struct _cef_binary_value_t*(CEF_CALLBACK* get_binary)(
       struct _cef_dictionary_value_t* self,
       const cef_string_t* key);
 
   ///
-  // Returns the value at the specified key as type dictionary. The returned
-  // value will reference existing data and modifications to the value will
-  // modify this object.
+  /// Returns the value at the specified key as type dictionary. The returned
+  /// value will reference existing data and modifications to the value will
+  /// modify this object.
   ///
   struct _cef_dictionary_value_t*(CEF_CALLBACK* get_dictionary)(
       struct _cef_dictionary_value_t* self,
       const cef_string_t* key);
 
   ///
-  // Returns the value at the specified key as type list. The returned value
-  // will reference existing data and modifications to the value will modify
-  // this object.
+  /// Returns the value at the specified key as type list. The returned value
+  /// will reference existing data and modifications to the value will modify
+  /// this object.
   ///
   struct _cef_list_value_t*(CEF_CALLBACK* get_list)(
       struct _cef_dictionary_value_t* self,
       const cef_string_t* key);
 
   ///
-  // Sets the value at the specified key. Returns true (1) if the value was set
-  // successfully. If |value| represents simple data then the underlying data
-  // will be copied and modifications to |value| will not modify this object. If
-  // |value| represents complex data (binary, dictionary or list) then the
-  // underlying data will be referenced and modifications to |value| will modify
-  // this object.
+  /// Sets the value at the specified key. Returns true (1) if the value was set
+  /// successfully. If |value| represents simple data then the underlying data
+  /// will be copied and modifications to |value| will not modify this object.
+  /// If |value| represents complex data (binary, dictionary or list) then the
+  /// underlying data will be referenced and modifications to |value| will
+  /// modify this object.
   ///
   int(CEF_CALLBACK* set_value)(struct _cef_dictionary_value_t* self,
                                const cef_string_t* key,
                                struct _cef_value_t* value);
 
   ///
-  // Sets the value at the specified key as type null. Returns true (1) if the
-  // value was set successfully.
+  /// Sets the value at the specified key as type null. Returns true (1) if the
+  /// value was set successfully.
   ///
   int(CEF_CALLBACK* set_null)(struct _cef_dictionary_value_t* self,
                               const cef_string_t* key);
 
   ///
-  // Sets the value at the specified key as type bool. Returns true (1) if the
-  // value was set successfully.
+  /// Sets the value at the specified key as type bool. Returns true (1) if the
+  /// value was set successfully.
   ///
   int(CEF_CALLBACK* set_bool)(struct _cef_dictionary_value_t* self,
                               const cef_string_t* key,
                               int value);
 
   ///
-  // Sets the value at the specified key as type int. Returns true (1) if the
-  // value was set successfully.
+  /// Sets the value at the specified key as type int. Returns true (1) if the
+  /// value was set successfully.
   ///
   int(CEF_CALLBACK* set_int)(struct _cef_dictionary_value_t* self,
                              const cef_string_t* key,
                              int value);
 
   ///
-  // Sets the value at the specified key as type double. Returns true (1) if the
-  // value was set successfully.
+  /// Sets the value at the specified key as type double. Returns true (1) if
+  /// the value was set successfully.
   ///
   int(CEF_CALLBACK* set_double)(struct _cef_dictionary_value_t* self,
                                 const cef_string_t* key,
                                 double value);
 
   ///
-  // Sets the value at the specified key as type string. Returns true (1) if the
-  // value was set successfully.
+  /// Sets the value at the specified key as type string. Returns true (1) if
+  /// the value was set successfully.
   ///
   int(CEF_CALLBACK* set_string)(struct _cef_dictionary_value_t* self,
                                 const cef_string_t* key,
                                 const cef_string_t* value);
 
   ///
-  // Sets the value at the specified key as type binary. Returns true (1) if the
-  // value was set successfully. If |value| is currently owned by another object
-  // then the value will be copied and the |value| reference will not change.
-  // Otherwise, ownership will be transferred to this object and the |value|
-  // reference will be invalidated.
+  /// Sets the value at the specified key as type binary. Returns true (1) if
+  /// the value was set successfully. If |value| is currently owned by another
+  /// object then the value will be copied and the |value| reference will not
+  /// change. Otherwise, ownership will be transferred to this object and the
+  /// |value| reference will be invalidated.
   ///
   int(CEF_CALLBACK* set_binary)(struct _cef_dictionary_value_t* self,
                                 const cef_string_t* key,
                                 struct _cef_binary_value_t* value);
 
   ///
-  // Sets the value at the specified key as type dict. Returns true (1) if the
-  // value was set successfully. If |value| is currently owned by another object
-  // then the value will be copied and the |value| reference will not change.
-  // Otherwise, ownership will be transferred to this object and the |value|
-  // reference will be invalidated.
+  /// Sets the value at the specified key as type dict. Returns true (1) if the
+  /// value was set successfully. If |value| is currently owned by another
+  /// object then the value will be copied and the |value| reference will not
+  /// change. Otherwise, ownership will be transferred to this object and the
+  /// |value| reference will be invalidated.
   ///
   int(CEF_CALLBACK* set_dictionary)(struct _cef_dictionary_value_t* self,
                                     const cef_string_t* key,
                                     struct _cef_dictionary_value_t* value);
 
   ///
-  // Sets the value at the specified key as type list. Returns true (1) if the
-  // value was set successfully. If |value| is currently owned by another object
-  // then the value will be copied and the |value| reference will not change.
-  // Otherwise, ownership will be transferred to this object and the |value|
-  // reference will be invalidated.
+  /// Sets the value at the specified key as type list. Returns true (1) if the
+  /// value was set successfully. If |value| is currently owned by another
+  /// object then the value will be copied and the |value| reference will not
+  /// change. Otherwise, ownership will be transferred to this object and the
+  /// |value| reference will be invalidated.
   ///
   int(CEF_CALLBACK* set_list)(struct _cef_dictionary_value_t* self,
                               const cef_string_t* key,
@@ -521,220 +529,220 @@
 } cef_dictionary_value_t;
 
 ///
-// Creates a new object that is not owned by any other object.
+/// Creates a new object that is not owned by any other object.
 ///
-CEF_EXPORT cef_dictionary_value_t* cef_dictionary_value_create();
+CEF_EXPORT cef_dictionary_value_t* cef_dictionary_value_create(void);
 
 ///
-// Structure representing a list value. Can be used on any process and thread.
+/// Structure representing a list value. Can be used on any process and thread.
 ///
 typedef struct _cef_list_value_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns true (1) if this object is valid. This object may become invalid if
-  // the underlying data is owned by another object (e.g. list or dictionary)
-  // and that other object is then modified or destroyed. Do not call any other
-  // functions if this function returns false (0).
+  /// Returns true (1) if this object is valid. This object may become invalid
+  /// if the underlying data is owned by another object (e.g. list or
+  /// dictionary) and that other object is then modified or destroyed. Do not
+  /// call any other functions if this function returns false (0).
   ///
   int(CEF_CALLBACK* is_valid)(struct _cef_list_value_t* self);
 
   ///
-  // Returns true (1) if this object is currently owned by another object.
+  /// Returns true (1) if this object is currently owned by another object.
   ///
   int(CEF_CALLBACK* is_owned)(struct _cef_list_value_t* self);
 
   ///
-  // Returns true (1) if the values of this object are read-only. Some APIs may
-  // expose read-only objects.
+  /// Returns true (1) if the values of this object are read-only. Some APIs may
+  /// expose read-only objects.
   ///
   int(CEF_CALLBACK* is_read_only)(struct _cef_list_value_t* self);
 
   ///
-  // Returns true (1) if this object and |that| object have the same underlying
-  // data. If true (1) modifications to this object will also affect |that|
-  // object and vice-versa.
+  /// Returns true (1) if this object and |that| object have the same underlying
+  /// data. If true (1) modifications to this object will also affect |that|
+  /// object and vice-versa.
   ///
   int(CEF_CALLBACK* is_same)(struct _cef_list_value_t* self,
                              struct _cef_list_value_t* that);
 
   ///
-  // Returns true (1) if this object and |that| object have an equivalent
-  // underlying value but are not necessarily the same object.
+  /// Returns true (1) if this object and |that| object have an equivalent
+  /// underlying value but are not necessarily the same object.
   ///
   int(CEF_CALLBACK* is_equal)(struct _cef_list_value_t* self,
                               struct _cef_list_value_t* that);
 
   ///
-  // Returns a writable copy of this object.
+  /// Returns a writable copy of this object.
   ///
   struct _cef_list_value_t*(CEF_CALLBACK* copy)(struct _cef_list_value_t* self);
 
   ///
-  // Sets the number of values. If the number of values is expanded all new
-  // value slots will default to type null. Returns true (1) on success.
+  /// Sets the number of values. If the number of values is expanded all new
+  /// value slots will default to type null. Returns true (1) on success.
   ///
   int(CEF_CALLBACK* set_size)(struct _cef_list_value_t* self, size_t size);
 
   ///
-  // Returns the number of values.
+  /// Returns the number of values.
   ///
   size_t(CEF_CALLBACK* get_size)(struct _cef_list_value_t* self);
 
   ///
-  // Removes all values. Returns true (1) on success.
+  /// Removes all values. Returns true (1) on success.
   ///
   int(CEF_CALLBACK* clear)(struct _cef_list_value_t* self);
 
   ///
-  // Removes the value at the specified index.
+  /// Removes the value at the specified index.
   ///
   int(CEF_CALLBACK* remove)(struct _cef_list_value_t* self, size_t index);
 
   ///
-  // Returns the value type at the specified index.
+  /// Returns the value type at the specified index.
   ///
   cef_value_type_t(CEF_CALLBACK* get_type)(struct _cef_list_value_t* self,
                                            size_t index);
 
   ///
-  // Returns the value at the specified index. For simple types the returned
-  // value will copy existing data and modifications to the value will not
-  // modify this object. For complex types (binary, dictionary and list) the
-  // returned value will reference existing data and modifications to the value
-  // will modify this object.
+  /// Returns the value at the specified index. For simple types the returned
+  /// value will copy existing data and modifications to the value will not
+  /// modify this object. For complex types (binary, dictionary and list) the
+  /// returned value will reference existing data and modifications to the value
+  /// will modify this object.
   ///
   struct _cef_value_t*(CEF_CALLBACK* get_value)(struct _cef_list_value_t* self,
                                                 size_t index);
 
   ///
-  // Returns the value at the specified index as type bool.
+  /// Returns the value at the specified index as type bool.
   ///
   int(CEF_CALLBACK* get_bool)(struct _cef_list_value_t* self, size_t index);
 
   ///
-  // Returns the value at the specified index as type int.
+  /// Returns the value at the specified index as type int.
   ///
   int(CEF_CALLBACK* get_int)(struct _cef_list_value_t* self, size_t index);
 
   ///
-  // Returns the value at the specified index as type double.
+  /// Returns the value at the specified index as type double.
   ///
   double(CEF_CALLBACK* get_double)(struct _cef_list_value_t* self,
                                    size_t index);
 
   ///
-  // Returns the value at the specified index as type string.
+  /// Returns the value at the specified index as type string.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(
       CEF_CALLBACK* get_string)(struct _cef_list_value_t* self, size_t index);
 
   ///
-  // Returns the value at the specified index as type binary. The returned value
-  // will reference existing data.
+  /// Returns the value at the specified index as type binary. The returned
+  /// value will reference existing data.
   ///
   struct _cef_binary_value_t*(
       CEF_CALLBACK* get_binary)(struct _cef_list_value_t* self, size_t index);
 
   ///
-  // Returns the value at the specified index as type dictionary. The returned
-  // value will reference existing data and modifications to the value will
-  // modify this object.
+  /// Returns the value at the specified index as type dictionary. The returned
+  /// value will reference existing data and modifications to the value will
+  /// modify this object.
   ///
   struct _cef_dictionary_value_t*(CEF_CALLBACK* get_dictionary)(
       struct _cef_list_value_t* self,
       size_t index);
 
   ///
-  // Returns the value at the specified index as type list. The returned value
-  // will reference existing data and modifications to the value will modify
-  // this object.
+  /// Returns the value at the specified index as type list. The returned value
+  /// will reference existing data and modifications to the value will modify
+  /// this object.
   ///
   struct _cef_list_value_t*(
       CEF_CALLBACK* get_list)(struct _cef_list_value_t* self, size_t index);
 
   ///
-  // Sets the value at the specified index. Returns true (1) if the value was
-  // set successfully. If |value| represents simple data then the underlying
-  // data will be copied and modifications to |value| will not modify this
-  // object. If |value| represents complex data (binary, dictionary or list)
-  // then the underlying data will be referenced and modifications to |value|
-  // will modify this object.
+  /// Sets the value at the specified index. Returns true (1) if the value was
+  /// set successfully. If |value| represents simple data then the underlying
+  /// data will be copied and modifications to |value| will not modify this
+  /// object. If |value| represents complex data (binary, dictionary or list)
+  /// then the underlying data will be referenced and modifications to |value|
+  /// will modify this object.
   ///
   int(CEF_CALLBACK* set_value)(struct _cef_list_value_t* self,
                                size_t index,
                                struct _cef_value_t* value);
 
   ///
-  // Sets the value at the specified index as type null. Returns true (1) if the
-  // value was set successfully.
+  /// Sets the value at the specified index as type null. Returns true (1) if
+  /// the value was set successfully.
   ///
   int(CEF_CALLBACK* set_null)(struct _cef_list_value_t* self, size_t index);
 
   ///
-  // Sets the value at the specified index as type bool. Returns true (1) if the
-  // value was set successfully.
+  /// Sets the value at the specified index as type bool. Returns true (1) if
+  /// the value was set successfully.
   ///
   int(CEF_CALLBACK* set_bool)(struct _cef_list_value_t* self,
                               size_t index,
                               int value);
 
   ///
-  // Sets the value at the specified index as type int. Returns true (1) if the
-  // value was set successfully.
+  /// Sets the value at the specified index as type int. Returns true (1) if the
+  /// value was set successfully.
   ///
   int(CEF_CALLBACK* set_int)(struct _cef_list_value_t* self,
                              size_t index,
                              int value);
 
   ///
-  // Sets the value at the specified index as type double. Returns true (1) if
-  // the value was set successfully.
+  /// Sets the value at the specified index as type double. Returns true (1) if
+  /// the value was set successfully.
   ///
   int(CEF_CALLBACK* set_double)(struct _cef_list_value_t* self,
                                 size_t index,
                                 double value);
 
   ///
-  // Sets the value at the specified index as type string. Returns true (1) if
-  // the value was set successfully.
+  /// Sets the value at the specified index as type string. Returns true (1) if
+  /// the value was set successfully.
   ///
   int(CEF_CALLBACK* set_string)(struct _cef_list_value_t* self,
                                 size_t index,
                                 const cef_string_t* value);
 
   ///
-  // Sets the value at the specified index as type binary. Returns true (1) if
-  // the value was set successfully. If |value| is currently owned by another
-  // object then the value will be copied and the |value| reference will not
-  // change. Otherwise, ownership will be transferred to this object and the
-  // |value| reference will be invalidated.
+  /// Sets the value at the specified index as type binary. Returns true (1) if
+  /// the value was set successfully. If |value| is currently owned by another
+  /// object then the value will be copied and the |value| reference will not
+  /// change. Otherwise, ownership will be transferred to this object and the
+  /// |value| reference will be invalidated.
   ///
   int(CEF_CALLBACK* set_binary)(struct _cef_list_value_t* self,
                                 size_t index,
                                 struct _cef_binary_value_t* value);
 
   ///
-  // Sets the value at the specified index as type dict. Returns true (1) if the
-  // value was set successfully. If |value| is currently owned by another object
-  // then the value will be copied and the |value| reference will not change.
-  // Otherwise, ownership will be transferred to this object and the |value|
-  // reference will be invalidated.
+  /// Sets the value at the specified index as type dict. Returns true (1) if
+  /// the value was set successfully. If |value| is currently owned by another
+  /// object then the value will be copied and the |value| reference will not
+  /// change. Otherwise, ownership will be transferred to this object and the
+  /// |value| reference will be invalidated.
   ///
   int(CEF_CALLBACK* set_dictionary)(struct _cef_list_value_t* self,
                                     size_t index,
                                     struct _cef_dictionary_value_t* value);
 
   ///
-  // Sets the value at the specified index as type list. Returns true (1) if the
-  // value was set successfully. If |value| is currently owned by another object
-  // then the value will be copied and the |value| reference will not change.
-  // Otherwise, ownership will be transferred to this object and the |value|
-  // reference will be invalidated.
+  /// Sets the value at the specified index as type list. Returns true (1) if
+  /// the value was set successfully. If |value| is currently owned by another
+  /// object then the value will be copied and the |value| reference will not
+  /// change. Otherwise, ownership will be transferred to this object and the
+  /// |value| reference will be invalidated.
   ///
   int(CEF_CALLBACK* set_list)(struct _cef_list_value_t* self,
                               size_t index,
@@ -742,9 +750,9 @@
 } cef_list_value_t;
 
 ///
-// Creates a new object that is not owned by any other object.
+/// Creates a new object that is not owned by any other object.
 ///
-CEF_EXPORT cef_list_value_t* cef_list_value_create();
+CEF_EXPORT cef_list_value_t* cef_list_value_create(void);
 
 #ifdef __cplusplus
 }
diff --git a/src/include/capi/cef_waitable_event_capi.h b/src/include/capi/cef_waitable_event_capi.h
index e046586..9e8bc1b 100644
--- a/src/include/capi/cef_waitable_event_capi.h
+++ b/src/include/capi/cef_waitable_event_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=aedfa5758cbf37dff244c065d55d273231470877$
+// $hash=be3741396459ccf1337f319965ba1dc509142536$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_WAITABLE_EVENT_CAPI_H_
@@ -47,64 +47,64 @@
 #endif
 
 ///
-// WaitableEvent is a thread synchronization tool that allows one thread to wait
-// for another thread to finish some work. This is equivalent to using a
-// Lock+ConditionVariable to protect a simple boolean value. However, using
-// WaitableEvent in conjunction with a Lock to wait for a more complex state
-// change (e.g., for an item to be added to a queue) is not recommended. In that
-// case consider using a ConditionVariable instead of a WaitableEvent. It is
-// safe to create and/or signal a WaitableEvent from any thread. Blocking on a
-// WaitableEvent by calling the *wait() functions is not allowed on the browser
-// process UI or IO threads.
+/// WaitableEvent is a thread synchronization tool that allows one thread to
+/// wait for another thread to finish some work. This is equivalent to using a
+/// Lock+ConditionVariable to protect a simple boolean value. However, using
+/// WaitableEvent in conjunction with a Lock to wait for a more complex state
+/// change (e.g., for an item to be added to a queue) is not recommended. In
+/// that case consider using a ConditionVariable instead of a WaitableEvent. It
+/// is safe to create and/or signal a WaitableEvent from any thread. Blocking on
+/// a WaitableEvent by calling the *wait() functions is not allowed on the
+/// browser process UI or IO threads.
 ///
 typedef struct _cef_waitable_event_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Put the event in the un-signaled state.
+  /// Put the event in the un-signaled state.
   ///
   void(CEF_CALLBACK* reset)(struct _cef_waitable_event_t* self);
 
   ///
-  // Put the event in the signaled state. This causes any thread blocked on Wait
-  // to be woken up.
+  /// Put the event in the signaled state. This causes any thread blocked on
+  /// Wait to be woken up.
   ///
   void(CEF_CALLBACK* signal)(struct _cef_waitable_event_t* self);
 
   ///
-  // Returns true (1) if the event is in the signaled state, else false (0). If
-  // the event was created with |automatic_reset| set to true (1) then calling
-  // this function will also cause a reset.
+  /// Returns true (1) if the event is in the signaled state, else false (0). If
+  /// the event was created with |automatic_reset| set to true (1) then calling
+  /// this function will also cause a reset.
   ///
   int(CEF_CALLBACK* is_signaled)(struct _cef_waitable_event_t* self);
 
   ///
-  // Wait indefinitely for the event to be signaled. This function will not
-  // return until after the call to signal() has completed. This function cannot
-  // be called on the browser process UI or IO threads.
+  /// Wait indefinitely for the event to be signaled. This function will not
+  /// return until after the call to signal() has completed. This function
+  /// cannot be called on the browser process UI or IO threads.
   ///
   void(CEF_CALLBACK* wait)(struct _cef_waitable_event_t* self);
 
   ///
-  // Wait up to |max_ms| milliseconds for the event to be signaled. Returns true
-  // (1) if the event was signaled. A return value of false (0) does not
-  // necessarily mean that |max_ms| was exceeded. This function will not return
-  // until after the call to signal() has completed. This function cannot be
-  // called on the browser process UI or IO threads.
+  /// Wait up to |max_ms| milliseconds for the event to be signaled. Returns
+  /// true (1) if the event was signaled. A return value of false (0) does not
+  /// necessarily mean that |max_ms| was exceeded. This function will not return
+  /// until after the call to signal() has completed. This function cannot be
+  /// called on the browser process UI or IO threads.
   ///
   int(CEF_CALLBACK* timed_wait)(struct _cef_waitable_event_t* self,
-                                int64 max_ms);
+                                int64_t max_ms);
 } cef_waitable_event_t;
 
 ///
-// Create a new waitable event. If |automatic_reset| is true (1) then the event
-// state is automatically reset to un-signaled after a single waiting thread has
-// been released; otherwise, the state remains signaled until reset() is called
-// manually. If |initially_signaled| is true (1) then the event will start in
-// the signaled state.
+/// Create a new waitable event. If |automatic_reset| is true (1) then the event
+/// state is automatically reset to un-signaled after a single waiting thread
+/// has been released; otherwise, the state remains signaled until reset() is
+/// called manually. If |initially_signaled| is true (1) then the event will
+/// start in the signaled state.
 ///
 CEF_EXPORT cef_waitable_event_t* cef_waitable_event_create(
     int automatic_reset,
diff --git a/src/include/capi/cef_web_plugin_capi.h b/src/include/capi/cef_web_plugin_capi.h
deleted file mode 100644
index 6cef957..0000000
--- a/src/include/capi/cef_web_plugin_capi.h
+++ /dev/null
@@ -1,240 +0,0 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. 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 file was generated by the CEF translator tool and should not edited
-// by hand. See the translator.README.txt file in the tools directory for
-// more information.
-//
-// $hash=f1b2b6203d45fdf76d72ea1e79fcef0bb2a26138$
-//
-
-#ifndef CEF_INCLUDE_CAPI_CEF_WEB_PLUGIN_CAPI_H_
-#define CEF_INCLUDE_CAPI_CEF_WEB_PLUGIN_CAPI_H_
-#pragma once
-
-#include "include/capi/cef_base_capi.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct _cef_browser_t;
-
-///
-// Information about a specific web plugin.
-///
-typedef struct _cef_web_plugin_info_t {
-  ///
-  // Base structure.
-  ///
-  cef_base_ref_counted_t base;
-
-  ///
-  // Returns the plugin name (i.e. Flash).
-  ///
-  // The resulting string must be freed by calling cef_string_userfree_free().
-  cef_string_userfree_t(CEF_CALLBACK* get_name)(
-      struct _cef_web_plugin_info_t* self);
-
-  ///
-  // Returns the plugin file path (DLL/bundle/library).
-  ///
-  // The resulting string must be freed by calling cef_string_userfree_free().
-  cef_string_userfree_t(CEF_CALLBACK* get_path)(
-      struct _cef_web_plugin_info_t* self);
-
-  ///
-  // Returns the version of the plugin (may be OS-specific).
-  ///
-  // The resulting string must be freed by calling cef_string_userfree_free().
-  cef_string_userfree_t(CEF_CALLBACK* get_version)(
-      struct _cef_web_plugin_info_t* self);
-
-  ///
-  // Returns a description of the plugin from the version information.
-  ///
-  // The resulting string must be freed by calling cef_string_userfree_free().
-  cef_string_userfree_t(CEF_CALLBACK* get_description)(
-      struct _cef_web_plugin_info_t* self);
-} cef_web_plugin_info_t;
-
-///
-// Structure to implement for visiting web plugin information. The functions of
-// this structure will be called on the browser process UI thread.
-///
-typedef struct _cef_web_plugin_info_visitor_t {
-  ///
-  // Base structure.
-  ///
-  cef_base_ref_counted_t base;
-
-  ///
-  // Method that will be called once for each plugin. |count| is the 0-based
-  // index for the current plugin. |total| is the total number of plugins.
-  // Return false (0) to stop visiting plugins. This function may never be
-  // called if no plugins are found.
-  ///
-  int(CEF_CALLBACK* visit)(struct _cef_web_plugin_info_visitor_t* self,
-                           struct _cef_web_plugin_info_t* info,
-                           int count,
-                           int total);
-} cef_web_plugin_info_visitor_t;
-
-///
-// Structure to implement for receiving unstable plugin information. The
-// functions of this structure will be called on the browser process IO thread.
-///
-typedef struct _cef_web_plugin_unstable_callback_t {
-  ///
-  // Base structure.
-  ///
-  cef_base_ref_counted_t base;
-
-  ///
-  // Method that will be called for the requested plugin. |unstable| will be
-  // true (1) if the plugin has reached the crash count threshold of 3 times in
-  // 120 seconds.
-  ///
-  void(CEF_CALLBACK* is_unstable)(
-      struct _cef_web_plugin_unstable_callback_t* self,
-      const cef_string_t* path,
-      int unstable);
-} cef_web_plugin_unstable_callback_t;
-
-///
-// Implement this structure to receive notification when CDM registration is
-// complete. The functions of this structure will be called on the browser
-// process UI thread.
-///
-typedef struct _cef_register_cdm_callback_t {
-  ///
-  // Base structure.
-  ///
-  cef_base_ref_counted_t base;
-
-  ///
-  // Method that will be called when CDM registration is complete. |result| will
-  // be CEF_CDM_REGISTRATION_ERROR_NONE if registration completed successfully.
-  // Otherwise, |result| and |error_message| will contain additional information
-  // about why registration failed.
-  ///
-  void(CEF_CALLBACK* on_cdm_registration_complete)(
-      struct _cef_register_cdm_callback_t* self,
-      cef_cdm_registration_error_t result,
-      const cef_string_t* error_message);
-} cef_register_cdm_callback_t;
-
-///
-// Visit web plugin information. Can be called on any thread in the browser
-// process.
-///
-CEF_EXPORT void cef_visit_web_plugin_info(
-    cef_web_plugin_info_visitor_t* visitor);
-
-///
-// Cause the plugin list to refresh the next time it is accessed regardless of
-// whether it has already been loaded. Can be called on any thread in the
-// browser process.
-///
-CEF_EXPORT void cef_refresh_web_plugins();
-
-///
-// Unregister an internal plugin. This may be undone the next time
-// cef_refresh_web_plugins() is called. Can be called on any thread in the
-// browser process.
-///
-CEF_EXPORT void cef_unregister_internal_web_plugin(const cef_string_t* path);
-
-///
-// Register a plugin crash. Can be called on any thread in the browser process
-// but will be executed on the IO thread.
-///
-CEF_EXPORT void cef_register_web_plugin_crash(const cef_string_t* path);
-
-///
-// Query if a plugin is unstable. Can be called on any thread in the browser
-// process.
-///
-CEF_EXPORT void cef_is_web_plugin_unstable(
-    const cef_string_t* path,
-    cef_web_plugin_unstable_callback_t* callback);
-
-///
-// Register the Widevine CDM plugin.
-//
-// The client application is responsible for downloading an appropriate
-// platform-specific CDM binary distribution from Google, extracting the
-// contents, and building the required directory structure on the local machine.
-// The cef_browser_host_t::StartDownload function and CefZipArchive structure
-// can be used to implement this functionality in CEF. Contact Google via
-// https://www.widevine.com/contact.html for details on CDM download.
-//
-// |path| is a directory that must contain the following files:
-//   1. manifest.json file from the CDM binary distribution (see below).
-//   2. widevinecdm file from the CDM binary distribution (e.g.
-//      widevinecdm.dll on on Windows, libwidevinecdm.dylib on OS X,
-//      libwidevinecdm.so on Linux).
-//
-// If any of these files are missing or if the manifest file has incorrect
-// contents the registration will fail and |callback| will receive a |result|
-// value of CEF_CDM_REGISTRATION_ERROR_INCORRECT_CONTENTS.
-//
-// The manifest.json file must contain the following keys:
-//   A. "os": Supported OS (e.g. "mac", "win" or "linux").
-//   B. "arch": Supported architecture (e.g. "ia32" or "x64").
-//   C. "x-cdm-module-versions": Module API version (e.g. "4").
-//   D. "x-cdm-interface-versions": Interface API version (e.g. "8").
-//   E. "x-cdm-host-versions": Host API version (e.g. "8").
-//   F. "version": CDM version (e.g. "1.4.8.903").
-//   G. "x-cdm-codecs": List of supported codecs (e.g. "vp8,vp9.0,avc1").
-//
-// A through E are used to verify compatibility with the current Chromium
-// version. If the CDM is not compatible the registration will fail and
-// |callback| will receive a |result| value of
-// CEF_CDM_REGISTRATION_ERROR_INCOMPATIBLE.
-//
-// |callback| will be executed asynchronously once registration is complete.
-//
-// On Linux this function must be called before cef_initialize() and the
-// registration cannot be changed during runtime. If registration is not
-// supported at the time that cef_register_widevine_cdm() is called then
-// |callback| will receive a |result| value of
-// CEF_CDM_REGISTRATION_ERROR_NOT_SUPPORTED.
-///
-CEF_EXPORT void cef_register_widevine_cdm(
-    const cef_string_t* path,
-    cef_register_cdm_callback_t* callback);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  // CEF_INCLUDE_CAPI_CEF_WEB_PLUGIN_CAPI_H_
diff --git a/src/include/capi/cef_x509_certificate_capi.h b/src/include/capi/cef_x509_certificate_capi.h
index f177f0a..de71ced 100644
--- a/src/include/capi/cef_x509_certificate_capi.h
+++ b/src/include/capi/cef_x509_certificate_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=2d04c2cc1791b90ddb9333fe830ad07042e9df2d$
+// $hash=a4b62b20f30552fef5d522bdd00ebf9a8f12464c$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_X509_CERTIFICATE_CAPI_H_
@@ -48,147 +48,133 @@
 #endif
 
 ///
-// Structure representing the issuer or subject field of an X.509 certificate.
+/// Structure representing the issuer or subject field of an X.509 certificate.
 ///
 typedef struct _cef_x509cert_principal_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns a name that can be used to represent the issuer. It tries in this
-  // order: Common Name (CN), Organization Name (O) and Organizational Unit Name
-  // (OU) and returns the first non-NULL one found.
+  /// Returns a name that can be used to represent the issuer. It tries in this
+  /// order: Common Name (CN), Organization Name (O) and Organizational Unit
+  /// Name (OU) and returns the first non-NULL one found.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_display_name)(
       struct _cef_x509cert_principal_t* self);
 
   ///
-  // Returns the common name.
+  /// Returns the common name.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_common_name)(
       struct _cef_x509cert_principal_t* self);
 
   ///
-  // Returns the locality name.
+  /// Returns the locality name.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_locality_name)(
       struct _cef_x509cert_principal_t* self);
 
   ///
-  // Returns the state or province name.
+  /// Returns the state or province name.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_state_or_province_name)(
       struct _cef_x509cert_principal_t* self);
 
   ///
-  // Returns the country name.
+  /// Returns the country name.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_country_name)(
       struct _cef_x509cert_principal_t* self);
 
   ///
-  // Retrieve the list of street addresses.
-  ///
-  void(CEF_CALLBACK* get_street_addresses)(
-      struct _cef_x509cert_principal_t* self,
-      cef_string_list_t addresses);
-
-  ///
-  // Retrieve the list of organization names.
+  /// Retrieve the list of organization names.
   ///
   void(CEF_CALLBACK* get_organization_names)(
       struct _cef_x509cert_principal_t* self,
       cef_string_list_t names);
 
   ///
-  // Retrieve the list of organization unit names.
+  /// Retrieve the list of organization unit names.
   ///
   void(CEF_CALLBACK* get_organization_unit_names)(
       struct _cef_x509cert_principal_t* self,
       cef_string_list_t names);
-
-  ///
-  // Retrieve the list of domain components.
-  ///
-  void(CEF_CALLBACK* get_domain_components)(
-      struct _cef_x509cert_principal_t* self,
-      cef_string_list_t components);
 } cef_x509cert_principal_t;
 
 ///
-// Structure representing a X.509 certificate.
+/// Structure representing a X.509 certificate.
 ///
 typedef struct _cef_x509certificate_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns the subject of the X.509 certificate. For HTTPS server certificates
-  // this represents the web server.  The common name of the subject should
-  // match the host name of the web server.
+  /// Returns the subject of the X.509 certificate. For HTTPS server
+  /// certificates this represents the web server.  The common name of the
+  /// subject should match the host name of the web server.
   ///
   struct _cef_x509cert_principal_t*(CEF_CALLBACK* get_subject)(
       struct _cef_x509certificate_t* self);
 
   ///
-  // Returns the issuer of the X.509 certificate.
+  /// Returns the issuer of the X.509 certificate.
   ///
   struct _cef_x509cert_principal_t*(CEF_CALLBACK* get_issuer)(
       struct _cef_x509certificate_t* self);
 
   ///
-  // Returns the DER encoded serial number for the X.509 certificate. The value
-  // possibly includes a leading 00 byte.
+  /// Returns the DER encoded serial number for the X.509 certificate. The value
+  /// possibly includes a leading 00 byte.
   ///
   struct _cef_binary_value_t*(CEF_CALLBACK* get_serial_number)(
       struct _cef_x509certificate_t* self);
 
   ///
-  // Returns the date before which the X.509 certificate is invalid.
-  // CefTime.GetTimeT() will return 0 if no date was specified.
+  /// Returns the date before which the X.509 certificate is invalid.
+  /// CefBaseTime.GetTimeT() will return 0 if no date was specified.
   ///
-  cef_time_t(CEF_CALLBACK* get_valid_start)(
+  cef_basetime_t(CEF_CALLBACK* get_valid_start)(
       struct _cef_x509certificate_t* self);
 
   ///
-  // Returns the date after which the X.509 certificate is invalid.
-  // CefTime.GetTimeT() will return 0 if no date was specified.
+  /// Returns the date after which the X.509 certificate is invalid.
+  /// CefBaseTime.GetTimeT() will return 0 if no date was specified.
   ///
-  cef_time_t(CEF_CALLBACK* get_valid_expiry)(
+  cef_basetime_t(CEF_CALLBACK* get_valid_expiry)(
       struct _cef_x509certificate_t* self);
 
   ///
-  // Returns the DER encoded data for the X.509 certificate.
+  /// Returns the DER encoded data for the X.509 certificate.
   ///
   struct _cef_binary_value_t*(CEF_CALLBACK* get_derencoded)(
       struct _cef_x509certificate_t* self);
 
   ///
-  // Returns the PEM encoded data for the X.509 certificate.
+  /// Returns the PEM encoded data for the X.509 certificate.
   ///
   struct _cef_binary_value_t*(CEF_CALLBACK* get_pemencoded)(
       struct _cef_x509certificate_t* self);
 
   ///
-  // Returns the number of certificates in the issuer chain. If 0, the
-  // certificate is self-signed.
+  /// Returns the number of certificates in the issuer chain. If 0, the
+  /// certificate is self-signed.
   ///
   size_t(CEF_CALLBACK* get_issuer_chain_size)(
       struct _cef_x509certificate_t* self);
 
   ///
-  // Returns the DER encoded data for the certificate issuer chain. If we failed
-  // to encode a certificate in the chain it is still present in the array but
-  // is an NULL string.
+  /// Returns the DER encoded data for the certificate issuer chain. If we
+  /// failed to encode a certificate in the chain it is still present in the
+  /// array but is an NULL string.
   ///
   void(CEF_CALLBACK* get_derencoded_issuer_chain)(
       struct _cef_x509certificate_t* self,
@@ -196,9 +182,9 @@
       struct _cef_binary_value_t** chain);
 
   ///
-  // Returns the PEM encoded data for the certificate issuer chain. If we failed
-  // to encode a certificate in the chain it is still present in the array but
-  // is an NULL string.
+  /// Returns the PEM encoded data for the certificate issuer chain. If we
+  /// failed to encode a certificate in the chain it is still present in the
+  /// array but is an NULL string.
   ///
   void(CEF_CALLBACK* get_pemencoded_issuer_chain)(
       struct _cef_x509certificate_t* self,
diff --git a/src/include/capi/cef_xml_reader_capi.h b/src/include/capi/cef_xml_reader_capi.h
index 84a4554..3db9b94 100644
--- a/src/include/capi/cef_xml_reader_capi.h
+++ b/src/include/capi/cef_xml_reader_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=64f6b6477ec81b1d64517cf0af2e3b2121ff39bd$
+// $hash=366f872b03f7c25ef56677cc427a317bb529ad9c$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_XML_READER_CAPI_H_
@@ -48,132 +48,129 @@
 #endif
 
 ///
-// Structure that supports the reading of XML data via the libxml streaming API.
-// The functions of this structure should only be called on the thread that
-// creates the object.
+/// Structure that supports the reading of XML data via the libxml streaming
+/// API. The functions of this structure should only be called on the thread
+/// that creates the object.
 ///
 typedef struct _cef_xml_reader_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Moves the cursor to the next node in the document. This function must be
-  // called at least once to set the current cursor position. Returns true (1)
-  // if the cursor position was set successfully.
+  /// Moves the cursor to the next node in the document. This function must be
+  /// called at least once to set the current cursor position. Returns true (1)
+  /// if the cursor position was set successfully.
   ///
   int(CEF_CALLBACK* move_to_next_node)(struct _cef_xml_reader_t* self);
 
   ///
-  // Close the document. This should be called directly to ensure that cleanup
-  // occurs on the correct thread.
+  /// Close the document. This should be called directly to ensure that cleanup
+  /// occurs on the correct thread.
   ///
   int(CEF_CALLBACK* close)(struct _cef_xml_reader_t* self);
 
   ///
-  // Returns true (1) if an error has been reported by the XML parser.
+  /// Returns true (1) if an error has been reported by the XML parser.
   ///
   int(CEF_CALLBACK* has_error)(struct _cef_xml_reader_t* self);
 
   ///
-  // Returns the error string.
+  /// Returns the error string.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_error)(
       struct _cef_xml_reader_t* self);
 
-  // The below functions retrieve data for the node at the current cursor
-  // position.
-
   ///
-  // Returns the node type.
+  /// Returns the node type.
   ///
   cef_xml_node_type_t(CEF_CALLBACK* get_type)(struct _cef_xml_reader_t* self);
 
   ///
-  // Returns the node depth. Depth starts at 0 for the root node.
+  /// Returns the node depth. Depth starts at 0 for the root node.
   ///
   int(CEF_CALLBACK* get_depth)(struct _cef_xml_reader_t* self);
 
   ///
-  // Returns the local name. See http://www.w3.org/TR/REC-xml-names/#NT-
-  // LocalPart for additional details.
+  /// Returns the local name. See http://www.w3.org/TR/REC-xml-names/#NT-
+  /// LocalPart for additional details.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_local_name)(
       struct _cef_xml_reader_t* self);
 
   ///
-  // Returns the namespace prefix. See http://www.w3.org/TR/REC-xml-names/ for
-  // additional details.
+  /// Returns the namespace prefix. See http://www.w3.org/TR/REC-xml-names/ for
+  /// additional details.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_prefix)(
       struct _cef_xml_reader_t* self);
 
   ///
-  // Returns the qualified name, equal to (Prefix:)LocalName. See
-  // http://www.w3.org/TR/REC-xml-names/#ns-qualnames for additional details.
+  /// Returns the qualified name, equal to (Prefix:)LocalName. See
+  /// http://www.w3.org/TR/REC-xml-names/#ns-qualnames for additional details.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_qualified_name)(
       struct _cef_xml_reader_t* self);
 
   ///
-  // Returns the URI defining the namespace associated with the node. See
-  // http://www.w3.org/TR/REC-xml-names/ for additional details.
+  /// Returns the URI defining the namespace associated with the node. See
+  /// http://www.w3.org/TR/REC-xml-names/ for additional details.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_namespace_uri)(
       struct _cef_xml_reader_t* self);
 
   ///
-  // Returns the base URI of the node. See http://www.w3.org/TR/xmlbase/ for
-  // additional details.
+  /// Returns the base URI of the node. See http://www.w3.org/TR/xmlbase/ for
+  /// additional details.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_base_uri)(
       struct _cef_xml_reader_t* self);
 
   ///
-  // Returns the xml:lang scope within which the node resides. See
-  // http://www.w3.org/TR/REC-xml/#sec-lang-tag for additional details.
+  /// Returns the xml:lang scope within which the node resides. See
+  /// http://www.w3.org/TR/REC-xml/#sec-lang-tag for additional details.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_xml_lang)(
       struct _cef_xml_reader_t* self);
 
   ///
-  // Returns true (1) if the node represents an NULL element. <a/> is considered
-  // NULL but <a></a> is not.
+  /// Returns true (1) if the node represents an NULL element. "<a/>" is
+  /// considered NULL but "<a></a>" is not.
   ///
   int(CEF_CALLBACK* is_empty_element)(struct _cef_xml_reader_t* self);
 
   ///
-  // Returns true (1) if the node has a text value.
+  /// Returns true (1) if the node has a text value.
   ///
   int(CEF_CALLBACK* has_value)(struct _cef_xml_reader_t* self);
 
   ///
-  // Returns the text value.
+  /// Returns the text value.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_value)(
       struct _cef_xml_reader_t* self);
 
   ///
-  // Returns true (1) if the node has attributes.
+  /// Returns true (1) if the node has attributes.
   ///
   int(CEF_CALLBACK* has_attributes)(struct _cef_xml_reader_t* self);
 
   ///
-  // Returns the number of attributes.
+  /// Returns the number of attributes.
   ///
   size_t(CEF_CALLBACK* get_attribute_count)(struct _cef_xml_reader_t* self);
 
   ///
-  // Returns the value of the attribute at the specified 0-based index.
+  /// Returns the value of the attribute at the specified 0-based index.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_attribute_byindex)(
@@ -181,7 +178,7 @@
       int index);
 
   ///
-  // Returns the value of the attribute with the specified qualified name.
+  /// Returns the value of the attribute with the specified qualified name.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_attribute_byqname)(
@@ -189,8 +186,8 @@
       const cef_string_t* qualifiedName);
 
   ///
-  // Returns the value of the attribute with the specified local name and
-  // namespace URI.
+  /// Returns the value of the attribute with the specified local name and
+  /// namespace URI.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_attribute_bylname)(
@@ -199,48 +196,43 @@
       const cef_string_t* namespaceURI);
 
   ///
-  // Returns an XML representation of the current node's children.
+  /// Returns an XML representation of the current node's children.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_inner_xml)(
       struct _cef_xml_reader_t* self);
 
   ///
-  // Returns an XML representation of the current node including its children.
+  /// Returns an XML representation of the current node including its children.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_outer_xml)(
       struct _cef_xml_reader_t* self);
 
   ///
-  // Returns the line number for the current node.
+  /// Returns the line number for the current node.
   ///
   int(CEF_CALLBACK* get_line_number)(struct _cef_xml_reader_t* self);
 
-  // Attribute nodes are not traversed by default. The below functions can be
-  // used to move the cursor to an attribute node. move_to_carrying_element()
-  // can be called afterwards to return the cursor to the carrying element. The
-  // depth of an attribute node will be 1 + the depth of the carrying element.
-
   ///
-  // Moves the cursor to the attribute at the specified 0-based index. Returns
-  // true (1) if the cursor position was set successfully.
+  /// Moves the cursor to the attribute at the specified 0-based index. Returns
+  /// true (1) if the cursor position was set successfully.
   ///
   int(CEF_CALLBACK* move_to_attribute_byindex)(struct _cef_xml_reader_t* self,
                                                int index);
 
   ///
-  // Moves the cursor to the attribute with the specified qualified name.
-  // Returns true (1) if the cursor position was set successfully.
+  /// Moves the cursor to the attribute with the specified qualified name.
+  /// Returns true (1) if the cursor position was set successfully.
   ///
   int(CEF_CALLBACK* move_to_attribute_byqname)(
       struct _cef_xml_reader_t* self,
       const cef_string_t* qualifiedName);
 
   ///
-  // Moves the cursor to the attribute with the specified local name and
-  // namespace URI. Returns true (1) if the cursor position was set
-  // successfully.
+  /// Moves the cursor to the attribute with the specified local name and
+  /// namespace URI. Returns true (1) if the cursor position was set
+  /// successfully.
   ///
   int(CEF_CALLBACK* move_to_attribute_bylname)(
       struct _cef_xml_reader_t* self,
@@ -248,27 +240,27 @@
       const cef_string_t* namespaceURI);
 
   ///
-  // Moves the cursor to the first attribute in the current element. Returns
-  // true (1) if the cursor position was set successfully.
+  /// Moves the cursor to the first attribute in the current element. Returns
+  /// true (1) if the cursor position was set successfully.
   ///
   int(CEF_CALLBACK* move_to_first_attribute)(struct _cef_xml_reader_t* self);
 
   ///
-  // Moves the cursor to the next attribute in the current element. Returns true
-  // (1) if the cursor position was set successfully.
+  /// Moves the cursor to the next attribute in the current element. Returns
+  /// true (1) if the cursor position was set successfully.
   ///
   int(CEF_CALLBACK* move_to_next_attribute)(struct _cef_xml_reader_t* self);
 
   ///
-  // Moves the cursor back to the carrying element. Returns true (1) if the
-  // cursor position was set successfully.
+  /// Moves the cursor back to the carrying element. Returns true (1) if the
+  /// cursor position was set successfully.
   ///
   int(CEF_CALLBACK* move_to_carrying_element)(struct _cef_xml_reader_t* self);
 } cef_xml_reader_t;
 
 ///
-// Create a new cef_xml_reader_t object. The returned object's functions can
-// only be called from the thread that created the object.
+/// Create a new cef_xml_reader_t object. The returned object's functions can
+/// only be called from the thread that created the object.
 ///
 CEF_EXPORT cef_xml_reader_t* cef_xml_reader_create(
     struct _cef_stream_reader_t* stream,
diff --git a/src/include/capi/cef_zip_reader_capi.h b/src/include/capi/cef_zip_reader_capi.h
index 8138559..e5a2a7d 100644
--- a/src/include/capi/cef_zip_reader_capi.h
+++ b/src/include/capi/cef_zip_reader_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=f8b7ec1654c7d62153e2670b52ed18eb4c9c58d5$
+// $hash=d082d724164cb0b1da12d49b080c599934f08b9d$
 //
 
 #ifndef CEF_INCLUDE_CAPI_CEF_ZIP_READER_CAPI_H_
@@ -48,97 +48,95 @@
 #endif
 
 ///
-// Structure that supports the reading of zip archives via the zlib unzip API.
-// The functions of this structure should only be called on the thread that
-// creates the object.
+/// Structure that supports the reading of zip archives via the zlib unzip API.
+/// The functions of this structure should only be called on the thread that
+/// creates the object.
 ///
 typedef struct _cef_zip_reader_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Moves the cursor to the first file in the archive. Returns true (1) if the
-  // cursor position was set successfully.
+  /// Moves the cursor to the first file in the archive. Returns true (1) if the
+  /// cursor position was set successfully.
   ///
   int(CEF_CALLBACK* move_to_first_file)(struct _cef_zip_reader_t* self);
 
   ///
-  // Moves the cursor to the next file in the archive. Returns true (1) if the
-  // cursor position was set successfully.
+  /// Moves the cursor to the next file in the archive. Returns true (1) if the
+  /// cursor position was set successfully.
   ///
   int(CEF_CALLBACK* move_to_next_file)(struct _cef_zip_reader_t* self);
 
   ///
-  // Moves the cursor to the specified file in the archive. If |caseSensitive|
-  // is true (1) then the search will be case sensitive. Returns true (1) if the
-  // cursor position was set successfully.
+  /// Moves the cursor to the specified file in the archive. If |caseSensitive|
+  /// is true (1) then the search will be case sensitive. Returns true (1) if
+  /// the cursor position was set successfully.
   ///
   int(CEF_CALLBACK* move_to_file)(struct _cef_zip_reader_t* self,
                                   const cef_string_t* fileName,
                                   int caseSensitive);
 
   ///
-  // Closes the archive. This should be called directly to ensure that cleanup
-  // occurs on the correct thread.
+  /// Closes the archive. This should be called directly to ensure that cleanup
+  /// occurs on the correct thread.
   ///
   int(CEF_CALLBACK* close)(struct _cef_zip_reader_t* self);
 
-  // The below functions act on the file at the current cursor position.
-
   ///
-  // Returns the name of the file.
+  /// Returns the name of the file.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_file_name)(
       struct _cef_zip_reader_t* self);
 
   ///
-  // Returns the uncompressed size of the file.
+  /// Returns the uncompressed size of the file.
   ///
-  int64(CEF_CALLBACK* get_file_size)(struct _cef_zip_reader_t* self);
+  int64_t(CEF_CALLBACK* get_file_size)(struct _cef_zip_reader_t* self);
 
   ///
-  // Returns the last modified timestamp for the file.
+  /// Returns the last modified timestamp for the file.
   ///
-  cef_time_t(CEF_CALLBACK* get_file_last_modified)(
+  cef_basetime_t(CEF_CALLBACK* get_file_last_modified)(
       struct _cef_zip_reader_t* self);
 
   ///
-  // Opens the file for reading of uncompressed data. A read password may
-  // optionally be specified.
+  /// Opens the file for reading of uncompressed data. A read password may
+  /// optionally be specified.
   ///
   int(CEF_CALLBACK* open_file)(struct _cef_zip_reader_t* self,
                                const cef_string_t* password);
 
   ///
-  // Closes the file.
+  /// Closes the file.
   ///
   int(CEF_CALLBACK* close_file)(struct _cef_zip_reader_t* self);
 
   ///
-  // Read uncompressed file contents into the specified buffer. Returns < 0 if
-  // an error occurred, 0 if at the end of file, or the number of bytes read.
+  /// Read uncompressed file contents into the specified buffer. Returns < 0 if
+  /// an error occurred, 0 if at the end of file, or the number of bytes read.
   ///
   int(CEF_CALLBACK* read_file)(struct _cef_zip_reader_t* self,
                                void* buffer,
                                size_t bufferSize);
 
   ///
-  // Returns the current offset in the uncompressed file contents.
+  /// Returns the current offset in the uncompressed file contents.
   ///
-  int64(CEF_CALLBACK* tell)(struct _cef_zip_reader_t* self);
+  int64_t(CEF_CALLBACK* tell)(struct _cef_zip_reader_t* self);
 
   ///
-  // Returns true (1) if at end of the file contents.
+  /// Returns true (1) if at end of the file contents.
   ///
   int(CEF_CALLBACK* eof)(struct _cef_zip_reader_t* self);
 } cef_zip_reader_t;
 
 ///
-// Create a new cef_zip_reader_t object. The returned object's functions can
-// only be called from the thread that created the object.
+/// Create a new cef_zip_reader_t object. The returned object's functions can
+/// only be called from the thread that created the object.
 ///
 CEF_EXPORT cef_zip_reader_t* cef_zip_reader_create(
     struct _cef_stream_reader_t* stream);
diff --git a/src/include/capi/test/cef_test_helpers_capi.h b/src/include/capi/test/cef_test_helpers_capi.h
index 51d808c..c24bcf5 100644
--- a/src/include/capi/test/cef_test_helpers_capi.h
+++ b/src/include/capi/test/cef_test_helpers_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=44811580a3bddb5efed7d697ef8fa0b7e0925ef2$
+// $hash=4d10dad2278e6d61367b3deaf501a0e7b4fd60e9$
 //
 
 #ifndef CEF_INCLUDE_CAPI_TEST_CEF_TEST_HELPERS_CAPI_H_
@@ -52,13 +52,21 @@
 #endif
 
 ///
-// Execute JavaScript with a user gesture to trigger functionality like
-// onbeforeunload handlers that will otherwise be blocked.
+/// Execute JavaScript with a user gesture to trigger functionality like
+/// onbeforeunload handlers that will otherwise be blocked.
 ///
 CEF_EXPORT void cef_execute_java_script_with_user_gesture_for_tests(
     struct _cef_frame_t* frame,
     const cef_string_t* javascript);
 
+///
+/// Set the DIR_SRC_TEST_DATA_ROOT directory used to load test data. Must be
+/// configured when running from a CEF binary distribution. Defaults to the
+/// "chromium/src" directory when running from a local CEF/Chromium build. |dir|
+/// must be an absolute path.
+///
+CEF_EXPORT void cef_set_data_directory_for_tests(const cef_string_t* dir);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/include/capi/test/cef_test_server_capi.h b/src/include/capi/test/cef_test_server_capi.h
new file mode 100644
index 0000000..1741922
--- /dev/null
+++ b/src/include/capi/test/cef_test_server_capi.h
@@ -0,0 +1,197 @@
+// Copyright (c) 2023 Marshall A. Greenblatt. 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 file was generated by the CEF translator tool and should not edited
+// by hand. See the translator.README.txt file in the tools directory for
+// more information.
+//
+// $hash=f5731d0fffb953f1269b63b478a89bb6b842ac94$
+//
+
+#ifndef CEF_INCLUDE_CAPI_TEST_CEF_TEST_SERVER_CAPI_H_
+#define CEF_INCLUDE_CAPI_TEST_CEF_TEST_SERVER_CAPI_H_
+#pragma once
+
+#if !defined(BUILDING_CEF_SHARED) && !defined(WRAPPING_CEF_SHARED) && \
+    !defined(UNIT_TEST)
+#error This file can be included for unit tests only
+#endif
+
+#include "include/capi/cef_base_capi.h"
+#include "include/capi/cef_request_capi.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct _cef_test_server_connection_t;
+struct _cef_test_server_handler_t;
+
+///
+/// Structure representing an embedded test server that supports HTTP/HTTPS
+/// requests. This is a basic server providing only an essential subset of the
+/// HTTP/1.1 protocol. Especially, it assumes that the request syntax is
+/// correct. It *does not* support a Chunked Transfer Encoding. Server capacity
+/// is limited and is intended to handle only a small number of simultaneous
+/// connections (e.g. for communicating between applications on localhost). The
+/// functions of this structure are safe to call from any thread in the brower
+/// process unless otherwise indicated.
+///
+typedef struct _cef_test_server_t {
+  ///
+  /// Base structure.
+  ///
+  cef_base_ref_counted_t base;
+
+  ///
+  /// Stop the server and shut down the dedicated server thread. This function
+  /// must be called on the same thread as CreateAndStart. It will block until
+  /// the dedicated server thread has shut down.
+  ///
+  void(CEF_CALLBACK* stop)(struct _cef_test_server_t* self);
+
+  ///
+  /// Returns the server origin including the port number (e.g.
+  /// "[http|https]://127.0.0.1:<port>".
+  ///
+  // The resulting string must be freed by calling cef_string_userfree_free().
+  cef_string_userfree_t(CEF_CALLBACK* get_origin)(
+      struct _cef_test_server_t* self);
+} cef_test_server_t;
+
+///
+/// Create and start a new test server that binds to |port|. If |port| is 0 an
+/// available port number will be selected. If |https_server| is true (1) the
+/// server will be HTTPS, otherwise it will be HTTP. When |https_server| is true
+/// (1) the |https_cert_type| value is used to configure the certificate type.
+/// Returns the newly created server object on success, or nullptr if the server
+/// cannot be started.
+///
+/// A new thread will be created for each CreateAndStart call (the "dedicated
+/// server thread"). It is therefore recommended to use a different
+/// cef_test_server_handler_t instance for each CreateAndStart call to avoid
+/// thread safety issues in the cef_test_server_handler_t implementation.
+///
+/// On success, this function will block until the dedicated server thread has
+/// started. The server will continue running until Stop is called.
+///
+CEF_EXPORT cef_test_server_t* cef_test_server_create_and_start(
+    uint16_t port,
+    int https_server,
+    cef_test_cert_type_t https_cert_type,
+    struct _cef_test_server_handler_t* handler);
+
+///
+/// Implement this structure to handle test server requests. A new thread will
+/// be created for each cef_test_server_t::CreateAndStart call (the "dedicated
+/// server thread"), and the functions of this structure will be called on that
+/// thread. See related documentation on cef_test_server_t::CreateAndStart.
+///
+typedef struct _cef_test_server_handler_t {
+  ///
+  /// Base structure.
+  ///
+  cef_base_ref_counted_t base;
+
+  ///
+  /// Called when |server| receives a request. To handle the request return true
+  /// (1) and use |connection| to send the response either synchronously or
+  /// asynchronously. Otherwise, return false (0) if the request is unhandled.
+  /// When returning false (0) do not call any |connection| functions.
+  ///
+  int(CEF_CALLBACK* on_test_server_request)(
+      struct _cef_test_server_handler_t* self,
+      struct _cef_test_server_t* server,
+      struct _cef_request_t* request,
+      struct _cef_test_server_connection_t* connection);
+} cef_test_server_handler_t;
+
+///
+/// Structure representing a test server connection. The functions of this
+/// structure are safe to call from any thread in the brower process unless
+/// otherwise indicated.
+///
+typedef struct _cef_test_server_connection_t {
+  ///
+  /// Base structure.
+  ///
+  cef_base_ref_counted_t base;
+
+  ///
+  /// Send an HTTP 200 "OK" response. |content_type| is the response content
+  /// type (e.g. "text/html"). |data| is the response content and |data_size| is
+  /// the size of |data| in bytes. The contents of |data| will be copied. The
+  /// connection will be closed automatically after the response is sent.
+  ///
+  void(CEF_CALLBACK* send_http200response)(
+      struct _cef_test_server_connection_t* self,
+      const cef_string_t* content_type,
+      const void* data,
+      size_t data_size);
+
+  ///
+  /// Send an HTTP 404 "Not Found" response. The connection will be closed
+  /// automatically after the response is sent.
+  ///
+  void(CEF_CALLBACK* send_http404response)(
+      struct _cef_test_server_connection_t* self);
+
+  ///
+  /// Send an HTTP 500 "Internal Server Error" response. |error_message| is the
+  /// associated error message. The connection will be closed automatically
+  /// after the response is sent.
+  ///
+  void(CEF_CALLBACK* send_http500response)(
+      struct _cef_test_server_connection_t* self,
+      const cef_string_t* error_message);
+
+  ///
+  /// Send a custom HTTP response. |response_code| is the HTTP response code
+  /// sent in the status line (e.g. 200). |content_type| is the response content
+  /// type (e.g. "text/html"). |data| is the response content and |data_size| is
+  /// the size of |data| in bytes. The contents of |data| will be copied.
+  /// |extra_headers| is an optional map of additional header key/value pairs.
+  /// The connection will be closed automatically after the response is sent.
+  ///
+  void(CEF_CALLBACK* send_http_response)(
+      struct _cef_test_server_connection_t* self,
+      int response_code,
+      const cef_string_t* content_type,
+      const void* data,
+      size_t data_size,
+      cef_string_multimap_t extra_headers);
+} cef_test_server_connection_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // CEF_INCLUDE_CAPI_TEST_CEF_TEST_SERVER_CAPI_H_
diff --git a/src/include/capi/test/cef_translator_test_capi.h b/src/include/capi/test/cef_translator_test_capi.h
index 42a9b6e..b1e87b0 100644
--- a/src/include/capi/test/cef_translator_test_capi.h
+++ b/src/include/capi/test/cef_translator_test_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=a5d8033127cf2d21f1cb0c87f76d2d59ec3eace0$
+// $hash=58809bc0a16010773cf11b5165e65b32ec4b4793$
 //
 
 #ifndef CEF_INCLUDE_CAPI_TEST_CEF_TRANSLATOR_TEST_CAPI_H_
@@ -61,214 +61,206 @@
 struct _cef_translator_test_scoped_library_t;
 
 ///
-// Structure for testing all of the possible data transfer types.
+/// Structure for testing all of the possible data transfer types.
 ///
 typedef struct _cef_translator_test_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
-  // PRIMITIVE VALUES
-
   ///
-  // Return a void value.
+  /// Return a void value.
   ///
   void(CEF_CALLBACK* get_void)(struct _cef_translator_test_t* self);
 
   ///
-  // Return a bool value.
+  /// Return a bool value.
   ///
   int(CEF_CALLBACK* get_bool)(struct _cef_translator_test_t* self);
 
   ///
-  // Return an int value.
+  /// Return an int value.
   ///
   int(CEF_CALLBACK* get_int)(struct _cef_translator_test_t* self);
 
   ///
-  // Return a double value.
+  /// Return a double value.
   ///
   double(CEF_CALLBACK* get_double)(struct _cef_translator_test_t* self);
 
   ///
-  // Return a long value.
+  /// Return a long value.
   ///
   long(CEF_CALLBACK* get_long)(struct _cef_translator_test_t* self);
 
   ///
-  // Return a size_t value.
+  /// Return a size_t value.
   ///
   size_t(CEF_CALLBACK* get_sizet)(struct _cef_translator_test_t* self);
 
   ///
-  // Set a void value.
+  /// Set a void value.
   ///
   int(CEF_CALLBACK* set_void)(struct _cef_translator_test_t* self);
 
   ///
-  // Set a bool value.
+  /// Set a bool value.
   ///
   int(CEF_CALLBACK* set_bool)(struct _cef_translator_test_t* self, int val);
 
   ///
-  // Set an int value.
+  /// Set an int value.
   ///
   int(CEF_CALLBACK* set_int)(struct _cef_translator_test_t* self, int val);
 
   ///
-  // Set a double value.
+  /// Set a double value.
   ///
   int(CEF_CALLBACK* set_double)(struct _cef_translator_test_t* self,
                                 double val);
 
   ///
-  // Set a long value.
+  /// Set a long value.
   ///
   int(CEF_CALLBACK* set_long)(struct _cef_translator_test_t* self, long val);
 
   ///
-  // Set a size_t value.
+  /// Set a size_t value.
   ///
   int(CEF_CALLBACK* set_sizet)(struct _cef_translator_test_t* self, size_t val);
 
   ///
-  // Set a int list value.
+  /// Set a int list value.
   ///
   int(CEF_CALLBACK* set_int_list)(struct _cef_translator_test_t* self,
                                   size_t valCount,
                                   int const* val);
 
   ///
-  // Return an int list value by out-param.
+  /// Return an int list value by out-param.
   ///
   int(CEF_CALLBACK* get_int_list_by_ref)(struct _cef_translator_test_t* self,
                                          size_t* valCount,
                                          int* val);
 
   ///
-  // Return the number of points that will be output above.
+  /// Return the number of points that will be output above.
   ///
   size_t(CEF_CALLBACK* get_int_list_size)(struct _cef_translator_test_t* self);
 
-  // STRING VALUES
-
   ///
-  // Return a string value.
+  /// Return a string value.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_string)(
       struct _cef_translator_test_t* self);
 
   ///
-  // Set a string value.
+  /// Set a string value.
   ///
   int(CEF_CALLBACK* set_string)(struct _cef_translator_test_t* self,
                                 const cef_string_t* val);
 
   ///
-  // Return a string value by out-param.
+  /// Return a string value by out-param.
   ///
   void(CEF_CALLBACK* get_string_by_ref)(struct _cef_translator_test_t* self,
                                         cef_string_t* val);
 
   ///
-  // Set a string list value.
+  /// Set a string list value.
   ///
   int(CEF_CALLBACK* set_string_list)(struct _cef_translator_test_t* self,
                                      cef_string_list_t val);
 
   ///
-  // Return a string list value by out-param.
+  /// Return a string list value by out-param.
   ///
   int(CEF_CALLBACK* get_string_list_by_ref)(struct _cef_translator_test_t* self,
                                             cef_string_list_t val);
 
   ///
-  // Set a string map value.
+  /// Set a string map value.
   ///
   int(CEF_CALLBACK* set_string_map)(struct _cef_translator_test_t* self,
                                     cef_string_map_t val);
 
   ///
-  // Return a string map value by out-param.
+  /// Return a string map value by out-param.
   ///
   int(CEF_CALLBACK* get_string_map_by_ref)(struct _cef_translator_test_t* self,
                                            cef_string_map_t val);
 
   ///
-  // Set a string multimap value.
+  /// Set a string multimap value.
   ///
   int(CEF_CALLBACK* set_string_multimap)(struct _cef_translator_test_t* self,
                                          cef_string_multimap_t val);
 
   ///
-  // Return a string multimap value by out-param.
+  /// Return a string multimap value by out-param.
   ///
   int(CEF_CALLBACK* get_string_multimap_by_ref)(
       struct _cef_translator_test_t* self,
       cef_string_multimap_t val);
 
-  // STRUCT VALUES
-
   ///
-  // Return a point value.
+  /// Return a point value.
   ///
   cef_point_t(CEF_CALLBACK* get_point)(struct _cef_translator_test_t* self);
 
   ///
-  // Set a point value.
+  /// Set a point value.
   ///
   int(CEF_CALLBACK* set_point)(struct _cef_translator_test_t* self,
                                const cef_point_t* val);
 
   ///
-  // Return a point value by out-param.
+  /// Return a point value by out-param.
   ///
   void(CEF_CALLBACK* get_point_by_ref)(struct _cef_translator_test_t* self,
                                        cef_point_t* val);
 
   ///
-  // Set a point list vlaue.
+  /// Set a point list vlaue.
   ///
   int(CEF_CALLBACK* set_point_list)(struct _cef_translator_test_t* self,
                                     size_t valCount,
                                     cef_point_t const* val);
 
   ///
-  // Return a point list value by out-param.
+  /// Return a point list value by out-param.
   ///
   int(CEF_CALLBACK* get_point_list_by_ref)(struct _cef_translator_test_t* self,
                                            size_t* valCount,
                                            cef_point_t* val);
 
   ///
-  // Return the number of points that will be output above.
+  /// Return the number of points that will be output above.
   ///
   size_t(CEF_CALLBACK* get_point_list_size)(
       struct _cef_translator_test_t* self);
 
-  // LIBRARY-SIDE REFPTR VALUES
-
   ///
-  // Return an new library-side object.
+  /// Return an new library-side object.
   ///
   struct _cef_translator_test_ref_ptr_library_t*(
       CEF_CALLBACK* get_ref_ptr_library)(struct _cef_translator_test_t* self,
                                          int val);
 
   ///
-  // Set an object. Returns the value from
-  // cef_translator_test_ref_ptr_library_t::get_value(). This tests input and
-  // execution of a library-side object type.
+  /// Set an object. Returns the value from
+  /// cef_translator_test_ref_ptr_library_t::get_value(). This tests input and
+  /// execution of a library-side object type.
   ///
   int(CEF_CALLBACK* set_ref_ptr_library)(
       struct _cef_translator_test_t* self,
       struct _cef_translator_test_ref_ptr_library_t* val);
 
   ///
-  // Set an object. Returns the object passed in. This tests input and output of
-  // a library-side object type.
+  /// Set an object. Returns the object passed in. This tests input and output
+  /// of a library-side object type.
   ///
   struct _cef_translator_test_ref_ptr_library_t*(
       CEF_CALLBACK* set_ref_ptr_library_and_return)(
@@ -276,17 +268,17 @@
       struct _cef_translator_test_ref_ptr_library_t* val);
 
   ///
-  // Set a child object. Returns the value from
-  // cef_translator_test_ref_ptr_library_t::get_value(). This tests input of a
-  // library- side child object type and execution as the parent type.
+  /// Set a child object. Returns the value from
+  /// cef_translator_test_ref_ptr_library_t::get_value(). This tests input of a
+  /// library- side child object type and execution as the parent type.
   ///
   int(CEF_CALLBACK* set_child_ref_ptr_library)(
       struct _cef_translator_test_t* self,
       struct _cef_translator_test_ref_ptr_library_child_t* val);
 
   ///
-  // Set a child object. Returns the object as the parent type. This tests input
-  // of a library-side child object type and return as the parent type.
+  /// Set a child object. Returns the object as the parent type. This tests
+  /// input of a library-side child object type and return as the parent type.
   ///
   struct _cef_translator_test_ref_ptr_library_t*(
       CEF_CALLBACK* set_child_ref_ptr_library_and_return_parent)(
@@ -294,7 +286,7 @@
       struct _cef_translator_test_ref_ptr_library_child_t* val);
 
   ///
-  // Set an object list vlaue.
+  /// Set an object list vlaue.
   ///
   int(CEF_CALLBACK* set_ref_ptr_library_list)(
       struct _cef_translator_test_t* self,
@@ -304,7 +296,7 @@
       int val2);
 
   ///
-  // Return an object list value by out-param.
+  /// Return an object list value by out-param.
   ///
   int(CEF_CALLBACK* get_ref_ptr_library_list_by_ref)(
       struct _cef_translator_test_t* self,
@@ -314,25 +306,23 @@
       int val2);
 
   ///
-  // Return the number of object that will be output above.
+  /// Return the number of object that will be output above.
   ///
   size_t(CEF_CALLBACK* get_ref_ptr_library_list_size)(
       struct _cef_translator_test_t* self);
 
-  // CLIENT-SIDE REFPTR VALUES
-
   ///
-  // Set an object. Returns the value from
-  // cef_translator_test_ref_ptr_client_t::get_value(). This tests input and
-  // execution of a client-side object type.
+  /// Set an object. Returns the value from
+  /// cef_translator_test_ref_ptr_client_t::get_value(). This tests input and
+  /// execution of a client-side object type.
   ///
   int(CEF_CALLBACK* set_ref_ptr_client)(
       struct _cef_translator_test_t* self,
       struct _cef_translator_test_ref_ptr_client_t* val);
 
   ///
-  // Set an object. Returns the handler passed in. This tests input and output
-  // of a client-side object type.
+  /// Set an object. Returns the handler passed in. This tests input and output
+  /// of a client-side object type.
   ///
   struct _cef_translator_test_ref_ptr_client_t*(
       CEF_CALLBACK* set_ref_ptr_client_and_return)(
@@ -340,17 +330,17 @@
       struct _cef_translator_test_ref_ptr_client_t* val);
 
   ///
-  // Set a child object. Returns the value from
-  // cef_translator_test_ref_ptr_client_t::get_value(). This tests input of a
-  // client- side child object type and execution as the parent type.
+  /// Set a child object. Returns the value from
+  /// cef_translator_test_ref_ptr_client_t::get_value(). This tests input of a
+  /// client- side child object type and execution as the parent type.
   ///
   int(CEF_CALLBACK* set_child_ref_ptr_client)(
       struct _cef_translator_test_t* self,
       struct _cef_translator_test_ref_ptr_client_child_t* val);
 
   ///
-  // Set a child object. Returns the object as the parent type. This tests input
-  // of a client-side child object type and return as the parent type.
+  /// Set a child object. Returns the object as the parent type. This tests
+  /// input of a client-side child object type and return as the parent type.
   ///
   struct _cef_translator_test_ref_ptr_client_t*(
       CEF_CALLBACK* set_child_ref_ptr_client_and_return_parent)(
@@ -358,7 +348,7 @@
       struct _cef_translator_test_ref_ptr_client_child_t* val);
 
   ///
-  // Set an object list vlaue.
+  /// Set an object list vlaue.
   ///
   int(CEF_CALLBACK* set_ref_ptr_client_list)(
       struct _cef_translator_test_t* self,
@@ -368,7 +358,7 @@
       int val2);
 
   ///
-  // Return an object list value by out-param.
+  /// Return an object list value by out-param.
   ///
   int(CEF_CALLBACK* get_ref_ptr_client_list_by_ref)(
       struct _cef_translator_test_t* self,
@@ -378,32 +368,30 @@
       struct _cef_translator_test_ref_ptr_client_t* val2);
 
   ///
-  // Return the number of object that will be output above.
+  /// Return the number of object that will be output above.
   ///
   size_t(CEF_CALLBACK* get_ref_ptr_client_list_size)(
       struct _cef_translator_test_t* self);
 
-  // LIBRARY-SIDE OWNPTR VALUES
-
   ///
-  // Return an new library-side object.
+  /// Return an new library-side object.
   ///
   struct _cef_translator_test_scoped_library_t*(
       CEF_CALLBACK* get_own_ptr_library)(struct _cef_translator_test_t* self,
                                          int val);
 
   ///
-  // Set an object. Returns the value from
-  // cef_translator_test_scoped_library_t::get_value(). This tests input and
-  // execution of a library-side object type.
+  /// Set an object. Returns the value from
+  /// cef_translator_test_scoped_library_t::get_value(). This tests input and
+  /// execution of a library-side object type.
   ///
   int(CEF_CALLBACK* set_own_ptr_library)(
       struct _cef_translator_test_t* self,
       struct _cef_translator_test_scoped_library_t* val);
 
   ///
-  // Set an object. Returns the object passed in. This tests input and output of
-  // a library-side object type.
+  /// Set an object. Returns the object passed in. This tests input and output
+  /// of a library-side object type.
   ///
   struct _cef_translator_test_scoped_library_t*(
       CEF_CALLBACK* set_own_ptr_library_and_return)(
@@ -411,37 +399,35 @@
       struct _cef_translator_test_scoped_library_t* val);
 
   ///
-  // Set a child object. Returns the value from
-  // cef_translator_test_scoped_library_t::get_value(). This tests input of a
-  // library- side child object type and execution as the parent type.
+  /// Set a child object. Returns the value from
+  /// cef_translator_test_scoped_library_t::get_value(). This tests input of a
+  /// library- side child object type and execution as the parent type.
   ///
   int(CEF_CALLBACK* set_child_own_ptr_library)(
       struct _cef_translator_test_t* self,
       struct _cef_translator_test_scoped_library_child_t* val);
 
   ///
-  // Set a child object. Returns the object as the parent type. This tests input
-  // of a library-side child object type and return as the parent type.
+  /// Set a child object. Returns the object as the parent type. This tests
+  /// input of a library-side child object type and return as the parent type.
   ///
   struct _cef_translator_test_scoped_library_t*(
       CEF_CALLBACK* set_child_own_ptr_library_and_return_parent)(
       struct _cef_translator_test_t* self,
       struct _cef_translator_test_scoped_library_child_t* val);
 
-  // CLIENT-SIDE OWNPTR VALUES
-
   ///
-  // Set an object. Returns the value from
-  // cef_translator_test_scoped_client_t::get_value(). This tests input and
-  // execution of a client-side object type.
+  /// Set an object. Returns the value from
+  /// cef_translator_test_scoped_client_t::get_value(). This tests input and
+  /// execution of a client-side object type.
   ///
   int(CEF_CALLBACK* set_own_ptr_client)(
       struct _cef_translator_test_t* self,
       struct _cef_translator_test_scoped_client_t* val);
 
   ///
-  // Set an object. Returns the handler passed in. This tests input and output
-  // of a client-side object type.
+  /// Set an object. Returns the handler passed in. This tests input and output
+  /// of a client-side object type.
   ///
   struct _cef_translator_test_scoped_client_t*(
       CEF_CALLBACK* set_own_ptr_client_and_return)(
@@ -449,45 +435,43 @@
       struct _cef_translator_test_scoped_client_t* val);
 
   ///
-  // Set a child object. Returns the value from
-  // cef_translator_test_scoped_client_t::get_value(). This tests input of a
-  // client- side child object type and execution as the parent type.
+  /// Set a child object. Returns the value from
+  /// cef_translator_test_scoped_client_t::get_value(). This tests input of a
+  /// client- side child object type and execution as the parent type.
   ///
   int(CEF_CALLBACK* set_child_own_ptr_client)(
       struct _cef_translator_test_t* self,
       struct _cef_translator_test_scoped_client_child_t* val);
 
   ///
-  // Set a child object. Returns the object as the parent type. This tests input
-  // of a client-side child object type and return as the parent type.
+  /// Set a child object. Returns the object as the parent type. This tests
+  /// input of a client-side child object type and return as the parent type.
   ///
   struct _cef_translator_test_scoped_client_t*(
       CEF_CALLBACK* set_child_own_ptr_client_and_return_parent)(
       struct _cef_translator_test_t* self,
       struct _cef_translator_test_scoped_client_child_t* val);
 
-  // LIBRARY-SIDE RAWPTR VALUES
-
   ///
-  // Set an object. Returns the value from
-  // cef_translator_test_scoped_library_t::get_value(). This tests input and
-  // execution of a library-side object type.
+  /// Set an object. Returns the value from
+  /// cef_translator_test_scoped_library_t::get_value(). This tests input and
+  /// execution of a library-side object type.
   ///
   int(CEF_CALLBACK* set_raw_ptr_library)(
       struct _cef_translator_test_t* self,
       struct _cef_translator_test_scoped_library_t* val);
 
   ///
-  // Set a child object. Returns the value from
-  // cef_translator_test_scoped_library_t::get_value(). This tests input of a
-  // library- side child object type and execution as the parent type.
+  /// Set a child object. Returns the value from
+  /// cef_translator_test_scoped_library_t::get_value(). This tests input of a
+  /// library- side child object type and execution as the parent type.
   ///
   int(CEF_CALLBACK* set_child_raw_ptr_library)(
       struct _cef_translator_test_t* self,
       struct _cef_translator_test_scoped_library_child_t* val);
 
   ///
-  // Set an object list vlaue.
+  /// Set an object list vlaue.
   ///
   int(CEF_CALLBACK* set_raw_ptr_library_list)(
       struct _cef_translator_test_t* self,
@@ -496,28 +480,26 @@
       int val1,
       int val2);
 
-  // CLIENT-SIDE RAWPTR VALUES
-
   ///
-  // Set an object. Returns the value from
-  // cef_translator_test_scoped_client_t::get_value(). This tests input and
-  // execution of a client-side object type.
+  /// Set an object. Returns the value from
+  /// cef_translator_test_scoped_client_t::get_value(). This tests input and
+  /// execution of a client-side object type.
   ///
   int(CEF_CALLBACK* set_raw_ptr_client)(
       struct _cef_translator_test_t* self,
       struct _cef_translator_test_scoped_client_t* val);
 
   ///
-  // Set a child object. Returns the value from
-  // cef_translator_test_scoped_client_t::get_value(). This tests input of a
-  // client- side child object type and execution as the parent type.
+  /// Set a child object. Returns the value from
+  /// cef_translator_test_scoped_client_t::get_value(). This tests input of a
+  /// client- side child object type and execution as the parent type.
   ///
   int(CEF_CALLBACK* set_child_raw_ptr_client)(
       struct _cef_translator_test_t* self,
       struct _cef_translator_test_scoped_client_child_t* val);
 
   ///
-  // Set an object list vlaue.
+  /// Set an object list vlaue.
   ///
   int(CEF_CALLBACK* set_raw_ptr_client_list)(
       struct _cef_translator_test_t* self,
@@ -528,27 +510,27 @@
 } cef_translator_test_t;
 
 ///
-// Create the test object.
+/// Create the test object.
 ///
-CEF_EXPORT cef_translator_test_t* cef_translator_test_create();
+CEF_EXPORT cef_translator_test_t* cef_translator_test_create(void);
 
 ///
-// Library-side test object for RefPtr.
+/// Library-side test object for RefPtr.
 ///
 typedef struct _cef_translator_test_ref_ptr_library_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Return a value.
+  /// Return a value.
   ///
   int(CEF_CALLBACK* get_value)(
       struct _cef_translator_test_ref_ptr_library_t* self);
 
   ///
-  // Set a value.
+  /// Set a value.
   ///
   void(CEF_CALLBACK* set_value)(
       struct _cef_translator_test_ref_ptr_library_t* self,
@@ -556,28 +538,28 @@
 } cef_translator_test_ref_ptr_library_t;
 
 ///
-// Create the test object.
+/// Create the test object.
 ///
 CEF_EXPORT cef_translator_test_ref_ptr_library_t*
 cef_translator_test_ref_ptr_library_create(int value);
 
 ///
-// Library-side child test object for RefPtr.
+/// Library-side child test object for RefPtr.
 ///
 typedef struct _cef_translator_test_ref_ptr_library_child_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_translator_test_ref_ptr_library_t base;
 
   ///
-  // Return a value.
+  /// Return a value.
   ///
   int(CEF_CALLBACK* get_other_value)(
       struct _cef_translator_test_ref_ptr_library_child_t* self);
 
   ///
-  // Set a value.
+  /// Set a value.
   ///
   void(CEF_CALLBACK* set_other_value)(
       struct _cef_translator_test_ref_ptr_library_child_t* self,
@@ -585,28 +567,28 @@
 } cef_translator_test_ref_ptr_library_child_t;
 
 ///
-// Create the test object.
+/// Create the test object.
 ///
 CEF_EXPORT cef_translator_test_ref_ptr_library_child_t*
 cef_translator_test_ref_ptr_library_child_create(int value, int other_value);
 
 ///
-// Another library-side child test object for RefPtr.
+/// Another library-side child test object for RefPtr.
 ///
 typedef struct _cef_translator_test_ref_ptr_library_child_child_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_translator_test_ref_ptr_library_child_t base;
 
   ///
-  // Return a value.
+  /// Return a value.
   ///
   int(CEF_CALLBACK* get_other_other_value)(
       struct _cef_translator_test_ref_ptr_library_child_child_t* self);
 
   ///
-  // Set a value.
+  /// Set a value.
   ///
   void(CEF_CALLBACK* set_other_other_value)(
       struct _cef_translator_test_ref_ptr_library_child_child_t* self,
@@ -614,7 +596,7 @@
 } cef_translator_test_ref_ptr_library_child_child_t;
 
 ///
-// Create the test object.
+/// Create the test object.
 ///
 CEF_EXPORT cef_translator_test_ref_ptr_library_child_child_t*
 cef_translator_test_ref_ptr_library_child_child_create(int value,
@@ -622,54 +604,54 @@
                                                        int other_other_value);
 
 ///
-// Client-side test object for RefPtr.
+/// Client-side test object for RefPtr.
 ///
 typedef struct _cef_translator_test_ref_ptr_client_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Return a value.
+  /// Return a value.
   ///
   int(CEF_CALLBACK* get_value)(
       struct _cef_translator_test_ref_ptr_client_t* self);
 } cef_translator_test_ref_ptr_client_t;
 
 ///
-// Client-side child test object for RefPtr.
+/// Client-side child test object for RefPtr.
 ///
 typedef struct _cef_translator_test_ref_ptr_client_child_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_translator_test_ref_ptr_client_t base;
 
   ///
-  // Return a value.
+  /// Return a value.
   ///
   int(CEF_CALLBACK* get_other_value)(
       struct _cef_translator_test_ref_ptr_client_child_t* self);
 } cef_translator_test_ref_ptr_client_child_t;
 
 ///
-// Library-side test object for OwnPtr/RawPtr.
+/// Library-side test object for OwnPtr/RawPtr.
 ///
 typedef struct _cef_translator_test_scoped_library_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_scoped_t base;
 
   ///
-  // Return a value.
+  /// Return a value.
   ///
   int(CEF_CALLBACK* get_value)(
       struct _cef_translator_test_scoped_library_t* self);
 
   ///
-  // Set a value.
+  /// Set a value.
   ///
   void(CEF_CALLBACK* set_value)(
       struct _cef_translator_test_scoped_library_t* self,
@@ -677,28 +659,28 @@
 } cef_translator_test_scoped_library_t;
 
 ///
-// Create the test object.
+/// Create the test object.
 ///
 CEF_EXPORT cef_translator_test_scoped_library_t*
 cef_translator_test_scoped_library_create(int value);
 
 ///
-// Library-side child test object for OwnPtr/RawPtr.
+/// Library-side child test object for OwnPtr/RawPtr.
 ///
 typedef struct _cef_translator_test_scoped_library_child_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_translator_test_scoped_library_t base;
 
   ///
-  // Return a value.
+  /// Return a value.
   ///
   int(CEF_CALLBACK* get_other_value)(
       struct _cef_translator_test_scoped_library_child_t* self);
 
   ///
-  // Set a value.
+  /// Set a value.
   ///
   void(CEF_CALLBACK* set_other_value)(
       struct _cef_translator_test_scoped_library_child_t* self,
@@ -706,28 +688,28 @@
 } cef_translator_test_scoped_library_child_t;
 
 ///
-// Create the test object.
+/// Create the test object.
 ///
 CEF_EXPORT cef_translator_test_scoped_library_child_t*
 cef_translator_test_scoped_library_child_create(int value, int other_value);
 
 ///
-// Another library-side child test object for OwnPtr/RawPtr.
+/// Another library-side child test object for OwnPtr/RawPtr.
 ///
 typedef struct _cef_translator_test_scoped_library_child_child_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_translator_test_scoped_library_child_t base;
 
   ///
-  // Return a value.
+  /// Return a value.
   ///
   int(CEF_CALLBACK* get_other_other_value)(
       struct _cef_translator_test_scoped_library_child_child_t* self);
 
   ///
-  // Set a value.
+  /// Set a value.
   ///
   void(CEF_CALLBACK* set_other_other_value)(
       struct _cef_translator_test_scoped_library_child_child_t* self,
@@ -735,7 +717,7 @@
 } cef_translator_test_scoped_library_child_child_t;
 
 ///
-// Create the test object.
+/// Create the test object.
 ///
 CEF_EXPORT cef_translator_test_scoped_library_child_child_t*
 cef_translator_test_scoped_library_child_child_create(int value,
@@ -743,32 +725,32 @@
                                                       int other_other_value);
 
 ///
-// Client-side test object for OwnPtr/RawPtr.
+/// Client-side test object for OwnPtr/RawPtr.
 ///
 typedef struct _cef_translator_test_scoped_client_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_scoped_t base;
 
   ///
-  // Return a value.
+  /// Return a value.
   ///
   int(CEF_CALLBACK* get_value)(
       struct _cef_translator_test_scoped_client_t* self);
 } cef_translator_test_scoped_client_t;
 
 ///
-// Client-side child test object for OwnPtr/RawPtr.
+/// Client-side child test object for OwnPtr/RawPtr.
 ///
 typedef struct _cef_translator_test_scoped_client_child_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_translator_test_scoped_client_t base;
 
   ///
-  // Return a value.
+  /// Return a value.
   ///
   int(CEF_CALLBACK* get_other_value)(
       struct _cef_translator_test_scoped_client_child_t* self);
diff --git a/src/include/capi/views/cef_box_layout_capi.h b/src/include/capi/views/cef_box_layout_capi.h
index 8328d67..f053f01 100644
--- a/src/include/capi/views/cef_box_layout_capi.h
+++ b/src/include/capi/views/cef_box_layout_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=ddf96505520b7f8df0662d9f66221917a665b029$
+// $hash=31153d0702b646d310e74f04e256c0f5915b8caa$
 //
 
 #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_BOX_LAYOUT_CAPI_H_
@@ -49,33 +49,33 @@
 struct _cef_view_t;
 
 ///
-// A Layout manager that arranges child views vertically or horizontally in a
-// side-by-side fashion with spacing around and between the child views. The
-// child views are always sized according to their preferred size. If the host's
-// bounds provide insufficient space, child views will be clamped. Excess space
-// will not be distributed. Methods must be called on the browser process UI
-// thread unless otherwise indicated.
+/// A Layout manager that arranges child views vertically or horizontally in a
+/// side-by-side fashion with spacing around and between the child views. The
+/// child views are always sized according to their preferred size. If the
+/// host's bounds provide insufficient space, child views will be clamped.
+/// Excess space will not be distributed. Methods must be called on the browser
+/// process UI thread unless otherwise indicated.
 ///
 typedef struct _cef_box_layout_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_layout_t base;
 
   ///
-  // Set the flex weight for the given |view|. Using the preferred size as the
-  // basis, free space along the main axis is distributed to views in the ratio
-  // of their flex weights. Similarly, if the views will overflow the parent,
-  // space is subtracted in these ratios. A flex of 0 means this view is not
-  // resized. Flex values must not be negative.
+  /// Set the flex weight for the given |view|. Using the preferred size as the
+  /// basis, free space along the main axis is distributed to views in the ratio
+  /// of their flex weights. Similarly, if the views will overflow the parent,
+  /// space is subtracted in these ratios. A flex of 0 means this view is not
+  /// resized. Flex values must not be negative.
   ///
   void(CEF_CALLBACK* set_flex_for_view)(struct _cef_box_layout_t* self,
                                         struct _cef_view_t* view,
                                         int flex);
 
   ///
-  // Clears the flex for the given |view|, causing it to use the default flex
-  // specified via cef_box_layout_tSettings.default_flex.
+  /// Clears the flex for the given |view|, causing it to use the default flex
+  /// specified via cef_box_layout_tSettings.default_flex.
   ///
   void(CEF_CALLBACK* clear_flex_for_view)(struct _cef_box_layout_t* self,
                                           struct _cef_view_t* view);
diff --git a/src/include/capi/views/cef_browser_view_capi.h b/src/include/capi/views/cef_browser_view_capi.h
index f597c87..fbc8cbc 100644
--- a/src/include/capi/views/cef_browser_view_capi.h
+++ b/src/include/capi/views/cef_browser_view_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=3ac114f5bd9aa0e6d62e7540e9205adce485a09d$
+// $hash=bc80e7f1e467a4e0943dcbf7ea6d08366817d5ca$
 //
 
 #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_BROWSER_VIEW_CAPI_H_
@@ -49,41 +49,58 @@
 #endif
 
 ///
-// A View hosting a cef_browser_t instance. Methods must be called on the
-// browser process UI thread unless otherwise indicated.
+/// A View hosting a cef_browser_t instance. Methods must be called on the
+/// browser process UI thread unless otherwise indicated.
 ///
 typedef struct _cef_browser_view_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_view_t base;
 
   ///
-  // Returns the cef_browser_t hosted by this BrowserView. Will return NULL if
-  // the browser has not yet been created or has already been destroyed.
+  /// Returns the cef_browser_t hosted by this BrowserView. Will return NULL if
+  /// the browser has not yet been created or has already been destroyed.
   ///
   struct _cef_browser_t*(CEF_CALLBACK* get_browser)(
       struct _cef_browser_view_t* self);
 
   ///
-  // Sets whether accelerators registered with cef_window_t::SetAccelerator are
-  // triggered before or after the event is sent to the cef_browser_t. If
-  // |prefer_accelerators| is true (1) then the matching accelerator will be
-  // triggered immediately and the event will not be sent to the cef_browser_t.
-  // If |prefer_accelerators| is false (0) then the matching accelerator will
-  // only be triggered if the event is not handled by web content or by
-  // cef_keyboard_handler_t. The default value is false (0).
+  /// Returns the Chrome toolbar associated with this BrowserView. Only
+  /// supported when using the Chrome runtime. The cef_browser_view_delegate_t::
+  /// get_chrome_toolbar_type() function must return a value other than
+  /// CEF_CTT_NONE and the toolbar will not be available until after this
+  /// BrowserView is added to a cef_window_t and
+  /// cef_view_delegate_t::on_window_changed() has been called.
+  ///
+  struct _cef_view_t*(CEF_CALLBACK* get_chrome_toolbar)(
+      struct _cef_browser_view_t* self);
+
+  ///
+  /// Sets whether normal priority accelerators are first forwarded to the web
+  /// content (`keydown` event handler) or cef_keyboard_handler_t. Normal
+  /// priority accelerators can be registered via cef_window_t::SetAccelerator
+  /// (with |high_priority|=false (0)) or internally for standard accelerators
+  /// supported by the Chrome runtime. If |prefer_accelerators| is true (1) then
+  /// the matching accelerator will be triggered immediately (calling
+  /// cef_window_delegate_t::OnAccelerator or
+  /// cef_command_handler_t::OnChromeCommand respectively) and the event will
+  /// not be forwarded to the web content or cef_keyboard_handler_t first. If
+  /// |prefer_accelerators| is false (0) then the matching accelerator will only
+  /// be triggered if the event is not handled by web content (`keydown` event
+  /// handler that calls `event.preventDefault()`) or by cef_keyboard_handler_t.
+  /// The default value is false (0).
   ///
   void(CEF_CALLBACK* set_prefer_accelerators)(struct _cef_browser_view_t* self,
                                               int prefer_accelerators);
 } cef_browser_view_t;
 
 ///
-// Create a new BrowserView. The underlying cef_browser_t will not be created
-// until this view is added to the views hierarchy. The optional |extra_info|
-// parameter provides an opportunity to specify extra information specific to
-// the created browser that will be passed to
-// cef_render_process_handler_t::on_browser_created() in the render process.
+/// Create a new BrowserView. The underlying cef_browser_t will not be created
+/// until this view is added to the views hierarchy. The optional |extra_info|
+/// parameter provides an opportunity to specify extra information specific to
+/// the created browser that will be passed to
+/// cef_render_process_handler_t::on_browser_created() in the render process.
 ///
 CEF_EXPORT cef_browser_view_t* cef_browser_view_create(
     struct _cef_client_t* client,
@@ -94,7 +111,7 @@
     struct _cef_browser_view_delegate_t* delegate);
 
 ///
-// Returns the BrowserView associated with |browser|.
+/// Returns the BrowserView associated with |browser|.
 ///
 CEF_EXPORT cef_browser_view_t* cef_browser_view_get_for_browser(
     struct _cef_browser_t* browser);
diff --git a/src/include/capi/views/cef_browser_view_delegate_capi.h b/src/include/capi/views/cef_browser_view_delegate_capi.h
index d707169..5c24e3e 100644
--- a/src/include/capi/views/cef_browser_view_delegate_capi.h
+++ b/src/include/capi/views/cef_browser_view_delegate_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=f850005cb52b08b69b803fc020c77fc7f623839c$
+// $hash=9e8dd2187d592f7556cbee0db3ceab851f9aae13$
 //
 
 #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_BROWSER_VIEW_DELEGATE_CAPI_H_
@@ -51,21 +51,21 @@
 struct _cef_browser_view_t;
 
 ///
-// Implement this structure to handle BrowserView events. The functions of this
-// structure will be called on the browser process UI thread unless otherwise
-// indicated.
+/// Implement this structure to handle BrowserView events. The functions of this
+/// structure will be called on the browser process UI thread unless otherwise
+/// indicated.
 ///
 typedef struct _cef_browser_view_delegate_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_view_delegate_t base;
 
   ///
-  // Called when |browser| associated with |browser_view| is created. This
-  // function will be called after cef_life_span_handler_t::on_after_created()
-  // is called for |browser| and before on_popup_browser_view_created() is
-  // called for |browser|'s parent delegate if |browser| is a popup.
+  /// Called when |browser| associated with |browser_view| is created. This
+  /// function will be called after cef_life_span_handler_t::on_after_created()
+  /// is called for |browser| and before on_popup_browser_view_created() is
+  /// called for |browser|'s parent delegate if |browser| is a popup.
   ///
   void(CEF_CALLBACK* on_browser_created)(
       struct _cef_browser_view_delegate_t* self,
@@ -73,10 +73,10 @@
       struct _cef_browser_t* browser);
 
   ///
-  // Called when |browser| associated with |browser_view| is destroyed. Release
-  // all references to |browser| and do not attempt to execute any functions on
-  // |browser| after this callback returns. This function will be called before
-  // cef_life_span_handler_t::on_before_close() is called for |browser|.
+  /// Called when |browser| associated with |browser_view| is destroyed. Release
+  /// all references to |browser| and do not attempt to execute any functions on
+  /// |browser| after this callback returns. This function will be called before
+  /// cef_life_span_handler_t::on_before_close() is called for |browser|.
   ///
   void(CEF_CALLBACK* on_browser_destroyed)(
       struct _cef_browser_view_delegate_t* self,
@@ -84,11 +84,11 @@
       struct _cef_browser_t* browser);
 
   ///
-  // Called before a new popup BrowserView is created. The popup originated from
-  // |browser_view|. |settings| and |client| are the values returned from
-  // cef_life_span_handler_t::on_before_popup(). |is_devtools| will be true (1)
-  // if the popup will be a DevTools browser. Return the delegate that will be
-  // used for the new popup BrowserView.
+  /// Called before a new popup BrowserView is created. The popup originated
+  /// from |browser_view|. |settings| and |client| are the values returned from
+  /// cef_life_span_handler_t::on_before_popup(). |is_devtools| will be true (1)
+  /// if the popup will be a DevTools browser. Return the delegate that will be
+  /// used for the new popup BrowserView.
   ///
   struct _cef_browser_view_delegate_t*(
       CEF_CALLBACK* get_delegate_for_popup_browser_view)(
@@ -99,19 +99,48 @@
       int is_devtools);
 
   ///
-  // Called after |popup_browser_view| is created. This function will be called
-  // after cef_life_span_handler_t::on_after_created() and on_browser_created()
-  // are called for the new popup browser. The popup originated from
-  // |browser_view|. |is_devtools| will be true (1) if the popup is a DevTools
-  // browser. Optionally add |popup_browser_view| to the views hierarchy
-  // yourself and return true (1). Otherwise return false (0) and a default
-  // cef_window_t will be created for the popup.
+  /// Called after |popup_browser_view| is created. This function will be called
+  /// after cef_life_span_handler_t::on_after_created() and on_browser_created()
+  /// are called for the new popup browser. The popup originated from
+  /// |browser_view|. |is_devtools| will be true (1) if the popup is a DevTools
+  /// browser. Optionally add |popup_browser_view| to the views hierarchy
+  /// yourself and return true (1). Otherwise return false (0) and a default
+  /// cef_window_t will be created for the popup.
   ///
   int(CEF_CALLBACK* on_popup_browser_view_created)(
       struct _cef_browser_view_delegate_t* self,
       struct _cef_browser_view_t* browser_view,
       struct _cef_browser_view_t* popup_browser_view,
       int is_devtools);
+
+  ///
+  /// Returns the Chrome toolbar type that will be available via
+  /// cef_browser_view_t::get_chrome_toolbar(). See that function for related
+  /// documentation.
+  ///
+  cef_chrome_toolbar_type_t(CEF_CALLBACK* get_chrome_toolbar_type)(
+      struct _cef_browser_view_delegate_t* self,
+      struct _cef_browser_view_t* browser_view);
+
+  ///
+  /// Return true (1) to create frameless windows for Document picture-in-
+  /// picture popups. Content in frameless windows should specify draggable
+  /// regions using "-webkit-app-region: drag" CSS.
+  ///
+  int(CEF_CALLBACK* use_frameless_window_for_picture_in_picture)(
+      struct _cef_browser_view_delegate_t* self,
+      struct _cef_browser_view_t* browser_view);
+
+  ///
+  /// Called when |browser_view| receives a gesture command. Return true (1) to
+  /// handle (or disable) a |gesture_command| or false (0) to propagate the
+  /// gesture to the browser for default handling. With the Chrome runtime these
+  /// commands can also be handled via cef_command_handler_t::OnChromeCommand.
+  ///
+  int(CEF_CALLBACK* on_gesture_command)(
+      struct _cef_browser_view_delegate_t* self,
+      struct _cef_browser_view_t* browser_view,
+      cef_gesture_command_t gesture_command);
 } cef_browser_view_delegate_t;
 
 #ifdef __cplusplus
diff --git a/src/include/capi/views/cef_button_capi.h b/src/include/capi/views/cef_button_capi.h
index 2c3d992..e4fa681 100644
--- a/src/include/capi/views/cef_button_capi.h
+++ b/src/include/capi/views/cef_button_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=066842f6905c8eed7de1fc8cf831e06801029b97$
+// $hash=6580dc6ef6c20d5d78dc0160982b9ef57c939f86$
 //
 
 #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_BUTTON_CAPI_H_
@@ -49,48 +49,49 @@
 struct _cef_label_button_t;
 
 ///
-// A View representing a button. Depending on the specific type, the button
-// could be implemented by a native control or custom rendered. Methods must be
-// called on the browser process UI thread unless otherwise indicated.
+/// A View representing a button. Depending on the specific type, the button
+/// could be implemented by a native control or custom rendered. Methods must be
+/// called on the browser process UI thread unless otherwise indicated.
 ///
 typedef struct _cef_button_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_view_t base;
 
   ///
-  // Returns this Button as a LabelButton or NULL if this is not a LabelButton.
+  /// Returns this Button as a LabelButton or NULL if this is not a LabelButton.
   ///
   struct _cef_label_button_t*(CEF_CALLBACK* as_label_button)(
       struct _cef_button_t* self);
 
   ///
-  // Sets the current display state of the Button.
+  /// Sets the current display state of the Button.
   ///
   void(CEF_CALLBACK* set_state)(struct _cef_button_t* self,
                                 cef_button_state_t state);
 
   ///
-  // Returns the current display state of the Button.
+  /// Returns the current display state of the Button.
   ///
   cef_button_state_t(CEF_CALLBACK* get_state)(struct _cef_button_t* self);
 
   ///
-  // Sets the Button will use an ink drop effect for displaying state changes.
+  /// Sets the Button will use an ink drop effect for displaying state changes.
   ///
   void(CEF_CALLBACK* set_ink_drop_enabled)(struct _cef_button_t* self,
                                            int enabled);
 
   ///
-  // Sets the tooltip text that will be displayed when the user hovers the mouse
-  // cursor over the Button.
+  /// Sets the tooltip text that will be displayed when the user hovers the
+  /// mouse cursor over the Button.
   ///
   void(CEF_CALLBACK* set_tooltip_text)(struct _cef_button_t* self,
                                        const cef_string_t* tooltip_text);
 
   ///
-  // Sets the accessible name that will be exposed to assistive technology (AT).
+  /// Sets the accessible name that will be exposed to assistive technology
+  /// (AT).
   ///
   void(CEF_CALLBACK* set_accessible_name)(struct _cef_button_t* self,
                                           const cef_string_t* name);
diff --git a/src/include/capi/views/cef_button_delegate_capi.h b/src/include/capi/views/cef_button_delegate_capi.h
index da67a0b..caa27da 100644
--- a/src/include/capi/views/cef_button_delegate_capi.h
+++ b/src/include/capi/views/cef_button_delegate_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=71def746b63431f9aa779bbb67e85bc2e0176615$
+// $hash=9843593667569cf8755386ab2d884620087a36b8$
 //
 
 #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_BUTTON_DELEGATE_CAPI_H_
@@ -49,24 +49,24 @@
 struct _cef_button_t;
 
 ///
-// Implement this structure to handle Button events. The functions of this
-// structure will be called on the browser process UI thread unless otherwise
-// indicated.
+/// Implement this structure to handle Button events. The functions of this
+/// structure will be called on the browser process UI thread unless otherwise
+/// indicated.
 ///
 typedef struct _cef_button_delegate_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_view_delegate_t base;
 
   ///
-  // Called when |button| is pressed.
+  /// Called when |button| is pressed.
   ///
   void(CEF_CALLBACK* on_button_pressed)(struct _cef_button_delegate_t* self,
                                         struct _cef_button_t* button);
 
   ///
-  // Called when the state of |button| changes.
+  /// Called when the state of |button| changes.
   ///
   void(CEF_CALLBACK* on_button_state_changed)(
       struct _cef_button_delegate_t* self,
diff --git a/src/include/capi/views/cef_display_capi.h b/src/include/capi/views/cef_display_capi.h
index 89bb5ad..031cb51 100644
--- a/src/include/capi/views/cef_display_capi.h
+++ b/src/include/capi/views/cef_display_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=422243fda6e1404222aca7bdd4e7b84b961a9626$
+// $hash=2e9acfffaf1dbc70f0c76fcf58a5190326b131ba$
 //
 
 #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_DISPLAY_CAPI_H_
@@ -47,98 +47,127 @@
 #endif
 
 ///
-// This structure typically, but not always, corresponds to a physical display
-// connected to the system. A fake Display may exist on a headless system, or a
-// Display may correspond to a remote, virtual display. All size and position
-// values are in density independent pixels (DIP) unless otherwise indicated.
-// Methods must be called on the browser process UI thread unless otherwise
-// indicated.
+/// This structure typically, but not always, corresponds to a physical display
+/// connected to the system. A fake Display may exist on a headless system, or a
+/// Display may correspond to a remote, virtual display. All size and position
+/// values are in density independent pixel (DIP) coordinates unless otherwise
+/// indicated. Methods must be called on the browser process UI thread unless
+/// otherwise indicated.
 ///
 typedef struct _cef_display_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns the unique identifier for this Display.
+  /// Returns the unique identifier for this Display.
   ///
-  int64(CEF_CALLBACK* get_id)(struct _cef_display_t* self);
+  int64_t(CEF_CALLBACK* get_id)(struct _cef_display_t* self);
 
   ///
-  // Returns this Display's device pixel scale factor. This specifies how much
-  // the UI should be scaled when the actual output has more pixels than
-  // standard displays (which is around 100~120dpi). The potential return values
-  // differ by platform.
+  /// Returns this Display's device pixel scale factor. This specifies how much
+  /// the UI should be scaled when the actual output has more pixels than
+  /// standard displays (which is around 100~120dpi). The potential return
+  /// values differ by platform.
   ///
   float(CEF_CALLBACK* get_device_scale_factor)(struct _cef_display_t* self);
 
   ///
-  // Convert |point| from density independent pixels (DIP) to pixel coordinates
-  // using this Display's device scale factor.
+  /// Convert |point| from DIP coordinates to pixel coordinates using this
+  /// Display's device scale factor.
   ///
   void(CEF_CALLBACK* convert_point_to_pixels)(struct _cef_display_t* self,
                                               cef_point_t* point);
 
   ///
-  // Convert |point| from pixel coordinates to density independent pixels (DIP)
-  // using this Display's device scale factor.
+  /// Convert |point| from pixel coordinates to DIP coordinates using this
+  /// Display's device scale factor.
   ///
   void(CEF_CALLBACK* convert_point_from_pixels)(struct _cef_display_t* self,
                                                 cef_point_t* point);
 
   ///
-  // Returns this Display's bounds. This is the full size of the display.
+  /// Returns this Display's bounds in DIP screen coordinates. This is the full
+  /// size of the display.
   ///
   cef_rect_t(CEF_CALLBACK* get_bounds)(struct _cef_display_t* self);
 
   ///
-  // Returns this Display's work area. This excludes areas of the display that
-  // are occupied for window manager toolbars, etc.
+  /// Returns this Display's work area in DIP screen coordinates. This excludes
+  /// areas of the display that are occupied with window manager toolbars, etc.
   ///
   cef_rect_t(CEF_CALLBACK* get_work_area)(struct _cef_display_t* self);
 
   ///
-  // Returns this Display's rotation in degrees.
+  /// Returns this Display's rotation in degrees.
   ///
   int(CEF_CALLBACK* get_rotation)(struct _cef_display_t* self);
 } cef_display_t;
 
 ///
-// Returns the primary Display.
+/// Returns the primary Display.
 ///
-CEF_EXPORT cef_display_t* cef_display_get_primary();
+CEF_EXPORT cef_display_t* cef_display_get_primary(void);
 
 ///
-// Returns the Display nearest |point|. Set |input_pixel_coords| to true (1) if
-// |point| is in pixel coordinates instead of density independent pixels (DIP).
+/// Returns the Display nearest |point|. Set |input_pixel_coords| to true (1) if
+/// |point| is in pixel screen coordinates instead of DIP screen coordinates.
 ///
 CEF_EXPORT cef_display_t* cef_display_get_nearest_point(
     const cef_point_t* point,
     int input_pixel_coords);
 
 ///
-// Returns the Display that most closely intersects |bounds|.  Set
-// |input_pixel_coords| to true (1) if |bounds| is in pixel coordinates instead
-// of density independent pixels (DIP).
+/// Returns the Display that most closely intersects |bounds|.  Set
+/// |input_pixel_coords| to true (1) if |bounds| is in pixel screen coordinates
+/// instead of DIP screen coordinates.
 ///
 CEF_EXPORT cef_display_t* cef_display_get_matching_bounds(
     const cef_rect_t* bounds,
     int input_pixel_coords);
 
 ///
-// Returns the total number of Displays. Mirrored displays are excluded; this
-// function is intended to return the number of distinct, usable displays.
+/// Returns the total number of Displays. Mirrored displays are excluded; this
+/// function is intended to return the number of distinct, usable displays.
 ///
-CEF_EXPORT size_t cef_display_get_count();
+CEF_EXPORT size_t cef_display_get_count(void);
 
 ///
-// Returns all Displays. Mirrored displays are excluded; this function is
-// intended to return distinct, usable displays.
+/// Returns all Displays. Mirrored displays are excluded; this function is
+/// intended to return distinct, usable displays.
 ///
 CEF_EXPORT void cef_display_get_alls(size_t* displaysCount,
                                      cef_display_t** displays);
 
+///
+/// Convert |point| from DIP screen coordinates to pixel screen coordinates.
+/// This function is only used on Windows.
+///
+CEF_EXPORT cef_point_t
+cef_display_convert_screen_point_to_pixels(const cef_point_t* point);
+
+///
+/// Convert |point| from pixel screen coordinates to DIP screen coordinates.
+/// This function is only used on Windows.
+///
+CEF_EXPORT cef_point_t
+cef_display_convert_screen_point_from_pixels(const cef_point_t* point);
+
+///
+/// Convert |rect| from DIP screen coordinates to pixel screen coordinates. This
+/// function is only used on Windows.
+///
+CEF_EXPORT cef_rect_t
+cef_display_convert_screen_rect_to_pixels(const cef_rect_t* rect);
+
+///
+/// Convert |rect| from pixel screen coordinates to DIP screen coordinates. This
+/// function is only used on Windows.
+///
+CEF_EXPORT cef_rect_t
+cef_display_convert_screen_rect_from_pixels(const cef_rect_t* rect);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/include/capi/views/cef_fill_layout_capi.h b/src/include/capi/views/cef_fill_layout_capi.h
index edd56c6..c9ae6d9 100644
--- a/src/include/capi/views/cef_fill_layout_capi.h
+++ b/src/include/capi/views/cef_fill_layout_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=14016ebf5d63f625436aebd14396e403b673703f$
+// $hash=fdb3457ac8b18ad3cf0144af5886586dd675c8f8$
 //
 
 #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_FILL_LAYOUT_CAPI_H_
@@ -47,13 +47,13 @@
 #endif
 
 ///
-// A simple Layout that causes the associated Panel's one child to be sized to
-// match the bounds of its parent. Methods must be called on the browser process
-// UI thread unless otherwise indicated.
+/// A simple Layout that causes the associated Panel's one child to be sized to
+/// match the bounds of its parent. Methods must be called on the browser
+/// process UI thread unless otherwise indicated.
 ///
 typedef struct _cef_fill_layout_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_layout_t base;
 } cef_fill_layout_t;
diff --git a/src/include/capi/views/cef_label_button_capi.h b/src/include/capi/views/cef_label_button_capi.h
index 05a930f..07b3876 100644
--- a/src/include/capi/views/cef_label_button_capi.h
+++ b/src/include/capi/views/cef_label_button_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=d947a566036f44439f352aea45098dfb46043b9a$
+// $hash=eee5b9ebfa58617d5e6fa969e27cc9e378fddb22$
 //
 
 #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_LABEL_BUTTON_CAPI_H_
@@ -51,104 +51,105 @@
 struct _cef_menu_button_t;
 
 ///
-// LabelButton is a button with optional text and/or icon. Methods must be
-// called on the browser process UI thread unless otherwise indicated.
+/// LabelButton is a button with optional text and/or icon. Methods must be
+/// called on the browser process UI thread unless otherwise indicated.
 ///
 typedef struct _cef_label_button_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_button_t base;
 
   ///
-  // Returns this LabelButton as a MenuButton or NULL if this is not a
-  // MenuButton.
+  /// Returns this LabelButton as a MenuButton or NULL if this is not a
+  /// MenuButton.
   ///
   struct _cef_menu_button_t*(CEF_CALLBACK* as_menu_button)(
       struct _cef_label_button_t* self);
 
   ///
-  // Sets the text shown on the LabelButton. By default |text| will also be used
-  // as the accessible name.
+  /// Sets the text shown on the LabelButton. By default |text| will also be
+  /// used as the accessible name.
   ///
   void(CEF_CALLBACK* set_text)(struct _cef_label_button_t* self,
                                const cef_string_t* text);
 
   ///
-  // Returns the text shown on the LabelButton.
+  /// Returns the text shown on the LabelButton.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_text)(
       struct _cef_label_button_t* self);
 
   ///
-  // Sets the image shown for |button_state|. When this Button is drawn if no
-  // image exists for the current state then the image for
-  // CEF_BUTTON_STATE_NORMAL, if any, will be shown.
+  /// Sets the image shown for |button_state|. When this Button is drawn if no
+  /// image exists for the current state then the image for
+  /// CEF_BUTTON_STATE_NORMAL, if any, will be shown.
   ///
   void(CEF_CALLBACK* set_image)(struct _cef_label_button_t* self,
                                 cef_button_state_t button_state,
                                 struct _cef_image_t* image);
 
   ///
-  // Returns the image shown for |button_state|. If no image exists for that
-  // state then the image for CEF_BUTTON_STATE_NORMAL will be returned.
+  /// Returns the image shown for |button_state|. If no image exists for that
+  /// state then the image for CEF_BUTTON_STATE_NORMAL will be returned.
   ///
   struct _cef_image_t*(CEF_CALLBACK* get_image)(
       struct _cef_label_button_t* self,
       cef_button_state_t button_state);
 
   ///
-  // Sets the text color shown for the specified button |for_state| to |color|.
+  /// Sets the text color shown for the specified button |for_state| to |color|.
   ///
   void(CEF_CALLBACK* set_text_color)(struct _cef_label_button_t* self,
                                      cef_button_state_t for_state,
                                      cef_color_t color);
 
   ///
-  // Sets the text colors shown for the non-disabled states to |color|.
+  /// Sets the text colors shown for the non-disabled states to |color|.
   ///
   void(CEF_CALLBACK* set_enabled_text_colors)(struct _cef_label_button_t* self,
                                               cef_color_t color);
 
   ///
-  // Sets the font list. The format is "<FONT_FAMILY_LIST>,[STYLES] <SIZE>",
-  // where: - FONT_FAMILY_LIST is a comma-separated list of font family names, -
-  // STYLES is an optional space-separated list of style names (case-sensitive
-  //   "Bold" and "Italic" are supported), and
-  // - SIZE is an integer font size in pixels with the suffix "px".
-  //
-  // Here are examples of valid font description strings: - "Arial, Helvetica,
-  // Bold Italic 14px" - "Arial, 14px"
+  /// Sets the font list. The format is "<FONT_FAMILY_LIST>,[STYLES] <SIZE>",
+  /// where: - FONT_FAMILY_LIST is a comma-separated list of font family names,
+  /// - STYLES is an optional space-separated list of style names (case-
+  /// sensitive
+  ///   "Bold" and "Italic" are supported), and
+  /// - SIZE is an integer font size in pixels with the suffix "px".
+  ///
+  /// Here are examples of valid font description strings: - "Arial, Helvetica,
+  /// Bold Italic 14px" - "Arial, 14px"
   ///
   void(CEF_CALLBACK* set_font_list)(struct _cef_label_button_t* self,
                                     const cef_string_t* font_list);
 
   ///
-  // Sets the horizontal alignment; reversed in RTL. Default is
-  // CEF_HORIZONTAL_ALIGNMENT_CENTER.
+  /// Sets the horizontal alignment; reversed in RTL. Default is
+  /// CEF_HORIZONTAL_ALIGNMENT_CENTER.
   ///
   void(CEF_CALLBACK* set_horizontal_alignment)(
       struct _cef_label_button_t* self,
       cef_horizontal_alignment_t alignment);
 
   ///
-  // Reset the minimum size of this LabelButton to |size|.
+  /// Reset the minimum size of this LabelButton to |size|.
   ///
   void(CEF_CALLBACK* set_minimum_size)(struct _cef_label_button_t* self,
                                        const cef_size_t* size);
 
   ///
-  // Reset the maximum size of this LabelButton to |size|.
+  /// Reset the maximum size of this LabelButton to |size|.
   ///
   void(CEF_CALLBACK* set_maximum_size)(struct _cef_label_button_t* self,
                                        const cef_size_t* size);
 } cef_label_button_t;
 
 ///
-// Create a new LabelButton. A |delegate| must be provided to handle the button
-// click. |text| will be shown on the LabelButton and used as the default
-// accessible name.
+/// Create a new LabelButton. A |delegate| must be provided to handle the button
+/// click. |text| will be shown on the LabelButton and used as the default
+/// accessible name.
 ///
 CEF_EXPORT cef_label_button_t* cef_label_button_create(
     struct _cef_button_delegate_t* delegate,
diff --git a/src/include/capi/views/cef_layout_capi.h b/src/include/capi/views/cef_layout_capi.h
index 2ecfd7b..5430a45 100644
--- a/src/include/capi/views/cef_layout_capi.h
+++ b/src/include/capi/views/cef_layout_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=7db4a977d7fbbff0783d0334e53fa47f00fc9fac$
+// $hash=c4a17c07bb2a3518fc5b7350efdc13ffeb803747$
 //
 
 #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_LAYOUT_CAPI_H_
@@ -50,30 +50,30 @@
 struct _cef_fill_layout_t;
 
 ///
-// A Layout handles the sizing of the children of a Panel according to
-// implementation-specific heuristics. Methods must be called on the browser
-// process UI thread unless otherwise indicated.
+/// A Layout handles the sizing of the children of a Panel according to
+/// implementation-specific heuristics. Methods must be called on the browser
+/// process UI thread unless otherwise indicated.
 ///
 typedef struct _cef_layout_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns this Layout as a BoxLayout or NULL if this is not a BoxLayout.
+  /// Returns this Layout as a BoxLayout or NULL if this is not a BoxLayout.
   ///
   struct _cef_box_layout_t*(CEF_CALLBACK* as_box_layout)(
       struct _cef_layout_t* self);
 
   ///
-  // Returns this Layout as a FillLayout or NULL if this is not a FillLayout.
+  /// Returns this Layout as a FillLayout or NULL if this is not a FillLayout.
   ///
   struct _cef_fill_layout_t*(CEF_CALLBACK* as_fill_layout)(
       struct _cef_layout_t* self);
 
   ///
-  // Returns true (1) if this Layout is valid.
+  /// Returns true (1) if this Layout is valid.
   ///
   int(CEF_CALLBACK* is_valid)(struct _cef_layout_t* self);
 } cef_layout_t;
diff --git a/src/include/capi/views/cef_menu_button_capi.h b/src/include/capi/views/cef_menu_button_capi.h
index 37f1bb8..85cec0f 100644
--- a/src/include/capi/views/cef_menu_button_capi.h
+++ b/src/include/capi/views/cef_menu_button_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=8e1972f8c40d4c7a708f32016dbfeb5bf2a2ff0b$
+// $hash=dcfa5d39d1355b2c675637a13378f43376a8053e$
 //
 
 #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_MENU_BUTTON_CAPI_H_
@@ -49,22 +49,23 @@
 #endif
 
 ///
-// MenuButton is a button with optional text, icon and/or menu marker that shows
-// a menu when clicked with the left mouse button. All size and position values
-// are in density independent pixels (DIP) unless otherwise indicated. Methods
-// must be called on the browser process UI thread unless otherwise indicated.
+/// MenuButton is a button with optional text, icon and/or menu marker that
+/// shows a menu when clicked with the left mouse button. All size and position
+/// values are in density independent pixels (DIP) unless otherwise indicated.
+/// Methods must be called on the browser process UI thread unless otherwise
+/// indicated.
 ///
 typedef struct _cef_menu_button_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_label_button_t base;
 
   ///
-  // Show a menu with contents |menu_model|. |screen_point| specifies the menu
-  // position in screen coordinates. |anchor_position| specifies how the menu
-  // will be anchored relative to |screen_point|. This function should be called
-  // from cef_menu_button_delegate_t::on_menu_button_pressed().
+  /// Show a menu with contents |menu_model|. |screen_point| specifies the menu
+  /// position in screen coordinates. |anchor_position| specifies how the menu
+  /// will be anchored relative to |screen_point|. This function should be
+  /// called from cef_menu_button_delegate_t::on_menu_button_pressed().
   ///
   void(CEF_CALLBACK* show_menu)(struct _cef_menu_button_t* self,
                                 struct _cef_menu_model_t* menu_model,
@@ -72,20 +73,20 @@
                                 cef_menu_anchor_position_t anchor_position);
 
   ///
-  // Show the menu for this button. Results in a call to
-  // cef_menu_button_delegate_t::on_menu_button_pressed().
+  /// Show the menu for this button. Results in a call to
+  /// cef_menu_button_delegate_t::on_menu_button_pressed().
   ///
   void(CEF_CALLBACK* trigger_menu)(struct _cef_menu_button_t* self);
 } cef_menu_button_t;
 
 ///
-// Create a new MenuButton. A |delegate| must be provided to call show_menu()
-// when the button is clicked. |text| will be shown on the MenuButton and used
-// as the default accessible name. If |with_frame| is true (1) the button will
-// have a visible frame at all times, center alignment, additional padding and a
-// default minimum size of 70x33 DIP. If |with_frame| is false (0) the button
-// will only have a visible frame on hover/press, left alignment, less padding
-// and no default minimum size.
+/// Create a new MenuButton. A |delegate| must be provided to call show_menu()
+/// when the button is clicked. |text| will be shown on the MenuButton and used
+/// as the default accessible name. If |with_frame| is true (1) the button will
+/// have a visible frame at all times, center alignment, additional padding and
+/// a default minimum size of 70x33 DIP. If |with_frame| is false (0) the button
+/// will only have a visible frame on hover/press, left alignment, less padding
+/// and no default minimum size.
 ///
 CEF_EXPORT cef_menu_button_t* cef_menu_button_create(
     struct _cef_menu_button_delegate_t* delegate,
diff --git a/src/include/capi/views/cef_menu_button_delegate_capi.h b/src/include/capi/views/cef_menu_button_delegate_capi.h
index b2c4a5c..5d93864 100644
--- a/src/include/capi/views/cef_menu_button_delegate_capi.h
+++ b/src/include/capi/views/cef_menu_button_delegate_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=6668ddfd94bb501f0cb35b2c23043333c1cafe63$
+// $hash=38177cad78713d382b81f8b8aa4372402c62fac7$
 //
 
 #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_MENU_BUTTON_DELEGATE_CAPI_H_
@@ -49,31 +49,31 @@
 struct _cef_menu_button_t;
 
 ///
-// MenuButton pressed lock is released when this object is destroyed.
+/// MenuButton pressed lock is released when this object is destroyed.
 ///
 typedef struct _cef_menu_button_pressed_lock_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 } cef_menu_button_pressed_lock_t;
 
 ///
-// Implement this structure to handle MenuButton events. The functions of this
-// structure will be called on the browser process UI thread unless otherwise
-// indicated.
+/// Implement this structure to handle MenuButton events. The functions of this
+/// structure will be called on the browser process UI thread unless otherwise
+/// indicated.
 ///
 typedef struct _cef_menu_button_delegate_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_button_delegate_t base;
 
   ///
-  // Called when |button| is pressed. Call cef_menu_button_t::show_menu() to
-  // show a popup menu at |screen_point|. When showing a custom popup such as a
-  // window keep a reference to |button_pressed_lock| until the popup is hidden
-  // to maintain the pressed button state.
+  /// Called when |button| is pressed. Call cef_menu_button_t::show_menu() to
+  /// show a popup menu at |screen_point|. When showing a custom popup such as a
+  /// window keep a reference to |button_pressed_lock| until the popup is hidden
+  /// to maintain the pressed button state.
   ///
   void(CEF_CALLBACK* on_menu_button_pressed)(
       struct _cef_menu_button_delegate_t* self,
diff --git a/src/include/capi/views/cef_overlay_controller_capi.h b/src/include/capi/views/cef_overlay_controller_capi.h
new file mode 100644
index 0000000..8084bfd
--- /dev/null
+++ b/src/include/capi/views/cef_overlay_controller_capi.h
@@ -0,0 +1,217 @@
+// Copyright (c) 2023 Marshall A. Greenblatt. 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 file was generated by the CEF translator tool and should not edited
+// by hand. See the translator.README.txt file in the tools directory for
+// more information.
+//
+// $hash=a5a2c7fe2c285b45268eee1710a8549ab12727f3$
+//
+
+#ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_OVERLAY_CONTROLLER_CAPI_H_
+#define CEF_INCLUDE_CAPI_VIEWS_CEF_OVERLAY_CONTROLLER_CAPI_H_
+#pragma once
+
+#include "include/capi/cef_base_capi.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct _cef_view_t;
+struct _cef_window_t;
+
+///
+/// Controller for an overlay that contains a contents View added via
+/// cef_window_t::AddOverlayView. Methods exposed by this controller should be
+/// called in preference to functions of the same name exposed by the contents
+/// View unless otherwise indicated. Methods must be called on the browser
+/// process UI thread unless otherwise indicated.
+///
+typedef struct _cef_overlay_controller_t {
+  ///
+  /// Base structure.
+  ///
+  cef_base_ref_counted_t base;
+
+  ///
+  /// Returns true (1) if this object is valid.
+  ///
+  int(CEF_CALLBACK* is_valid)(struct _cef_overlay_controller_t* self);
+
+  ///
+  /// Returns true (1) if this object is the same as |that| object.
+  ///
+  int(CEF_CALLBACK* is_same)(struct _cef_overlay_controller_t* self,
+                             struct _cef_overlay_controller_t* that);
+
+  ///
+  /// Returns the contents View for this overlay.
+  ///
+  struct _cef_view_t*(CEF_CALLBACK* get_contents_view)(
+      struct _cef_overlay_controller_t* self);
+
+  ///
+  /// Returns the top-level Window hosting this overlay. Use this function
+  /// instead of calling get_window() on the contents View.
+  ///
+  struct _cef_window_t*(CEF_CALLBACK* get_window)(
+      struct _cef_overlay_controller_t* self);
+
+  ///
+  /// Returns the docking mode for this overlay.
+  ///
+  cef_docking_mode_t(CEF_CALLBACK* get_docking_mode)(
+      struct _cef_overlay_controller_t* self);
+
+  ///
+  /// Destroy this overlay.
+  ///
+  void(CEF_CALLBACK* destroy)(struct _cef_overlay_controller_t* self);
+
+  ///
+  /// Sets the bounds (size and position) of this overlay. This will set the
+  /// bounds of the contents View to match and trigger a re-layout if necessary.
+  /// |bounds| is in parent coordinates and any insets configured on this
+  /// overlay will be ignored. Use this function only for overlays created with
+  /// a docking mode value of CEF_DOCKING_MODE_CUSTOM. With other docking modes
+  /// modify the insets of this overlay and/or layout of the contents View and
+  /// call size_to_preferred_size() instead to calculate the new size and re-
+  /// position the overlay if necessary.
+  ///
+  void(CEF_CALLBACK* set_bounds)(struct _cef_overlay_controller_t* self,
+                                 const cef_rect_t* bounds);
+
+  ///
+  /// Returns the bounds (size and position) of this overlay in parent
+  /// coordinates.
+  ///
+  cef_rect_t(CEF_CALLBACK* get_bounds)(struct _cef_overlay_controller_t* self);
+
+  ///
+  /// Returns the bounds (size and position) of this overlay in DIP screen
+  /// coordinates.
+  ///
+  cef_rect_t(CEF_CALLBACK* get_bounds_in_screen)(
+      struct _cef_overlay_controller_t* self);
+
+  ///
+  /// Sets the size of this overlay without changing the position. This will set
+  /// the size of the contents View to match and trigger a re-layout if
+  /// necessary. |size| is in parent coordinates and any insets configured on
+  /// this overlay will be ignored. Use this function only for overlays created
+  /// with a docking mode value of CEF_DOCKING_MODE_CUSTOM. With other docking
+  /// modes modify the insets of this overlay and/or layout of the contents View
+  /// and call size_to_preferred_size() instead to calculate the new size and
+  /// re-position the overlay if necessary.
+  ///
+  void(CEF_CALLBACK* set_size)(struct _cef_overlay_controller_t* self,
+                               const cef_size_t* size);
+
+  ///
+  /// Returns the size of this overlay in parent coordinates.
+  ///
+  cef_size_t(CEF_CALLBACK* get_size)(struct _cef_overlay_controller_t* self);
+
+  ///
+  /// Sets the position of this overlay without changing the size. |position| is
+  /// in parent coordinates and any insets configured on this overlay will be
+  /// ignored. Use this function only for overlays created with a docking mode
+  /// value of CEF_DOCKING_MODE_CUSTOM. With other docking modes modify the
+  /// insets of this overlay and/or layout of the contents View and call
+  /// size_to_preferred_size() instead to calculate the new size and re-position
+  /// the overlay if necessary.
+  ///
+  void(CEF_CALLBACK* set_position)(struct _cef_overlay_controller_t* self,
+                                   const cef_point_t* position);
+
+  ///
+  /// Returns the position of this overlay in parent coordinates.
+  ///
+  cef_point_t(CEF_CALLBACK* get_position)(
+      struct _cef_overlay_controller_t* self);
+
+  ///
+  /// Sets the insets for this overlay. |insets| is in parent coordinates. Use
+  /// this function only for overlays created with a docking mode value other
+  /// than CEF_DOCKING_MODE_CUSTOM.
+  ///
+  void(CEF_CALLBACK* set_insets)(struct _cef_overlay_controller_t* self,
+                                 const cef_insets_t* insets);
+
+  ///
+  /// Returns the insets for this overlay in parent coordinates.
+  ///
+  cef_insets_t(CEF_CALLBACK* get_insets)(
+      struct _cef_overlay_controller_t* self);
+
+  ///
+  /// Size this overlay to its preferred size and trigger a re-layout if
+  /// necessary. The position of overlays created with a docking mode value of
+  /// CEF_DOCKING_MODE_CUSTOM will not be modified by calling this function.
+  /// With other docking modes this function may re-position the overlay if
+  /// necessary to accommodate the new size and any insets configured on the
+  /// contents View.
+  ///
+  void(CEF_CALLBACK* size_to_preferred_size)(
+      struct _cef_overlay_controller_t* self);
+
+  ///
+  /// Sets whether this overlay is visible. Overlays are hidden by default. If
+  /// this overlay is hidden then it and any child Views will not be drawn and,
+  /// if any of those Views currently have focus, then focus will also be
+  /// cleared. Painting is scheduled as needed.
+  ///
+  void(CEF_CALLBACK* set_visible)(struct _cef_overlay_controller_t* self,
+                                  int visible);
+
+  ///
+  /// Returns whether this overlay is visible. A View may be visible but still
+  /// not drawn in a Window if any parent Views are hidden. Call is_drawn() to
+  /// determine whether this overlay and all parent Views are visible and will
+  /// be drawn.
+  ///
+  int(CEF_CALLBACK* is_visible)(struct _cef_overlay_controller_t* self);
+
+  ///
+  /// Returns whether this overlay is visible and drawn in a Window. A View is
+  /// drawn if it and all parent Views are visible. To determine if the
+  /// containing Window is visible to the user on-screen call is_visible() on
+  /// the Window.
+  ///
+  int(CEF_CALLBACK* is_drawn)(struct _cef_overlay_controller_t* self);
+} cef_overlay_controller_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // CEF_INCLUDE_CAPI_VIEWS_CEF_OVERLAY_CONTROLLER_CAPI_H_
diff --git a/src/include/capi/views/cef_panel_capi.h b/src/include/capi/views/cef_panel_capi.h
index cf82398..658b005 100644
--- a/src/include/capi/views/cef_panel_capi.h
+++ b/src/include/capi/views/cef_panel_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=28db02fcdd51238b61d74195dae36fe23e0717da$
+// $hash=40d350f75893a1e4307b282317d55f0fceae3baf$
 //
 
 #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_PANEL_CAPI_H_
@@ -53,93 +53,93 @@
 struct _cef_window_t;
 
 ///
-// A Panel is a container in the views hierarchy that can contain other Views as
-// children. Methods must be called on the browser process UI thread unless
-// otherwise indicated.
+/// A Panel is a container in the views hierarchy that can contain other Views
+/// as children. Methods must be called on the browser process UI thread unless
+/// otherwise indicated.
 ///
 typedef struct _cef_panel_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_view_t base;
 
   ///
-  // Returns this Panel as a Window or NULL if this is not a Window.
+  /// Returns this Panel as a Window or NULL if this is not a Window.
   ///
   struct _cef_window_t*(CEF_CALLBACK* as_window)(struct _cef_panel_t* self);
 
   ///
-  // Set this Panel's Layout to FillLayout and return the FillLayout object.
+  /// Set this Panel's Layout to FillLayout and return the FillLayout object.
   ///
   struct _cef_fill_layout_t*(CEF_CALLBACK* set_to_fill_layout)(
       struct _cef_panel_t* self);
 
   ///
-  // Set this Panel's Layout to BoxLayout and return the BoxLayout object.
+  /// Set this Panel's Layout to BoxLayout and return the BoxLayout object.
   ///
   struct _cef_box_layout_t*(CEF_CALLBACK* set_to_box_layout)(
       struct _cef_panel_t* self,
-      const struct _cef_box_layout_settings_t* settings);
+      const cef_box_layout_settings_t* settings);
 
   ///
-  // Get the Layout.
+  /// Get the Layout.
   ///
   struct _cef_layout_t*(CEF_CALLBACK* get_layout)(struct _cef_panel_t* self);
 
   ///
-  // Lay out the child Views (set their bounds based on sizing heuristics
-  // specific to the current Layout).
+  /// Lay out the child Views (set their bounds based on sizing heuristics
+  /// specific to the current Layout).
   ///
   void(CEF_CALLBACK* layout)(struct _cef_panel_t* self);
 
   ///
-  // Add a child View.
+  /// Add a child View.
   ///
   void(CEF_CALLBACK* add_child_view)(struct _cef_panel_t* self,
                                      struct _cef_view_t* view);
 
   ///
-  // Add a child View at the specified |index|. If |index| matches the result of
-  // GetChildCount() then the View will be added at the end.
+  /// Add a child View at the specified |index|. If |index| matches the result
+  /// of GetChildCount() then the View will be added at the end.
   ///
   void(CEF_CALLBACK* add_child_view_at)(struct _cef_panel_t* self,
                                         struct _cef_view_t* view,
                                         int index);
 
   ///
-  // Move the child View to the specified |index|. A negative value for |index|
-  // will move the View to the end.
+  /// Move the child View to the specified |index|. A negative value for |index|
+  /// will move the View to the end.
   ///
   void(CEF_CALLBACK* reorder_child_view)(struct _cef_panel_t* self,
                                          struct _cef_view_t* view,
                                          int index);
 
   ///
-  // Remove a child View. The View can then be added to another Panel.
+  /// Remove a child View. The View can then be added to another Panel.
   ///
   void(CEF_CALLBACK* remove_child_view)(struct _cef_panel_t* self,
                                         struct _cef_view_t* view);
 
   ///
-  // Remove all child Views. The removed Views will be deleted if the client
-  // holds no references to them.
+  /// Remove all child Views. The removed Views will be deleted if the client
+  /// holds no references to them.
   ///
   void(CEF_CALLBACK* remove_all_child_views)(struct _cef_panel_t* self);
 
   ///
-  // Returns the number of child Views.
+  /// Returns the number of child Views.
   ///
   size_t(CEF_CALLBACK* get_child_view_count)(struct _cef_panel_t* self);
 
   ///
-  // Returns the child View at the specified |index|.
+  /// Returns the child View at the specified |index|.
   ///
   struct _cef_view_t*(
       CEF_CALLBACK* get_child_view_at)(struct _cef_panel_t* self, int index);
 } cef_panel_t;
 
 ///
-// Create a new Panel.
+/// Create a new Panel.
 ///
 CEF_EXPORT cef_panel_t* cef_panel_create(
     struct _cef_panel_delegate_t* delegate);
diff --git a/src/include/capi/views/cef_panel_delegate_capi.h b/src/include/capi/views/cef_panel_delegate_capi.h
index 9e178b7..227762d 100644
--- a/src/include/capi/views/cef_panel_delegate_capi.h
+++ b/src/include/capi/views/cef_panel_delegate_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=8a0ded4e62ff61b04fc1694228905daa995197b4$
+// $hash=e8bdae70e1f16fba3a5e01d9e215a02f13291ff5$
 //
 
 #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_PANEL_DELEGATE_CAPI_H_
@@ -47,13 +47,13 @@
 #endif
 
 ///
-// Implement this structure to handle Panel events. The functions of this
-// structure will be called on the browser process UI thread unless otherwise
-// indicated.
+/// Implement this structure to handle Panel events. The functions of this
+/// structure will be called on the browser process UI thread unless otherwise
+/// indicated.
 ///
 typedef struct _cef_panel_delegate_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_view_delegate_t base;
 } cef_panel_delegate_t;
diff --git a/src/include/capi/views/cef_scroll_view_capi.h b/src/include/capi/views/cef_scroll_view_capi.h
index 89de452..dd503c2 100644
--- a/src/include/capi/views/cef_scroll_view_capi.h
+++ b/src/include/capi/views/cef_scroll_view_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=3b9789f2149c3e6d6a2e671e5427c19654442ede$
+// $hash=e3aa3fbb265a600d498884b0fbb852fc5bbf8856$
 //
 
 #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_SCROLL_VIEW_CAPI_H_
@@ -47,60 +47,60 @@
 #endif
 
 ///
-// A ScrollView will show horizontal and/or vertical scrollbars when necessary
-// based on the size of the attached content view. Methods must be called on the
-// browser process UI thread unless otherwise indicated.
+/// A ScrollView will show horizontal and/or vertical scrollbars when necessary
+/// based on the size of the attached content view. Methods must be called on
+/// the browser process UI thread unless otherwise indicated.
 ///
 typedef struct _cef_scroll_view_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_view_t base;
 
   ///
-  // Set the content View. The content View must have a specified size (e.g. via
-  // cef_view_t::SetBounds or cef_view_delegate_t::GetPreferredSize).
+  /// Set the content View. The content View must have a specified size (e.g.
+  /// via cef_view_t::SetBounds or cef_view_delegate_t::GetPreferredSize).
   ///
   void(CEF_CALLBACK* set_content_view)(struct _cef_scroll_view_t* self,
                                        struct _cef_view_t* view);
 
   ///
-  // Returns the content View.
+  /// Returns the content View.
   ///
   struct _cef_view_t*(CEF_CALLBACK* get_content_view)(
       struct _cef_scroll_view_t* self);
 
   ///
-  // Returns the visible region of the content View.
+  /// Returns the visible region of the content View.
   ///
   cef_rect_t(CEF_CALLBACK* get_visible_content_rect)(
       struct _cef_scroll_view_t* self);
 
   ///
-  // Returns true (1) if the horizontal scrollbar is currently showing.
+  /// Returns true (1) if the horizontal scrollbar is currently showing.
   ///
   int(CEF_CALLBACK* has_horizontal_scrollbar)(struct _cef_scroll_view_t* self);
 
   ///
-  // Returns the height of the horizontal scrollbar.
+  /// Returns the height of the horizontal scrollbar.
   ///
   int(CEF_CALLBACK* get_horizontal_scrollbar_height)(
       struct _cef_scroll_view_t* self);
 
   ///
-  // Returns true (1) if the vertical scrollbar is currently showing.
+  /// Returns true (1) if the vertical scrollbar is currently showing.
   ///
   int(CEF_CALLBACK* has_vertical_scrollbar)(struct _cef_scroll_view_t* self);
 
   ///
-  // Returns the width of the vertical scrollbar.
+  /// Returns the width of the vertical scrollbar.
   ///
   int(CEF_CALLBACK* get_vertical_scrollbar_width)(
       struct _cef_scroll_view_t* self);
 } cef_scroll_view_t;
 
 ///
-// Create a new ScrollView.
+/// Create a new ScrollView.
 ///
 CEF_EXPORT cef_scroll_view_t* cef_scroll_view_create(
     struct _cef_view_delegate_t* delegate);
diff --git a/src/include/capi/views/cef_textfield_capi.h b/src/include/capi/views/cef_textfield_capi.h
index 1b49658..c525f21 100644
--- a/src/include/capi/views/cef_textfield_capi.h
+++ b/src/include/capi/views/cef_textfield_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=71ba0e5714400e2bea3ca564cab4527d95e4b52c$
+// $hash=7d5a43282c9847c5c842abd5de023f4c5c69a9f0$
 //
 
 #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_TEXTFIELD_CAPI_H_
@@ -48,166 +48,167 @@
 #endif
 
 ///
-// A Textfield supports editing of text. This control is custom rendered with no
-// platform-specific code. Methods must be called on the browser process UI
-// thread unless otherwise indicated.
+/// A Textfield supports editing of text. This control is custom rendered with
+/// no platform-specific code. Methods must be called on the browser process UI
+/// thread unless otherwise indicated.
 ///
 typedef struct _cef_textfield_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_view_t base;
 
   ///
-  // Sets whether the text will be displayed as asterisks.
+  /// Sets whether the text will be displayed as asterisks.
   ///
   void(CEF_CALLBACK* set_password_input)(struct _cef_textfield_t* self,
                                          int password_input);
 
   ///
-  // Returns true (1) if the text will be displayed as asterisks.
+  /// Returns true (1) if the text will be displayed as asterisks.
   ///
   int(CEF_CALLBACK* is_password_input)(struct _cef_textfield_t* self);
 
   ///
-  // Sets whether the text will read-only.
+  /// Sets whether the text will read-only.
   ///
   void(CEF_CALLBACK* set_read_only)(struct _cef_textfield_t* self,
                                     int read_only);
 
   ///
-  // Returns true (1) if the text is read-only.
+  /// Returns true (1) if the text is read-only.
   ///
   int(CEF_CALLBACK* is_read_only)(struct _cef_textfield_t* self);
 
   ///
-  // Returns the currently displayed text.
+  /// Returns the currently displayed text.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_text)(struct _cef_textfield_t* self);
 
   ///
-  // Sets the contents to |text|. The cursor will be moved to end of the text if
-  // the current position is outside of the text range.
+  /// Sets the contents to |text|. The cursor will be moved to end of the text
+  /// if the current position is outside of the text range.
   ///
   void(CEF_CALLBACK* set_text)(struct _cef_textfield_t* self,
                                const cef_string_t* text);
 
   ///
-  // Appends |text| to the previously-existing text.
+  /// Appends |text| to the previously-existing text.
   ///
   void(CEF_CALLBACK* append_text)(struct _cef_textfield_t* self,
                                   const cef_string_t* text);
 
   ///
-  // Inserts |text| at the current cursor position replacing any selected text.
+  /// Inserts |text| at the current cursor position replacing any selected text.
   ///
   void(CEF_CALLBACK* insert_or_replace_text)(struct _cef_textfield_t* self,
                                              const cef_string_t* text);
 
   ///
-  // Returns true (1) if there is any selected text.
+  /// Returns true (1) if there is any selected text.
   ///
   int(CEF_CALLBACK* has_selection)(struct _cef_textfield_t* self);
 
   ///
-  // Returns the currently selected text.
+  /// Returns the currently selected text.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_selected_text)(
       struct _cef_textfield_t* self);
 
   ///
-  // Selects all text. If |reversed| is true (1) the range will end at the
-  // logical beginning of the text; this generally shows the leading portion of
-  // text that overflows its display area.
+  /// Selects all text. If |reversed| is true (1) the range will end at the
+  /// logical beginning of the text; this generally shows the leading portion of
+  /// text that overflows its display area.
   ///
   void(CEF_CALLBACK* select_all)(struct _cef_textfield_t* self, int reversed);
 
   ///
-  // Clears the text selection and sets the caret to the end.
+  /// Clears the text selection and sets the caret to the end.
   ///
   void(CEF_CALLBACK* clear_selection)(struct _cef_textfield_t* self);
 
   ///
-  // Returns the selected logical text range.
+  /// Returns the selected logical text range.
   ///
   cef_range_t(CEF_CALLBACK* get_selected_range)(struct _cef_textfield_t* self);
 
   ///
-  // Selects the specified logical text range.
+  /// Selects the specified logical text range.
   ///
   void(CEF_CALLBACK* select_range)(struct _cef_textfield_t* self,
                                    const cef_range_t* range);
 
   ///
-  // Returns the current cursor position.
+  /// Returns the current cursor position.
   ///
   size_t(CEF_CALLBACK* get_cursor_position)(struct _cef_textfield_t* self);
 
   ///
-  // Sets the text color.
+  /// Sets the text color.
   ///
   void(CEF_CALLBACK* set_text_color)(struct _cef_textfield_t* self,
                                      cef_color_t color);
 
   ///
-  // Returns the text color.
+  /// Returns the text color.
   ///
   cef_color_t(CEF_CALLBACK* get_text_color)(struct _cef_textfield_t* self);
 
   ///
-  // Sets the selection text color.
+  /// Sets the selection text color.
   ///
   void(CEF_CALLBACK* set_selection_text_color)(struct _cef_textfield_t* self,
                                                cef_color_t color);
 
   ///
-  // Returns the selection text color.
+  /// Returns the selection text color.
   ///
   cef_color_t(CEF_CALLBACK* get_selection_text_color)(
       struct _cef_textfield_t* self);
 
   ///
-  // Sets the selection background color.
+  /// Sets the selection background color.
   ///
   void(CEF_CALLBACK* set_selection_background_color)(
       struct _cef_textfield_t* self,
       cef_color_t color);
 
   ///
-  // Returns the selection background color.
+  /// Returns the selection background color.
   ///
   cef_color_t(CEF_CALLBACK* get_selection_background_color)(
       struct _cef_textfield_t* self);
 
   ///
-  // Sets the font list. The format is "<FONT_FAMILY_LIST>,[STYLES] <SIZE>",
-  // where: - FONT_FAMILY_LIST is a comma-separated list of font family names, -
-  // STYLES is an optional space-separated list of style names (case-sensitive
-  //   "Bold" and "Italic" are supported), and
-  // - SIZE is an integer font size in pixels with the suffix "px".
-  //
-  // Here are examples of valid font description strings: - "Arial, Helvetica,
-  // Bold Italic 14px" - "Arial, 14px"
+  /// Sets the font list. The format is "<FONT_FAMILY_LIST>,[STYLES] <SIZE>",
+  /// where: - FONT_FAMILY_LIST is a comma-separated list of font family names,
+  /// - STYLES is an optional space-separated list of style names (case-
+  /// sensitive
+  ///   "Bold" and "Italic" are supported), and
+  /// - SIZE is an integer font size in pixels with the suffix "px".
+  ///
+  /// Here are examples of valid font description strings: - "Arial, Helvetica,
+  /// Bold Italic 14px" - "Arial, 14px"
   ///
   void(CEF_CALLBACK* set_font_list)(struct _cef_textfield_t* self,
                                     const cef_string_t* font_list);
 
   ///
-  // Applies |color| to the specified |range| without changing the default
-  // color. If |range| is NULL the color will be set on the complete text
-  // contents.
+  /// Applies |color| to the specified |range| without changing the default
+  /// color. If |range| is NULL the color will be set on the complete text
+  /// contents.
   ///
   void(CEF_CALLBACK* apply_text_color)(struct _cef_textfield_t* self,
                                        cef_color_t color,
                                        const cef_range_t* range);
 
   ///
-  // Applies |style| to the specified |range| without changing the default
-  // style. If |add| is true (1) the style will be added, otherwise the style
-  // will be removed. If |range| is NULL the style will be set on the complete
-  // text contents.
+  /// Applies |style| to the specified |range| without changing the default
+  /// style. If |add| is true (1) the style will be added, otherwise the style
+  /// will be removed. If |range| is NULL the style will be set on the complete
+  /// text contents.
   ///
   void(CEF_CALLBACK* apply_text_style)(struct _cef_textfield_t* self,
                                        cef_text_style_t style,
@@ -215,56 +216,53 @@
                                        const cef_range_t* range);
 
   ///
-  // Returns true (1) if the action associated with the specified command id is
-  // enabled. See additional comments on execute_command().
+  /// Returns true (1) if the action associated with the specified command id is
+  /// enabled. See additional comments on execute_command().
   ///
   int(CEF_CALLBACK* is_command_enabled)(struct _cef_textfield_t* self,
-                                        int command_id);
+                                        cef_text_field_commands_t command_id);
 
   ///
-  // Performs the action associated with the specified command id. Valid values
-  // include IDS_APP_UNDO, IDS_APP_REDO, IDS_APP_CUT, IDS_APP_COPY,
-  // IDS_APP_PASTE, IDS_APP_DELETE, IDS_APP_SELECT_ALL, IDS_DELETE_* and
-  // IDS_MOVE_*. See include/cef_pack_strings.h for definitions.
+  /// Performs the action associated with the specified command id.
   ///
   void(CEF_CALLBACK* execute_command)(struct _cef_textfield_t* self,
-                                      int command_id);
+                                      cef_text_field_commands_t command_id);
 
   ///
-  // Clears Edit history.
+  /// Clears Edit history.
   ///
   void(CEF_CALLBACK* clear_edit_history)(struct _cef_textfield_t* self);
 
   ///
-  // Sets the placeholder text that will be displayed when the Textfield is
-  // NULL.
+  /// Sets the placeholder text that will be displayed when the Textfield is
+  /// NULL.
   ///
   void(CEF_CALLBACK* set_placeholder_text)(struct _cef_textfield_t* self,
                                            const cef_string_t* text);
 
   ///
-  // Returns the placeholder text that will be displayed when the Textfield is
-  // NULL.
+  /// Returns the placeholder text that will be displayed when the Textfield is
+  /// NULL.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_placeholder_text)(
       struct _cef_textfield_t* self);
 
   ///
-  // Sets the placeholder text color.
+  /// Sets the placeholder text color.
   ///
   void(CEF_CALLBACK* set_placeholder_text_color)(struct _cef_textfield_t* self,
                                                  cef_color_t color);
 
   ///
-  // Set the accessible name that will be exposed to assistive technology (AT).
+  /// Set the accessible name that will be exposed to assistive technology (AT).
   ///
   void(CEF_CALLBACK* set_accessible_name)(struct _cef_textfield_t* self,
                                           const cef_string_t* name);
 } cef_textfield_t;
 
 ///
-// Create a new Textfield.
+/// Create a new Textfield.
 ///
 CEF_EXPORT cef_textfield_t* cef_textfield_create(
     struct _cef_textfield_delegate_t* delegate);
diff --git a/src/include/capi/views/cef_textfield_delegate_capi.h b/src/include/capi/views/cef_textfield_delegate_capi.h
index 6442fe5..a14c0bf 100644
--- a/src/include/capi/views/cef_textfield_delegate_capi.h
+++ b/src/include/capi/views/cef_textfield_delegate_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=ba43938d4c400bcdd25e48b4f84758b18609813b$
+// $hash=482b091326684014bd799fef864e3dfdfc8693a1$
 //
 
 #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_TEXTFIELD_DELEGATE_CAPI_H_
@@ -49,27 +49,27 @@
 struct _cef_textfield_t;
 
 ///
-// Implement this structure to handle Textfield events. The functions of this
-// structure will be called on the browser process UI thread unless otherwise
-// indicated.
+/// Implement this structure to handle Textfield events. The functions of this
+/// structure will be called on the browser process UI thread unless otherwise
+/// indicated.
 ///
 typedef struct _cef_textfield_delegate_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_view_delegate_t base;
 
   ///
-  // Called when |textfield| recieves a keyboard event. |event| contains
-  // information about the keyboard event. Return true (1) if the keyboard event
-  // was handled or false (0) otherwise for default handling.
+  /// Called when |textfield| recieves a keyboard event. |event| contains
+  /// information about the keyboard event. Return true (1) if the keyboard
+  /// event was handled or false (0) otherwise for default handling.
   ///
   int(CEF_CALLBACK* on_key_event)(struct _cef_textfield_delegate_t* self,
                                   struct _cef_textfield_t* textfield,
-                                  const struct _cef_key_event_t* event);
+                                  const cef_key_event_t* event);
 
   ///
-  // Called after performing a user action that may change |textfield|.
+  /// Called after performing a user action that may change |textfield|.
   ///
   void(CEF_CALLBACK* on_after_user_action)(
       struct _cef_textfield_delegate_t* self,
diff --git a/src/include/capi/views/cef_view_capi.h b/src/include/capi/views/cef_view_capi.h
index e50c73d..5372f61 100644
--- a/src/include/capi/views/cef_view_capi.h
+++ b/src/include/capi/views/cef_view_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=45b421dfcf8ee7cf61b1991a336bc65d33fbe10a$
+// $hash=cb5950b283944d06312903eb554cc4c980713e98$
 //
 
 #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_VIEW_CAPI_H_
@@ -54,328 +54,352 @@
 struct _cef_window_t;
 
 ///
-// A View is a rectangle within the views View hierarchy. It is the base
-// structure for all Views. All size and position values are in density
-// independent pixels (DIP) unless otherwise indicated. Methods must be called
-// on the browser process UI thread unless otherwise indicated.
+/// A View is a rectangle within the views View hierarchy. It is the base
+/// structure for all Views. All size and position values are in density
+/// independent pixels (DIP) unless otherwise indicated. Methods must be called
+/// on the browser process UI thread unless otherwise indicated.
 ///
 typedef struct _cef_view_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Returns this View as a BrowserView or NULL if this is not a BrowserView.
+  /// Returns this View as a BrowserView or NULL if this is not a BrowserView.
   ///
   struct _cef_browser_view_t*(CEF_CALLBACK* as_browser_view)(
       struct _cef_view_t* self);
 
   ///
-  // Returns this View as a Button or NULL if this is not a Button.
+  /// Returns this View as a Button or NULL if this is not a Button.
   ///
   struct _cef_button_t*(CEF_CALLBACK* as_button)(struct _cef_view_t* self);
 
   ///
-  // Returns this View as a Panel or NULL if this is not a Panel.
+  /// Returns this View as a Panel or NULL if this is not a Panel.
   ///
   struct _cef_panel_t*(CEF_CALLBACK* as_panel)(struct _cef_view_t* self);
 
   ///
-  // Returns this View as a ScrollView or NULL if this is not a ScrollView.
+  /// Returns this View as a ScrollView or NULL if this is not a ScrollView.
   ///
   struct _cef_scroll_view_t*(CEF_CALLBACK* as_scroll_view)(
       struct _cef_view_t* self);
 
   ///
-  // Returns this View as a Textfield or NULL if this is not a Textfield.
+  /// Returns this View as a Textfield or NULL if this is not a Textfield.
   ///
   struct _cef_textfield_t*(CEF_CALLBACK* as_textfield)(
       struct _cef_view_t* self);
 
   ///
-  // Returns the type of this View as a string. Used primarily for testing
-  // purposes.
+  /// Returns the type of this View as a string. Used primarily for testing
+  /// purposes.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_type_string)(
       struct _cef_view_t* self);
 
   ///
-  // Returns a string representation of this View which includes the type and
-  // various type-specific identifying attributes. If |include_children| is true
-  // (1) any child Views will also be included. Used primarily for testing
-  // purposes.
+  /// Returns a string representation of this View which includes the type and
+  /// various type-specific identifying attributes. If |include_children| is
+  /// true (1) any child Views will also be included. Used primarily for testing
+  /// purposes.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* to_string)(struct _cef_view_t* self,
                                                  int include_children);
 
   ///
-  // Returns true (1) if this View is valid.
+  /// Returns true (1) if this View is valid.
   ///
   int(CEF_CALLBACK* is_valid)(struct _cef_view_t* self);
 
   ///
-  // Returns true (1) if this View is currently attached to another View. A View
-  // can only be attached to one View at a time.
+  /// Returns true (1) if this View is currently attached to another View. A
+  /// View can only be attached to one View at a time.
   ///
   int(CEF_CALLBACK* is_attached)(struct _cef_view_t* self);
 
   ///
-  // Returns true (1) if this View is the same as |that| View.
+  /// Returns true (1) if this View is the same as |that| View.
   ///
   int(CEF_CALLBACK* is_same)(struct _cef_view_t* self,
                              struct _cef_view_t* that);
 
   ///
-  // Returns the delegate associated with this View, if any.
+  /// Returns the delegate associated with this View, if any.
   ///
   struct _cef_view_delegate_t*(CEF_CALLBACK* get_delegate)(
       struct _cef_view_t* self);
 
   ///
-  // Returns the top-level Window hosting this View, if any.
+  /// Returns the top-level Window hosting this View, if any.
   ///
   struct _cef_window_t*(CEF_CALLBACK* get_window)(struct _cef_view_t* self);
 
   ///
-  // Returns the ID for this View.
+  /// Returns the ID for this View.
   ///
   int(CEF_CALLBACK* get_id)(struct _cef_view_t* self);
 
   ///
-  // Sets the ID for this View. ID should be unique within the subtree that you
-  // intend to search for it. 0 is the default ID for views.
+  /// Sets the ID for this View. ID should be unique within the subtree that you
+  /// intend to search for it. 0 is the default ID for views.
   ///
   void(CEF_CALLBACK* set_id)(struct _cef_view_t* self, int id);
 
   ///
-  // Returns the group id of this View, or -1 if not set.
+  /// Returns the group id of this View, or -1 if not set.
   ///
   int(CEF_CALLBACK* get_group_id)(struct _cef_view_t* self);
 
   ///
-  // A group id is used to tag Views which are part of the same logical group.
-  // Focus can be moved between views with the same group using the arrow keys.
-  // The group id is immutable once it's set.
+  /// A group id is used to tag Views which are part of the same logical group.
+  /// Focus can be moved between views with the same group using the arrow keys.
+  /// The group id is immutable once it's set.
   ///
   void(CEF_CALLBACK* set_group_id)(struct _cef_view_t* self, int group_id);
 
   ///
-  // Returns the View that contains this View, if any.
+  /// Returns the View that contains this View, if any.
   ///
   struct _cef_view_t*(CEF_CALLBACK* get_parent_view)(struct _cef_view_t* self);
 
   ///
-  // Recursively descends the view tree starting at this View, and returns the
-  // first child that it encounters with the given ID. Returns NULL if no
-  // matching child view is found.
+  /// Recursively descends the view tree starting at this View, and returns the
+  /// first child that it encounters with the given ID. Returns NULL if no
+  /// matching child view is found.
   ///
   struct _cef_view_t*(CEF_CALLBACK* get_view_for_id)(struct _cef_view_t* self,
                                                      int id);
 
   ///
-  // Sets the bounds (size and position) of this View. Position is in parent
-  // coordinates.
+  /// Sets the bounds (size and position) of this View. |bounds| is in parent
+  /// coordinates, or DIP screen coordinates if there is no parent.
   ///
   void(CEF_CALLBACK* set_bounds)(struct _cef_view_t* self,
                                  const cef_rect_t* bounds);
 
   ///
-  // Returns the bounds (size and position) of this View. Position is in parent
-  // coordinates.
+  /// Returns the bounds (size and position) of this View in parent coordinates,
+  /// or DIP screen coordinates if there is no parent.
   ///
   cef_rect_t(CEF_CALLBACK* get_bounds)(struct _cef_view_t* self);
 
   ///
-  // Returns the bounds (size and position) of this View. Position is in screen
-  // coordinates.
+  /// Returns the bounds (size and position) of this View in DIP screen
+  /// coordinates.
   ///
   cef_rect_t(CEF_CALLBACK* get_bounds_in_screen)(struct _cef_view_t* self);
 
   ///
-  // Sets the size of this View without changing the position.
+  /// Sets the size of this View without changing the position. |size| in parent
+  /// coordinates, or DIP screen coordinates if there is no parent.
   ///
   void(CEF_CALLBACK* set_size)(struct _cef_view_t* self,
                                const cef_size_t* size);
 
   ///
-  // Returns the size of this View.
+  /// Returns the size of this View in parent coordinates, or DIP screen
+  /// coordinates if there is no parent.
   ///
   cef_size_t(CEF_CALLBACK* get_size)(struct _cef_view_t* self);
 
   ///
-  // Sets the position of this View without changing the size. |position| is in
-  // parent coordinates.
+  /// Sets the position of this View without changing the size. |position| is in
+  /// parent coordinates, or DIP screen coordinates if there is no parent.
   ///
   void(CEF_CALLBACK* set_position)(struct _cef_view_t* self,
                                    const cef_point_t* position);
 
   ///
-  // Returns the position of this View. Position is in parent coordinates.
+  /// Returns the position of this View. Position is in parent coordinates, or
+  /// DIP screen coordinates if there is no parent.
   ///
   cef_point_t(CEF_CALLBACK* get_position)(struct _cef_view_t* self);
 
   ///
-  // Returns the size this View would like to be if enough space is available.
+  /// Sets the insets for this View. |insets| is in parent coordinates, or DIP
+  /// screen coordinates if there is no parent.
+  ///
+  void(CEF_CALLBACK* set_insets)(struct _cef_view_t* self,
+                                 const cef_insets_t* insets);
+
+  ///
+  /// Returns the insets for this View in parent coordinates, or DIP screen
+  /// coordinates if there is no parent.
+  ///
+  cef_insets_t(CEF_CALLBACK* get_insets)(struct _cef_view_t* self);
+
+  ///
+  /// Returns the size this View would like to be if enough space is available.
+  /// Size is in parent coordinates, or DIP screen coordinates if there is no
+  /// parent.
   ///
   cef_size_t(CEF_CALLBACK* get_preferred_size)(struct _cef_view_t* self);
 
   ///
-  // Size this View to its preferred size.
+  /// Size this View to its preferred size. Size is in parent coordinates, or
+  /// DIP screen coordinates if there is no parent.
   ///
   void(CEF_CALLBACK* size_to_preferred_size)(struct _cef_view_t* self);
 
   ///
-  // Returns the minimum size for this View.
+  /// Returns the minimum size for this View. Size is in parent coordinates, or
+  /// DIP screen coordinates if there is no parent.
   ///
   cef_size_t(CEF_CALLBACK* get_minimum_size)(struct _cef_view_t* self);
 
   ///
-  // Returns the maximum size for this View.
+  /// Returns the maximum size for this View. Size is in parent coordinates, or
+  /// DIP screen coordinates if there is no parent.
   ///
   cef_size_t(CEF_CALLBACK* get_maximum_size)(struct _cef_view_t* self);
 
   ///
-  // Returns the height necessary to display this View with the provided width.
+  /// Returns the height necessary to display this View with the provided width.
   ///
   int(CEF_CALLBACK* get_height_for_width)(struct _cef_view_t* self, int width);
 
   ///
-  // Indicate that this View and all parent Views require a re-layout. This
-  // ensures the next call to layout() will propagate to this View even if the
-  // bounds of parent Views do not change.
+  /// Indicate that this View and all parent Views require a re-layout. This
+  /// ensures the next call to layout() will propagate to this View even if the
+  /// bounds of parent Views do not change.
   ///
   void(CEF_CALLBACK* invalidate_layout)(struct _cef_view_t* self);
 
   ///
-  // Sets whether this View is visible. Windows are hidden by default and other
-  // views are visible by default. This View and any parent views must be set as
-  // visible for this View to be drawn in a Window. If this View is set as
-  // hidden then it and any child views will not be drawn and, if any of those
-  // views currently have focus, then focus will also be cleared. Painting is
-  // scheduled as needed. If this View is a Window then calling this function is
-  // equivalent to calling the Window show() and hide() functions.
+  /// Sets whether this View is visible. Windows are hidden by default and other
+  /// views are visible by default. This View and any parent views must be set
+  /// as visible for this View to be drawn in a Window. If this View is set as
+  /// hidden then it and any child views will not be drawn and, if any of those
+  /// views currently have focus, then focus will also be cleared. Painting is
+  /// scheduled as needed. If this View is a Window then calling this function
+  /// is equivalent to calling the Window show() and hide() functions.
   ///
   void(CEF_CALLBACK* set_visible)(struct _cef_view_t* self, int visible);
 
   ///
-  // Returns whether this View is visible. A view may be visible but still not
-  // drawn in a Window if any parent views are hidden. If this View is a Window
-  // then a return value of true (1) indicates that this Window is currently
-  // visible to the user on-screen. If this View is not a Window then call
-  // is_drawn() to determine whether this View and all parent views are visible
-  // and will be drawn.
+  /// Returns whether this View is visible. A view may be visible but still not
+  /// drawn in a Window if any parent views are hidden. If this View is a Window
+  /// then a return value of true (1) indicates that this Window is currently
+  /// visible to the user on-screen. If this View is not a Window then call
+  /// is_drawn() to determine whether this View and all parent views are visible
+  /// and will be drawn.
   ///
   int(CEF_CALLBACK* is_visible)(struct _cef_view_t* self);
 
   ///
-  // Returns whether this View is visible and drawn in a Window. A view is drawn
-  // if it and all parent views are visible. If this View is a Window then
-  // calling this function is equivalent to calling is_visible(). Otherwise, to
-  // determine if the containing Window is visible to the user on-screen call
-  // is_visible() on the Window.
+  /// Returns whether this View is visible and drawn in a Window. A view is
+  /// drawn if it and all parent views are visible. If this View is a Window
+  /// then calling this function is equivalent to calling is_visible().
+  /// Otherwise, to determine if the containing Window is visible to the user
+  /// on-screen call is_visible() on the Window.
   ///
   int(CEF_CALLBACK* is_drawn)(struct _cef_view_t* self);
 
   ///
-  // Set whether this View is enabled. A disabled View does not receive keyboard
-  // or mouse inputs. If |enabled| differs from the current value the View will
-  // be repainted. Also, clears focus if the focused View is disabled.
+  /// Set whether this View is enabled. A disabled View does not receive
+  /// keyboard or mouse inputs. If |enabled| differs from the current value the
+  /// View will be repainted. Also, clears focus if the focused View is
+  /// disabled.
   ///
   void(CEF_CALLBACK* set_enabled)(struct _cef_view_t* self, int enabled);
 
   ///
-  // Returns whether this View is enabled.
+  /// Returns whether this View is enabled.
   ///
   int(CEF_CALLBACK* is_enabled)(struct _cef_view_t* self);
 
   ///
-  // Sets whether this View is capable of taking focus. It will clear focus if
-  // the focused View is set to be non-focusable. This is false (0) by default
-  // so that a View used as a container does not get the focus.
+  /// Sets whether this View is capable of taking focus. It will clear focus if
+  /// the focused View is set to be non-focusable. This is false (0) by default
+  /// so that a View used as a container does not get the focus.
   ///
   void(CEF_CALLBACK* set_focusable)(struct _cef_view_t* self, int focusable);
 
   ///
-  // Returns true (1) if this View is focusable, enabled and drawn.
+  /// Returns true (1) if this View is focusable, enabled and drawn.
   ///
   int(CEF_CALLBACK* is_focusable)(struct _cef_view_t* self);
 
   ///
-  // Return whether this View is focusable when the user requires full keyboard
-  // access, even though it may not be normally focusable.
+  /// Return whether this View is focusable when the user requires full keyboard
+  /// access, even though it may not be normally focusable.
   ///
   int(CEF_CALLBACK* is_accessibility_focusable)(struct _cef_view_t* self);
 
   ///
-  // Request keyboard focus. If this View is focusable it will become the
-  // focused View.
+  /// Request keyboard focus. If this View is focusable it will become the
+  /// focused View.
   ///
   void(CEF_CALLBACK* request_focus)(struct _cef_view_t* self);
 
   ///
-  // Sets the background color for this View.
+  /// Sets the background color for this View.
   ///
   void(CEF_CALLBACK* set_background_color)(struct _cef_view_t* self,
                                            cef_color_t color);
 
   ///
-  // Returns the background color for this View.
+  /// Returns the background color for this View.
   ///
   cef_color_t(CEF_CALLBACK* get_background_color)(struct _cef_view_t* self);
 
   ///
-  // Convert |point| from this View's coordinate system to that of the screen.
-  // This View must belong to a Window when calling this function. Returns true
-  // (1) if the conversion is successful or false (0) otherwise. Use
-  // cef_display_t::convert_point_to_pixels() after calling this function if
-  // further conversion to display-specific pixel coordinates is desired.
+  /// Convert |point| from this View's coordinate system to DIP screen
+  /// coordinates. This View must belong to a Window when calling this function.
+  /// Returns true (1) if the conversion is successful or false (0) otherwise.
+  /// Use cef_display_t::convert_point_to_pixels() after calling this function
+  /// if further conversion to display-specific pixel coordinates is desired.
   ///
   int(CEF_CALLBACK* convert_point_to_screen)(struct _cef_view_t* self,
                                              cef_point_t* point);
 
   ///
-  // Convert |point| to this View's coordinate system from that of the screen.
-  // This View must belong to a Window when calling this function. Returns true
-  // (1) if the conversion is successful or false (0) otherwise. Use
-  // cef_display_t::convert_point_from_pixels() before calling this function if
-  // conversion from display-specific pixel coordinates is necessary.
+  /// Convert |point| to this View's coordinate system from DIP screen
+  /// coordinates. This View must belong to a Window when calling this function.
+  /// Returns true (1) if the conversion is successful or false (0) otherwise.
+  /// Use cef_display_t::convert_point_from_pixels() before calling this
+  /// function if conversion from display-specific pixel coordinates is
+  /// necessary.
   ///
   int(CEF_CALLBACK* convert_point_from_screen)(struct _cef_view_t* self,
                                                cef_point_t* point);
 
   ///
-  // Convert |point| from this View's coordinate system to that of the Window.
-  // This View must belong to a Window when calling this function. Returns true
-  // (1) if the conversion is successful or false (0) otherwise.
+  /// Convert |point| from this View's coordinate system to that of the Window.
+  /// This View must belong to a Window when calling this function. Returns true
+  /// (1) if the conversion is successful or false (0) otherwise.
   ///
   int(CEF_CALLBACK* convert_point_to_window)(struct _cef_view_t* self,
                                              cef_point_t* point);
 
   ///
-  // Convert |point| to this View's coordinate system from that of the Window.
-  // This View must belong to a Window when calling this function. Returns true
-  // (1) if the conversion is successful or false (0) otherwise.
+  /// Convert |point| to this View's coordinate system from that of the Window.
+  /// This View must belong to a Window when calling this function. Returns true
+  /// (1) if the conversion is successful or false (0) otherwise.
   ///
   int(CEF_CALLBACK* convert_point_from_window)(struct _cef_view_t* self,
                                                cef_point_t* point);
 
   ///
-  // Convert |point| from this View's coordinate system to that of |view|.
-  // |view| needs to be in the same Window but not necessarily the same view
-  // hierarchy. Returns true (1) if the conversion is successful or false (0)
-  // otherwise.
+  /// Convert |point| from this View's coordinate system to that of |view|.
+  /// |view| needs to be in the same Window but not necessarily the same view
+  /// hierarchy. Returns true (1) if the conversion is successful or false (0)
+  /// otherwise.
   ///
   int(CEF_CALLBACK* convert_point_to_view)(struct _cef_view_t* self,
                                            struct _cef_view_t* view,
                                            cef_point_t* point);
 
   ///
-  // Convert |point| to this View's coordinate system from that |view|. |view|
-  // needs to be in the same Window but not necessarily the same view hierarchy.
-  // Returns true (1) if the conversion is successful or false (0) otherwise.
+  /// Convert |point| to this View's coordinate system from that |view|. |view|
+  /// needs to be in the same Window but not necessarily the same view
+  /// hierarchy. Returns true (1) if the conversion is successful or false (0)
+  /// otherwise.
   ///
   int(CEF_CALLBACK* convert_point_from_view)(struct _cef_view_t* self,
                                              struct _cef_view_t* view,
diff --git a/src/include/capi/views/cef_view_delegate_capi.h b/src/include/capi/views/cef_view_delegate_capi.h
index 585f166..4f4b8f0 100644
--- a/src/include/capi/views/cef_view_delegate_capi.h
+++ b/src/include/capi/views/cef_view_delegate_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=52cd273ebe5d458482a830c8ca777907c6c21cc2$
+// $hash=70646cb55b5bf98ccfa2a93b2cf57bd5ba367268$
 //
 
 #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_VIEW_DELEGATE_CAPI_H_
@@ -49,52 +49,53 @@
 struct _cef_view_t;
 
 ///
-// Implement this structure to handle view events. The functions of this
-// structure will be called on the browser process UI thread unless otherwise
-// indicated.
+/// Implement this structure to handle view events. All size and position values
+/// are in density independent pixels (DIP) unless otherwise indicated. The
+/// functions of this structure will be called on the browser process UI thread
+/// unless otherwise indicated.
 ///
 typedef struct _cef_view_delegate_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_base_ref_counted_t base;
 
   ///
-  // Return the preferred size for |view|. The Layout will use this information
-  // to determine the display size.
+  /// Return the preferred size for |view|. The Layout will use this information
+  /// to determine the display size.
   ///
   cef_size_t(CEF_CALLBACK* get_preferred_size)(
       struct _cef_view_delegate_t* self,
       struct _cef_view_t* view);
 
   ///
-  // Return the minimum size for |view|.
+  /// Return the minimum size for |view|.
   ///
   cef_size_t(CEF_CALLBACK* get_minimum_size)(struct _cef_view_delegate_t* self,
                                              struct _cef_view_t* view);
 
   ///
-  // Return the maximum size for |view|.
+  /// Return the maximum size for |view|.
   ///
   cef_size_t(CEF_CALLBACK* get_maximum_size)(struct _cef_view_delegate_t* self,
                                              struct _cef_view_t* view);
 
   ///
-  // Return the height necessary to display |view| with the provided |width|. If
-  // not specified the result of get_preferred_size().height will be used by
-  // default. Override if |view|'s preferred height depends upon the width (for
-  // example, with Labels).
+  /// Return the height necessary to display |view| with the provided |width|.
+  /// If not specified the result of get_preferred_size().height will be used by
+  /// default. Override if |view|'s preferred height depends upon the width (for
+  /// example, with Labels).
   ///
   int(CEF_CALLBACK* get_height_for_width)(struct _cef_view_delegate_t* self,
                                           struct _cef_view_t* view,
                                           int width);
 
   ///
-  // Called when the parent of |view| has changed. If |view| is being added to
-  // |parent| then |added| will be true (1). If |view| is being removed from
-  // |parent| then |added| will be false (0). If |view| is being reparented the
-  // remove notification will be sent before the add notification. Do not modify
-  // the view hierarchy in this callback.
+  /// Called when the parent of |view| has changed. If |view| is being added to
+  /// |parent| then |added| will be true (1). If |view| is being removed from
+  /// |parent| then |added| will be false (0). If |view| is being reparented the
+  /// remove notification will be sent before the add notification. Do not
+  /// modify the view hierarchy in this callback.
   ///
   void(CEF_CALLBACK* on_parent_view_changed)(struct _cef_view_delegate_t* self,
                                              struct _cef_view_t* view,
@@ -102,12 +103,12 @@
                                              struct _cef_view_t* parent);
 
   ///
-  // Called when a child of |view| has changed. If |child| is being added to
-  // |view| then |added| will be true (1). If |child| is being removed from
-  // |view| then |added| will be false (0). If |child| is being reparented the
-  // remove notification will be sent to the old parent before the add
-  // notification is sent to the new parent. Do not modify the view hierarchy in
-  // this callback.
+  /// Called when a child of |view| has changed. If |child| is being added to
+  /// |view| then |added| will be true (1). If |child| is being removed from
+  /// |view| then |added| will be false (0). If |child| is being reparented the
+  /// remove notification will be sent to the old parent before the add
+  /// notification is sent to the new parent. Do not modify the view hierarchy
+  /// in this callback.
   ///
   void(CEF_CALLBACK* on_child_view_changed)(struct _cef_view_delegate_t* self,
                                             struct _cef_view_t* view,
@@ -115,13 +116,27 @@
                                             struct _cef_view_t* child);
 
   ///
-  // Called when |view| gains focus.
+  /// Called when |view| is added or removed from the cef_window_t.
+  ///
+  void(CEF_CALLBACK* on_window_changed)(struct _cef_view_delegate_t* self,
+                                        struct _cef_view_t* view,
+                                        int added);
+
+  ///
+  /// Called when the layout of |view| has changed.
+  ///
+  void(CEF_CALLBACK* on_layout_changed)(struct _cef_view_delegate_t* self,
+                                        struct _cef_view_t* view,
+                                        const cef_rect_t* new_bounds);
+
+  ///
+  /// Called when |view| gains focus.
   ///
   void(CEF_CALLBACK* on_focus)(struct _cef_view_delegate_t* self,
                                struct _cef_view_t* view);
 
   ///
-  // Called when |view| loses focus.
+  /// Called when |view| loses focus.
   ///
   void(CEF_CALLBACK* on_blur)(struct _cef_view_delegate_t* self,
                               struct _cef_view_t* view);
diff --git a/src/include/capi/views/cef_window_capi.h b/src/include/capi/views/cef_window_capi.h
index a62fda5..72aba00 100644
--- a/src/include/capi/views/cef_window_capi.h
+++ b/src/include/capi/views/cef_window_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=adedd44a4276c3900bce9abc7dc434411407143c$
+// $hash=a48904fcd0f6be07e27839922d8feb07271ed2b5$
 //
 
 #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_WINDOW_CAPI_H_
@@ -43,6 +43,7 @@
 #include "include/capi/cef_image_capi.h"
 #include "include/capi/cef_menu_model_capi.h"
 #include "include/capi/views/cef_display_capi.h"
+#include "include/capi/views/cef_overlay_controller_capi.h"
 #include "include/capi/views/cef_panel_capi.h"
 #include "include/capi/views/cef_window_delegate_capi.h"
 
@@ -50,157 +51,210 @@
 extern "C" {
 #endif
 
+struct _cef_browser_view_t;
+
 ///
-// A Window is a top-level Window/widget in the Views hierarchy. By default it
-// will have a non-client area with title bar, icon and buttons that supports
-// moving and resizing. All size and position values are in density independent
-// pixels (DIP) unless otherwise indicated. Methods must be called on the
-// browser process UI thread unless otherwise indicated.
+/// A Window is a top-level Window/widget in the Views hierarchy. By default it
+/// will have a non-client area with title bar, icon and buttons that supports
+/// moving and resizing. All size and position values are in density independent
+/// pixels (DIP) unless otherwise indicated. Methods must be called on the
+/// browser process UI thread unless otherwise indicated.
 ///
 typedef struct _cef_window_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_panel_t base;
 
   ///
-  // Show the Window.
+  /// Show the Window.
   ///
   void(CEF_CALLBACK* show)(struct _cef_window_t* self);
 
   ///
-  // Hide the Window.
+  /// Show the Window as a browser modal dialog relative to |browser_view|. A
+  /// parent Window must be returned via
+  /// cef_window_delegate_t::get_parent_window() and |browser_view| must belong
+  /// to that parent Window. While this Window is visible, |browser_view| will
+  /// be disabled while other controls in the parent Window remain enabled.
+  /// Navigating or destroying the |browser_view| will close this Window
+  /// automatically. Alternately, use show() and return true (1) from
+  /// cef_window_delegate_t::is_window_modal_dialog() for a window modal dialog
+  /// where all controls in the parent Window are disabled.
+  ///
+  void(CEF_CALLBACK* show_as_browser_modal_dialog)(
+      struct _cef_window_t* self,
+      struct _cef_browser_view_t* browser_view);
+
+  ///
+  /// Hide the Window.
   ///
   void(CEF_CALLBACK* hide)(struct _cef_window_t* self);
 
   ///
-  // Sizes the Window to |size| and centers it in the current display.
+  /// Sizes the Window to |size| and centers it in the current display.
   ///
   void(CEF_CALLBACK* center_window)(struct _cef_window_t* self,
                                     const cef_size_t* size);
 
   ///
-  // Close the Window.
+  /// Close the Window.
   ///
   void(CEF_CALLBACK* close)(struct _cef_window_t* self);
 
   ///
-  // Returns true (1) if the Window has been closed.
+  /// Returns true (1) if the Window has been closed.
   ///
   int(CEF_CALLBACK* is_closed)(struct _cef_window_t* self);
 
   ///
-  // Activate the Window, assuming it already exists and is visible.
+  /// Activate the Window, assuming it already exists and is visible.
   ///
   void(CEF_CALLBACK* activate)(struct _cef_window_t* self);
 
   ///
-  // Deactivate the Window, making the next Window in the Z order the active
-  // Window.
+  /// Deactivate the Window, making the next Window in the Z order the active
+  /// Window.
   ///
   void(CEF_CALLBACK* deactivate)(struct _cef_window_t* self);
 
   ///
-  // Returns whether the Window is the currently active Window.
+  /// Returns whether the Window is the currently active Window.
   ///
   int(CEF_CALLBACK* is_active)(struct _cef_window_t* self);
 
   ///
-  // Bring this Window to the top of other Windows in the Windowing system.
+  /// Bring this Window to the top of other Windows in the Windowing system.
   ///
   void(CEF_CALLBACK* bring_to_top)(struct _cef_window_t* self);
 
   ///
-  // Set the Window to be on top of other Windows in the Windowing system.
+  /// Set the Window to be on top of other Windows in the Windowing system.
   ///
   void(CEF_CALLBACK* set_always_on_top)(struct _cef_window_t* self, int on_top);
 
   ///
-  // Returns whether the Window has been set to be on top of other Windows in
-  // the Windowing system.
+  /// Returns whether the Window has been set to be on top of other Windows in
+  /// the Windowing system.
   ///
   int(CEF_CALLBACK* is_always_on_top)(struct _cef_window_t* self);
 
   ///
-  // Maximize the Window.
+  /// Maximize the Window.
   ///
   void(CEF_CALLBACK* maximize)(struct _cef_window_t* self);
 
   ///
-  // Minimize the Window.
+  /// Minimize the Window.
   ///
   void(CEF_CALLBACK* minimize)(struct _cef_window_t* self);
 
   ///
-  // Restore the Window.
+  /// Restore the Window.
   ///
   void(CEF_CALLBACK* restore)(struct _cef_window_t* self);
 
   ///
-  // Set fullscreen Window state.
+  /// Set fullscreen Window state. The
+  /// cef_window_delegate_t::OnWindowFullscreenTransition function will be
+  /// called during the fullscreen transition for notification purposes.
   ///
   void(CEF_CALLBACK* set_fullscreen)(struct _cef_window_t* self,
                                      int fullscreen);
 
   ///
-  // Returns true (1) if the Window is maximized.
+  /// Returns true (1) if the Window is maximized.
   ///
   int(CEF_CALLBACK* is_maximized)(struct _cef_window_t* self);
 
   ///
-  // Returns true (1) if the Window is minimized.
+  /// Returns true (1) if the Window is minimized.
   ///
   int(CEF_CALLBACK* is_minimized)(struct _cef_window_t* self);
 
   ///
-  // Returns true (1) if the Window is fullscreen.
+  /// Returns true (1) if the Window is fullscreen.
   ///
   int(CEF_CALLBACK* is_fullscreen)(struct _cef_window_t* self);
 
   ///
-  // Set the Window title.
+  /// Set the Window title.
   ///
   void(CEF_CALLBACK* set_title)(struct _cef_window_t* self,
                                 const cef_string_t* title);
 
   ///
-  // Get the Window title.
+  /// Get the Window title.
   ///
   // The resulting string must be freed by calling cef_string_userfree_free().
   cef_string_userfree_t(CEF_CALLBACK* get_title)(struct _cef_window_t* self);
 
   ///
-  // Set the Window icon. This should be a 16x16 icon suitable for use in the
-  // Windows's title bar.
+  /// Set the Window icon. This should be a 16x16 icon suitable for use in the
+  /// Windows's title bar.
   ///
   void(CEF_CALLBACK* set_window_icon)(struct _cef_window_t* self,
                                       struct _cef_image_t* image);
 
   ///
-  // Get the Window icon.
+  /// Get the Window icon.
   ///
   struct _cef_image_t*(CEF_CALLBACK* get_window_icon)(
       struct _cef_window_t* self);
 
   ///
-  // Set the Window App icon. This should be a larger icon for use in the host
-  // environment app switching UI. On Windows, this is the ICON_BIG used in Alt-
-  // Tab list and Windows taskbar. The Window icon will be used by default if no
-  // Window App icon is specified.
+  /// Set the Window App icon. This should be a larger icon for use in the host
+  /// environment app switching UI. On Windows, this is the ICON_BIG used in
+  /// Alt-Tab list and Windows taskbar. The Window icon will be used by default
+  /// if no Window App icon is specified.
   ///
   void(CEF_CALLBACK* set_window_app_icon)(struct _cef_window_t* self,
                                           struct _cef_image_t* image);
 
   ///
-  // Get the Window App icon.
+  /// Get the Window App icon.
   ///
   struct _cef_image_t*(CEF_CALLBACK* get_window_app_icon)(
       struct _cef_window_t* self);
 
   ///
-  // Show a menu with contents |menu_model|. |screen_point| specifies the menu
-  // position in screen coordinates. |anchor_position| specifies how the menu
-  // will be anchored relative to |screen_point|.
+  /// Add a View that will be overlayed on the Window contents with absolute
+  /// positioning and high z-order. Positioning is controlled by |docking_mode|
+  /// as described below. The returned cef_overlay_controller_t object is used
+  /// to control the overlay. Overlays are hidden by default.
+  ///
+  /// With CEF_DOCKING_MODE_CUSTOM:
+  ///   1. The overlay is initially hidden, sized to |view|'s preferred size,
+  ///      and positioned in the top-left corner.
+  ///   2. Optionally change the overlay position and/or size by calling
+  ///      CefOverlayController methods.
+  ///   3. Call CefOverlayController::SetVisible(true) to show the overlay.
+  ///   4. The overlay will be automatically re-sized if |view|'s layout
+  ///      changes. Optionally change the overlay position and/or size when
+  ///      OnLayoutChanged is called on the Window's delegate to indicate a
+  ///      change in Window bounds.
+  ///
+  /// With other docking modes:
+  ///   1. The overlay is initially hidden, sized to |view|'s preferred size,
+  ///      and positioned based on |docking_mode|.
+  ///   2. Call CefOverlayController::SetVisible(true) to show the overlay.
+  ///   3. The overlay will be automatically re-sized if |view|'s layout changes
+  ///      and re-positioned as appropriate when the Window resizes.
+  ///
+  /// Overlays created by this function will receive a higher z-order then any
+  /// child Views added previously. It is therefore recommended to call this
+  /// function last after all other child Views have been added so that the
+  /// overlay displays as the top-most child of the Window.
+  ///
+  struct _cef_overlay_controller_t*(CEF_CALLBACK* add_overlay_view)(
+      struct _cef_window_t* self,
+      struct _cef_view_t* view,
+      cef_docking_mode_t docking_mode);
+
+  ///
+  /// Show a menu with contents |menu_model|. |screen_point| specifies the menu
+  /// position in screen coordinates. |anchor_position| specifies how the menu
+  /// will be anchored relative to |screen_point|.
   ///
   void(CEF_CALLBACK* show_menu)(struct _cef_window_t* self,
                                 struct _cef_menu_model_t* menu_model,
@@ -208,28 +262,28 @@
                                 cef_menu_anchor_position_t anchor_position);
 
   ///
-  // Cancel the menu that is currently showing, if any.
+  /// Cancel the menu that is currently showing, if any.
   ///
   void(CEF_CALLBACK* cancel_menu)(struct _cef_window_t* self);
 
   ///
-  // Returns the Display that most closely intersects the bounds of this Window.
-  // May return NULL if this Window is not currently displayed.
+  /// Returns the Display that most closely intersects the bounds of this
+  /// Window. May return NULL if this Window is not currently displayed.
   ///
   struct _cef_display_t*(CEF_CALLBACK* get_display)(struct _cef_window_t* self);
 
   ///
-  // Returns the bounds (size and position) of this Window's client area.
-  // Position is in screen coordinates.
+  /// Returns the bounds (size and position) of this Window's client area.
+  /// Position is in screen coordinates.
   ///
   cef_rect_t(CEF_CALLBACK* get_client_area_bounds_in_screen)(
       struct _cef_window_t* self);
 
   ///
-  // Set the regions where mouse events will be intercepted by this Window to
-  // support drag operations. Call this function with an NULL vector to clear
-  // the draggable regions. The draggable region bounds should be in window
-  // coordinates.
+  /// Set the regions where mouse events will be intercepted by this Window to
+  /// support drag operations. Call this function with an NULL vector to clear
+  /// the draggable regions. The draggable region bounds should be in window
+  /// coordinates.
   ///
   void(CEF_CALLBACK* set_draggable_regions)(
       struct _cef_window_t* self,
@@ -237,39 +291,39 @@
       cef_draggable_region_t const* regions);
 
   ///
-  // Retrieve the platform window handle for this Window.
+  /// Retrieve the platform window handle for this Window.
   ///
   cef_window_handle_t(CEF_CALLBACK* get_window_handle)(
       struct _cef_window_t* self);
 
   ///
-  // Simulate a key press. |key_code| is the VKEY_* value from Chromium's
-  // ui/events/keycodes/keyboard_codes.h header (VK_* values on Windows).
-  // |event_flags| is some combination of EVENTFLAG_SHIFT_DOWN,
-  // EVENTFLAG_CONTROL_DOWN and/or EVENTFLAG_ALT_DOWN. This function is exposed
-  // primarily for testing purposes.
+  /// Simulate a key press. |key_code| is the VKEY_* value from Chromium's
+  /// ui/events/keycodes/keyboard_codes.h header (VK_* values on Windows).
+  /// |event_flags| is some combination of EVENTFLAG_SHIFT_DOWN,
+  /// EVENTFLAG_CONTROL_DOWN and/or EVENTFLAG_ALT_DOWN. This function is exposed
+  /// primarily for testing purposes.
   ///
   void(CEF_CALLBACK* send_key_press)(struct _cef_window_t* self,
                                      int key_code,
-                                     uint32 event_flags);
+                                     uint32_t event_flags);
 
   ///
-  // Simulate a mouse move. The mouse cursor will be moved to the specified
-  // (screen_x, screen_y) position. This function is exposed primarily for
-  // testing purposes.
+  /// Simulate a mouse move. The mouse cursor will be moved to the specified
+  /// (screen_x, screen_y) position. This function is exposed primarily for
+  /// testing purposes.
   ///
   void(CEF_CALLBACK* send_mouse_move)(struct _cef_window_t* self,
                                       int screen_x,
                                       int screen_y);
 
   ///
-  // Simulate mouse down and/or mouse up events. |button| is the mouse button
-  // type. If |mouse_down| is true (1) a mouse down event will be sent. If
-  // |mouse_up| is true (1) a mouse up event will be sent. If both are true (1)
-  // a mouse down event will be sent followed by a mouse up event (equivalent to
-  // clicking the mouse button). The events will be sent using the current
-  // cursor position so make sure to call send_mouse_move() first to position
-  // the mouse. This function is exposed primarily for testing purposes.
+  /// Simulate mouse down and/or mouse up events. |button| is the mouse button
+  /// type. If |mouse_down| is true (1) a mouse down event will be sent. If
+  /// |mouse_up| is true (1) a mouse up event will be sent. If both are true (1)
+  /// a mouse down event will be sent followed by a mouse up event (equivalent
+  /// to clicking the mouse button). The events will be sent using the current
+  /// cursor position so make sure to call send_mouse_move() first to position
+  /// the mouse. This function is exposed primarily for testing purposes.
   ///
   void(CEF_CALLBACK* send_mouse_events)(struct _cef_window_t* self,
                                         cef_mouse_button_type_t button,
@@ -277,32 +331,41 @@
                                         int mouse_up);
 
   ///
-  // Set the keyboard accelerator for the specified |command_id|. |key_code| can
-  // be any virtual key or character value. cef_window_delegate_t::OnAccelerator
-  // will be called if the keyboard combination is triggered while this window
-  // has focus.
+  /// Set the keyboard accelerator for the specified |command_id|. |key_code|
+  /// can be any virtual key or character value. Required modifier keys are
+  /// specified by |shift_pressed|, |ctrl_pressed| and/or |alt_pressed|.
+  /// cef_window_delegate_t::OnAccelerator will be called if the keyboard
+  /// combination is triggered while this window has focus.
+  ///
+  /// The |high_priority| value will be considered if a child cef_browser_view_t
+  /// has focus when the keyboard combination is triggered. If |high_priority|
+  /// is true (1) then the key event will not be forwarded to the web content
+  /// (`keydown` event handler) or cef_keyboard_handler_t first. If
+  /// |high_priority| is false (0) then the behavior will depend on the
+  /// cef_browser_view_t::SetPreferAccelerators configuration.
   ///
   void(CEF_CALLBACK* set_accelerator)(struct _cef_window_t* self,
                                       int command_id,
                                       int key_code,
                                       int shift_pressed,
                                       int ctrl_pressed,
-                                      int alt_pressed);
+                                      int alt_pressed,
+                                      int high_priority);
 
   ///
-  // Remove the keyboard accelerator for the specified |command_id|.
+  /// Remove the keyboard accelerator for the specified |command_id|.
   ///
   void(CEF_CALLBACK* remove_accelerator)(struct _cef_window_t* self,
                                          int command_id);
 
   ///
-  // Remove all keyboard accelerators.
+  /// Remove all keyboard accelerators.
   ///
   void(CEF_CALLBACK* remove_all_accelerators)(struct _cef_window_t* self);
 } cef_window_t;
 
 ///
-// Create a new Window.
+/// Create a new Window.
 ///
 CEF_EXPORT cef_window_t* cef_window_create_top_level(
     struct _cef_window_delegate_t* delegate);
diff --git a/src/include/capi/views/cef_window_delegate_capi.h b/src/include/capi/views/cef_window_delegate_capi.h
index c26f096..2abeb45 100644
--- a/src/include/capi/views/cef_window_delegate_capi.h
+++ b/src/include/capi/views/cef_window_delegate_capi.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -33,7 +33,7 @@
 // by hand. See the translator.README.txt file in the tools directory for
 // more information.
 //
-// $hash=a0cec778fbaf0b1f5c9b3ef75dc7bbeeba777a44$
+// $hash=456f00f7afbac910cf36feecd38399a2fb16960d$
 //
 
 #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_WINDOW_DELEGATE_CAPI_H_
@@ -49,37 +49,74 @@
 struct _cef_window_t;
 
 ///
-// Implement this structure to handle window events. The functions of this
-// structure will be called on the browser process UI thread unless otherwise
-// indicated.
+/// Implement this structure to handle window events. The functions of this
+/// structure will be called on the browser process UI thread unless otherwise
+/// indicated.
 ///
 typedef struct _cef_window_delegate_t {
   ///
-  // Base structure.
+  /// Base structure.
   ///
   cef_panel_delegate_t base;
 
   ///
-  // Called when |window| is created.
+  /// Called when |window| is created.
   ///
   void(CEF_CALLBACK* on_window_created)(struct _cef_window_delegate_t* self,
                                         struct _cef_window_t* window);
 
   ///
-  // Called when |window| is destroyed. Release all references to |window| and
-  // do not attempt to execute any functions on |window| after this callback
-  // returns.
+  /// Called when |window| is closing.
+  ///
+  void(CEF_CALLBACK* on_window_closing)(struct _cef_window_delegate_t* self,
+                                        struct _cef_window_t* window);
+
+  ///
+  /// Called when |window| is destroyed. Release all references to |window| and
+  /// do not attempt to execute any functions on |window| after this callback
+  /// returns.
   ///
   void(CEF_CALLBACK* on_window_destroyed)(struct _cef_window_delegate_t* self,
                                           struct _cef_window_t* window);
 
   ///
-  // Return the parent for |window| or NULL if the |window| does not have a
-  // parent. Windows with parents will not get a taskbar button. Set |is_menu|
-  // to true (1) if |window| will be displayed as a menu, in which case it will
-  // not be clipped to the parent window bounds. Set |can_activate_menu| to
-  // false (0) if |is_menu| is true (1) and |window| should not be activated
-  // (given keyboard focus) when displayed.
+  /// Called when |window| is activated or deactivated.
+  ///
+  void(CEF_CALLBACK* on_window_activation_changed)(
+      struct _cef_window_delegate_t* self,
+      struct _cef_window_t* window,
+      int active);
+
+  ///
+  /// Called when |window| bounds have changed. |new_bounds| will be in DIP
+  /// screen coordinates.
+  ///
+  void(CEF_CALLBACK* on_window_bounds_changed)(
+      struct _cef_window_delegate_t* self,
+      struct _cef_window_t* window,
+      const cef_rect_t* new_bounds);
+
+  ///
+  /// Called when |window| is transitioning to or from fullscreen mode. On MacOS
+  /// the transition occurs asynchronously with |is_competed| set to false (0)
+  /// when the transition starts and true (1) after the transition completes. On
+  /// other platforms the transition occurs synchronously with |is_completed|
+  /// set to true (1) after the transition completes. With the Alloy runtime you
+  /// must also implement cef_display_handler_t::OnFullscreenModeChange to
+  /// handle fullscreen transitions initiated by browser content.
+  ///
+  void(CEF_CALLBACK* on_window_fullscreen_transition)(
+      struct _cef_window_delegate_t* self,
+      struct _cef_window_t* window,
+      int is_completed);
+
+  ///
+  /// Return the parent for |window| or NULL if the |window| does not have a
+  /// parent. Windows with parents will not get a taskbar button. Set |is_menu|
+  /// to true (1) if |window| will be displayed as a menu, in which case it will
+  /// not be clipped to the parent window bounds. Set |can_activate_menu| to
+  /// false (0) if |is_menu| is true (1) and |window| should not be activated
+  /// (given keyboard focus) when displayed.
   ///
   struct _cef_window_t*(CEF_CALLBACK* get_parent_window)(
       struct _cef_window_delegate_t* self,
@@ -88,55 +125,105 @@
       int* can_activate_menu);
 
   ///
-  // Return true (1) if |window| should be created without a frame or title bar.
-  // The window will be resizable if can_resize() returns true (1). Use
-  // cef_window_t::set_draggable_regions() to specify draggable regions.
+  /// Return true (1) if |window| should be created as a window modal dialog.
+  /// Only called when a Window is returned via get_parent_window() with
+  /// |is_menu| set to false (0). All controls in the parent Window will be
+  /// disabled while |window| is visible. This functionality is not supported by
+  /// all Linux window managers. Alternately, use
+  /// cef_window_t::show_as_browser_modal_dialog() for a browser modal dialog
+  /// that works on all platforms.
+  ///
+  int(CEF_CALLBACK* is_window_modal_dialog)(struct _cef_window_delegate_t* self,
+                                            struct _cef_window_t* window);
+
+  ///
+  /// Return the initial bounds for |window| in density independent pixel (DIP)
+  /// coordinates. If this function returns an NULL CefRect then
+  /// get_preferred_size() will be called to retrieve the size, and the window
+  /// will be placed on the screen with origin (0,0). This function can be used
+  /// in combination with cef_view_t::get_bounds_in_screen() to restore the
+  /// previous window bounds.
+  ///
+  cef_rect_t(CEF_CALLBACK* get_initial_bounds)(
+      struct _cef_window_delegate_t* self,
+      struct _cef_window_t* window);
+
+  ///
+  /// Return the initial show state for |window|.
+  ///
+  cef_show_state_t(CEF_CALLBACK* get_initial_show_state)(
+      struct _cef_window_delegate_t* self,
+      struct _cef_window_t* window);
+
+  ///
+  /// Return true (1) if |window| should be created without a frame or title
+  /// bar. The window will be resizable if can_resize() returns true (1). Use
+  /// cef_window_t::set_draggable_regions() to specify draggable regions.
   ///
   int(CEF_CALLBACK* is_frameless)(struct _cef_window_delegate_t* self,
                                   struct _cef_window_t* window);
 
   ///
-  // Return true (1) if |window| can be resized.
+  /// Return true (1) if |window| should be created with standard window buttons
+  /// like close, minimize and zoom. This function is only supported on macOS.
+  ///
+  int(CEF_CALLBACK* with_standard_window_buttons)(
+      struct _cef_window_delegate_t* self,
+      struct _cef_window_t* window);
+
+  ///
+  /// Return whether the titlebar height should be overridden, and sets the
+  /// height of the titlebar in |titlebar_height|. On macOS, it can also be used
+  /// to adjust the vertical position of the traffic light buttons in frameless
+  /// windows. The buttons will be positioned halfway down the titlebar at a
+  /// height of |titlebar_height| / 2.
+  ///
+  int(CEF_CALLBACK* get_titlebar_height)(struct _cef_window_delegate_t* self,
+                                         struct _cef_window_t* window,
+                                         float* titlebar_height);
+
+  ///
+  /// Return true (1) if |window| can be resized.
   ///
   int(CEF_CALLBACK* can_resize)(struct _cef_window_delegate_t* self,
                                 struct _cef_window_t* window);
 
   ///
-  // Return true (1) if |window| can be maximized.
+  /// Return true (1) if |window| can be maximized.
   ///
   int(CEF_CALLBACK* can_maximize)(struct _cef_window_delegate_t* self,
                                   struct _cef_window_t* window);
 
   ///
-  // Return true (1) if |window| can be minimized.
+  /// Return true (1) if |window| can be minimized.
   ///
   int(CEF_CALLBACK* can_minimize)(struct _cef_window_delegate_t* self,
                                   struct _cef_window_t* window);
 
   ///
-  // Return true (1) if |window| can be closed. This will be called for user-
-  // initiated window close actions and when cef_window_t::close() is called.
+  /// Return true (1) if |window| can be closed. This will be called for user-
+  /// initiated window close actions and when cef_window_t::close() is called.
   ///
   int(CEF_CALLBACK* can_close)(struct _cef_window_delegate_t* self,
                                struct _cef_window_t* window);
 
   ///
-  // Called when a keyboard accelerator registered with
-  // cef_window_t::SetAccelerator is triggered. Return true (1) if the
-  // accelerator was handled or false (0) otherwise.
+  /// Called when a keyboard accelerator registered with
+  /// cef_window_t::SetAccelerator is triggered. Return true (1) if the
+  /// accelerator was handled or false (0) otherwise.
   ///
   int(CEF_CALLBACK* on_accelerator)(struct _cef_window_delegate_t* self,
                                     struct _cef_window_t* window,
                                     int command_id);
 
   ///
-  // Called after all other controls in the window have had a chance to handle
-  // the event. |event| contains information about the keyboard event. Return
-  // true (1) if the keyboard event was handled or false (0) otherwise.
+  /// Called after all other controls in the window have had a chance to handle
+  /// the event. |event| contains information about the keyboard event. Return
+  /// true (1) if the keyboard event was handled or false (0) otherwise.
   ///
   int(CEF_CALLBACK* on_key_event)(struct _cef_window_delegate_t* self,
                                   struct _cef_window_t* window,
-                                  const struct _cef_key_event_t* event);
+                                  const cef_key_event_t* event);
 } cef_window_delegate_t;
 
 #ifdef __cplusplus
diff --git a/src/include/cef_accessibility_handler.h b/src/include/cef_accessibility_handler.h
index c34e0c5..2b1719a 100644
--- a/src/include/cef_accessibility_handler.h
+++ b/src/include/cef_accessibility_handler.h
@@ -41,23 +41,23 @@
 #include "include/cef_values.h"
 
 ///
-// Implement this interface to receive accessibility notification when
-// accessibility events have been registered. The methods of this class will
-// be called on the UI thread.
+/// Implement this interface to receive accessibility notification when
+/// accessibility events have been registered. The methods of this class will
+/// be called on the UI thread.
 ///
 /*--cef(source=client)--*/
 class CefAccessibilityHandler : public virtual CefBaseRefCounted {
  public:
   ///
-  // Called after renderer process sends accessibility tree changes to the
-  // browser process.
+  /// Called after renderer process sends accessibility tree changes to the
+  /// browser process.
   ///
   /*--cef()--*/
   virtual void OnAccessibilityTreeChange(CefRefPtr<CefValue> value) = 0;
 
   ///
-  // Called after renderer process sends accessibility location changes to the
-  // browser process.
+  /// Called after renderer process sends accessibility location changes to the
+  /// browser process.
   ///
   /*--cef()--*/
   virtual void OnAccessibilityLocationChange(CefRefPtr<CefValue> value) = 0;
diff --git a/src/include/cef_api_hash.h b/src/include/cef_api_hash.h
index 9595afd..a774bdc 100644
--- a/src/include/cef_api_hash.h
+++ b/src/include/cef_api_hash.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -42,13 +42,13 @@
 // way that may cause binary incompatibility with other builds. The universal
 // hash value will change if any platform is affected whereas the platform hash
 // values will change only if that particular platform is affected.
-#define CEF_API_HASH_UNIVERSAL "385d8af3c6da76f123f3aa292d3a3308ef456297"
+#define CEF_API_HASH_UNIVERSAL "ce9401699c6753553cba867b1f5c329f759d2c67"
 #if defined(OS_WIN)
-#define CEF_API_HASH_PLATFORM "4bb528b0bb076ed5177d6581cfca12dd7b2fee04"
-#elif defined(OS_MACOSX)
-#define CEF_API_HASH_PLATFORM "f6580fc0858f3580b7d25e1d094dd0a336132522"
+#define CEF_API_HASH_PLATFORM "e094f42b7a60d2c8c9bcb3db51907a3b42f51d04"
+#elif defined(OS_MAC)
+#define CEF_API_HASH_PLATFORM "6ce44bd7182aa7e9544f5ca33c310f2a096ab638"
 #elif defined(OS_LINUX)
-#define CEF_API_HASH_PLATFORM "83f3053840abba3b83e43ade58230f10b48591dd"
+#define CEF_API_HASH_PLATFORM "8e9886cd490aefc89283d65f5f7d104a51e2d289"
 #endif
 
 #ifdef __cplusplus
diff --git a/src/include/cef_app.h b/src/include/cef_app.h
index 56fb715..3591297 100644
--- a/src/include/cef_app.h
+++ b/src/include/cef_app.h
@@ -48,16 +48,16 @@
 class CefApp;
 
 ///
-// This function should be called from the application entry point function to
-// execute a secondary process. It can be used to run secondary processes from
-// the browser client executable (default behavior) or from a separate
-// executable specified by the CefSettings.browser_subprocess_path value. If
-// called for the browser process (identified by no "type" command-line value)
-// it will return immediately with a value of -1. If called for a recognized
-// secondary process it will block until the process should exit and then return
-// the process exit code. The |application| parameter may be empty. The
-// |windows_sandbox_info| parameter is only used on Windows and may be NULL (see
-// cef_sandbox_win.h for details).
+/// This function should be called from the application entry point function to
+/// execute a secondary process. It can be used to run secondary processes from
+/// the browser client executable (default behavior) or from a separate
+/// executable specified by the cef_settings_t.browser_subprocess_path value. If
+/// called for the browser process (identified by no "type" command-line value)
+/// it will return immediately with a value of -1. If called for a recognized
+/// secondary process it will block until the process should exit and then
+/// return the process exit code. The |application| parameter may be empty. The
+/// |windows_sandbox_info| parameter is only used on Windows and may be NULL
+/// (see cef_sandbox_win.h for details).
 ///
 /*--cef(api_hash_check,optional_param=application,
         optional_param=windows_sandbox_info)--*/
@@ -66,11 +66,11 @@
                       void* windows_sandbox_info);
 
 ///
-// This function should be called on the main application thread to initialize
-// the CEF browser process. The |application| parameter may be empty. A return
-// value of true indicates that it succeeded and false indicates that it failed.
-// The |windows_sandbox_info| parameter is only used on Windows and may be NULL
-// (see cef_sandbox_win.h for details).
+/// This function should be called on the main application thread to initialize
+/// the CEF browser process. The |application| parameter may be empty. A return
+/// value of true indicates that it succeeded and false indicates that it
+/// failed. The |windows_sandbox_info| parameter is only used on Windows and may
+/// be NULL (see cef_sandbox_win.h for details).
 ///
 /*--cef(api_hash_check,optional_param=application,
         optional_param=windows_sandbox_info)--*/
@@ -80,80 +80,67 @@
                    void* windows_sandbox_info);
 
 ///
-// This function should be called on the main application thread to shut down
-// the CEF browser process before the application exits.
+/// This function should be called on the main application thread to shut down
+/// the CEF browser process before the application exits.
 ///
 /*--cef()--*/
 void CefShutdown();
 
 ///
-// Perform a single iteration of CEF message loop processing. This function is
-// provided for cases where the CEF message loop must be integrated into an
-// existing application message loop. Use of this function is not recommended
-// for most users; use either the CefRunMessageLoop() function or
-// CefSettings.multi_threaded_message_loop if possible. When using this function
-// care must be taken to balance performance against excessive CPU usage. It is
-// recommended to enable the CefSettings.external_message_pump option when using
-// this function so that CefBrowserProcessHandler::OnScheduleMessagePumpWork()
-// callbacks can facilitate the scheduling process. This function should only be
-// called on the main application thread and only if CefInitialize() is called
-// with a CefSettings.multi_threaded_message_loop value of false. This function
-// will not block.
+/// Perform a single iteration of CEF message loop processing. This function is
+/// provided for cases where the CEF message loop must be integrated into an
+/// existing application message loop. Use of this function is not recommended
+/// for most users; use either the CefRunMessageLoop() function or
+/// cef_settings_t.multi_threaded_message_loop if possible. When using this
+/// function care must be taken to balance performance against excessive CPU
+/// usage. It is recommended to enable the cef_settings_t.external_message_pump
+/// option when using this function so that
+/// CefBrowserProcessHandler::OnScheduleMessagePumpWork() callbacks can
+/// facilitate the scheduling process. This function should only be called on
+/// the main application thread and only if CefInitialize() is called with a
+/// cef_settings_t.multi_threaded_message_loop value of false. This function
+/// will not block.
 ///
 /*--cef()--*/
 void CefDoMessageLoopWork();
 
 ///
-// Run the CEF message loop. Use this function instead of an application-
-// provided message loop to get the best balance between performance and CPU
-// usage. This function should only be called on the main application thread and
-// only if CefInitialize() is called with a
-// CefSettings.multi_threaded_message_loop value of false. This function will
-// block until a quit message is received by the system.
+/// Run the CEF message loop. Use this function instead of an application-
+/// provided message loop to get the best balance between performance and CPU
+/// usage. This function should only be called on the main application thread
+/// and only if CefInitialize() is called with a
+/// cef_settings_t.multi_threaded_message_loop value of false. This function
+/// will block until a quit message is received by the system.
 ///
 /*--cef()--*/
 void CefRunMessageLoop();
 
 ///
-// Quit the CEF message loop that was started by calling CefRunMessageLoop().
-// This function should only be called on the main application thread and only
-// if CefRunMessageLoop() was used.
+/// Quit the CEF message loop that was started by calling CefRunMessageLoop().
+/// This function should only be called on the main application thread and only
+/// if CefRunMessageLoop() was used.
 ///
 /*--cef()--*/
 void CefQuitMessageLoop();
 
 ///
-// Set to true before calling Windows APIs like TrackPopupMenu that enter a
-// modal message loop. Set to false after exiting the modal message loop.
-///
-/*--cef()--*/
-void CefSetOSModalLoop(bool osModalLoop);
-
-///
-// Call during process startup to enable High-DPI support on Windows 7 or newer.
-// Older versions of Windows should be left DPI-unaware because they do not
-// support DirectWrite and GDI fonts are kerned very badly.
-///
-/*--cef(capi_name=cef_enable_highdpi_support)--*/
-void CefEnableHighDPISupport();
-
-///
-// Implement this interface to provide handler implementations. Methods will be
-// called by the process and/or thread indicated.
+/// Implement this interface to provide handler implementations. Methods will be
+/// called by the process and/or thread indicated.
 ///
 /*--cef(source=client,no_debugct_check)--*/
 class CefApp : public virtual CefBaseRefCounted {
  public:
   ///
-  // Provides an opportunity to view and/or modify command-line arguments before
-  // processing by CEF and Chromium. The |process_type| value will be empty for
-  // the browser process. Do not keep a reference to the CefCommandLine object
-  // passed to this method. The CefSettings.command_line_args_disabled value
-  // can be used to start with an empty command-line object. Any values
-  // specified in CefSettings that equate to command-line arguments will be set
-  // before this method is called. Be cautious when using this method to modify
-  // command-line arguments for non-browser processes as this may result in
-  // undefined behavior including crashes.
+  /// Provides an opportunity to view and/or modify command-line arguments
+  /// before processing by CEF and Chromium. The |process_type| value will be
+  /// empty for the browser process. Do not keep a reference to the
+  /// CefCommandLine object passed to this method. The
+  /// cef_settings_t.command_line_args_disabled value can be used to start with
+  /// an empty command-line object. Any values specified in CefSettings that
+  /// equate to command-line arguments will be set before this method is called.
+  /// Be cautious when using this method to modify command-line arguments for
+  /// non-browser processes as this may result in undefined behavior including
+  /// crashes.
   ///
   /*--cef(optional_param=process_type)--*/
   virtual void OnBeforeCommandLineProcessing(
@@ -161,20 +148,20 @@
       CefRefPtr<CefCommandLine> command_line) {}
 
   ///
-  // Provides an opportunity to register custom schemes. Do not keep a reference
-  // to the |registrar| object. This method is called on the main thread for
-  // each process and the registered schemes should be the same across all
-  // processes.
+  /// Provides an opportunity to register custom schemes. Do not keep a
+  /// reference to the |registrar| object. This method is called on the main
+  /// thread for each process and the registered schemes should be the same
+  /// across all processes.
   ///
   /*--cef()--*/
   virtual void OnRegisterCustomSchemes(
       CefRawPtr<CefSchemeRegistrar> registrar) {}
 
   ///
-  // Return the handler for resource bundle events. If
-  // CefSettings.pack_loading_disabled is true a handler must be returned. If no
-  // handler is returned resources will be loaded from pack files. This method
-  // is called by the browser and render processes on multiple threads.
+  /// Return the handler for resource bundle events. If
+  /// cef_settings_t.pack_loading_disabled is true a handler must be returned.
+  /// If no handler is returned resources will be loaded from pack files. This
+  /// method is called by the browser and render processes on multiple threads.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefResourceBundleHandler> GetResourceBundleHandler() {
@@ -182,8 +169,8 @@
   }
 
   ///
-  // Return the handler for functionality specific to the browser process. This
-  // method is called on multiple threads in the browser process.
+  /// Return the handler for functionality specific to the browser process. This
+  /// method is called on multiple threads in the browser process.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefBrowserProcessHandler> GetBrowserProcessHandler() {
@@ -191,8 +178,8 @@
   }
 
   ///
-  // Return the handler for functionality specific to the render process. This
-  // method is called on the render process main thread.
+  /// Return the handler for functionality specific to the render process. This
+  /// method is called on the render process main thread.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefRenderProcessHandler> GetRenderProcessHandler() {
diff --git a/src/include/cef_application_mac.h b/src/include/cef_application_mac.h
index e2858c4..b607acc 100644
--- a/src/include/cef_application_mac.h
+++ b/src/include/cef_application_mac.h
@@ -35,7 +35,7 @@
 #include "include/cef_base.h"
 #endif  // __cplusplus
 
-#if defined(OS_MACOSX) && defined(__OBJC__)
+#if defined(OS_MAC) && defined(__OBJC__)
 
 #ifdef USING_CHROMIUM_INCLUDES
 
@@ -45,9 +45,6 @@
 // Use the existing CrAppProtocol definition.
 #import "base/message_loop/message_pump_mac.h"
 
-// Use the existing UnderlayableSurface definition.
-#import "ui/base/cocoa/underlay_opengl_hosting_window.h"
-
 // Use the existing empty protocol definitions.
 #import "base/mac/cocoa_protocols.h"
 
@@ -66,22 +63,15 @@
 @end
 
 // Copy of definition from base/mac/scoped_sending_event.h.
-@protocol CrAppControlProtocol<CrAppProtocol>
+@protocol CrAppControlProtocol <CrAppProtocol>
 - (void)setHandlingSendEvent:(BOOL)handlingSendEvent;
 @end
 
-// Copy of definition from ui/base/cocoa/underlay_opengl_hosting_window.h.
-// Common base class for windows that host a OpenGL surface that renders under
-// the window. Contains methods relating to hole punching so that the OpenGL
-// surface is visible through the window.
-@interface UnderlayOpenGLHostingWindow : NSWindow
-@end
-
 #endif  // USING_CHROMIUM_INCLUDES
 
 // All CEF client applications must subclass NSApplication and implement this
 // protocol.
-@protocol CefAppProtocol<CrAppControlProtocol>
+@protocol CefAppProtocol <CrAppControlProtocol>
 @end
 
 #ifdef __cplusplus
@@ -105,6 +95,6 @@
 
 #endif  // __cplusplus
 
-#endif  // defined(OS_MACOSX) && defined(__OBJC__)
+#endif  // defined(OS_MAC) && defined(__OBJC__)
 
 #endif  // CEF_INCLUDE_CEF_APPLICATION_MAC_H_
diff --git a/src/include/cef_audio_handler.h b/src/include/cef_audio_handler.h
index f581e6f..5211cba 100644
--- a/src/include/cef_audio_handler.h
+++ b/src/include/cef_audio_handler.h
@@ -42,7 +42,7 @@
 #include "include/cef_browser.h"
 
 ///
-// Implement this interface to handle audio events.
+/// Implement this interface to handle audio events.
 ///
 /*--cef(source=client)--*/
 class CefAudioHandler : public virtual CefBaseRefCounted {
@@ -50,10 +50,10 @@
   typedef cef_channel_layout_t ChannelLayout;
 
   ///
-  // Called on the UI thread to allow configuration of audio stream parameters.
-  // Return true to proceed with audio stream capture, or false to cancel it.
-  // All members of |params| can optionally be configured here, but they are
-  // also pre-filled with some sensible defaults.
+  /// Called on the UI thread to allow configuration of audio stream parameters.
+  /// Return true to proceed with audio stream capture, or false to cancel it.
+  /// All members of |params| can optionally be configured here, but they are
+  /// also pre-filled with some sensible defaults.
   ///
   /*--cef()--*/
   virtual bool GetAudioParameters(CefRefPtr<CefBrowser> browser,
@@ -62,11 +62,11 @@
   }
 
   ///
-  // Called on a browser audio capture thread when the browser starts
-  // streaming audio. OnAudioSteamStopped will always be called after
-  // OnAudioStreamStarted; both methods may be called multiple times
-  // for the same browser. |params| contains the audio parameters like
-  // sample rate and channel layout. |channels| is the number of channels.
+  /// Called on a browser audio capture thread when the browser starts
+  /// streaming audio. OnAudioStreamStopped will always be called after
+  /// OnAudioStreamStarted; both methods may be called multiple times
+  /// for the same browser. |params| contains the audio parameters like
+  /// sample rate and channel layout. |channels| is the number of channels.
   ///
   /*--cef()--*/
   virtual void OnAudioStreamStarted(CefRefPtr<CefBrowser> browser,
@@ -74,34 +74,34 @@
                                     int channels) = 0;
 
   ///
-  // Called on the audio stream thread when a PCM packet is received for the
-  // stream. |data| is an array representing the raw PCM data as a floating
-  // point type, i.e. 4-byte value(s). |frames| is the number of frames in the
-  // PCM packet. |pts| is the presentation timestamp (in milliseconds since the
-  // Unix Epoch) and represents the time at which the decompressed packet should
-  // be presented to the user. Based on |frames| and the |channel_layout| value
-  // passed to OnAudioStreamStarted you can calculate the size of the |data|
-  // array in bytes.
+  /// Called on the audio stream thread when a PCM packet is received for the
+  /// stream. |data| is an array representing the raw PCM data as a floating
+  /// point type, i.e. 4-byte value(s). |frames| is the number of frames in the
+  /// PCM packet. |pts| is the presentation timestamp (in milliseconds since the
+  /// Unix Epoch) and represents the time at which the decompressed packet
+  /// should be presented to the user. Based on |frames| and the
+  /// |channel_layout| value passed to OnAudioStreamStarted you can calculate
+  /// the size of the |data| array in bytes.
   ///
   /*--cef()--*/
   virtual void OnAudioStreamPacket(CefRefPtr<CefBrowser> browser,
                                    const float** data,
                                    int frames,
-                                   int64 pts) = 0;
+                                   int64_t pts) = 0;
 
   ///
-  // Called on the UI thread when the stream has stopped. OnAudioSteamStopped
-  // will always be called after OnAudioStreamStarted; both methods may be
-  // called multiple times for the same stream.
+  /// Called on the UI thread when the stream has stopped. OnAudioSteamStopped
+  /// will always be called after OnAudioStreamStarted; both methods may be
+  /// called multiple times for the same stream.
   ///
   /*--cef()--*/
   virtual void OnAudioStreamStopped(CefRefPtr<CefBrowser> browser) = 0;
 
   ///
-  // Called on the UI or audio stream thread when an error occurred. During the
-  // stream creation phase this callback will be called on the UI thread while
-  // in the capturing phase it will be called on the audio stream thread. The
-  // stream will be stopped immediately.
+  /// Called on the UI or audio stream thread when an error occurred. During the
+  /// stream creation phase this callback will be called on the UI thread while
+  /// in the capturing phase it will be called on the audio stream thread. The
+  /// stream will be stopped immediately.
   ///
   /*--cef()--*/
   virtual void OnAudioStreamError(CefRefPtr<CefBrowser> browser,
diff --git a/src/include/cef_auth_callback.h b/src/include/cef_auth_callback.h
index fc8a10a..3372a72 100644
--- a/src/include/cef_auth_callback.h
+++ b/src/include/cef_auth_callback.h
@@ -41,21 +41,21 @@
 #include "include/cef_base.h"
 
 ///
-// Callback interface used for asynchronous continuation of authentication
-// requests.
+/// Callback interface used for asynchronous continuation of authentication
+/// requests.
 ///
 /*--cef(source=library)--*/
 class CefAuthCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Continue the authentication request.
+  /// Continue the authentication request.
   ///
   /*--cef(capi_name=cont,optional_param=username,optional_param=password)--*/
   virtual void Continue(const CefString& username,
                         const CefString& password) = 0;
 
   ///
-  // Cancel the authentication request.
+  /// Cancel the authentication request.
   ///
   /*--cef()--*/
   virtual void Cancel() = 0;
diff --git a/src/include/cef_base.h b/src/include/cef_base.h
index 0db0f3a..bd8f11e 100644
--- a/src/include/cef_base.h
+++ b/src/include/cef_base.h
@@ -37,39 +37,40 @@
 
 // Bring in common C++ type definitions used by CEF consumers.
 #include "include/internal/cef_ptr.h"
+#include "include/internal/cef_time_wrappers.h"
 #include "include/internal/cef_types_wrappers.h"
 #if defined(OS_WIN)
 #include "include/internal/cef_win.h"
-#elif defined(OS_MACOSX)
+#elif defined(OS_MAC)
 #include "include/internal/cef_mac.h"
 #elif defined(OS_LINUX)
 #include "include/internal/cef_linux.h"
 #endif
 
 ///
-// All ref-counted framework classes must extend this class.
+/// All ref-counted framework classes must extend this class.
 ///
 class CefBaseRefCounted {
  public:
   ///
-  // Called to increment the reference count for the object. Should be called
-  // for every new copy of a pointer to a given object.
+  /// Called to increment the reference count for the object. Should be called
+  /// for every new copy of a pointer to a given object.
   ///
   virtual void AddRef() const = 0;
 
   ///
-  // Called to decrement the reference count for the object. Returns true if
-  // the reference count is 0, in which case the object should self-delete.
+  /// Called to decrement the reference count for the object. Returns true if
+  /// the reference count is 0, in which case the object should self-delete.
   ///
   virtual bool Release() const = 0;
 
   ///
-  // Returns true if the reference count is 1.
+  /// Returns true if the reference count is 1.
   ///
   virtual bool HasOneRef() const = 0;
 
   ///
-  // Returns true if the reference count is at least 1.
+  /// Returns true if the reference count is at least 1.
   ///
   virtual bool HasAtLeastOneRef() const = 0;
 
@@ -78,7 +79,7 @@
 };
 
 ///
-// All scoped framework classes must extend this class.
+/// All scoped framework classes must extend this class.
 ///
 class CefBaseScoped {
  public:
@@ -86,109 +87,63 @@
 };
 
 ///
-// Class that implements atomic reference counting.
+/// Class that implements atomic reference counting.
 ///
 class CefRefCount {
  public:
-  CefRefCount() : ref_count_(0) {}
+  CefRefCount() = default;
+
+  CefRefCount(const CefRefCount&) = delete;
+  CefRefCount& operator=(const CefRefCount&) = delete;
 
   ///
-  // Increment the reference count.
+  /// Increment the reference count.
   ///
-  void AddRef() const { base::AtomicRefCountInc(&ref_count_); }
+  void AddRef() const { ref_count_.Increment(); }
 
   ///
-  // Decrement the reference count. Returns true if the reference count is 0.
+  /// Decrement the reference count. Returns true if the reference count is 0.
   ///
-  bool Release() const { return !base::AtomicRefCountDec(&ref_count_); }
+  bool Release() const { return !ref_count_.Decrement(); }
 
   ///
-  // Returns true if the reference count is 1.
+  /// Returns true if the reference count is 1.
   ///
-  bool HasOneRef() const { return base::AtomicRefCountIsOne(&ref_count_); }
+  bool HasOneRef() const { return ref_count_.IsOne(); }
 
   ///
-  // Returns true if the reference count is at least 1.
+  /// Returns true if the reference count is at least 1.
   ///
-  bool HasAtLeastOneRef() const {
-    return !base::AtomicRefCountIsZero(&ref_count_);
-  }
+  bool HasAtLeastOneRef() const { return !ref_count_.IsZero(); }
 
  private:
-  mutable base::AtomicRefCount ref_count_;
-  DISALLOW_COPY_AND_ASSIGN(CefRefCount);
+  mutable base::AtomicRefCount ref_count_{0};
 };
 
 ///
-// Macro that provides a reference counting implementation for classes extending
-// CefBase.
+/// Macro that provides a reference counting implementation for classes
+/// extending CefBase.
 ///
-#define IMPLEMENT_REFCOUNTING(ClassName)                             \
- public:                                                             \
-  void AddRef() const OVERRIDE { ref_count_.AddRef(); }              \
-  bool Release() const OVERRIDE {                                    \
-    if (ref_count_.Release()) {                                      \
-      delete static_cast<const ClassName*>(this);                    \
-      return true;                                                   \
-    }                                                                \
-    return false;                                                    \
-  }                                                                  \
-  bool HasOneRef() const OVERRIDE { return ref_count_.HasOneRef(); } \
-  bool HasAtLeastOneRef() const OVERRIDE {                           \
-    return ref_count_.HasAtLeastOneRef();                            \
-  }                                                                  \
-                                                                     \
- private:                                                            \
+#define IMPLEMENT_REFCOUNTING(ClassName)          \
+ public:                                          \
+  void AddRef() const override {                  \
+    ref_count_.AddRef();                          \
+  }                                               \
+  bool Release() const override {                 \
+    if (ref_count_.Release()) {                   \
+      delete static_cast<const ClassName*>(this); \
+      return true;                                \
+    }                                             \
+    return false;                                 \
+  }                                               \
+  bool HasOneRef() const override {               \
+    return ref_count_.HasOneRef();                \
+  }                                               \
+  bool HasAtLeastOneRef() const override {        \
+    return ref_count_.HasAtLeastOneRef();         \
+  }                                               \
+                                                  \
+ private:                                         \
   CefRefCount ref_count_
 
-///
-// Macro that provides a locking implementation. Use the Lock() and Unlock()
-// methods to protect a section of code from simultaneous access by multiple
-// threads. The AutoLock class is a helper that will hold the lock while in
-// scope.
-//
-// THIS MACRO IS DEPRECATED. Use an explicit base::Lock member variable and
-// base::AutoLock instead. For example:
-//
-// #include "include/base/cef_lock.h"
-//
-// // Class declaration.
-// class MyClass : public CefBaseRefCounted {
-//  public:
-//   MyClass() : value_(0) {}
-//   // Method that may be called on multiple threads.
-//   void IncrementValue();
-//  private:
-//   // Value that may be accessed on multiple theads.
-//   int value_;
-//   // Lock used to protect access to |value_|.
-//   base::Lock lock_;
-//   IMPLEMENT_REFCOUNTING(MyClass);
-// };
-//
-// // Class implementation.
-// void MyClass::IncrementValue() {
-//   // Acquire the lock for the scope of this method.
-//   base::AutoLock lock_scope(lock_);
-//   // |value_| can now be modified safely.
-//   value_++;
-// }
-///
-#define IMPLEMENT_LOCKING(ClassName)                                    \
- public:                                                                \
-  class AutoLock {                                                      \
-   public:                                                              \
-    explicit AutoLock(ClassName* base) : base_(base) { base_->Lock(); } \
-    ~AutoLock() { base_->Unlock(); }                                    \
-                                                                        \
-   private:                                                             \
-    ClassName* base_;                                                   \
-    DISALLOW_COPY_AND_ASSIGN(AutoLock);                                 \
-  };                                                                    \
-  void Lock() { lock_.Acquire(); }                                      \
-  void Unlock() { lock_.Release(); }                                    \
-                                                                        \
- private:                                                               \
-  base::Lock lock_;
-
 #endif  // CEF_INCLUDE_CEF_BASE_H_
diff --git a/src/include/cef_browser.h b/src/include/cef_browser.h
index 172d0a1..7ba4985 100644
--- a/src/include/cef_browser.h
+++ b/src/include/cef_browser.h
@@ -52,171 +52,181 @@
 class CefClient;
 
 ///
-// Class used to represent a browser window. When used in the browser process
-// the methods of this class may be called on any thread unless otherwise
-// indicated in the comments. When used in the render process the methods of
-// this class may only be called on the main thread.
+/// Class used to represent a browser. When used in the browser process the
+/// methods of this class may be called on any thread unless otherwise indicated
+/// in the comments. When used in the render process the methods of this class
+/// may only be called on the main thread.
 ///
 /*--cef(source=library)--*/
 class CefBrowser : public virtual CefBaseRefCounted {
  public:
   ///
-  // Returns the browser host object. This method can only be called in the
-  // browser process.
+  /// True if this object is currently valid. This will return false after
+  /// CefLifeSpanHandler::OnBeforeClose is called.
+  ///
+  /*--cef()--*/
+  virtual bool IsValid() = 0;
+
+  ///
+  /// Returns the browser host object. This method can only be called in the
+  /// browser process.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefBrowserHost> GetHost() = 0;
 
   ///
-  // Returns true if the browser can navigate backwards.
+  /// Returns true if the browser can navigate backwards.
   ///
   /*--cef()--*/
   virtual bool CanGoBack() = 0;
 
   ///
-  // Navigate backwards.
+  /// Navigate backwards.
   ///
   /*--cef()--*/
   virtual void GoBack() = 0;
 
   ///
-  // Returns true if the browser can navigate forwards.
+  /// Returns true if the browser can navigate forwards.
   ///
   /*--cef()--*/
   virtual bool CanGoForward() = 0;
 
   ///
-  // Navigate forwards.
+  /// Navigate forwards.
   ///
   /*--cef()--*/
   virtual void GoForward() = 0;
 
   ///
-  // Returns true if the browser is currently loading.
+  /// Returns true if the browser is currently loading.
   ///
   /*--cef()--*/
   virtual bool IsLoading() = 0;
 
   ///
-  // Reload the current page.
+  /// Reload the current page.
   ///
   /*--cef()--*/
   virtual void Reload() = 0;
 
   ///
-  // Reload the current page ignoring any cached data.
+  /// Reload the current page ignoring any cached data.
   ///
   /*--cef()--*/
   virtual void ReloadIgnoreCache() = 0;
 
   ///
-  // Stop loading the page.
+  /// Stop loading the page.
   ///
   /*--cef()--*/
   virtual void StopLoad() = 0;
 
   ///
-  // Returns the globally unique identifier for this browser. This value is also
-  // used as the tabId for extension APIs.
+  /// Returns the globally unique identifier for this browser. This value is
+  /// also used as the tabId for extension APIs.
   ///
   /*--cef()--*/
   virtual int GetIdentifier() = 0;
 
   ///
-  // Returns true if this object is pointing to the same handle as |that|
-  // object.
+  /// Returns true if this object is pointing to the same handle as |that|
+  /// object.
   ///
   /*--cef()--*/
   virtual bool IsSame(CefRefPtr<CefBrowser> that) = 0;
 
   ///
-  // Returns true if the window is a popup window.
+  /// Returns true if the browser is a popup.
   ///
   /*--cef()--*/
   virtual bool IsPopup() = 0;
 
   ///
-  // Returns true if a document has been loaded in the browser.
+  /// Returns true if a document has been loaded in the browser.
   ///
   /*--cef()--*/
   virtual bool HasDocument() = 0;
 
   ///
-  // Returns the main (top-level) frame for the browser window.
+  /// Returns the main (top-level) frame for the browser. In the browser process
+  /// this will return a valid object until after
+  /// CefLifeSpanHandler::OnBeforeClose is called. In the renderer process this
+  /// will return NULL if the main frame is hosted in a different renderer
+  /// process (e.g. for cross-origin sub-frames). The main frame object will
+  /// change during cross-origin navigation or re-navigation after renderer
+  /// process termination (due to crashes, etc).
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefFrame> GetMainFrame() = 0;
 
   ///
-  // Returns the focused frame for the browser window.
+  /// Returns the focused frame for the browser.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefFrame> GetFocusedFrame() = 0;
 
   ///
-  // Returns the frame with the specified identifier, or NULL if not found.
+  /// Returns the frame with the specified identifier, or NULL if not found.
   ///
   /*--cef(capi_name=get_frame_byident)--*/
-  virtual CefRefPtr<CefFrame> GetFrame(int64 identifier) = 0;
+  virtual CefRefPtr<CefFrame> GetFrame(int64_t identifier) = 0;
 
   ///
-  // Returns the frame with the specified name, or NULL if not found.
+  /// Returns the frame with the specified name, or NULL if not found.
   ///
   /*--cef(optional_param=name)--*/
   virtual CefRefPtr<CefFrame> GetFrame(const CefString& name) = 0;
 
   ///
-  // Returns the number of frames that currently exist.
+  /// Returns the number of frames that currently exist.
   ///
   /*--cef()--*/
   virtual size_t GetFrameCount() = 0;
 
   ///
-  // Returns the identifiers of all existing frames.
+  /// Returns the identifiers of all existing frames.
   ///
   /*--cef(count_func=identifiers:GetFrameCount)--*/
-  virtual void GetFrameIdentifiers(std::vector<int64>& identifiers) = 0;
+  virtual void GetFrameIdentifiers(std::vector<int64_t>& identifiers) = 0;
 
   ///
-  // Returns the names of all existing frames.
+  /// Returns the names of all existing frames.
   ///
   /*--cef()--*/
   virtual void GetFrameNames(std::vector<CefString>& names) = 0;
 };
 
 ///
-// Callback interface for CefBrowserHost::RunFileDialog. The methods of this
-// class will be called on the browser process UI thread.
+/// Callback interface for CefBrowserHost::RunFileDialog. The methods of this
+/// class will be called on the browser process UI thread.
 ///
 /*--cef(source=client)--*/
 class CefRunFileDialogCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Called asynchronously after the file dialog is dismissed.
-  // |selected_accept_filter| is the 0-based index of the value selected from
-  // the accept filters array passed to CefBrowserHost::RunFileDialog.
-  // |file_paths| will be a single value or a list of values depending on the
-  // dialog mode. If the selection was cancelled |file_paths| will be empty.
+  /// Called asynchronously after the file dialog is dismissed.
+  /// |file_paths| will be a single value or a list of values depending on the
+  /// dialog mode. If the selection was cancelled |file_paths| will be empty.
   ///
-  /*--cef(index_param=selected_accept_filter,optional_param=file_paths)--*/
+  /*--cef(optional_param=file_paths)--*/
   virtual void OnFileDialogDismissed(
-      int selected_accept_filter,
       const std::vector<CefString>& file_paths) = 0;
 };
 
 ///
-// Callback interface for CefBrowserHost::GetNavigationEntries. The methods of
-// this class will be called on the browser process UI thread.
+/// Callback interface for CefBrowserHost::GetNavigationEntries. The methods of
+/// this class will be called on the browser process UI thread.
 ///
 /*--cef(source=client)--*/
 class CefNavigationEntryVisitor : public virtual CefBaseRefCounted {
  public:
   ///
-  // Method that will be executed. Do not keep a reference to |entry| outside of
-  // this callback. Return true to continue visiting entries or false to stop.
-  // |current| is true if this entry is the currently loaded navigation entry.
-  // |index| is the 0-based index of this entry and |total| is the total number
-  // of entries.
+  /// Method that will be executed. Do not keep a reference to |entry| outside
+  /// of this callback. Return true to continue visiting entries or false to
+  /// stop. |current| is true if this entry is the currently loaded navigation
+  /// entry. |index| is the 0-based index of this entry and |total| is the total
+  /// number of entries.
   ///
   /*--cef()--*/
   virtual bool Visit(CefRefPtr<CefNavigationEntry> entry,
@@ -226,33 +236,33 @@
 };
 
 ///
-// Callback interface for CefBrowserHost::PrintToPDF. The methods of this class
-// will be called on the browser process UI thread.
+/// Callback interface for CefBrowserHost::PrintToPDF. The methods of this class
+/// will be called on the browser process UI thread.
 ///
 /*--cef(source=client)--*/
 class CefPdfPrintCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Method that will be executed when the PDF printing has completed. |path|
-  // is the output path. |ok| will be true if the printing completed
-  // successfully or false otherwise.
+  /// Method that will be executed when the PDF printing has completed. |path|
+  /// is the output path. |ok| will be true if the printing completed
+  /// successfully or false otherwise.
   ///
   /*--cef()--*/
   virtual void OnPdfPrintFinished(const CefString& path, bool ok) = 0;
 };
 
 ///
-// Callback interface for CefBrowserHost::DownloadImage. The methods of this
-// class will be called on the browser process UI thread.
+/// Callback interface for CefBrowserHost::DownloadImage. The methods of this
+/// class will be called on the browser process UI thread.
 ///
 /*--cef(source=client)--*/
 class CefDownloadImageCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Method that will be executed when the image download has completed.
-  // |image_url| is the URL that was downloaded and |http_status_code| is the
-  // resulting HTTP status code. |image| is the resulting image, possibly at
-  // multiple scale factors, or empty if the download failed.
+  /// Method that will be executed when the image download has completed.
+  /// |image_url| is the URL that was downloaded and |http_status_code| is the
+  /// resulting HTTP status code. |image| is the resulting image, possibly at
+  /// multiple scale factors, or empty if the download failed.
   ///
   /*--cef(optional_param=image)--*/
   virtual void OnDownloadImageFinished(const CefString& image_url,
@@ -261,10 +271,10 @@
 };
 
 ///
-// Class used to represent the browser process aspects of a browser window. The
-// methods of this class can only be called in the browser process. They may be
-// called on any thread in that process unless otherwise indicated in the
-// comments.
+/// Class used to represent the browser process aspects of a browser. The
+/// methods of this class can only be called in the browser process. They may be
+/// called on any thread in that process unless otherwise indicated in the
+/// comments.
 ///
 /*--cef(source=library)--*/
 class CefBrowserHost : public virtual CefBaseRefCounted {
@@ -275,14 +285,14 @@
   typedef cef_paint_element_type_t PaintElementType;
 
   ///
-  // Create a new browser window using the window parameters specified by
-  // |windowInfo|. All values will be copied internally and the actual window
-  // will be created on the UI thread. If |request_context| is empty the
-  // global request context will be used. This method can be called on any
-  // browser process thread and will not block. The optional |extra_info|
-  // parameter provides an opportunity to specify extra information specific
-  // to the created browser that will be passed to
-  // CefRenderProcessHandler::OnBrowserCreated() in the render process.
+  /// Create a new browser using the window parameters specified by
+  /// |windowInfo|. All values will be copied internally and the actual window
+  /// (if any) will be created on the UI thread. If |request_context| is empty
+  /// the global request context will be used. This method can be called on any
+  /// browser process thread and will not block. The optional |extra_info|
+  /// parameter provides an opportunity to specify extra information specific to
+  /// the created browser that will be passed to
+  /// CefRenderProcessHandler::OnBrowserCreated() in the render process.
   ///
   /*--cef(optional_param=client,optional_param=url,
           optional_param=request_context,optional_param=extra_info)--*/
@@ -294,13 +304,13 @@
                             CefRefPtr<CefRequestContext> request_context);
 
   ///
-  // Create a new browser window using the window parameters specified by
-  // |windowInfo|. If |request_context| is empty the global request context
-  // will be used. This method can only be called on the browser process UI
-  // thread. The optional |extra_info| parameter provides an opportunity to
-  // specify extra information specific to the created browser that will be
-  // passed to CefRenderProcessHandler::OnBrowserCreated() in the render
-  // process.
+  /// Create a new browser using the window parameters specified by
+  /// |windowInfo|. If |request_context| is empty the global request context
+  /// will be used. This method can only be called on the browser process UI
+  /// thread. The optional |extra_info| parameter provides an opportunity to
+  /// specify extra information specific to the created browser that will be
+  /// passed to CefRenderProcessHandler::OnBrowserCreated() in the render
+  /// process.
   ///
   /*--cef(optional_param=client,optional_param=url,
           optional_param=request_context,optional_param=extra_info)--*/
@@ -313,153 +323,177 @@
       CefRefPtr<CefRequestContext> request_context);
 
   ///
-  // Returns the hosted browser object.
+  /// Returns the hosted browser object.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefBrowser> GetBrowser() = 0;
 
   ///
-  // Request that the browser close. The JavaScript 'onbeforeunload' event will
-  // be fired. If |force_close| is false the event handler, if any, will be
-  // allowed to prompt the user and the user can optionally cancel the close.
-  // If |force_close| is true the prompt will not be displayed and the close
-  // will proceed. Results in a call to CefLifeSpanHandler::DoClose() if the
-  // event handler allows the close or if |force_close| is true. See
-  // CefLifeSpanHandler::DoClose() documentation for additional usage
-  // information.
+  /// Request that the browser close. The JavaScript 'onbeforeunload' event will
+  /// be fired. If |force_close| is false the event handler, if any, will be
+  /// allowed to prompt the user and the user can optionally cancel the close.
+  /// If |force_close| is true the prompt will not be displayed and the close
+  /// will proceed. Results in a call to CefLifeSpanHandler::DoClose() if the
+  /// event handler allows the close or if |force_close| is true. See
+  /// CefLifeSpanHandler::DoClose() documentation for additional usage
+  /// information.
   ///
   /*--cef()--*/
   virtual void CloseBrowser(bool force_close) = 0;
 
   ///
-  // Helper for closing a browser. Call this method from the top-level window
-  // close handler. Internally this calls CloseBrowser(false) if the close has
-  // not yet been initiated. This method returns false while the close is
-  // pending and true after the close has completed. See CloseBrowser() and
-  // CefLifeSpanHandler::DoClose() documentation for additional usage
-  // information. This method must be called on the browser process UI thread.
+  /// Helper for closing a browser. Call this method from the top-level window
+  /// close handler (if any). Internally this calls CloseBrowser(false) if the
+  /// close has not yet been initiated. This method returns false while the
+  /// close is pending and true after the close has completed. See
+  /// CloseBrowser() and CefLifeSpanHandler::DoClose() documentation for
+  /// additional usage information. This method must be called on the browser
+  /// process UI thread.
   ///
   /*--cef()--*/
   virtual bool TryCloseBrowser() = 0;
 
   ///
-  // Set whether the browser is focused.
+  /// Set whether the browser is focused.
   ///
   /*--cef()--*/
   virtual void SetFocus(bool focus) = 0;
 
   ///
-  // Retrieve the window handle for this browser. If this browser is wrapped in
-  // a CefBrowserView this method should be called on the browser process UI
-  // thread and it will return the handle for the top-level native window.
+  /// Retrieve the window handle (if any) for this browser. If this browser is
+  /// wrapped in a CefBrowserView this method should be called on the browser
+  /// process UI thread and it will return the handle for the top-level native
+  /// window.
   ///
   /*--cef()--*/
   virtual CefWindowHandle GetWindowHandle() = 0;
 
   ///
-  // Retrieve the window handle of the browser that opened this browser. Will
-  // return NULL for non-popup windows or if this browser is wrapped in a
-  // CefBrowserView. This method can be used in combination with custom handling
-  // of modal windows.
+  /// Retrieve the window handle (if any) of the browser that opened this
+  /// browser. Will return NULL for non-popup browsers or if this browser is
+  /// wrapped in a CefBrowserView. This method can be used in combination with
+  /// custom handling of modal windows.
   ///
   /*--cef()--*/
   virtual CefWindowHandle GetOpenerWindowHandle() = 0;
 
   ///
-  // Returns true if this browser is wrapped in a CefBrowserView.
+  /// Returns true if this browser is wrapped in a CefBrowserView.
   ///
   /*--cef()--*/
   virtual bool HasView() = 0;
 
   ///
-  // Returns the client for this browser.
+  /// Returns the client for this browser.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefClient> GetClient() = 0;
 
   ///
-  // Returns the request context for this browser.
+  /// Returns the request context for this browser.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefRequestContext> GetRequestContext() = 0;
 
   ///
-  // Get the current zoom level. The default zoom level is 0.0. This method can
-  // only be called on the UI thread.
+  /// Returns true if this browser can execute the specified zoom command. This
+  /// method can only be called on the UI thread.
+  ///
+  /*--cef()--*/
+  virtual bool CanZoom(cef_zoom_command_t command) = 0;
+
+  ///
+  /// Execute a zoom command in this browser. If called on the UI thread the
+  /// change will be applied immediately. Otherwise, the change will be applied
+  /// asynchronously on the UI thread.
+  ///
+  /*--cef()--*/
+  virtual void Zoom(cef_zoom_command_t command) = 0;
+
+  ///
+  /// Get the default zoom level. This value will be 0.0 by default but can be
+  /// configured with the Chrome runtime. This method can only be called on the
+  /// UI thread.
+  ///
+  /*--cef()--*/
+  virtual double GetDefaultZoomLevel() = 0;
+
+  ///
+  /// Get the current zoom level. This method can only be called on the UI
+  /// thread.
   ///
   /*--cef()--*/
   virtual double GetZoomLevel() = 0;
 
   ///
-  // Change the zoom level to the specified value. Specify 0.0 to reset the
-  // zoom level. If called on the UI thread the change will be applied
-  // immediately. Otherwise, the change will be applied asynchronously on the
-  // UI thread.
+  /// Change the zoom level to the specified value. Specify 0.0 to reset the
+  /// zoom level to the default. If called on the UI thread the change will be
+  /// applied immediately. Otherwise, the change will be applied asynchronously
+  /// on the UI thread.
   ///
   /*--cef()--*/
   virtual void SetZoomLevel(double zoomLevel) = 0;
 
   ///
-  // Call to run a file chooser dialog. Only a single file chooser dialog may be
-  // pending at any given time. |mode| represents the type of dialog to display.
-  // |title| to the title to be used for the dialog and may be empty to show the
-  // default title ("Open" or "Save" depending on the mode). |default_file_path|
-  // is the path with optional directory and/or file name component that will be
-  // initially selected in the dialog. |accept_filters| are used to restrict the
-  // selectable file types and may any combination of (a) valid lower-cased MIME
-  // types (e.g. "text/*" or "image/*"), (b) individual file extensions (e.g.
-  // ".txt" or ".png"), or (c) combined description and file extension delimited
-  // using "|" and ";" (e.g. "Image Types|.png;.gif;.jpg").
-  // |selected_accept_filter| is the 0-based index of the filter that will be
-  // selected by default. |callback| will be executed after the dialog is
-  // dismissed or immediately if another dialog is already pending. The dialog
-  // will be initiated asynchronously on the UI thread.
+  /// Call to run a file chooser dialog. Only a single file chooser dialog may
+  /// be pending at any given time. |mode| represents the type of dialog to
+  /// display. |title| to the title to be used for the dialog and may be empty
+  /// to show the default title ("Open" or "Save" depending on the mode).
+  /// |default_file_path| is the path with optional directory and/or file name
+  /// component that will be initially selected in the dialog. |accept_filters|
+  /// are used to restrict the selectable file types and may any combination of
+  /// (a) valid lower-cased MIME types (e.g. "text/*" or "image/*"), (b)
+  /// individual file extensions (e.g.
+  /// ".txt" or ".png"), or (c) combined description and file extension
+  /// delimited using "|" and ";" (e.g. "Image Types|.png;.gif;.jpg").
+  /// |callback| will be executed after the dialog is dismissed or immediately
+  /// if another dialog is already pending. The dialog will be initiated
+  /// asynchronously on the UI thread.
   ///
   /*--cef(optional_param=title,optional_param=default_file_path,
-          optional_param=accept_filters,index_param=selected_accept_filter)--*/
+          optional_param=accept_filters)--*/
   virtual void RunFileDialog(FileDialogMode mode,
                              const CefString& title,
                              const CefString& default_file_path,
                              const std::vector<CefString>& accept_filters,
-                             int selected_accept_filter,
                              CefRefPtr<CefRunFileDialogCallback> callback) = 0;
 
   ///
-  // Download the file at |url| using CefDownloadHandler.
+  /// Download the file at |url| using CefDownloadHandler.
   ///
   /*--cef()--*/
   virtual void StartDownload(const CefString& url) = 0;
 
   ///
-  // Download |image_url| and execute |callback| on completion with the images
-  // received from the renderer. If |is_favicon| is true then cookies are not
-  // sent and not accepted during download. Images with density independent
-  // pixel (DIP) sizes larger than |max_image_size| are filtered out from the
-  // image results. Versions of the image at different scale factors may be
-  // downloaded up to the maximum scale factor supported by the system. If there
-  // are no image results <= |max_image_size| then the smallest image is resized
-  // to |max_image_size| and is the only result. A |max_image_size| of 0 means
-  // unlimited. If |bypass_cache| is true then |image_url| is requested from the
-  // server even if it is present in the browser cache.
+  /// Download |image_url| and execute |callback| on completion with the images
+  /// received from the renderer. If |is_favicon| is true then cookies are not
+  /// sent and not accepted during download. Images with density independent
+  /// pixel (DIP) sizes larger than |max_image_size| are filtered out from the
+  /// image results. Versions of the image at different scale factors may be
+  /// downloaded up to the maximum scale factor supported by the system. If
+  /// there are no image results <= |max_image_size| then the smallest image is
+  /// resized to |max_image_size| and is the only result. A |max_image_size| of
+  /// 0 means unlimited. If |bypass_cache| is true then |image_url| is requested
+  /// from the server even if it is present in the browser cache.
   ///
   /*--cef()--*/
   virtual void DownloadImage(const CefString& image_url,
                              bool is_favicon,
-                             uint32 max_image_size,
+                             uint32_t max_image_size,
                              bool bypass_cache,
                              CefRefPtr<CefDownloadImageCallback> callback) = 0;
 
   ///
-  // Print the current browser contents.
+  /// Print the current browser contents.
   ///
   /*--cef()--*/
   virtual void Print() = 0;
 
   ///
-  // Print the current browser contents to the PDF file specified by |path| and
-  // execute |callback| on completion. The caller is responsible for deleting
-  // |path| when done. For PDF printing to work on Linux you must implement the
-  // CefPrintHandler::GetPdfPaperSize method.
+  /// Print the current browser contents to the PDF file specified by |path| and
+  /// execute |callback| on completion. The caller is responsible for deleting
+  /// |path| when done. For PDF printing to work on Linux you must implement the
+  /// CefPrintHandler::GetPdfPaperSize method.
   ///
   /*--cef(optional_param=callback)--*/
   virtual void PrintToPDF(const CefString& path,
@@ -467,37 +501,34 @@
                           CefRefPtr<CefPdfPrintCallback> callback) = 0;
 
   ///
-  // Search for |searchText|. |identifier| must be a unique ID and these IDs
-  // must strictly increase so that newer requests always have greater IDs than
-  // older requests. If |identifier| is zero or less than the previous ID value
-  // then it will be automatically assigned a new valid ID. |forward| indicates
-  // whether to search forward or backward within the page. |matchCase|
-  // indicates whether the search should be case-sensitive. |findNext| indicates
-  // whether this is the first request or a follow-up. The CefFindHandler
-  // instance, if any, returned via CefClient::GetFindHandler will be called to
-  // report find results.
+  /// Search for |searchText|. |forward| indicates whether to search forward or
+  /// backward within the page. |matchCase| indicates whether the search should
+  /// be case-sensitive. |findNext| indicates whether this is the first request
+  /// or a follow-up. The search will be restarted if |searchText| or
+  /// |matchCase| change. The search will be stopped if |searchText| is empty.
+  /// The CefFindHandler instance, if any, returned via
+  /// CefClient::GetFindHandler will be called to report find results.
   ///
   /*--cef()--*/
-  virtual void Find(int identifier,
-                    const CefString& searchText,
+  virtual void Find(const CefString& searchText,
                     bool forward,
                     bool matchCase,
                     bool findNext) = 0;
 
   ///
-  // Cancel all searches that are currently going on.
+  /// Cancel all searches that are currently going on.
   ///
   /*--cef()--*/
   virtual void StopFinding(bool clearSelection) = 0;
 
   ///
-  // Open developer tools (DevTools) in its own browser. The DevTools browser
-  // will remain associated with this browser. If the DevTools browser is
-  // already open then it will be focused, in which case the |windowInfo|,
-  // |client| and |settings| parameters will be ignored. If |inspect_element_at|
-  // is non-empty then the element at the specified (x,y) location will be
-  // inspected. The |windowInfo| parameter will be ignored if this browser is
-  // wrapped in a CefBrowserView.
+  /// Open developer tools (DevTools) in its own browser. The DevTools browser
+  /// will remain associated with this browser. If the DevTools browser is
+  /// already open then it will be focused, in which case the |windowInfo|,
+  /// |client| and |settings| parameters will be ignored. If
+  /// |inspect_element_at| is non-empty then the element at the specified (x,y)
+  /// location will be inspected. The |windowInfo| parameter will be ignored if
+  /// this browser is wrapped in a CefBrowserView.
   ///
   /*--cef(optional_param=windowInfo,optional_param=client,
           optional_param=settings,optional_param=inspect_element_at)--*/
@@ -507,65 +538,65 @@
                             const CefPoint& inspect_element_at) = 0;
 
   ///
-  // Explicitly close the associated DevTools browser, if any.
+  /// Explicitly close the associated DevTools browser, if any.
   ///
   /*--cef()--*/
   virtual void CloseDevTools() = 0;
 
   ///
-  // Returns true if this browser currently has an associated DevTools browser.
-  // Must be called on the browser process UI thread.
+  /// Returns true if this browser currently has an associated DevTools browser.
+  /// Must be called on the browser process UI thread.
   ///
   /*--cef()--*/
   virtual bool HasDevTools() = 0;
 
   ///
-  // Send a method call message over the DevTools protocol. |message| must be a
-  // UTF8-encoded JSON dictionary that contains "id" (int), "method" (string)
-  // and "params" (dictionary, optional) values. See the DevTools protocol
-  // documentation at https://chromedevtools.github.io/devtools-protocol/ for
-  // details of supported methods and the expected "params" dictionary contents.
-  // |message| will be copied if necessary. This method will return true if
-  // called on the UI thread and the message was successfully submitted for
-  // validation, otherwise false. Validation will be applied asynchronously and
-  // any messages that fail due to formatting errors or missing parameters may
-  // be discarded without notification. Prefer ExecuteDevToolsMethod if a more
-  // structured approach to message formatting is desired.
-  //
-  // Every valid method call will result in an asynchronous method result or
-  // error message that references the sent message "id". Event messages are
-  // received while notifications are enabled (for example, between method calls
-  // for "Page.enable" and "Page.disable"). All received messages will be
-  // delivered to the observer(s) registered with AddDevToolsMessageObserver.
-  // See CefDevToolsMessageObserver::OnDevToolsMessage documentation for details
-  // of received message contents.
-  //
-  // Usage of the SendDevToolsMessage, ExecuteDevToolsMethod and
-  // AddDevToolsMessageObserver methods does not require an active DevTools
-  // front-end or remote-debugging session. Other active DevTools sessions will
-  // continue to function independently. However, any modification of global
-  // browser state by one session may not be reflected in the UI of other
-  // sessions.
-  //
-  // Communication with the DevTools front-end (when displayed) can be logged
-  // for development purposes by passing the
-  // `--devtools-protocol-log-file=<path>` command-line flag.
+  /// Send a method call message over the DevTools protocol. |message| must be a
+  /// UTF8-encoded JSON dictionary that contains "id" (int), "method" (string)
+  /// and "params" (dictionary, optional) values. See the DevTools protocol
+  /// documentation at https://chromedevtools.github.io/devtools-protocol/ for
+  /// details of supported methods and the expected "params" dictionary
+  /// contents. |message| will be copied if necessary. This method will return
+  /// true if called on the UI thread and the message was successfully submitted
+  /// for validation, otherwise false. Validation will be applied asynchronously
+  /// and any messages that fail due to formatting errors or missing parameters
+  /// may be discarded without notification. Prefer ExecuteDevToolsMethod if a
+  /// more structured approach to message formatting is desired.
+  ///
+  /// Every valid method call will result in an asynchronous method result or
+  /// error message that references the sent message "id". Event messages are
+  /// received while notifications are enabled (for example, between method
+  /// calls for "Page.enable" and "Page.disable"). All received messages will be
+  /// delivered to the observer(s) registered with AddDevToolsMessageObserver.
+  /// See CefDevToolsMessageObserver::OnDevToolsMessage documentation for
+  /// details of received message contents.
+  ///
+  /// Usage of the SendDevToolsMessage, ExecuteDevToolsMethod and
+  /// AddDevToolsMessageObserver methods does not require an active DevTools
+  /// front-end or remote-debugging session. Other active DevTools sessions will
+  /// continue to function independently. However, any modification of global
+  /// browser state by one session may not be reflected in the UI of other
+  /// sessions.
+  ///
+  /// Communication with the DevTools front-end (when displayed) can be logged
+  /// for development purposes by passing the
+  /// `--devtools-protocol-log-file=<path>` command-line flag.
   ///
   /*--cef()--*/
   virtual bool SendDevToolsMessage(const void* message,
                                    size_t message_size) = 0;
 
   ///
-  // Execute a method call over the DevTools protocol. This is a more structured
-  // version of SendDevToolsMessage. |message_id| is an incremental number that
-  // uniquely identifies the message (pass 0 to have the next number assigned
-  // automatically based on previous values). |method| is the method name.
-  // |params| are the method parameters, which may be empty. See the DevTools
-  // protocol documentation (linked above) for details of supported methods and
-  // the expected |params| dictionary contents. This method will return the
-  // assigned message ID if called on the UI thread and the message was
-  // successfully submitted for validation, otherwise 0. See the
-  // SendDevToolsMessage documentation for additional usage information.
+  /// Execute a method call over the DevTools protocol. This is a more
+  /// structured version of SendDevToolsMessage. |message_id| is an incremental
+  /// number that uniquely identifies the message (pass 0 to have the next
+  /// number assigned automatically based on previous values). |method| is the
+  /// method name. |params| are the method parameters, which may be empty. See
+  /// the DevTools protocol documentation (linked above) for details of
+  /// supported methods and the expected |params| dictionary contents. This
+  /// method will return the assigned message ID if called on the UI thread and
+  /// the message was successfully submitted for validation, otherwise 0. See
+  /// the SendDevToolsMessage documentation for additional usage information.
   ///
   /*--cef(optional_param=params)--*/
   virtual int ExecuteDevToolsMethod(int message_id,
@@ -573,19 +604,19 @@
                                     CefRefPtr<CefDictionaryValue> params) = 0;
 
   ///
-  // Add an observer for DevTools protocol messages (method results and events).
-  // The observer will remain registered until the returned Registration object
-  // is destroyed. See the SendDevToolsMessage documentation for additional
-  // usage information.
+  /// Add an observer for DevTools protocol messages (method results and
+  /// events). The observer will remain registered until the returned
+  /// Registration object is destroyed. See the SendDevToolsMessage
+  /// documentation for additional usage information.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefRegistration> AddDevToolsMessageObserver(
       CefRefPtr<CefDevToolsMessageObserver> observer) = 0;
 
   ///
-  // Retrieve a snapshot of current navigation entries as values sent to the
-  // specified visitor. If |current_only| is true only the current navigation
-  // entry will be sent, otherwise all navigation entries will be sent.
+  /// Retrieve a snapshot of current navigation entries as values sent to the
+  /// specified visitor. If |current_only| is true only the current navigation
+  /// entry will be sent, otherwise all navigation entries will be sent.
   ///
   /*--cef()--*/
   virtual void GetNavigationEntries(
@@ -593,88 +624,76 @@
       bool current_only) = 0;
 
   ///
-  // Set whether mouse cursor change is disabled.
-  ///
-  /*--cef()--*/
-  virtual void SetMouseCursorChangeDisabled(bool disabled) = 0;
-
-  ///
-  // Returns true if mouse cursor change is disabled.
-  ///
-  /*--cef()--*/
-  virtual bool IsMouseCursorChangeDisabled() = 0;
-
-  ///
-  // If a misspelled word is currently selected in an editable node calling
-  // this method will replace it with the specified |word|.
+  /// If a misspelled word is currently selected in an editable node calling
+  /// this method will replace it with the specified |word|.
   ///
   /*--cef()--*/
   virtual void ReplaceMisspelling(const CefString& word) = 0;
 
   ///
-  // Add the specified |word| to the spelling dictionary.
+  /// Add the specified |word| to the spelling dictionary.
   ///
   /*--cef()--*/
   virtual void AddWordToDictionary(const CefString& word) = 0;
 
   ///
-  // Returns true if window rendering is disabled.
+  /// Returns true if window rendering is disabled.
   ///
   /*--cef()--*/
   virtual bool IsWindowRenderingDisabled() = 0;
 
   ///
-  // Notify the browser that the widget has been resized. The browser will first
-  // call CefRenderHandler::GetViewRect to get the new size and then call
-  // CefRenderHandler::OnPaint asynchronously with the updated regions. This
-  // method is only used when window rendering is disabled.
+  /// Notify the browser that the widget has been resized. The browser will
+  /// first call CefRenderHandler::GetViewRect to get the new size and then call
+  /// CefRenderHandler::OnPaint asynchronously with the updated regions. This
+  /// method is only used when window rendering is disabled.
   ///
   /*--cef()--*/
   virtual void WasResized() = 0;
 
   ///
-  // Notify the browser that it has been hidden or shown. Layouting and
-  // CefRenderHandler::OnPaint notification will stop when the browser is
-  // hidden. This method is only used when window rendering is disabled.
+  /// Notify the browser that it has been hidden or shown. Layouting and
+  /// CefRenderHandler::OnPaint notification will stop when the browser is
+  /// hidden. This method is only used when window rendering is disabled.
   ///
   /*--cef()--*/
   virtual void WasHidden(bool hidden) = 0;
 
   ///
-  // Send a notification to the browser that the screen info has changed. The
-  // browser will then call CefRenderHandler::GetScreenInfo to update the
-  // screen information with the new values. This simulates moving the webview
-  // window from one display to another, or changing the properties of the
-  // current display. This method is only used when window rendering is
-  // disabled.
+  /// Send a notification to the browser that the screen info has changed. The
+  /// browser will then call CefRenderHandler::GetScreenInfo to update the
+  /// screen information with the new values. This simulates moving the webview
+  /// window from one display to another, or changing the properties of the
+  /// current display. This method is only used when window rendering is
+  /// disabled.
   ///
   /*--cef()--*/
   virtual void NotifyScreenInfoChanged() = 0;
 
   ///
-  // Invalidate the view. The browser will call CefRenderHandler::OnPaint
-  // asynchronously. This method is only used when window rendering is
-  // disabled.
+  /// Invalidate the view. The browser will call CefRenderHandler::OnPaint
+  /// asynchronously. This method is only used when window rendering is
+  /// disabled.
   ///
   /*--cef()--*/
   virtual void Invalidate(PaintElementType type) = 0;
 
   ///
-  // Issue a BeginFrame request to Chromium.  Only valid when
-  // CefWindowInfo::external_begin_frame_enabled is set to true.
+  /// Issue a BeginFrame request to Chromium.  Only valid when
+  /// CefWindowInfo::external_begin_frame_enabled is set to true.
   ///
   /*--cef()--*/
   virtual void SendExternalBeginFrame() = 0;
 
   ///
-  // Send a key event to the browser.
+  /// Send a key event to the browser.
   ///
   /*--cef()--*/
   virtual void SendKeyEvent(const CefKeyEvent& event) = 0;
 
   ///
-  // Send a mouse click event to the browser. The |x| and |y| coordinates are
-  // relative to the upper-left corner of the view.
+  /// Send a mouse click event to the browser. The |x| and |y| coordinates are
+  /// relative to the upper-left corner of the view.
   ///
   /*--cef()--*/
   virtual void SendMouseClickEvent(const CefMouseEvent& event,
@@ -683,19 +702,20 @@
                                    int clickCount) = 0;
 
   ///
-  // Send a mouse move event to the browser. The |x| and |y| coordinates are
-  // relative to the upper-left corner of the view.
+  /// Send a mouse move event to the browser. The |x| and |y| coordinates are
+  /// relative to the upper-left corner of the view.
   ///
   /*--cef()--*/
   virtual void SendMouseMoveEvent(const CefMouseEvent& event,
                                   bool mouseLeave) = 0;
 
   ///
-  // Send a mouse wheel event to the browser. The |x| and |y| coordinates are
-  // relative to the upper-left corner of the view. The |deltaX| and |deltaY|
-  // values represent the movement delta in the X and Y directions respectively.
-  // In order to scroll inside select popups with window rendering disabled
-  // CefRenderHandler::GetScreenPoint should be implemented properly.
+  /// Send a mouse wheel event to the browser. The |x| and |y| coordinates are
+  /// relative to the upper-left corner of the view. The |deltaX| and |deltaY|
+  /// values represent the movement delta in the X and Y directions
+  /// respectively. In order to scroll inside select popups with window
+  /// rendering disabled CefRenderHandler::GetScreenPoint should be implemented
+  /// properly.
   ///
   /*--cef()--*/
   virtual void SendMouseWheelEvent(const CefMouseEvent& event,
@@ -703,72 +723,68 @@
                                    int deltaY) = 0;
 
   ///
-  // Send a touch event to the browser for a windowless browser.
+  /// Send a touch event to the browser for a windowless browser.
   ///
   /*--cef()--*/
   virtual void SendTouchEvent(const CefTouchEvent& event) = 0;
 
   ///
-  // Send a focus event to the browser.
-  ///
-  /*--cef()--*/
-  virtual void SendFocusEvent(bool setFocus) = 0;
-
-  ///
-  // Send a capture lost event to the browser.
+  /// Send a capture lost event to the browser.
   ///
   /*--cef()--*/
   virtual void SendCaptureLostEvent() = 0;
 
   ///
-  // Notify the browser that the window hosting it is about to be moved or
-  // resized. This method is only used on Windows and Linux.
+  /// Notify the browser that the window hosting it is about to be moved or
+  /// resized. This method is only used on Windows and Linux.
   ///
   /*--cef()--*/
   virtual void NotifyMoveOrResizeStarted() = 0;
 
   ///
-  // Returns the maximum rate in frames per second (fps) that CefRenderHandler::
-  // OnPaint will be called for a windowless browser. The actual fps may be
-  // lower if the browser cannot generate frames at the requested rate. The
-  // minimum value is 1 and the maximum value is 60 (default 30). This method
-  // can only be called on the UI thread.
+  /// Returns the maximum rate in frames per second (fps) that
+  /// CefRenderHandler::OnPaint will be called for a windowless browser. The
+  /// actual fps may be lower if the browser cannot generate frames at the
+  /// requested rate. The minimum value is 1 and the maximum value is 60
+  /// (default 30). This method can only be called on the UI thread.
   ///
   /*--cef()--*/
   virtual int GetWindowlessFrameRate() = 0;
 
   ///
-  // Set the maximum rate in frames per second (fps) that CefRenderHandler::
-  // OnPaint will be called for a windowless browser. The actual fps may be
-  // lower if the browser cannot generate frames at the requested rate. The
-  // minimum value is 1 and the maximum value is 60 (default 30). Can also be
-  // set at browser creation via CefBrowserSettings.windowless_frame_rate.
+  /// Set the maximum rate in frames per second (fps) that CefRenderHandler::
+  /// OnPaint will be called for a windowless browser. The actual fps may be
+  /// lower if the browser cannot generate frames at the requested rate. The
+  /// minimum value is 1 and the maximum value is 60 (default 30). Can also be
+  /// set at browser creation via CefBrowserSettings.windowless_frame_rate.
   ///
   /*--cef()--*/
   virtual void SetWindowlessFrameRate(int frame_rate) = 0;
 
   ///
-  // Begins a new composition or updates the existing composition. Blink has a
-  // special node (a composition node) that allows the input method to change
-  // text without affecting other DOM nodes. |text| is the optional text that
-  // will be inserted into the composition node. |underlines| is an optional set
-  // of ranges that will be underlined in the resulting text.
-  // |replacement_range| is an optional range of the existing text that will be
-  // replaced. |selection_range| is an optional range of the resulting text that
-  // will be selected after insertion or replacement. The |replacement_range|
-  // value is only used on OS X.
-  //
-  // This method may be called multiple times as the composition changes. When
-  // the client is done making changes the composition should either be canceled
-  // or completed. To cancel the composition call ImeCancelComposition. To
-  // complete the composition call either ImeCommitText or
-  // ImeFinishComposingText. Completion is usually signaled when:
-  //   A. The client receives a WM_IME_COMPOSITION message with a GCS_RESULTSTR
-  //      flag (on Windows), or;
-  //   B. The client receives a "commit" signal of GtkIMContext (on Linux), or;
-  //   C. insertText of NSTextInput is called (on Mac).
-  //
-  // This method is only used when window rendering is disabled.
+  /// Begins a new composition or updates the existing composition. Blink has a
+  /// special node (a composition node) that allows the input method to change
+  /// text without affecting other DOM nodes. |text| is the optional text that
+  /// will be inserted into the composition node. |underlines| is an optional
+  /// set of ranges that will be underlined in the resulting text.
+  /// |replacement_range| is an optional range of the existing text that will be
+  /// replaced. |selection_range| is an optional range of the resulting text
+  /// that will be selected after insertion or replacement. The
+  /// |replacement_range| value is only used on OS X.
+  ///
+  /// This method may be called multiple times as the composition changes. When
+  /// the client is done making changes the composition should either be
+  /// canceled or completed. To cancel the composition call
+  /// ImeCancelComposition. To complete the composition call either
+  /// ImeCommitText or ImeFinishComposingText. Completion is usually signaled
+  /// when:
+  ///
+  /// 1. The client receives a WM_IME_COMPOSITION message with a GCS_RESULTSTR
+  ///    flag (on Windows), or;
+  /// 2. The client receives a "commit" signal of GtkIMContext (on Linux), or;
+  /// 3. insertText of NSTextInput is called (on Mac).
+  ///
+  /// This method is only used when window rendering is disabled.
   ///
   /*--cef(optional_param=text, optional_param=underlines)--*/
   virtual void ImeSetComposition(
@@ -778,13 +794,13 @@
       const CefRange& selection_range) = 0;
 
   ///
-  // Completes the existing composition by optionally inserting the specified
-  // |text| into the composition node. |replacement_range| is an optional range
-  // of the existing text that will be replaced. |relative_cursor_pos| is where
-  // the cursor will be positioned relative to the current cursor position. See
-  // comments on ImeSetComposition for usage. The |replacement_range| and
-  // |relative_cursor_pos| values are only used on OS X.
-  // This method is only used when window rendering is disabled.
+  /// Completes the existing composition by optionally inserting the specified
+  /// |text| into the composition node. |replacement_range| is an optional range
+  /// of the existing text that will be replaced. |relative_cursor_pos| is where
+  /// the cursor will be positioned relative to the current cursor position. See
+  /// comments on ImeSetComposition for usage. The |replacement_range| and
+  /// |relative_cursor_pos| values are only used on OS X.
+  /// This method is only used when window rendering is disabled.
   ///
   /*--cef(optional_param=text)--*/
   virtual void ImeCommitText(const CefString& text,
@@ -792,31 +808,31 @@
                              int relative_cursor_pos) = 0;
 
   ///
-  // Completes the existing composition by applying the current composition node
-  // contents. If |keep_selection| is false the current selection, if any, will
-  // be discarded. See comments on ImeSetComposition for usage.
-  // This method is only used when window rendering is disabled.
+  /// Completes the existing composition by applying the current composition
+  /// node contents. If |keep_selection| is false the current selection, if any,
+  /// will be discarded. See comments on ImeSetComposition for usage. This
+  /// method is only used when window rendering is disabled.
   ///
   /*--cef()--*/
   virtual void ImeFinishComposingText(bool keep_selection) = 0;
 
   ///
-  // Cancels the existing composition and discards the composition node
-  // contents without applying them. See comments on ImeSetComposition for
-  // usage.
-  // This method is only used when window rendering is disabled.
+  /// Cancels the existing composition and discards the composition node
+  /// contents without applying them. See comments on ImeSetComposition for
+  /// usage.
+  /// This method is only used when window rendering is disabled.
   ///
   /*--cef()--*/
   virtual void ImeCancelComposition() = 0;
 
   ///
-  // Call this method when the user drags the mouse into the web view (before
-  // calling DragTargetDragOver/DragTargetLeave/DragTargetDrop).
-  // |drag_data| should not contain file contents as this type of data is not
-  // allowed to be dragged into the web view. File contents can be removed using
-  // CefDragData::ResetFileContents (for example, if |drag_data| comes from
-  // CefRenderHandler::StartDragging).
-  // This method is only used when window rendering is disabled.
+  /// Call this method when the user drags the mouse into the web view (before
+  /// calling DragTargetDragOver/DragTargetLeave/DragTargetDrop).
+  /// |drag_data| should not contain file contents as this type of data is not
+  /// allowed to be dragged into the web view. File contents can be removed
+  /// using CefDragData::ResetFileContents (for example, if |drag_data| comes
+  /// from CefRenderHandler::StartDragging). This method is only used when
+  /// window rendering is disabled.
   ///
   /*--cef()--*/
   virtual void DragTargetDragEnter(CefRefPtr<CefDragData> drag_data,
@@ -824,97 +840,97 @@
                                    DragOperationsMask allowed_ops) = 0;
 
   ///
-  // Call this method each time the mouse is moved across the web view during
-  // a drag operation (after calling DragTargetDragEnter and before calling
-  // DragTargetDragLeave/DragTargetDrop).
-  // This method is only used when window rendering is disabled.
+  /// Call this method each time the mouse is moved across the web view during
+  /// a drag operation (after calling DragTargetDragEnter and before calling
+  /// DragTargetDragLeave/DragTargetDrop).
+  /// This method is only used when window rendering is disabled.
   ///
   /*--cef()--*/
   virtual void DragTargetDragOver(const CefMouseEvent& event,
                                   DragOperationsMask allowed_ops) = 0;
 
   ///
-  // Call this method when the user drags the mouse out of the web view (after
-  // calling DragTargetDragEnter).
-  // This method is only used when window rendering is disabled.
+  /// Call this method when the user drags the mouse out of the web view (after
+  /// calling DragTargetDragEnter).
+  /// This method is only used when window rendering is disabled.
   ///
   /*--cef()--*/
   virtual void DragTargetDragLeave() = 0;
 
   ///
-  // Call this method when the user completes the drag operation by dropping
-  // the object onto the web view (after calling DragTargetDragEnter).
-  // The object being dropped is |drag_data|, given as an argument to
-  // the previous DragTargetDragEnter call.
-  // This method is only used when window rendering is disabled.
+  /// Call this method when the user completes the drag operation by dropping
+  /// the object onto the web view (after calling DragTargetDragEnter).
+  /// The object being dropped is |drag_data|, given as an argument to
+  /// the previous DragTargetDragEnter call.
+  /// This method is only used when window rendering is disabled.
   ///
   /*--cef()--*/
   virtual void DragTargetDrop(const CefMouseEvent& event) = 0;
 
   ///
-  // Call this method when the drag operation started by a
-  // CefRenderHandler::StartDragging call has ended either in a drop or
-  // by being cancelled. |x| and |y| are mouse coordinates relative to the
-  // upper-left corner of the view. If the web view is both the drag source
-  // and the drag target then all DragTarget* methods should be called before
-  // DragSource* mthods.
-  // This method is only used when window rendering is disabled.
+  /// Call this method when the drag operation started by a
+  /// CefRenderHandler::StartDragging call has ended either in a drop or
+  /// by being cancelled. |x| and |y| are mouse coordinates relative to the
+  /// upper-left corner of the view. If the web view is both the drag source
+  /// and the drag target then all DragTarget* methods should be called before
+  /// DragSource* mthods.
+  /// This method is only used when window rendering is disabled.
   ///
   /*--cef()--*/
   virtual void DragSourceEndedAt(int x, int y, DragOperationsMask op) = 0;
 
   ///
-  // Call this method when the drag operation started by a
-  // CefRenderHandler::StartDragging call has completed. This method may be
-  // called immediately without first calling DragSourceEndedAt to cancel a
-  // drag operation. If the web view is both the drag source and the drag
-  // target then all DragTarget* methods should be called before DragSource*
-  // mthods.
-  // This method is only used when window rendering is disabled.
+  /// Call this method when the drag operation started by a
+  /// CefRenderHandler::StartDragging call has completed. This method may be
+  /// called immediately without first calling DragSourceEndedAt to cancel a
+  /// drag operation. If the web view is both the drag source and the drag
+  /// target then all DragTarget* methods should be called before DragSource*
+  /// mthods.
+  /// This method is only used when window rendering is disabled.
   ///
   /*--cef()--*/
   virtual void DragSourceSystemDragEnded() = 0;
 
   ///
-  // Returns the current visible navigation entry for this browser. This method
-  // can only be called on the UI thread.
+  /// Returns the current visible navigation entry for this browser. This method
+  /// can only be called on the UI thread.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefNavigationEntry> GetVisibleNavigationEntry() = 0;
 
   ///
-  // Set accessibility state for all frames. |accessibility_state| may be
-  // default, enabled or disabled. If |accessibility_state| is STATE_DEFAULT
-  // then accessibility will be disabled by default and the state may be further
-  // controlled with the "force-renderer-accessibility" and
-  // "disable-renderer-accessibility" command-line switches. If
-  // |accessibility_state| is STATE_ENABLED then accessibility will be enabled.
-  // If |accessibility_state| is STATE_DISABLED then accessibility will be
-  // completely disabled.
-  //
-  // For windowed browsers accessibility will be enabled in Complete mode (which
-  // corresponds to kAccessibilityModeComplete in Chromium). In this mode all
-  // platform accessibility objects will be created and managed by Chromium's
-  // internal implementation. The client needs only to detect the screen reader
-  // and call this method appropriately. For example, on macOS the client can
-  // handle the @"AXEnhancedUserInterface" accessibility attribute to detect
-  // VoiceOver state changes and on Windows the client can handle WM_GETOBJECT
-  // with OBJID_CLIENT to detect accessibility readers.
-  //
-  // For windowless browsers accessibility will be enabled in TreeOnly mode
-  // (which corresponds to kAccessibilityModeWebContentsOnly in Chromium). In
-  // this mode renderer accessibility is enabled, the full tree is computed, and
-  // events are passed to CefAccessibiltyHandler, but platform accessibility
-  // objects are not created. The client may implement platform accessibility
-  // objects using CefAccessibiltyHandler callbacks if desired.
+  /// Set accessibility state for all frames. |accessibility_state| may be
+  /// default, enabled or disabled. If |accessibility_state| is STATE_DEFAULT
+  /// then accessibility will be disabled by default and the state may be
+  /// further controlled with the "force-renderer-accessibility" and
+  /// "disable-renderer-accessibility" command-line switches. If
+  /// |accessibility_state| is STATE_ENABLED then accessibility will be enabled.
+  /// If |accessibility_state| is STATE_DISABLED then accessibility will be
+  /// completely disabled.
+  ///
+  /// For windowed browsers accessibility will be enabled in Complete mode
+  /// (which corresponds to kAccessibilityModeComplete in Chromium). In this
+  /// mode all platform accessibility objects will be created and managed by
+  /// Chromium's internal implementation. The client needs only to detect the
+  /// screen reader and call this method appropriately. For example, on macOS
+  /// the client can handle the @"AXEnhancedUserInterface" accessibility
+  /// attribute to detect VoiceOver state changes and on Windows the client can
+  /// handle WM_GETOBJECT with OBJID_CLIENT to detect accessibility readers.
+  ///
+  /// For windowless browsers accessibility will be enabled in TreeOnly mode
+  /// (which corresponds to kAccessibilityModeWebContentsOnly in Chromium). In
+  /// this mode renderer accessibility is enabled, the full tree is computed,
+  /// and events are passed to CefAccessibiltyHandler, but platform
+  /// accessibility objects are not created. The client may implement platform
+  /// accessibility objects using CefAccessibiltyHandler callbacks if desired.
   ///
   /*--cef()--*/
   virtual void SetAccessibilityState(cef_state_t accessibility_state) = 0;
 
   ///
-  // Enable notifications of auto resize via CefDisplayHandler::OnAutoResize.
-  // Notifications are disabled by default. |min_size| and |max_size| define the
-  // range of allowed sizes.
+  /// Enable notifications of auto resize via CefDisplayHandler::OnAutoResize.
+  /// Notifications are disabled by default. |min_size| and |max_size| define
+  /// the range of allowed sizes.
   ///
   /*--cef()--*/
   virtual void SetAutoResizeEnabled(bool enabled,
@@ -922,32 +938,74 @@
                                     const CefSize& max_size) = 0;
 
   ///
-  // Returns the extension hosted in this browser or NULL if no extension is
-  // hosted. See CefRequestContext::LoadExtension for details.
+  /// Returns the extension hosted in this browser or NULL if no extension is
+  /// hosted. See CefRequestContext::LoadExtension for details.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefExtension> GetExtension() = 0;
 
   ///
-  // Returns true if this browser is hosting an extension background script.
-  // Background hosts do not have a window and are not displayable. See
-  // CefRequestContext::LoadExtension for details.
+  /// Returns true if this browser is hosting an extension background script.
+  /// Background hosts do not have a window and are not displayable. See
+  /// CefRequestContext::LoadExtension for details.
   ///
   /*--cef()--*/
   virtual bool IsBackgroundHost() = 0;
 
   ///
-  //  Set whether the browser's audio is muted.
+  /// Set whether the browser's audio is muted.
   ///
   /*--cef()--*/
   virtual void SetAudioMuted(bool mute) = 0;
 
   ///
-  // Returns true if the browser's audio is muted.  This method can only be
-  // called on the UI thread.
+  /// Returns true if the browser's audio is muted.  This method can only be
+  /// called on the UI thread.
   ///
   /*--cef()--*/
   virtual bool IsAudioMuted() = 0;
+
+  ///
+  /// Returns true if the renderer is currently in browser fullscreen. This
+  /// differs from window fullscreen in that browser fullscreen is entered using
+  /// the JavaScript Fullscreen API and modifies CSS attributes such as the
+  /// ::backdrop pseudo-element and :fullscreen pseudo-class. This method can
+  /// only be called on the UI thread.
+  ///
+  /*--cef()--*/
+  virtual bool IsFullscreen() = 0;
+
+  ///
+  /// Requests the renderer to exit browser fullscreen. In most cases exiting
+  /// window fullscreen should also exit browser fullscreen. With the Alloy
+  /// runtime this method should be called in response to a user action such as
+  /// clicking the green traffic light button on MacOS
+  /// (CefWindowDelegate::OnWindowFullscreenTransition callback) or pressing the
+  /// "ESC" key (CefKeyboardHandler::OnPreKeyEvent callback). With the Chrome
+  /// runtime these standard exit actions are handled internally but
+  /// new/additional user actions can use this method. Set |will_cause_resize|
+  /// to true if exiting browser fullscreen will cause a view resize.
+  ///
+  /*--cef()--*/
+  virtual void ExitFullscreen(bool will_cause_resize) = 0;
+
+  ///
+  /// Returns true if a Chrome command is supported and enabled. Values for
+  /// |command_id| can be found in the cef_command_ids.h file. This method can
+  /// only be called on the UI thread. Only used with the Chrome runtime.
+  ///
+  /*--cef()--*/
+  virtual bool CanExecuteChromeCommand(int command_id) = 0;
+
+  ///
+  /// Execute a Chrome command. Values for |command_id| can be found in the
+  /// cef_command_ids.h file. |disposition| provides information about the
+  /// intended command target. Only used with the Chrome runtime.
+  ///
+  /*--cef()--*/
+  virtual void ExecuteChromeCommand(
+      int command_id,
+      cef_window_open_disposition_t disposition) = 0;
 };
 
 #endif  // CEF_INCLUDE_CEF_BROWSER_H_
diff --git a/src/include/cef_browser_process_handler.h b/src/include/cef_browser_process_handler.h
index 7120606..4ab8c9a 100644
--- a/src/include/cef_browser_process_handler.h
+++ b/src/include/cef_browser_process_handler.h
@@ -39,68 +39,89 @@
 #pragma once
 
 #include "include/cef_base.h"
+#include "include/cef_client.h"
 #include "include/cef_command_line.h"
-#include "include/cef_print_handler.h"
+#include "include/cef_preference.h"
 #include "include/cef_values.h"
 
 ///
-// Class used to implement browser process callbacks. The methods of this class
-// will be called on the browser process main thread unless otherwise indicated.
+/// Class used to implement browser process callbacks. The methods of this class
+/// will be called on the browser process main thread unless otherwise
+/// indicated.
 ///
 /*--cef(source=client,no_debugct_check)--*/
 class CefBrowserProcessHandler : public virtual CefBaseRefCounted {
  public:
   ///
-  // Called on the browser process UI thread immediately after the CEF context
-  // has been initialized.
+  /// Provides an opportunity to register custom preferences prior to
+  /// global and request context initialization.
+  ///
+  /// If |type| is CEF_PREFERENCES_TYPE_GLOBAL the registered preferences can be
+  /// accessed via CefPreferenceManager::GetGlobalPreferences after
+  /// OnContextInitialized is called. Global preferences are registered a single
+  /// time at application startup. See related cef_settings_t.cache_path and
+  /// cef_settings_t.persist_user_preferences configuration.
+  ///
+  /// If |type| is CEF_PREFERENCES_TYPE_REQUEST_CONTEXT the preferences can be
+  /// accessed via the CefRequestContext after
+  /// CefRequestContextHandler::OnRequestContextInitialized is called. Request
+  /// context preferences are registered each time a new CefRequestContext is
+  /// created. It is intended but not required that all request contexts have
+  /// the same registered preferences. See related
+  /// cef_request_context_settings_t.cache_path and
+  /// cef_request_context_settings_t.persist_user_preferences configuration.
+  ///
+  /// Do not keep a reference to the |registrar| object. This method is called
+  /// on the browser process UI thread.
+  ///
+  /*--cef()--*/
+  virtual void OnRegisterCustomPreferences(
+      cef_preferences_type_t type,
+      CefRawPtr<CefPreferenceRegistrar> registrar) {}
+
+  ///
+  /// Called on the browser process UI thread immediately after the CEF context
+  /// has been initialized.
   ///
   /*--cef()--*/
   virtual void OnContextInitialized() {}
 
   ///
-  // Called before a child process is launched. Will be called on the browser
-  // process UI thread when launching a render process and on the browser
-  // process IO thread when launching a GPU or plugin process. Provides an
-  // opportunity to modify the child process command line. Do not keep a
-  // reference to |command_line| outside of this method.
+  /// Called before a child process is launched. Will be called on the browser
+  /// process UI thread when launching a render process and on the browser
+  /// process IO thread when launching a GPU process. Provides an opportunity to
+  /// modify the child process command line. Do not keep a reference to
+  /// |command_line| outside of this method.
   ///
   /*--cef()--*/
   virtual void OnBeforeChildProcessLaunch(
       CefRefPtr<CefCommandLine> command_line) {}
 
   ///
-  // Called on the browser process IO thread after the main thread has been
-  // created for a new render process. Provides an opportunity to specify extra
-  // information that will be passed to
-  // CefRenderProcessHandler::OnRenderThreadCreated() in the render process. Do
-  // not keep a reference to |extra_info| outside of this method.
+  /// Called from any thread when work has been scheduled for the browser
+  /// process main (UI) thread. This callback is used in combination with
+  /// cef_settings_t.external_message_pump and CefDoMessageLoopWork() in cases
+  /// where the CEF message loop must be integrated into an existing application
+  /// message loop (see additional comments and warnings on
+  /// CefDoMessageLoopWork). This callback should schedule a
+  /// CefDoMessageLoopWork() call to happen on the main (UI) thread. |delay_ms|
+  /// is the requested delay in milliseconds. If |delay_ms| is <= 0 then the
+  /// call should happen reasonably soon. If |delay_ms| is > 0 then the call
+  /// should be scheduled to happen after the specified delay and any currently
+  /// pending scheduled call should be cancelled.
   ///
   /*--cef()--*/
-  virtual void OnRenderProcessThreadCreated(
-      CefRefPtr<CefListValue> extra_info) {}
+  virtual void OnScheduleMessagePumpWork(int64_t delay_ms) {}
 
   ///
-  // Return the handler for printing on Linux. If a print handler is not
-  // provided then printing will not be supported on the Linux platform.
+  /// Return the default client for use with a newly created browser window. If
+  /// null is returned the browser will be unmanaged (no callbacks will be
+  /// executed for that browser) and application shutdown will be blocked until
+  /// the browser window is closed manually. This method is currently only used
+  /// with the chrome runtime.
   ///
   /*--cef()--*/
-  virtual CefRefPtr<CefPrintHandler> GetPrintHandler() { return nullptr; }
-
-  ///
-  // Called from any thread when work has been scheduled for the browser process
-  // main (UI) thread. This callback is used in combination with CefSettings.
-  // external_message_pump and CefDoMessageLoopWork() in cases where the CEF
-  // message loop must be integrated into an existing application message loop
-  // (see additional comments and warnings on CefDoMessageLoopWork). This
-  // callback should schedule a CefDoMessageLoopWork() call to happen on the
-  // main (UI) thread. |delay_ms| is the requested delay in milliseconds. If
-  // |delay_ms| is <= 0 then the call should happen reasonably soon. If
-  // |delay_ms| is > 0 then the call should be scheduled to happen after the
-  // specified delay and any currently pending scheduled call should be
-  // cancelled.
-  ///
-  /*--cef()--*/
-  virtual void OnScheduleMessagePumpWork(int64 delay_ms) {}
+  virtual CefRefPtr<CefClient> GetDefaultClient() { return nullptr; }
 };
 
 #endif  // CEF_INCLUDE_CEF_BROWSER_PROCESS_HANDLER_H_
diff --git a/src/include/cef_callback.h b/src/include/cef_callback.h
index e206cb9..b9e1111 100644
--- a/src/include/cef_callback.h
+++ b/src/include/cef_callback.h
@@ -41,32 +41,32 @@
 #include "include/cef_base.h"
 
 ///
-// Generic callback interface used for asynchronous continuation.
+/// Generic callback interface used for asynchronous continuation.
 ///
 /*--cef(source=library)--*/
 class CefCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Continue processing.
+  /// Continue processing.
   ///
   /*--cef(capi_name=cont)--*/
   virtual void Continue() = 0;
 
   ///
-  // Cancel processing.
+  /// Cancel processing.
   ///
   /*--cef()--*/
   virtual void Cancel() = 0;
 };
 
 ///
-// Generic callback interface used for asynchronous completion.
+/// Generic callback interface used for asynchronous completion.
 ///
 /*--cef(source=client)--*/
 class CefCompletionCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Method that will be called once the task is complete.
+  /// Method that will be called once the task is complete.
   ///
   /*--cef()--*/
   virtual void OnComplete() = 0;
diff --git a/src/include/cef_client.h b/src/include/cef_client.h
index ada7a6a..758c75f 100644
--- a/src/include/cef_client.h
+++ b/src/include/cef_client.h
@@ -40,6 +40,7 @@
 
 #include "include/cef_audio_handler.h"
 #include "include/cef_base.h"
+#include "include/cef_command_handler.h"
 #include "include/cef_context_menu_handler.h"
 #include "include/cef_dialog_handler.h"
 #include "include/cef_display_handler.h"
@@ -47,29 +48,39 @@
 #include "include/cef_drag_handler.h"
 #include "include/cef_find_handler.h"
 #include "include/cef_focus_handler.h"
+#include "include/cef_frame_handler.h"
 #include "include/cef_jsdialog_handler.h"
 #include "include/cef_keyboard_handler.h"
 #include "include/cef_life_span_handler.h"
 #include "include/cef_load_handler.h"
+#include "include/cef_permission_handler.h"
+#include "include/cef_print_handler.h"
 #include "include/cef_process_message.h"
 #include "include/cef_render_handler.h"
 #include "include/cef_request_handler.h"
 
 ///
-// Implement this interface to provide handler implementations.
+/// Implement this interface to provide handler implementations.
 ///
 /*--cef(source=client,no_debugct_check)--*/
 class CefClient : public virtual CefBaseRefCounted {
  public:
   ///
-  // Return the handler for audio rendering events.
+  /// Return the handler for audio rendering events.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefAudioHandler> GetAudioHandler() { return nullptr; }
 
   ///
-  // Return the handler for context menus. If no handler is provided the default
-  // implementation will be used.
+  /// Return the handler for commands. If no handler is provided the default
+  /// implementation will be used.
+  ///
+  /*--cef()--*/
+  virtual CefRefPtr<CefCommandHandler> GetCommandHandler() { return nullptr; }
+
+  ///
+  /// Return the handler for context menus. If no handler is provided the
+  /// default implementation will be used.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefContextMenuHandler> GetContextMenuHandler() {
@@ -77,84 +88,107 @@
   }
 
   ///
-  // Return the handler for dialogs. If no handler is provided the default
-  // implementation will be used.
+  /// Return the handler for dialogs. If no handler is provided the default
+  /// implementation will be used.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDialogHandler> GetDialogHandler() { return nullptr; }
 
   ///
-  // Return the handler for browser display state events.
+  /// Return the handler for browser display state events.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDisplayHandler> GetDisplayHandler() { return nullptr; }
 
   ///
-  // Return the handler for download events. If no handler is returned downloads
-  // will not be allowed.
+  /// Return the handler for download events. If no handler is returned
+  /// downloads will not be allowed.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDownloadHandler> GetDownloadHandler() { return nullptr; }
 
   ///
-  // Return the handler for drag events.
+  /// Return the handler for drag events.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDragHandler> GetDragHandler() { return nullptr; }
 
   ///
-  // Return the handler for find result events.
+  /// Return the handler for find result events.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefFindHandler> GetFindHandler() { return nullptr; }
 
   ///
-  // Return the handler for focus events.
+  /// Return the handler for focus events.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefFocusHandler> GetFocusHandler() { return nullptr; }
 
   ///
-  // Return the handler for JavaScript dialogs. If no handler is provided the
-  // default implementation will be used.
+  /// Return the handler for events related to CefFrame lifespan. This method
+  /// will be called once during CefBrowser creation and the result will be
+  /// cached for performance reasons.
+  ///
+  /*--cef()--*/
+  virtual CefRefPtr<CefFrameHandler> GetFrameHandler() { return nullptr; }
+
+  ///
+  /// Return the handler for permission requests.
+  ///
+  /*--cef()--*/
+  virtual CefRefPtr<CefPermissionHandler> GetPermissionHandler() {
+    return nullptr;
+  }
+
+  ///
+  /// Return the handler for JavaScript dialogs. If no handler is provided the
+  /// default implementation will be used.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefJSDialogHandler> GetJSDialogHandler() { return nullptr; }
 
   ///
-  // Return the handler for keyboard events.
+  /// Return the handler for keyboard events.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefKeyboardHandler> GetKeyboardHandler() { return nullptr; }
 
   ///
-  // Return the handler for browser life span events.
+  /// Return the handler for browser life span events.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler() { return nullptr; }
 
   ///
-  // Return the handler for browser load status events.
+  /// Return the handler for browser load status events.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefLoadHandler> GetLoadHandler() { return nullptr; }
 
   ///
-  // Return the handler for off-screen rendering events.
+  /// Return the handler for printing on Linux. If a print handler is not
+  /// provided then printing will not be supported on the Linux platform.
+  ///
+  /*--cef()--*/
+  virtual CefRefPtr<CefPrintHandler> GetPrintHandler() { return nullptr; }
+
+  ///
+  /// Return the handler for off-screen rendering events.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefRenderHandler> GetRenderHandler() { return nullptr; }
 
   ///
-  // Return the handler for browser request events.
+  /// Return the handler for browser request events.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefRequestHandler> GetRequestHandler() { return nullptr; }
 
   ///
-  // Called when a new message is received from a different process. Return true
-  // if the message was handled or false otherwise. Do not keep a reference to
-  // or attempt to access the message outside of this callback.
+  /// Called when a new message is received from a different process. Return
+  /// true if the message was handled or false otherwise.  It is safe to keep a
+  /// reference to |message| outside of this callback.
   ///
   /*--cef()--*/
   virtual bool OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
diff --git a/src/include/cef_command_handler.h b/src/include/cef_command_handler.h
new file mode 100644
index 0000000..eed05a0
--- /dev/null
+++ b/src/include/cef_command_handler.h
@@ -0,0 +1,114 @@
+// Copyright (c) 2022 Marshall A. Greenblatt. 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.
+//
+// ---------------------------------------------------------------------------
+//
+// The contents of this file must follow a specific format in order to
+// support the CEF translator tool. See the translator.README.txt file in the
+// tools directory for more information.
+//
+
+#ifndef CEF_INCLUDE_CEF_COMMAND_HANDLER_H_
+#define CEF_INCLUDE_CEF_COMMAND_HANDLER_H_
+#pragma once
+
+#include "include/cef_base.h"
+#include "include/cef_browser.h"
+
+///
+/// Implement this interface to handle events related to commands. The methods
+/// of this class will be called on the UI thread.
+///
+/*--cef(source=client)--*/
+class CefCommandHandler : public virtual CefBaseRefCounted {
+ public:
+  ///
+  /// Called to execute a Chrome command triggered via menu selection or
+  /// keyboard shortcut. Values for |command_id| can be found in the
+  /// cef_command_ids.h file. |disposition| provides information about the
+  /// intended command target. Return true if the command was handled or false
+  /// for the default implementation. For context menu commands this will be
+  /// called after CefContextMenuHandler::OnContextMenuCommand. Only used with
+  /// the Chrome runtime.
+  ///
+  /*--cef()--*/
+  virtual bool OnChromeCommand(CefRefPtr<CefBrowser> browser,
+                               int command_id,
+                               cef_window_open_disposition_t disposition) {
+    return false;
+  }
+
+  ///
+  /// Called to check if a Chrome app menu item should be visible. Values for
+  /// |command_id| can be found in the cef_command_ids.h file. Only called for
+  /// menu items that would be visible by default. Only used with the Chrome
+  /// runtime.
+  ///
+  /*--cef()--*/
+  virtual bool IsChromeAppMenuItemVisible(CefRefPtr<CefBrowser> browser,
+                                          int command_id) {
+    return true;
+  }
+
+  ///
+  /// Called to check if a Chrome app menu item should be enabled. Values for
+  /// |command_id| can be found in the cef_command_ids.h file. Only called for
+  /// menu items that would be enabled by default. Only used with the Chrome
+  /// runtime.
+  ///
+  /*--cef()--*/
+  virtual bool IsChromeAppMenuItemEnabled(CefRefPtr<CefBrowser> browser,
+                                          int command_id) {
+    return true;
+  }
+
+  ///
+  /// Called during browser creation to check if a Chrome page action icon
+  /// should be visible. Only called for icons that would be visible by default.
+  /// Only used with the Chrome runtime.
+  ///
+  /*--cef(optional_param=browser)--*/
+  virtual bool IsChromePageActionIconVisible(
+      cef_chrome_page_action_icon_type_t icon_type) {
+    return true;
+  }
+
+  ///
+  /// Called during browser creation to check if a Chrome toolbar button
+  /// should be visible. Only called for buttons that would be visible by
+  /// default. Only used with the Chrome runtime.
+  ///
+  /*--cef(optional_param=browser)--*/
+  virtual bool IsChromeToolbarButtonVisible(
+      cef_chrome_toolbar_button_type_t button_type) {
+    return true;
+  }
+};
+
+#endif  // CEF_INCLUDE_CEF_COMMAND_HANDLER_H_
diff --git a/src/include/cef_command_line.h b/src/include/cef_command_line.h
index dd5491c..9ae6ee6 100644
--- a/src/include/cef_command_line.h
+++ b/src/include/cef_command_line.h
@@ -43,14 +43,15 @@
 #include "include/cef_base.h"
 
 ///
-// Class used to create and/or parse command line arguments. Arguments with
-// '--', '-' and, on Windows, '/' prefixes are considered switches. Switches
-// will always precede any arguments without switch prefixes. Switches can
-// optionally have a value specified using the '=' delimiter (e.g.
-// "-switch=value"). An argument of "--" will terminate switch parsing with all
-// subsequent tokens, regardless of prefix, being interpreted as non-switch
-// arguments. Switch names are considered case-insensitive. This class can be
-// used before CefInitialize() is called.
+/// Class used to create and/or parse command line arguments. Arguments with
+/// "--", "-" and, on Windows, "/" prefixes are considered switches. Switches
+/// will always precede any arguments without switch prefixes. Switches can
+/// optionally have a value specified using the "=" delimiter (e.g.
+/// "-switch=value"). An argument of "--" will terminate switch parsing with all
+/// subsequent tokens, regardless of prefix, being interpreted as non-switch
+/// arguments. Switch names should be lowercase ASCII and will be converted to
+/// such if necessary. Switch values will retain the original case and UTF8
+/// encoding. This class can be used before CefInitialize() is called.
 ///
 /*--cef(source=library,no_debugct_check)--*/
 class CefCommandLine : public virtual CefBaseRefCounted {
@@ -59,147 +60,148 @@
   typedef std::map<CefString, CefString> SwitchMap;
 
   ///
-  // Create a new CefCommandLine instance.
+  /// Create a new CefCommandLine instance.
   ///
   /*--cef(api_hash_check)--*/
   static CefRefPtr<CefCommandLine> CreateCommandLine();
 
   ///
-  // Returns the singleton global CefCommandLine object. The returned object
-  // will be read-only.
+  /// Returns the singleton global CefCommandLine object. The returned object
+  /// will be read-only.
   ///
   /*--cef(api_hash_check)--*/
   static CefRefPtr<CefCommandLine> GetGlobalCommandLine();
 
   ///
-  // Returns true if this object is valid. Do not call any other methods if this
-  // function returns false.
+  /// Returns true if this object is valid. Do not call any other methods if
+  /// this function returns false.
   ///
   /*--cef()--*/
   virtual bool IsValid() = 0;
 
   ///
-  // Returns true if the values of this object are read-only. Some APIs may
-  // expose read-only objects.
+  /// Returns true if the values of this object are read-only. Some APIs may
+  /// expose read-only objects.
   ///
   /*--cef()--*/
   virtual bool IsReadOnly() = 0;
 
   ///
-  // Returns a writable copy of this object.
+  /// Returns a writable copy of this object.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefCommandLine> Copy() = 0;
 
   ///
-  // Initialize the command line with the specified |argc| and |argv| values.
-  // The first argument must be the name of the program. This method is only
-  // supported on non-Windows platforms.
+  /// Initialize the command line with the specified |argc| and |argv| values.
+  /// The first argument must be the name of the program. This method is only
+  /// supported on non-Windows platforms.
   ///
   /*--cef()--*/
   virtual void InitFromArgv(int argc, const char* const* argv) = 0;
 
   ///
-  // Initialize the command line with the string returned by calling
-  // GetCommandLineW(). This method is only supported on Windows.
+  /// Initialize the command line with the string returned by calling
+  /// GetCommandLineW(). This method is only supported on Windows.
   ///
   /*--cef()--*/
   virtual void InitFromString(const CefString& command_line) = 0;
 
   ///
-  // Reset the command-line switches and arguments but leave the program
-  // component unchanged.
+  /// Reset the command-line switches and arguments but leave the program
+  /// component unchanged.
   ///
   /*--cef()--*/
   virtual void Reset() = 0;
 
   ///
-  // Retrieve the original command line string as a vector of strings.
-  // The argv array: { program, [(--|-|/)switch[=value]]*, [--], [argument]* }
+  /// Retrieve the original command line string as a vector of strings.
+  /// The argv array:
+  /// `{ program, [(--|-|/)switch[=value]]*, [--], [argument]* }`
   ///
   /*--cef()--*/
   virtual void GetArgv(std::vector<CefString>& argv) = 0;
 
   ///
-  // Constructs and returns the represented command line string. Use this method
-  // cautiously because quoting behavior is unclear.
+  /// Constructs and returns the represented command line string. Use this
+  /// method cautiously because quoting behavior is unclear.
   ///
   /*--cef()--*/
   virtual CefString GetCommandLineString() = 0;
 
   ///
-  // Get the program part of the command line string (the first item).
+  /// Get the program part of the command line string (the first item).
   ///
   /*--cef()--*/
   virtual CefString GetProgram() = 0;
 
   ///
-  // Set the program part of the command line string (the first item).
+  /// Set the program part of the command line string (the first item).
   ///
   /*--cef()--*/
   virtual void SetProgram(const CefString& program) = 0;
 
   ///
-  // Returns true if the command line has switches.
+  /// Returns true if the command line has switches.
   ///
   /*--cef()--*/
   virtual bool HasSwitches() = 0;
 
   ///
-  // Returns true if the command line contains the given switch.
+  /// Returns true if the command line contains the given switch.
   ///
   /*--cef()--*/
   virtual bool HasSwitch(const CefString& name) = 0;
 
   ///
-  // Returns the value associated with the given switch. If the switch has no
-  // value or isn't present this method returns the empty string.
+  /// Returns the value associated with the given switch. If the switch has no
+  /// value or isn't present this method returns the empty string.
   ///
   /*--cef()--*/
   virtual CefString GetSwitchValue(const CefString& name) = 0;
 
   ///
-  // Returns the map of switch names and values. If a switch has no value an
-  // empty string is returned.
+  /// Returns the map of switch names and values. If a switch has no value an
+  /// empty string is returned.
   ///
   /*--cef()--*/
   virtual void GetSwitches(SwitchMap& switches) = 0;
 
   ///
-  // Add a switch to the end of the command line. If the switch has no value
-  // pass an empty value string.
+  /// Add a switch to the end of the command line.
   ///
   /*--cef()--*/
   virtual void AppendSwitch(const CefString& name) = 0;
 
   ///
-  // Add a switch with the specified value to the end of the command line.
+  /// Add a switch with the specified value to the end of the command line. If
+  /// the switch has no value pass an empty value string.
   ///
   /*--cef()--*/
   virtual void AppendSwitchWithValue(const CefString& name,
                                      const CefString& value) = 0;
 
   ///
-  // True if there are remaining command line arguments.
+  /// True if there are remaining command line arguments.
   ///
   /*--cef()--*/
   virtual bool HasArguments() = 0;
 
   ///
-  // Get the remaining command line arguments.
+  /// Get the remaining command line arguments.
   ///
   /*--cef()--*/
   virtual void GetArguments(ArgumentList& arguments) = 0;
 
   ///
-  // Add an argument to the end of the command line.
+  /// Add an argument to the end of the command line.
   ///
   /*--cef()--*/
   virtual void AppendArgument(const CefString& argument) = 0;
 
   ///
-  // Insert a command before the current command.
-  // Common for debuggers, like "valgrind" or "gdb --args".
+  /// Insert a command before the current command.
+  /// Common for debuggers, like "valgrind" or "gdb --args".
   ///
   /*--cef()--*/
   virtual void PrependWrapper(const CefString& wrapper) = 0;
diff --git a/src/include/cef_context_menu_handler.h b/src/include/cef_context_menu_handler.h
index 2a2a73e..d499592 100644
--- a/src/include/cef_context_menu_handler.h
+++ b/src/include/cef_context_menu_handler.h
@@ -46,42 +46,61 @@
 class CefContextMenuParams;
 
 ///
-// Callback interface used for continuation of custom context menu display.
+/// Callback interface used for continuation of custom context menu display.
 ///
 /*--cef(source=library)--*/
 class CefRunContextMenuCallback : public virtual CefBaseRefCounted {
  public:
-  typedef cef_event_flags_t EventFlags;
-
   ///
-  // Complete context menu display by selecting the specified |command_id| and
-  // |event_flags|.
+  /// Complete context menu display by selecting the specified |command_id| and
+  /// |event_flags|.
   ///
   /*--cef(capi_name=cont)--*/
-  virtual void Continue(int command_id, EventFlags event_flags) = 0;
+  virtual void Continue(int command_id, cef_event_flags_t event_flags) = 0;
 
   ///
-  // Cancel context menu display.
+  /// Cancel context menu display.
   ///
   /*--cef()--*/
   virtual void Cancel() = 0;
 };
 
 ///
-// Implement this interface to handle context menu events. The methods of this
-// class will be called on the UI thread.
+/// Callback interface used for continuation of custom quick menu display.
+///
+/*--cef(source=library)--*/
+class CefRunQuickMenuCallback : public virtual CefBaseRefCounted {
+ public:
+  ///
+  /// Complete quick menu display by selecting the specified |command_id| and
+  /// |event_flags|.
+  ///
+  /*--cef(capi_name=cont)--*/
+  virtual void Continue(int command_id, cef_event_flags_t event_flags) = 0;
+
+  ///
+  /// Cancel quick menu display.
+  ///
+  /*--cef()--*/
+  virtual void Cancel() = 0;
+};
+
+///
+/// Implement this interface to handle context menu events. The methods of this
+/// class will be called on the UI thread.
 ///
 /*--cef(source=client)--*/
 class CefContextMenuHandler : public virtual CefBaseRefCounted {
  public:
   typedef cef_event_flags_t EventFlags;
+  typedef cef_quick_menu_edit_state_flags_t QuickMenuEditStateFlags;
 
   ///
-  // Called before a context menu is displayed. |params| provides information
-  // about the context menu state. |model| initially contains the default
-  // context menu. The |model| can be cleared to show no context menu or
-  // modified to show a custom menu. Do not keep references to |params| or
-  // |model| outside of this callback.
+  /// Called before a context menu is displayed. |params| provides information
+  /// about the context menu state. |model| initially contains the default
+  /// context menu. The |model| can be cleared to show no context menu or
+  /// modified to show a custom menu. Do not keep references to |params| or
+  /// |model| outside of this callback.
   ///
   /*--cef()--*/
   virtual void OnBeforeContextMenu(CefRefPtr<CefBrowser> browser,
@@ -90,12 +109,12 @@
                                    CefRefPtr<CefMenuModel> model) {}
 
   ///
-  // Called to allow custom display of the context menu. |params| provides
-  // information about the context menu state. |model| contains the context menu
-  // model resulting from OnBeforeContextMenu. For custom display return true
-  // and execute |callback| either synchronously or asynchronously with the
-  // selected command ID. For default display return false. Do not keep
-  // references to |params| or |model| outside of this callback.
+  /// Called to allow custom display of the context menu. |params| provides
+  /// information about the context menu state. |model| contains the context
+  /// menu model resulting from OnBeforeContextMenu. For custom display return
+  /// true and execute |callback| either synchronously or asynchronously with
+  /// the selected command ID. For default display return false. Do not keep
+  /// references to |params| or |model| outside of this callback.
   ///
   /*--cef()--*/
   virtual bool RunContextMenu(CefRefPtr<CefBrowser> browser,
@@ -107,13 +126,13 @@
   }
 
   ///
-  // Called to execute a command selected from the context menu. Return true if
-  // the command was handled or false for the default implementation. See
-  // cef_menu_id_t for the command ids that have default implementations. All
-  // user-defined command ids should be between MENU_ID_USER_FIRST and
-  // MENU_ID_USER_LAST. |params| will have the same values as what was passed to
-  // OnBeforeContextMenu(). Do not keep a reference to |params| outside of this
-  // callback.
+  /// Called to execute a command selected from the context menu. Return true if
+  /// the command was handled or false for the default implementation. See
+  /// cef_menu_id_t for the command ids that have default implementations. All
+  /// user-defined command ids should be between MENU_ID_USER_FIRST and
+  /// MENU_ID_USER_LAST. |params| will have the same values as what was passed
+  /// to OnBeforeContextMenu(). Do not keep a reference to |params| outside of
+  /// this callback.
   ///
   /*--cef()--*/
   virtual bool OnContextMenuCommand(CefRefPtr<CefBrowser> browser,
@@ -125,17 +144,57 @@
   }
 
   ///
-  // Called when the context menu is dismissed irregardless of whether the menu
-  // was empty or a command was selected.
+  /// Called when the context menu is dismissed irregardless of whether the menu
+  /// was canceled or a command was selected.
   ///
   /*--cef()--*/
   virtual void OnContextMenuDismissed(CefRefPtr<CefBrowser> browser,
                                       CefRefPtr<CefFrame> frame) {}
+
+  ///
+  /// Called to allow custom display of the quick menu for a windowless browser.
+  /// |location| is the top left corner of the selected region. |size| is the
+  /// size of the selected region. |edit_state_flags| is a combination of flags
+  /// that represent the state of the quick menu. Return true if the menu will
+  /// be handled and execute |callback| either synchronously or asynchronously
+  /// with the selected command ID. Return false to cancel the menu.
+  ///
+  /*--cef()--*/
+  virtual bool RunQuickMenu(CefRefPtr<CefBrowser> browser,
+                            CefRefPtr<CefFrame> frame,
+                            const CefPoint& location,
+                            const CefSize& size,
+                            QuickMenuEditStateFlags edit_state_flags,
+                            CefRefPtr<CefRunQuickMenuCallback> callback) {
+    return false;
+  }
+
+  ///
+  /// Called to execute a command selected from the quick menu for a windowless
+  /// browser. Return true if the command was handled or false for the default
+  /// implementation. See cef_menu_id_t for command IDs that have default
+  /// implementations.
+  ///
+  /*--cef()--*/
+  virtual bool OnQuickMenuCommand(CefRefPtr<CefBrowser> browser,
+                                  CefRefPtr<CefFrame> frame,
+                                  int command_id,
+                                  EventFlags event_flags) {
+    return false;
+  }
+
+  ///
+  /// Called when the quick menu for a windowless browser is dismissed
+  /// irregardless of whether the menu was canceled or a command was selected.
+  ///
+  /*--cef()--*/
+  virtual void OnQuickMenuDismissed(CefRefPtr<CefBrowser> browser,
+                                    CefRefPtr<CefFrame> frame) {}
 };
 
 ///
-// Provides information about the context menu state. The ethods of this class
-// can only be accessed on browser process the UI thread.
+/// Provides information about the context menu state. The methods of this class
+/// can only be accessed on browser process the UI thread.
 ///
 /*--cef(source=library)--*/
 class CefContextMenuParams : public virtual CefBaseRefCounted {
@@ -146,147 +205,143 @@
   typedef cef_context_menu_edit_state_flags_t EditStateFlags;
 
   ///
-  // Returns the X coordinate of the mouse where the context menu was invoked.
-  // Coords are relative to the associated RenderView's origin.
+  /// Returns the X coordinate of the mouse where the context menu was invoked.
+  /// Coords are relative to the associated RenderView's origin.
   ///
   /*--cef()--*/
   virtual int GetXCoord() = 0;
 
   ///
-  // Returns the Y coordinate of the mouse where the context menu was invoked.
-  // Coords are relative to the associated RenderView's origin.
+  /// Returns the Y coordinate of the mouse where the context menu was invoked.
+  /// Coords are relative to the associated RenderView's origin.
   ///
   /*--cef()--*/
   virtual int GetYCoord() = 0;
 
   ///
-  // Returns flags representing the type of node that the context menu was
-  // invoked on.
+  /// Returns flags representing the type of node that the context menu was
+  /// invoked on.
   ///
   /*--cef(default_retval=CM_TYPEFLAG_NONE)--*/
   virtual TypeFlags GetTypeFlags() = 0;
 
   ///
-  // Returns the URL of the link, if any, that encloses the node that the
-  // context menu was invoked on.
+  /// Returns the URL of the link, if any, that encloses the node that the
+  /// context menu was invoked on.
   ///
   /*--cef()--*/
   virtual CefString GetLinkUrl() = 0;
 
   ///
-  // Returns the link URL, if any, to be used ONLY for "copy link address". We
-  // don't validate this field in the frontend process.
+  /// Returns the link URL, if any, to be used ONLY for "copy link address". We
+  /// don't validate this field in the frontend process.
   ///
   /*--cef()--*/
   virtual CefString GetUnfilteredLinkUrl() = 0;
 
   ///
-  // Returns the source URL, if any, for the element that the context menu was
-  // invoked on. Example of elements with source URLs are img, audio, and video.
+  /// Returns the source URL, if any, for the element that the context menu was
+  /// invoked on. Example of elements with source URLs are img, audio, and
+  /// video.
   ///
   /*--cef()--*/
   virtual CefString GetSourceUrl() = 0;
 
   ///
-  // Returns true if the context menu was invoked on an image which has
-  // non-empty contents.
+  /// Returns true if the context menu was invoked on an image which has
+  /// non-empty contents.
   ///
   /*--cef()--*/
   virtual bool HasImageContents() = 0;
 
   ///
-  // Returns the title text or the alt text if the context menu was invoked on
-  // an image.
+  /// Returns the title text or the alt text if the context menu was invoked on
+  /// an image.
   ///
   /*--cef()--*/
   virtual CefString GetTitleText() = 0;
 
   ///
-  // Returns the URL of the top level page that the context menu was invoked on.
+  /// Returns the URL of the top level page that the context menu was invoked
+  /// on.
   ///
   /*--cef()--*/
   virtual CefString GetPageUrl() = 0;
 
   ///
-  // Returns the URL of the subframe that the context menu was invoked on.
+  /// Returns the URL of the subframe that the context menu was invoked on.
   ///
   /*--cef()--*/
   virtual CefString GetFrameUrl() = 0;
 
   ///
-  // Returns the character encoding of the subframe that the context menu was
-  // invoked on.
+  /// Returns the character encoding of the subframe that the context menu was
+  /// invoked on.
   ///
   /*--cef()--*/
   virtual CefString GetFrameCharset() = 0;
 
   ///
-  // Returns the type of context node that the context menu was invoked on.
+  /// Returns the type of context node that the context menu was invoked on.
   ///
   /*--cef(default_retval=CM_MEDIATYPE_NONE)--*/
   virtual MediaType GetMediaType() = 0;
 
   ///
-  // Returns flags representing the actions supported by the media element, if
-  // any, that the context menu was invoked on.
+  /// Returns flags representing the actions supported by the media element, if
+  /// any, that the context menu was invoked on.
   ///
   /*--cef(default_retval=CM_MEDIAFLAG_NONE)--*/
   virtual MediaStateFlags GetMediaStateFlags() = 0;
 
   ///
-  // Returns the text of the selection, if any, that the context menu was
-  // invoked on.
+  /// Returns the text of the selection, if any, that the context menu was
+  /// invoked on.
   ///
   /*--cef()--*/
   virtual CefString GetSelectionText() = 0;
 
   ///
-  // Returns the text of the misspelled word, if any, that the context menu was
-  // invoked on.
+  /// Returns the text of the misspelled word, if any, that the context menu was
+  /// invoked on.
   ///
   /*--cef()--*/
   virtual CefString GetMisspelledWord() = 0;
 
   ///
-  // Returns true if suggestions exist, false otherwise. Fills in |suggestions|
-  // from the spell check service for the misspelled word if there is one.
+  /// Returns true if suggestions exist, false otherwise. Fills in |suggestions|
+  /// from the spell check service for the misspelled word if there is one.
   ///
   /*--cef()--*/
   virtual bool GetDictionarySuggestions(
       std::vector<CefString>& suggestions) = 0;
 
   ///
-  // Returns true if the context menu was invoked on an editable node.
+  /// Returns true if the context menu was invoked on an editable node.
   ///
   /*--cef()--*/
   virtual bool IsEditable() = 0;
 
   ///
-  // Returns true if the context menu was invoked on an editable node where
-  // spell-check is enabled.
+  /// Returns true if the context menu was invoked on an editable node where
+  /// spell-check is enabled.
   ///
   /*--cef()--*/
   virtual bool IsSpellCheckEnabled() = 0;
 
   ///
-  // Returns flags representing the actions supported by the editable node, if
-  // any, that the context menu was invoked on.
+  /// Returns flags representing the actions supported by the editable node, if
+  /// any, that the context menu was invoked on.
   ///
   /*--cef(default_retval=CM_EDITFLAG_NONE)--*/
   virtual EditStateFlags GetEditStateFlags() = 0;
 
   ///
-  // Returns true if the context menu contains items specified by the renderer
-  // process (for example, plugin placeholder or pepper plugin menu items).
+  /// Returns true if the context menu contains items specified by the renderer
+  /// process.
   ///
   /*--cef()--*/
   virtual bool IsCustomMenu() = 0;
-
-  ///
-  // Returns true if the context menu was invoked from a pepper plugin.
-  ///
-  /*--cef()--*/
-  virtual bool IsPepperMenu() = 0;
 };
 
 #endif  // CEF_INCLUDE_CEF_CONTEXT_MENU_HANDLER_H_
diff --git a/src/include/cef_cookie.h b/src/include/cef_cookie.h
index f48c7df..e3a6820 100644
--- a/src/include/cef_cookie.h
+++ b/src/include/cef_cookie.h
@@ -47,52 +47,38 @@
 class CefDeleteCookiesCallback;
 
 ///
-// Class used for managing cookies. The methods of this class may be called on
-// any thread unless otherwise indicated.
+/// Class used for managing cookies. The methods of this class may be called on
+/// any thread unless otherwise indicated.
 ///
 /*--cef(source=library,no_debugct_check)--*/
 class CefCookieManager : public virtual CefBaseRefCounted {
  public:
   ///
-  // Returns the global cookie manager. By default data will be stored at
-  // CefSettings.cache_path if specified or in memory otherwise. If |callback|
-  // is non-NULL it will be executed asnychronously on the UI thread after the
-  // manager's storage has been initialized. Using this method is equivalent to
-  // calling CefRequestContext::GetGlobalContext()->GetDefaultCookieManager().
+  /// Returns the global cookie manager. By default data will be stored at
+  /// cef_settings_t.cache_path if specified or in memory otherwise. If
+  /// |callback| is non-NULL it will be executed asnychronously on the UI thread
+  /// after the manager's storage has been initialized. Using this method is
+  /// equivalent to calling
+  /// CefRequestContext::GetGlobalContext()->GetDefaultCookieManager().
   ///
   /*--cef(optional_param=callback)--*/
   static CefRefPtr<CefCookieManager> GetGlobalManager(
       CefRefPtr<CefCompletionCallback> callback);
 
   ///
-  // Set the schemes supported by this manager. If |include_defaults| is true
-  // the default schemes ("http", "https", "ws" and "wss") will also be
-  // supported. Calling this method with an empty |schemes| value and
-  // |include_defaults| set to false will disable all loading and saving of
-  // cookies for this manager. If |callback| is non-NULL it will be executed
-  // asnychronously on the UI thread after the change has been applied. Must be
-  // called before any cookies are accessed.
-  ///
-  /*--cef(optional_param=callback)--*/
-  virtual void SetSupportedSchemes(
-      const std::vector<CefString>& schemes,
-      bool include_defaults,
-      CefRefPtr<CefCompletionCallback> callback) = 0;
-
-  ///
-  // Visit all cookies on the UI thread. The returned cookies are ordered by
-  // longest path, then by earliest creation date. Returns false if cookies
-  // cannot be accessed.
+  /// Visit all cookies on the UI thread. The returned cookies are ordered by
+  /// longest path, then by earliest creation date. Returns false if cookies
+  /// cannot be accessed.
   ///
   /*--cef()--*/
   virtual bool VisitAllCookies(CefRefPtr<CefCookieVisitor> visitor) = 0;
 
   ///
-  // Visit a subset of cookies on the UI thread. The results are filtered by the
-  // given url scheme, host, domain and path. If |includeHttpOnly| is true
-  // HTTP-only cookies will also be included in the results. The returned
-  // cookies are ordered by longest path, then by earliest creation date.
-  // Returns false if cookies cannot be accessed.
+  /// Visit a subset of cookies on the UI thread. The results are filtered by
+  /// the given url scheme, host, domain and path. If |includeHttpOnly| is true
+  /// HTTP-only cookies will also be included in the results. The returned
+  /// cookies are ordered by longest path, then by earliest creation date.
+  /// Returns false if cookies cannot be accessed.
   ///
   /*--cef()--*/
   virtual bool VisitUrlCookies(const CefString& url,
@@ -100,13 +86,13 @@
                                CefRefPtr<CefCookieVisitor> visitor) = 0;
 
   ///
-  // Sets a cookie given a valid URL and explicit user-provided cookie
-  // attributes. This function expects each attribute to be well-formed. It will
-  // check for disallowed characters (e.g. the ';' character is disallowed
-  // within the cookie value attribute) and fail without setting the cookie if
-  // such characters are found. If |callback| is non-NULL it will be executed
-  // asnychronously on the UI thread after the cookie has been set. Returns
-  // false if an invalid URL is specified or if cookies cannot be accessed.
+  /// Sets a cookie given a valid URL and explicit user-provided cookie
+  /// attributes. This function expects each attribute to be well-formed. It
+  /// will check for disallowed characters (e.g. the ';' character is disallowed
+  /// within the cookie value attribute) and fail without setting the cookie if
+  /// such characters are found. If |callback| is non-NULL it will be executed
+  /// asnychronously on the UI thread after the cookie has been set. Returns
+  /// false if an invalid URL is specified or if cookies cannot be accessed.
   ///
   /*--cef(optional_param=callback)--*/
   virtual bool SetCookie(const CefString& url,
@@ -114,15 +100,15 @@
                          CefRefPtr<CefSetCookieCallback> callback) = 0;
 
   ///
-  // Delete all cookies that match the specified parameters. If both |url| and
-  // |cookie_name| values are specified all host and domain cookies matching
-  // both will be deleted. If only |url| is specified all host cookies (but not
-  // domain cookies) irrespective of path will be deleted. If |url| is empty all
-  // cookies for all hosts and domains will be deleted. If |callback| is
-  // non-NULL it will be executed asnychronously on the UI thread after the
-  // cookies have been deleted. Returns false if a non-empty invalid URL is
-  // specified or if cookies cannot be accessed. Cookies can alternately be
-  // deleted using the Visit*Cookies() methods.
+  /// Delete all cookies that match the specified parameters. If both |url| and
+  /// |cookie_name| values are specified all host and domain cookies matching
+  /// both will be deleted. If only |url| is specified all host cookies (but not
+  /// domain cookies) irrespective of path will be deleted. If |url| is empty
+  /// all cookies for all hosts and domains will be deleted. If |callback| is
+  /// non-NULL it will be executed asnychronously on the UI thread after the
+  /// cookies have been deleted. Returns false if a non-empty invalid URL is
+  /// specified or if cookies cannot be accessed. Cookies can alternately be
+  /// deleted using the Visit*Cookies() methods.
   ///
   /*--cef(optional_param=url,optional_param=cookie_name,
           optional_param=callback)--*/
@@ -131,27 +117,27 @@
                              CefRefPtr<CefDeleteCookiesCallback> callback) = 0;
 
   ///
-  // Flush the backing store (if any) to disk. If |callback| is non-NULL it will
-  // be executed asnychronously on the UI thread after the flush is complete.
-  // Returns false if cookies cannot be accessed.
+  /// Flush the backing store (if any) to disk. If |callback| is non-NULL it
+  /// will be executed asnychronously on the UI thread after the flush is
+  /// complete. Returns false if cookies cannot be accessed.
   ///
   /*--cef(optional_param=callback)--*/
   virtual bool FlushStore(CefRefPtr<CefCompletionCallback> callback) = 0;
 };
 
 ///
-// Interface to implement for visiting cookie values. The methods of this class
-// will always be called on the UI thread.
+/// Interface to implement for visiting cookie values. The methods of this class
+/// will always be called on the UI thread.
 ///
 /*--cef(source=client)--*/
 class CefCookieVisitor : public virtual CefBaseRefCounted {
  public:
   ///
-  // Method that will be called once for each cookie. |count| is the 0-based
-  // index for the current cookie. |total| is the total number of cookies.
-  // Set |deleteCookie| to true to delete the cookie currently being visited.
-  // Return false to stop visiting cookies. This method may never be called if
-  // no cookies are found.
+  /// Method that will be called once for each cookie. |count| is the 0-based
+  /// index for the current cookie. |total| is the total number of cookies.
+  /// Set |deleteCookie| to true to delete the cookie currently being visited.
+  /// Return false to stop visiting cookies. This method may never be called if
+  /// no cookies are found.
   ///
   /*--cef()--*/
   virtual bool Visit(const CefCookie& cookie,
@@ -161,30 +147,30 @@
 };
 
 ///
-// Interface to implement to be notified of asynchronous completion via
-// CefCookieManager::SetCookie().
+/// Interface to implement to be notified of asynchronous completion via
+/// CefCookieManager::SetCookie().
 ///
 /*--cef(source=client)--*/
 class CefSetCookieCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Method that will be called upon completion. |success| will be true if the
-  // cookie was set successfully.
+  /// Method that will be called upon completion. |success| will be true if the
+  /// cookie was set successfully.
   ///
   /*--cef()--*/
   virtual void OnComplete(bool success) = 0;
 };
 
 ///
-// Interface to implement to be notified of asynchronous completion via
-// CefCookieManager::DeleteCookies().
+/// Interface to implement to be notified of asynchronous completion via
+/// CefCookieManager::DeleteCookies().
 ///
 /*--cef(source=client)--*/
 class CefDeleteCookiesCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Method that will be called upon completion. |num_deleted| will be the
-  // number of cookies that were deleted.
+  /// Method that will be called upon completion. |num_deleted| will be the
+  /// number of cookies that were deleted.
   ///
   /*--cef()--*/
   virtual void OnComplete(int num_deleted) = 0;
diff --git a/src/include/cef_crash_util.h b/src/include/cef_crash_util.h
index e569df7..956b5ff 100644
--- a/src/include/cef_crash_util.h
+++ b/src/include/cef_crash_util.h
@@ -39,94 +39,97 @@
 #pragma once
 
 ///
-// Crash reporting is configured using an INI-style config file named
-// "crash_reporter.cfg". On Windows and Linux this file must be placed next to
-// the main application executable. On macOS this file must be placed in the
-// top-level app bundle Resources directory (e.g.
-// "<appname>.app/Contents/Resources"). File contents are as follows:
-//
-//  # Comments start with a hash character and must be on their own line.
-//
-//  [Config]
-//  ProductName=<Value of the "prod" crash key; defaults to "cef">
-//  ProductVersion=<Value of the "ver" crash key; defaults to the CEF version>
-//  AppName=<Windows only; App-specific folder name component for storing crash
-//           information; default to "CEF">
-//  ExternalHandler=<Windows only; Name of the external handler exe to use
-//                   instead of re-launching the main exe; default to empty>
-//  BrowserCrashForwardingEnabled=<macOS only; True if browser process crashes
-//                                 should be forwarded to the system crash
-//                                 reporter; default to false>
-//  ServerURL=<crash server URL; default to empty>
-//  RateLimitEnabled=<True if uploads should be rate limited; default to true>
-//  MaxUploadsPerDay=<Max uploads per 24 hours, used if rate limit is enabled;
-//                    default to 5>
-//  MaxDatabaseSizeInMb=<Total crash report disk usage greater than this value
-//                       will cause older reports to be deleted; default to 20>
-//  MaxDatabaseAgeInDays=<Crash reports older than this value will be deleted;
-//                        default to 5>
-//
-//  [CrashKeys]
-//  my_key1=<small|medium|large>
-//  my_key2=<small|medium|large>
-//
-// Config section:
-//
-// If "ProductName" and/or "ProductVersion" are set then the specified values
-// will be included in the crash dump metadata. On macOS if these values are set
-// to empty then they will be retrieved from the Info.plist file using the
-// "CFBundleName" and "CFBundleShortVersionString" keys respectively.
-//
-// If "AppName" is set on Windows then crash report information (metrics,
-// database and dumps) will be stored locally on disk under the
-// "C:\Users\[CurrentUser]\AppData\Local\[AppName]\User Data" folder. On other
-// platforms the CefSettings.user_data_path value will be used.
-//
-// If "ExternalHandler" is set on Windows then the specified exe will be
-// launched as the crashpad-handler instead of re-launching the main process
-// exe. The value can be an absolute path or a path relative to the main exe
-// directory. On Linux the CefSettings.browser_subprocess_path value will be
-// used. On macOS the existing subprocess app bundle will be used.
-//
-// If "BrowserCrashForwardingEnabled" is set to true on macOS then browser
-// process crashes will be forwarded to the system crash reporter. This results
-// in the crash UI dialog being displayed to the user and crash reports being
-// logged under "~/Library/Logs/DiagnosticReports". Forwarding of crash reports
-// from non-browser processes and Debug builds is always disabled.
-//
-// If "ServerURL" is set then crashes will be uploaded as a multi-part POST
-// request to the specified URL. Otherwise, reports will only be stored locally
-// on disk.
-//
-// If "RateLimitEnabled" is set to true then crash report uploads will be rate
-// limited as follows:
-//  1. If "MaxUploadsPerDay" is set to a positive value then at most the
-//     specified number of crashes will be uploaded in each 24 hour period.
-//  2. If crash upload fails due to a network or server error then an
-//     incremental backoff delay up to a maximum of 24 hours will be applied for
-//     retries.
-//  3. If a backoff delay is applied and "MaxUploadsPerDay" is > 1 then the
-//     "MaxUploadsPerDay" value will be reduced to 1 until the client is
-//     restarted. This helps to avoid an upload flood when the network or
-//     server error is resolved.
-// Rate limiting is not supported on Linux.
-//
-// If "MaxDatabaseSizeInMb" is set to a positive value then crash report storage
-// on disk will be limited to that size in megabytes. For example, on Windows
-// each dump is about 600KB so a "MaxDatabaseSizeInMb" value of 20 equates to
-// about 34 crash reports stored on disk. Not supported on Linux.
-//
-// If "MaxDatabaseAgeInDays" is set to a positive value then crash reports older
-// than the specified age in days will be deleted. Not supported on Linux.
-//
-// CrashKeys section:
-//
-// A maximum of 26 crash keys of each size can be specified for use by the
-// application. Crash key values will be truncated based on the specified size
-// (small = 64 bytes, medium = 256 bytes, large = 1024 bytes). The value of
-// crash keys can be set from any thread or process using the
-// CefSetCrashKeyValue function. These key/value pairs will be sent to the crash
-// server along with the crash dump file.
+/// Crash reporting is configured using an INI-style config file named
+/// "crash_reporter.cfg". On Windows and Linux this file must be placed next to
+/// the main application executable. On macOS this file must be placed in the
+/// top-level app bundle Resources directory (e.g.
+/// "<appname>.app/Contents/Resources"). File contents are as follows:
+///
+/// <pre>
+///  # Comments start with a hash character and must be on their own line.
+///
+///  [Config]
+///  ProductName=<Value of the "prod" crash key; defaults to "cef">
+///  ProductVersion=<Value of the "ver" crash key; defaults to the CEF version>
+///  AppName=<Windows only; App-specific folder name component for storing crash
+///           information; default to "CEF">
+///  ExternalHandler=<Windows only; Name of the external handler exe to use
+///                   instead of re-launching the main exe; default to empty>
+///  BrowserCrashForwardingEnabled=<macOS only; True if browser process crashes
+///                                 should be forwarded to the system crash
+///                                 reporter; default to false>
+///  ServerURL=<crash server URL; default to empty>
+///  RateLimitEnabled=<True if uploads should be rate limited; default to true>
+///  MaxUploadsPerDay=<Max uploads per 24 hours, used if rate limit is enabled;
+///                    default to 5>
+///  MaxDatabaseSizeInMb=<Total crash report disk usage greater than this value
+///                       will cause older reports to be deleted; default to 20>
+///  MaxDatabaseAgeInDays=<Crash reports older than this value will be deleted;
+///                        default to 5>
+///
+///  [CrashKeys]
+///  my_key1=<small|medium|large>
+///  my_key2=<small|medium|large>
+/// </pre>
+///
+/// <b>Config section:</b>
+///
+/// If "ProductName" and/or "ProductVersion" are set then the specified values
+/// will be included in the crash dump metadata. On macOS if these values are
+/// set to empty then they will be retrieved from the Info.plist file using the
+/// "CFBundleName" and "CFBundleShortVersionString" keys respectively.
+///
+/// If "AppName" is set on Windows then crash report information (metrics,
+/// database and dumps) will be stored locally on disk under the
+/// "C:\Users\[CurrentUser]\AppData\Local\[AppName]\User Data" folder. On other
+/// platforms the cef_settings_t.root_cache_path value will be used.
+///
+/// If "ExternalHandler" is set on Windows then the specified exe will be
+/// launched as the crashpad-handler instead of re-launching the main process
+/// exe. The value can be an absolute path or a path relative to the main exe
+/// directory. On Linux the cef_settings_t.browser_subprocess_path value will be
+/// used. On macOS the existing subprocess app bundle will be used.
+///
+/// If "BrowserCrashForwardingEnabled" is set to true on macOS then browser
+/// process crashes will be forwarded to the system crash reporter. This results
+/// in the crash UI dialog being displayed to the user and crash reports being
+/// logged under "~/Library/Logs/DiagnosticReports". Forwarding of crash reports
+/// from non-browser processes and Debug builds is always disabled.
+///
+/// If "ServerURL" is set then crashes will be uploaded as a multi-part POST
+/// request to the specified URL. Otherwise, reports will only be stored locally
+/// on disk.
+///
+/// If "RateLimitEnabled" is set to true then crash report uploads will be rate
+/// limited as follows:
+///  1. If "MaxUploadsPerDay" is set to a positive value then at most the
+///     specified number of crashes will be uploaded in each 24 hour period.
+///  2. If crash upload fails due to a network or server error then an
+///     incremental backoff delay up to a maximum of 24 hours will be applied
+///     for retries.
+///  3. If a backoff delay is applied and "MaxUploadsPerDay" is > 1 then the
+///     "MaxUploadsPerDay" value will be reduced to 1 until the client is
+///     restarted. This helps to avoid an upload flood when the network or
+///     server error is resolved.
+/// Rate limiting is not supported on Linux.
+///
+/// If "MaxDatabaseSizeInMb" is set to a positive value then crash report
+/// storage on disk will be limited to that size in megabytes. For example, on
+/// Windows each dump is about 600KB so a "MaxDatabaseSizeInMb" value of 20
+/// equates to about 34 crash reports stored on disk. Not supported on Linux.
+///
+/// If "MaxDatabaseAgeInDays" is set to a positive value then crash reports
+/// older than the specified age in days will be deleted. Not supported on
+/// Linux.
+///
+/// <b>CrashKeys section:</b>
+///
+/// A maximum of 26 crash keys of each size can be specified for use by the
+/// application. Crash key values will be truncated based on the specified size
+/// (small = 64 bytes, medium = 256 bytes, large = 1024 bytes). The value of
+/// crash keys can be set from any thread or process using the
+/// CefSetCrashKeyValue function. These key/value pairs will be sent to the
+/// crash server along with the crash dump file.
 ///
 /*--cef()--*/
 bool CefCrashReportingEnabled();
@@ -134,7 +137,7 @@
 #include "include/cef_base.h"
 
 ///
-// Sets or clears a specific key-value pair from the crash metadata.
+/// Sets or clears a specific key-value pair from the crash metadata.
 ///
 /*--cef(optional_param=value)--*/
 void CefSetCrashKeyValue(const CefString& key, const CefString& value);
diff --git a/src/include/cef_devtools_message_observer.h b/src/include/cef_devtools_message_observer.h
index c65aee9..757c607 100644
--- a/src/include/cef_devtools_message_observer.h
+++ b/src/include/cef_devtools_message_observer.h
@@ -43,32 +43,33 @@
 class CefBrowser;
 
 ///
-// Callback interface for CefBrowserHost::AddDevToolsMessageObserver. The
-// methods of this class will be called on the browser process UI thread.
+/// Callback interface for CefBrowserHost::AddDevToolsMessageObserver. The
+/// methods of this class will be called on the browser process UI thread.
 ///
 /*--cef(source=client)--*/
 class CefDevToolsMessageObserver : public virtual CefBaseRefCounted {
  public:
   ///
-  // Method that will be called on receipt of a DevTools protocol message.
-  // |browser| is the originating browser instance. |message| is a UTF8-encoded
-  // JSON dictionary representing either a method result or an event. |message|
-  // is only valid for the scope of this callback and should be copied if
-  // necessary. Return true if the message was handled or false if the message
-  // should be further processed and passed to the OnDevToolsMethodResult or
-  // OnDevToolsEvent methods as appropriate.
-  //
-  // Method result dictionaries include an "id" (int) value that identifies the
-  // orginating method call sent from CefBrowserHost::SendDevToolsMessage, and
-  // optionally either a "result" (dictionary) or "error" (dictionary) value.
-  // The "error" dictionary will contain "code" (int) and "message" (string)
-  // values. Event dictionaries include a "method" (string) value and optionally
-  // a "params" (dictionary) value. See the DevTools protocol documentation at
-  // https://chromedevtools.github.io/devtools-protocol/ for details of
-  // supported method calls and the expected "result" or "params" dictionary
-  // contents. JSON dictionaries can be parsed using the CefParseJSON function
-  // if desired, however be aware of performance considerations when parsing
-  // large messages (some of which may exceed 1MB in size).
+  /// Method that will be called on receipt of a DevTools protocol message.
+  /// |browser| is the originating browser instance. |message| is a UTF8-encoded
+  /// JSON dictionary representing either a method result or an event. |message|
+  /// is only valid for the scope of this callback and should be copied if
+  /// necessary. Return true if the message was handled or false if the message
+  /// should be further processed and passed to the OnDevToolsMethodResult or
+  /// OnDevToolsEvent methods as appropriate.
+  ///
+  /// Method result dictionaries include an "id" (int) value that identifies the
+  /// orginating method call sent from CefBrowserHost::SendDevToolsMessage, and
+  /// optionally either a "result" (dictionary) or "error" (dictionary) value.
+  /// The "error" dictionary will contain "code" (int) and "message" (string)
+  /// values. Event dictionaries include a "method" (string) value and
+  /// optionally a "params" (dictionary) value. See the DevTools protocol
+  /// documentation at https://chromedevtools.github.io/devtools-protocol/ for
+  /// details of supported method calls and the expected "result" or "params"
+  /// dictionary contents. JSON dictionaries can be parsed using the
+  /// CefParseJSON function if desired, however be aware of performance
+  /// considerations when parsing large messages (some of which may exceed 1MB
+  /// in size).
   ///
   /*--cef()--*/
   virtual bool OnDevToolsMessage(CefRefPtr<CefBrowser> browser,
@@ -78,15 +79,16 @@
   }
 
   ///
-  // Method that will be called after attempted execution of a DevTools protocol
-  // method. |browser| is the originating browser instance. |message_id| is the
-  // "id" value that identifies the originating method call message. If the
-  // method succeeded |success| will be true and |result| will be the
-  // UTF8-encoded JSON "result" dictionary value (which may be empty). If the
-  // method failed |success| will be false and |result| will be the UTF8-encoded
-  // JSON "error" dictionary value. |result| is only valid for the scope of this
-  // callback and should be copied if necessary. See the OnDevToolsMessage
-  // documentation for additional details on |result| contents.
+  /// Method that will be called after attempted execution of a DevTools
+  /// protocol method. |browser| is the originating browser instance.
+  /// |message_id| is the "id" value that identifies the originating method call
+  /// message. If the method succeeded |success| will be true and |result| will
+  /// be the UTF8-encoded JSON "result" dictionary value (which may be empty).
+  /// If the method failed |success| will be false and |result| will be the
+  /// UTF8-encoded JSON "error" dictionary value. |result| is only valid for the
+  /// scope of this callback and should be copied if necessary. See the
+  /// OnDevToolsMessage documentation for additional details on |result|
+  /// contents.
   ///
   /*--cef(optional_param=result)--*/
   virtual void OnDevToolsMethodResult(CefRefPtr<CefBrowser> browser,
@@ -96,12 +98,12 @@
                                       size_t result_size) {}
 
   ///
-  // Method that will be called on receipt of a DevTools protocol event.
-  // |browser| is the originating browser instance. |method| is the "method"
-  // value. |params| is the UTF8-encoded JSON "params" dictionary value (which
-  // may be empty). |params| is only valid for the scope of this callback and
-  // should be copied if necessary. See the OnDevToolsMessage documentation for
-  // additional details on |params| contents.
+  /// Method that will be called on receipt of a DevTools protocol event.
+  /// |browser| is the originating browser instance. |method| is the "method"
+  /// value. |params| is the UTF8-encoded JSON "params" dictionary value (which
+  /// may be empty). |params| is only valid for the scope of this callback and
+  /// should be copied if necessary. See the OnDevToolsMessage documentation for
+  /// additional details on |params| contents.
   ///
   /*--cef(optional_param=params)--*/
   virtual void OnDevToolsEvent(CefRefPtr<CefBrowser> browser,
@@ -110,18 +112,18 @@
                                size_t params_size) {}
 
   ///
-  // Method that will be called when the DevTools agent has attached. |browser|
-  // is the originating browser instance. This will generally occur in response
-  // to the first message sent while the agent is detached.
+  /// Method that will be called when the DevTools agent has attached. |browser|
+  /// is the originating browser instance. This will generally occur in response
+  /// to the first message sent while the agent is detached.
   ///
   /*--cef()--*/
   virtual void OnDevToolsAgentAttached(CefRefPtr<CefBrowser> browser) {}
 
   ///
-  // Method that will be called when the DevTools agent has detached. |browser|
-  // is the originating browser instance. Any method results that were pending
-  // before the agent became detached will not be delivered, and any active
-  // event subscriptions will be canceled.
+  /// Method that will be called when the DevTools agent has detached. |browser|
+  /// is the originating browser instance. Any method results that were pending
+  /// before the agent became detached will not be delivered, and any active
+  /// event subscriptions will be canceled.
   ///
   /*--cef()--*/
   virtual void OnDevToolsAgentDetached(CefRefPtr<CefBrowser> browser) {}
diff --git a/src/include/cef_dialog_handler.h b/src/include/cef_dialog_handler.h
index 3ce02e6..30fd3a1 100644
--- a/src/include/cef_dialog_handler.h
+++ b/src/include/cef_dialog_handler.h
@@ -42,33 +42,29 @@
 #include "include/cef_browser.h"
 
 ///
-// Callback interface for asynchronous continuation of file dialog requests.
+/// Callback interface for asynchronous continuation of file dialog requests.
 ///
 /*--cef(source=library)--*/
 class CefFileDialogCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Continue the file selection. |selected_accept_filter| should be the 0-based
-  // index of the value selected from the accept filters array passed to
-  // CefDialogHandler::OnFileDialog. |file_paths| should be a single value or a
-  // list of values depending on the dialog mode. An empty |file_paths| value is
-  // treated the same as calling Cancel().
+  /// Continue the file selection. |file_paths| should be a single value or a
+  /// list of values depending on the dialog mode. An empty |file_paths| value
+  /// is treated the same as calling Cancel().
   ///
-  /*--cef(capi_name=cont,index_param=selected_accept_filter,
-          optional_param=file_paths)--*/
-  virtual void Continue(int selected_accept_filter,
-                        const std::vector<CefString>& file_paths) = 0;
+  /*--cef(capi_name=cont,optional_param=file_paths)--*/
+  virtual void Continue(const std::vector<CefString>& file_paths) = 0;
 
   ///
-  // Cancel the file selection.
+  /// Cancel the file selection.
   ///
   /*--cef()--*/
   virtual void Cancel() = 0;
 };
 
 ///
-// Implement this interface to handle dialog events. The methods of this class
-// will be called on the browser process UI thread.
+/// Implement this interface to handle dialog events. The methods of this class
+/// will be called on the browser process UI thread.
 ///
 /*--cef(source=client)--*/
 class CefDialogHandler : public virtual CefBaseRefCounted {
@@ -76,28 +72,26 @@
   typedef cef_file_dialog_mode_t FileDialogMode;
 
   ///
-  // Called to run a file chooser dialog. |mode| represents the type of dialog
-  // to display. |title| to the title to be used for the dialog and may be empty
-  // to show the default title ("Open" or "Save" depending on the mode).
-  // |default_file_path| is the path with optional directory and/or file name
-  // component that should be initially selected in the dialog. |accept_filters|
-  // are used to restrict the selectable file types and may any combination of
-  // (a) valid lower-cased MIME types (e.g. "text/*" or "image/*"),
-  // (b) individual file extensions (e.g. ".txt" or ".png"), or (c) combined
-  // description and file extension delimited using "|" and ";" (e.g.
-  // "Image Types|.png;.gif;.jpg"). |selected_accept_filter| is the 0-based
-  // index of the filter that should be selected by default. To display a custom
-  // dialog return true and execute |callback| either inline or at a later time.
-  // To display the default dialog return false.
+  /// Called to run a file chooser dialog. |mode| represents the type of dialog
+  /// to display. |title| to the title to be used for the dialog and may be
+  /// empty to show the default title ("Open" or "Save" depending on the mode).
+  /// |default_file_path| is the path with optional directory and/or file name
+  /// component that should be initially selected in the dialog.
+  /// |accept_filters| are used to restrict the selectable file types and may
+  /// any combination of (a) valid lower-cased MIME types (e.g. "text/*" or
+  /// "image/*"), (b) individual file extensions (e.g. ".txt" or ".png"), or (c)
+  /// combined description and file extension delimited using "|" and ";" (e.g.
+  /// "Image Types|.png;.gif;.jpg"). To display a custom dialog return true and
+  /// execute |callback| either inline or at a later time. To display the
+  /// default dialog return false.
   ///
   /*--cef(optional_param=title,optional_param=default_file_path,
-          optional_param=accept_filters,index_param=selected_accept_filter)--*/
+          optional_param=accept_filters)--*/
   virtual bool OnFileDialog(CefRefPtr<CefBrowser> browser,
                             FileDialogMode mode,
                             const CefString& title,
                             const CefString& default_file_path,
                             const std::vector<CefString>& accept_filters,
-                            int selected_accept_filter,
                             CefRefPtr<CefFileDialogCallback> callback) {
     return false;
   }
diff --git a/src/include/cef_display_handler.h b/src/include/cef_display_handler.h
index 4fdc3c3..3b776b4 100644
--- a/src/include/cef_display_handler.h
+++ b/src/include/cef_display_handler.h
@@ -43,14 +43,14 @@
 #include "include/cef_frame.h"
 
 ///
-// Implement this interface to handle events related to browser display state.
-// The methods of this class will be called on the UI thread.
+/// Implement this interface to handle events related to browser display state.
+/// The methods of this class will be called on the UI thread.
 ///
 /*--cef(source=client)--*/
 class CefDisplayHandler : public virtual CefBaseRefCounted {
  public:
   ///
-  // Called when a frame's address has changed.
+  /// Called when a frame's address has changed.
   ///
   /*--cef()--*/
   virtual void OnAddressChange(CefRefPtr<CefBrowser> browser,
@@ -58,37 +58,41 @@
                                const CefString& url) {}
 
   ///
-  // Called when the page title changes.
+  /// Called when the page title changes.
   ///
   /*--cef(optional_param=title)--*/
   virtual void OnTitleChange(CefRefPtr<CefBrowser> browser,
                              const CefString& title) {}
 
   ///
-  // Called when the page icon changes.
+  /// Called when the page icon changes.
   ///
   /*--cef(optional_param=icon_urls)--*/
   virtual void OnFaviconURLChange(CefRefPtr<CefBrowser> browser,
                                   const std::vector<CefString>& icon_urls) {}
 
   ///
-  // Called when web content in the page has toggled fullscreen mode. If
-  // |fullscreen| is true the content will automatically be sized to fill the
-  // browser content area. If |fullscreen| is false the content will
-  // automatically return to its original size and position. The client is
-  // responsible for resizing the browser if desired.
+  /// Called when web content in the page has toggled fullscreen mode. If
+  /// |fullscreen| is true the content will automatically be sized to fill the
+  /// browser content area. If |fullscreen| is false the content will
+  /// automatically return to its original size and position. With the Alloy
+  /// runtime the client is responsible for triggering the fullscreen transition
+  /// (for example, by calling CefWindow::SetFullscreen when using Views). With
+  /// the Chrome runtime the fullscreen transition will be triggered
+  /// automatically. The CefWindowDelegate::OnWindowFullscreenTransition method
+  /// will be called during the fullscreen transition for notification purposes.
   ///
   /*--cef()--*/
   virtual void OnFullscreenModeChange(CefRefPtr<CefBrowser> browser,
                                       bool fullscreen) {}
 
   ///
-  // Called when the browser is about to display a tooltip. |text| contains the
-  // text that will be displayed in the tooltip. To handle the display of the
-  // tooltip yourself return true. Otherwise, you can optionally modify |text|
-  // and then return false to allow the browser to display the tooltip.
-  // When window rendering is disabled the application is responsible for
-  // drawing tooltips and the return value is ignored.
+  /// Called when the browser is about to display a tooltip. |text| contains the
+  /// text that will be displayed in the tooltip. To handle the display of the
+  /// tooltip yourself return true. Otherwise, you can optionally modify |text|
+  /// and then return false to allow the browser to display the tooltip.
+  /// When window rendering is disabled the application is responsible for
+  /// drawing tooltips and the return value is ignored.
   ///
   /*--cef(optional_param=text)--*/
   virtual bool OnTooltip(CefRefPtr<CefBrowser> browser, CefString& text) {
@@ -96,16 +100,16 @@
   }
 
   ///
-  // Called when the browser receives a status message. |value| contains the
-  // text that will be displayed in the status message.
+  /// Called when the browser receives a status message. |value| contains the
+  /// text that will be displayed in the status message.
   ///
   /*--cef(optional_param=value)--*/
   virtual void OnStatusMessage(CefRefPtr<CefBrowser> browser,
                                const CefString& value) {}
 
   ///
-  // Called to display a console message. Return true to stop the message from
-  // being output to the console.
+  /// Called to display a console message. Return true to stop the message from
+  /// being output to the console.
   ///
   /*--cef(optional_param=message,optional_param=source)--*/
   virtual bool OnConsoleMessage(CefRefPtr<CefBrowser> browser,
@@ -117,10 +121,10 @@
   }
 
   ///
-  // Called when auto-resize is enabled via CefBrowserHost::SetAutoResizeEnabled
-  // and the contents have auto-resized. |new_size| will be the desired size in
-  // view coordinates. Return true if the resize was handled or false for
-  // default handling.
+  /// Called when auto-resize is enabled via
+  /// CefBrowserHost::SetAutoResizeEnabled and the contents have auto-resized.
+  /// |new_size| will be the desired size in view coordinates. Return true if
+  /// the resize was handled or false for default handling.
   ///
   /*--cef()--*/
   virtual bool OnAutoResize(CefRefPtr<CefBrowser> browser,
@@ -129,12 +133,35 @@
   }
 
   ///
-  // Called when the overall page loading progress has changed. |progress|
-  // ranges from 0.0 to 1.0.
+  /// Called when the overall page loading progress has changed. |progress|
+  /// ranges from 0.0 to 1.0.
   ///
   /*--cef()--*/
   virtual void OnLoadingProgressChange(CefRefPtr<CefBrowser> browser,
                                        double progress) {}
+
+  ///
+  /// Called when the browser's cursor has changed. If |type| is CT_CUSTOM then
+  /// |custom_cursor_info| will be populated with the custom cursor information.
+  /// Return true if the cursor change was handled or false for default
+  /// handling.
+  ///
+  /*--cef()--*/
+  virtual bool OnCursorChange(CefRefPtr<CefBrowser> browser,
+                              CefCursorHandle cursor,
+                              cef_cursor_type_t type,
+                              const CefCursorInfo& custom_cursor_info) {
+    return false;
+  }
+
+  ///
+  /// Called when the browser's access to an audio and/or video source has
+  /// changed.
+  ///
+  /*--cef()--*/
+  virtual void OnMediaAccessChange(CefRefPtr<CefBrowser> browser,
+                                   bool has_video_access,
+                                   bool has_audio_access) {}
 };
 
 #endif  // CEF_INCLUDE_CEF_DISPLAY_HANDLER_H_
diff --git a/src/include/cef_dom.h b/src/include/cef_dom.h
index 382b193..8ddb8f6 100644
--- a/src/include/cef_dom.h
+++ b/src/include/cef_dom.h
@@ -45,26 +45,26 @@
 class CefDOMNode;
 
 ///
-// Interface to implement for visiting the DOM. The methods of this class will
-// be called on the render process main thread.
+/// Interface to implement for visiting the DOM. The methods of this class will
+/// be called on the render process main thread.
 ///
 /*--cef(source=client)--*/
 class CefDOMVisitor : public virtual CefBaseRefCounted {
  public:
   ///
-  // Method executed for visiting the DOM. The document object passed to this
-  // method represents a snapshot of the DOM at the time this method is
-  // executed. DOM objects are only valid for the scope of this method. Do not
-  // keep references to or attempt to access any DOM objects outside the scope
-  // of this method.
+  /// Method executed for visiting the DOM. The document object passed to this
+  /// method represents a snapshot of the DOM at the time this method is
+  /// executed. DOM objects are only valid for the scope of this method. Do not
+  /// keep references to or attempt to access any DOM objects outside the scope
+  /// of this method.
   ///
   /*--cef()--*/
   virtual void Visit(CefRefPtr<CefDOMDocument> document) = 0;
 };
 
 ///
-// Class used to represent a DOM document. The methods of this class should only
-// be called on the render process main thread thread.
+/// Class used to represent a DOM document. The methods of this class should
+/// only be called on the render process main thread thread.
 ///
 /*--cef(source=library)--*/
 class CefDOMDocument : public virtual CefBaseRefCounted {
@@ -72,206 +72,207 @@
   typedef cef_dom_document_type_t Type;
 
   ///
-  // Returns the document type.
+  /// Returns the document type.
   ///
   /*--cef(default_retval=DOM_DOCUMENT_TYPE_UNKNOWN)--*/
   virtual Type GetType() = 0;
 
   ///
-  // Returns the root document node.
+  /// Returns the root document node.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDOMNode> GetDocument() = 0;
 
   ///
-  // Returns the BODY node of an HTML document.
+  /// Returns the BODY node of an HTML document.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDOMNode> GetBody() = 0;
 
   ///
-  // Returns the HEAD node of an HTML document.
+  /// Returns the HEAD node of an HTML document.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDOMNode> GetHead() = 0;
 
   ///
-  // Returns the title of an HTML document.
+  /// Returns the title of an HTML document.
   ///
   /*--cef()--*/
   virtual CefString GetTitle() = 0;
 
   ///
-  // Returns the document element with the specified ID value.
+  /// Returns the document element with the specified ID value.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDOMNode> GetElementById(const CefString& id) = 0;
 
   ///
-  // Returns the node that currently has keyboard focus.
+  /// Returns the node that currently has keyboard focus.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDOMNode> GetFocusedNode() = 0;
 
   ///
-  // Returns true if a portion of the document is selected.
+  /// Returns true if a portion of the document is selected.
   ///
   /*--cef()--*/
   virtual bool HasSelection() = 0;
 
   ///
-  // Returns the selection offset within the start node.
+  /// Returns the selection offset within the start node.
   ///
   /*--cef()--*/
   virtual int GetSelectionStartOffset() = 0;
 
   ///
-  // Returns the selection offset within the end node.
+  /// Returns the selection offset within the end node.
   ///
   /*--cef()--*/
   virtual int GetSelectionEndOffset() = 0;
 
   ///
-  // Returns the contents of this selection as markup.
+  /// Returns the contents of this selection as markup.
   ///
   /*--cef()--*/
   virtual CefString GetSelectionAsMarkup() = 0;
 
   ///
-  // Returns the contents of this selection as text.
+  /// Returns the contents of this selection as text.
   ///
   /*--cef()--*/
   virtual CefString GetSelectionAsText() = 0;
 
   ///
-  // Returns the base URL for the document.
+  /// Returns the base URL for the document.
   ///
   /*--cef()--*/
   virtual CefString GetBaseURL() = 0;
 
   ///
-  // Returns a complete URL based on the document base URL and the specified
-  // partial URL.
+  /// Returns a complete URL based on the document base URL and the specified
+  /// partial URL.
   ///
   /*--cef()--*/
   virtual CefString GetCompleteURL(const CefString& partialURL) = 0;
 };
 
 ///
-// Class used to represent a DOM node. The methods of this class should only be
-// called on the render process main thread.
+/// Class used to represent a DOM node. The methods of this class should only be
+/// called on the render process main thread.
 ///
 /*--cef(source=library)--*/
 class CefDOMNode : public virtual CefBaseRefCounted {
  public:
   typedef std::map<CefString, CefString> AttributeMap;
   typedef cef_dom_node_type_t Type;
+  typedef cef_dom_form_control_type_t FormControlType;
 
   ///
-  // Returns the type for this node.
+  /// Returns the type for this node.
   ///
   /*--cef(default_retval=DOM_NODE_TYPE_UNSUPPORTED)--*/
   virtual Type GetType() = 0;
 
   ///
-  // Returns true if this is a text node.
+  /// Returns true if this is a text node.
   ///
   /*--cef()--*/
   virtual bool IsText() = 0;
 
   ///
-  // Returns true if this is an element node.
+  /// Returns true if this is an element node.
   ///
   /*--cef()--*/
   virtual bool IsElement() = 0;
 
   ///
-  // Returns true if this is an editable node.
+  /// Returns true if this is an editable node.
   ///
   /*--cef()--*/
   virtual bool IsEditable() = 0;
 
   ///
-  // Returns true if this is a form control element node.
+  /// Returns true if this is a form control element node.
   ///
-  /*--cef()--*/
+  /*--cef(default_retval=DOM_NODE_TYPE_UNSUPPORTED)--*/
   virtual bool IsFormControlElement() = 0;
 
   ///
-  // Returns the type of this form control element node.
+  /// Returns the type of this form control element node.
   ///
-  /*--cef()--*/
-  virtual CefString GetFormControlElementType() = 0;
+  /*--cef(default_retval=DOM_FORM_CONTROL_TYPE_UNSUPPORTED)--*/
+  virtual FormControlType GetFormControlElementType() = 0;
 
   ///
-  // Returns true if this object is pointing to the same handle as |that|
-  // object.
+  /// Returns true if this object is pointing to the same handle as |that|
+  /// object.
   ///
   /*--cef()--*/
   virtual bool IsSame(CefRefPtr<CefDOMNode> that) = 0;
 
   ///
-  // Returns the name of this node.
+  /// Returns the name of this node.
   ///
   /*--cef()--*/
   virtual CefString GetName() = 0;
 
   ///
-  // Returns the value of this node.
+  /// Returns the value of this node.
   ///
   /*--cef()--*/
   virtual CefString GetValue() = 0;
 
   ///
-  // Set the value of this node. Returns true on success.
+  /// Set the value of this node. Returns true on success.
   ///
   /*--cef()--*/
   virtual bool SetValue(const CefString& value) = 0;
 
   ///
-  // Returns the contents of this node as markup.
+  /// Returns the contents of this node as markup.
   ///
   /*--cef()--*/
   virtual CefString GetAsMarkup() = 0;
 
   ///
-  // Returns the document associated with this node.
+  /// Returns the document associated with this node.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDOMDocument> GetDocument() = 0;
 
   ///
-  // Returns the parent node.
+  /// Returns the parent node.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDOMNode> GetParent() = 0;
 
   ///
-  // Returns the previous sibling node.
+  /// Returns the previous sibling node.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDOMNode> GetPreviousSibling() = 0;
 
   ///
-  // Returns the next sibling node.
+  /// Returns the next sibling node.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDOMNode> GetNextSibling() = 0;
 
   ///
-  // Returns true if this node has child nodes.
+  /// Returns true if this node has child nodes.
   ///
   /*--cef()--*/
   virtual bool HasChildren() = 0;
 
   ///
-  // Return the first child node.
+  /// Return the first child node.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDOMNode> GetFirstChild() = 0;
 
   ///
-  // Returns the last child node.
+  /// Returns the last child node.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDOMNode> GetLastChild() = 0;
@@ -279,51 +280,52 @@
   // The following methods are valid only for element nodes.
 
   ///
-  // Returns the tag name of this element.
+  /// Returns the tag name of this element.
   ///
   /*--cef()--*/
   virtual CefString GetElementTagName() = 0;
 
   ///
-  // Returns true if this element has attributes.
+  /// Returns true if this element has attributes.
   ///
   /*--cef()--*/
   virtual bool HasElementAttributes() = 0;
 
   ///
-  // Returns true if this element has an attribute named |attrName|.
+  /// Returns true if this element has an attribute named |attrName|.
   ///
   /*--cef()--*/
   virtual bool HasElementAttribute(const CefString& attrName) = 0;
 
   ///
-  // Returns the element attribute named |attrName|.
+  /// Returns the element attribute named |attrName|.
   ///
   /*--cef()--*/
   virtual CefString GetElementAttribute(const CefString& attrName) = 0;
 
   ///
-  // Returns a map of all element attributes.
+  /// Returns a map of all element attributes.
   ///
   /*--cef()--*/
   virtual void GetElementAttributes(AttributeMap& attrMap) = 0;
 
   ///
-  // Set the value for the element attribute named |attrName|. Returns true on
-  // success.
+  /// Set the value for the element attribute named |attrName|. Returns true on
+  /// success.
   ///
   /*--cef()--*/
   virtual bool SetElementAttribute(const CefString& attrName,
                                    const CefString& value) = 0;
 
   ///
-  // Returns the inner text of the element.
+  /// Returns the inner text of the element.
   ///
   /*--cef()--*/
   virtual CefString GetElementInnerText() = 0;
 
   ///
-  // Returns the bounds of the element.
+  /// Returns the bounds of the element in device pixels. Use
+  /// "window.devicePixelRatio" to convert to/from CSS pixels.
   ///
   /*--cef()--*/
   virtual CefRect GetElementBounds() = 0;
diff --git a/src/include/cef_download_handler.h b/src/include/cef_download_handler.h
index dfaeba5..de911b6 100644
--- a/src/include/cef_download_handler.h
+++ b/src/include/cef_download_handler.h
@@ -43,59 +43,73 @@
 #include "include/cef_download_item.h"
 
 ///
-// Callback interface used to asynchronously continue a download.
+/// Callback interface used to asynchronously continue a download.
 ///
 /*--cef(source=library)--*/
 class CefBeforeDownloadCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Call to continue the download. Set |download_path| to the full file path
-  // for the download including the file name or leave blank to use the
-  // suggested name and the default temp directory. Set |show_dialog| to true
-  // if you do wish to show the default "Save As" dialog.
+  /// Call to continue the download. Set |download_path| to the full file path
+  /// for the download including the file name or leave blank to use the
+  /// suggested name and the default temp directory. Set |show_dialog| to true
+  /// if you do wish to show the default "Save As" dialog.
   ///
   /*--cef(capi_name=cont,optional_param=download_path)--*/
   virtual void Continue(const CefString& download_path, bool show_dialog) = 0;
 };
 
 ///
-// Callback interface used to asynchronously cancel a download.
+/// Callback interface used to asynchronously cancel a download.
 ///
 /*--cef(source=library)--*/
 class CefDownloadItemCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Call to cancel the download.
+  /// Call to cancel the download.
   ///
   /*--cef()--*/
   virtual void Cancel() = 0;
 
   ///
-  // Call to pause the download.
+  /// Call to pause the download.
   ///
   /*--cef()--*/
   virtual void Pause() = 0;
 
   ///
-  // Call to resume the download.
+  /// Call to resume the download.
   ///
   /*--cef()--*/
   virtual void Resume() = 0;
 };
 
 ///
-// Class used to handle file downloads. The methods of this class will called
-// on the browser process UI thread.
+/// Class used to handle file downloads. The methods of this class will called
+/// on the browser process UI thread.
 ///
 /*--cef(source=client)--*/
 class CefDownloadHandler : public virtual CefBaseRefCounted {
  public:
   ///
-  // Called before a download begins. |suggested_name| is the suggested name for
-  // the download file. By default the download will be canceled. Execute
-  // |callback| either asynchronously or in this method to continue the download
-  // if desired. Do not keep a reference to |download_item| outside of this
-  // method.
+  /// Called before a download begins in response to a user-initiated action
+  /// (e.g. alt + link click or link click that returns a `Content-Disposition:
+  /// attachment` response from the server). |url| is the target download URL
+  /// and |request_method| is the target method (GET, POST, etc). Return true to
+  /// proceed with the download or false to cancel the download.
+  ///
+  /*--cef()--*/
+  virtual bool CanDownload(CefRefPtr<CefBrowser> browser,
+                           const CefString& url,
+                           const CefString& request_method) {
+    return true;
+  }
+
+  ///
+  /// Called before a download begins. |suggested_name| is the suggested name
+  /// for the download file. By default the download will be canceled. Execute
+  /// |callback| either asynchronously or in this method to continue the
+  /// download if desired. Do not keep a reference to |download_item| outside of
+  /// this method.
   ///
   /*--cef()--*/
   virtual void OnBeforeDownload(
@@ -105,11 +119,11 @@
       CefRefPtr<CefBeforeDownloadCallback> callback) = 0;
 
   ///
-  // Called when a download's status or progress information has been updated.
-  // This may be called multiple times before and after OnBeforeDownload().
-  // Execute |callback| either asynchronously or in this method to cancel the
-  // download if desired. Do not keep a reference to |download_item| outside of
-  // this method.
+  /// Called when a download's status or progress information has been updated.
+  /// This may be called multiple times before and after OnBeforeDownload().
+  /// Execute |callback| either asynchronously or in this method to cancel the
+  /// download if desired. Do not keep a reference to |download_item| outside of
+  /// this method.
   ///
   /*--cef()--*/
   virtual void OnDownloadUpdated(CefRefPtr<CefBrowser> browser,
diff --git a/src/include/cef_download_item.h b/src/include/cef_download_item.h
index 930f53b..bb4be2b 100644
--- a/src/include/cef_download_item.h
+++ b/src/include/cef_download_item.h
@@ -41,111 +41,123 @@
 #include "include/cef_base.h"
 
 ///
-// Class used to represent a download item.
+/// Class used to represent a download item.
 ///
 /*--cef(source=library)--*/
 class CefDownloadItem : public virtual CefBaseRefCounted {
  public:
   ///
-  // Returns true if this object is valid. Do not call any other methods if this
-  // function returns false.
+  /// Returns true if this object is valid. Do not call any other methods if
+  /// this function returns false.
   ///
   /*--cef()--*/
   virtual bool IsValid() = 0;
 
   ///
-  // Returns true if the download is in progress.
+  /// Returns true if the download is in progress.
   ///
   /*--cef()--*/
   virtual bool IsInProgress() = 0;
 
   ///
-  // Returns true if the download is complete.
+  /// Returns true if the download is complete.
   ///
   /*--cef()--*/
   virtual bool IsComplete() = 0;
 
   ///
-  // Returns true if the download has been canceled or interrupted.
+  /// Returns true if the download has been canceled.
   ///
   /*--cef()--*/
   virtual bool IsCanceled() = 0;
 
   ///
-  // Returns a simple speed estimate in bytes/s.
+  /// Returns true if the download has been interrupted.
   ///
   /*--cef()--*/
-  virtual int64 GetCurrentSpeed() = 0;
+  virtual bool IsInterrupted() = 0;
 
   ///
-  // Returns the rough percent complete or -1 if the receive total size is
-  // unknown.
+  /// Returns the most recent interrupt reason.
+  ///
+  /*--cef(default_retval=CEF_DOWNLOAD_INTERRUPT_REASON_NONE)--*/
+  virtual cef_download_interrupt_reason_t GetInterruptReason() = 0;
+
+  ///
+  /// Returns a simple speed estimate in bytes/s.
+  ///
+  /*--cef()--*/
+  virtual int64_t GetCurrentSpeed() = 0;
+
+  ///
+  /// Returns the rough percent complete or -1 if the receive total size is
+  /// unknown.
   ///
   /*--cef()--*/
   virtual int GetPercentComplete() = 0;
 
   ///
-  // Returns the total number of bytes.
+  /// Returns the total number of bytes.
   ///
   /*--cef()--*/
-  virtual int64 GetTotalBytes() = 0;
+  virtual int64_t GetTotalBytes() = 0;
 
   ///
-  // Returns the number of received bytes.
+  /// Returns the number of received bytes.
   ///
   /*--cef()--*/
-  virtual int64 GetReceivedBytes() = 0;
+  virtual int64_t GetReceivedBytes() = 0;
 
   ///
-  // Returns the time that the download started.
+  /// Returns the time that the download started.
   ///
   /*--cef()--*/
-  virtual CefTime GetStartTime() = 0;
+  virtual CefBaseTime GetStartTime() = 0;
 
   ///
-  // Returns the time that the download ended.
+  /// Returns the time that the download ended.
   ///
   /*--cef()--*/
-  virtual CefTime GetEndTime() = 0;
+  virtual CefBaseTime GetEndTime() = 0;
 
   ///
-  // Returns the full path to the downloaded or downloading file.
+  /// Returns the full path to the downloaded or downloading file.
   ///
   /*--cef()--*/
   virtual CefString GetFullPath() = 0;
 
   ///
-  // Returns the unique identifier for this download.
+  /// Returns the unique identifier for this download.
   ///
   /*--cef()--*/
-  virtual uint32 GetId() = 0;
+  virtual uint32_t GetId() = 0;
 
   ///
-  // Returns the URL.
+  /// Returns the URL.
   ///
   /*--cef()--*/
   virtual CefString GetURL() = 0;
 
   ///
-  // Returns the original URL before any redirections.
+  /// Returns the original URL before any redirections.
   ///
   /*--cef()--*/
   virtual CefString GetOriginalUrl() = 0;
 
   ///
-  // Returns the suggested file name.
+  /// Returns the suggested file name.
   ///
   /*--cef()--*/
   virtual CefString GetSuggestedFileName() = 0;
 
   ///
-  // Returns the content disposition.
+  /// Returns the content disposition.
   ///
   /*--cef()--*/
   virtual CefString GetContentDisposition() = 0;
 
   ///
-  // Returns the mime type.
+  /// Returns the mime type.
   ///
   /*--cef()--*/
   virtual CefString GetMimeType() = 0;
diff --git a/src/include/cef_drag_data.h b/src/include/cef_drag_data.h
index 35661f8..735a64c 100644
--- a/src/include/cef_drag_data.h
+++ b/src/include/cef_drag_data.h
@@ -44,173 +44,186 @@
 #include "include/cef_stream.h"
 
 ///
-// Class used to represent drag data. The methods of this class may be called
-// on any thread.
+/// Class used to represent drag data. The methods of this class may be called
+/// on any thread.
 ///
 /*--cef(source=library)--*/
 class CefDragData : public virtual CefBaseRefCounted {
  public:
   ///
-  // Create a new CefDragData object.
+  /// Create a new CefDragData object.
   ///
   /*--cef()--*/
   static CefRefPtr<CefDragData> Create();
 
   ///
-  // Returns a copy of the current object.
+  /// Returns a copy of the current object.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDragData> Clone() = 0;
 
   ///
-  // Returns true if this object is read-only.
+  /// Returns true if this object is read-only.
   ///
   /*--cef()--*/
   virtual bool IsReadOnly() = 0;
 
   ///
-  // Returns true if the drag data is a link.
+  /// Returns true if the drag data is a link.
   ///
   /*--cef()--*/
   virtual bool IsLink() = 0;
 
   ///
-  // Returns true if the drag data is a text or html fragment.
+  /// Returns true if the drag data is a text or html fragment.
   ///
   /*--cef()--*/
   virtual bool IsFragment() = 0;
 
   ///
-  // Returns true if the drag data is a file.
+  /// Returns true if the drag data is a file.
   ///
   /*--cef()--*/
   virtual bool IsFile() = 0;
 
   ///
-  // Return the link URL that is being dragged.
+  /// Return the link URL that is being dragged.
   ///
   /*--cef()--*/
   virtual CefString GetLinkURL() = 0;
 
   ///
-  // Return the title associated with the link being dragged.
+  /// Return the title associated with the link being dragged.
   ///
   /*--cef()--*/
   virtual CefString GetLinkTitle() = 0;
 
   ///
-  // Return the metadata, if any, associated with the link being dragged.
+  /// Return the metadata, if any, associated with the link being dragged.
   ///
   /*--cef()--*/
   virtual CefString GetLinkMetadata() = 0;
 
   ///
-  // Return the plain text fragment that is being dragged.
+  /// Return the plain text fragment that is being dragged.
   ///
   /*--cef()--*/
   virtual CefString GetFragmentText() = 0;
 
   ///
-  // Return the text/html fragment that is being dragged.
+  /// Return the text/html fragment that is being dragged.
   ///
   /*--cef()--*/
   virtual CefString GetFragmentHtml() = 0;
 
   ///
-  // Return the base URL that the fragment came from. This value is used for
-  // resolving relative URLs and may be empty.
+  /// Return the base URL that the fragment came from. This value is used for
+  /// resolving relative URLs and may be empty.
   ///
   /*--cef()--*/
   virtual CefString GetFragmentBaseURL() = 0;
 
   ///
-  // Return the name of the file being dragged out of the browser window.
+  /// Return the name of the file being dragged out of the browser window.
   ///
   /*--cef()--*/
   virtual CefString GetFileName() = 0;
 
   ///
-  // Write the contents of the file being dragged out of the web view into
-  // |writer|. Returns the number of bytes sent to |writer|. If |writer| is
-  // NULL this method will return the size of the file contents in bytes.
-  // Call GetFileName() to get a suggested name for the file.
+  /// Write the contents of the file being dragged out of the web view into
+  /// |writer|. Returns the number of bytes sent to |writer|. If |writer| is
+  /// NULL this method will return the size of the file contents in bytes.
+  /// Call GetFileName() to get a suggested name for the file.
   ///
   /*--cef(optional_param=writer)--*/
   virtual size_t GetFileContents(CefRefPtr<CefStreamWriter> writer) = 0;
 
   ///
-  // Retrieve the list of file names that are being dragged into the browser
-  // window.
+  /// Retrieve the list of file names that are being dragged into the browser
+  /// window.
   ///
   /*--cef()--*/
   virtual bool GetFileNames(std::vector<CefString>& names) = 0;
 
   ///
-  // Set the link URL that is being dragged.
+  /// Retrieve the list of file paths that are being dragged into the browser
+  /// window.
+  ///
+  /*--cef()--*/
+  virtual bool GetFilePaths(std::vector<CefString>& paths) = 0;
+
+  ///
+  /// Set the link URL that is being dragged.
   ///
   /*--cef(optional_param=url)--*/
   virtual void SetLinkURL(const CefString& url) = 0;
 
   ///
-  // Set the title associated with the link being dragged.
+  /// Set the title associated with the link being dragged.
   ///
   /*--cef(optional_param=title)--*/
   virtual void SetLinkTitle(const CefString& title) = 0;
 
   ///
-  // Set the metadata associated with the link being dragged.
+  /// Set the metadata associated with the link being dragged.
   ///
   /*--cef(optional_param=data)--*/
   virtual void SetLinkMetadata(const CefString& data) = 0;
 
   ///
-  // Set the plain text fragment that is being dragged.
+  /// Set the plain text fragment that is being dragged.
   ///
   /*--cef(optional_param=text)--*/
   virtual void SetFragmentText(const CefString& text) = 0;
 
   ///
-  // Set the text/html fragment that is being dragged.
+  /// Set the text/html fragment that is being dragged.
   ///
   /*--cef(optional_param=html)--*/
   virtual void SetFragmentHtml(const CefString& html) = 0;
 
   ///
-  // Set the base URL that the fragment came from.
+  /// Set the base URL that the fragment came from.
   ///
   /*--cef(optional_param=base_url)--*/
   virtual void SetFragmentBaseURL(const CefString& base_url) = 0;
 
   ///
-  // Reset the file contents. You should do this before calling
-  // CefBrowserHost::DragTargetDragEnter as the web view does not allow us to
-  // drag in this kind of data.
+  /// Reset the file contents. You should do this before calling
+  /// CefBrowserHost::DragTargetDragEnter as the web view does not allow us to
+  /// drag in this kind of data.
   ///
   /*--cef()--*/
   virtual void ResetFileContents() = 0;
 
   ///
-  // Add a file that is being dragged into the webview.
+  /// Add a file that is being dragged into the webview.
   ///
   /*--cef(optional_param=display_name)--*/
   virtual void AddFile(const CefString& path,
                        const CefString& display_name) = 0;
 
   ///
-  // Get the image representation of drag data. May return NULL if no image
-  // representation is available.
+  /// Clear list of filenames.
+  ///
+  /*--cef()--*/
+  virtual void ClearFilenames() = 0;
+
+  ///
+  /// Get the image representation of drag data. May return NULL if no image
+  /// representation is available.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefImage> GetImage() = 0;
 
   ///
-  // Get the image hotspot (drag start location relative to image dimensions).
+  /// Get the image hotspot (drag start location relative to image dimensions).
   ///
   /*--cef()--*/
   virtual CefPoint GetImageHotspot() = 0;
 
   ///
-  // Returns true if an image representation of drag data is available.
+  /// Returns true if an image representation of drag data is available.
   ///
   /*--cef()--*/
   virtual bool HasImage() = 0;
diff --git a/src/include/cef_drag_handler.h b/src/include/cef_drag_handler.h
index dfa226e..cd354d7 100644
--- a/src/include/cef_drag_handler.h
+++ b/src/include/cef_drag_handler.h
@@ -44,8 +44,8 @@
 #include "include/cef_frame.h"
 
 ///
-// Implement this interface to handle events related to dragging. The methods of
-// this class will be called on the UI thread.
+/// Implement this interface to handle events related to dragging. The methods
+/// of this class will be called on the UI thread.
 ///
 /*--cef(source=client)--*/
 class CefDragHandler : public virtual CefBaseRefCounted {
@@ -53,10 +53,10 @@
   typedef cef_drag_operations_mask_t DragOperationsMask;
 
   ///
-  // Called when an external drag event enters the browser window. |dragData|
-  // contains the drag event data and |mask| represents the type of drag
-  // operation. Return false for default drag handling behavior or true to
-  // cancel the drag event.
+  /// Called when an external drag event enters the browser window. |dragData|
+  /// contains the drag event data and |mask| represents the type of drag
+  /// operation. Return false for default drag handling behavior or true to
+  /// cancel the drag event.
   ///
   /*--cef()--*/
   virtual bool OnDragEnter(CefRefPtr<CefBrowser> browser,
@@ -66,11 +66,11 @@
   }
 
   ///
-  // Called whenever draggable regions for the browser window change. These can
-  // be specified using the '-webkit-app-region: drag/no-drag' CSS-property. If
-  // draggable regions are never defined in a document this method will also
-  // never be called. If the last draggable region is removed from a document
-  // this method will be called with an empty vector.
+  /// Called whenever draggable regions for the browser window change. These can
+  /// be specified using the '-webkit-app-region: drag/no-drag' CSS-property. If
+  /// draggable regions are never defined in a document this method will also
+  /// never be called. If the last draggable region is removed from a document
+  /// this method will be called with an empty vector.
   ///
   /*--cef()--*/
   virtual void OnDraggableRegionsChanged(
diff --git a/src/include/cef_extension.h b/src/include/cef_extension.h
index c34d013..5d94192 100644
--- a/src/include/cef_extension.h
+++ b/src/include/cef_extension.h
@@ -45,70 +45,71 @@
 class CefRequestContext;
 
 ///
-// Object representing an extension. Methods may be called on any thread unless
-// otherwise indicated.
+/// Object representing an extension. Methods may be called on any thread unless
+/// otherwise indicated.
 ///
 /*--cef(source=library)--*/
 class CefExtension : public CefBaseRefCounted {
  public:
   ///
-  // Returns the unique extension identifier. This is calculated based on the
-  // extension public key, if available, or on the extension path. See
-  // https://developer.chrome.com/extensions/manifest/key for details.
+  /// Returns the unique extension identifier. This is calculated based on the
+  /// extension public key, if available, or on the extension path. See
+  /// https://developer.chrome.com/extensions/manifest/key for details.
   ///
   /*--cef()--*/
   virtual CefString GetIdentifier() = 0;
 
   ///
-  // Returns the absolute path to the extension directory on disk. This value
-  // will be prefixed with PK_DIR_RESOURCES if a relative path was passed to
-  // CefRequestContext::LoadExtension.
+  /// Returns the absolute path to the extension directory on disk. This value
+  /// will be prefixed with PK_DIR_RESOURCES if a relative path was passed to
+  /// CefRequestContext::LoadExtension.
   ///
   /*--cef()--*/
   virtual CefString GetPath() = 0;
 
   ///
-  // Returns the extension manifest contents as a CefDictionaryValue object. See
-  // https://developer.chrome.com/extensions/manifest for details.
+  /// Returns the extension manifest contents as a CefDictionaryValue object.
+  /// See https://developer.chrome.com/extensions/manifest for details.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDictionaryValue> GetManifest() = 0;
 
   ///
-  // Returns true if this object is the same extension as |that| object.
-  // Extensions are considered the same if identifier, path and loader context
-  // match.
+  /// Returns true if this object is the same extension as |that| object.
+  /// Extensions are considered the same if identifier, path and loader context
+  /// match.
   ///
   /*--cef()--*/
   virtual bool IsSame(CefRefPtr<CefExtension> that) = 0;
 
   ///
-  // Returns the handler for this extension. Will return NULL for internal
-  // extensions or if no handler was passed to CefRequestContext::LoadExtension.
+  /// Returns the handler for this extension. Will return NULL for internal
+  /// extensions or if no handler was passed to
+  /// CefRequestContext::LoadExtension.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefExtensionHandler> GetHandler() = 0;
 
   ///
-  // Returns the request context that loaded this extension. Will return NULL
-  // for internal extensions or if the extension has been unloaded. See the
-  // CefRequestContext::LoadExtension documentation for more information about
-  // loader contexts. Must be called on the browser process UI thread.
+  /// Returns the request context that loaded this extension. Will return NULL
+  /// for internal extensions or if the extension has been unloaded. See the
+  /// CefRequestContext::LoadExtension documentation for more information about
+  /// loader contexts. Must be called on the browser process UI thread.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefRequestContext> GetLoaderContext() = 0;
 
   ///
-  // Returns true if this extension is currently loaded. Must be called on the
-  // browser process UI thread.
+  /// Returns true if this extension is currently loaded. Must be called on the
+  /// browser process UI thread.
   ///
   /*--cef()--*/
   virtual bool IsLoaded() = 0;
 
   ///
-  // Unload this extension if it is not an internal extension and is currently
-  // loaded. Will result in a call to CefExtensionHandler::OnExtensionUnloaded
-  // on success.
+  /// Unload this extension if it is not an internal extension and is currently
+  /// loaded. Will result in a call to CefExtensionHandler::OnExtensionUnloaded
+  /// on success.
   ///
   /*--cef()--*/
   virtual void Unload() = 0;
diff --git a/src/include/cef_extension_handler.h b/src/include/cef_extension_handler.h
index 67dda33..4b34fbc 100644
--- a/src/include/cef_extension_handler.h
+++ b/src/include/cef_extension_handler.h
@@ -46,67 +46,67 @@
 class CefClient;
 
 ///
-// Callback interface used for asynchronous continuation of
-// CefExtensionHandler::GetExtensionResource.
+/// Callback interface used for asynchronous continuation of
+/// CefExtensionHandler::GetExtensionResource.
 ///
 /*--cef(source=library)--*/
 class CefGetExtensionResourceCallback : public CefBaseRefCounted {
  public:
   ///
-  // Continue the request. Read the resource contents from |stream|.
+  /// Continue the request. Read the resource contents from |stream|.
   ///
   /*--cef(capi_name=cont,optional_param=stream)--*/
   virtual void Continue(CefRefPtr<CefStreamReader> stream) = 0;
 
   ///
-  // Cancel the request.
+  /// Cancel the request.
   ///
   /*--cef()--*/
   virtual void Cancel() = 0;
 };
 
 ///
-// Implement this interface to handle events related to browser extensions.
-// The methods of this class will be called on the UI thread. See
-// CefRequestContext::LoadExtension for information about extension loading.
+/// Implement this interface to handle events related to browser extensions.
+/// The methods of this class will be called on the UI thread. See
+/// CefRequestContext::LoadExtension for information about extension loading.
 ///
 /*--cef(source=client)--*/
 class CefExtensionHandler : public virtual CefBaseRefCounted {
  public:
   ///
-  // Called if the CefRequestContext::LoadExtension request fails. |result| will
-  // be the error code.
+  /// Called if the CefRequestContext::LoadExtension request fails. |result|
+  /// will be the error code.
   ///
   /*--cef()--*/
   virtual void OnExtensionLoadFailed(cef_errorcode_t result) {}
 
   ///
-  // Called if the CefRequestContext::LoadExtension request succeeds.
-  // |extension| is the loaded extension.
+  /// Called if the CefRequestContext::LoadExtension request succeeds.
+  /// |extension| is the loaded extension.
   ///
   /*--cef()--*/
   virtual void OnExtensionLoaded(CefRefPtr<CefExtension> extension) {}
 
   ///
-  // Called after the CefExtension::Unload request has completed.
+  /// Called after the CefExtension::Unload request has completed.
   ///
   /*--cef()--*/
   virtual void OnExtensionUnloaded(CefRefPtr<CefExtension> extension) {}
 
   ///
-  // Called when an extension needs a browser to host a background script
-  // specified via the "background" manifest key. The browser will have no
-  // visible window and cannot be displayed. |extension| is the extension that
-  // is loading the background script. |url| is an internally generated
-  // reference to an HTML page that will be used to load the background script
-  // via a <script> src attribute. To allow creation of the browser optionally
-  // modify |client| and |settings| and return false. To cancel creation of the
-  // browser (and consequently cancel load of the background script) return
-  // true. Successful creation will be indicated by a call to
-  // CefLifeSpanHandler::OnAfterCreated, and CefBrowserHost::IsBackgroundHost
-  // will return true for the resulting browser. See
-  // https://developer.chrome.com/extensions/event_pages for more information
-  // about extension background script usage.
+  /// Called when an extension needs a browser to host a background script
+  /// specified via the "background" manifest key. The browser will have no
+  /// visible window and cannot be displayed. |extension| is the extension that
+  /// is loading the background script. |url| is an internally generated
+  /// reference to an HTML page that will be used to load the background script
+  /// via a "<script>" src attribute. To allow creation of the browser
+  /// optionally modify |client| and |settings| and return false. To cancel
+  /// creation of the browser (and consequently cancel load of the background
+  /// script) return true. Successful creation will be indicated by a call to
+  /// CefLifeSpanHandler::OnAfterCreated, and CefBrowserHost::IsBackgroundHost
+  /// will return true for the resulting browser. See
+  /// https://developer.chrome.com/extensions/event_pages for more information
+  /// about extension background script usage.
   ///
   /*--cef()--*/
   virtual bool OnBeforeBackgroundBrowser(CefRefPtr<CefExtension> extension,
@@ -117,18 +117,19 @@
   }
 
   ///
-  // Called when an extension API (e.g. chrome.tabs.create) requests creation of
-  // a new browser. |extension| and |browser| are the source of the API call.
-  // |active_browser| may optionally be specified via the windowId property or
-  // returned via the GetActiveBrowser() callback and provides the default
-  // |client| and |settings| values for the new browser. |index| is the position
-  // value optionally specified via the index property. |url| is the URL that
-  // will be loaded in the browser. |active| is true if the new browser should
-  // be active when opened.  To allow creation of the browser optionally modify
-  // |windowInfo|, |client| and |settings| and return false. To cancel creation
-  // of the browser return true. Successful creation will be indicated by a call
-  // to CefLifeSpanHandler::OnAfterCreated. Any modifications to |windowInfo|
-  // will be ignored if |active_browser| is wrapped in a CefBrowserView.
+  /// Called when an extension API (e.g. chrome.tabs.create) requests creation
+  /// of a new browser. |extension| and |browser| are the source of the API
+  /// call. |active_browser| may optionally be specified via the windowId
+  /// property or returned via the GetActiveBrowser() callback and provides the
+  /// default |client| and |settings| values for the new browser. |index| is the
+  /// position value optionally specified via the index property. |url| is the
+  /// URL that will be loaded in the browser. |active| is true if the new
+  /// browser should be active when opened.  To allow creation of the browser
+  /// optionally modify |windowInfo|, |client| and |settings| and return false.
+  /// To cancel creation of the browser return true. Successful creation will be
+  /// indicated by a call to CefLifeSpanHandler::OnAfterCreated. Any
+  /// modifications to |windowInfo| will be ignored if |active_browser| is
+  /// wrapped in a CefBrowserView.
   ///
   /*--cef()--*/
   virtual bool OnBeforeBrowser(CefRefPtr<CefExtension> extension,
@@ -144,13 +145,13 @@
   }
 
   ///
-  // Called when no tabId is specified to an extension API call that accepts a
-  // tabId parameter (e.g. chrome.tabs.*). |extension| and |browser| are the
-  // source of the API call. Return the browser that will be acted on by the API
-  // call or return NULL to act on |browser|. The returned browser must share
-  // the same CefRequestContext as |browser|. Incognito browsers should not be
-  // considered unless the source extension has incognito access enabled, in
-  // which case |include_incognito| will be true.
+  /// Called when no tabId is specified to an extension API call that accepts a
+  /// tabId parameter (e.g. chrome.tabs.*). |extension| and |browser| are the
+  /// source of the API call. Return the browser that will be acted on by the
+  /// API call or return NULL to act on |browser|. The returned browser must
+  /// share the same CefRequestContext as |browser|. Incognito browsers should
+  /// not be considered unless the source extension has incognito access
+  /// enabled, in which case |include_incognito| will be true.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefBrowser> GetActiveBrowser(
@@ -161,12 +162,12 @@
   }
 
   ///
-  // Called when the tabId associated with |target_browser| is specified to an
-  // extension API call that accepts a tabId parameter (e.g. chrome.tabs.*).
-  // |extension| and |browser| are the source of the API call. Return true
-  // to allow access of false to deny access. Access to incognito browsers
-  // should not be allowed unless the source extension has incognito access
-  // enabled, in which case |include_incognito| will be true.
+  /// Called when the tabId associated with |target_browser| is specified to an
+  /// extension API call that accepts a tabId parameter (e.g. chrome.tabs.*).
+  /// |extension| and |browser| are the source of the API call. Return true
+  /// to allow access of false to deny access. Access to incognito browsers
+  /// should not be allowed unless the source extension has incognito access
+  /// enabled, in which case |include_incognito| will be true.
   ///
   /*--cef()--*/
   virtual bool CanAccessBrowser(CefRefPtr<CefExtension> extension,
@@ -177,14 +178,14 @@
   }
 
   ///
-  // Called to retrieve an extension resource that would normally be loaded from
-  // disk (e.g. if a file parameter is specified to chrome.tabs.executeScript).
-  // |extension| and |browser| are the source of the resource request. |file| is
-  // the requested relative file path. To handle the resource request return
-  // true and execute |callback| either synchronously or asynchronously. For the
-  // default behavior which reads the resource from the extension directory on
-  // disk return false. Localization substitutions will not be applied to
-  // resources handled via this method.
+  /// Called to retrieve an extension resource that would normally be loaded
+  /// from disk (e.g. if a file parameter is specified to
+  /// chrome.tabs.executeScript). |extension| and |browser| are the source of
+  /// the resource request. |file| is the requested relative file path. To
+  /// handle the resource request return true and execute |callback| either
+  /// synchronously or asynchronously. For the default behavior which reads the
+  /// resource from the extension directory on disk return false. Localization
+  /// substitutions will not be applied to resources handled via this method.
   ///
   /*--cef()--*/
   virtual bool GetExtensionResource(
diff --git a/src/include/cef_file_util.h b/src/include/cef_file_util.h
index 8dd1ff6..838bdc1 100644
--- a/src/include/cef_file_util.h
+++ b/src/include/cef_file_util.h
@@ -42,43 +42,43 @@
 #include "include/cef_base.h"
 
 ///
-// Creates a directory and all parent directories if they don't already exist.
-// Returns true on successful creation or if the directory already exists. The
-// directory is only readable by the current user. Calling this function on the
-// browser process UI or IO threads is not allowed.
+/// Creates a directory and all parent directories if they don't already exist.
+/// Returns true on successful creation or if the directory already exists. The
+/// directory is only readable by the current user. Calling this function on the
+/// browser process UI or IO threads is not allowed.
 ///
 /*--cef()--*/
 bool CefCreateDirectory(const CefString& full_path);
 
 ///
-// Get the temporary directory provided by the system.
-//
-// WARNING: In general, you should use the temp directory variants below instead
-// of this function. Those variants will ensure that the proper permissions are
-// set so that other users on the system can't edit them while they're open
-// (which could lead to security issues).
+/// Get the temporary directory provided by the system.
+///
+/// WARNING: In general, you should use the temp directory variants below
+/// instead of this function. Those variants will ensure that the proper
+/// permissions are set so that other users on the system can't edit them while
+/// they're open (which could lead to security issues).
 ///
 /*--cef()--*/
 bool CefGetTempDirectory(CefString& temp_dir);
 
 ///
-// Creates a new directory. On Windows if |prefix| is provided the new directory
-// name is in the format of "prefixyyyy". Returns true on success and sets
-// |new_temp_path| to the full path of the directory that was created. The
-// directory is only readable by the current user. Calling this function on the
-// browser process UI or IO threads is not allowed.
+/// Creates a new directory. On Windows if |prefix| is provided the new
+/// directory name is in the format of "prefixyyyy". Returns true on success and
+/// sets |new_temp_path| to the full path of the directory that was created. The
+/// directory is only readable by the current user. Calling this function on the
+/// browser process UI or IO threads is not allowed.
 ///
 /*--cef(optional_param=prefix)--*/
 bool CefCreateNewTempDirectory(const CefString& prefix,
                                CefString& new_temp_path);
 
 ///
-// Creates a directory within another directory. Extra characters will be
-// appended to |prefix| to ensure that the new directory does not have the same
-// name as an existing directory. Returns true on success and sets |new_dir| to
-// the full path of the directory that was created. The directory is only
-// readable by the current user. Calling this function on the browser process
-// UI or IO threads is not allowed.
+/// Creates a directory within another directory. Extra characters will be
+/// appended to |prefix| to ensure that the new directory does not have the same
+/// name as an existing directory. Returns true on success and sets |new_dir| to
+/// the full path of the directory that was created. The directory is only
+/// readable by the current user. Calling this function on the browser process
+/// UI or IO threads is not allowed.
 ///
 /*--cef(optional_param=prefix)--*/
 bool CefCreateTempDirectoryInDirectory(const CefString& base_dir,
@@ -86,29 +86,29 @@
                                        CefString& new_dir);
 
 ///
-// Returns true if the given path exists and is a directory. Calling this
-// function on the browser process UI or IO threads is not allowed.
+/// Returns true if the given path exists and is a directory. Calling this
+/// function on the browser process UI or IO threads is not allowed.
 ///
 /*--cef()--*/
 bool CefDirectoryExists(const CefString& path);
 
 ///
-// Deletes the given path whether it's a file or a directory. If |path| is a
-// directory all contents will be deleted.  If |recursive| is true any sub-
-// directories and their contents will also be deleted (equivalent to executing
-// "rm -rf", so use with caution). On POSIX environments if |path| is a symbolic
-// link then only the symlink will be deleted. Returns true on successful
-// deletion or if |path| does not exist. Calling this function on the browser
-// process UI or IO threads is not allowed.
+/// Deletes the given path whether it's a file or a directory. If |path| is a
+/// directory all contents will be deleted.  If |recursive| is true any sub-
+/// directories and their contents will also be deleted (equivalent to executing
+/// "rm -rf", so use with caution). On POSIX environments if |path| is a
+/// symbolic link then only the symlink will be deleted. Returns true on
+/// successful deletion or if |path| does not exist. Calling this function on
+/// the browser process UI or IO threads is not allowed.
 ///
 /*--cef()--*/
 bool CefDeleteFile(const CefString& path, bool recursive);
 
 ///
-// Writes the contents of |src_dir| into a zip archive at |dest_file|. If
-// |include_hidden_files| is true files starting with "." will be included.
-// Returns true on success.  Calling this function on the browser process UI or
-// IO threads is not allowed.
+/// Writes the contents of |src_dir| into a zip archive at |dest_file|. If
+/// |include_hidden_files| is true files starting with "." will be included.
+/// Returns true on success.  Calling this function on the browser process UI or
+/// IO threads is not allowed.
 ///
 /*--cef()--*/
 bool CefZipDirectory(const CefString& src_dir,
@@ -116,12 +116,13 @@
                      bool include_hidden_files);
 
 ///
-// Loads the existing "Certificate Revocation Lists" file that is managed by
-// Google Chrome. This file can generally be found in Chrome's User Data
-// directory (e.g. "C:\Users\[User]\AppData\Local\Google\Chrome\User Data\" on
-// Windows) and is updated periodically by Chrome's component updater service.
-// Must be called in the browser process after the context has been initialized.
-// See https://dev.chromium.org/Home/chromium-security/crlsets for background.
+/// Loads the existing "Certificate Revocation Lists" file that is managed by
+/// Google Chrome. This file can generally be found in Chrome's User Data
+/// directory (e.g. "C:\Users\[User]\AppData\Local\Google\Chrome\User Data\" on
+/// Windows) and is updated periodically by Chrome's component updater service.
+/// Must be called in the browser process after the context has been
+/// initialized. See https://dev.chromium.org/Home/chromium-security/crlsets for
+/// background.
 ///
 /*--cef()--*/
 void CefLoadCRLSetsFile(const CefString& path);
diff --git a/src/include/cef_find_handler.h b/src/include/cef_find_handler.h
index a9cac0a..bd3a700 100644
--- a/src/include/cef_find_handler.h
+++ b/src/include/cef_find_handler.h
@@ -42,19 +42,19 @@
 #include "include/cef_browser.h"
 
 ///
-// Implement this interface to handle events related to find results. The
-// methods of this class will be called on the UI thread.
+/// Implement this interface to handle events related to find results. The
+/// methods of this class will be called on the UI thread.
 ///
 /*--cef(source=client)--*/
 class CefFindHandler : public virtual CefBaseRefCounted {
  public:
   ///
-  // Called to report find results returned by CefBrowserHost::Find().
-  // |identifer| is the identifier passed to Find(), |count| is the number of
-  // matches currently identified, |selectionRect| is the location of where the
-  // match was found (in window coordinates), |activeMatchOrdinal| is the
-  // current position in the search results, and |finalUpdate| is true if this
-  // is the last find notification.
+  /// Called to report find results returned by CefBrowserHost::Find().
+  /// |identifer| is a unique incremental identifier for the currently active
+  /// search, |count| is the number of matches currently identified,
+  /// |selectionRect| is the location of where the match was found (in window
+  /// coordinates), |activeMatchOrdinal| is the current position in the search
+  /// results, and |finalUpdate| is true if this is the last find notification.
   ///
   /*--cef()--*/
   virtual void OnFindResult(CefRefPtr<CefBrowser> browser,
diff --git a/src/include/cef_focus_handler.h b/src/include/cef_focus_handler.h
index 6fd44f5..5f05e50 100644
--- a/src/include/cef_focus_handler.h
+++ b/src/include/cef_focus_handler.h
@@ -44,8 +44,8 @@
 #include "include/cef_frame.h"
 
 ///
-// Implement this interface to handle events related to focus. The methods of
-// this class will be called on the UI thread.
+/// Implement this interface to handle events related to focus. The methods of
+/// this class will be called on the UI thread.
 ///
 /*--cef(source=client)--*/
 class CefFocusHandler : public virtual CefBaseRefCounted {
@@ -53,18 +53,18 @@
   typedef cef_focus_source_t FocusSource;
 
   ///
-  // Called when the browser component is about to loose focus. For instance, if
-  // focus was on the last HTML element and the user pressed the TAB key. |next|
-  // will be true if the browser is giving focus to the next component and false
-  // if the browser is giving focus to the previous component.
+  /// Called when the browser component is about to loose focus. For instance,
+  /// if focus was on the last HTML element and the user pressed the TAB key.
+  /// |next| will be true if the browser is giving focus to the next component
+  /// and false if the browser is giving focus to the previous component.
   ///
   /*--cef()--*/
   virtual void OnTakeFocus(CefRefPtr<CefBrowser> browser, bool next) {}
 
   ///
-  // Called when the browser component is requesting focus. |source| indicates
-  // where the focus request is originating from. Return false to allow the
-  // focus to be set or true to cancel setting the focus.
+  /// Called when the browser component is requesting focus. |source| indicates
+  /// where the focus request is originating from. Return false to allow the
+  /// focus to be set or true to cancel setting the focus.
   ///
   /*--cef()--*/
   virtual bool OnSetFocus(CefRefPtr<CefBrowser> browser, FocusSource source) {
@@ -72,7 +72,7 @@
   }
 
   ///
-  // Called when the browser component has received focus.
+  /// Called when the browser component has received focus.
   ///
   /*--cef()--*/
   virtual void OnGotFocus(CefRefPtr<CefBrowser> browser) {}
diff --git a/src/include/cef_frame.h b/src/include/cef_frame.h
index a1d0bba..ab11dee 100644
--- a/src/include/cef_frame.h
+++ b/src/include/cef_frame.h
@@ -51,106 +51,106 @@
 class CefV8Context;
 
 ///
-// Class used to represent a frame in the browser window. When used in the
-// browser process the methods of this class may be called on any thread unless
-// otherwise indicated in the comments. When used in the render process the
-// methods of this class may only be called on the main thread.
+/// Class used to represent a frame in the browser window. When used in the
+/// browser process the methods of this class may be called on any thread unless
+/// otherwise indicated in the comments. When used in the render process the
+/// methods of this class may only be called on the main thread.
 ///
 /*--cef(source=library)--*/
 class CefFrame : public virtual CefBaseRefCounted {
  public:
   ///
-  // True if this object is currently attached to a valid frame.
+  /// True if this object is currently attached to a valid frame.
   ///
   /*--cef()--*/
   virtual bool IsValid() = 0;
 
   ///
-  // Execute undo in this frame.
+  /// Execute undo in this frame.
   ///
   /*--cef()--*/
   virtual void Undo() = 0;
 
   ///
-  // Execute redo in this frame.
+  /// Execute redo in this frame.
   ///
   /*--cef()--*/
   virtual void Redo() = 0;
 
   ///
-  // Execute cut in this frame.
+  /// Execute cut in this frame.
   ///
   /*--cef()--*/
   virtual void Cut() = 0;
 
   ///
-  // Execute copy in this frame.
+  /// Execute copy in this frame.
   ///
   /*--cef()--*/
   virtual void Copy() = 0;
 
   ///
-  // Execute paste in this frame.
+  /// Execute paste in this frame.
   ///
   /*--cef()--*/
   virtual void Paste() = 0;
 
   ///
-  // Execute delete in this frame.
+  /// Execute delete in this frame.
   ///
   /*--cef(capi_name=del)--*/
   virtual void Delete() = 0;
 
   ///
-  // Execute select all in this frame.
+  /// Execute select all in this frame.
   ///
   /*--cef()--*/
   virtual void SelectAll() = 0;
 
   ///
-  // Save this frame's HTML source to a temporary file and open it in the
-  // default text viewing application. This method can only be called from the
-  // browser process.
+  /// Save this frame's HTML source to a temporary file and open it in the
+  /// default text viewing application. This method can only be called from the
+  /// browser process.
   ///
   /*--cef()--*/
   virtual void ViewSource() = 0;
 
   ///
-  // Retrieve this frame's HTML source as a string sent to the specified
-  // visitor.
+  /// Retrieve this frame's HTML source as a string sent to the specified
+  /// visitor.
   ///
   /*--cef()--*/
   virtual void GetSource(CefRefPtr<CefStringVisitor> visitor) = 0;
 
   ///
-  // Retrieve this frame's display text as a string sent to the specified
-  // visitor.
+  /// Retrieve this frame's display text as a string sent to the specified
+  /// visitor.
   ///
   /*--cef()--*/
   virtual void GetText(CefRefPtr<CefStringVisitor> visitor) = 0;
 
   ///
-  // Load the request represented by the |request| object.
-  //
-  // WARNING: This method will fail with "bad IPC message" reason
-  // INVALID_INITIATOR_ORIGIN (213) unless you first navigate to the
-  // request origin using some other mechanism (LoadURL, link click, etc).
+  /// Load the request represented by the |request| object.
+  ///
+  /// WARNING: This method will fail with "bad IPC message" reason
+  /// INVALID_INITIATOR_ORIGIN (213) unless you first navigate to the
+  /// request origin using some other mechanism (LoadURL, link click, etc).
   ///
   /*--cef()--*/
   virtual void LoadRequest(CefRefPtr<CefRequest> request) = 0;
 
   ///
-  // Load the specified |url|.
+  /// Load the specified |url|.
   ///
   /*--cef()--*/
   virtual void LoadURL(const CefString& url) = 0;
 
   ///
-  // Execute a string of JavaScript code in this frame. The |script_url|
-  // parameter is the URL where the script in question can be found, if any.
-  // The renderer may request this URL to show the developer the source of the
-  // error.  The |start_line| parameter is the base line number to use for error
-  // reporting.
+  /// Execute a string of JavaScript code in this frame. The |script_url|
+  /// parameter is the URL where the script in question can be found, if any.
+  /// The renderer may request this URL to show the developer the source of the
+  /// error.  The |start_line| parameter is the base line number to use for
+  /// error reporting.
   ///
   /*--cef(optional_param=script_url)--*/
   virtual void ExecuteJavaScript(const CefString& code,
@@ -158,87 +158,81 @@
                                  int start_line) = 0;
 
   ///
-  // Returns true if this is the main (top-level) frame.
+  /// Returns true if this is the main (top-level) frame.
   ///
   /*--cef()--*/
   virtual bool IsMain() = 0;
 
   ///
-  // Returns true if this is the focused frame.
+  /// Returns true if this is the focused frame.
   ///
   /*--cef()--*/
   virtual bool IsFocused() = 0;
 
   ///
-  // Returns the name for this frame. If the frame has an assigned name (for
-  // example, set via the iframe "name" attribute) then that value will be
-  // returned. Otherwise a unique name will be constructed based on the frame
-  // parent hierarchy. The main (top-level) frame will always have an empty name
-  // value.
+  /// Returns the name for this frame. If the frame has an assigned name (for
+  /// example, set via the iframe "name" attribute) then that value will be
+  /// returned. Otherwise a unique name will be constructed based on the frame
+  /// parent hierarchy. The main (top-level) frame will always have an empty
+  /// name value.
   ///
   /*--cef()--*/
   virtual CefString GetName() = 0;
 
   ///
-  // Returns the globally unique identifier for this frame or < 0 if the
-  // underlying frame does not yet exist.
+  /// Returns the globally unique identifier for this frame or < 0 if the
+  /// underlying frame does not yet exist.
   ///
   /*--cef()--*/
-  virtual int64 GetIdentifier() = 0;
+  virtual int64_t GetIdentifier() = 0;
 
   ///
-  // Returns the parent of this frame or NULL if this is the main (top-level)
-  // frame.
+  /// Returns the parent of this frame or NULL if this is the main (top-level)
+  /// frame.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefFrame> GetParent() = 0;
 
   ///
-  // Returns the URL currently loaded in this frame.
+  /// Returns the URL currently loaded in this frame.
   ///
   /*--cef()--*/
   virtual CefString GetURL() = 0;
 
   ///
-  // Returns the browser that this frame belongs to.
+  /// Returns the browser that this frame belongs to.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefBrowser> GetBrowser() = 0;
 
   ///
-  // Get the V8 context associated with the frame. This method can only be
-  // called from the render process.
+  /// Get the V8 context associated with the frame. This method can only be
+  /// called from the render process.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefV8Context> GetV8Context() = 0;
 
   ///
-  // Visit the DOM document. This method can only be called from the render
-  // process.
+  /// Visit the DOM document. This method can only be called from the render
+  /// process.
   ///
   /*--cef()--*/
   virtual void VisitDOM(CefRefPtr<CefDOMVisitor> visitor) = 0;
 
   ///
-  // Create a new URL request that will be treated as originating from this
-  // frame and the associated browser. This request may be intercepted by the
-  // client via CefResourceRequestHandler or CefSchemeHandlerFactory. Use
-  // CefURLRequest::Create instead if you do not want the request to have this
-  // association, in which case it may be handled differently (see documentation
-  // on that method). Requests may originate from both the browser process and
-  // the render process.
-  //
-  // For requests originating from the browser process:
-  //   - POST data may only contain a single element of type PDE_TYPE_FILE or
-  //     PDE_TYPE_BYTES.
-  // For requests originating from the render process:
-  //   - POST data may only contain a single element of type PDE_TYPE_BYTES.
-  //   - If the response contains Content-Disposition or Mime-Type header values
-  //     that would not normally be rendered then the response may receive
-  //     special handling inside the browser (for example, via the file download
-  //     code path instead of the URL request code path).
-  //
-  // The |request| object will be marked as read-only after calling this method.
+  /// Create a new URL request that will be treated as originating from this
+  /// frame and the associated browser. Use CefURLRequest::Create instead if you
+  /// do not want the request to have this association, in which case it may be
+  /// handled differently (see documentation on that method). A request created
+  /// with this method may only originate from the browser process, and will
+  /// behave as follows:
+  ///   - It may be intercepted by the client via CefResourceRequestHandler or
+  ///     CefSchemeHandlerFactory.
+  ///   - POST data may only contain a single element of type PDE_TYPE_FILE or
+  ///     PDE_TYPE_BYTES.
+  ///
+  /// The |request| object will be marked as read-only after calling this
+  /// method.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefURLRequest> CreateURLRequest(
@@ -246,10 +240,12 @@
       CefRefPtr<CefURLRequestClient> client) = 0;
 
   ///
-  // Send a message to the specified |target_process|. Message delivery is not
-  // guaranteed in all cases (for example, if the browser is closing,
-  // navigating, or if the target process crashes). Send an ACK message back
-  // from the target process if confirmation is required.
+  /// Send a message to the specified |target_process|. Ownership of the message
+  /// contents will be transferred and the |message| reference will be
+  /// invalidated. Message delivery is not guaranteed in all cases (for example,
+  /// if the browser is closing, navigating, or if the target process crashes).
+  /// Send an ACK message back from the target process if confirmation is
+  /// required.
   ///
   /*--cef()--*/
   virtual void SendProcessMessage(CefProcessId target_process,
diff --git a/src/include/cef_frame_handler.h b/src/include/cef_frame_handler.h
new file mode 100644
index 0000000..b742623
--- /dev/null
+++ b/src/include/cef_frame_handler.h
@@ -0,0 +1,177 @@
+// Copyright (c) 2021 Marshall A. Greenblatt. 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.
+//
+// ---------------------------------------------------------------------------
+//
+// The contents of this file must follow a specific format in order to
+// support the CEF translator tool. See the translator.README.txt file in the
+// tools directory for more information.
+//
+
+#ifndef CEF_INCLUDE_CEF_FRAME_HANDLER_H_
+#define CEF_INCLUDE_CEF_FRAME_HANDLER_H_
+#pragma once
+
+#include "include/cef_base.h"
+#include "include/cef_browser.h"
+#include "include/cef_frame.h"
+
+///
+/// Implement this interface to handle events related to CefFrame life span. The
+/// order of callbacks is:
+///
+/// (1) During initial CefBrowserHost creation and navigation of the main frame:
+/// - CefFrameHandler::OnFrameCreated => The initial main frame object has been
+///   created. Any commands will be queued until the frame is attached.
+/// - CefFrameHandler::OnMainFrameChanged => The initial main frame object has
+///   been assigned to the browser.
+/// - CefLifeSpanHandler::OnAfterCreated => The browser is now valid and can be
+///   used.
+/// - CefFrameHandler::OnFrameAttached => The initial main frame object is now
+///   connected to its peer in the renderer process. Commands can be routed.
+///
+/// (2) During further CefBrowserHost navigation/loading of the main frame
+///     and/or sub-frames:
+/// - CefFrameHandler::OnFrameCreated => A new main frame or sub-frame object
+///   has been created. Any commands will be queued until the frame is attached.
+/// - CefFrameHandler::OnFrameAttached => A new main frame or sub-frame object
+///   is now connected to its peer in the renderer process. Commands can be
+///   routed.
+/// - CefFrameHandler::OnFrameDetached => An existing main frame or sub-frame
+///   object has lost its connection to the renderer process. If multiple
+///   objects are detached at the same time then notifications will be sent for
+///   any sub-frame objects before the main frame object. Commands can no longer
+///   be routed and will be discarded.
+/// - CefFrameHandler::OnMainFrameChanged => A new main frame object has been
+///   assigned to the browser. This will only occur with cross-origin navigation
+///   or re-navigation after renderer process termination (due to crashes, etc).
+///
+/// (3) During final CefBrowserHost destruction of the main frame:
+/// - CefFrameHandler::OnFrameDetached => Any sub-frame objects have lost their
+///   connection to the renderer process. Commands can no longer be routed and
+///   will be discarded.
+/// - CefLifeSpanHandler::OnBeforeClose => The browser has been destroyed.
+/// - CefFrameHandler::OnFrameDetached => The main frame object have lost its
+///   connection to the renderer process. Notifications will be sent for any
+///   sub-frame objects before the main frame object. Commands can no longer be
+///   routed and will be discarded.
+/// - CefFrameHandler::OnMainFrameChanged => The final main frame object has
+///   been removed from the browser.
+///
+/// Cross-origin navigation and/or loading receives special handling.
+///
+/// When the main frame navigates to a different origin the OnMainFrameChanged
+/// callback (2) will be executed with the old and new main frame objects.
+///
+/// When a new sub-frame is loaded in, or an existing sub-frame is navigated to,
+/// a different origin from the parent frame, a temporary sub-frame object will
+/// first be created in the parent's renderer process. That temporary sub-frame
+/// will then be discarded after the real cross-origin sub-frame is created in
+/// the new/target renderer process. The client will receive cross-origin
+/// navigation callbacks (2) for the transition from the temporary sub-frame to
+/// the real sub-frame. The temporary sub-frame will not recieve or execute
+/// commands during this transitional period (any sent commands will be
+/// discarded).
+///
+/// When a new popup browser is created in a different origin from the parent
+/// browser, a temporary main frame object for the popup will first be created
+/// in the parent's renderer process. That temporary main frame will then be
+/// discarded after the real cross-origin main frame is created in the
+/// new/target renderer process. The client will recieve creation and initial
+/// navigation callbacks (1) for the temporary main frame, followed by
+/// cross-origin navigation callbacks (2) for the transition from the temporary
+/// main frame to the real main frame. The temporary main frame may receive and
+/// execute commands during this transitional period (any sent commands may be
+/// executed, but the behavior is potentially undesirable since they execute in
+/// the parent browser's renderer process and not the new/target renderer
+/// process).
+///
+/// Callbacks will not be executed for placeholders that may be created during
+/// pre-commit navigation for sub-frames that do not yet exist in the renderer
+/// process. Placeholders will have CefFrame::GetIdentifier() == -4.
+///
+/// The methods of this class will be called on the UI thread unless otherwise
+/// indicated.
+///
+/*--cef(source=client)--*/
+class CefFrameHandler : public virtual CefBaseRefCounted {
+ public:
+  ///
+  /// Called when a new frame is created. This will be the first notification
+  /// that references |frame|. Any commands that require transport to the
+  /// associated renderer process (LoadRequest, SendProcessMessage, GetSource,
+  /// etc.) will be queued until OnFrameAttached is called for |frame|.
+  ///
+  /*--cef()--*/
+  virtual void OnFrameCreated(CefRefPtr<CefBrowser> browser,
+                              CefRefPtr<CefFrame> frame) {}
+
+  ///
+  /// Called when a frame can begin routing commands to/from the associated
+  /// renderer process. |reattached| will be true if the frame was re-attached
+  /// after exiting the BackForwardCache. Any commands that were queued have now
+  /// been dispatched.
+  ///
+  /*--cef()--*/
+  virtual void OnFrameAttached(CefRefPtr<CefBrowser> browser,
+                               CefRefPtr<CefFrame> frame,
+                               bool reattached) {}
+
+  ///
+  /// Called when a frame loses its connection to the renderer process and will
+  /// be destroyed. Any pending or future commands will be discarded and
+  /// CefFrame::IsValid() will now return false for |frame|. If called after
+  /// CefLifeSpanHandler::OnBeforeClose() during browser destruction then
+  /// CefBrowser::IsValid() will return false for |browser|.
+  ///
+  /*--cef()--*/
+  virtual void OnFrameDetached(CefRefPtr<CefBrowser> browser,
+                               CefRefPtr<CefFrame> frame) {}
+
+  ///
+  /// Called when the main frame changes due to (a) initial browser creation,
+  /// (b) final browser destruction, (c) cross-origin navigation or (d)
+  /// re-navigation after renderer process termination (due to crashes, etc).
+  /// |old_frame| will be NULL and |new_frame| will be non-NULL when a main
+  /// frame is assigned to |browser| for the first time. |old_frame| will be
+  /// non-NULL and |new_frame| will be NULL and  when a main frame is removed
+  /// from |browser| for the last time. Both |old_frame| and |new_frame| will be
+  /// non-NULL for cross-origin navigations or re-navigation after renderer
+  /// process termination. This method will be called after OnFrameCreated() for
+  /// |new_frame| and/or after OnFrameDetached() for |old_frame|. If called
+  /// after CefLifeSpanHandler::OnBeforeClose() during browser destruction then
+  /// CefBrowser::IsValid() will return false for |browser|.
+  ///
+  /*--cef(optional_param=old_frame,optional_param=new_frame)--*/
+  virtual void OnMainFrameChanged(CefRefPtr<CefBrowser> browser,
+                                  CefRefPtr<CefFrame> old_frame,
+                                  CefRefPtr<CefFrame> new_frame) {}
+};
+
+#endif  // CEF_INCLUDE_CEF_FRAME_HANDLER_H_
diff --git a/src/include/cef_request_callback.h b/src/include/cef_i18n_util.h
similarity index 73%
rename from src/include/cef_request_callback.h
rename to src/include/cef_i18n_util.h
index 68094de..5f9e116 100644
--- a/src/include/cef_request_callback.h
+++ b/src/include/cef_i18n_util.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2021 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -34,30 +34,16 @@
 // tools directory for more information.
 //
 
-#ifndef CEF_INCLUDE_CEF_REQUEST_CALLBACK_H_
-#define CEF_INCLUDE_CEF_REQUEST_CALLBACK_H_
+#ifndef CEF_INCLUDE_CEF_I18N_UTIL_H_
+#define CEF_INCLUDE_CEF_I18N_UTIL_H_
 #pragma once
 
 #include "include/cef_base.h"
 
 ///
-// Callback interface used for asynchronous continuation of url requests.
+/// Returns true if the application text direction is right-to-left.
 ///
-/*--cef(source=library)--*/
-class CefRequestCallback : public virtual CefBaseRefCounted {
- public:
-  ///
-  // Continue the url request. If |allow| is true the request will be continued.
-  // Otherwise, the request will be canceled.
-  ///
-  /*--cef(capi_name=cont)--*/
-  virtual void Continue(bool allow) = 0;
+/*--cef()--*/
+bool CefIsRTL();
 
-  ///
-  // Cancel the url request.
-  ///
-  /*--cef()--*/
-  virtual void Cancel() = 0;
-};
-
-#endif  // CEF_INCLUDE_CEF_REQUEST_CALLBACK_H_
+#endif  // CEF_INCLUDE_CEF_I18N_UTIL_H_
diff --git a/src/include/cef_image.h b/src/include/cef_image.h
index 6346812..cbea565 100644
--- a/src/include/cef_image.h
+++ b/src/include/cef_image.h
@@ -42,42 +42,42 @@
 #include "include/cef_values.h"
 
 ///
-// Container for a single image represented at different scale factors. All
-// image representations should be the same size in density independent pixel
-// (DIP) units. For example, if the image at scale factor 1.0 is 100x100 pixels
-// then the image at scale factor 2.0 should be 200x200 pixels -- both images
-// will display with a DIP size of 100x100 units. The methods of this class can
-// be called on any browser process thread.
+/// Container for a single image represented at different scale factors. All
+/// image representations should be the same size in density independent pixel
+/// (DIP) units. For example, if the image at scale factor 1.0 is 100x100 pixels
+/// then the image at scale factor 2.0 should be 200x200 pixels -- both images
+/// will display with a DIP size of 100x100 units. The methods of this class can
+/// be called on any browser process thread.
 ///
 /*--cef(source=library)--*/
 class CefImage : public virtual CefBaseRefCounted {
  public:
   ///
-  // Create a new CefImage. It will initially be empty. Use the Add*() methods
-  // to add representations at different scale factors.
+  /// Create a new CefImage. It will initially be empty. Use the Add*() methods
+  /// to add representations at different scale factors.
   ///
   /*--cef()--*/
   static CefRefPtr<CefImage> CreateImage();
 
   ///
-  // Returns true if this Image is empty.
+  /// Returns true if this Image is empty.
   ///
   /*--cef()--*/
   virtual bool IsEmpty() = 0;
 
   ///
-  // Returns true if this Image and |that| Image share the same underlying
-  // storage. Will also return true if both images are empty.
+  /// Returns true if this Image and |that| Image share the same underlying
+  /// storage. Will also return true if both images are empty.
   ///
   /*--cef()--*/
   virtual bool IsSame(CefRefPtr<CefImage> that) = 0;
 
   ///
-  // Add a bitmap image representation for |scale_factor|. Only 32-bit RGBA/BGRA
-  // formats are supported. |pixel_width| and |pixel_height| are the bitmap
-  // representation size in pixel coordinates. |pixel_data| is the array of
-  // pixel data and should be |pixel_width| x |pixel_height| x 4 bytes in size.
-  // |color_type| and |alpha_type| values specify the pixel format.
+  /// Add a bitmap image representation for |scale_factor|. Only 32-bit
+  /// RGBA/BGRA formats are supported. |pixel_width| and |pixel_height| are the
+  /// bitmap representation size in pixel coordinates. |pixel_data| is the array
+  /// of pixel data and should be |pixel_width| x |pixel_height| x 4 bytes in
+  /// size. |color_type| and |alpha_type| values specify the pixel format.
   ///
   /*--cef()--*/
   virtual bool AddBitmap(float scale_factor,
@@ -89,9 +89,9 @@
                          size_t pixel_data_size) = 0;
 
   ///
-  // Add a PNG image representation for |scale_factor|. |png_data| is the image
-  // data of size |png_data_size|. Any alpha transparency in the PNG data will
-  // be maintained.
+  /// Add a PNG image representation for |scale_factor|. |png_data| is the image
+  /// data of size |png_data_size|. Any alpha transparency in the PNG data will
+  /// be maintained.
   ///
   /*--cef()--*/
   virtual bool AddPNG(float scale_factor,
@@ -99,9 +99,9 @@
                       size_t png_data_size) = 0;
 
   ///
-  // Create a JPEG image representation for |scale_factor|. |jpeg_data| is the
-  // image data of size |jpeg_data_size|. The JPEG format does not support
-  // transparency so the alpha byte will be set to 0xFF for all pixels.
+  /// Create a JPEG image representation for |scale_factor|. |jpeg_data| is the
+  /// image data of size |jpeg_data_size|. The JPEG format does not support
+  /// transparency so the alpha byte will be set to 0xFF for all pixels.
   ///
   /*--cef()--*/
   virtual bool AddJPEG(float scale_factor,
@@ -109,34 +109,34 @@
                        size_t jpeg_data_size) = 0;
 
   ///
-  // Returns the image width in density independent pixel (DIP) units.
+  /// Returns the image width in density independent pixel (DIP) units.
   ///
   /*--cef()--*/
   virtual size_t GetWidth() = 0;
 
   ///
-  // Returns the image height in density independent pixel (DIP) units.
+  /// Returns the image height in density independent pixel (DIP) units.
   ///
   /*--cef()--*/
   virtual size_t GetHeight() = 0;
 
   ///
-  // Returns true if this image contains a representation for |scale_factor|.
+  /// Returns true if this image contains a representation for |scale_factor|.
   ///
   /*--cef()--*/
   virtual bool HasRepresentation(float scale_factor) = 0;
 
   ///
-  // Removes the representation for |scale_factor|. Returns true on success.
+  /// Removes the representation for |scale_factor|. Returns true on success.
   ///
   /*--cef()--*/
   virtual bool RemoveRepresentation(float scale_factor) = 0;
 
   ///
-  // Returns information for the representation that most closely matches
-  // |scale_factor|. |actual_scale_factor| is the actual scale factor for the
-  // representation. |pixel_width| and |pixel_height| are the representation
-  // size in pixel coordinates. Returns true on success.
+  /// Returns information for the representation that most closely matches
+  /// |scale_factor|. |actual_scale_factor| is the actual scale factor for the
+  /// representation. |pixel_width| and |pixel_height| are the representation
+  /// size in pixel coordinates. Returns true on success.
   ///
   /*--cef()--*/
   virtual bool GetRepresentationInfo(float scale_factor,
@@ -145,12 +145,12 @@
                                      int& pixel_height) = 0;
 
   ///
-  // Returns the bitmap representation that most closely matches |scale_factor|.
-  // Only 32-bit RGBA/BGRA formats are supported. |color_type| and |alpha_type|
-  // values specify the desired output pixel format. |pixel_width| and
-  // |pixel_height| are the output representation size in pixel coordinates.
-  // Returns a CefBinaryValue containing the pixel data on success or NULL on
-  // failure.
+  /// Returns the bitmap representation that most closely matches
+  /// |scale_factor|. Only 32-bit RGBA/BGRA formats are supported. |color_type|
+  /// and |alpha_type| values specify the desired output pixel format.
+  /// |pixel_width| and |pixel_height| are the output representation size in
+  /// pixel coordinates. Returns a CefBinaryValue containing the pixel data on
+  /// success or NULL on failure.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefBinaryValue> GetAsBitmap(float scale_factor,
@@ -160,11 +160,12 @@
                                                 int& pixel_height) = 0;
 
   ///
-  // Returns the PNG representation that most closely matches |scale_factor|. If
-  // |with_transparency| is true any alpha transparency in the image will be
-  // represented in the resulting PNG data. |pixel_width| and |pixel_height| are
-  // the output representation size in pixel coordinates. Returns a
-  // CefBinaryValue containing the PNG image data on success or NULL on failure.
+  /// Returns the PNG representation that most closely matches |scale_factor|.
+  /// If |with_transparency| is true any alpha transparency in the image will be
+  /// represented in the resulting PNG data. |pixel_width| and |pixel_height|
+  /// are the output representation size in pixel coordinates. Returns a
+  /// CefBinaryValue containing the PNG image data on success or NULL on
+  /// failure.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefBinaryValue> GetAsPNG(float scale_factor,
@@ -173,13 +174,13 @@
                                              int& pixel_height) = 0;
 
   ///
-  // Returns the JPEG representation that most closely matches |scale_factor|.
-  // |quality| determines the compression level with 0 == lowest and 100 ==
-  // highest. The JPEG format does not support alpha transparency and the alpha
-  // channel, if any, will be discarded. |pixel_width| and |pixel_height| are
-  // the output representation size in pixel coordinates. Returns a
-  // CefBinaryValue containing the JPEG image data on success or NULL on
-  // failure.
+  /// Returns the JPEG representation that most closely matches |scale_factor|.
+  /// |quality| determines the compression level with 0 == lowest and 100 ==
+  /// highest. The JPEG format does not support alpha transparency and the alpha
+  /// channel, if any, will be discarded. |pixel_width| and |pixel_height| are
+  /// the output representation size in pixel coordinates. Returns a
+  /// CefBinaryValue containing the JPEG image data on success or NULL on
+  /// failure.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefBinaryValue> GetAsJPEG(float scale_factor,
diff --git a/src/include/cef_jsdialog_handler.h b/src/include/cef_jsdialog_handler.h
index b7e0945..9ad6527 100644
--- a/src/include/cef_jsdialog_handler.h
+++ b/src/include/cef_jsdialog_handler.h
@@ -42,23 +42,23 @@
 #include "include/cef_browser.h"
 
 ///
-// Callback interface used for asynchronous continuation of JavaScript dialog
-// requests.
+/// Callback interface used for asynchronous continuation of JavaScript dialog
+/// requests.
 ///
 /*--cef(source=library)--*/
 class CefJSDialogCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Continue the JS dialog request. Set |success| to true if the OK button was
-  // pressed. The |user_input| value should be specified for prompt dialogs.
+  /// Continue the JS dialog request. Set |success| to true if the OK button was
+  /// pressed. The |user_input| value should be specified for prompt dialogs.
   ///
   /*--cef(capi_name=cont,optional_param=user_input)--*/
   virtual void Continue(bool success, const CefString& user_input) = 0;
 };
 
 ///
-// Implement this interface to handle events related to JavaScript dialogs. The
-// methods of this class will be called on the UI thread.
+/// Implement this interface to handle events related to JavaScript dialogs. The
+/// methods of this class will be called on the UI thread.
 ///
 /*--cef(source=client)--*/
 class CefJSDialogHandler : public virtual CefBaseRefCounted {
@@ -66,20 +66,20 @@
   typedef cef_jsdialog_type_t JSDialogType;
 
   ///
-  // Called to run a JavaScript dialog. If |origin_url| is non-empty it can be
-  // passed to the CefFormatUrlForSecurityDisplay function to retrieve a secure
-  // and user-friendly display string. The |default_prompt_text| value will be
-  // specified for prompt dialogs only. Set |suppress_message| to true and
-  // return false to suppress the message (suppressing messages is preferable to
-  // immediately executing the callback as this is used to detect presumably
-  // malicious behavior like spamming alert messages in onbeforeunload). Set
-  // |suppress_message| to false and return false to use the default
-  // implementation (the default implementation will show one modal dialog at a
-  // time and suppress any additional dialog requests until the displayed dialog
-  // is dismissed). Return true if the application will use a custom dialog or
-  // if the callback has been executed immediately. Custom dialogs may be either
-  // modal or modeless. If a custom dialog is used the application must execute
-  // |callback| once the custom dialog is dismissed.
+  /// Called to run a JavaScript dialog. If |origin_url| is non-empty it can be
+  /// passed to the CefFormatUrlForSecurityDisplay function to retrieve a secure
+  /// and user-friendly display string. The |default_prompt_text| value will be
+  /// specified for prompt dialogs only. Set |suppress_message| to true and
+  /// return false to suppress the message (suppressing messages is preferable
+  /// to immediately executing the callback as this is used to detect presumably
+  /// malicious behavior like spamming alert messages in onbeforeunload). Set
+  /// |suppress_message| to false and return false to use the default
+  /// implementation (the default implementation will show one modal dialog at a
+  /// time and suppress any additional dialog requests until the displayed
+  /// dialog is dismissed). Return true if the application will use a custom
+  /// dialog or if the callback has been executed immediately. Custom dialogs
+  /// may be either modal or modeless. If a custom dialog is used the
+  /// application must execute |callback| once the custom dialog is dismissed.
   ///
   /*--cef(optional_param=origin_url,optional_param=accept_lang,
           optional_param=message_text,optional_param=default_prompt_text)--*/
@@ -94,12 +94,12 @@
   }
 
   ///
-  // Called to run a dialog asking the user if they want to leave a page. Return
-  // false to use the default dialog implementation. Return true if the
-  // application will use a custom dialog or if the callback has been executed
-  // immediately. Custom dialogs may be either modal or modeless. If a custom
-  // dialog is used the application must execute |callback| once the custom
-  // dialog is dismissed.
+  /// Called to run a dialog asking the user if they want to leave a page.
+  /// Return false to use the default dialog implementation. Return true if the
+  /// application will use a custom dialog or if the callback has been executed
+  /// immediately. Custom dialogs may be either modal or modeless. If a custom
+  /// dialog is used the application must execute |callback| once the custom
+  /// dialog is dismissed.
   ///
   /*--cef(optional_param=message_text)--*/
   virtual bool OnBeforeUnloadDialog(CefRefPtr<CefBrowser> browser,
@@ -110,15 +110,15 @@
   }
 
   ///
-  // Called to cancel any pending dialogs and reset any saved dialog state. Will
-  // be called due to events like page navigation irregardless of whether any
-  // dialogs are currently pending.
+  /// Called to cancel any pending dialogs and reset any saved dialog state.
+  /// Will be called due to events like page navigation irregardless of whether
+  /// any dialogs are currently pending.
   ///
   /*--cef()--*/
   virtual void OnResetDialogState(CefRefPtr<CefBrowser> browser) {}
 
   ///
-  // Called when the default implementation dialog is closed.
+  /// Called when the dialog is closed.
   ///
   /*--cef()--*/
   virtual void OnDialogClosed(CefRefPtr<CefBrowser> browser) {}
diff --git a/src/include/cef_keyboard_handler.h b/src/include/cef_keyboard_handler.h
index 386491e..69838f9 100644
--- a/src/include/cef_keyboard_handler.h
+++ b/src/include/cef_keyboard_handler.h
@@ -42,18 +42,18 @@
 #include "include/cef_browser.h"
 
 ///
-// Implement this interface to handle events related to keyboard input. The
-// methods of this class will be called on the UI thread.
+/// Implement this interface to handle events related to keyboard input. The
+/// methods of this class will be called on the UI thread.
 ///
 /*--cef(source=client)--*/
 class CefKeyboardHandler : public virtual CefBaseRefCounted {
  public:
   ///
-  // Called before a keyboard event is sent to the renderer. |event| contains
-  // information about the keyboard event. |os_event| is the operating system
-  // event message, if any. Return true if the event was handled or false
-  // otherwise. If the event will be handled in OnKeyEvent() as a keyboard
-  // shortcut set |is_keyboard_shortcut| to true and return false.
+  /// Called before a keyboard event is sent to the renderer. |event| contains
+  /// information about the keyboard event. |os_event| is the operating system
+  /// event message, if any. Return true if the event was handled or false
+  /// otherwise. If the event will be handled in OnKeyEvent() as a keyboard
+  /// shortcut set |is_keyboard_shortcut| to true and return false.
   ///
   /*--cef()--*/
   virtual bool OnPreKeyEvent(CefRefPtr<CefBrowser> browser,
@@ -64,10 +64,10 @@
   }
 
   ///
-  // Called after the renderer and JavaScript in the page has had a chance to
-  // handle the event. |event| contains information about the keyboard event.
-  // |os_event| is the operating system event message, if any. Return true if
-  // the keyboard event was handled or false otherwise.
+  /// Called after the renderer and JavaScript in the page has had a chance to
+  /// handle the event. |event| contains information about the keyboard event.
+  /// |os_event| is the operating system event message, if any. Return true if
+  /// the keyboard event was handled or false otherwise.
   ///
   /*--cef()--*/
   virtual bool OnKeyEvent(CefRefPtr<CefBrowser> browser,
diff --git a/src/include/cef_life_span_handler.h b/src/include/cef_life_span_handler.h
index c08cfcf..067a3f9 100644
--- a/src/include/cef_life_span_handler.h
+++ b/src/include/cef_life_span_handler.h
@@ -44,9 +44,9 @@
 class CefClient;
 
 ///
-// Implement this interface to handle events related to browser life span. The
-// methods of this class will be called on the UI thread unless otherwise
-// indicated.
+/// Implement this interface to handle events related to browser life span. The
+/// methods of this class will be called on the UI thread unless otherwise
+/// indicated.
 ///
 /*--cef(source=client)--*/
 class CefLifeSpanHandler : public virtual CefBaseRefCounted {
@@ -54,29 +54,29 @@
   typedef cef_window_open_disposition_t WindowOpenDisposition;
 
   ///
-  // Called on the UI thread before a new popup browser is created. The
-  // |browser| and |frame| values represent the source of the popup request. The
-  // |target_url| and |target_frame_name| values indicate where the popup
-  // browser should navigate and may be empty if not specified with the request.
-  // The |target_disposition| value indicates where the user intended to open
-  // the popup (e.g. current tab, new tab, etc). The |user_gesture| value will
-  // be true if the popup was opened via explicit user gesture (e.g. clicking a
-  // link) or false if the popup opened automatically (e.g. via the
-  // DomContentLoaded event). The |popupFeatures| structure contains additional
-  // information about the requested popup window. To allow creation of the
-  // popup browser optionally modify |windowInfo|, |client|, |settings| and
-  // |no_javascript_access| and return false. To cancel creation of the popup
-  // browser return true. The |client| and |settings| values will default to the
-  // source browser's values. If the |no_javascript_access| value is set to
-  // false the new browser will not be scriptable and may not be hosted in the
-  // same renderer process as the source browser. Any modifications to
-  // |windowInfo| will be ignored if the parent browser is wrapped in a
-  // CefBrowserView. Popup browser creation will be canceled if the parent
-  // browser is destroyed before the popup browser creation completes (indicated
-  // by a call to OnAfterCreated for the popup browser). The |extra_info|
-  // parameter provides an opportunity to specify extra information specific
-  // to the created popup browser that will be passed to
-  // CefRenderProcessHandler::OnBrowserCreated() in the render process.
+  /// Called on the UI thread before a new popup browser is created. The
+  /// |browser| and |frame| values represent the source of the popup request.
+  /// The |target_url| and |target_frame_name| values indicate where the popup
+  /// browser should navigate and may be empty if not specified with the
+  /// request. The |target_disposition| value indicates where the user intended
+  /// to open the popup (e.g. current tab, new tab, etc). The |user_gesture|
+  /// value will be true if the popup was opened via explicit user gesture (e.g.
+  /// clicking a link) or false if the popup opened automatically (e.g. via the
+  /// DomContentLoaded event). The |popupFeatures| structure contains additional
+  /// information about the requested popup window. To allow creation of the
+  /// popup browser optionally modify |windowInfo|, |client|, |settings| and
+  /// |no_javascript_access| and return false. To cancel creation of the popup
+  /// browser return true. The |client| and |settings| values will default to
+  /// the source browser's values. If the |no_javascript_access| value is set to
+  /// false the new browser will not be scriptable and may not be hosted in the
+  /// same renderer process as the source browser. Any modifications to
+  /// |windowInfo| will be ignored if the parent browser is wrapped in a
+  /// CefBrowserView. Popup browser creation will be canceled if the parent
+  /// browser is destroyed before the popup browser creation completes
+  /// (indicated by a call to OnAfterCreated for the popup browser). The
+  /// |extra_info| parameter provides an opportunity to specify extra
+  /// information specific to the created popup browser that will be passed to
+  /// CefRenderProcessHandler::OnBrowserCreated() in the render process.
   ///
   /*--cef(optional_param=target_url,optional_param=target_frame_name)--*/
   virtual bool OnBeforePopup(CefRefPtr<CefBrowser> browser,
@@ -95,113 +95,144 @@
   }
 
   ///
-  // Called after a new browser is created. This callback will be the first
-  // notification that references |browser|.
+  /// Called on the UI thread before a new DevTools popup browser is created.
+  /// The |browser| value represents the source of the popup request. Optionally
+  /// modify |windowInfo|, |client|, |settings| and |extra_info| values. The
+  /// |client|, |settings| and |extra_info| values will default to the source
+  /// browser's values. Any modifications to |windowInfo| will be ignored if the
+  /// parent browser is Views-hosted (wrapped in a CefBrowserView).
+  ///
+  /// The |extra_info| parameter provides an opportunity to specify extra
+  /// information specific to the created popup browser that will be passed to
+  /// CefRenderProcessHandler::OnBrowserCreated() in the render process. The
+  /// existing |extra_info| object, if any, will be read-only but may be
+  /// replaced with a new object.
+  ///
+  /// Views-hosted source browsers will create Views-hosted DevTools popups
+  /// unless |use_default_window| is set to to true. DevTools popups can be
+  /// blocked by returning true from CefCommandHandler::OnChromeCommand for
+  /// IDC_DEV_TOOLS. Only used with the Chrome runtime.
+  ///
+  /*--cef()--*/
+  virtual void OnBeforeDevToolsPopup(CefRefPtr<CefBrowser> browser,
+                                     CefWindowInfo& windowInfo,
+                                     CefRefPtr<CefClient>& client,
+                                     CefBrowserSettings& settings,
+                                     CefRefPtr<CefDictionaryValue>& extra_info,
+                                     bool* use_default_window) {}
+
+  ///
+  /// Called after a new browser is created. It is now safe to begin performing
+  /// actions with |browser|. CefFrameHandler callbacks related to initial main
+  /// frame creation will arrive before this callback. See CefFrameHandler
+  /// documentation for additional usage information.
   ///
   /*--cef()--*/
   virtual void OnAfterCreated(CefRefPtr<CefBrowser> browser) {}
 
   ///
-  // Called when a browser has recieved a request to close. This may result
-  // directly from a call to CefBrowserHost::*CloseBrowser() or indirectly if
-  // the browser is parented to a top-level window created by CEF and the user
-  // attempts to close that window (by clicking the 'X', for example). The
-  // DoClose() method will be called after the JavaScript 'onunload' event has
-  // been fired.
-  //
-  // An application should handle top-level owner window close notifications by
-  // calling CefBrowserHost::TryCloseBrowser() or
-  // CefBrowserHost::CloseBrowser(false) instead of allowing the window to close
-  // immediately (see the examples below). This gives CEF an opportunity to
-  // process the 'onbeforeunload' event and optionally cancel the close before
-  // DoClose() is called.
-  //
-  // When windowed rendering is enabled CEF will internally create a window or
-  // view to host the browser. In that case returning false from DoClose() will
-  // send the standard close notification to the browser's top-level owner
-  // window (e.g. WM_CLOSE on Windows, performClose: on OS X, "delete_event" on
-  // Linux or CefWindowDelegate::CanClose() callback from Views). If the
-  // browser's host window/view has already been destroyed (via view hierarchy
-  // tear-down, for example) then DoClose() will not be called for that browser
-  // since is no longer possible to cancel the close.
-  //
-  // When windowed rendering is disabled returning false from DoClose() will
-  // cause the browser object to be destroyed immediately.
-  //
-  // If the browser's top-level owner window requires a non-standard close
-  // notification then send that notification from DoClose() and return true.
-  //
-  // The CefLifeSpanHandler::OnBeforeClose() method will be called after
-  // DoClose() (if DoClose() is called) and immediately before the browser
-  // object is destroyed. The application should only exit after OnBeforeClose()
-  // has been called for all existing browsers.
-  //
-  // The below examples describe what should happen during window close when the
-  // browser is parented to an application-provided top-level window.
-  //
-  // Example 1: Using CefBrowserHost::TryCloseBrowser(). This is recommended for
-  // clients using standard close handling and windows created on the browser
-  // process UI thread.
-  // 1.  User clicks the window close button which sends a close notification to
-  //     the application's top-level window.
-  // 2.  Application's top-level window receives the close notification and
-  //     calls TryCloseBrowser() (which internally calls CloseBrowser(false)).
-  //     TryCloseBrowser() returns false so the client cancels the window close.
-  // 3.  JavaScript 'onbeforeunload' handler executes and shows the close
-  //     confirmation dialog (which can be overridden via
-  //     CefJSDialogHandler::OnBeforeUnloadDialog()).
-  // 4.  User approves the close.
-  // 5.  JavaScript 'onunload' handler executes.
-  // 6.  CEF sends a close notification to the application's top-level window
-  //     (because DoClose() returned false by default).
-  // 7.  Application's top-level window receives the close notification and
-  //     calls TryCloseBrowser(). TryCloseBrowser() returns true so the client
-  //     allows the window close.
-  // 8.  Application's top-level window is destroyed.
-  // 9.  Application's OnBeforeClose() handler is called and the browser object
-  //     is destroyed.
-  // 10. Application exits by calling CefQuitMessageLoop() if no other browsers
-  //     exist.
-  //
-  // Example 2: Using CefBrowserHost::CloseBrowser(false) and implementing the
-  // DoClose() callback. This is recommended for clients using non-standard
-  // close handling or windows that were not created on the browser process UI
-  // thread.
-  // 1.  User clicks the window close button which sends a close notification to
-  //     the application's top-level window.
-  // 2.  Application's top-level window receives the close notification and:
-  //     A. Calls CefBrowserHost::CloseBrowser(false).
-  //     B. Cancels the window close.
-  // 3.  JavaScript 'onbeforeunload' handler executes and shows the close
-  //     confirmation dialog (which can be overridden via
-  //     CefJSDialogHandler::OnBeforeUnloadDialog()).
-  // 4.  User approves the close.
-  // 5.  JavaScript 'onunload' handler executes.
-  // 6.  Application's DoClose() handler is called. Application will:
-  //     A. Set a flag to indicate that the next close attempt will be allowed.
-  //     B. Return false.
-  // 7.  CEF sends an close notification to the application's top-level window.
-  // 8.  Application's top-level window receives the close notification and
-  //     allows the window to close based on the flag from #6B.
-  // 9.  Application's top-level window is destroyed.
-  // 10. Application's OnBeforeClose() handler is called and the browser object
-  //     is destroyed.
-  // 11. Application exits by calling CefQuitMessageLoop() if no other browsers
-  //     exist.
+  /// Called when a browser has recieved a request to close. This may result
+  /// directly from a call to CefBrowserHost::*CloseBrowser() or indirectly if
+  /// the browser is parented to a top-level window created by CEF and the user
+  /// attempts to close that window (by clicking the 'X', for example). The
+  /// DoClose() method will be called after the JavaScript 'onunload' event has
+  /// been fired.
+  ///
+  /// An application should handle top-level owner window close notifications by
+  /// calling CefBrowserHost::TryCloseBrowser() or
+  /// CefBrowserHost::CloseBrowser(false) instead of allowing the window to
+  /// close immediately (see the examples below). This gives CEF an opportunity
+  /// to process the 'onbeforeunload' event and optionally cancel the close
+  /// before DoClose() is called.
+  ///
+  /// When windowed rendering is enabled CEF will internally create a window or
+  /// view to host the browser. In that case returning false from DoClose() will
+  /// send the standard close notification to the browser's top-level owner
+  /// window (e.g. WM_CLOSE on Windows, performClose: on OS X, "delete_event" on
+  /// Linux or CefWindowDelegate::CanClose() callback from Views). If the
+  /// browser's host window/view has already been destroyed (via view hierarchy
+  /// tear-down, for example) then DoClose() will not be called for that browser
+  /// since is no longer possible to cancel the close.
+  ///
+  /// When windowed rendering is disabled returning false from DoClose() will
+  /// cause the browser object to be destroyed immediately.
+  ///
+  /// If the browser's top-level owner window requires a non-standard close
+  /// notification then send that notification from DoClose() and return true.
+  ///
+  /// The CefLifeSpanHandler::OnBeforeClose() method will be called after
+  /// DoClose() (if DoClose() is called) and immediately before the browser
+  /// object is destroyed. The application should only exit after
+  /// OnBeforeClose() has been called for all existing browsers.
+  ///
+  /// The below examples describe what should happen during window close when
+  /// the browser is parented to an application-provided top-level window.
+  ///
+  /// Example 1: Using CefBrowserHost::TryCloseBrowser(). This is recommended
+  /// for clients using standard close handling and windows created on the
+  /// browser process UI thread.
+  /// 1.  User clicks the window close button which sends a close notification
+  ///     to the application's top-level window.
+  /// 2.  Application's top-level window receives the close notification and
+  ///     calls TryCloseBrowser() (which internally calls CloseBrowser(false)).
+  ///     TryCloseBrowser() returns false so the client cancels the window
+  ///     close.
+  /// 3.  JavaScript 'onbeforeunload' handler executes and shows the close
+  ///     confirmation dialog (which can be overridden via
+  ///     CefJSDialogHandler::OnBeforeUnloadDialog()).
+  /// 4.  User approves the close.
+  /// 5.  JavaScript 'onunload' handler executes.
+  /// 6.  CEF sends a close notification to the application's top-level window
+  ///     (because DoClose() returned false by default).
+  /// 7.  Application's top-level window receives the close notification and
+  ///     calls TryCloseBrowser(). TryCloseBrowser() returns true so the client
+  ///     allows the window close.
+  /// 8.  Application's top-level window is destroyed.
+  /// 9.  Application's OnBeforeClose() handler is called and the browser object
+  ///     is destroyed.
+  /// 10. Application exits by calling CefQuitMessageLoop() if no other browsers
+  ///     exist.
+  ///
+  /// Example 2: Using CefBrowserHost::CloseBrowser(false) and implementing the
+  /// DoClose() callback. This is recommended for clients using non-standard
+  /// close handling or windows that were not created on the browser process UI
+  /// thread.
+  /// 1.  User clicks the window close button which sends a close notification
+  ///     to the application's top-level window.
+  /// 2.  Application's top-level window receives the close notification and:
+  ///     A. Calls CefBrowserHost::CloseBrowser(false).
+  ///     B. Cancels the window close.
+  /// 3.  JavaScript 'onbeforeunload' handler executes and shows the close
+  ///     confirmation dialog (which can be overridden via
+  ///     CefJSDialogHandler::OnBeforeUnloadDialog()).
+  /// 4.  User approves the close.
+  /// 5.  JavaScript 'onunload' handler executes.
+  /// 6.  Application's DoClose() handler is called. Application will:
+  ///     A. Set a flag to indicate that the next close attempt will be allowed.
+  ///     B. Return false.
+  /// 7.  CEF sends an close notification to the application's top-level window.
+  /// 8.  Application's top-level window receives the close notification and
+  ///     allows the window to close based on the flag from #6B.
+  /// 9.  Application's top-level window is destroyed.
+  /// 10. Application's OnBeforeClose() handler is called and the browser object
+  ///     is destroyed.
+  /// 11. Application exits by calling CefQuitMessageLoop() if no other browsers
+  ///     exist.
   ///
   /*--cef()--*/
   virtual bool DoClose(CefRefPtr<CefBrowser> browser) { return false; }
 
   ///
-  // Called just before a browser is destroyed. Release all references to the
-  // browser object and do not attempt to execute any methods on the browser
-  // object (other than GetIdentifier or IsSame) after this callback returns.
-  // This callback will be the last notification that references |browser| on
-  // the UI thread. Any in-progress network requests associated with |browser|
-  // will be aborted when the browser is destroyed, and
-  // CefResourceRequestHandler callbacks related to those requests may still
-  // arrive on the IO thread after this method is called. See DoClose()
-  // documentation for additional usage information.
+  /// Called just before a browser is destroyed. Release all references to the
+  /// browser object and do not attempt to execute any methods on the browser
+  /// object (other than IsValid, GetIdentifier or IsSame) after this callback
+  /// returns. CefFrameHandler callbacks related to final main frame destruction
+  /// will arrive after this callback and CefBrowser::IsValid will return false
+  /// at that time. Any in-progress network requests associated with |browser|
+  /// will be aborted when the browser is destroyed, and
+  /// CefResourceRequestHandler callbacks related to those requests may still
+  /// arrive on the IO thread after this callback. See CefFrameHandler and
+  /// DoClose() documentation for additional usage information.
   ///
   /*--cef()--*/
   virtual void OnBeforeClose(CefRefPtr<CefBrowser> browser) {}
diff --git a/src/include/cef_load_handler.h b/src/include/cef_load_handler.h
index 66b5567..a7381d8 100644
--- a/src/include/cef_load_handler.h
+++ b/src/include/cef_load_handler.h
@@ -43,9 +43,9 @@
 #include "include/cef_frame.h"
 
 ///
-// Implement this interface to handle events related to browser load status. The
-// methods of this class will be called on the browser process UI thread or
-// render process main thread (TID_RENDERER).
+/// Implement this interface to handle events related to browser load status.
+/// The methods of this class will be called on the browser process UI thread or
+/// render process main thread (TID_RENDERER).
 ///
 /*--cef(source=client)--*/
 class CefLoadHandler : public virtual CefBaseRefCounted {
@@ -54,11 +54,11 @@
   typedef cef_transition_type_t TransitionType;
 
   ///
-  // Called when the loading state has changed. This callback will be executed
-  // twice -- once when loading is initiated either programmatically or by user
-  // action, and once when loading is terminated due to completion, cancellation
-  // of failure. It will be called before any calls to OnLoadStart and after all
-  // calls to OnLoadError and/or OnLoadEnd.
+  /// Called when the loading state has changed. This callback will be executed
+  /// twice -- once when loading is initiated either programmatically or by user
+  /// action, and once when loading is terminated due to completion,
+  /// cancellation of failure. It will be called before any calls to OnLoadStart
+  /// and after all calls to OnLoadError and/or OnLoadEnd.
   ///
   /*--cef()--*/
   virtual void OnLoadingStateChange(CefRefPtr<CefBrowser> browser,
@@ -67,16 +67,16 @@
                                     bool canGoForward) {}
 
   ///
-  // Called after a navigation has been committed and before the browser begins
-  // loading contents in the frame. The |frame| value will never be empty --
-  // call the IsMain() method to check if this frame is the main frame.
-  // |transition_type| provides information about the source of the navigation
-  // and an accurate value is only available in the browser process. Multiple
-  // frames may be loading at the same time. Sub-frames may start or continue
-  // loading after the main frame load has ended. This method will not be called
-  // for same page navigations (fragments, history state, etc.) or for
-  // navigations that fail or are canceled before commit. For notification of
-  // overall browser load status use OnLoadingStateChange instead.
+  /// Called after a navigation has been committed and before the browser begins
+  /// loading contents in the frame. The |frame| value will never be empty --
+  /// call the IsMain() method to check if this frame is the main frame.
+  /// |transition_type| provides information about the source of the navigation
+  /// and an accurate value is only available in the browser process. Multiple
+  /// frames may be loading at the same time. Sub-frames may start or continue
+  /// loading after the main frame load has ended. This method will not be
+  /// called for same page navigations (fragments, history state, etc.) or for
+  /// navigations that fail or are canceled before commit. For notification of
+  /// overall browser load status use OnLoadingStateChange instead.
   ///
   /*--cef()--*/
   virtual void OnLoadStart(CefRefPtr<CefBrowser> browser,
@@ -84,14 +84,14 @@
                            TransitionType transition_type) {}
 
   ///
-  // Called when the browser is done loading a frame. The |frame| value will
-  // never be empty -- call the IsMain() method to check if this frame is the
-  // main frame. Multiple frames may be loading at the same time. Sub-frames may
-  // start or continue loading after the main frame load has ended. This method
-  // will not be called for same page navigations (fragments, history state,
-  // etc.) or for navigations that fail or are canceled before commit. For
-  // notification of overall browser load status use OnLoadingStateChange
-  // instead.
+  /// Called when the browser is done loading a frame. The |frame| value will
+  /// never be empty -- call the IsMain() method to check if this frame is the
+  /// main frame. Multiple frames may be loading at the same time. Sub-frames
+  /// may start or continue loading after the main frame load has ended. This
+  /// method will not be called for same page navigations (fragments, history
+  /// state, etc.) or for navigations that fail or are canceled before commit.
+  /// For notification of overall browser load status use OnLoadingStateChange
+  /// instead.
   ///
   /*--cef()--*/
   virtual void OnLoadEnd(CefRefPtr<CefBrowser> browser,
@@ -99,11 +99,12 @@
                          int httpStatusCode) {}
 
   ///
-  // Called when a navigation fails or is canceled. This method may be called
-  // by itself if before commit or in combination with OnLoadStart/OnLoadEnd if
-  // after commit. |errorCode| is the error code number, |errorText| is the
-  // error text and |failedUrl| is the URL that failed to load.
-  // See net\base\net_error_list.h for complete descriptions of the error codes.
+  /// Called when a navigation fails or is canceled. This method may be called
+  /// by itself if before commit or in combination with OnLoadStart/OnLoadEnd if
+  /// after commit. |errorCode| is the error code number, |errorText| is the
+  /// error text and |failedUrl| is the URL that failed to load.
+  /// See net\base\net_error_list.h for complete descriptions of the error
+  /// codes.
   ///
   /*--cef(optional_param=errorText)--*/
   virtual void OnLoadError(CefRefPtr<CefBrowser> browser,
diff --git a/src/include/cef_media_router.h b/src/include/cef_media_router.h
index 2c7cb59..eb9ea3f 100644
--- a/src/include/cef_media_router.h
+++ b/src/include/cef_media_router.h
@@ -40,6 +40,7 @@
 
 #include <vector>
 #include "include/cef_base.h"
+#include "include/cef_callback.h"
 #include "include/cef_registration.h"
 
 class CefMediaObserver;
@@ -50,51 +51,53 @@
 class CefMediaSource;
 
 ///
-// Supports discovery of and communication with media devices on the local
-// network via the Cast and DIAL protocols. The methods of this class may be
-// called on any browser process thread unless otherwise indicated.
+/// Supports discovery of and communication with media devices on the local
+/// network via the Cast and DIAL protocols. The methods of this class may be
+/// called on any browser process thread unless otherwise indicated.
 ///
 /*--cef(source=library)--*/
 class CefMediaRouter : public virtual CefBaseRefCounted {
  public:
   ///
-  // Returns the MediaRouter object associated with the global request context.
-  // Equivalent to calling
-  // CefRequestContext::GetGlobalContext()->GetMediaRouter().
+  /// Returns the MediaRouter object associated with the global request context.
+  /// If |callback| is non-NULL it will be executed asnychronously on the UI
+  /// thread after the manager's storage has been initialized. Equivalent to
+  /// calling CefRequestContext::GetGlobalContext()->GetMediaRouter().
   ///
-  /*--cef()--*/
-  static CefRefPtr<CefMediaRouter> GetGlobalMediaRouter();
+  /*--cef(optional_param=callback)--*/
+  static CefRefPtr<CefMediaRouter> GetGlobalMediaRouter(
+      CefRefPtr<CefCompletionCallback> callback);
 
   ///
-  // Add an observer for MediaRouter events. The observer will remain registered
-  // until the returned Registration object is destroyed.
+  /// Add an observer for MediaRouter events. The observer will remain
+  /// registered until the returned Registration object is destroyed.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefRegistration> AddObserver(
       CefRefPtr<CefMediaObserver> observer) = 0;
 
   ///
-  // Returns a MediaSource object for the specified media source URN. Supported
-  // URN schemes include "cast:" and "dial:", and will be already known by the
-  // client application (e.g. "cast:<appId>?clientId=<clientId>").
+  /// Returns a MediaSource object for the specified media source URN. Supported
+  /// URN schemes include "cast:" and "dial:", and will be already known by the
+  /// client application (e.g. "cast:<appId>?clientId=<clientId>").
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefMediaSource> GetSource(const CefString& urn) = 0;
 
   ///
-  // Trigger an asynchronous call to CefMediaObserver::OnSinks on all
-  // registered observers.
+  /// Trigger an asynchronous call to CefMediaObserver::OnSinks on all
+  /// registered observers.
   ///
   /*--cef()--*/
   virtual void NotifyCurrentSinks() = 0;
 
   ///
-  // Create a new route between |source| and |sink|. Source and sink must be
-  // valid, compatible (as reported by CefMediaSink::IsCompatibleWith), and a
-  // route between them must not already exist. |callback| will be executed
-  // on success or failure. If route creation succeeds it will also trigger an
-  // asynchronous call to CefMediaObserver::OnRoutes on all registered
-  // observers.
+  /// Create a new route between |source| and |sink|. Source and sink must be
+  /// valid, compatible (as reported by CefMediaSink::IsCompatibleWith), and a
+  /// route between them must not already exist. |callback| will be executed
+  /// on success or failure. If route creation succeeds it will also trigger an
+  /// asynchronous call to CefMediaObserver::OnRoutes on all registered
+  /// observers.
   ///
   /*--cef()--*/
   virtual void CreateRoute(CefRefPtr<CefMediaSource> source,
@@ -102,17 +105,17 @@
                            CefRefPtr<CefMediaRouteCreateCallback> callback) = 0;
 
   ///
-  // Trigger an asynchronous call to CefMediaObserver::OnRoutes on all
-  // registered observers.
+  /// Trigger an asynchronous call to CefMediaObserver::OnRoutes on all
+  /// registered observers.
   ///
   /*--cef()--*/
   virtual void NotifyCurrentRoutes() = 0;
 };
 
 ///
-// Implemented by the client to observe MediaRouter events and registered via
-// CefMediaRouter::AddObserver. The methods of this class will be called on the
-// browser process UI thread.
+/// Implemented by the client to observe MediaRouter events and registered via
+/// CefMediaRouter::AddObserver. The methods of this class will be called on the
+/// browser process UI thread.
 ///
 /*--cef(source=client)--*/
 class CefMediaObserver : public virtual CefBaseRefCounted {
@@ -120,30 +123,30 @@
   typedef cef_media_route_connection_state_t ConnectionState;
 
   ///
-  // The list of available media sinks has changed or
-  // CefMediaRouter::NotifyCurrentSinks was called.
+  /// The list of available media sinks has changed or
+  /// CefMediaRouter::NotifyCurrentSinks was called.
   ///
   /*--cef()--*/
   virtual void OnSinks(const std::vector<CefRefPtr<CefMediaSink>>& sinks) = 0;
 
   ///
-  // The list of available media routes has changed or
-  // CefMediaRouter::NotifyCurrentRoutes was called.
+  /// The list of available media routes has changed or
+  /// CefMediaRouter::NotifyCurrentRoutes was called.
   ///
   /*--cef()--*/
   virtual void OnRoutes(
       const std::vector<CefRefPtr<CefMediaRoute>>& routes) = 0;
 
   ///
-  // The connection state of |route| has changed.
+  /// The connection state of |route| has changed.
   ///
   /*--cef()--*/
   virtual void OnRouteStateChanged(CefRefPtr<CefMediaRoute> route,
                                    ConnectionState state) = 0;
 
   ///
-  // A message was recieved over |route|. |message| is only valid for
-  // the scope of this callback and should be copied if necessary.
+  /// A message was recieved over |route|. |message| is only valid for
+  /// the scope of this callback and should be copied if necessary.
   ///
   /*--cef()--*/
   virtual void OnRouteMessageReceived(CefRefPtr<CefMediaRoute> route,
@@ -152,50 +155,50 @@
 };
 
 ///
-// Represents the route between a media source and sink. Instances of this
-// object are created via CefMediaRouter::CreateRoute and retrieved via
-// CefMediaObserver::OnRoutes. Contains the status and metadata of a
-// routing operation. The methods of this class may be called on any browser
-// process thread unless otherwise indicated.
+/// Represents the route between a media source and sink. Instances of this
+/// object are created via CefMediaRouter::CreateRoute and retrieved via
+/// CefMediaObserver::OnRoutes. Contains the status and metadata of a
+/// routing operation. The methods of this class may be called on any browser
+/// process thread unless otherwise indicated.
 ///
 /*--cef(source=library)--*/
 class CefMediaRoute : public virtual CefBaseRefCounted {
  public:
   ///
-  // Returns the ID for this route.
+  /// Returns the ID for this route.
   ///
   /*--cef()--*/
   virtual CefString GetId() = 0;
 
   ///
-  // Returns the source associated with this route.
+  /// Returns the source associated with this route.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefMediaSource> GetSource() = 0;
 
   ///
-  // Returns the sink associated with this route.
+  /// Returns the sink associated with this route.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefMediaSink> GetSink() = 0;
 
   ///
-  // Send a message over this route. |message| will be copied if necessary.
+  /// Send a message over this route. |message| will be copied if necessary.
   ///
   /*--cef()--*/
   virtual void SendRouteMessage(const void* message, size_t message_size) = 0;
 
   ///
-  // Terminate this route. Will result in an asynchronous call to
-  // CefMediaObserver::OnRoutes on all registered observers.
+  /// Terminate this route. Will result in an asynchronous call to
+  /// CefMediaObserver::OnRoutes on all registered observers.
   ///
   /*--cef()--*/
   virtual void Terminate() = 0;
 };
 
 ///
-// Callback interface for CefMediaRouter::CreateRoute. The methods of this
-// class will be called on the browser process UI thread.
+/// Callback interface for CefMediaRouter::CreateRoute. The methods of this
+/// class will be called on the browser process UI thread.
 ///
 /*--cef(source=client)--*/
 class CefMediaRouteCreateCallback : public virtual CefBaseRefCounted {
@@ -203,10 +206,10 @@
   typedef cef_media_route_create_result_t RouteCreateResult;
 
   ///
-  // Method that will be executed when the route creation has finished. |result|
-  // will be CEF_MRCR_OK if the route creation succeeded. |error| will be a
-  // description of the error if the route creation failed. |route| is the
-  // resulting route, or empty if the route creation failed.
+  /// Method that will be executed when the route creation has finished.
+  /// |result| will be CEF_MRCR_OK if the route creation succeeded. |error| will
+  /// be a description of the error if the route creation failed. |route| is the
+  /// resulting route, or empty if the route creation failed.
   ///
   /*--cef(optional_param=error,optional_param=route)--*/
   virtual void OnMediaRouteCreateFinished(RouteCreateResult result,
@@ -215,9 +218,9 @@
 };
 
 ///
-// Represents a sink to which media can be routed. Instances of this object are
-// retrieved via CefMediaObserver::OnSinks. The methods of this class may
-// be called on any browser process thread unless otherwise indicated.
+/// Represents a sink to which media can be routed. Instances of this object are
+/// retrieved via CefMediaObserver::OnSinks. The methods of this class may
+/// be called on any browser process thread unless otherwise indicated.
 ///
 /*--cef(source=library)--*/
 class CefMediaSink : public virtual CefBaseRefCounted {
@@ -225,71 +228,59 @@
   typedef cef_media_sink_icon_type_t IconType;
 
   ///
-  // Returns the ID for this sink.
+  /// Returns the ID for this sink.
   ///
   /*--cef()--*/
   virtual CefString GetId() = 0;
 
   ///
-  // Returns true if this sink is valid.
-  ///
-  /*--cef()--*/
-  virtual bool IsValid() = 0;
-
-  ///
-  // Returns the name of this sink.
+  /// Returns the name of this sink.
   ///
   /*--cef()--*/
   virtual CefString GetName() = 0;
 
   ///
-  // Returns the description of this sink.
-  ///
-  /*--cef()--*/
-  virtual CefString GetDescription() = 0;
-
-  ///
-  // Returns the icon type for this sink.
+  /// Returns the icon type for this sink.
   ///
   /*--cef(default_retval=CEF_MSIT_GENERIC)--*/
   virtual IconType GetIconType() = 0;
 
   ///
-  // Asynchronously retrieves device info.
+  /// Asynchronously retrieves device info.
   ///
   /*--cef()--*/
   virtual void GetDeviceInfo(
       CefRefPtr<CefMediaSinkDeviceInfoCallback> callback) = 0;
 
   ///
-  // Returns true if this sink accepts content via Cast.
+  /// Returns true if this sink accepts content via Cast.
   ///
   /*--cef()--*/
   virtual bool IsCastSink() = 0;
 
   ///
-  // Returns true if this sink accepts content via DIAL.
+  /// Returns true if this sink accepts content via DIAL.
   ///
   /*--cef()--*/
   virtual bool IsDialSink() = 0;
 
   ///
-  // Returns true if this sink is compatible with |source|.
+  /// Returns true if this sink is compatible with |source|.
   ///
   /*--cef()--*/
   virtual bool IsCompatibleWith(CefRefPtr<CefMediaSource> source) = 0;
 };
 
 ///
-// Callback interface for CefMediaSink::GetDeviceInfo. The methods of this
-// class will be called on the browser process UI thread.
+/// Callback interface for CefMediaSink::GetDeviceInfo. The methods of this
+/// class will be called on the browser process UI thread.
 ///
 /*--cef(source=client)--*/
 class CefMediaSinkDeviceInfoCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Method that will be executed asyncronously once device information has been
-  // retrieved.
+  /// Method that will be executed asyncronously once device information has
+  /// been retrieved.
   ///
   /*--cef()--*/
   virtual void OnMediaSinkDeviceInfo(
@@ -297,33 +288,27 @@
 };
 
 ///
-// Represents a source from which media can be routed. Instances of this object
-// are retrieved via CefMediaRouter::GetSource. The methods of this class may be
-// called on any browser process thread unless otherwise indicated.
+/// Represents a source from which media can be routed. Instances of this object
+/// are retrieved via CefMediaRouter::GetSource. The methods of this class may
+/// be called on any browser process thread unless otherwise indicated.
 ///
 /*--cef(source=library)--*/
 class CefMediaSource : public virtual CefBaseRefCounted {
  public:
   ///
-  // Returns the ID (media source URN or URL) for this source.
+  /// Returns the ID (media source URN or URL) for this source.
   ///
   /*--cef()--*/
   virtual CefString GetId() = 0;
 
   ///
-  // Returns true if this source is valid.
-  ///
-  /*--cef()--*/
-  virtual bool IsValid() = 0;
-
-  ///
-  // Returns true if this source outputs its content via Cast.
+  /// Returns true if this source outputs its content via Cast.
   ///
   /*--cef()--*/
   virtual bool IsCastSource() = 0;
 
   ///
-  // Returns true if this source outputs its content via DIAL.
+  /// Returns true if this source outputs its content via DIAL.
   ///
   /*--cef()--*/
   virtual bool IsDialSource() = 0;
diff --git a/src/include/cef_menu_model.h b/src/include/cef_menu_model.h
index 1c9a7c0..4ddc54a 100644
--- a/src/include/cef_menu_model.h
+++ b/src/include/cef_menu_model.h
@@ -42,10 +42,10 @@
 #include "include/cef_menu_model_delegate.h"
 
 ///
-// Supports creation and modification of menus. See cef_menu_id_t for the
-// command ids that have default implementations. All user-defined command ids
-// should be between MENU_ID_USER_FIRST and MENU_ID_USER_LAST. The methods of
-// this class can only be accessed on the browser process the UI thread.
+/// Supports creation and modification of menus. See cef_menu_id_t for the
+/// command ids that have default implementations. All user-defined command ids
+/// should be between MENU_ID_USER_FIRST and MENU_ID_USER_LAST. The methods of
+/// this class can only be accessed on the browser process the UI thread.
 ///
 /*--cef(source=library)--*/
 class CefMenuModel : public virtual CefBaseRefCounted {
@@ -53,50 +53,50 @@
   typedef cef_menu_item_type_t MenuItemType;
 
   ///
-  // Create a new MenuModel with the specified |delegate|.
+  /// Create a new MenuModel with the specified |delegate|.
   ///
   /*--cef()--*/
   static CefRefPtr<CefMenuModel> CreateMenuModel(
       CefRefPtr<CefMenuModelDelegate> delegate);
 
   ///
-  // Returns true if this menu is a submenu.
+  /// Returns true if this menu is a submenu.
   ///
   /*--cef()--*/
   virtual bool IsSubMenu() = 0;
 
   ///
-  // Clears the menu. Returns true on success.
+  /// Clears the menu. Returns true on success.
   ///
   /*--cef()--*/
   virtual bool Clear() = 0;
 
   ///
-  // Returns the number of items in this menu.
+  /// Returns the number of items in this menu.
   ///
   /*--cef()--*/
-  virtual int GetCount() = 0;
+  virtual size_t GetCount() = 0;
 
   ///
-  // Add a separator to the menu. Returns true on success.
+  /// Add a separator to the menu. Returns true on success.
   ///
   /*--cef()--*/
   virtual bool AddSeparator() = 0;
 
   ///
-  // Add an item to the menu. Returns true on success.
+  /// Add an item to the menu. Returns true on success.
   ///
   /*--cef()--*/
   virtual bool AddItem(int command_id, const CefString& label) = 0;
 
   ///
-  // Add a check item to the menu. Returns true on success.
+  /// Add a check item to the menu. Returns true on success.
   ///
   /*--cef()--*/
   virtual bool AddCheckItem(int command_id, const CefString& label) = 0;
   ///
-  // Add a radio item to the menu. Only a single item with the specified
-  // |group_id| can be checked at a time. Returns true on success.
+  /// Add a radio item to the menu. Only a single item with the specified
+  /// |group_id| can be checked at a time. Returns true on success.
   ///
   /*--cef()--*/
   virtual bool AddRadioItem(int command_id,
@@ -104,257 +104,257 @@
                             int group_id) = 0;
 
   ///
-  // Add a sub-menu to the menu. The new sub-menu is returned.
+  /// Add a sub-menu to the menu. The new sub-menu is returned.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefMenuModel> AddSubMenu(int command_id,
                                              const CefString& label) = 0;
 
   ///
-  // Insert a separator in the menu at the specified |index|. Returns true on
-  // success.
+  /// Insert a separator in the menu at the specified |index|. Returns true on
+  /// success.
   ///
   /*--cef()--*/
-  virtual bool InsertSeparatorAt(int index) = 0;
+  virtual bool InsertSeparatorAt(size_t index) = 0;
 
   ///
-  // Insert an item in the menu at the specified |index|. Returns true on
-  // success.
+  /// Insert an item in the menu at the specified |index|. Returns true on
+  /// success.
   ///
   /*--cef()--*/
-  virtual bool InsertItemAt(int index,
+  virtual bool InsertItemAt(size_t index,
                             int command_id,
                             const CefString& label) = 0;
 
   ///
-  // Insert a check item in the menu at the specified |index|. Returns true on
-  // success.
+  /// Insert a check item in the menu at the specified |index|. Returns true on
+  /// success.
   ///
   /*--cef()--*/
-  virtual bool InsertCheckItemAt(int index,
+  virtual bool InsertCheckItemAt(size_t index,
                                  int command_id,
                                  const CefString& label) = 0;
 
   ///
-  // Insert a radio item in the menu at the specified |index|. Only a single
-  // item with the specified |group_id| can be checked at a time. Returns true
-  // on success.
+  /// Insert a radio item in the menu at the specified |index|. Only a single
+  /// item with the specified |group_id| can be checked at a time. Returns true
+  /// on success.
   ///
   /*--cef()--*/
-  virtual bool InsertRadioItemAt(int index,
+  virtual bool InsertRadioItemAt(size_t index,
                                  int command_id,
                                  const CefString& label,
                                  int group_id) = 0;
 
   ///
-  // Insert a sub-menu in the menu at the specified |index|. The new sub-menu
-  // is returned.
+  /// Insert a sub-menu in the menu at the specified |index|. The new sub-menu
+  /// is returned.
   ///
   /*--cef()--*/
-  virtual CefRefPtr<CefMenuModel> InsertSubMenuAt(int index,
+  virtual CefRefPtr<CefMenuModel> InsertSubMenuAt(size_t index,
                                                   int command_id,
                                                   const CefString& label) = 0;
 
   ///
-  // Removes the item with the specified |command_id|. Returns true on success.
+  /// Removes the item with the specified |command_id|. Returns true on success.
   ///
   /*--cef()--*/
   virtual bool Remove(int command_id) = 0;
 
   ///
-  // Removes the item at the specified |index|. Returns true on success.
+  /// Removes the item at the specified |index|. Returns true on success.
   ///
   /*--cef()--*/
-  virtual bool RemoveAt(int index) = 0;
+  virtual bool RemoveAt(size_t index) = 0;
 
   ///
-  // Returns the index associated with the specified |command_id| or -1 if not
-  // found due to the command id not existing in the menu.
+  /// Returns the index associated with the specified |command_id| or -1 if not
+  /// found due to the command id not existing in the menu.
   ///
   /*--cef()--*/
   virtual int GetIndexOf(int command_id) = 0;
 
   ///
-  // Returns the command id at the specified |index| or -1 if not found due to
-  // invalid range or the index being a separator.
+  /// Returns the command id at the specified |index| or -1 if not found due to
+  /// invalid range or the index being a separator.
   ///
   /*--cef()--*/
-  virtual int GetCommandIdAt(int index) = 0;
+  virtual int GetCommandIdAt(size_t index) = 0;
 
   ///
-  // Sets the command id at the specified |index|. Returns true on success.
+  /// Sets the command id at the specified |index|. Returns true on success.
   ///
   /*--cef()--*/
-  virtual bool SetCommandIdAt(int index, int command_id) = 0;
+  virtual bool SetCommandIdAt(size_t index, int command_id) = 0;
 
   ///
-  // Returns the label for the specified |command_id| or empty if not found.
+  /// Returns the label for the specified |command_id| or empty if not found.
   ///
   /*--cef()--*/
   virtual CefString GetLabel(int command_id) = 0;
 
   ///
-  // Returns the label at the specified |index| or empty if not found due to
-  // invalid range or the index being a separator.
+  /// Returns the label at the specified |index| or empty if not found due to
+  /// invalid range or the index being a separator.
   ///
   /*--cef()--*/
-  virtual CefString GetLabelAt(int index) = 0;
+  virtual CefString GetLabelAt(size_t index) = 0;
 
   ///
-  // Sets the label for the specified |command_id|. Returns true on success.
+  /// Sets the label for the specified |command_id|. Returns true on success.
   ///
   /*--cef()--*/
   virtual bool SetLabel(int command_id, const CefString& label) = 0;
 
   ///
-  // Set the label at the specified |index|. Returns true on success.
+  /// Set the label at the specified |index|. Returns true on success.
   ///
   /*--cef()--*/
-  virtual bool SetLabelAt(int index, const CefString& label) = 0;
+  virtual bool SetLabelAt(size_t index, const CefString& label) = 0;
 
   ///
-  // Returns the item type for the specified |command_id|.
+  /// Returns the item type for the specified |command_id|.
   ///
   /*--cef(default_retval=MENUITEMTYPE_NONE)--*/
   virtual MenuItemType GetType(int command_id) = 0;
 
   ///
-  // Returns the item type at the specified |index|.
+  /// Returns the item type at the specified |index|.
   ///
   /*--cef(default_retval=MENUITEMTYPE_NONE)--*/
-  virtual MenuItemType GetTypeAt(int index) = 0;
+  virtual MenuItemType GetTypeAt(size_t index) = 0;
 
   ///
-  // Returns the group id for the specified |command_id| or -1 if invalid.
+  /// Returns the group id for the specified |command_id| or -1 if invalid.
   ///
   /*--cef()--*/
   virtual int GetGroupId(int command_id) = 0;
 
   ///
-  // Returns the group id at the specified |index| or -1 if invalid.
+  /// Returns the group id at the specified |index| or -1 if invalid.
   ///
   /*--cef()--*/
-  virtual int GetGroupIdAt(int index) = 0;
+  virtual int GetGroupIdAt(size_t index) = 0;
 
   ///
-  // Sets the group id for the specified |command_id|. Returns true on success.
+  /// Sets the group id for the specified |command_id|. Returns true on success.
   ///
   /*--cef()--*/
   virtual bool SetGroupId(int command_id, int group_id) = 0;
 
   ///
-  // Sets the group id at the specified |index|. Returns true on success.
+  /// Sets the group id at the specified |index|. Returns true on success.
   ///
   /*--cef()--*/
-  virtual bool SetGroupIdAt(int index, int group_id) = 0;
+  virtual bool SetGroupIdAt(size_t index, int group_id) = 0;
 
   ///
-  // Returns the submenu for the specified |command_id| or empty if invalid.
+  /// Returns the submenu for the specified |command_id| or empty if invalid.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefMenuModel> GetSubMenu(int command_id) = 0;
 
   ///
-  // Returns the submenu at the specified |index| or empty if invalid.
+  /// Returns the submenu at the specified |index| or empty if invalid.
   ///
   /*--cef()--*/
-  virtual CefRefPtr<CefMenuModel> GetSubMenuAt(int index) = 0;
+  virtual CefRefPtr<CefMenuModel> GetSubMenuAt(size_t index) = 0;
 
   ///
-  // Returns true if the specified |command_id| is visible.
+  /// Returns true if the specified |command_id| is visible.
   ///
   /*--cef()--*/
   virtual bool IsVisible(int command_id) = 0;
 
   ///
-  // Returns true if the specified |index| is visible.
+  /// Returns true if the specified |index| is visible.
   ///
   /*--cef()--*/
-  virtual bool IsVisibleAt(int index) = 0;
+  virtual bool IsVisibleAt(size_t index) = 0;
 
   ///
-  // Change the visibility of the specified |command_id|. Returns true on
-  // success.
+  /// Change the visibility of the specified |command_id|. Returns true on
+  /// success.
   ///
   /*--cef()--*/
   virtual bool SetVisible(int command_id, bool visible) = 0;
 
   ///
-  // Change the visibility at the specified |index|. Returns true on success.
+  /// Change the visibility at the specified |index|. Returns true on success.
   ///
   /*--cef()--*/
-  virtual bool SetVisibleAt(int index, bool visible) = 0;
+  virtual bool SetVisibleAt(size_t index, bool visible) = 0;
 
   ///
-  // Returns true if the specified |command_id| is enabled.
+  /// Returns true if the specified |command_id| is enabled.
   ///
   /*--cef()--*/
   virtual bool IsEnabled(int command_id) = 0;
 
   ///
-  // Returns true if the specified |index| is enabled.
+  /// Returns true if the specified |index| is enabled.
   ///
   /*--cef()--*/
-  virtual bool IsEnabledAt(int index) = 0;
+  virtual bool IsEnabledAt(size_t index) = 0;
 
   ///
-  // Change the enabled status of the specified |command_id|. Returns true on
-  // success.
+  /// Change the enabled status of the specified |command_id|. Returns true on
+  /// success.
   ///
   /*--cef()--*/
   virtual bool SetEnabled(int command_id, bool enabled) = 0;
 
   ///
-  // Change the enabled status at the specified |index|. Returns true on
-  // success.
+  /// Change the enabled status at the specified |index|. Returns true on
+  /// success.
   ///
   /*--cef()--*/
-  virtual bool SetEnabledAt(int index, bool enabled) = 0;
+  virtual bool SetEnabledAt(size_t index, bool enabled) = 0;
 
   ///
-  // Returns true if the specified |command_id| is checked. Only applies to
-  // check and radio items.
+  /// Returns true if the specified |command_id| is checked. Only applies to
+  /// check and radio items.
   ///
   /*--cef()--*/
   virtual bool IsChecked(int command_id) = 0;
 
   ///
-  // Returns true if the specified |index| is checked. Only applies to check
-  // and radio items.
+  /// Returns true if the specified |index| is checked. Only applies to check
+  /// and radio items.
   ///
   /*--cef()--*/
-  virtual bool IsCheckedAt(int index) = 0;
+  virtual bool IsCheckedAt(size_t index) = 0;
 
   ///
-  // Check the specified |command_id|. Only applies to check and radio items.
-  // Returns true on success.
+  /// Check the specified |command_id|. Only applies to check and radio items.
+  /// Returns true on success.
   ///
   /*--cef()--*/
   virtual bool SetChecked(int command_id, bool checked) = 0;
 
   ///
-  // Check the specified |index|. Only applies to check and radio items. Returns
-  // true on success.
+  /// Check the specified |index|. Only applies to check and radio items.
+  /// Returns true on success.
   ///
   /*--cef()--*/
-  virtual bool SetCheckedAt(int index, bool checked) = 0;
+  virtual bool SetCheckedAt(size_t index, bool checked) = 0;
 
   ///
-  // Returns true if the specified |command_id| has a keyboard accelerator
-  // assigned.
+  /// Returns true if the specified |command_id| has a keyboard accelerator
+  /// assigned.
   ///
   /*--cef()--*/
   virtual bool HasAccelerator(int command_id) = 0;
 
   ///
-  // Returns true if the specified |index| has a keyboard accelerator assigned.
+  /// Returns true if the specified |index| has a keyboard accelerator assigned.
   ///
   /*--cef()--*/
-  virtual bool HasAcceleratorAt(int index) = 0;
+  virtual bool HasAcceleratorAt(size_t index) = 0;
 
   ///
-  // Set the keyboard accelerator for the specified |command_id|. |key_code| can
-  // be any virtual key or character value. Returns true on success.
+  /// Set the keyboard accelerator for the specified |command_id|. |key_code|
+  /// can be any virtual key or character value. Returns true on success.
   ///
   /*--cef()--*/
   virtual bool SetAccelerator(int command_id,
@@ -364,33 +364,33 @@
                               bool alt_pressed) = 0;
 
   ///
-  // Set the keyboard accelerator at the specified |index|. |key_code| can be
-  // any virtual key or character value. Returns true on success.
+  /// Set the keyboard accelerator at the specified |index|. |key_code| can be
+  /// any virtual key or character value. Returns true on success.
   ///
   /*--cef()--*/
-  virtual bool SetAcceleratorAt(int index,
+  virtual bool SetAcceleratorAt(size_t index,
                                 int key_code,
                                 bool shift_pressed,
                                 bool ctrl_pressed,
                                 bool alt_pressed) = 0;
 
   ///
-  // Remove the keyboard accelerator for the specified |command_id|. Returns
-  // true on success.
+  /// Remove the keyboard accelerator for the specified |command_id|. Returns
+  /// true on success.
   ///
   /*--cef()--*/
   virtual bool RemoveAccelerator(int command_id) = 0;
 
   ///
-  // Remove the keyboard accelerator at the specified |index|. Returns true on
-  // success.
+  /// Remove the keyboard accelerator at the specified |index|. Returns true on
+  /// success.
   ///
   /*--cef()--*/
-  virtual bool RemoveAcceleratorAt(int index) = 0;
+  virtual bool RemoveAcceleratorAt(size_t index) = 0;
 
   ///
-  // Retrieves the keyboard accelerator for the specified |command_id|. Returns
-  // true on success.
+  /// Retrieves the keyboard accelerator for the specified |command_id|. Returns
+  /// true on success.
   ///
   /*--cef()--*/
   virtual bool GetAccelerator(int command_id,
@@ -400,21 +400,21 @@
                               bool& alt_pressed) = 0;
 
   ///
-  // Retrieves the keyboard accelerator for the specified |index|. Returns true
-  // on success.
+  /// Retrieves the keyboard accelerator for the specified |index|. Returns true
+  /// on success.
   ///
   /*--cef()--*/
-  virtual bool GetAcceleratorAt(int index,
+  virtual bool GetAcceleratorAt(size_t index,
                                 int& key_code,
                                 bool& shift_pressed,
                                 bool& ctrl_pressed,
                                 bool& alt_pressed) = 0;
 
   ///
-  // Set the explicit color for |command_id| and |color_type| to |color|.
-  // Specify a |color| value of 0 to remove the explicit color. If no explicit
-  // color or default color is set for |color_type| then the system color will
-  // be used. Returns true on success.
+  /// Set the explicit color for |command_id| and |color_type| to |color|.
+  /// Specify a |color| value of 0 to remove the explicit color. If no explicit
+  /// color or default color is set for |color_type| then the system color will
+  /// be used. Returns true on success.
   ///
   /*--cef()--*/
   virtual bool SetColor(int command_id,
@@ -422,11 +422,11 @@
                         cef_color_t color) = 0;
 
   ///
-  // Set the explicit color for |command_id| and |index| to |color|. Specify a
-  // |color| value of 0 to remove the explicit color. Specify an |index| value
-  // of -1 to set the default color for items that do not have an explicit
-  // color set. If no explicit color or default color is set for |color_type|
-  // then the system color will be used. Returns true on success.
+  /// Set the explicit color for |command_id| and |index| to |color|. Specify a
+  /// |color| value of 0 to remove the explicit color. Specify an |index| value
+  /// of -1 to set the default color for items that do not have an explicit
+  /// color set. If no explicit color or default color is set for |color_type|
+  /// then the system color will be used. Returns true on success.
   ///
   /*--cef()--*/
   virtual bool SetColorAt(int index,
@@ -434,9 +434,9 @@
                           cef_color_t color) = 0;
 
   ///
-  // Returns in |color| the color that was explicitly set for |command_id| and
-  // |color_type|. If a color was not set then 0 will be returned in |color|.
-  // Returns true on success.
+  /// Returns in |color| the color that was explicitly set for |command_id| and
+  /// |color_type|. If a color was not set then 0 will be returned in |color|.
+  /// Returns true on success.
   ///
   /*--cef()--*/
   virtual bool GetColor(int command_id,
@@ -444,10 +444,10 @@
                         cef_color_t& color) = 0;
 
   ///
-  // Returns in |color| the color that was explicitly set for |command_id| and
-  // |color_type|. Specify an |index| value of -1 to return the default color
-  // in |color|. If a color was not set then 0 will be returned in |color|.
-  // Returns true on success.
+  /// Returns in |color| the color that was explicitly set for |command_id| and
+  /// |color_type|. Specify an |index| value of -1 to return the default color
+  /// in |color|. If a color was not set then 0 will be returned in |color|.
+  /// Returns true on success.
   ///
   /*--cef()--*/
   virtual bool GetColorAt(int index,
@@ -455,34 +455,34 @@
                           cef_color_t& color) = 0;
 
   ///
-  // Sets the font list for the specified |command_id|. If |font_list| is empty
-  // the system font will be used. Returns true on success. The format is
-  // "<FONT_FAMILY_LIST>,[STYLES] <SIZE>", where:
-  // - FONT_FAMILY_LIST is a comma-separated list of font family names,
-  // - STYLES is an optional space-separated list of style names (case-sensitive
-  //   "Bold" and "Italic" are supported), and
-  // - SIZE is an integer font size in pixels with the suffix "px".
-  //
-  // Here are examples of valid font description strings:
-  // - "Arial, Helvetica, Bold Italic 14px"
-  // - "Arial, 14px"
+  /// Sets the font list for the specified |command_id|. If |font_list| is empty
+  /// the system font will be used. Returns true on success. The format is
+  /// "<FONT_FAMILY_LIST>,[STYLES] <SIZE>", where:
+  /// - FONT_FAMILY_LIST is a comma-separated list of font family names,
+  /// - STYLES is an optional space-separated list of style names
+  ///   (case-sensitive "Bold" and "Italic" are supported), and
+  /// - SIZE is an integer font size in pixels with the suffix "px".
+  ///
+  /// Here are examples of valid font description strings:
+  /// - "Arial, Helvetica, Bold Italic 14px"
+  /// - "Arial, 14px"
   ///
   /*--cef(optional_param=font_list)--*/
   virtual bool SetFontList(int command_id, const CefString& font_list) = 0;
 
   ///
-  // Sets the font list for the specified |index|. Specify an |index| value of
-  // -1 to set the default font. If |font_list| is empty the system font will
-  // be used. Returns true on success. The format is
-  // "<FONT_FAMILY_LIST>,[STYLES] <SIZE>", where:
-  // - FONT_FAMILY_LIST is a comma-separated list of font family names,
-  // - STYLES is an optional space-separated list of style names (case-sensitive
-  //   "Bold" and "Italic" are supported), and
-  // - SIZE is an integer font size in pixels with the suffix "px".
-  //
-  // Here are examples of valid font description strings:
-  // - "Arial, Helvetica, Bold Italic 14px"
-  // - "Arial, 14px"
+  /// Sets the font list for the specified |index|. Specify an |index| value of
+  /// -1 to set the default font. If |font_list| is empty the system font will
+  /// be used. Returns true on success. The format is
+  /// "<FONT_FAMILY_LIST>,[STYLES] <SIZE>", where:
+  /// - FONT_FAMILY_LIST is a comma-separated list of font family names,
+  /// - STYLES is an optional space-separated list of style names
+  ///   (case-sensitive "Bold" and "Italic" are supported), and
+  /// - SIZE is an integer font size in pixels with the suffix "px".
+  ///
+  /// Here are examples of valid font description strings:
+  /// - "Arial, Helvetica, Bold Italic 14px"
+  /// - "Arial, 14px"
   ///
   /*--cef(optional_param=font_list)--*/
   virtual bool SetFontListAt(int index, const CefString& font_list) = 0;
diff --git a/src/include/cef_menu_model_delegate.h b/src/include/cef_menu_model_delegate.h
index e3ddfbd..c648230 100644
--- a/src/include/cef_menu_model_delegate.h
+++ b/src/include/cef_menu_model_delegate.h
@@ -43,16 +43,16 @@
 class CefMenuModel;
 
 ///
-// Implement this interface to handle menu model events. The methods of this
-// class will be called on the browser process UI thread unless otherwise
-// indicated.
+/// Implement this interface to handle menu model events. The methods of this
+/// class will be called on the browser process UI thread unless otherwise
+/// indicated.
 ///
 /*--cef(source=client)--*/
 class CefMenuModelDelegate : public virtual CefBaseRefCounted {
  public:
   ///
-  // Perform the action associated with the specified |command_id| and
-  // optional |event_flags|.
+  /// Perform the action associated with the specified |command_id| and
+  /// optional |event_flags|.
   ///
   /*--cef()--*/
   virtual void ExecuteCommand(CefRefPtr<CefMenuModel> menu_model,
@@ -60,43 +60,43 @@
                               cef_event_flags_t event_flags) = 0;
 
   ///
-  // Called when the user moves the mouse outside the menu and over the owning
-  // window.
+  /// Called when the user moves the mouse outside the menu and over the owning
+  /// window.
   ///
   /*--cef()--*/
   virtual void MouseOutsideMenu(CefRefPtr<CefMenuModel> menu_model,
                                 const CefPoint& screen_point) {}
 
   ///
-  // Called on unhandled open submenu keyboard commands. |is_rtl| will be true
-  // if the menu is displaying a right-to-left language.
+  /// Called on unhandled open submenu keyboard commands. |is_rtl| will be true
+  /// if the menu is displaying a right-to-left language.
   ///
   /*--cef()--*/
   virtual void UnhandledOpenSubmenu(CefRefPtr<CefMenuModel> menu_model,
                                     bool is_rtl) {}
 
   ///
-  // Called on unhandled close submenu keyboard commands. |is_rtl| will be true
-  // if the menu is displaying a right-to-left language.
+  /// Called on unhandled close submenu keyboard commands. |is_rtl| will be true
+  /// if the menu is displaying a right-to-left language.
   ///
   /*--cef()--*/
   virtual void UnhandledCloseSubmenu(CefRefPtr<CefMenuModel> menu_model,
                                      bool is_rtl) {}
 
   ///
-  // The menu is about to show.
+  /// The menu is about to show.
   ///
   /*--cef()--*/
   virtual void MenuWillShow(CefRefPtr<CefMenuModel> menu_model) {}
 
   ///
-  // The menu has closed.
+  /// The menu has closed.
   ///
   /*--cef()--*/
   virtual void MenuClosed(CefRefPtr<CefMenuModel> menu_model) {}
 
   ///
-  // Optionally modify a menu item label. Return true if |label| was modified.
+  /// Optionally modify a menu item label. Return true if |label| was modified.
   ///
   /*--cef()--*/
   virtual bool FormatLabel(CefRefPtr<CefMenuModel> menu_model,
diff --git a/src/include/cef_navigation_entry.h b/src/include/cef_navigation_entry.h
index 292f5b6..a8e2f33 100644
--- a/src/include/cef_navigation_entry.h
+++ b/src/include/cef_navigation_entry.h
@@ -42,7 +42,7 @@
 #include "include/cef_ssl_status.h"
 
 ///
-// Class used to represent an entry in navigation history.
+/// Class used to represent an entry in navigation history.
 ///
 /*--cef(source=library)--*/
 class CefNavigationEntry : public virtual CefBaseRefCounted {
@@ -50,68 +50,69 @@
   typedef cef_transition_type_t TransitionType;
 
   ///
-  // Returns true if this object is valid. Do not call any other methods if this
-  // function returns false.
+  /// Returns true if this object is valid. Do not call any other methods if
+  /// this function returns false.
   ///
   /*--cef()--*/
   virtual bool IsValid() = 0;
 
   ///
-  // Returns the actual URL of the page. For some pages this may be data: URL or
-  // similar. Use GetDisplayURL() to return a display-friendly version.
+  /// Returns the actual URL of the page. For some pages this may be data: URL
+  /// or similar. Use GetDisplayURL() to return a display-friendly version.
   ///
   /*--cef()--*/
   virtual CefString GetURL() = 0;
 
   ///
-  // Returns a display-friendly version of the URL.
+  /// Returns a display-friendly version of the URL.
   ///
   /*--cef()--*/
   virtual CefString GetDisplayURL() = 0;
 
   ///
-  // Returns the original URL that was entered by the user before any redirects.
+  /// Returns the original URL that was entered by the user before any
+  /// redirects.
   ///
   /*--cef()--*/
   virtual CefString GetOriginalURL() = 0;
 
   ///
-  // Returns the title set by the page. This value may be empty.
+  /// Returns the title set by the page. This value may be empty.
   ///
   /*--cef()--*/
   virtual CefString GetTitle() = 0;
 
   ///
-  // Returns the transition type which indicates what the user did to move to
-  // this page from the previous page.
+  /// Returns the transition type which indicates what the user did to move to
+  /// this page from the previous page.
   ///
   /*--cef(default_retval=TT_EXPLICIT)--*/
   virtual TransitionType GetTransitionType() = 0;
 
   ///
-  // Returns true if this navigation includes post data.
+  /// Returns true if this navigation includes post data.
   ///
   /*--cef()--*/
   virtual bool HasPostData() = 0;
 
   ///
-  // Returns the time for the last known successful navigation completion. A
-  // navigation may be completed more than once if the page is reloaded. May be
-  // 0 if the navigation has not yet completed.
+  /// Returns the time for the last known successful navigation completion. A
+  /// navigation may be completed more than once if the page is reloaded. May be
+  /// 0 if the navigation has not yet completed.
   ///
   /*--cef()--*/
-  virtual CefTime GetCompletionTime() = 0;
+  virtual CefBaseTime GetCompletionTime() = 0;
 
   ///
-  // Returns the HTTP status code for the last known successful navigation
-  // response. May be 0 if the response has not yet been received or if the
-  // navigation has not yet completed.
+  /// Returns the HTTP status code for the last known successful navigation
+  /// response. May be 0 if the response has not yet been received or if the
+  /// navigation has not yet completed.
   ///
   /*--cef()--*/
   virtual int GetHttpStatusCode() = 0;
 
   ///
-  // Returns the SSL information for this navigation entry.
+  /// Returns the SSL information for this navigation entry.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefSSLStatus> GetSSLStatus() = 0;
diff --git a/src/include/cef_origin_whitelist.h b/src/include/cef_origin_whitelist.h
index ad17318..e684ef6 100644
--- a/src/include/cef_origin_whitelist.h
+++ b/src/include/cef_origin_whitelist.h
@@ -41,40 +41,41 @@
 #include "include/cef_base.h"
 
 ///
-// Add an entry to the cross-origin access whitelist.
-//
-// The same-origin policy restricts how scripts hosted from different origins
-// (scheme + domain + port) can communicate. By default, scripts can only access
-// resources with the same origin. Scripts hosted on the HTTP and HTTPS schemes
-// (but no other schemes) can use the "Access-Control-Allow-Origin" header to
-// allow cross-origin requests. For example, https://source.example.com can make
-// XMLHttpRequest requests on http://target.example.com if the
-// http://target.example.com request returns an "Access-Control-Allow-Origin:
-// https://source.example.com" response header.
-//
-// Scripts in separate frames or iframes and hosted from the same protocol and
-// domain suffix can execute cross-origin JavaScript if both pages set the
-// document.domain value to the same domain suffix. For example,
-// scheme://foo.example.com and scheme://bar.example.com can communicate using
-// JavaScript if both domains set document.domain="example.com".
-//
-// This method is used to allow access to origins that would otherwise violate
-// the same-origin policy. Scripts hosted underneath the fully qualified
-// |source_origin| URL (like http://www.example.com) will be allowed access to
-// all resources hosted on the specified |target_protocol| and |target_domain|.
-// If |target_domain| is non-empty and |allow_target_subdomains| if false only
-// exact domain matches will be allowed. If |target_domain| contains a top-
-// level domain component (like "example.com") and |allow_target_subdomains| is
-// true sub-domain matches will be allowed. If |target_domain| is empty and
-// |allow_target_subdomains| if true all domains and IP addresses will be
-// allowed.
-//
-// This method cannot be used to bypass the restrictions on local or display
-// isolated schemes. See the comments on CefRegisterCustomScheme for more
-// information.
-//
-// This function may be called on any thread. Returns false if |source_origin|
-// is invalid or the whitelist cannot be accessed.
+/// Add an entry to the cross-origin access whitelist.
+///
+/// The same-origin policy restricts how scripts hosted from different origins
+/// (scheme + domain + port) can communicate. By default, scripts can only
+/// access resources with the same origin. Scripts hosted on the HTTP and HTTPS
+/// schemes (but no other schemes) can use the "Access-Control-Allow-Origin"
+/// header to allow cross-origin requests. For example,
+/// https://source.example.com can make XMLHttpRequest requests on
+/// http://target.example.com if the http://target.example.com request returns
+/// an "Access-Control-Allow-Origin: https://source.example.com" response
+/// header.
+///
+/// Scripts in separate frames or iframes and hosted from the same protocol and
+/// domain suffix can execute cross-origin JavaScript if both pages set the
+/// document.domain value to the same domain suffix. For example,
+/// scheme://foo.example.com and scheme://bar.example.com can communicate using
+/// JavaScript if both domains set document.domain="example.com".
+///
+/// This method is used to allow access to origins that would otherwise violate
+/// the same-origin policy. Scripts hosted underneath the fully qualified
+/// |source_origin| URL (like http://www.example.com) will be allowed access to
+/// all resources hosted on the specified |target_protocol| and |target_domain|.
+/// If |target_domain| is non-empty and |allow_target_subdomains| is false only
+/// exact domain matches will be allowed. If |target_domain| contains a top-
+/// level domain component (like "example.com") and |allow_target_subdomains| is
+/// true sub-domain matches will be allowed. If |target_domain| is empty and
+/// |allow_target_subdomains| if true all domains and IP addresses will be
+/// allowed.
+///
+/// This method cannot be used to bypass the restrictions on local or display
+/// isolated schemes. See the comments on CefRegisterCustomScheme for more
+/// information.
+///
+/// This function may be called on any thread. Returns false if |source_origin|
+/// is invalid or the whitelist cannot be accessed.
 ///
 /*--cef(optional_param=target_domain)--*/
 bool CefAddCrossOriginWhitelistEntry(const CefString& source_origin,
@@ -83,8 +84,8 @@
                                      bool allow_target_subdomains);
 
 ///
-// Remove an entry from the cross-origin access whitelist. Returns false if
-// |source_origin| is invalid or the whitelist cannot be accessed.
+/// Remove an entry from the cross-origin access whitelist. Returns false if
+/// |source_origin| is invalid or the whitelist cannot be accessed.
 ///
 /*--cef(optional_param=target_domain)--*/
 bool CefRemoveCrossOriginWhitelistEntry(const CefString& source_origin,
@@ -93,8 +94,8 @@
                                         bool allow_target_subdomains);
 
 ///
-// Remove all entries from the cross-origin access whitelist. Returns false if
-// the whitelist cannot be accessed.
+/// Remove all entries from the cross-origin access whitelist. Returns false if
+/// the whitelist cannot be accessed.
 ///
 /*--cef()--*/
 bool CefClearCrossOriginWhitelist();
diff --git a/src/include/cef_parser.h b/src/include/cef_parser.h
index bae958b..7482c7f 100644
--- a/src/include/cef_parser.h
+++ b/src/include/cef_parser.h
@@ -44,81 +44,90 @@
 #include "include/cef_values.h"
 
 ///
-// Parse the specified |url| into its component parts.
-// Returns false if the URL is empty or invalid.
+/// Combines specified |base_url| and |relative_url| into |resolved_url|.
+/// Returns false if one of the URLs is empty or invalid.
+///
+/*--cef()--*/
+bool CefResolveURL(const CefString& base_url,
+                   const CefString& relative_url,
+                   CefString& resolved_url);
+
+///
+/// Parse the specified |url| into its component parts.
+/// Returns false if the URL is empty or invalid.
 ///
 /*--cef()--*/
 bool CefParseURL(const CefString& url, CefURLParts& parts);
 
 ///
-// Creates a URL from the specified |parts|, which must contain a non-empty
-// spec or a non-empty host and path (at a minimum), but not both.
-// Returns false if |parts| isn't initialized as described.
+/// Creates a URL from the specified |parts|, which must contain a non-empty
+/// spec or a non-empty host and path (at a minimum), but not both.
+/// Returns false if |parts| isn't initialized as described.
 ///
 /*--cef()--*/
 bool CefCreateURL(const CefURLParts& parts, CefString& url);
 
 ///
-// This is a convenience function for formatting a URL in a concise and human-
-// friendly way to help users make security-related decisions (or in other
-// circumstances when people need to distinguish sites, origins, or otherwise-
-// simplified URLs from each other). Internationalized domain names (IDN) may be
-// presented in Unicode if the conversion is considered safe. The returned value
-// will (a) omit the path for standard schemes, excepting file and filesystem,
-// and (b) omit the port if it is the default for the scheme. Do not use this
-// for URLs which will be parsed or sent to other applications.
+/// This is a convenience function for formatting a URL in a concise and human-
+/// friendly way to help users make security-related decisions (or in other
+/// circumstances when people need to distinguish sites, origins, or otherwise-
+/// simplified URLs from each other). Internationalized domain names (IDN) may
+/// be presented in Unicode if the conversion is considered safe. The returned
+/// value will (a) omit the path for standard schemes, excepting file and
+/// filesystem, and (b) omit the port if it is the default for the scheme. Do
+/// not use this for URLs which will be parsed or sent to other applications.
 ///
 /*--cef(optional_param=languages)--*/
 CefString CefFormatUrlForSecurityDisplay(const CefString& origin_url);
 
 ///
-// Returns the mime type for the specified file extension or an empty string if
-// unknown.
+/// Returns the mime type for the specified file extension or an empty string if
+/// unknown.
 ///
 /*--cef()--*/
 CefString CefGetMimeType(const CefString& extension);
 
 ///
-// Get the extensions associated with the given mime type. This should be passed
-// in lower case. There could be multiple extensions for a given mime type, like
-// "html,htm" for "text/html", or "txt,text,html,..." for "text/*". Any existing
-// elements in the provided vector will not be erased.
+/// Get the extensions associated with the given mime type. This should be
+/// passed in lower case. There could be multiple extensions for a given mime
+/// type, like "html,htm" for "text/html", or "txt,text,html,..." for "text/*".
+/// Any existing elements in the provided vector will not be erased.
 ///
 /*--cef()--*/
 void CefGetExtensionsForMimeType(const CefString& mime_type,
                                  std::vector<CefString>& extensions);
 
 ///
-// Encodes |data| as a base64 string.
+/// Encodes |data| as a base64 string.
 ///
 /*--cef()--*/
 CefString CefBase64Encode(const void* data, size_t data_size);
 
 ///
-// Decodes the base64 encoded string |data|. The returned value will be NULL if
-// the decoding fails.
+/// Decodes the base64 encoded string |data|. The returned value will be NULL if
+/// the decoding fails.
 ///
 /*--cef()--*/
 CefRefPtr<CefBinaryValue> CefBase64Decode(const CefString& data);
 
 ///
-// Escapes characters in |text| which are unsuitable for use as a query
-// parameter value. Everything except alphanumerics and -_.!~*'() will be
-// converted to "%XX". If |use_plus| is true spaces will change to "+". The
-// result is basically the same as encodeURIComponent in Javacript.
+/// Escapes characters in |text| which are unsuitable for use as a query
+/// parameter value. Everything except alphanumerics and -_.!~*'() will be
+/// converted to "%XX". If |use_plus| is true spaces will change to "+". The
+/// result is basically the same as encodeURIComponent in Javacript.
 ///
 /*--cef()--*/
 CefString CefURIEncode(const CefString& text, bool use_plus);
 
 ///
-// Unescapes |text| and returns the result. Unescaping consists of looking for
-// the exact pattern "%XX" where each X is a hex digit and converting to the
-// character with the numerical value of those digits (e.g. "i%20=%203%3b"
-// unescapes to "i = 3;"). If |convert_to_utf8| is true this function will
-// attempt to interpret the initial decoded result as UTF-8. If the result is
-// convertable into UTF-8 it will be returned as converted. Otherwise the
-// initial decoded result will be returned.  The |unescape_rule| parameter
-// supports further customization the decoding process.
+/// Unescapes |text| and returns the result. Unescaping consists of looking for
+/// the exact pattern "%XX" where each X is a hex digit and converting to the
+/// character with the numerical value of those digits (e.g. "i%20=%203%3b"
+/// unescapes to "i = 3;"). If |convert_to_utf8| is true this function will
+/// attempt to interpret the initial decoded result as UTF-8. If the result is
+/// convertable into UTF-8 it will be returned as converted. Otherwise the
+/// initial decoded result will be returned.  The |unescape_rule| parameter
+/// supports further customization the decoding process.
 ///
 /*--cef()--*/
 CefString CefURIDecode(const CefString& text,
@@ -126,17 +135,17 @@
                        cef_uri_unescape_rule_t unescape_rule);
 
 ///
-// Parses the specified |json_string| and returns a dictionary or list
-// representation. If JSON parsing fails this method returns NULL.
+/// Parses the specified |json_string| and returns a dictionary or list
+/// representation. If JSON parsing fails this method returns NULL.
 ///
 /*--cef()--*/
 CefRefPtr<CefValue> CefParseJSON(const CefString& json_string,
                                  cef_json_parser_options_t options);
 
 ///
-// Parses the specified UTF8-encoded |json| buffer of size |json_size| and
-// returns a dictionary or list representation. If JSON parsing fails this
-// method returns NULL.
+/// Parses the specified UTF8-encoded |json| buffer of size |json_size| and
+/// returns a dictionary or list representation. If JSON parsing fails this
+/// method returns NULL.
 ///
 /*--cef(capi_name=cef_parse_json_buffer)--*/
 CefRefPtr<CefValue> CefParseJSON(const void* json,
@@ -144,22 +153,20 @@
                                  cef_json_parser_options_t options);
 
 ///
-// Parses the specified |json_string| and returns a dictionary or list
-// representation. If JSON parsing fails this method returns NULL and populates
-// |error_code_out| and |error_msg_out| with an error code and a formatted error
-// message respectively.
+/// Parses the specified |json_string| and returns a dictionary or list
+/// representation. If JSON parsing fails this method returns NULL and populates
+/// |error_msg_out| with a formatted error message.
 ///
 /*--cef()--*/
 CefRefPtr<CefValue> CefParseJSONAndReturnError(
     const CefString& json_string,
     cef_json_parser_options_t options,
-    cef_json_parser_error_t& error_code_out,
     CefString& error_msg_out);
 
 ///
-// Generates a JSON string from the specified root |node| which should be a
-// dictionary or list value. Returns an empty string on failure. This method
-// requires exclusive access to |node| including any underlying data.
+/// Generates a JSON string from the specified root |node| which should be a
+/// dictionary or list value. Returns an empty string on failure. This method
+/// requires exclusive access to |node| including any underlying data.
 ///
 /*--cef()--*/
 CefString CefWriteJSON(CefRefPtr<CefValue> node,
diff --git a/src/include/cef_path_util.h b/src/include/cef_path_util.h
index 552f4ba..d30dc6c 100644
--- a/src/include/cef_path_util.h
+++ b/src/include/cef_path_util.h
@@ -43,8 +43,8 @@
 typedef cef_path_key_t PathKey;
 
 ///
-// Retrieve the path associated with the specified |key|. Returns true on
-// success. Can be called on any thread in the browser process.
+/// Retrieve the path associated with the specified |key|. Returns true on
+/// success. Can be called on any thread in the browser process.
 ///
 /*--cef()--*/
 bool CefGetPath(PathKey key, CefString& path);
diff --git a/src/include/cef_permission_handler.h b/src/include/cef_permission_handler.h
new file mode 100644
index 0000000..e28c6a6
--- /dev/null
+++ b/src/include/cef_permission_handler.h
@@ -0,0 +1,149 @@
+// Copyright (c) 2022 Marshall A. Greenblatt. 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.
+//
+// ---------------------------------------------------------------------------
+//
+// The contents of this file must follow a specific format in order to
+// support the CEF translator tool. See the translator.README.txt file in the
+// tools directory for more information.
+//
+
+#ifndef CEF_INCLUDE_CEF_PERMISSION_HANDLER_H_
+#define CEF_INCLUDE_CEF_PERMISSION_HANDLER_H_
+#pragma once
+
+#include "include/cef_base.h"
+#include "include/cef_browser.h"
+
+///
+/// Callback interface used for asynchronous continuation of media access
+/// permission requests.
+///
+/*--cef(source=library)--*/
+class CefMediaAccessCallback : public virtual CefBaseRefCounted {
+ public:
+  ///
+  /// Call to allow or deny media access. If this callback was initiated in
+  /// response to a getUserMedia (indicated by
+  /// CEF_MEDIA_PERMISSION_DEVICE_AUDIO_CAPTURE and/or
+  /// CEF_MEDIA_PERMISSION_DEVICE_VIDEO_CAPTURE being set) then
+  /// |allowed_permissions| must match |required_permissions| passed to
+  /// OnRequestMediaAccessPermission.
+  ///
+  /*--cef(capi_name=cont)--*/
+  virtual void Continue(uint32_t allowed_permissions) = 0;
+
+  ///
+  /// Cancel the media access request.
+  ///
+  /*--cef()--*/
+  virtual void Cancel() = 0;
+};
+
+///
+/// Callback interface used for asynchronous continuation of permission prompts.
+///
+/*--cef(source=library)--*/
+class CefPermissionPromptCallback : public virtual CefBaseRefCounted {
+ public:
+  ///
+  /// Complete the permissions request with the specified |result|.
+  ///
+  /*--cef(capi_name=cont)--*/
+  virtual void Continue(cef_permission_request_result_t result) = 0;
+};
+
+///
+/// Implement this interface to handle events related to permission requests.
+/// The methods of this class will be called on the browser process UI thread.
+///
+/*--cef(source=client)--*/
+class CefPermissionHandler : public virtual CefBaseRefCounted {
+ public:
+  ///
+  /// Called when a page requests permission to access media.
+  /// |requesting_origin| is the URL origin requesting permission.
+  /// |requested_permissions| is a combination of values from
+  /// cef_media_access_permission_types_t that represent the requested
+  /// permissions. Return true and call CefMediaAccessCallback methods either in
+  /// this method or at a later time to continue or cancel the request. Return
+  /// false to proceed with default handling. With the Chrome runtime, default
+  /// handling will display the permission request UI. With the Alloy runtime,
+  /// default handling will deny the request. This method will not be called if
+  /// the "--enable-media-stream" command-line switch is used to grant all
+  /// permissions.
+  ///
+  /*--cef()--*/
+  virtual bool OnRequestMediaAccessPermission(
+      CefRefPtr<CefBrowser> browser,
+      CefRefPtr<CefFrame> frame,
+      const CefString& requesting_origin,
+      uint32_t requested_permissions,
+      CefRefPtr<CefMediaAccessCallback> callback) {
+    return false;
+  }
+
+  ///
+  /// Called when a page should show a permission prompt. |prompt_id| uniquely
+  /// identifies the prompt. |requesting_origin| is the URL origin requesting
+  /// permission. |requested_permissions| is a combination of values from
+  /// cef_permission_request_types_t that represent the requested permissions.
+  /// Return true and call CefPermissionPromptCallback::Continue either in this
+  /// method or at a later time to continue or cancel the request. Return false
+  /// to proceed with default handling. With the Chrome runtime, default
+  /// handling will display the permission prompt UI. With the Alloy runtime,
+  /// default handling is CEF_PERMISSION_RESULT_IGNORE.
+  ///
+  /*--cef()--*/
+  virtual bool OnShowPermissionPrompt(
+      CefRefPtr<CefBrowser> browser,
+      uint64_t prompt_id,
+      const CefString& requesting_origin,
+      uint32_t requested_permissions,
+      CefRefPtr<CefPermissionPromptCallback> callback) {
+    return false;
+  }
+
+  ///
+  /// Called when a permission prompt handled via OnShowPermissionPrompt is
+  /// dismissed. |prompt_id| will match the value that was passed to
+  /// OnShowPermissionPrompt. |result| will be the value passed to
+  /// CefPermissionPromptCallback::Continue or CEF_PERMISSION_RESULT_IGNORE if
+  /// the dialog was dismissed for other reasons such as navigation, browser
+  /// closure, etc. This method will not be called if OnShowPermissionPrompt
+  /// returned false for |prompt_id|.
+  ///
+  /*--cef()--*/
+  virtual void OnDismissPermissionPrompt(
+      CefRefPtr<CefBrowser> browser,
+      uint64_t prompt_id,
+      cef_permission_request_result_t result) {}
+};
+
+#endif  // CEF_INCLUDE_CEF_PERMISSION_HANDLER_H_
diff --git a/src/include/cef_preference.h b/src/include/cef_preference.h
new file mode 100644
index 0000000..8f3d61a
--- /dev/null
+++ b/src/include/cef_preference.h
@@ -0,0 +1,134 @@
+// Copyright (c) 2022 Marshall A. Greenblatt. 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.
+//
+// ---------------------------------------------------------------------------
+//
+// The contents of this file must follow a specific format in order to
+// support the CEF translator tool. See the translator.README.txt file in the
+// tools directory for more information.
+//
+
+#ifndef CEF_INCLUDE_CEF_PREFERENCE_H_
+#define CEF_INCLUDE_CEF_PREFERENCE_H_
+#pragma once
+
+#include <vector>
+
+#include "include/cef_base.h"
+#include "include/cef_values.h"
+
+///
+/// Class that manages custom preference registrations.
+///
+/*--cef(source=library)--*/
+class CefPreferenceRegistrar : public CefBaseScoped {
+ public:
+  ///
+  /// Register a preference with the specified |name| and |default_value|. To
+  /// avoid conflicts with built-in preferences the |name| value should contain
+  /// an application-specific prefix followed by a period (e.g. "myapp.value").
+  /// The contents of |default_value| will be copied. The data type for the
+  /// preference will be inferred from |default_value|'s type and cannot be
+  /// changed after registration. Returns true on success. Returns false if
+  /// |name| is already registered or if |default_value| has an invalid type.
+  /// This method must be called from within the scope of the
+  /// CefBrowserProcessHandler::OnRegisterCustomPreferences callback.
+  ///
+  /*--cef()--*/
+  virtual bool AddPreference(const CefString& name,
+                             CefRefPtr<CefValue> default_value) = 0;
+};
+
+///
+/// Manage access to preferences. Many built-in preferences are registered by
+/// Chromium. Custom preferences can be registered in
+/// CefBrowserProcessHandler::OnRegisterCustomPreferences.
+///
+/*--cef(source=library,no_debugct_check)--*/
+class CefPreferenceManager : public virtual CefBaseRefCounted {
+ public:
+  ///
+  /// Returns the global preference manager object.
+  ///
+  /*--cef()--*/
+  static CefRefPtr<CefPreferenceManager> GetGlobalPreferenceManager();
+
+  ///
+  /// Returns true if a preference with the specified |name| exists. This method
+  /// must be called on the browser process UI thread.
+  ///
+  /*--cef()--*/
+  virtual bool HasPreference(const CefString& name) = 0;
+
+  ///
+  /// Returns the value for the preference with the specified |name|. Returns
+  /// NULL if the preference does not exist. The returned object contains a copy
+  /// of the underlying preference value and modifications to the returned
+  /// object will not modify the underlying preference value. This method must
+  /// be called on the browser process UI thread.
+  ///
+  /*--cef()--*/
+  virtual CefRefPtr<CefValue> GetPreference(const CefString& name) = 0;
+
+  ///
+  /// Returns all preferences as a dictionary. If |include_defaults| is true
+  /// then preferences currently at their default value will be included. The
+  /// returned object contains a copy of the underlying preference values and
+  /// modifications to the returned object will not modify the underlying
+  /// preference values. This method must be called on the browser process UI
+  /// thread.
+  ///
+  /*--cef()--*/
+  virtual CefRefPtr<CefDictionaryValue> GetAllPreferences(
+      bool include_defaults) = 0;
+
+  ///
+  /// Returns true if the preference with the specified |name| can be modified
+  /// using SetPreference. As one example preferences set via the command-line
+  /// usually cannot be modified. This method must be called on the browser
+  /// process UI thread.
+  ///
+  /*--cef()--*/
+  virtual bool CanSetPreference(const CefString& name) = 0;
+
+  ///
+  /// Set the |value| associated with preference |name|. Returns true if the
+  /// value is set successfully and false otherwise. If |value| is NULL the
+  /// preference will be restored to its default value. If setting the
+  /// preference fails then |error| will be populated with a detailed
+  /// description of the problem. This method must be called on the browser
+  /// process UI thread.
+  ///
+  /*--cef(optional_param=value)--*/
+  virtual bool SetPreference(const CefString& name,
+                             CefRefPtr<CefValue> value,
+                             CefString& error) = 0;
+};
+
+#endif  // CEF_INCLUDE_CEF_PREFERENCE_H_
diff --git a/src/include/cef_print_handler.h b/src/include/cef_print_handler.h
index c668bd4..8e4bcc6 100644
--- a/src/include/cef_print_handler.h
+++ b/src/include/cef_print_handler.h
@@ -43,58 +43,58 @@
 #include "include/cef_print_settings.h"
 
 ///
-// Callback interface for asynchronous continuation of print dialog requests.
+/// Callback interface for asynchronous continuation of print dialog requests.
 ///
 /*--cef(source=library)--*/
 class CefPrintDialogCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Continue printing with the specified |settings|.
+  /// Continue printing with the specified |settings|.
   ///
   /*--cef(capi_name=cont)--*/
   virtual void Continue(CefRefPtr<CefPrintSettings> settings) = 0;
 
   ///
-  // Cancel the printing.
+  /// Cancel the printing.
   ///
   /*--cef()--*/
   virtual void Cancel() = 0;
 };
 
 ///
-// Callback interface for asynchronous continuation of print job requests.
+/// Callback interface for asynchronous continuation of print job requests.
 ///
 /*--cef(source=library)--*/
 class CefPrintJobCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Indicate completion of the print job.
+  /// Indicate completion of the print job.
   ///
   /*--cef(capi_name=cont)--*/
   virtual void Continue() = 0;
 };
 
 ///
-// Implement this interface to handle printing on Linux. Each browser will have
-// only one print job in progress at a time. The methods of this class will be
-// called on the browser process UI thread.
+/// Implement this interface to handle printing on Linux. Each browser will have
+/// only one print job in progress at a time. The methods of this class will be
+/// called on the browser process UI thread.
 ///
 /*--cef(source=client)--*/
 class CefPrintHandler : public virtual CefBaseRefCounted {
  public:
   ///
-  // Called when printing has started for the specified |browser|. This method
-  // will be called before the other OnPrint*() methods and irrespective of how
-  // printing was initiated (e.g. CefBrowserHost::Print(), JavaScript
-  // window.print() or PDF extension print button).
+  /// Called when printing has started for the specified |browser|. This method
+  /// will be called before the other OnPrint*() methods and irrespective of how
+  /// printing was initiated (e.g. CefBrowserHost::Print(), JavaScript
+  /// window.print() or PDF extension print button).
   ///
   /*--cef()--*/
   virtual void OnPrintStart(CefRefPtr<CefBrowser> browser) = 0;
 
   ///
-  // Synchronize |settings| with client state. If |get_defaults| is true then
-  // populate |settings| with the default print settings. Do not keep a
-  // reference to |settings| outside of this callback.
+  /// Synchronize |settings| with client state. If |get_defaults| is true then
+  /// populate |settings| with the default print settings. Do not keep a
+  /// reference to |settings| outside of this callback.
   ///
   /*--cef()--*/
   virtual void OnPrintSettings(CefRefPtr<CefBrowser> browser,
@@ -102,9 +102,9 @@
                                bool get_defaults) = 0;
 
   ///
-  // Show the print dialog. Execute |callback| once the dialog is dismissed.
-  // Return true if the dialog will be displayed or false to cancel the
-  // printing immediately.
+  /// Show the print dialog. Execute |callback| once the dialog is dismissed.
+  /// Return true if the dialog will be displayed or false to cancel the
+  /// printing immediately.
   ///
   /*--cef()--*/
   virtual bool OnPrintDialog(CefRefPtr<CefBrowser> browser,
@@ -112,9 +112,9 @@
                              CefRefPtr<CefPrintDialogCallback> callback) = 0;
 
   ///
-  // Send the print job to the printer. Execute |callback| once the job is
-  // completed. Return true if the job will proceed or false to cancel the job
-  // immediately.
+  /// Send the print job to the printer. Execute |callback| once the job is
+  /// completed. Return true if the job will proceed or false to cancel the job
+  /// immediately.
   ///
   /*--cef()--*/
   virtual bool OnPrintJob(CefRefPtr<CefBrowser> browser,
@@ -123,17 +123,18 @@
                           CefRefPtr<CefPrintJobCallback> callback) = 0;
 
   ///
-  // Reset client state related to printing.
+  /// Reset client state related to printing.
   ///
   /*--cef()--*/
   virtual void OnPrintReset(CefRefPtr<CefBrowser> browser) = 0;
 
   ///
-  // Return the PDF paper size in device units. Used in combination with
-  // CefBrowserHost::PrintToPDF().
+  /// Return the PDF paper size in device units. Used in combination with
+  /// CefBrowserHost::PrintToPDF().
   ///
   /*--cef()--*/
-  virtual CefSize GetPdfPaperSize(int device_units_per_inch) {
+  virtual CefSize GetPdfPaperSize(CefRefPtr<CefBrowser> browser,
+                                  int device_units_per_inch) {
     return CefSize();
   }
 };
diff --git a/src/include/cef_print_settings.h b/src/include/cef_print_settings.h
index ba1c294..df61a29 100644
--- a/src/include/cef_print_settings.h
+++ b/src/include/cef_print_settings.h
@@ -43,7 +43,7 @@
 #include "include/cef_base.h"
 
 ///
-// Class representing print settings.
+/// Class representing print settings.
 ///
 /*--cef(source=library)--*/
 class CefPrintSettings : public virtual CefBaseRefCounted {
@@ -53,41 +53,41 @@
   typedef std::vector<CefRange> PageRangeList;
 
   ///
-  // Create a new CefPrintSettings object.
+  /// Create a new CefPrintSettings object.
   ///
   /*--cef()--*/
   static CefRefPtr<CefPrintSettings> Create();
 
   ///
-  // Returns true if this object is valid. Do not call any other methods if this
-  // function returns false.
+  /// Returns true if this object is valid. Do not call any other methods if
+  /// this function returns false.
   ///
   /*--cef()--*/
   virtual bool IsValid() = 0;
 
   ///
-  // Returns true if the values of this object are read-only. Some APIs may
-  // expose read-only objects.
+  /// Returns true if the values of this object are read-only. Some APIs may
+  /// expose read-only objects.
   ///
   /*--cef()--*/
   virtual bool IsReadOnly() = 0;
 
   ///
-  // Set the page orientation.
+  /// Set the page orientation.
   ///
   /*--cef()--*/
   virtual void SetOrientation(bool landscape) = 0;
 
   ///
-  // Returns true if the orientation is landscape.
+  /// Returns true if the orientation is landscape.
   ///
   /*--cef()--*/
   virtual bool IsLandscape() = 0;
 
   ///
-  // Set the printer printable area in device units.
-  // Some platforms already provide flipped area. Set |landscape_needs_flip|
-  // to false on those platforms to avoid double flipping.
+  /// Set the printer printable area in device units.
+  /// Some platforms already provide flipped area. Set |landscape_needs_flip|
+  /// to false on those platforms to avoid double flipping.
   ///
   /*--cef()--*/
   virtual void SetPrinterPrintableArea(
@@ -96,103 +96,103 @@
       bool landscape_needs_flip) = 0;
 
   ///
-  // Set the device name.
+  /// Set the device name.
   ///
   /*--cef(optional_param=name)--*/
   virtual void SetDeviceName(const CefString& name) = 0;
 
   ///
-  // Get the device name.
+  /// Get the device name.
   ///
   /*--cef()--*/
   virtual CefString GetDeviceName() = 0;
 
   ///
-  // Set the DPI (dots per inch).
+  /// Set the DPI (dots per inch).
   ///
   /*--cef()--*/
   virtual void SetDPI(int dpi) = 0;
 
   ///
-  // Get the DPI (dots per inch).
+  /// Get the DPI (dots per inch).
   ///
   /*--cef()--*/
   virtual int GetDPI() = 0;
 
   ///
-  // Set the page ranges.
+  /// Set the page ranges.
   ///
   /*--cef()--*/
   virtual void SetPageRanges(const PageRangeList& ranges) = 0;
 
   ///
-  // Returns the number of page ranges that currently exist.
+  /// Returns the number of page ranges that currently exist.
   ///
   /*--cef()--*/
   virtual size_t GetPageRangesCount() = 0;
 
   ///
-  // Retrieve the page ranges.
+  /// Retrieve the page ranges.
   ///
   /*--cef(count_func=ranges:GetPageRangesCount)--*/
   virtual void GetPageRanges(PageRangeList& ranges) = 0;
 
   ///
-  // Set whether only the selection will be printed.
+  /// Set whether only the selection will be printed.
   ///
   /*--cef()--*/
   virtual void SetSelectionOnly(bool selection_only) = 0;
 
   ///
-  // Returns true if only the selection will be printed.
+  /// Returns true if only the selection will be printed.
   ///
   /*--cef()--*/
   virtual bool IsSelectionOnly() = 0;
 
   ///
-  // Set whether pages will be collated.
+  /// Set whether pages will be collated.
   ///
   /*--cef()--*/
   virtual void SetCollate(bool collate) = 0;
 
   ///
-  // Returns true if pages will be collated.
+  /// Returns true if pages will be collated.
   ///
   /*--cef()--*/
   virtual bool WillCollate() = 0;
 
   ///
-  // Set the color model.
+  /// Set the color model.
   ///
   /*--cef()--*/
   virtual void SetColorModel(ColorModel model) = 0;
 
   ///
-  // Get the color model.
+  /// Get the color model.
   ///
   /*--cef(default_retval=COLOR_MODEL_UNKNOWN)--*/
   virtual ColorModel GetColorModel() = 0;
 
   ///
-  // Set the number of copies.
+  /// Set the number of copies.
   ///
   /*--cef()--*/
   virtual void SetCopies(int copies) = 0;
 
   ///
-  // Get the number of copies.
+  /// Get the number of copies.
   ///
   /*--cef()--*/
   virtual int GetCopies() = 0;
 
   ///
-  // Set the duplex mode.
+  /// Set the duplex mode.
   ///
   /*--cef()--*/
   virtual void SetDuplexMode(DuplexMode mode) = 0;
 
   ///
-  // Get the duplex mode.
+  /// Get the duplex mode.
   ///
   /*--cef(default_retval=DUPLEX_MODE_UNKNOWN)--*/
   virtual DuplexMode GetDuplexMode() = 0;
diff --git a/src/include/cef_process_message.h b/src/include/cef_process_message.h
index c4daeb8..74f6481 100644
--- a/src/include/cef_process_message.h
+++ b/src/include/cef_process_message.h
@@ -39,53 +39,63 @@
 #pragma once
 
 #include "include/cef_base.h"
+#include "include/cef_shared_memory_region.h"
 #include "include/cef_values.h"
 
 typedef cef_process_id_t CefProcessId;
 
 ///
-// Class representing a message. Can be used on any process and thread.
+/// Class representing a message. Can be used on any process and thread.
 ///
 /*--cef(source=library)--*/
 class CefProcessMessage : public virtual CefBaseRefCounted {
  public:
   ///
-  // Create a new CefProcessMessage object with the specified name.
+  /// Create a new CefProcessMessage object with the specified name.
   ///
   /*--cef()--*/
   static CefRefPtr<CefProcessMessage> Create(const CefString& name);
 
   ///
-  // Returns true if this object is valid. Do not call any other methods if this
-  // function returns false.
+  /// Returns true if this object is valid. Do not call any other methods if
+  /// this function returns false.
   ///
   /*--cef()--*/
   virtual bool IsValid() = 0;
 
   ///
-  // Returns true if the values of this object are read-only. Some APIs may
-  // expose read-only objects.
+  /// Returns true if the values of this object are read-only. Some APIs may
+  /// expose read-only objects.
   ///
   /*--cef()--*/
   virtual bool IsReadOnly() = 0;
 
   ///
-  // Returns a writable copy of this object.
+  /// Returns a writable copy of this object.
+  /// Returns nullptr when message contains a shared memory region.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefProcessMessage> Copy() = 0;
 
   ///
-  // Returns the message name.
+  /// Returns the message name.
   ///
   /*--cef()--*/
   virtual CefString GetName() = 0;
 
   ///
-  // Returns the list of arguments.
+  /// Returns the list of arguments.
+  /// Returns nullptr when message contains a shared memory region.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefListValue> GetArgumentList() = 0;
+
+  ///
+  /// Returns the shared memory region.
+  /// Returns nullptr when message contains an argument list.
+  ///
+  /*--cef()--*/
+  virtual CefRefPtr<CefSharedMemoryRegion> GetSharedMemoryRegion() = 0;
 };
 
 #endif  // CEF_INCLUDE_CEF_MESSAGE_H_
diff --git a/src/include/cef_process_util.h b/src/include/cef_process_util.h
index 4fce778..c3e6731 100644
--- a/src/include/cef_process_util.h
+++ b/src/include/cef_process_util.h
@@ -42,14 +42,14 @@
 #include "include/cef_command_line.h"
 
 ///
-// Launches the process specified via |command_line|. Returns true upon
-// success. Must be called on the browser process TID_PROCESS_LAUNCHER thread.
-//
-// Unix-specific notes:
-// - All file descriptors open in the parent process will be closed in the
-//   child process except for stdin, stdout, and stderr.
-// - If the first argument on the command line does not contain a slash,
-//   PATH will be searched. (See man execvp.)
+/// Launches the process specified via |command_line|. Returns true upon
+/// success. Must be called on the browser process TID_PROCESS_LAUNCHER thread.
+///
+/// Unix-specific notes:
+/// - All file descriptors open in the parent process will be closed in the
+///   child process except for stdin, stdout, and stderr.
+/// - If the first argument on the command line does not contain a slash,
+///   PATH will be searched. (See man execvp.)
 ///
 /*--cef()--*/
 bool CefLaunchProcess(CefRefPtr<CefCommandLine> command_line);
diff --git a/src/include/cef_registration.h b/src/include/cef_registration.h
index e8e6caa..87c9eee 100644
--- a/src/include/cef_registration.h
+++ b/src/include/cef_registration.h
@@ -41,7 +41,7 @@
 #include "include/cef_base.h"
 
 ///
-// Generic callback interface used for managing the lifespan of a registration.
+/// Generic callback interface used for managing the lifespan of a registration.
 ///
 /*--cef(source=library)--*/
 class CefRegistration : public virtual CefBaseRefCounted {};
diff --git a/src/include/cef_render_handler.h b/src/include/cef_render_handler.h
index c6c40f8..b27403f 100644
--- a/src/include/cef_render_handler.h
+++ b/src/include/cef_render_handler.h
@@ -46,13 +46,12 @@
 #include "include/cef_drag_data.h"
 
 ///
-// Implement this interface to handle events when window rendering is disabled.
-// The methods of this class will be called on the UI thread.
+/// Implement this interface to handle events when window rendering is disabled.
+/// The methods of this class will be called on the UI thread.
 ///
 /*--cef(source=client)--*/
 class CefRenderHandler : public virtual CefBaseRefCounted {
  public:
-  typedef cef_cursor_type_t CursorType;
   typedef cef_drag_operations_mask_t DragOperation;
   typedef cef_drag_operations_mask_t DragOperationsMask;
   typedef cef_paint_element_type_t PaintElementType;
@@ -60,8 +59,8 @@
   typedef cef_text_input_mode_t TextInputMode;
 
   ///
-  // Return the handler for accessibility notifications. If no handler is
-  // provided the default implementation will be used.
+  /// Return the handler for accessibility notifications. If no handler is
+  /// provided the default implementation will be used.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefAccessibilityHandler> GetAccessibilityHandler() {
@@ -69,9 +68,9 @@
   }
 
   ///
-  // Called to retrieve the root window rectangle in screen coordinates. Return
-  // true if the rectangle was provided. If this method returns false the
-  // rectangle from GetViewRect will be used.
+  /// Called to retrieve the root window rectangle in screen DIP coordinates.
+  /// Return true if the rectangle was provided. If this method returns false
+  /// the rectangle from GetViewRect will be used.
   ///
   /*--cef()--*/
   virtual bool GetRootScreenRect(CefRefPtr<CefBrowser> browser, CefRect& rect) {
@@ -79,15 +78,17 @@
   }
 
   ///
-  // Called to retrieve the view rectangle which is relative to screen
-  // coordinates. This method must always provide a non-empty rectangle.
+  /// Called to retrieve the view rectangle in screen DIP coordinates. This
+  /// method must always provide a non-empty rectangle.
   ///
   /*--cef()--*/
   virtual void GetViewRect(CefRefPtr<CefBrowser> browser, CefRect& rect) = 0;
 
   ///
-  // Called to retrieve the translation from view coordinates to actual screen
-  // coordinates. Return true if the screen coordinates were provided.
+  /// Called to retrieve the translation from view DIP coordinates to screen
+  /// coordinates. Windows/Linux should provide screen device (pixel)
+  /// coordinates and MacOS should provide screen DIP coordinates. Return true
+  /// if the requested coordinates were provided.
   ///
   /*--cef()--*/
   virtual bool GetScreenPoint(CefRefPtr<CefBrowser> browser,
@@ -99,13 +100,13 @@
   }
 
   ///
-  // Called to allow the client to fill in the CefScreenInfo object with
-  // appropriate values. Return true if the |screen_info| structure has been
-  // modified.
-  //
-  // If the screen info rectangle is left empty the rectangle from GetViewRect
-  // will be used. If the rectangle is still empty or invalid popups may not be
-  // drawn correctly.
+  /// Called to allow the client to fill in the CefScreenInfo object with
+  /// appropriate values. Return true if the |screen_info| structure has been
+  /// modified.
+  ///
+  /// If the screen info rectangle is left empty the rectangle from GetViewRect
+  /// will be used. If the rectangle is still empty or invalid popups may not be
+  /// drawn correctly.
   ///
   /*--cef()--*/
   virtual bool GetScreenInfo(CefRefPtr<CefBrowser> browser,
@@ -114,30 +115,30 @@
   }
 
   ///
-  // Called when the browser wants to show or hide the popup widget. The popup
-  // should be shown if |show| is true and hidden if |show| is false.
+  /// Called when the browser wants to show or hide the popup widget. The popup
+  /// should be shown if |show| is true and hidden if |show| is false.
   ///
   /*--cef()--*/
   virtual void OnPopupShow(CefRefPtr<CefBrowser> browser, bool show) {}
 
   ///
-  // Called when the browser wants to move or resize the popup widget. |rect|
-  // contains the new location and size in view coordinates.
+  /// Called when the browser wants to move or resize the popup widget. |rect|
+  /// contains the new location and size in view coordinates.
   ///
   /*--cef()--*/
   virtual void OnPopupSize(CefRefPtr<CefBrowser> browser, const CefRect& rect) {
   }
 
   ///
-  // Called when an element should be painted. Pixel values passed to this
-  // method are scaled relative to view coordinates based on the value of
-  // CefScreenInfo.device_scale_factor returned from GetScreenInfo. |type|
-  // indicates whether the element is the view or the popup widget. |buffer|
-  // contains the pixel data for the whole image. |dirtyRects| contains the set
-  // of rectangles in pixel coordinates that need to be repainted. |buffer| will
-  // be |width|*|height|*4 bytes in size and represents a BGRA image with an
-  // upper-left origin. This method is only called when
-  // CefWindowInfo::shared_texture_enabled is set to false.
+  /// Called when an element should be painted. Pixel values passed to this
+  /// method are scaled relative to view coordinates based on the value of
+  /// CefScreenInfo.device_scale_factor returned from GetScreenInfo. |type|
+  /// indicates whether the element is the view or the popup widget. |buffer|
+  /// contains the pixel data for the whole image. |dirtyRects| contains the set
+  /// of rectangles in pixel coordinates that need to be repainted. |buffer|
+  /// will be |width|*|height|*4 bytes in size and represents a BGRA image with
+  /// an upper-left origin. This method is only called when
+  /// CefWindowInfo::shared_texture_enabled is set to false.
   ///
   /*--cef()--*/
   virtual void OnPaint(CefRefPtr<CefBrowser> browser,
@@ -148,13 +149,13 @@
                        int height) = 0;
 
   ///
-  // Called when an element has been rendered to the shared texture handle.
-  // |type| indicates whether the element is the view or the popup widget.
-  // |dirtyRects| contains the set of rectangles in pixel coordinates that need
-  // to be repainted. |shared_handle| is the handle for a D3D11 Texture2D that
-  // can be accessed via ID3D11Device using the OpenSharedResource method. This
-  // method is only called when CefWindowInfo::shared_texture_enabled is set to
-  // true, and is currently only supported on Windows.
+  /// Called when an element has been rendered to the shared texture handle.
+  /// |type| indicates whether the element is the view or the popup widget.
+  /// |dirtyRects| contains the set of rectangles in pixel coordinates that need
+  /// to be repainted. |shared_handle| is the handle for a D3D11 Texture2D that
+  /// can be accessed via ID3D11Device using the OpenSharedResource method. This
+  /// method is only called when CefWindowInfo::shared_texture_enabled is set to
+  /// true, and is currently only supported on Windows.
   ///
   /*--cef()--*/
   virtual void OnAcceleratedPaint(CefRefPtr<CefBrowser> browser,
@@ -163,29 +164,36 @@
                                   void* shared_handle) {}
 
   ///
-  // Called when the browser's cursor has changed. If |type| is CT_CUSTOM then
-  // |custom_cursor_info| will be populated with the custom cursor information.
+  /// Called to retrieve the size of the touch handle for the specified
+  /// |orientation|.
   ///
   /*--cef()--*/
-  virtual void OnCursorChange(CefRefPtr<CefBrowser> browser,
-                              CefCursorHandle cursor,
-                              CursorType type,
-                              const CefCursorInfo& custom_cursor_info) {}
+  virtual void GetTouchHandleSize(CefRefPtr<CefBrowser> browser,
+                                  cef_horizontal_alignment_t orientation,
+                                  CefSize& size) {}
 
   ///
-  // Called when the user starts dragging content in the web view. Contextual
-  // information about the dragged content is supplied by |drag_data|.
-  // (|x|, |y|) is the drag start location in screen coordinates.
-  // OS APIs that run a system message loop may be used within the
-  // StartDragging call.
-  //
-  // Return false to abort the drag operation. Don't call any of
-  // CefBrowserHost::DragSource*Ended* methods after returning false.
-  //
-  // Return true to handle the drag operation. Call
-  // CefBrowserHost::DragSourceEndedAt and DragSourceSystemDragEnded either
-  // synchronously or asynchronously to inform the web view that the drag
-  // operation has ended.
+  /// Called when touch handle state is updated. The client is responsible for
+  /// rendering the touch handles.
+  ///
+  /*--cef()--*/
+  virtual void OnTouchHandleStateChanged(CefRefPtr<CefBrowser> browser,
+                                         const CefTouchHandleState& state) {}
+
+  ///
+  /// Called when the user starts dragging content in the web view. Contextual
+  /// information about the dragged content is supplied by |drag_data|.
+  /// (|x|, |y|) is the drag start location in screen coordinates.
+  /// OS APIs that run a system message loop may be used within the
+  /// StartDragging call.
+  ///
+  /// Return false to abort the drag operation. Don't call any of
+  /// CefBrowserHost::DragSource*Ended* methods after returning false.
+  ///
+  /// Return true to handle the drag operation. Call
+  /// CefBrowserHost::DragSourceEndedAt and DragSourceSystemDragEnded either
+  /// synchronously or asynchronously to inform the web view that the drag
+  /// operation has ended.
   ///
   /*--cef()--*/
   virtual bool StartDragging(CefRefPtr<CefBrowser> browser,
@@ -197,16 +205,16 @@
   }
 
   ///
-  // Called when the web view wants to update the mouse cursor during a
-  // drag & drop operation. |operation| describes the allowed operation
-  // (none, move, copy, link).
+  /// Called when the web view wants to update the mouse cursor during a
+  /// drag & drop operation. |operation| describes the allowed operation
+  /// (none, move, copy, link).
   ///
   /*--cef()--*/
   virtual void UpdateDragCursor(CefRefPtr<CefBrowser> browser,
                                 DragOperation operation) {}
 
   ///
-  // Called when the scroll offset has changed.
+  /// Called when the scroll offset has changed.
   ///
   /*--cef()--*/
   virtual void OnScrollOffsetChanged(CefRefPtr<CefBrowser> browser,
@@ -214,9 +222,9 @@
                                      double y) {}
 
   ///
-  // Called when the IME composition range has changed. |selected_range| is the
-  // range of characters that have been selected. |character_bounds| is the
-  // bounds of each character in view coordinates.
+  /// Called when the IME composition range has changed. |selected_range| is the
+  /// range of characters that have been selected. |character_bounds| is the
+  /// bounds of each character in view coordinates.
   ///
   /*--cef()--*/
   virtual void OnImeCompositionRangeChanged(CefRefPtr<CefBrowser> browser,
@@ -224,9 +232,9 @@
                                             const RectList& character_bounds) {}
 
   ///
-  // Called when text selection has changed for the specified |browser|.
-  // |selected_text| is the currently selected text and |selected_range| is
-  // the character range.
+  /// Called when text selection has changed for the specified |browser|.
+  /// |selected_text| is the currently selected text and |selected_range| is
+  /// the character range.
   ///
   /*--cef(optional_param=selected_text,optional_param=selected_range)--*/
   virtual void OnTextSelectionChanged(CefRefPtr<CefBrowser> browser,
@@ -234,10 +242,10 @@
                                       const CefRange& selected_range) {}
 
   ///
-  // Called when an on-screen keyboard should be shown or hidden for the
-  // specified |browser|. |input_mode| specifies what kind of keyboard
-  // should be opened. If |input_mode| is CEF_TEXT_INPUT_MODE_NONE, any
-  // existing keyboard for this browser should be hidden.
+  /// Called when an on-screen keyboard should be shown or hidden for the
+  /// specified |browser|. |input_mode| specifies what kind of keyboard
+  /// should be opened. If |input_mode| is CEF_TEXT_INPUT_MODE_NONE, any
+  /// existing keyboard for this browser should be hidden.
   ///
   /*--cef()--*/
   virtual void OnVirtualKeyboardRequested(CefRefPtr<CefBrowser> browser,
diff --git a/src/include/cef_render_process_handler.h b/src/include/cef_render_process_handler.h
index 8ba4ec4..a9049ba 100644
--- a/src/include/cef_render_process_handler.h
+++ b/src/include/cef_render_process_handler.h
@@ -48,9 +48,9 @@
 #include "include/cef_values.h"
 
 ///
-// Class used to implement render process callbacks. The methods of this class
-// will be called on the render process main thread (TID_RENDERER) unless
-// otherwise indicated.
+/// Class used to implement render process callbacks. The methods of this class
+/// will be called on the render process main thread (TID_RENDERER) unless
+/// otherwise indicated.
 ///
 /*--cef(source=client,no_debugct_check)--*/
 class CefRenderProcessHandler : public virtual CefBaseRefCounted {
@@ -58,49 +58,41 @@
   typedef cef_navigation_type_t NavigationType;
 
   ///
-  // Called after the render process main thread has been created. |extra_info|
-  // is a read-only value originating from
-  // CefBrowserProcessHandler::OnRenderProcessThreadCreated(). Do not keep a
-  // reference to |extra_info| outside of this method.
-  ///
-  /*--cef()--*/
-  virtual void OnRenderThreadCreated(CefRefPtr<CefListValue> extra_info) {}
-
-  ///
-  // Called after WebKit has been initialized.
+  /// Called after WebKit has been initialized.
   ///
   /*--cef()--*/
   virtual void OnWebKitInitialized() {}
 
   ///
-  // Called after a browser has been created. When browsing cross-origin a new
-  // browser will be created before the old browser with the same identifier is
-  // destroyed. |extra_info| is a read-only value originating from
-  // CefBrowserHost::CreateBrowser(), CefBrowserHost::CreateBrowserSync(),
-  // CefLifeSpanHandler::OnBeforePopup() or CefBrowserView::CreateBrowserView().
+  /// Called after a browser has been created. When browsing cross-origin a new
+  /// browser will be created before the old browser with the same identifier is
+  /// destroyed. |extra_info| is an optional read-only value originating from
+  /// CefBrowserHost::CreateBrowser(), CefBrowserHost::CreateBrowserSync(),
+  /// CefLifeSpanHandler::OnBeforePopup() or
+  /// CefBrowserView::CreateBrowserView().
   ///
-  /*--cef()--*/
+  /*--cef(optional_param=extra_info)--*/
   virtual void OnBrowserCreated(CefRefPtr<CefBrowser> browser,
                                 CefRefPtr<CefDictionaryValue> extra_info) {}
 
   ///
-  // Called before a browser is destroyed.
+  /// Called before a browser is destroyed.
   ///
   /*--cef()--*/
   virtual void OnBrowserDestroyed(CefRefPtr<CefBrowser> browser) {}
 
   ///
-  // Return the handler for browser load status events.
+  /// Return the handler for browser load status events.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefLoadHandler> GetLoadHandler() { return nullptr; }
 
   ///
-  // Called immediately after the V8 context for a frame has been created. To
-  // retrieve the JavaScript 'window' object use the CefV8Context::GetGlobal()
-  // method. V8 handles can only be accessed from the thread on which they are
-  // created. A task runner for posting tasks on the associated thread can be
-  // retrieved via the CefV8Context::GetTaskRunner() method.
+  /// Called immediately after the V8 context for a frame has been created. To
+  /// retrieve the JavaScript 'window' object use the CefV8Context::GetGlobal()
+  /// method. V8 handles can only be accessed from the thread on which they are
+  /// created. A task runner for posting tasks on the associated thread can be
+  /// retrieved via the CefV8Context::GetTaskRunner() method.
   ///
   /*--cef()--*/
   virtual void OnContextCreated(CefRefPtr<CefBrowser> browser,
@@ -108,8 +100,8 @@
                                 CefRefPtr<CefV8Context> context) {}
 
   ///
-  // Called immediately before the V8 context for a frame is released. No
-  // references to the context should be kept after this method is called.
+  /// Called immediately before the V8 context for a frame is released. No
+  /// references to the context should be kept after this method is called.
   ///
   /*--cef()--*/
   virtual void OnContextReleased(CefRefPtr<CefBrowser> browser,
@@ -117,9 +109,9 @@
                                  CefRefPtr<CefV8Context> context) {}
 
   ///
-  // Called for global uncaught exceptions in a frame. Execution of this
-  // callback is disabled by default. To enable set
-  // CefSettings.uncaught_exception_stack_size > 0.
+  /// Called for global uncaught exceptions in a frame. Execution of this
+  /// callback is disabled by default. To enable set
+  /// cef_settings_t.uncaught_exception_stack_size > 0.
   ///
   /*--cef()--*/
   virtual void OnUncaughtException(CefRefPtr<CefBrowser> browser,
@@ -129,12 +121,12 @@
                                    CefRefPtr<CefV8StackTrace> stackTrace) {}
 
   ///
-  // Called when a new node in the the browser gets focus. The |node| value may
-  // be empty if no specific node has gained focus. The node object passed to
-  // this method represents a snapshot of the DOM at the time this method is
-  // executed. DOM objects are only valid for the scope of this method. Do not
-  // keep references to or attempt to access any DOM objects outside the scope
-  // of this method.
+  /// Called when a new node in the the browser gets focus. The |node| value may
+  /// be empty if no specific node has gained focus. The node object passed to
+  /// this method represents a snapshot of the DOM at the time this method is
+  /// executed. DOM objects are only valid for the scope of this method. Do not
+  /// keep references to or attempt to access any DOM objects outside the scope
+  /// of this method.
   ///
   /*--cef(optional_param=frame,optional_param=node)--*/
   virtual void OnFocusedNodeChanged(CefRefPtr<CefBrowser> browser,
@@ -142,9 +134,9 @@
                                     CefRefPtr<CefDOMNode> node) {}
 
   ///
-  // Called when a new message is received from a different process. Return true
-  // if the message was handled or false otherwise. Do not keep a reference to
-  // or attempt to access the message outside of this callback.
+  /// Called when a new message is received from a different process. Return
+  /// true if the message was handled or false otherwise. It is safe to keep a
+  /// reference to |message| outside of this callback.
   ///
   /*--cef()--*/
   virtual bool OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
diff --git a/src/include/cef_request.h b/src/include/cef_request.h
index cbe2d03..5f5a440 100644
--- a/src/include/cef_request.h
+++ b/src/include/cef_request.h
@@ -46,8 +46,8 @@
 class CefPostDataElement;
 
 ///
-// Class used to represent a web request. The methods of this class may be
-// called on any thread.
+/// Class used to represent a web request. The methods of this class may be
+/// called on any thread.
 ///
 /*--cef(source=library,no_debugct_check)--*/
 class CefRequest : public virtual CefBaseRefCounted {
@@ -58,101 +58,101 @@
   typedef cef_transition_type_t TransitionType;
 
   ///
-  // Create a new CefRequest object.
+  /// Create a new CefRequest object.
   ///
   /*--cef()--*/
   static CefRefPtr<CefRequest> Create();
 
   ///
-  // Returns true if this object is read-only.
+  /// Returns true if this object is read-only.
   ///
   /*--cef()--*/
   virtual bool IsReadOnly() = 0;
 
   ///
-  // Get the fully qualified URL.
+  /// Get the fully qualified URL.
   ///
   /*--cef()--*/
   virtual CefString GetURL() = 0;
 
   ///
-  // Set the fully qualified URL.
+  /// Set the fully qualified URL.
   ///
   /*--cef()--*/
   virtual void SetURL(const CefString& url) = 0;
 
   ///
-  // Get the request method type. The value will default to POST if post data
-  // is provided and GET otherwise.
+  /// Get the request method type. The value will default to POST if post data
+  /// is provided and GET otherwise.
   ///
   /*--cef()--*/
   virtual CefString GetMethod() = 0;
 
   ///
-  // Set the request method type.
+  /// Set the request method type.
   ///
   /*--cef()--*/
   virtual void SetMethod(const CefString& method) = 0;
 
   ///
-  // Set the referrer URL and policy. If non-empty the referrer URL must be
-  // fully qualified with an HTTP or HTTPS scheme component. Any username,
-  // password or ref component will be removed.
+  /// Set the referrer URL and policy. If non-empty the referrer URL must be
+  /// fully qualified with an HTTP or HTTPS scheme component. Any username,
+  /// password or ref component will be removed.
   ///
   /*--cef(optional_param=referrer_url)--*/
   virtual void SetReferrer(const CefString& referrer_url,
                            ReferrerPolicy policy) = 0;
 
   ///
-  // Get the referrer URL.
+  /// Get the referrer URL.
   ///
   /*--cef()--*/
   virtual CefString GetReferrerURL() = 0;
 
   ///
-  // Get the referrer policy.
+  /// Get the referrer policy.
   ///
   /*--cef(default_retval=REFERRER_POLICY_DEFAULT)--*/
   virtual ReferrerPolicy GetReferrerPolicy() = 0;
 
   ///
-  // Get the post data.
+  /// Get the post data.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefPostData> GetPostData() = 0;
 
   ///
-  // Set the post data.
+  /// Set the post data.
   ///
   /*--cef()--*/
   virtual void SetPostData(CefRefPtr<CefPostData> postData) = 0;
 
   ///
-  // Get the header values. Will not include the Referer value if any.
+  /// Get the header values. Will not include the Referer value if any.
   ///
   /*--cef()--*/
   virtual void GetHeaderMap(HeaderMap& headerMap) = 0;
 
   ///
-  // Set the header values. If a Referer value exists in the header map it will
-  // be removed and ignored.
+  /// Set the header values. If a Referer value exists in the header map it will
+  /// be removed and ignored.
   ///
   /*--cef()--*/
   virtual void SetHeaderMap(const HeaderMap& headerMap) = 0;
 
   ///
-  // Returns the first header value for |name| or an empty string if not found.
-  // Will not return the Referer value if any. Use GetHeaderMap instead if
-  // |name| might have multiple values.
+  /// Returns the first header value for |name| or an empty string if not found.
+  /// Will not return the Referer value if any. Use GetHeaderMap instead if
+  /// |name| might have multiple values.
   ///
   /*--cef()--*/
   virtual CefString GetHeaderByName(const CefString& name) = 0;
 
   ///
-  // Set the header |name| to |value|. If |overwrite| is true any existing
-  // values will be replaced with the new value. If |overwrite| is false any
-  // existing values will not be overwritten. The Referer value cannot be set
-  // using this method.
+  /// Set the header |name| to |value|. If |overwrite| is true any existing
+  /// values will be replaced with the new value. If |overwrite| is false any
+  /// existing values will not be overwritten. The Referer value cannot be set
+  /// using this method.
   ///
   /*--cef(optional_param=value)--*/
   virtual void SetHeaderByName(const CefString& name,
@@ -160,7 +160,7 @@
                                bool overwrite) = 0;
 
   ///
-  // Set all values at one time.
+  /// Set all values at one time.
   ///
   /*--cef(optional_param=postData)--*/
   virtual void Set(const CefString& url,
@@ -169,60 +169,60 @@
                    const HeaderMap& headerMap) = 0;
 
   ///
-  // Get the flags used in combination with CefURLRequest. See
-  // cef_urlrequest_flags_t for supported values.
+  /// Get the flags used in combination with CefURLRequest. See
+  /// cef_urlrequest_flags_t for supported values.
   ///
   /*--cef(default_retval=UR_FLAG_NONE)--*/
   virtual int GetFlags() = 0;
 
   ///
-  // Set the flags used in combination with CefURLRequest.  See
-  // cef_urlrequest_flags_t for supported values.
+  /// Set the flags used in combination with CefURLRequest.  See
+  /// cef_urlrequest_flags_t for supported values.
   ///
   /*--cef()--*/
   virtual void SetFlags(int flags) = 0;
 
   ///
-  // Get the URL to the first party for cookies used in combination with
-  // CefURLRequest.
+  /// Get the URL to the first party for cookies used in combination with
+  /// CefURLRequest.
   ///
   /*--cef()--*/
   virtual CefString GetFirstPartyForCookies() = 0;
 
   ///
-  // Set the URL to the first party for cookies used in combination with
-  // CefURLRequest.
+  /// Set the URL to the first party for cookies used in combination with
+  /// CefURLRequest.
   ///
   /*--cef(optional_param=url)--*/
   virtual void SetFirstPartyForCookies(const CefString& url) = 0;
 
   ///
-  // Get the resource type for this request. Only available in the browser
-  // process.
+  /// Get the resource type for this request. Only available in the browser
+  /// process.
   ///
   /*--cef(default_retval=RT_SUB_RESOURCE)--*/
   virtual ResourceType GetResourceType() = 0;
 
   ///
-  // Get the transition type for this request. Only available in the browser
-  // process and only applies to requests that represent a main frame or
-  // sub-frame navigation.
+  /// Get the transition type for this request. Only available in the browser
+  /// process and only applies to requests that represent a main frame or
+  /// sub-frame navigation.
   ///
   /*--cef(default_retval=TT_EXPLICIT)--*/
   virtual TransitionType GetTransitionType() = 0;
 
   ///
-  // Returns the globally unique identifier for this request or 0 if not
-  // specified. Can be used by CefResourceRequestHandler implementations in the
-  // browser process to track a single request across multiple callbacks.
+  /// Returns the globally unique identifier for this request or 0 if not
+  /// specified. Can be used by CefResourceRequestHandler implementations in the
+  /// browser process to track a single request across multiple callbacks.
   ///
   /*--cef()--*/
-  virtual uint64 GetIdentifier() = 0;
+  virtual uint64_t GetIdentifier() = 0;
 };
 
 ///
-// Class used to represent post data for a web request. The methods of this
-// class may be called on any thread.
+/// Class used to represent post data for a web request. The methods of this
+/// class may be called on any thread.
 ///
 /*--cef(source=library,no_debugct_check)--*/
 class CefPostData : public virtual CefBaseRefCounted {
@@ -230,122 +230,122 @@
   typedef std::vector<CefRefPtr<CefPostDataElement>> ElementVector;
 
   ///
-  // Create a new CefPostData object.
+  /// Create a new CefPostData object.
   ///
   /*--cef()--*/
   static CefRefPtr<CefPostData> Create();
 
   ///
-  // Returns true if this object is read-only.
+  /// Returns true if this object is read-only.
   ///
   /*--cef()--*/
   virtual bool IsReadOnly() = 0;
 
   ///
-  // Returns true if the underlying POST data includes elements that are not
-  // represented by this CefPostData object (for example, multi-part file upload
-  // data). Modifying CefPostData objects with excluded elements may result in
-  // the request failing.
+  /// Returns true if the underlying POST data includes elements that are not
+  /// represented by this CefPostData object (for example, multi-part file
+  /// upload data). Modifying CefPostData objects with excluded elements may
+  /// result in the request failing.
   ///
   /*--cef()--*/
   virtual bool HasExcludedElements() = 0;
 
   ///
-  // Returns the number of existing post data elements.
+  /// Returns the number of existing post data elements.
   ///
   /*--cef()--*/
   virtual size_t GetElementCount() = 0;
 
   ///
-  // Retrieve the post data elements.
+  /// Retrieve the post data elements.
   ///
   /*--cef(count_func=elements:GetElementCount)--*/
   virtual void GetElements(ElementVector& elements) = 0;
 
   ///
-  // Remove the specified post data element.  Returns true if the removal
-  // succeeds.
+  /// Remove the specified post data element.  Returns true if the removal
+  /// succeeds.
   ///
   /*--cef()--*/
   virtual bool RemoveElement(CefRefPtr<CefPostDataElement> element) = 0;
 
   ///
-  // Add the specified post data element.  Returns true if the add succeeds.
+  /// Add the specified post data element.  Returns true if the add succeeds.
   ///
   /*--cef()--*/
   virtual bool AddElement(CefRefPtr<CefPostDataElement> element) = 0;
 
   ///
-  // Remove all existing post data elements.
+  /// Remove all existing post data elements.
   ///
   /*--cef()--*/
   virtual void RemoveElements() = 0;
 };
 
 ///
-// Class used to represent a single element in the request post data. The
-// methods of this class may be called on any thread.
+/// Class used to represent a single element in the request post data. The
+/// methods of this class may be called on any thread.
 ///
 /*--cef(source=library,no_debugct_check)--*/
 class CefPostDataElement : public virtual CefBaseRefCounted {
  public:
   ///
-  // Post data elements may represent either bytes or files.
+  /// Post data elements may represent either bytes or files.
   ///
   typedef cef_postdataelement_type_t Type;
 
   ///
-  // Create a new CefPostDataElement object.
+  /// Create a new CefPostDataElement object.
   ///
   /*--cef()--*/
   static CefRefPtr<CefPostDataElement> Create();
 
   ///
-  // Returns true if this object is read-only.
+  /// Returns true if this object is read-only.
   ///
   /*--cef()--*/
   virtual bool IsReadOnly() = 0;
 
   ///
-  // Remove all contents from the post data element.
+  /// Remove all contents from the post data element.
   ///
   /*--cef()--*/
   virtual void SetToEmpty() = 0;
 
   ///
-  // The post data element will represent a file.
+  /// The post data element will represent a file.
   ///
   /*--cef()--*/
   virtual void SetToFile(const CefString& fileName) = 0;
 
   ///
-  // The post data element will represent bytes.  The bytes passed
-  // in will be copied.
+  /// The post data element will represent bytes.  The bytes passed
+  /// in will be copied.
   ///
   /*--cef()--*/
   virtual void SetToBytes(size_t size, const void* bytes) = 0;
 
   ///
-  // Return the type of this post data element.
+  /// Return the type of this post data element.
   ///
   /*--cef(default_retval=PDE_TYPE_EMPTY)--*/
   virtual Type GetType() = 0;
 
   ///
-  // Return the file name.
+  /// Return the file name.
   ///
   /*--cef()--*/
   virtual CefString GetFile() = 0;
 
   ///
-  // Return the number of bytes.
+  /// Return the number of bytes.
   ///
   /*--cef()--*/
   virtual size_t GetBytesCount() = 0;
 
   ///
-  // Read up to |size| bytes into |bytes| and return the number of bytes
-  // actually read.
+  /// Read up to |size| bytes into |bytes| and return the number of bytes
+  /// actually read.
   ///
   /*--cef()--*/
   virtual size_t GetBytes(size_t size, void* bytes) = 0;
diff --git a/src/include/cef_request_context.h b/src/include/cef_request_context.h
index edb65da..1ecaf44 100644
--- a/src/include/cef_request_context.h
+++ b/src/include/cef_request_context.h
@@ -45,21 +45,22 @@
 #include "include/cef_extension.h"
 #include "include/cef_extension_handler.h"
 #include "include/cef_media_router.h"
+#include "include/cef_preference.h"
 #include "include/cef_values.h"
 
 class CefRequestContextHandler;
 class CefSchemeHandlerFactory;
 
 ///
-// Callback interface for CefRequestContext::ResolveHost.
+/// Callback interface for CefRequestContext::ResolveHost.
 ///
 /*--cef(source=client)--*/
 class CefResolveCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Called on the UI thread after the ResolveHost request has completed.
-  // |result| will be the result code. |resolved_ips| will be the list of
-  // resolved IP addresses or empty if the resolution failed.
+  /// Called on the UI thread after the ResolveHost request has completed.
+  /// |result| will be the result code. |resolved_ips| will be the list of
+  /// resolved IP addresses or empty if the resolution failed.
   ///
   /*--cef(optional_param=resolved_ips)--*/
   virtual void OnResolveCompleted(
@@ -68,33 +69,33 @@
 };
 
 ///
-// A request context provides request handling for a set of related browser
-// or URL request objects. A request context can be specified when creating a
-// new browser via the CefBrowserHost static factory methods or when creating a
-// new URL request via the CefURLRequest static factory methods. Browser objects
-// with different request contexts will never be hosted in the same render
-// process. Browser objects with the same request context may or may not be
-// hosted in the same render process depending on the process model. Browser
-// objects created indirectly via the JavaScript window.open function or
-// targeted links will share the same render process and the same request
-// context as the source browser. When running in single-process mode there is
-// only a single render process (the main process) and so all browsers created
-// in single-process mode will share the same request context. This will be the
-// first request context passed into a CefBrowserHost static factory method and
-// all other request context objects will be ignored.
+/// A request context provides request handling for a set of related browser
+/// or URL request objects. A request context can be specified when creating a
+/// new browser via the CefBrowserHost static factory methods or when creating a
+/// new URL request via the CefURLRequest static factory methods. Browser
+/// objects with different request contexts will never be hosted in the same
+/// render process. Browser objects with the same request context may or may not
+/// be hosted in the same render process depending on the process model. Browser
+/// objects created indirectly via the JavaScript window.open function or
+/// targeted links will share the same render process and the same request
+/// context as the source browser. When running in single-process mode there is
+/// only a single render process (the main process) and so all browsers created
+/// in single-process mode will share the same request context. This will be the
+/// first request context passed into a CefBrowserHost static factory method and
+/// all other request context objects will be ignored.
 ///
 /*--cef(source=library,no_debugct_check)--*/
-class CefRequestContext : public virtual CefBaseRefCounted {
+class CefRequestContext : public CefPreferenceManager {
  public:
   ///
-  // Returns the global context object.
+  /// Returns the global context object.
   ///
   /*--cef()--*/
   static CefRefPtr<CefRequestContext> GetGlobalContext();
 
   ///
-  // Creates a new context object with the specified |settings| and optional
-  // |handler|.
+  /// Creates a new context object with the specified |settings| and optional
+  /// |handler|.
   ///
   /*--cef(optional_param=handler)--*/
   static CefRefPtr<CefRequestContext> CreateContext(
@@ -102,8 +103,8 @@
       CefRefPtr<CefRequestContextHandler> handler);
 
   ///
-  // Creates a new context object that shares storage with |other| and uses an
-  // optional |handler|.
+  /// Creates a new context object that shares storage with |other| and uses an
+  /// optional |handler|.
   ///
   /*--cef(capi_name=cef_create_context_shared,optional_param=handler)--*/
   static CefRefPtr<CefRequestContext> CreateContext(
@@ -111,60 +112,60 @@
       CefRefPtr<CefRequestContextHandler> handler);
 
   ///
-  // Returns true if this object is pointing to the same context as |that|
-  // object.
+  /// Returns true if this object is pointing to the same context as |that|
+  /// object.
   ///
   /*--cef()--*/
   virtual bool IsSame(CefRefPtr<CefRequestContext> other) = 0;
 
   ///
-  // Returns true if this object is sharing the same storage as |that| object.
+  /// Returns true if this object is sharing the same storage as |that| object.
   ///
   /*--cef()--*/
   virtual bool IsSharingWith(CefRefPtr<CefRequestContext> other) = 0;
 
   ///
-  // Returns true if this object is the global context. The global context is
-  // used by default when creating a browser or URL request with a NULL context
-  // argument.
+  /// Returns true if this object is the global context. The global context is
+  /// used by default when creating a browser or URL request with a NULL context
+  /// argument.
   ///
   /*--cef()--*/
   virtual bool IsGlobal() = 0;
 
   ///
-  // Returns the handler for this context if any.
+  /// Returns the handler for this context if any.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefRequestContextHandler> GetHandler() = 0;
 
   ///
-  // Returns the cache path for this object. If empty an "incognito mode"
-  // in-memory cache is being used.
+  /// Returns the cache path for this object. If empty an "incognito mode"
+  /// in-memory cache is being used.
   ///
   /*--cef()--*/
   virtual CefString GetCachePath() = 0;
 
   ///
-  // Returns the cookie manager for this object. If |callback| is non-NULL it
-  // will be executed asnychronously on the IO thread after the manager's
-  // storage has been initialized.
+  /// Returns the cookie manager for this object. If |callback| is non-NULL it
+  /// will be executed asnychronously on the UI thread after the manager's
+  /// storage has been initialized.
   ///
   /*--cef(optional_param=callback)--*/
   virtual CefRefPtr<CefCookieManager> GetCookieManager(
       CefRefPtr<CefCompletionCallback> callback) = 0;
 
   ///
-  // Register a scheme handler factory for the specified |scheme_name| and
-  // optional |domain_name|. An empty |domain_name| value for a standard scheme
-  // will cause the factory to match all domain names. The |domain_name| value
-  // will be ignored for non-standard schemes. If |scheme_name| is a built-in
-  // scheme and no handler is returned by |factory| then the built-in scheme
-  // handler factory will be called. If |scheme_name| is a custom scheme then
-  // you must also implement the CefApp::OnRegisterCustomSchemes() method in all
-  // processes. This function may be called multiple times to change or remove
-  // the factory that matches the specified |scheme_name| and optional
-  // |domain_name|. Returns false if an error occurs. This function may be
-  // called on any thread in the browser process.
+  /// Register a scheme handler factory for the specified |scheme_name| and
+  /// optional |domain_name|. An empty |domain_name| value for a standard scheme
+  /// will cause the factory to match all domain names. The |domain_name| value
+  /// will be ignored for non-standard schemes. If |scheme_name| is a built-in
+  /// scheme and no handler is returned by |factory| then the built-in scheme
+  /// handler factory will be called. If |scheme_name| is a custom scheme then
+  /// you must also implement the CefApp::OnRegisterCustomSchemes() method in
+  /// all processes. This function may be called multiple times to change or
+  /// remove the factory that matches the specified |scheme_name| and optional
+  /// |domain_name|. Returns false if an error occurs. This function may be
+  /// called on any thread in the browser process.
   ///
   /*--cef(optional_param=domain_name,optional_param=factory)--*/
   virtual bool RegisterSchemeHandlerFactory(
@@ -173,154 +174,97 @@
       CefRefPtr<CefSchemeHandlerFactory> factory) = 0;
 
   ///
-  // Clear all registered scheme handler factories. Returns false on error. This
-  // function may be called on any thread in the browser process.
+  /// Clear all registered scheme handler factories. Returns false on error.
+  /// This function may be called on any thread in the browser process.
   ///
   /*--cef()--*/
   virtual bool ClearSchemeHandlerFactories() = 0;
 
   ///
-  // Tells all renderer processes associated with this context to throw away
-  // their plugin list cache. If |reload_pages| is true they will also reload
-  // all pages with plugins. CefRequestContextHandler::OnBeforePluginLoad may
-  // be called to rebuild the plugin list cache.
-  ///
-  /*--cef()--*/
-  virtual void PurgePluginListCache(bool reload_pages) = 0;
-
-  ///
-  // Returns true if a preference with the specified |name| exists. This method
-  // must be called on the browser process UI thread.
-  ///
-  /*--cef()--*/
-  virtual bool HasPreference(const CefString& name) = 0;
-
-  ///
-  // Returns the value for the preference with the specified |name|. Returns
-  // NULL if the preference does not exist. The returned object contains a copy
-  // of the underlying preference value and modifications to the returned object
-  // will not modify the underlying preference value. This method must be called
-  // on the browser process UI thread.
-  ///
-  /*--cef()--*/
-  virtual CefRefPtr<CefValue> GetPreference(const CefString& name) = 0;
-
-  ///
-  // Returns all preferences as a dictionary. If |include_defaults| is true then
-  // preferences currently at their default value will be included. The returned
-  // object contains a copy of the underlying preference values and
-  // modifications to the returned object will not modify the underlying
-  // preference values. This method must be called on the browser process UI
-  // thread.
-  ///
-  /*--cef()--*/
-  virtual CefRefPtr<CefDictionaryValue> GetAllPreferences(
-      bool include_defaults) = 0;
-
-  ///
-  // Returns true if the preference with the specified |name| can be modified
-  // using SetPreference. As one example preferences set via the command-line
-  // usually cannot be modified. This method must be called on the browser
-  // process UI thread.
-  ///
-  /*--cef()--*/
-  virtual bool CanSetPreference(const CefString& name) = 0;
-
-  ///
-  // Set the |value| associated with preference |name|. Returns true if the
-  // value is set successfully and false otherwise. If |value| is NULL the
-  // preference will be restored to its default value. If setting the preference
-  // fails then |error| will be populated with a detailed description of the
-  // problem. This method must be called on the browser process UI thread.
-  ///
-  /*--cef(optional_param=value)--*/
-  virtual bool SetPreference(const CefString& name,
-                             CefRefPtr<CefValue> value,
-                             CefString& error) = 0;
-
-  ///
-  // Clears all certificate exceptions that were added as part of handling
-  // CefRequestHandler::OnCertificateError(). If you call this it is
-  // recommended that you also call CloseAllConnections() or you risk not
-  // being prompted again for server certificates if you reconnect quickly.
-  // If |callback| is non-NULL it will be executed on the UI thread after
-  // completion.
+  /// Clears all certificate exceptions that were added as part of handling
+  /// CefRequestHandler::OnCertificateError(). If you call this it is
+  /// recommended that you also call CloseAllConnections() or you risk not
+  /// being prompted again for server certificates if you reconnect quickly.
+  /// If |callback| is non-NULL it will be executed on the UI thread after
+  /// completion.
   ///
   /*--cef(optional_param=callback)--*/
   virtual void ClearCertificateExceptions(
       CefRefPtr<CefCompletionCallback> callback) = 0;
 
   ///
-  // Clears all HTTP authentication credentials that were added as part of
-  // handling GetAuthCredentials. If |callback| is non-NULL it will be executed
-  // on the UI thread after completion.
+  /// Clears all HTTP authentication credentials that were added as part of
+  /// handling GetAuthCredentials. If |callback| is non-NULL it will be executed
+  /// on the UI thread after completion.
   ///
   /*--cef(optional_param=callback)--*/
   virtual void ClearHttpAuthCredentials(
       CefRefPtr<CefCompletionCallback> callback) = 0;
 
   ///
-  // Clears all active and idle connections that Chromium currently has.
-  // This is only recommended if you have released all other CEF objects but
-  // don't yet want to call CefShutdown(). If |callback| is non-NULL it will be
-  // executed on the UI thread after completion.
+  /// Clears all active and idle connections that Chromium currently has.
+  /// This is only recommended if you have released all other CEF objects but
+  /// don't yet want to call CefShutdown(). If |callback| is non-NULL it will be
+  /// executed on the UI thread after completion.
   ///
   /*--cef(optional_param=callback)--*/
   virtual void CloseAllConnections(
       CefRefPtr<CefCompletionCallback> callback) = 0;
 
   ///
-  // Attempts to resolve |origin| to a list of associated IP addresses.
-  // |callback| will be executed on the UI thread after completion.
+  /// Attempts to resolve |origin| to a list of associated IP addresses.
+  /// |callback| will be executed on the UI thread after completion.
   ///
   /*--cef()--*/
   virtual void ResolveHost(const CefString& origin,
                            CefRefPtr<CefResolveCallback> callback) = 0;
 
   ///
-  // Load an extension.
-  //
-  // If extension resources will be read from disk using the default load
-  // implementation then |root_directory| should be the absolute path to the
-  // extension resources directory and |manifest| should be NULL. If extension
-  // resources will be provided by the client (e.g. via CefRequestHandler and/or
-  // CefExtensionHandler) then |root_directory| should be a path component
-  // unique to the extension (if not absolute this will be internally prefixed
-  // with the PK_DIR_RESOURCES path) and |manifest| should contain the contents
-  // that would otherwise be read from the "manifest.json" file on disk.
-  //
-  // The loaded extension will be accessible in all contexts sharing the same
-  // storage (HasExtension returns true). However, only the context on which
-  // this method was called is considered the loader (DidLoadExtension returns
-  // true) and only the loader will receive CefRequestContextHandler callbacks
-  // for the extension.
-  //
-  // CefExtensionHandler::OnExtensionLoaded will be called on load success or
-  // CefExtensionHandler::OnExtensionLoadFailed will be called on load failure.
-  //
-  // If the extension specifies a background script via the "background"
-  // manifest key then CefExtensionHandler::OnBeforeBackgroundBrowser will be
-  // called to create the background browser. See that method for additional
-  // information about background scripts.
-  //
-  // For visible extension views the client application should evaluate the
-  // manifest to determine the correct extension URL to load and then pass that
-  // URL to the CefBrowserHost::CreateBrowser* function after the extension has
-  // loaded. For example, the client can look for the "browser_action" manifest
-  // key as documented at https://developer.chrome.com/extensions/browserAction.
-  // Extension URLs take the form "chrome-extension://<extension_id>/<path>".
-  //
-  // Browsers that host extensions differ from normal browsers as follows:
-  //  - Can access chrome.* JavaScript APIs if allowed by the manifest. Visit
-  //    chrome://extensions-support for the list of extension APIs currently
-  //    supported by CEF.
-  //  - Main frame navigation to non-extension content is blocked.
-  //  - Pinch-zooming is disabled.
-  //  - CefBrowserHost::GetExtension returns the hosted extension.
-  //  - CefBrowserHost::IsBackgroundHost returns true for background hosts.
-  //
-  // See https://developer.chrome.com/extensions for extension implementation
-  // and usage documentation.
+  /// Load an extension.
+  ///
+  /// If extension resources will be read from disk using the default load
+  /// implementation then |root_directory| should be the absolute path to the
+  /// extension resources directory and |manifest| should be NULL. If extension
+  /// resources will be provided by the client (e.g. via CefRequestHandler
+  /// and/or CefExtensionHandler) then |root_directory| should be a path
+  /// component unique to the extension (if not absolute this will be internally
+  /// prefixed with the PK_DIR_RESOURCES path) and |manifest| should contain the
+  /// contents that would otherwise be read from the "manifest.json" file on
+  /// disk.
+  ///
+  /// The loaded extension will be accessible in all contexts sharing the same
+  /// storage (HasExtension returns true). However, only the context on which
+  /// this method was called is considered the loader (DidLoadExtension returns
+  /// true) and only the loader will receive CefRequestContextHandler callbacks
+  /// for the extension.
+  ///
+  /// CefExtensionHandler::OnExtensionLoaded will be called on load success or
+  /// CefExtensionHandler::OnExtensionLoadFailed will be called on load failure.
+  ///
+  /// If the extension specifies a background script via the "background"
+  /// manifest key then CefExtensionHandler::OnBeforeBackgroundBrowser will be
+  /// called to create the background browser. See that method for additional
+  /// information about background scripts.
+  ///
+  /// For visible extension views the client application should evaluate the
+  /// manifest to determine the correct extension URL to load and then pass that
+  /// URL to the CefBrowserHost::CreateBrowser* function after the extension has
+  /// loaded. For example, the client can look for the "browser_action" manifest
+  /// key as documented at
+  /// https://developer.chrome.com/extensions/browserAction. Extension URLs take
+  /// the form "chrome-extension://<extension_id>/<path>".
+  ///
+  /// Browsers that host extensions differ from normal browsers as follows:
+  ///  - Can access chrome.* JavaScript APIs if allowed by the manifest. Visit
+  ///    chrome://extensions-support for the list of extension APIs currently
+  ///    supported by CEF.
+  ///  - Main frame navigation to non-extension content is blocked.
+  ///  - Pinch-zooming is disabled.
+  ///  - CefBrowserHost::GetExtension returns the hosted extension.
+  ///  - CefBrowserHost::IsBackgroundHost returns true for background hosts.
+  ///
+  /// See https://developer.chrome.com/extensions for extension implementation
+  /// and usage documentation.
   ///
   /*--cef(optional_param=manifest,optional_param=handler)--*/
   virtual void LoadExtension(const CefString& root_directory,
@@ -328,46 +272,115 @@
                              CefRefPtr<CefExtensionHandler> handler) = 0;
 
   ///
-  // Returns true if this context was used to load the extension identified by
-  // |extension_id|. Other contexts sharing the same storage will also have
-  // access to the extension (see HasExtension). This method must be called on
-  // the browser process UI thread.
+  /// Returns true if this context was used to load the extension identified by
+  /// |extension_id|. Other contexts sharing the same storage will also have
+  /// access to the extension (see HasExtension). This method must be called on
+  /// the browser process UI thread.
   ///
   /*--cef()--*/
   virtual bool DidLoadExtension(const CefString& extension_id) = 0;
 
   ///
-  // Returns true if this context has access to the extension identified by
-  // |extension_id|. This may not be the context that was used to load the
-  // extension (see DidLoadExtension). This method must be called on the browser
-  // process UI thread.
+  /// Returns true if this context has access to the extension identified by
+  /// |extension_id|. This may not be the context that was used to load the
+  /// extension (see DidLoadExtension). This method must be called on the
+  /// browser process UI thread.
   ///
   /*--cef()--*/
   virtual bool HasExtension(const CefString& extension_id) = 0;
 
   ///
-  // Retrieve the list of all extensions that this context has access to (see
-  // HasExtension). |extension_ids| will be populated with the list of extension
-  // ID values. Returns true on success. This method must be called on the
-  // browser process UI thread.
+  /// Retrieve the list of all extensions that this context has access to (see
+  /// HasExtension). |extension_ids| will be populated with the list of
+  /// extension ID values. Returns true on success. This method must be called
+  /// on the browser process UI thread.
   ///
   /*--cef()--*/
   virtual bool GetExtensions(std::vector<CefString>& extension_ids) = 0;
 
   ///
-  // Returns the extension matching |extension_id| or NULL if no matching
-  // extension is accessible in this context (see HasExtension). This method
-  // must be called on the browser process UI thread.
+  /// Returns the extension matching |extension_id| or NULL if no matching
+  /// extension is accessible in this context (see HasExtension). This method
+  /// must be called on the browser process UI thread.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefExtension> GetExtension(
       const CefString& extension_id) = 0;
 
   ///
-  // Returns the MediaRouter object associated with this context.
+  /// Returns the MediaRouter object associated with this context.  If
+  /// |callback| is non-NULL it will be executed asnychronously on the UI thread
+  /// after the manager's context has been initialized.
   ///
-  /*--cef()--*/
-  virtual CefRefPtr<CefMediaRouter> GetMediaRouter() = 0;
+  /*--cef(optional_param=callback)--*/
+  virtual CefRefPtr<CefMediaRouter> GetMediaRouter(
+      CefRefPtr<CefCompletionCallback> callback) = 0;
+
+  ///
+  /// Returns the current value for |content_type| that applies for the
+  /// specified URLs. If both URLs are empty the default value will be returned.
+  /// Returns nullptr if no value is configured. Must be called on the browser
+  /// process UI thread.
+  ///
+  /*--cef(optional_param=requesting_url,optional_param=top_level_url)--*/
+  virtual CefRefPtr<CefValue> GetWebsiteSetting(
+      const CefString& requesting_url,
+      const CefString& top_level_url,
+      cef_content_setting_types_t content_type) = 0;
+
+  ///
+  /// Sets the current value for |content_type| for the specified URLs in the
+  /// default scope. If both URLs are empty, and the context is not incognito,
+  /// the default value will be set. Pass nullptr for |value| to remove the
+  /// default value for this content type.
+  ///
+  /// WARNING: Incorrect usage of this method may cause instability or security
+  /// issues in Chromium. Make sure that you first understand the potential
+  /// impact of any changes to |content_type| by reviewing the related source
+  /// code in Chromium. For example, if you plan to modify
+  /// CEF_CONTENT_SETTING_TYPE_POPUPS, first review and understand the usage of
+  /// ContentSettingsType::POPUPS in Chromium:
+  /// https://source.chromium.org/search?q=ContentSettingsType::POPUPS
+  ///
+  /*--cef(optional_param=requesting_url,optional_param=top_level_url,
+          optional_param=value)--*/
+  virtual void SetWebsiteSetting(const CefString& requesting_url,
+                                 const CefString& top_level_url,
+                                 cef_content_setting_types_t content_type,
+                                 CefRefPtr<CefValue> value) = 0;
+
+  ///
+  /// Returns the current value for |content_type| that applies for the
+  /// specified URLs. If both URLs are empty the default value will be returned.
+  /// Returns CEF_CONTENT_SETTING_VALUE_DEFAULT if no value is configured. Must
+  /// be called on the browser process UI thread.
+  ///
+  /*--cef(optional_param=requesting_url,optional_param=top_level_url,
+          default_retval=CEF_CONTENT_SETTING_VALUE_DEFAULT)--*/
+  virtual cef_content_setting_values_t GetContentSetting(
+      const CefString& requesting_url,
+      const CefString& top_level_url,
+      cef_content_setting_types_t content_type) = 0;
+
+  ///
+  /// Sets the current value for |content_type| for the specified URLs in the
+  /// default scope. If both URLs are empty, and the context is not incognito,
+  /// the default value will be set. Pass CEF_CONTENT_SETTING_VALUE_DEFAULT for
+  /// |value| to use the default value for this content type.
+  ///
+  /// WARNING: Incorrect usage of this method may cause instability or security
+  /// issues in Chromium. Make sure that you first understand the potential
+  /// impact of any changes to |content_type| by reviewing the related source
+  /// code in Chromium. For example, if you plan to modify
+  /// CEF_CONTENT_SETTING_TYPE_POPUPS, first review and understand the usage of
+  /// ContentSettingsType::POPUPS in Chromium:
+  /// https://source.chromium.org/search?q=ContentSettingsType::POPUPS
+  ///
+  /*--cef(optional_param=requesting_url,optional_param=top_level_url)--*/
+  virtual void SetContentSetting(const CefString& requesting_url,
+                                 const CefString& top_level_url,
+                                 cef_content_setting_types_t content_type,
+                                 cef_content_setting_values_t value) = 0;
 };
 
 #endif  // CEF_INCLUDE_CEF_REQUEST_CONTEXT_H_
diff --git a/src/include/cef_request_context_handler.h b/src/include/cef_request_context_handler.h
index 13cf164..ac8c771 100644
--- a/src/include/cef_request_context_handler.h
+++ b/src/include/cef_request_context_handler.h
@@ -41,73 +41,43 @@
 #include "include/cef_base.h"
 #include "include/cef_browser.h"
 #include "include/cef_frame.h"
+#include "include/cef_preference.h"
 #include "include/cef_request.h"
 #include "include/cef_resource_request_handler.h"
-#include "include/cef_web_plugin.h"
 
 ///
-// Implement this interface to provide handler implementations. The handler
-// instance will not be released until all objects related to the context have
-// been destroyed.
+/// Implement this interface to provide handler implementations. The handler
+/// instance will not be released until all objects related to the context have
+/// been destroyed.
 ///
 /*--cef(source=client,no_debugct_check)--*/
 class CefRequestContextHandler : public virtual CefBaseRefCounted {
  public:
-  typedef cef_plugin_policy_t PluginPolicy;
-
   ///
-  // Called on the browser process UI thread immediately after the request
-  // context has been initialized.
+  /// Called on the browser process UI thread immediately after the request
+  /// context has been initialized.
   ///
   /*--cef()--*/
   virtual void OnRequestContextInitialized(
       CefRefPtr<CefRequestContext> request_context) {}
 
   ///
-  // Called on multiple browser process threads before a plugin instance is
-  // loaded. |mime_type| is the mime type of the plugin that will be loaded.
-  // |plugin_url| is the content URL that the plugin will load and may be empty.
-  // |is_main_frame| will be true if the plugin is being loaded in the main
-  // (top-level) frame, |top_origin_url| is the URL for the top-level frame that
-  // contains the plugin when loading a specific plugin instance or empty when
-  // building the initial list of enabled plugins for 'navigator.plugins'
-  // JavaScript state. |plugin_info| includes additional information about the
-  // plugin that will be loaded. |plugin_policy| is the recommended policy.
-  // Modify |plugin_policy| and return true to change the policy. Return false
-  // to use the recommended policy. The default plugin policy can be set at
-  // runtime using the `--plugin-policy=[allow|detect|block]` command-line flag.
-  // Decisions to mark a plugin as disabled by setting |plugin_policy| to
-  // PLUGIN_POLICY_DISABLED may be cached when |top_origin_url| is empty. To
-  // purge the plugin list cache and potentially trigger new calls to this
-  // method call CefRequestContext::PurgePluginListCache.
-  ///
-  /*--cef(optional_param=plugin_url,optional_param=top_origin_url)--*/
-  virtual bool OnBeforePluginLoad(const CefString& mime_type,
-                                  const CefString& plugin_url,
-                                  bool is_main_frame,
-                                  const CefString& top_origin_url,
-                                  CefRefPtr<CefWebPluginInfo> plugin_info,
-                                  PluginPolicy* plugin_policy) {
-    return false;
-  }
-
-  ///
-  // Called on the browser process IO thread before a resource request is
-  // initiated. The |browser| and |frame| values represent the source of the
-  // request, and may be NULL for requests originating from service workers or
-  // CefURLRequest. |request| represents the request contents and cannot be
-  // modified in this callback. |is_navigation| will be true if the resource
-  // request is a navigation. |is_download| will be true if the resource request
-  // is a download. |request_initiator| is the origin (scheme + domain) of the
-  // page that initiated the request. Set |disable_default_handling| to true to
-  // disable default handling of the request, in which case it will need to be
-  // handled via CefResourceRequestHandler::GetResourceHandler or it will be
-  // canceled. To allow the resource load to proceed with default handling
-  // return NULL. To specify a handler for the resource return a
-  // CefResourceRequestHandler object. This method will not be called if the
-  // client associated with |browser| returns a non-NULL value from
-  // CefRequestHandler::GetResourceRequestHandler for the same request
-  // (identified by CefRequest::GetIdentifier).
+  /// Called on the browser process IO thread before a resource request is
+  /// initiated. The |browser| and |frame| values represent the source of the
+  /// request, and may be NULL for requests originating from service workers or
+  /// CefURLRequest. |request| represents the request contents and cannot be
+  /// modified in this callback. |is_navigation| will be true if the resource
+  /// request is a navigation. |is_download| will be true if the resource
+  /// request is a download. |request_initiator| is the origin (scheme + domain)
+  /// of the page that initiated the request. Set |disable_default_handling| to
+  /// true to disable default handling of the request, in which case it will
+  /// need to be handled via CefResourceRequestHandler::GetResourceHandler or it
+  /// will be canceled. To allow the resource load to proceed with default
+  /// handling return NULL. To specify a handler for the resource return a
+  /// CefResourceRequestHandler object. This method will not be called if the
+  /// client associated with |browser| returns a non-NULL value from
+  /// CefRequestHandler::GetResourceRequestHandler for the same request
+  /// (identified by CefRequest::GetIdentifier).
   ///
   /*--cef(optional_param=browser,optional_param=frame,
           optional_param=request_initiator)--*/
diff --git a/src/include/cef_request_handler.h b/src/include/cef_request_handler.h
index c255057..edeefbd 100644
--- a/src/include/cef_request_handler.h
+++ b/src/include/cef_request_handler.h
@@ -43,30 +43,30 @@
 #include "include/cef_auth_callback.h"
 #include "include/cef_base.h"
 #include "include/cef_browser.h"
+#include "include/cef_callback.h"
 #include "include/cef_frame.h"
 #include "include/cef_request.h"
-#include "include/cef_request_callback.h"
 #include "include/cef_resource_request_handler.h"
 #include "include/cef_ssl_info.h"
 #include "include/cef_x509_certificate.h"
 
 ///
-// Callback interface used to select a client certificate for authentication.
+/// Callback interface used to select a client certificate for authentication.
 ///
 /*--cef(source=library)--*/
 class CefSelectClientCertificateCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Chooses the specified certificate for client certificate authentication.
-  // NULL value means that no client certificate should be used.
+  /// Chooses the specified certificate for client certificate authentication.
+  /// NULL value means that no client certificate should be used.
   ///
   /*--cef(optional_param=cert)--*/
   virtual void Select(CefRefPtr<CefX509Certificate> cert) = 0;
 };
 
 ///
-// Implement this interface to handle events related to browser requests. The
-// methods of this class will be called on the thread indicated.
+/// Implement this interface to handle events related to browser requests. The
+/// methods of this class will be called on the thread indicated.
 ///
 /*--cef(source=client)--*/
 class CefRequestHandler : public virtual CefBaseRefCounted {
@@ -76,16 +76,16 @@
   typedef std::vector<CefRefPtr<CefX509Certificate>> X509CertificateList;
 
   ///
-  // Called on the UI thread before browser navigation. Return true to cancel
-  // the navigation or false to allow the navigation to proceed. The |request|
-  // object cannot be modified in this callback.
-  // CefLoadHandler::OnLoadingStateChange will be called twice in all cases.
-  // If the navigation is allowed CefLoadHandler::OnLoadStart and
-  // CefLoadHandler::OnLoadEnd will be called. If the navigation is canceled
-  // CefLoadHandler::OnLoadError will be called with an |errorCode| value of
-  // ERR_ABORTED. The |user_gesture| value will be true if the browser
-  // navigated via explicit user gesture (e.g. clicking a link) or false if it
-  // navigated automatically (e.g. via the DomContentLoaded event).
+  /// Called on the UI thread before browser navigation. Return true to cancel
+  /// the navigation or false to allow the navigation to proceed. The |request|
+  /// object cannot be modified in this callback.
+  /// CefLoadHandler::OnLoadingStateChange will be called twice in all cases.
+  /// If the navigation is allowed CefLoadHandler::OnLoadStart and
+  /// CefLoadHandler::OnLoadEnd will be called. If the navigation is canceled
+  /// CefLoadHandler::OnLoadError will be called with an |errorCode| value of
+  /// ERR_ABORTED. The |user_gesture| value will be true if the browser
+  /// navigated via explicit user gesture (e.g. clicking a link) or false if it
+  /// navigated automatically (e.g. via the DomContentLoaded event).
   ///
   /*--cef()--*/
   virtual bool OnBeforeBrowse(CefRefPtr<CefBrowser> browser,
@@ -97,20 +97,20 @@
   }
 
   ///
-  // Called on the UI thread before OnBeforeBrowse in certain limited cases
-  // where navigating a new or different browser might be desirable. This
-  // includes user-initiated navigation that might open in a special way (e.g.
-  // links clicked via middle-click or ctrl + left-click) and certain types of
-  // cross-origin navigation initiated from the renderer process (e.g.
-  // navigating the top-level frame to/from a file URL). The |browser| and
-  // |frame| values represent the source of the navigation. The
-  // |target_disposition| value indicates where the user intended to navigate
-  // the browser based on standard Chromium behaviors (e.g. current tab,
-  // new tab, etc). The |user_gesture| value will be true if the browser
-  // navigated via explicit user gesture (e.g. clicking a link) or false if it
-  // navigated automatically (e.g. via the DomContentLoaded event). Return true
-  // to cancel the navigation or false to allow the navigation to proceed in the
-  // source browser's top-level frame.
+  /// Called on the UI thread before OnBeforeBrowse in certain limited cases
+  /// where navigating a new or different browser might be desirable. This
+  /// includes user-initiated navigation that might open in a special way (e.g.
+  /// links clicked via middle-click or ctrl + left-click) and certain types of
+  /// cross-origin navigation initiated from the renderer process (e.g.
+  /// navigating the top-level frame to/from a file URL). The |browser| and
+  /// |frame| values represent the source of the navigation. The
+  /// |target_disposition| value indicates where the user intended to navigate
+  /// the browser based on standard Chromium behaviors (e.g. current tab,
+  /// new tab, etc). The |user_gesture| value will be true if the browser
+  /// navigated via explicit user gesture (e.g. clicking a link) or false if it
+  /// navigated automatically (e.g. via the DomContentLoaded event). Return true
+  /// to cancel the navigation or false to allow the navigation to proceed in
+  /// the source browser's top-level frame.
   ///
   /*--cef()--*/
   virtual bool OnOpenURLFromTab(CefRefPtr<CefBrowser> browser,
@@ -122,19 +122,19 @@
   }
 
   ///
-  // Called on the browser process IO thread before a resource request is
-  // initiated. The |browser| and |frame| values represent the source of the
-  // request. |request| represents the request contents and cannot be modified
-  // in this callback. |is_navigation| will be true if the resource request is a
-  // navigation. |is_download| will be true if the resource request is a
-  // download. |request_initiator| is the origin (scheme + domain) of the page
-  // that initiated the request. Set |disable_default_handling| to true to
-  // disable default handling of the request, in which case it will need to be
-  // handled via CefResourceRequestHandler::GetResourceHandler or it will be
-  // canceled. To allow the resource load to proceed with default handling
-  // return NULL. To specify a handler for the resource return a
-  // CefResourceRequestHandler object. If this callback returns NULL the same
-  // method will be called on the associated CefRequestContextHandler, if any.
+  /// Called on the browser process IO thread before a resource request is
+  /// initiated. The |browser| and |frame| values represent the source of the
+  /// request. |request| represents the request contents and cannot be modified
+  /// in this callback. |is_navigation| will be true if the resource request is
+  /// a navigation. |is_download| will be true if the resource request is a
+  /// download. |request_initiator| is the origin (scheme + domain) of the page
+  /// that initiated the request. Set |disable_default_handling| to true to
+  /// disable default handling of the request, in which case it will need to be
+  /// handled via CefResourceRequestHandler::GetResourceHandler or it will be
+  /// canceled. To allow the resource load to proceed with default handling
+  /// return NULL. To specify a handler for the resource return a
+  /// CefResourceRequestHandler object. If this callback returns NULL the same
+  /// method will be called on the associated CefRequestContextHandler, if any.
   ///
   /*--cef(optional_param=request_initiator)--*/
   virtual CefRefPtr<CefResourceRequestHandler> GetResourceRequestHandler(
@@ -149,16 +149,16 @@
   }
 
   ///
-  // Called on the IO thread when the browser needs credentials from the user.
-  // |origin_url| is the origin making this authentication request. |isProxy|
-  // indicates whether the host is a proxy server. |host| contains the hostname
-  // and |port| contains the port number. |realm| is the realm of the challenge
-  // and may be empty. |scheme| is the authentication scheme used, such as
-  // "basic" or "digest", and will be empty if the source of the request is an
-  // FTP server. Return true to continue the request and call
-  // CefAuthCallback::Continue() either in this method or at a later time when
-  // the authentication information is available. Return false to cancel the
-  // request immediately.
+  /// Called on the IO thread when the browser needs credentials from the user.
+  /// |origin_url| is the origin making this authentication request. |isProxy|
+  /// indicates whether the host is a proxy server. |host| contains the hostname
+  /// and |port| contains the port number. |realm| is the realm of the challenge
+  /// and may be empty. |scheme| is the authentication scheme used, such as
+  /// "basic" or "digest", and will be empty if the source of the request is an
+  /// FTP server. Return true to continue the request and call
+  /// CefAuthCallback::Continue() either in this method or at a later time when
+  /// the authentication information is available. Return false to cancel the
+  /// request immediately.
   ///
   /*--cef(optional_param=realm,optional_param=scheme)--*/
   virtual bool GetAuthCredentials(CefRefPtr<CefBrowser> browser,
@@ -173,49 +173,34 @@
   }
 
   ///
-  // Called on the IO thread when JavaScript requests a specific storage quota
-  // size via the webkitStorageInfo.requestQuota function. |origin_url| is the
-  // origin of the page making the request. |new_size| is the requested quota
-  // size in bytes. Return true to continue the request and call
-  // CefRequestCallback::Continue() either in this method or at a later time to
-  // grant or deny the request. Return false to cancel the request immediately.
-  ///
-  /*--cef()--*/
-  virtual bool OnQuotaRequest(CefRefPtr<CefBrowser> browser,
-                              const CefString& origin_url,
-                              int64 new_size,
-                              CefRefPtr<CefRequestCallback> callback) {
-    return false;
-  }
-
-  ///
-  // Called on the UI thread to handle requests for URLs with an invalid
-  // SSL certificate. Return true and call CefRequestCallback::Continue() either
-  // in this method or at a later time to continue or cancel the request. Return
-  // false to cancel the request immediately. If
-  // CefSettings.ignore_certificate_errors is set all invalid certificates will
-  // be accepted without calling this method.
+  /// Called on the UI thread to handle requests for URLs with an invalid
+  /// SSL certificate. Return true and call CefCallback methods either in this
+  /// method or at a later time to continue or cancel the request. Return false
+  /// to cancel the request immediately. If
+  /// cef_settings_t.ignore_certificate_errors is set all invalid certificates
+  /// will be accepted without calling this method.
   ///
   /*--cef()--*/
   virtual bool OnCertificateError(CefRefPtr<CefBrowser> browser,
                                   cef_errorcode_t cert_error,
                                   const CefString& request_url,
                                   CefRefPtr<CefSSLInfo> ssl_info,
-                                  CefRefPtr<CefRequestCallback> callback) {
+                                  CefRefPtr<CefCallback> callback) {
     return false;
   }
 
   ///
-  // Called on the UI thread when a client certificate is being requested for
-  // authentication. Return false to use the default behavior and automatically
-  // select the first certificate available. Return true and call
-  // CefSelectClientCertificateCallback::Select either in this method or at a
-  // later time to select a certificate. Do not call Select or call it with NULL
-  // to continue without using any certificate. |isProxy| indicates whether the
-  // host is an HTTPS proxy or the origin server. |host| and |port| contains the
-  // hostname and port of the SSL server. |certificates| is the list of
-  // certificates to choose from; this list has already been pruned by Chromium
-  // so that it only contains certificates from issuers that the server trusts.
+  /// Called on the UI thread when a client certificate is being requested for
+  /// authentication. Return false to use the default behavior and automatically
+  /// select the first certificate available. Return true and call
+  /// CefSelectClientCertificateCallback::Select either in this method or at a
+  /// later time to select a certificate. Do not call Select or call it with
+  /// NULL to continue without using any certificate. |isProxy| indicates
+  /// whether the host is an HTTPS proxy or the origin server. |host| and |port|
+  /// contains the hostname and port of the SSL server. |certificates| is the
+  /// list of certificates to choose from; this list has already been pruned by
+  /// Chromium so that it only contains certificates from issuers that the
+  /// server trusts.
   ///
   /*--cef()--*/
   virtual bool OnSelectClientCertificate(
@@ -229,33 +214,25 @@
   }
 
   ///
-  // Called on the browser process UI thread when a plugin has crashed.
-  // |plugin_path| is the path of the plugin that crashed.
-  ///
-  /*--cef()--*/
-  virtual void OnPluginCrashed(CefRefPtr<CefBrowser> browser,
-                               const CefString& plugin_path) {}
-
-  ///
-  // Called on the browser process UI thread when the render view associated
-  // with |browser| is ready to receive/handle IPC messages in the render
-  // process.
+  /// Called on the browser process UI thread when the render view associated
+  /// with |browser| is ready to receive/handle IPC messages in the render
+  /// process.
   ///
   /*--cef()--*/
   virtual void OnRenderViewReady(CefRefPtr<CefBrowser> browser) {}
 
   ///
-  // Called on the browser process UI thread when the render process
-  // terminates unexpectedly. |status| indicates how the process
-  // terminated.
+  /// Called on the browser process UI thread when the render process
+  /// terminates unexpectedly. |status| indicates how the process
+  /// terminated.
   ///
   /*--cef()--*/
   virtual void OnRenderProcessTerminated(CefRefPtr<CefBrowser> browser,
                                          TerminationStatus status) {}
 
   ///
-  // Called on the browser process UI thread when the window.document object of
-  // the main frame has been created.
+  /// Called on the browser process UI thread when the window.document object of
+  /// the main frame has been created.
   ///
   /*--cef()--*/
   virtual void OnDocumentAvailableInMainFrame(CefRefPtr<CefBrowser> browser) {}
diff --git a/src/include/cef_resource_bundle.h b/src/include/cef_resource_bundle.h
index c08f5b0..d235e1c 100644
--- a/src/include/cef_resource_bundle.h
+++ b/src/include/cef_resource_bundle.h
@@ -39,13 +39,14 @@
 #pragma once
 
 #include "include/cef_base.h"
+#include "include/cef_values.h"
 
 ///
-// Class used for retrieving resources from the resource bundle (*.pak) files
-// loaded by CEF during startup or via the CefResourceBundleHandler returned
-// from CefApp::GetResourceBundleHandler. See CefSettings for additional options
-// related to resource bundle loading. The methods of this class may be called
-// on any thread unless otherwise indicated.
+/// Class used for retrieving resources from the resource bundle (*.pak) files
+/// loaded by CEF during startup or via the CefResourceBundleHandler returned
+/// from CefApp::GetResourceBundleHandler. See CefSettings for additional
+/// options related to resource bundle loading. The methods of this class may be
+/// called on any thread unless otherwise indicated.
 ///
 /*--cef(source=library,no_debugct_check)--*/
 class CefResourceBundle : public virtual CefBaseRefCounted {
@@ -53,47 +54,38 @@
   typedef cef_scale_factor_t ScaleFactor;
 
   ///
-  // Returns the global resource bundle instance.
+  /// Returns the global resource bundle instance.
   ///
   /*--cef()--*/
   static CefRefPtr<CefResourceBundle> GetGlobal();
 
   ///
-  // Returns the localized string for the specified |string_id| or an empty
-  // string if the value is not found. Include cef_pack_strings.h for a listing
-  // of valid string ID values.
+  /// Returns the localized string for the specified |string_id| or an empty
+  /// string if the value is not found. Include cef_pack_strings.h for a listing
+  /// of valid string ID values.
   ///
   /*--cef()--*/
   virtual CefString GetLocalizedString(int string_id) = 0;
 
   ///
-  // Retrieves the contents of the specified scale independent |resource_id|.
-  // If the value is found then |data| and |data_size| will be populated and
-  // this method will return true. If the value is not found then this method
-  // will return false. The returned |data| pointer will remain resident in
-  // memory and should not be freed. Include cef_pack_resources.h for a listing
-  // of valid resource ID values.
+  /// Returns a CefBinaryValue containing the decompressed contents of the
+  /// specified scale independent |resource_id| or NULL if not found. Include
+  /// cef_pack_resources.h for a listing of valid resource ID values.
   ///
   /*--cef()--*/
-  virtual bool GetDataResource(int resource_id,
-                               void*& data,
-                               size_t& data_size) = 0;
+  virtual CefRefPtr<CefBinaryValue> GetDataResource(int resource_id) = 0;
 
   ///
-  // Retrieves the contents of the specified |resource_id| nearest the scale
-  // factor |scale_factor|. Use a |scale_factor| value of SCALE_FACTOR_NONE for
-  // scale independent resources or call GetDataResource instead. If the value
-  // is found then |data| and |data_size| will be populated and this method will
-  // return true. If the value is not found then this method will return false.
-  // The returned |data| pointer will remain resident in memory and should not
-  // be freed. Include cef_pack_resources.h for a listing of valid resource ID
-  // values.
+  /// Returns a CefBinaryValue containing the decompressed contents of the
+  /// specified |resource_id| nearest the scale factor |scale_factor| or NULL if
+  /// not found. Use a |scale_factor| value of SCALE_FACTOR_NONE for scale
+  /// independent resources or call GetDataResource instead.Include
+  /// cef_pack_resources.h for a listing of valid resource ID values.
   ///
   /*--cef()--*/
-  virtual bool GetDataResourceForScale(int resource_id,
-                                       ScaleFactor scale_factor,
-                                       void*& data,
-                                       size_t& data_size) = 0;
+  virtual CefRefPtr<CefBinaryValue> GetDataResourceForScale(
+      int resource_id,
+      ScaleFactor scale_factor) = 0;
 };
 
 #endif  // CEF_INCLUDE_CEF_RESOURCE_BUNDLE_H_
diff --git a/src/include/cef_resource_bundle_handler.h b/src/include/cef_resource_bundle_handler.h
index 6cd6c9a..4743482 100644
--- a/src/include/cef_resource_bundle_handler.h
+++ b/src/include/cef_resource_bundle_handler.h
@@ -41,9 +41,9 @@
 #include "include/cef_base.h"
 
 ///
-// Class used to implement a custom resource bundle interface. See CefSettings
-// for additional options related to resource bundle loading. The methods of
-// this class may be called on multiple threads.
+/// Class used to implement a custom resource bundle interface. See CefSettings
+/// for additional options related to resource bundle loading. The methods of
+/// this class may be called on multiple threads.
 ///
 /*--cef(source=client)--*/
 class CefResourceBundleHandler : public virtual CefBaseRefCounted {
@@ -51,21 +51,21 @@
   typedef cef_scale_factor_t ScaleFactor;
 
   ///
-  // Called to retrieve a localized translation for the specified |string_id|.
-  // To provide the translation set |string| to the translation string and
-  // return true. To use the default translation return false. Include
-  // cef_pack_strings.h for a listing of valid string ID values.
+  /// Called to retrieve a localized translation for the specified |string_id|.
+  /// To provide the translation set |string| to the translation string and
+  /// return true. To use the default translation return false. Include
+  /// cef_pack_strings.h for a listing of valid string ID values.
   ///
   /*--cef()--*/
   virtual bool GetLocalizedString(int string_id, CefString& string) = 0;
 
   ///
-  // Called to retrieve data for the specified scale independent |resource_id|.
-  // To provide the resource data set |data| and |data_size| to the data pointer
-  // and size respectively and return true. To use the default resource data
-  // return false. The resource data will not be copied and must remain resident
-  // in memory. Include cef_pack_resources.h for a listing of valid resource ID
-  // values.
+  /// Called to retrieve data for the specified scale independent |resource_id|.
+  /// To provide the resource data set |data| and |data_size| to the data
+  /// pointer and size respectively and return true. To use the default resource
+  /// data return false. The resource data will not be copied and must remain
+  /// resident in memory. Include cef_pack_resources.h for a listing of valid
+  /// resource ID values.
   ///
   /*--cef()--*/
   virtual bool GetDataResource(int resource_id,
@@ -73,12 +73,12 @@
                                size_t& data_size) = 0;
 
   ///
-  // Called to retrieve data for the specified |resource_id| nearest the scale
-  // factor |scale_factor|. To provide the resource data set |data| and
-  // |data_size| to the data pointer and size respectively and return true. To
-  // use the default resource data return false. The resource data will not be
-  // copied and must remain resident in memory. Include cef_pack_resources.h for
-  // a listing of valid resource ID values.
+  /// Called to retrieve data for the specified |resource_id| nearest the scale
+  /// factor |scale_factor|. To provide the resource data set |data| and
+  /// |data_size| to the data pointer and size respectively and return true. To
+  /// use the default resource data return false. The resource data will not be
+  /// copied and must remain resident in memory. Include cef_pack_resources.h
+  /// for a listing of valid resource ID values.
   ///
   /*--cef()--*/
   virtual bool GetDataResourceForScale(int resource_id,
diff --git a/src/include/cef_resource_handler.h b/src/include/cef_resource_handler.h
index 4d9535e..9c43ee7 100644
--- a/src/include/cef_resource_handler.h
+++ b/src/include/cef_resource_handler.h
@@ -46,55 +46,55 @@
 #include "include/cef_response.h"
 
 ///
-// Callback for asynchronous continuation of CefResourceHandler::Skip().
+/// Callback for asynchronous continuation of CefResourceHandler::Skip().
 ///
 /*--cef(source=library)--*/
 class CefResourceSkipCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Callback for asynchronous continuation of Skip(). If |bytes_skipped| > 0
-  // then either Skip() will be called again until the requested number of
-  // bytes have been skipped or the request will proceed. If |bytes_skipped|
-  // <= 0 the request will fail with ERR_REQUEST_RANGE_NOT_SATISFIABLE.
+  /// Callback for asynchronous continuation of Skip(). If |bytes_skipped| > 0
+  /// then either Skip() will be called again until the requested number of
+  /// bytes have been skipped or the request will proceed. If |bytes_skipped|
+  /// <= 0 the request will fail with ERR_REQUEST_RANGE_NOT_SATISFIABLE.
   ///
   /*--cef(capi_name=cont)--*/
-  virtual void Continue(int64 bytes_skipped) = 0;
+  virtual void Continue(int64_t bytes_skipped) = 0;
 };
 
 ///
-// Callback for asynchronous continuation of CefResourceHandler::Read().
+/// Callback for asynchronous continuation of CefResourceHandler::Read().
 ///
 /*--cef(source=library)--*/
 class CefResourceReadCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Callback for asynchronous continuation of Read(). If |bytes_read| == 0
-  // the response will be considered complete. If |bytes_read| > 0 then Read()
-  // will be called again until the request is complete (based on either the
-  // result or the expected content length). If |bytes_read| < 0 then the
-  // request will fail and the |bytes_read| value will be treated as the error
-  // code.
+  /// Callback for asynchronous continuation of Read(). If |bytes_read| == 0
+  /// the response will be considered complete. If |bytes_read| > 0 then Read()
+  /// will be called again until the request is complete (based on either the
+  /// result or the expected content length). If |bytes_read| < 0 then the
+  /// request will fail and the |bytes_read| value will be treated as the error
+  /// code.
   ///
   /*--cef(capi_name=cont)--*/
   virtual void Continue(int bytes_read) = 0;
 };
 
 ///
-// Class used to implement a custom request handler interface. The methods of
-// this class will be called on the IO thread unless otherwise indicated.
+/// Class used to implement a custom request handler interface. The methods of
+/// this class will be called on the IO thread unless otherwise indicated.
 ///
 /*--cef(source=client)--*/
 class CefResourceHandler : public virtual CefBaseRefCounted {
  public:
   ///
-  // Open the response stream. To handle the request immediately set
-  // |handle_request| to true and return true. To decide at a later time set
-  // |handle_request| to false, return true, and execute |callback| to continue
-  // or cancel the request. To cancel the request immediately set
-  // |handle_request| to true and return false. This method will be called in
-  // sequence but not from a dedicated thread. For backwards compatibility set
-  // |handle_request| to false and return false and the ProcessRequest method
-  // will be called.
+  /// Open the response stream. To handle the request immediately set
+  /// |handle_request| to true and return true. To decide at a later time set
+  /// |handle_request| to false, return true, and execute |callback| to continue
+  /// or cancel the request. To cancel the request immediately set
+  /// |handle_request| to true and return false. This method will be called in
+  /// sequence but not from a dedicated thread. For backwards compatibility set
+  /// |handle_request| to false and return false and the ProcessRequest method
+  /// will be called.
   ///
   /*--cef()--*/
   virtual bool Open(CefRefPtr<CefRequest> request,
@@ -105,13 +105,13 @@
   }
 
   ///
-  // Begin processing the request. To handle the request return true and call
-  // CefCallback::Continue() once the response header information is available
-  // (CefCallback::Continue() can also be called from inside this method if
-  // header information is available immediately). To cancel the request return
-  // false.
-  //
-  // WARNING: This method is deprecated. Use Open instead.
+  /// Begin processing the request. To handle the request return true and call
+  /// CefCallback::Continue() once the response header information is available
+  /// (CefCallback::Continue() can also be called from inside this method if
+  /// header information is available immediately). To cancel the request return
+  /// false.
+  ///
+  /// WARNING: This method is deprecated. Use Open instead.
   ///
   /*--cef()--*/
   virtual bool ProcessRequest(CefRefPtr<CefRequest> request,
@@ -120,54 +120,54 @@
   }
 
   ///
-  // Retrieve response header information. If the response length is not known
-  // set |response_length| to -1 and ReadResponse() will be called until it
-  // returns false. If the response length is known set |response_length|
-  // to a positive value and ReadResponse() will be called until it returns
-  // false or the specified number of bytes have been read. Use the |response|
-  // object to set the mime type, http status code and other optional header
-  // values. To redirect the request to a new URL set |redirectUrl| to the new
-  // URL. |redirectUrl| can be either a relative or fully qualified URL.
-  // It is also possible to set |response| to a redirect http status code
-  // and pass the new URL via a Location header. Likewise with |redirectUrl| it
-  // is valid to set a relative or fully qualified URL as the Location header
-  // value. If an error occured while setting up the request you can call
-  // SetError() on |response| to indicate the error condition.
+  /// Retrieve response header information. If the response length is not known
+  /// set |response_length| to -1 and ReadResponse() will be called until it
+  /// returns false. If the response length is known set |response_length|
+  /// to a positive value and ReadResponse() will be called until it returns
+  /// false or the specified number of bytes have been read. Use the |response|
+  /// object to set the mime type, http status code and other optional header
+  /// values. To redirect the request to a new URL set |redirectUrl| to the new
+  /// URL. |redirectUrl| can be either a relative or fully qualified URL.
+  /// It is also possible to set |response| to a redirect http status code
+  /// and pass the new URL via a Location header. Likewise with |redirectUrl| it
+  /// is valid to set a relative or fully qualified URL as the Location header
+  /// value. If an error occured while setting up the request you can call
+  /// SetError() on |response| to indicate the error condition.
   ///
   /*--cef()--*/
   virtual void GetResponseHeaders(CefRefPtr<CefResponse> response,
-                                  int64& response_length,
+                                  int64_t& response_length,
                                   CefString& redirectUrl) = 0;
 
   ///
-  // Skip response data when requested by a Range header. Skip over and discard
-  // |bytes_to_skip| bytes of response data. If data is available immediately
-  // set |bytes_skipped| to the number of bytes skipped and return true. To
-  // read the data at a later time set |bytes_skipped| to 0, return true and
-  // execute |callback| when the data is available. To indicate failure set
-  // |bytes_skipped| to < 0 (e.g. -2 for ERR_FAILED) and return false. This
-  // method will be called in sequence but not from a dedicated thread.
+  /// Skip response data when requested by a Range header. Skip over and discard
+  /// |bytes_to_skip| bytes of response data. If data is available immediately
+  /// set |bytes_skipped| to the number of bytes skipped and return true. To
+  /// read the data at a later time set |bytes_skipped| to 0, return true and
+  /// execute |callback| when the data is available. To indicate failure set
+  /// |bytes_skipped| to < 0 (e.g. -2 for ERR_FAILED) and return false. This
+  /// method will be called in sequence but not from a dedicated thread.
   ///
   /*--cef()--*/
-  virtual bool Skip(int64 bytes_to_skip,
-                    int64& bytes_skipped,
+  virtual bool Skip(int64_t bytes_to_skip,
+                    int64_t& bytes_skipped,
                     CefRefPtr<CefResourceSkipCallback> callback) {
     bytes_skipped = -2;
     return false;
   }
 
   ///
-  // Read response data. If data is available immediately copy up to
-  // |bytes_to_read| bytes into |data_out|, set |bytes_read| to the number of
-  // bytes copied, and return true. To read the data at a later time keep a
-  // pointer to |data_out|, set |bytes_read| to 0, return true and execute
-  // |callback| when the data is available (|data_out| will remain valid until
-  // the callback is executed). To indicate response completion set |bytes_read|
-  // to 0 and return false. To indicate failure set |bytes_read| to < 0 (e.g. -2
-  // for ERR_FAILED) and return false. This method will be called in sequence
-  // but not from a dedicated thread. For backwards compatibility set
-  // |bytes_read| to -1 and return false and the ReadResponse method will be
-  // called.
+  /// Read response data. If data is available immediately copy up to
+  /// |bytes_to_read| bytes into |data_out|, set |bytes_read| to the number of
+  /// bytes copied, and return true. To read the data at a later time keep a
+  /// pointer to |data_out|, set |bytes_read| to 0, return true and execute
+  /// |callback| when the data is available (|data_out| will remain valid until
+  /// the callback is executed). To indicate response completion set
+  /// |bytes_read| to 0 and return false. To indicate failure set |bytes_read|
+  /// to < 0 (e.g. -2 for ERR_FAILED) and return false. This method will be
+  /// called in sequence but not from a dedicated thread. For backwards
+  /// compatibility set |bytes_read| to -1 and return false and the ReadResponse
+  /// method will be called.
   ///
   /*--cef()--*/
   virtual bool Read(void* data_out,
@@ -179,13 +179,13 @@
   }
 
   ///
-  // Read response data. If data is available immediately copy up to
-  // |bytes_to_read| bytes into |data_out|, set |bytes_read| to the number of
-  // bytes copied, and return true. To read the data at a later time set
-  // |bytes_read| to 0, return true and call CefCallback::Continue() when the
-  // data is available. To indicate response completion return false.
-  //
-  // WARNING: This method is deprecated. Use Skip and Read instead.
+  /// Read response data. If data is available immediately copy up to
+  /// |bytes_to_read| bytes into |data_out|, set |bytes_read| to the number of
+  /// bytes copied, and return true. To read the data at a later time set
+  /// |bytes_read| to 0, return true and call CefCallback::Continue() when the
+  /// data is available. To indicate response completion return false.
+  ///
+  /// WARNING: This method is deprecated. Use Skip and Read instead.
   ///
   /*--cef()--*/
   virtual bool ReadResponse(void* data_out,
@@ -197,7 +197,7 @@
   }
 
   ///
-  // Request processing has been canceled.
+  /// Request processing has been canceled.
   ///
   /*--cef()--*/
   virtual void Cancel() = 0;
diff --git a/src/include/cef_resource_request_handler.h b/src/include/cef_resource_request_handler.h
index d13afb3..572065b 100644
--- a/src/include/cef_resource_request_handler.h
+++ b/src/include/cef_resource_request_handler.h
@@ -40,9 +40,9 @@
 
 #include "include/cef_base.h"
 #include "include/cef_browser.h"
+#include "include/cef_callback.h"
 #include "include/cef_frame.h"
 #include "include/cef_request.h"
-#include "include/cef_request_callback.h"
 #include "include/cef_resource_handler.h"
 #include "include/cef_response.h"
 #include "include/cef_response_filter.h"
@@ -50,9 +50,9 @@
 class CefCookieAccessFilter;
 
 ///
-// Implement this interface to handle events related to browser requests. The
-// methods of this class will be called on the IO thread unless otherwise
-// indicated.
+/// Implement this interface to handle events related to browser requests. The
+/// methods of this class will be called on the IO thread unless otherwise
+/// indicated.
 ///
 /*--cef(source=client,no_debugct_check)--*/
 class CefResourceRequestHandler : public virtual CefBaseRefCounted {
@@ -61,11 +61,11 @@
   typedef cef_urlrequest_status_t URLRequestStatus;
 
   ///
-  // Called on the IO thread before a resource request is loaded. The |browser|
-  // and |frame| values represent the source of the request, and may be NULL for
-  // requests originating from service workers or CefURLRequest. To optionally
-  // filter cookies for the request return a CefCookieAccessFilter object. The
-  // |request| object cannot not be modified in this callback.
+  /// Called on the IO thread before a resource request is loaded. The |browser|
+  /// and |frame| values represent the source of the request, and may be NULL
+  /// for requests originating from service workers or CefURLRequest. To
+  /// optionally filter cookies for the request return a CefCookieAccessFilter
+  /// object. The |request| object cannot not be modified in this callback.
   ///
   /*--cef(optional_param=browser,optional_param=frame)--*/
   virtual CefRefPtr<CefCookieAccessFilter> GetCookieAccessFilter(
@@ -76,33 +76,32 @@
   }
 
   ///
-  // Called on the IO thread before a resource request is loaded. The |browser|
-  // and |frame| values represent the source of the request, and may be NULL for
-  // requests originating from service workers or CefURLRequest. To redirect or
-  // change the resource load optionally modify |request|. Modification of the
-  // request URL will be treated as a redirect. Return RV_CONTINUE to continue
-  // the request immediately. Return RV_CONTINUE_ASYNC and call
-  // CefRequestCallback:: Continue() at a later time to continue or cancel the
-  // request asynchronously. Return RV_CANCEL to cancel the request immediately.
-  //
+  /// Called on the IO thread before a resource request is loaded. The |browser|
+  /// and |frame| values represent the source of the request, and may be NULL
+  /// for requests originating from service workers or CefURLRequest. To
+  /// redirect or change the resource load optionally modify |request|.
+  /// Modification of the request URL will be treated as a redirect. Return
+  /// RV_CONTINUE to continue the request immediately. Return RV_CONTINUE_ASYNC
+  /// and call CefCallback methods at a later time to continue or cancel the
+  /// request asynchronously. Return RV_CANCEL to cancel the request
+  /// immediately.
   ///
   /*--cef(optional_param=browser,optional_param=frame,
           default_retval=RV_CONTINUE)--*/
-  virtual ReturnValue OnBeforeResourceLoad(
-      CefRefPtr<CefBrowser> browser,
-      CefRefPtr<CefFrame> frame,
-      CefRefPtr<CefRequest> request,
-      CefRefPtr<CefRequestCallback> callback) {
+  virtual ReturnValue OnBeforeResourceLoad(CefRefPtr<CefBrowser> browser,
+                                           CefRefPtr<CefFrame> frame,
+                                           CefRefPtr<CefRequest> request,
+                                           CefRefPtr<CefCallback> callback) {
     return RV_CONTINUE;
   }
 
   ///
-  // Called on the IO thread before a resource is loaded. The |browser| and
-  // |frame| values represent the source of the request, and may be NULL for
-  // requests originating from service workers or CefURLRequest. To allow the
-  // resource to load using the default network loader return NULL. To specify a
-  // handler for the resource return a CefResourceHandler object. The |request|
-  // object cannot not be modified in this callback.
+  /// Called on the IO thread before a resource is loaded. The |browser| and
+  /// |frame| values represent the source of the request, and may be NULL for
+  /// requests originating from service workers or CefURLRequest. To allow the
+  /// resource to load using the default network loader return NULL. To specify
+  /// a handler for the resource return a CefResourceHandler object. The
+  /// |request| object cannot not be modified in this callback.
   ///
   /*--cef(optional_param=browser,optional_param=frame)--*/
   virtual CefRefPtr<CefResourceHandler> GetResourceHandler(
@@ -113,14 +112,14 @@
   }
 
   ///
-  // Called on the IO thread when a resource load is redirected. The |browser|
-  // and |frame| values represent the source of the request, and may be NULL for
-  // requests originating from service workers or CefURLRequest. The |request|
-  // parameter will contain the old URL and other request-related information.
-  // The |response| parameter will contain the response that resulted in the
-  // redirect. The |new_url| parameter will contain the new URL and can be
-  // changed if desired. The |request| and |response| objects cannot be modified
-  // in this callback.
+  /// Called on the IO thread when a resource load is redirected. The |browser|
+  /// and |frame| values represent the source of the request, and may be NULL
+  /// for requests originating from service workers or CefURLRequest. The
+  /// |request| parameter will contain the old URL and other request-related
+  /// information. The |response| parameter will contain the response that
+  /// resulted in the redirect. The |new_url| parameter will contain the new URL
+  /// and can be changed if desired. The |request| and |response| objects cannot
+  /// be modified in this callback.
   ///
   /*--cef(optional_param=browser,optional_param=frame)--*/
   virtual void OnResourceRedirect(CefRefPtr<CefBrowser> browser,
@@ -130,17 +129,17 @@
                                   CefString& new_url) {}
 
   ///
-  // Called on the IO thread when a resource response is received. The |browser|
-  // and |frame| values represent the source of the request, and may be NULL for
-  // requests originating from service workers or CefURLRequest. To allow the
-  // resource load to proceed without modification return false. To redirect or
-  // retry the resource load optionally modify |request| and return true.
-  // Modification of the request URL will be treated as a redirect. Requests
-  // handled using the default network loader cannot be redirected in this
-  // callback. The |response| object cannot be modified in this callback.
-  //
-  // WARNING: Redirecting using this method is deprecated. Use
-  // OnBeforeResourceLoad or GetResourceHandler to perform redirects.
+  /// Called on the IO thread when a resource response is received. The
+  /// |browser| and |frame| values represent the source of the request, and may
+  /// be NULL for requests originating from service workers or CefURLRequest. To
+  /// allow the resource load to proceed without modification return false. To
+  /// redirect or retry the resource load optionally modify |request| and return
+  /// true. Modification of the request URL will be treated as a redirect.
+  /// Requests handled using the default network loader cannot be redirected in
+  /// this callback. The |response| object cannot be modified in this callback.
+  ///
+  /// WARNING: Redirecting using this method is deprecated. Use
+  /// OnBeforeResourceLoad or GetResourceHandler to perform redirects.
   ///
   /*--cef(optional_param=browser,optional_param=frame)--*/
   virtual bool OnResourceResponse(CefRefPtr<CefBrowser> browser,
@@ -151,11 +150,11 @@
   }
 
   ///
-  // Called on the IO thread to optionally filter resource response content. The
-  // |browser| and |frame| values represent the source of the request, and may
-  // be NULL for requests originating from service workers or CefURLRequest.
-  // |request| and |response| represent the request and response respectively
-  // and cannot be modified in this callback.
+  /// Called on the IO thread to optionally filter resource response content.
+  /// The |browser| and |frame| values represent the source of the request, and
+  /// may be NULL for requests originating from service workers or
+  /// CefURLRequest. |request| and |response| represent the request and response
+  /// respectively and cannot be modified in this callback.
   ///
   /*--cef(optional_param=browser,optional_param=frame)--*/
   virtual CefRefPtr<CefResponseFilter> GetResourceResponseFilter(
@@ -167,19 +166,20 @@
   }
 
   ///
-  // Called on the IO thread when a resource load has completed. The |browser|
-  // and |frame| values represent the source of the request, and may be NULL for
-  // requests originating from service workers or CefURLRequest. |request| and
-  // |response| represent the request and response respectively and cannot be
-  // modified in this callback. |status| indicates the load completion status.
-  // |received_content_length| is the number of response bytes actually read.
-  // This method will be called for all requests, including requests that are
-  // aborted due to CEF shutdown or destruction of the associated browser. In
-  // cases where the associated browser is destroyed this callback may arrive
-  // after the CefLifeSpanHandler::OnBeforeClose callback for that browser. The
-  // CefFrame::IsValid method can be used to test for this situation, and care
-  // should be taken not to call |browser| or |frame| methods that modify state
-  // (like LoadURL, SendProcessMessage, etc.) if the frame is invalid.
+  /// Called on the IO thread when a resource load has completed. The |browser|
+  /// and |frame| values represent the source of the request, and may be NULL
+  /// for requests originating from service workers or CefURLRequest. |request|
+  /// and |response| represent the request and response respectively and cannot
+  /// be modified in this callback. |status| indicates the load completion
+  /// status. |received_content_length| is the number of response bytes actually
+  /// read. This method will be called for all requests, including requests that
+  /// are aborted due to CEF shutdown or destruction of the associated browser.
+  /// In cases where the associated browser is destroyed this callback may
+  /// arrive after the CefLifeSpanHandler::OnBeforeClose callback for that
+  /// browser. The CefFrame::IsValid method can be used to test for this
+  /// situation, and care should be taken not to call |browser| or |frame|
+  /// methods that modify state (like LoadURL, SendProcessMessage, etc.) if the
+  /// frame is invalid.
   ///
   /*--cef(optional_param=browser,optional_param=frame)--*/
   virtual void OnResourceLoadComplete(CefRefPtr<CefBrowser> browser,
@@ -187,17 +187,17 @@
                                       CefRefPtr<CefRequest> request,
                                       CefRefPtr<CefResponse> response,
                                       URLRequestStatus status,
-                                      int64 received_content_length) {}
+                                      int64_t received_content_length) {}
 
   ///
-  // Called on the IO thread to handle requests for URLs with an unknown
-  // protocol component. The |browser| and |frame| values represent the source
-  // of the request, and may be NULL for requests originating from service
-  // workers or CefURLRequest. |request| cannot be modified in this callback.
-  // Set |allow_os_execution| to true to attempt execution via the registered OS
-  // protocol handler, if any.
-  // SECURITY WARNING: YOU SHOULD USE THIS METHOD TO ENFORCE RESTRICTIONS BASED
-  // ON SCHEME, HOST OR OTHER URL ANALYSIS BEFORE ALLOWING OS EXECUTION.
+  /// Called on the IO thread to handle requests for URLs with an unknown
+  /// protocol component. The |browser| and |frame| values represent the source
+  /// of the request, and may be NULL for requests originating from service
+  /// workers or CefURLRequest. |request| cannot be modified in this callback.
+  /// Set |allow_os_execution| to true to attempt execution via the registered
+  /// OS protocol handler, if any. SECURITY WARNING: YOU SHOULD USE THIS METHOD
+  /// TO ENFORCE RESTRICTIONS BASED ON SCHEME, HOST OR OTHER URL ANALYSIS BEFORE
+  /// ALLOWING OS EXECUTION.
   ///
   /*--cef(optional_param=browser,optional_param=frame)--*/
   virtual void OnProtocolExecution(CefRefPtr<CefBrowser> browser,
@@ -207,19 +207,19 @@
 };
 
 ///
-// Implement this interface to filter cookies that may be sent or received from
-// resource requests. The methods of this class will be called on the IO thread
-// unless otherwise indicated.
+/// Implement this interface to filter cookies that may be sent or received from
+/// resource requests. The methods of this class will be called on the IO thread
+/// unless otherwise indicated.
 ///
 /*--cef(source=client,no_debugct_check)--*/
 class CefCookieAccessFilter : public virtual CefBaseRefCounted {
  public:
   ///
-  // Called on the IO thread before a resource request is sent. The |browser|
-  // and |frame| values represent the source of the request, and may be NULL for
-  // requests originating from service workers or CefURLRequest. |request|
-  // cannot be modified in this callback. Return true if the specified cookie
-  // can be sent with the request or false otherwise.
+  /// Called on the IO thread before a resource request is sent. The |browser|
+  /// and |frame| values represent the source of the request, and may be NULL
+  /// for requests originating from service workers or CefURLRequest. |request|
+  /// cannot be modified in this callback. Return true if the specified cookie
+  /// can be sent with the request or false otherwise.
   ///
   /*--cef(optional_param=browser,optional_param=frame)--*/
   virtual bool CanSendCookie(CefRefPtr<CefBrowser> browser,
@@ -230,11 +230,12 @@
   }
 
   ///
-  // Called on the IO thread after a resource response is received. The
-  // |browser| and |frame| values represent the source of the request, and may
-  // be NULL for requests originating from service workers or CefURLRequest.
-  // |request| cannot be modified in this callback. Return true if the specified
-  // cookie returned with the response can be saved or false otherwise.
+  /// Called on the IO thread after a resource response is received. The
+  /// |browser| and |frame| values represent the source of the request, and may
+  /// be NULL for requests originating from service workers or CefURLRequest.
+  /// |request| cannot be modified in this callback. Return true if the
+  /// specified cookie returned with the response can be saved or false
+  /// otherwise.
   ///
   /*--cef(optional_param=browser,optional_param=frame)--*/
   virtual bool CanSaveCookie(CefRefPtr<CefBrowser> browser,
diff --git a/src/include/cef_response.h b/src/include/cef_response.h
index f871c11..571998a 100644
--- a/src/include/cef_response.h
+++ b/src/include/cef_response.h
@@ -42,8 +42,8 @@
 #include "include/cef_base.h"
 
 ///
-// Class used to represent a web response. The methods of this class may be
-// called on any thread.
+/// Class used to represent a web response. The methods of this class may be
+/// called on any thread.
 ///
 /*--cef(source=library,no_debugct_check)--*/
 class CefResponse : public virtual CefBaseRefCounted {
@@ -51,88 +51,88 @@
   typedef std::multimap<CefString, CefString> HeaderMap;
 
   ///
-  // Create a new CefResponse object.
+  /// Create a new CefResponse object.
   ///
   /*--cef()--*/
   static CefRefPtr<CefResponse> Create();
 
   ///
-  // Returns true if this object is read-only.
+  /// Returns true if this object is read-only.
   ///
   /*--cef()--*/
   virtual bool IsReadOnly() = 0;
 
   ///
-  // Get the response error code. Returns ERR_NONE if there was no error.
+  /// Get the response error code. Returns ERR_NONE if there was no error.
   ///
   /*--cef(default_retval=ERR_NONE)--*/
   virtual cef_errorcode_t GetError() = 0;
 
   ///
-  // Set the response error code. This can be used by custom scheme handlers
-  // to return errors during initial request processing.
+  /// Set the response error code. This can be used by custom scheme handlers
+  /// to return errors during initial request processing.
   ///
   /*--cef()--*/
   virtual void SetError(cef_errorcode_t error) = 0;
 
   ///
-  // Get the response status code.
+  /// Get the response status code.
   ///
   /*--cef()--*/
   virtual int GetStatus() = 0;
 
   ///
-  // Set the response status code.
+  /// Set the response status code.
   ///
   /*--cef()--*/
   virtual void SetStatus(int status) = 0;
 
   ///
-  // Get the response status text.
+  /// Get the response status text.
   ///
   /*--cef()--*/
   virtual CefString GetStatusText() = 0;
 
   ///
-  // Set the response status text.
+  /// Set the response status text.
   ///
   /*--cef(optional_param=statusText)--*/
   virtual void SetStatusText(const CefString& statusText) = 0;
 
   ///
-  // Get the response mime type.
+  /// Get the response mime type.
   ///
   /*--cef()--*/
   virtual CefString GetMimeType() = 0;
 
   ///
-  // Set the response mime type.
+  /// Set the response mime type.
   ///
   /*--cef(optional_param=mimeType)--*/
   virtual void SetMimeType(const CefString& mimeType) = 0;
 
   ///
-  // Get the response charset.
+  /// Get the response charset.
   ///
   /*--cef()--*/
   virtual CefString GetCharset() = 0;
 
   ///
-  // Set the response charset.
+  /// Set the response charset.
   ///
   /*--cef(optional_param=charset)--*/
   virtual void SetCharset(const CefString& charset) = 0;
 
   ///
-  // Get the value for the specified response header field.
+  /// Get the value for the specified response header field.
   ///
   /*--cef()--*/
   virtual CefString GetHeaderByName(const CefString& name) = 0;
 
   ///
-  // Set the header |name| to |value|. If |overwrite| is true any existing
-  // values will be replaced with the new value. If |overwrite| is false any
-  // existing values will not be overwritten.
+  /// Set the header |name| to |value|. If |overwrite| is true any existing
+  /// values will be replaced with the new value. If |overwrite| is false any
+  /// existing values will not be overwritten.
   ///
   /*--cef(optional_param=value)--*/
   virtual void SetHeaderByName(const CefString& name,
@@ -140,25 +140,25 @@
                                bool overwrite) = 0;
 
   ///
-  // Get all response header fields.
+  /// Get all response header fields.
   ///
   /*--cef()--*/
   virtual void GetHeaderMap(HeaderMap& headerMap) = 0;
 
   ///
-  // Set all response header fields.
+  /// Set all response header fields.
   ///
   /*--cef()--*/
   virtual void SetHeaderMap(const HeaderMap& headerMap) = 0;
 
   ///
-  // Get the resolved URL after redirects or changed as a result of HSTS.
+  /// Get the resolved URL after redirects or changed as a result of HSTS.
   ///
   /*--cef()--*/
   virtual CefString GetURL() = 0;
 
   ///
-  // Set the resolved URL after redirects or changed as a result of HSTS.
+  /// Set the resolved URL after redirects or changed as a result of HSTS.
   ///
   /*--cef(optional_param=url)--*/
   virtual void SetURL(const CefString& url) = 0;
diff --git a/src/include/cef_response_filter.h b/src/include/cef_response_filter.h
index 2eb446f..37d7064 100644
--- a/src/include/cef_response_filter.h
+++ b/src/include/cef_response_filter.h
@@ -41,8 +41,8 @@
 #include "include/cef_base.h"
 
 ///
-// Implement this interface to filter resource response content. The methods of
-// this class will be called on the browser process IO thread.
+/// Implement this interface to filter resource response content. The methods of
+/// this class will be called on the browser process IO thread.
 ///
 /*--cef(source=client)--*/
 class CefResponseFilter : public virtual CefBaseRefCounted {
@@ -50,41 +50,42 @@
   typedef cef_response_filter_status_t FilterStatus;
 
   ///
-  // Initialize the response filter. Will only be called a single time. The
-  // filter will not be installed if this method returns false.
+  /// Initialize the response filter. Will only be called a single time. The
+  /// filter will not be installed if this method returns false.
   ///
   /*--cef()--*/
   virtual bool InitFilter() = 0;
 
   ///
-  // Called to filter a chunk of data. Expected usage is as follows:
-  //
-  //  A. Read input data from |data_in| and set |data_in_read| to the number of
-  //     bytes that were read up to a maximum of |data_in_size|. |data_in| will
-  //     be NULL if |data_in_size| is zero.
-  //  B. Write filtered output data to |data_out| and set |data_out_written| to
-  //     the number of bytes that were written up to a maximum of
-  //     |data_out_size|. If no output data was written then all data must be
-  //     read from |data_in| (user must set |data_in_read| = |data_in_size|).
-  //  C. Return RESPONSE_FILTER_DONE if all output data was written or
-  //     RESPONSE_FILTER_NEED_MORE_DATA if output data is still pending.
-  //
-  // This method will be called repeatedly until the input buffer has been
-  // fully read (user sets |data_in_read| = |data_in_size|) and there is no
-  // more input data to filter (the resource response is complete). This method
-  // may then be called an additional time with an empty input buffer if the
-  // user filled the output buffer (set |data_out_written| = |data_out_size|)
-  // and returned RESPONSE_FILTER_NEED_MORE_DATA to indicate that output data is
-  // still pending.
-  //
-  // Calls to this method will stop when one of the following conditions is met:
-  //
-  //  A. There is no more input data to filter (the resource response is
-  //     complete) and the user sets |data_out_written| = 0 or returns
-  //     RESPONSE_FILTER_DONE to indicate that all data has been written, or;
-  //  B. The user returns RESPONSE_FILTER_ERROR to indicate an error.
-  //
-  // Do not keep a reference to the buffers passed to this method.
+  /// Called to filter a chunk of data. Expected usage is as follows:
+  ///
+  ///  1. Read input data from |data_in| and set |data_in_read| to the number of
+  ///     bytes that were read up to a maximum of |data_in_size|. |data_in| will
+  ///     be NULL if |data_in_size| is zero.
+  ///  2. Write filtered output data to |data_out| and set |data_out_written| to
+  ///     the number of bytes that were written up to a maximum of
+  ///     |data_out_size|. If no output data was written then all data must be
+  ///     read from |data_in| (user must set |data_in_read| = |data_in_size|).
+  ///  3. Return RESPONSE_FILTER_DONE if all output data was written or
+  ///     RESPONSE_FILTER_NEED_MORE_DATA if output data is still pending.
+  ///
+  /// This method will be called repeatedly until the input buffer has been
+  /// fully read (user sets |data_in_read| = |data_in_size|) and there is no
+  /// more input data to filter (the resource response is complete). This method
+  /// may then be called an additional time with an empty input buffer if the
+  /// user filled the output buffer (set |data_out_written| = |data_out_size|)
+  /// and returned RESPONSE_FILTER_NEED_MORE_DATA to indicate that output data
+  /// is still pending.
+  ///
+  /// Calls to this method will stop when one of the following conditions is
+  /// met:
+  ///
+  ///  1. There is no more input data to filter (the resource response is
+  ///     complete) and the user sets |data_out_written| = 0 or returns
+  ///     RESPONSE_FILTER_DONE to indicate that all data has been written, or;
+  ///  2. The user returns RESPONSE_FILTER_ERROR to indicate an error.
+  ///
+  /// Do not keep a reference to the buffers passed to this method.
   ///
   /*--cef(optional_param=data_in,default_retval=RESPONSE_FILTER_ERROR)--*/
   virtual FilterStatus Filter(void* data_in,
diff --git a/src/include/cef_sandbox_mac.h b/src/include/cef_sandbox_mac.h
index 48886ed..cec624e 100644
--- a/src/include/cef_sandbox_mac.h
+++ b/src/include/cef_sandbox_mac.h
@@ -34,33 +34,36 @@
 #include "include/base/cef_build.h"
 #include "include/internal/cef_export.h"
 
-#if defined(OS_MACOSX)
+#if defined(OS_MAC)
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-// The sandbox is used to restrict sub-processes (renderer, plugin, GPU, etc)
-// from directly accessing system resources. This helps to protect the user
-// from untrusted and potentially malicious Web content.
-// See http://www.chromium.org/developers/design-documents/sandbox for
-// complete details.
-//
-// To enable the sandbox on macOS the following requirements must be met:
-// 1. Link the helper process executable with the cef_sandbox static library.
-// 2. Call the cef_sandbox_initialize() function at the beginning of the
-//    helper executable main() function and before loading the CEF framework
-//    library. See include/wrapper/cef_library_loader.h for example usage.
+///
+/// \file
+/// The sandbox is used to restrict sub-processes (renderer, GPU, etc) from
+/// directly accessing system resources. This helps to protect the user from
+/// untrusted and potentially malicious Web content. See
+/// http://www.chromium.org/developers/design-documents/sandbox for complete
+/// details.
+///
+/// To enable the sandbox on macOS the following requirements must be met:
+/// 1. Link the helper process executable with the cef_sandbox static library.
+/// 2. Call the cef_sandbox_initialize() function at the beginning of the
+///    helper executable main() function and before loading the CEF framework
+///    library. See include/wrapper/cef_library_loader.h for example usage.
+///
 
 ///
-// Initialize the sandbox for this process. Returns the sandbox context
-// handle on success or NULL on failure. The returned handle should be
-// passed to cef_sandbox_destroy() immediately before process termination.
+/// Initialize the sandbox for this process. Returns the sandbox context
+/// handle on success or NULL on failure. The returned handle should be
+/// passed to cef_sandbox_destroy() immediately before process termination.
 ///
 CEF_EXPORT void* cef_sandbox_initialize(int argc, char** argv);
 
 ///
-// Destroy the specified sandbox context handle.
+/// Destroy the specified sandbox context handle.
 ///
 CEF_EXPORT void cef_sandbox_destroy(void* sandbox_context);
 
@@ -68,14 +71,16 @@
 }
 
 ///
-// Scoped helper for managing the life span of a sandbox context handle.
+/// Scoped helper for managing the life span of a sandbox context handle.
 ///
 class CEF_EXPORT CefScopedSandboxContext {
  public:
   CefScopedSandboxContext();
   ~CefScopedSandboxContext();
 
-  // Load the sandbox for this process. Returns true on success.
+  ///
+  /// Load the sandbox for this process. Returns true on success.
+  ///
   bool Initialize(int argc, char** argv);
 
  private:
@@ -83,6 +88,6 @@
 };
 #endif  // __cplusplus
 
-#endif  // defined(OS_MACOSX)
+#endif  // defined(OS_MAC)
 
 #endif  // CEF_INCLUDE_CEF_SANDBOX_MAC_H_
diff --git a/src/include/cef_sandbox_win.h b/src/include/cef_sandbox_win.h
index 3b7c4e0..a98d64c 100644
--- a/src/include/cef_sandbox_win.h
+++ b/src/include/cef_sandbox_win.h
@@ -39,29 +39,32 @@
 extern "C" {
 #endif
 
-// The sandbox is used to restrict sub-processes (renderer, plugin, GPU, etc)
-// from directly accessing system resources. This helps to protect the user
-// from untrusted and potentially malicious Web content.
-// See http://www.chromium.org/developers/design-documents/sandbox for
-// complete details.
-//
-// To enable the sandbox on Windows the following requirements must be met:
-// 1. Use the same executable for the browser process and all sub-processes.
-// 2. Link the executable with the cef_sandbox static library.
-// 3. Call the cef_sandbox_info_create() function from within the executable
-//    (not from a separate DLL) and pass the resulting pointer into both the
-//    CefExecutProcess() and CefInitialize() functions via the
-//    |windows_sandbox_info| parameter.
+///
+/// \file
+/// The sandbox is used to restrict sub-processes (renderer, GPU, etc) from
+/// directly accessing system resources. This helps to protect the user from
+/// untrusted and potentially malicious Web content. See
+/// http://www.chromium.org/developers/design-documents/sandbox for complete
+/// details.
+///
+/// To enable the sandbox on Windows the following requirements must be met:
+/// 1. Use the same executable for the browser process and all sub-processes.
+/// 2. Link the executable with the cef_sandbox static library.
+/// 3. Call the cef_sandbox_info_create() function from within the executable
+///    (not from a separate DLL) and pass the resulting pointer into both the
+///    CefExecuteProcess() and CefInitialize() functions via the
+///    |windows_sandbox_info| parameter.
+///
 
 ///
-// Create the sandbox information object for this process. It is safe to create
-// multiple of this object and to destroy the object immediately after passing
-// into the CefExecutProcess() and/or CefInitialize() functions.
+/// Create the sandbox information object for this process. It is safe to create
+/// multiple of this object and to destroy the object immediately after passing
+/// into the CefExecuteProcess() and/or CefInitialize() functions.
 ///
-void* cef_sandbox_info_create();
+void* cef_sandbox_info_create(void);
 
 ///
-// Destroy the specified sandbox information object.
+/// Destroy the specified sandbox information object.
 ///
 void cef_sandbox_info_destroy(void* sandbox_info);
 
@@ -69,7 +72,7 @@
 }
 
 ///
-// Manages the life span of a sandbox information object.
+/// Manages the life span of a sandbox information object.
 ///
 class CefScopedSandboxInfo {
  public:
diff --git a/src/include/cef_scheme.h b/src/include/cef_scheme.h
index 082f9ec..97f4c15 100644
--- a/src/include/cef_scheme.h
+++ b/src/include/cef_scheme.h
@@ -48,18 +48,18 @@
 class CefSchemeHandlerFactory;
 
 ///
-// Register a scheme handler factory with the global request context. An empty
-// |domain_name| value for a standard scheme will cause the factory to match all
-// domain names. The |domain_name| value will be ignored for non-standard
-// schemes. If |scheme_name| is a built-in scheme and no handler is returned by
-// |factory| then the built-in scheme handler factory will be called. If
-// |scheme_name| is a custom scheme then you must also implement the
-// CefApp::OnRegisterCustomSchemes() method in all processes. This function may
-// be called multiple times to change or remove the factory that matches the
-// specified |scheme_name| and optional |domain_name|. Returns false if an error
-// occurs. This function may be called on any thread in the browser process.
-// Using this function is equivalent to calling
-// CefRequestContext::GetGlobalContext()->RegisterSchemeHandlerFactory().
+/// Register a scheme handler factory with the global request context. An empty
+/// |domain_name| value for a standard scheme will cause the factory to match
+/// all domain names. The |domain_name| value will be ignored for non-standard
+/// schemes. If |scheme_name| is a built-in scheme and no handler is returned by
+/// |factory| then the built-in scheme handler factory will be called. If
+/// |scheme_name| is a custom scheme then you must also implement the
+/// CefApp::OnRegisterCustomSchemes() method in all processes. This function may
+/// be called multiple times to change or remove the factory that matches the
+/// specified |scheme_name| and optional |domain_name|. Returns false if an
+/// error occurs. This function may be called on any thread in the browser
+/// process. Using this function is equivalent to calling
+/// CefRequestContext::GetGlobalContext()->RegisterSchemeHandlerFactory().
 ///
 /*--cef(optional_param=domain_name,optional_param=factory)--*/
 bool CefRegisterSchemeHandlerFactory(
@@ -68,48 +68,48 @@
     CefRefPtr<CefSchemeHandlerFactory> factory);
 
 ///
-// Clear all scheme handler factories registered with the global request
-// context. Returns false on error. This function may be called on any thread in
-// the browser process. Using this function is equivalent to calling
-// CefRequestContext::GetGlobalContext()->ClearSchemeHandlerFactories().
+/// Clear all scheme handler factories registered with the global request
+/// context. Returns false on error. This function may be called on any thread
+/// in the browser process. Using this function is equivalent to calling
+/// CefRequestContext::GetGlobalContext()->ClearSchemeHandlerFactories().
 ///
 /*--cef()--*/
 bool CefClearSchemeHandlerFactories();
 
 ///
-// Class that manages custom scheme registrations.
+/// Class that manages custom scheme registrations.
 ///
 /*--cef(source=library)--*/
 class CefSchemeRegistrar : public CefBaseScoped {
  public:
   ///
-  // Register a custom scheme. This method should not be called for the built-in
-  // HTTP, HTTPS, FILE, FTP, ABOUT and DATA schemes.
-  //
-  // See cef_scheme_options_t for possible values for |options|.
-  //
-  // This function may be called on any thread. It should only be called once
-  // per unique |scheme_name| value. If |scheme_name| is already registered or
-  // if an error occurs this method will return false.
+  /// Register a custom scheme. This method should not be called for the
+  /// built-in HTTP, HTTPS, FILE, FTP, ABOUT and DATA schemes.
+  ///
+  /// See cef_scheme_options_t for possible values for |options|.
+  ///
+  /// This function may be called on any thread. It should only be called once
+  /// per unique |scheme_name| value. If |scheme_name| is already registered or
+  /// if an error occurs this method will return false.
   ///
   /*--cef()--*/
   virtual bool AddCustomScheme(const CefString& scheme_name, int options) = 0;
 };
 
 ///
-// Class that creates CefResourceHandler instances for handling scheme requests.
-// The methods of this class will always be called on the IO thread.
+/// Class that creates CefResourceHandler instances for handling scheme
+/// requests. The methods of this class will always be called on the IO thread.
 ///
 /*--cef(source=client,no_debugct_check)--*/
 class CefSchemeHandlerFactory : public virtual CefBaseRefCounted {
  public:
   ///
-  // Return a new resource handler instance to handle the request or an empty
-  // reference to allow default handling of the request. |browser| and |frame|
-  // will be the browser window and frame respectively that originated the
-  // request or NULL if the request did not originate from a browser window
-  // (for example, if the request came from CefURLRequest). The |request| object
-  // passed to this method cannot be modified.
+  /// Return a new resource handler instance to handle the request or an empty
+  /// reference to allow default handling of the request. |browser| and |frame|
+  /// will be the browser window and frame respectively that originated the
+  /// request or NULL if the request did not originate from a browser window
+  /// (for example, if the request came from CefURLRequest). The |request|
+  /// object passed to this method cannot be modified.
   ///
   /*--cef(optional_param=browser,optional_param=frame)--*/
   virtual CefRefPtr<CefResourceHandler> Create(
diff --git a/src/include/cef_server.h b/src/include/cef_server.h
index e22b8a6..b868581 100644
--- a/src/include/cef_server.h
+++ b/src/include/cef_server.h
@@ -47,11 +47,11 @@
 class CefServerHandler;
 
 ///
-// Class representing a server that supports HTTP and WebSocket requests. Server
-// capacity is limited and is intended to handle only a small number of
-// simultaneous connections (e.g. for communicating between applications on
-// localhost). The methods of this class are safe to call from any thread in the
-// brower process unless otherwise indicated.
+/// Class representing a server that supports HTTP and WebSocket requests.
+/// Server capacity is limited and is intended to handle only a small number of
+/// simultaneous connections (e.g. for communicating between applications on
+/// localhost). The methods of this class are safe to call from any thread in
+/// the brower process unless otherwise indicated.
 ///
 /*--cef(source=library)--*/
 class CefServer : public CefBaseRefCounted {
@@ -59,74 +59,74 @@
   typedef std::multimap<CefString, CefString> HeaderMap;
 
   ///
-  // Create a new server that binds to |address| and |port|. |address| must be a
-  // valid IPv4 or IPv6 address (e.g. 127.0.0.1 or ::1) and |port| must be a
-  // port number outside of the reserved range (e.g. between 1025 and 65535 on
-  // most platforms). |backlog| is the maximum number of pending connections.
-  // A new thread will be created for each CreateServer call (the "dedicated
-  // server thread"). It is therefore recommended to use a different
-  // CefServerHandler instance for each CreateServer call to avoid thread safety
-  // issues in the CefServerHandler implementation. The
-  // CefServerHandler::OnServerCreated method will be called on the dedicated
-  // server thread to report success or failure. See
-  // CefServerHandler::OnServerCreated documentation for a description of server
-  // lifespan.
+  /// Create a new server that binds to |address| and |port|. |address| must be
+  /// a valid IPv4 or IPv6 address (e.g. 127.0.0.1 or ::1) and |port| must be a
+  /// port number outside of the reserved range (e.g. between 1025 and 65535 on
+  /// most platforms). |backlog| is the maximum number of pending connections.
+  /// A new thread will be created for each CreateServer call (the "dedicated
+  /// server thread"). It is therefore recommended to use a different
+  /// CefServerHandler instance for each CreateServer call to avoid thread
+  /// safety issues in the CefServerHandler implementation. The
+  /// CefServerHandler::OnServerCreated method will be called on the dedicated
+  /// server thread to report success or failure. See
+  /// CefServerHandler::OnServerCreated documentation for a description of
+  /// server lifespan.
   ///
   /*--cef()--*/
   static void CreateServer(const CefString& address,
-                           uint16 port,
+                           uint16_t port,
                            int backlog,
                            CefRefPtr<CefServerHandler> handler);
 
   ///
-  // Returns the task runner for the dedicated server thread.
+  /// Returns the task runner for the dedicated server thread.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefTaskRunner> GetTaskRunner() = 0;
 
   ///
-  // Stop the server and shut down the dedicated server thread. See
-  // CefServerHandler::OnServerCreated documentation for a description of
-  // server lifespan.
+  /// Stop the server and shut down the dedicated server thread. See
+  /// CefServerHandler::OnServerCreated documentation for a description of
+  /// server lifespan.
   ///
   /*--cef()--*/
   virtual void Shutdown() = 0;
 
   ///
-  // Returns true if the server is currently running and accepting incoming
-  // connections. See CefServerHandler::OnServerCreated documentation for a
-  // description of server lifespan. This method must be called on the dedicated
-  // server thread.
+  /// Returns true if the server is currently running and accepting incoming
+  /// connections. See CefServerHandler::OnServerCreated documentation for a
+  /// description of server lifespan. This method must be called on the
+  /// dedicated server thread.
   ///
   /*--cef()--*/
   virtual bool IsRunning() = 0;
 
   ///
-  // Returns the server address including the port number.
+  /// Returns the server address including the port number.
   ///
   /*--cef()--*/
   virtual CefString GetAddress() = 0;
 
   ///
-  // Returns true if the server currently has a connection. This method must be
-  // called on the dedicated server thread.
+  /// Returns true if the server currently has a connection. This method must be
+  /// called on the dedicated server thread.
   ///
   /*--cef()--*/
   virtual bool HasConnection() = 0;
 
   ///
-  // Returns true if |connection_id| represents a valid connection. This method
-  // must be called on the dedicated server thread.
+  /// Returns true if |connection_id| represents a valid connection. This method
+  /// must be called on the dedicated server thread.
   ///
   /*--cef()--*/
   virtual bool IsValidConnection(int connection_id) = 0;
 
   ///
-  // Send an HTTP 200 "OK" response to the connection identified by
-  // |connection_id|. |content_type| is the response content type (e.g.
-  // "text/html"), |data| is the response content, and |data_size| is the size
-  // of |data| in bytes. The contents of |data| will be copied. The connection
-  // will be closed automatically after the response is sent.
+  /// Send an HTTP 200 "OK" response to the connection identified by
+  /// |connection_id|. |content_type| is the response content type (e.g.
+  /// "text/html"), |data| is the response content, and |data_size| is the size
+  /// of |data| in bytes. The contents of |data| will be copied. The connection
+  /// will be closed automatically after the response is sent.
   ///
   /*--cef()--*/
   virtual void SendHttp200Response(int connection_id,
@@ -135,51 +135,51 @@
                                    size_t data_size) = 0;
 
   ///
-  // Send an HTTP 404 "Not Found" response to the connection identified by
-  // |connection_id|. The connection will be closed automatically after the
-  // response is sent.
+  /// Send an HTTP 404 "Not Found" response to the connection identified by
+  /// |connection_id|. The connection will be closed automatically after the
+  /// response is sent.
   ///
   /*--cef()--*/
   virtual void SendHttp404Response(int connection_id) = 0;
 
   ///
-  // Send an HTTP 500 "Internal Server Error" response to the connection
-  // identified by |connection_id|. |error_message| is the associated error
-  // message. The connection will be closed automatically after the response is
-  // sent.
+  /// Send an HTTP 500 "Internal Server Error" response to the connection
+  /// identified by |connection_id|. |error_message| is the associated error
+  /// message. The connection will be closed automatically after the response is
+  /// sent.
   ///
   /*--cef()--*/
   virtual void SendHttp500Response(int connection_id,
                                    const CefString& error_message) = 0;
 
   ///
-  // Send a custom HTTP response to the connection identified by
-  // |connection_id|. |response_code| is the HTTP response code sent in the
-  // status line (e.g. 200), |content_type| is the response content type sent
-  // as the "Content-Type" header (e.g. "text/html"), |content_length| is the
-  // expected content length, and |extra_headers| is the map of extra response
-  // headers. If |content_length| is >= 0 then the "Content-Length" header will
-  // be sent. If |content_length| is 0 then no content is expected and the
-  // connection will be closed automatically after the response is sent. If
-  // |content_length| is < 0 then no "Content-Length" header will be sent and
-  // the client will continue reading until the connection is closed. Use the
-  // SendRawData method to send the content, if applicable, and call
-  // CloseConnection after all content has been sent.
+  /// Send a custom HTTP response to the connection identified by
+  /// |connection_id|. |response_code| is the HTTP response code sent in the
+  /// status line (e.g. 200), |content_type| is the response content type sent
+  /// as the "Content-Type" header (e.g. "text/html"), |content_length| is the
+  /// expected content length, and |extra_headers| is the map of extra response
+  /// headers. If |content_length| is >= 0 then the "Content-Length" header will
+  /// be sent. If |content_length| is 0 then no content is expected and the
+  /// connection will be closed automatically after the response is sent. If
+  /// |content_length| is < 0 then no "Content-Length" header will be sent and
+  /// the client will continue reading until the connection is closed. Use the
+  /// SendRawData method to send the content, if applicable, and call
+  /// CloseConnection after all content has been sent.
   ///
   /*--cef(optional_param=extra_headers)--*/
   virtual void SendHttpResponse(int connection_id,
                                 int response_code,
                                 const CefString& content_type,
-                                int64 content_length,
+                                int64_t content_length,
                                 const HeaderMap& extra_headers) = 0;
 
   ///
-  // Send raw data directly to the connection identified by |connection_id|.
-  // |data| is the raw data and |data_size| is the size of |data| in bytes.
-  // The contents of |data| will be copied. No validation of |data| is
-  // performed internally so the client should be careful to send the amount
-  // indicated by the "Content-Length" header, if specified. See
-  // SendHttpResponse documentation for intended usage.
+  /// Send raw data directly to the connection identified by |connection_id|.
+  /// |data| is the raw data and |data_size| is the size of |data| in bytes.
+  /// The contents of |data| will be copied. No validation of |data| is
+  /// performed internally so the client should be careful to send the amount
+  /// indicated by the "Content-Length" header, if specified. See
+  /// SendHttpResponse documentation for intended usage.
   ///
   /*--cef()--*/
   virtual void SendRawData(int connection_id,
@@ -187,17 +187,17 @@
                            size_t data_size) = 0;
 
   ///
-  // Close the connection identified by |connection_id|. See SendHttpResponse
-  // documentation for intended usage.
+  /// Close the connection identified by |connection_id|. See SendHttpResponse
+  /// documentation for intended usage.
   ///
   /*--cef()--*/
   virtual void CloseConnection(int connection_id) = 0;
 
   ///
-  // Send a WebSocket message to the connection identified by |connection_id|.
-  // |data| is the response content and |data_size| is the size of |data| in
-  // bytes. The contents of |data| will be copied. See
-  // CefServerHandler::OnWebSocketRequest documentation for intended usage.
+  /// Send a WebSocket message to the connection identified by |connection_id|.
+  /// |data| is the response content and |data_size| is the size of |data| in
+  /// bytes. The contents of |data| will be copied. See
+  /// CefServerHandler::OnWebSocketRequest documentation for intended usage.
   ///
   /*--cef()--*/
   virtual void SendWebSocketMessage(int connection_id,
@@ -206,62 +206,62 @@
 };
 
 ///
-// Implement this interface to handle HTTP server requests. A new thread will be
-// created for each CefServer::CreateServer call (the "dedicated server
-// thread"), and the methods of this class will be called on that thread. It is
-// therefore recommended to use a different CefServerHandler instance for each
-// CefServer::CreateServer call to avoid thread safety issues in the
-// CefServerHandler implementation.
+/// Implement this interface to handle HTTP server requests. A new thread will
+/// be created for each CefServer::CreateServer call (the "dedicated server
+/// thread"), and the methods of this class will be called on that thread. It is
+/// therefore recommended to use a different CefServerHandler instance for each
+/// CefServer::CreateServer call to avoid thread safety issues in the
+/// CefServerHandler implementation.
 ///
 /*--cef(source=client)--*/
 class CefServerHandler : public virtual CefBaseRefCounted {
  public:
   ///
-  // Called when |server| is created. If the server was started successfully
-  // then CefServer::IsRunning will return true. The server will continue
-  // running until CefServer::Shutdown is called, after which time
-  // OnServerDestroyed will be called. If the server failed to start then
-  // OnServerDestroyed will be called immediately after this method returns.
+  /// Called when |server| is created. If the server was started successfully
+  /// then CefServer::IsRunning will return true. The server will continue
+  /// running until CefServer::Shutdown is called, after which time
+  /// OnServerDestroyed will be called. If the server failed to start then
+  /// OnServerDestroyed will be called immediately after this method returns.
   ///
   /*--cef()--*/
   virtual void OnServerCreated(CefRefPtr<CefServer> server) = 0;
 
   ///
-  // Called when |server| is destroyed. The server thread will be stopped after
-  // this method returns. The client should release any references to |server|
-  // when this method is called. See OnServerCreated documentation for a
-  // description of server lifespan.
+  /// Called when |server| is destroyed. The server thread will be stopped after
+  /// this method returns. The client should release any references to |server|
+  /// when this method is called. See OnServerCreated documentation for a
+  /// description of server lifespan.
   ///
   /*--cef()--*/
   virtual void OnServerDestroyed(CefRefPtr<CefServer> server) = 0;
 
   ///
-  // Called when a client connects to |server|. |connection_id| uniquely
-  // identifies the connection. Each call to this method will have a matching
-  // call to OnClientDisconnected.
+  /// Called when a client connects to |server|. |connection_id| uniquely
+  /// identifies the connection. Each call to this method will have a matching
+  /// call to OnClientDisconnected.
   ///
   /*--cef()--*/
   virtual void OnClientConnected(CefRefPtr<CefServer> server,
                                  int connection_id) = 0;
 
   ///
-  // Called when a client disconnects from |server|. |connection_id| uniquely
-  // identifies the connection. The client should release any data associated
-  // with |connection_id| when this method is called and |connection_id| should
-  // no longer be passed to CefServer methods. Disconnects can originate from
-  // either the client or the server. For example, the server will disconnect
-  // automatically after a CefServer::SendHttpXXXResponse method is called.
+  /// Called when a client disconnects from |server|. |connection_id| uniquely
+  /// identifies the connection. The client should release any data associated
+  /// with |connection_id| when this method is called and |connection_id| should
+  /// no longer be passed to CefServer methods. Disconnects can originate from
+  /// either the client or the server. For example, the server will disconnect
+  /// automatically after a CefServer::SendHttpXXXResponse method is called.
   ///
   /*--cef()--*/
   virtual void OnClientDisconnected(CefRefPtr<CefServer> server,
                                     int connection_id) = 0;
 
   ///
-  // Called when |server| receives an HTTP request. |connection_id| uniquely
-  // identifies the connection, |client_address| is the requesting IPv4 or IPv6
-  // client address including port number, and |request| contains the request
-  // contents (URL, method, headers and optional POST data). Call CefServer
-  // methods either synchronously or asynchronusly to send a response.
+  /// Called when |server| receives an HTTP request. |connection_id| uniquely
+  /// identifies the connection, |client_address| is the requesting IPv4 or IPv6
+  /// client address including port number, and |request| contains the request
+  /// contents (URL, method, headers and optional POST data). Call CefServer
+  /// methods either synchronously or asynchronusly to send a response.
   ///
   /*--cef()--*/
   virtual void OnHttpRequest(CefRefPtr<CefServer> server,
@@ -270,17 +270,18 @@
                              CefRefPtr<CefRequest> request) = 0;
 
   ///
-  // Called when |server| receives a WebSocket request. |connection_id| uniquely
-  // identifies the connection, |client_address| is the requesting IPv4 or
-  // IPv6 client address including port number, and |request| contains the
-  // request contents (URL, method, headers and optional POST data). Execute
-  // |callback| either synchronously or asynchronously to accept or decline the
-  // WebSocket connection. If the request is accepted then OnWebSocketConnected
-  // will be called after the WebSocket has connected and incoming messages will
-  // be delivered to the OnWebSocketMessage callback. If the request is declined
-  // then the client will be disconnected and OnClientDisconnected will be
-  // called. Call the CefServer::SendWebSocketMessage method after receiving the
-  // OnWebSocketConnected callback to respond with WebSocket messages.
+  /// Called when |server| receives a WebSocket request. |connection_id|
+  /// uniquely identifies the connection, |client_address| is the requesting
+  /// IPv4 or IPv6 client address including port number, and |request| contains
+  /// the request contents (URL, method, headers and optional POST data).
+  /// Execute |callback| either synchronously or asynchronously to accept or
+  /// decline the WebSocket connection. If the request is accepted then
+  /// OnWebSocketConnected will be called after the WebSocket has connected and
+  /// incoming messages will be delivered to the OnWebSocketMessage callback. If
+  /// the request is declined then the client will be disconnected and
+  /// OnClientDisconnected will be called. Call the
+  /// CefServer::SendWebSocketMessage method after receiving the
+  /// OnWebSocketConnected callback to respond with WebSocket messages.
   ///
   /*--cef()--*/
   virtual void OnWebSocketRequest(CefRefPtr<CefServer> server,
@@ -290,20 +291,20 @@
                                   CefRefPtr<CefCallback> callback) = 0;
 
   ///
-  // Called after the client has accepted the WebSocket connection for |server|
-  // and |connection_id| via the OnWebSocketRequest callback. See
-  // OnWebSocketRequest documentation for intended usage.
+  /// Called after the client has accepted the WebSocket connection for |server|
+  /// and |connection_id| via the OnWebSocketRequest callback. See
+  /// OnWebSocketRequest documentation for intended usage.
   ///
   /*--cef()--*/
   virtual void OnWebSocketConnected(CefRefPtr<CefServer> server,
                                     int connection_id) = 0;
 
   ///
-  // Called when |server| receives an WebSocket message. |connection_id|
-  // uniquely identifies the connection, |data| is the message content and
-  // |data_size| is the size of |data| in bytes. Do not keep a reference to
-  // |data| outside of this method. See OnWebSocketRequest documentation for
-  // intended usage.
+  /// Called when |server| receives an WebSocket message. |connection_id|
+  /// uniquely identifies the connection, |data| is the message content and
+  /// |data_size| is the size of |data| in bytes. Do not keep a reference to
+  /// |data| outside of this method. See OnWebSocketRequest documentation for
+  /// intended usage.
   ///
   /*--cef()--*/
   virtual void OnWebSocketMessage(CefRefPtr<CefServer> server,
diff --git a/src/include/cef_request_callback.h b/src/include/cef_shared_memory_region.h
similarity index 71%
copy from src/include/cef_request_callback.h
copy to src/include/cef_shared_memory_region.h
index 68094de..126a979 100644
--- a/src/include/cef_request_callback.h
+++ b/src/include/cef_shared_memory_region.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved.
+// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
@@ -34,30 +34,36 @@
 // tools directory for more information.
 //
 
-#ifndef CEF_INCLUDE_CEF_REQUEST_CALLBACK_H_
-#define CEF_INCLUDE_CEF_REQUEST_CALLBACK_H_
+#ifndef CEF_INCLUDE_CEF_SHARED_MEMORY_REGION_H_
+#define CEF_INCLUDE_CEF_SHARED_MEMORY_REGION_H_
 #pragma once
 
 #include "include/cef_base.h"
 
 ///
-// Callback interface used for asynchronous continuation of url requests.
+/// Class that wraps platform-dependent share memory region mapping.
 ///
 /*--cef(source=library)--*/
-class CefRequestCallback : public virtual CefBaseRefCounted {
+class CefSharedMemoryRegion : public virtual CefBaseRefCounted {
  public:
   ///
-  // Continue the url request. If |allow| is true the request will be continued.
-  // Otherwise, the request will be canceled.
-  ///
-  /*--cef(capi_name=cont)--*/
-  virtual void Continue(bool allow) = 0;
-
-  ///
-  // Cancel the url request.
+  /// Returns true if the mapping is valid.
   ///
   /*--cef()--*/
-  virtual void Cancel() = 0;
+  virtual bool IsValid() = 0;
+
+  ///
+  /// Returns the size of the mapping in bytes. Returns 0 for invalid instances.
+  ///
+  /*--cef()--*/
+  virtual size_t Size() = 0;
+
+  ///
+  /// Returns the pointer to the memory. Returns nullptr for invalid instances.
+  /// The returned pointer is only valid for the life span of this object.
+  ///
+  /*--cef()--*/
+  virtual void* Memory() = 0;
 };
 
-#endif  // CEF_INCLUDE_CEF_REQUEST_CALLBACK_H_
+#endif  // CEF_INCLUDE_CEF_SHARED_MEMORY_REGION_H_
diff --git a/src/include/cef_shared_process_message_builder.h b/src/include/cef_shared_process_message_builder.h
new file mode 100644
index 0000000..f67e58f
--- /dev/null
+++ b/src/include/cef_shared_process_message_builder.h
@@ -0,0 +1,87 @@
+// Copyright (c) 2022 Marshall A. Greenblatt. 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.
+//
+// ---------------------------------------------------------------------------
+//
+// The contents of this file must follow a specific format in order to
+// support the CEF translator tool. See the translator.README.txt file in the
+// tools directory for more information.
+//
+
+#ifndef CEF_INCLUDE_CEF_SHARED_PROCESS_MESSAGE_BUILDER_H_
+#define CEF_INCLUDE_CEF_SHARED_PROCESS_MESSAGE_BUILDER_H_
+#pragma once
+
+#include "include/cef_process_message.h"
+
+///
+/// Class that builds a CefProcessMessage containing a shared memory region.
+/// This class is not thread-safe but may be used exclusively on a different
+/// thread from the one which constructed it.
+///
+/*--cef(source=library)--*/
+class CefSharedProcessMessageBuilder : public virtual CefBaseRefCounted {
+ public:
+  ///
+  /// Creates a new CefSharedProcessMessageBuilder with the specified |name| and
+  /// shared memory region of specified |byte_size|.
+  ///
+  /*--cef()--*/
+  static CefRefPtr<CefSharedProcessMessageBuilder> Create(const CefString& name,
+                                                          size_t byte_size);
+  ///
+  /// Returns true if the builder is valid.
+  ///
+  /*--cef()--*/
+  virtual bool IsValid() = 0;
+
+  ///
+  /// Returns the size of the shared memory region in bytes. Returns 0 for
+  /// invalid instances.
+  ///
+  /*--cef()--*/
+  virtual size_t Size() = 0;
+
+  ///
+  /// Returns the pointer to the writable memory. Returns nullptr for invalid
+  /// instances. The returned pointer is only valid for the life span of this
+  /// object.
+  ///
+  /*--cef()--*/
+  virtual void* Memory() = 0;
+
+  ///
+  /// Creates a new CefProcessMessage from the data provided to the builder.
+  /// Returns nullptr for invalid instances. Invalidates the builder instance.
+  ///
+  /*--cef()--*/
+  virtual CefRefPtr<CefProcessMessage> Build() = 0;
+};
+
+#endif  // CEF_INCLUDE_CEF_SHARED_PROCESS_MESSAGE_BUILDER_H_
diff --git a/src/include/cef_ssl_info.h b/src/include/cef_ssl_info.h
index 40dc5c0..67b9cdf 100644
--- a/src/include/cef_ssl_info.h
+++ b/src/include/cef_ssl_info.h
@@ -44,27 +44,27 @@
 #include "include/cef_x509_certificate.h"
 
 ///
-// Class representing SSL information.
+/// Class representing SSL information.
 ///
 /*--cef(source=library)--*/
 class CefSSLInfo : public virtual CefBaseRefCounted {
  public:
   ///
-  // Returns a bitmask containing any and all problems verifying the server
-  // certificate.
+  /// Returns a bitmask containing any and all problems verifying the server
+  /// certificate.
   ///
   /*--cef(default_retval=CERT_STATUS_NONE)--*/
   virtual cef_cert_status_t GetCertStatus() = 0;
 
   ///
-  // Returns the X.509 certificate.
+  /// Returns the X.509 certificate.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefX509Certificate> GetX509Certificate() = 0;
 };
 
 ///
-// Returns true if the certificate status represents an error.
+/// Returns true if the certificate status represents an error.
 ///
 /*--cef()--*/
 bool CefIsCertStatusError(cef_cert_status_t status);
diff --git a/src/include/cef_ssl_status.h b/src/include/cef_ssl_status.h
index 002ac49..fe108df 100644
--- a/src/include/cef_ssl_status.h
+++ b/src/include/cef_ssl_status.h
@@ -43,38 +43,38 @@
 #include "include/cef_x509_certificate.h"
 
 ///
-// Class representing the SSL information for a navigation entry.
+/// Class representing the SSL information for a navigation entry.
 ///
 /*--cef(source=library)--*/
 class CefSSLStatus : public virtual CefBaseRefCounted {
  public:
   ///
-  // Returns true if the status is related to a secure SSL/TLS connection.
+  /// Returns true if the status is related to a secure SSL/TLS connection.
   ///
   /*--cef()--*/
   virtual bool IsSecureConnection() = 0;
 
   ///
-  // Returns a bitmask containing any and all problems verifying the server
-  // certificate.
+  /// Returns a bitmask containing any and all problems verifying the server
+  /// certificate.
   ///
   /*--cef(default_retval=CERT_STATUS_NONE)--*/
   virtual cef_cert_status_t GetCertStatus() = 0;
 
   ///
-  // Returns the SSL version used for the SSL connection.
+  /// Returns the SSL version used for the SSL connection.
   ///
   /*--cef(default_retval=SSL_CONNECTION_VERSION_UNKNOWN)--*/
   virtual cef_ssl_version_t GetSSLVersion() = 0;
 
   ///
-  // Returns a bitmask containing the page security content status.
+  /// Returns a bitmask containing the page security content status.
   ///
   /*--cef(default_retval=SSL_CONTENT_NORMAL_CONTENT)--*/
   virtual cef_ssl_content_status_t GetContentStatus() = 0;
 
   ///
-  // Returns the X.509 certificate.
+  /// Returns the X.509 certificate.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefX509Certificate> GetX509Certificate() = 0;
diff --git a/src/include/cef_stream.h b/src/include/cef_stream.h
index c40392e..22d4ef0 100644
--- a/src/include/cef_stream.h
+++ b/src/include/cef_stream.h
@@ -40,197 +40,199 @@
 #include "include/cef_base.h"
 
 ///
-// Interface the client can implement to provide a custom stream reader. The
-// methods of this class may be called on any thread.
+/// Interface the client can implement to provide a custom stream reader. The
+/// methods of this class may be called on any thread.
 ///
 /*--cef(source=client)--*/
 class CefReadHandler : public virtual CefBaseRefCounted {
  public:
   ///
-  // Read raw binary data.
+  /// Read raw binary data.
   ///
   /*--cef()--*/
   virtual size_t Read(void* ptr, size_t size, size_t n) = 0;
 
   ///
-  // Seek to the specified offset position. |whence| may be any one of
-  // SEEK_CUR, SEEK_END or SEEK_SET. Return zero on success and non-zero on
-  // failure.
+  /// Seek to the specified offset position. |whence| may be any one of
+  /// SEEK_CUR, SEEK_END or SEEK_SET. Return zero on success and non-zero on
+  /// failure.
   ///
   /*--cef()--*/
-  virtual int Seek(int64 offset, int whence) = 0;
+  virtual int Seek(int64_t offset, int whence) = 0;
 
   ///
-  // Return the current offset position.
+  /// Return the current offset position.
   ///
   /*--cef()--*/
-  virtual int64 Tell() = 0;
+  virtual int64_t Tell() = 0;
 
   ///
-  // Return non-zero if at end of file.
+  /// Return non-zero if at end of file.
   ///
   /*--cef()--*/
   virtual int Eof() = 0;
 
   ///
-  // Return true if this handler performs work like accessing the file system
-  // which may block. Used as a hint for determining the thread to access the
-  // handler from.
+  /// Return true if this handler performs work like accessing the file system
+  /// which may block. Used as a hint for determining the thread to access the
+  /// handler from.
   ///
   /*--cef()--*/
   virtual bool MayBlock() = 0;
 };
 
 ///
-// Class used to read data from a stream. The methods of this class may be
-// called on any thread.
+/// Class used to read data from a stream. The methods of this class may be
+/// called on any thread.
 ///
 /*--cef(source=library)--*/
 class CefStreamReader : public virtual CefBaseRefCounted {
  public:
   ///
-  // Create a new CefStreamReader object from a file.
+  /// Create a new CefStreamReader object from a file.
   ///
   /*--cef()--*/
   static CefRefPtr<CefStreamReader> CreateForFile(const CefString& fileName);
+
   ///
-  // Create a new CefStreamReader object from data.
+  /// Create a new CefStreamReader object from data.
   ///
   /*--cef()--*/
   static CefRefPtr<CefStreamReader> CreateForData(void* data, size_t size);
+
   ///
-  // Create a new CefStreamReader object from a custom handler.
+  /// Create a new CefStreamReader object from a custom handler.
   ///
   /*--cef()--*/
   static CefRefPtr<CefStreamReader> CreateForHandler(
       CefRefPtr<CefReadHandler> handler);
 
   ///
-  // Read raw binary data.
+  /// Read raw binary data.
   ///
   /*--cef()--*/
   virtual size_t Read(void* ptr, size_t size, size_t n) = 0;
 
   ///
-  // Seek to the specified offset position. |whence| may be any one of
-  // SEEK_CUR, SEEK_END or SEEK_SET. Returns zero on success and non-zero on
-  // failure.
+  /// Seek to the specified offset position. |whence| may be any one of
+  /// SEEK_CUR, SEEK_END or SEEK_SET. Returns zero on success and non-zero on
+  /// failure.
   ///
   /*--cef()--*/
-  virtual int Seek(int64 offset, int whence) = 0;
+  virtual int Seek(int64_t offset, int whence) = 0;
 
   ///
-  // Return the current offset position.
+  /// Return the current offset position.
   ///
   /*--cef()--*/
-  virtual int64 Tell() = 0;
+  virtual int64_t Tell() = 0;
 
   ///
-  // Return non-zero if at end of file.
+  /// Return non-zero if at end of file.
   ///
   /*--cef()--*/
   virtual int Eof() = 0;
 
   ///
-  // Returns true if this reader performs work like accessing the file system
-  // which may block. Used as a hint for determining the thread to access the
-  // reader from.
+  /// Returns true if this reader performs work like accessing the file system
+  /// which may block. Used as a hint for determining the thread to access the
+  /// reader from.
   ///
   /*--cef()--*/
   virtual bool MayBlock() = 0;
 };
 
 ///
-// Interface the client can implement to provide a custom stream writer. The
-// methods of this class may be called on any thread.
+/// Interface the client can implement to provide a custom stream writer. The
+/// methods of this class may be called on any thread.
 ///
 /*--cef(source=client)--*/
 class CefWriteHandler : public virtual CefBaseRefCounted {
  public:
   ///
-  // Write raw binary data.
+  /// Write raw binary data.
   ///
   /*--cef()--*/
   virtual size_t Write(const void* ptr, size_t size, size_t n) = 0;
 
   ///
-  // Seek to the specified offset position. |whence| may be any one of
-  // SEEK_CUR, SEEK_END or SEEK_SET. Return zero on success and non-zero on
-  // failure.
+  /// Seek to the specified offset position. |whence| may be any one of
+  /// SEEK_CUR, SEEK_END or SEEK_SET. Return zero on success and non-zero on
+  /// failure.
   ///
   /*--cef()--*/
-  virtual int Seek(int64 offset, int whence) = 0;
+  virtual int Seek(int64_t offset, int whence) = 0;
 
   ///
-  // Return the current offset position.
+  /// Return the current offset position.
   ///
   /*--cef()--*/
-  virtual int64 Tell() = 0;
+  virtual int64_t Tell() = 0;
 
   ///
-  // Flush the stream.
+  /// Flush the stream.
   ///
   /*--cef()--*/
   virtual int Flush() = 0;
 
   ///
-  // Return true if this handler performs work like accessing the file system
-  // which may block. Used as a hint for determining the thread to access the
-  // handler from.
+  /// Return true if this handler performs work like accessing the file system
+  /// which may block. Used as a hint for determining the thread to access the
+  /// handler from.
   ///
   /*--cef()--*/
   virtual bool MayBlock() = 0;
 };
 
 ///
-// Class used to write data to a stream. The methods of this class may be called
-// on any thread.
+/// Class used to write data to a stream. The methods of this class may be
+/// called on any thread.
 ///
 /*--cef(source=library)--*/
 class CefStreamWriter : public virtual CefBaseRefCounted {
  public:
   ///
-  // Create a new CefStreamWriter object for a file.
+  /// Create a new CefStreamWriter object for a file.
   ///
   /*--cef()--*/
   static CefRefPtr<CefStreamWriter> CreateForFile(const CefString& fileName);
   ///
-  // Create a new CefStreamWriter object for a custom handler.
+  /// Create a new CefStreamWriter object for a custom handler.
   ///
   /*--cef()--*/
   static CefRefPtr<CefStreamWriter> CreateForHandler(
       CefRefPtr<CefWriteHandler> handler);
 
   ///
-  // Write raw binary data.
+  /// Write raw binary data.
   ///
   /*--cef()--*/
   virtual size_t Write(const void* ptr, size_t size, size_t n) = 0;
 
   ///
-  // Seek to the specified offset position. |whence| may be any one of
-  // SEEK_CUR, SEEK_END or SEEK_SET. Returns zero on success and non-zero on
-  // failure.
+  /// Seek to the specified offset position. |whence| may be any one of
+  /// SEEK_CUR, SEEK_END or SEEK_SET. Returns zero on success and non-zero on
+  /// failure.
   ///
   /*--cef()--*/
-  virtual int Seek(int64 offset, int whence) = 0;
+  virtual int Seek(int64_t offset, int whence) = 0;
 
   ///
-  // Return the current offset position.
+  /// Return the current offset position.
   ///
   /*--cef()--*/
-  virtual int64 Tell() = 0;
+  virtual int64_t Tell() = 0;
 
   ///
-  // Flush the stream.
+  /// Flush the stream.
   ///
   /*--cef()--*/
   virtual int Flush() = 0;
 
   ///
-  // Returns true if this writer performs work like accessing the file system
-  // which may block. Used as a hint for determining the thread to access the
-  // writer from.
+  /// Returns true if this writer performs work like accessing the file system
+  /// which may block. Used as a hint for determining the thread to access the
+  /// writer from.
   ///
   /*--cef()--*/
   virtual bool MayBlock() = 0;
diff --git a/src/include/cef_string_visitor.h b/src/include/cef_string_visitor.h
index f23dfb6..c77e59c 100644
--- a/src/include/cef_string_visitor.h
+++ b/src/include/cef_string_visitor.h
@@ -40,13 +40,13 @@
 #include "include/cef_base.h"
 
 ///
-// Implement this interface to receive string values asynchronously.
+/// Implement this interface to receive string values asynchronously.
 ///
 /*--cef(source=client)--*/
 class CefStringVisitor : public virtual CefBaseRefCounted {
  public:
   ///
-  // Method that will be executed.
+  /// Method that will be executed.
   ///
   /*--cef(optional_param=string)--*/
   virtual void Visit(const CefString& string) = 0;
diff --git a/src/include/cef_task.h b/src/include/cef_task.h
index 642c69e..2e5085e 100644
--- a/src/include/cef_task.h
+++ b/src/include/cef_task.h
@@ -42,106 +42,107 @@
 typedef cef_thread_id_t CefThreadId;
 
 ///
-// Implement this interface for asynchronous task execution. If the task is
-// posted successfully and if the associated message loop is still running then
-// the Execute() method will be called on the target thread. If the task fails
-// to post then the task object may be destroyed on the source thread instead of
-// the target thread. For this reason be cautious when performing work in the
-// task object destructor.
+/// Implement this interface for asynchronous task execution. If the task is
+/// posted successfully and if the associated message loop is still running then
+/// the Execute() method will be called on the target thread. If the task fails
+/// to post then the task object may be destroyed on the source thread instead
+/// of the target thread. For this reason be cautious when performing work in
+/// the task object destructor.
 ///
 /*--cef(source=client,no_debugct_check)--*/
 class CefTask : public virtual CefBaseRefCounted {
  public:
   ///
-  // Method that will be executed on the target thread.
+  /// Method that will be executed on the target thread.
   ///
   /*--cef()--*/
   virtual void Execute() = 0;
 };
 
 ///
-// Class that asynchronously executes tasks on the associated thread. It is safe
-// to call the methods of this class on any thread.
-//
-// CEF maintains multiple internal threads that are used for handling different
-// types of tasks in different processes. The cef_thread_id_t definitions in
-// cef_types.h list the common CEF threads. Task runners are also available for
-// other CEF threads as appropriate (for example, V8 WebWorker threads).
+/// Class that asynchronously executes tasks on the associated thread. It is
+/// safe to call the methods of this class on any thread.
+///
+/// CEF maintains multiple internal threads that are used for handling different
+/// types of tasks in different processes. The cef_thread_id_t definitions in
+/// cef_types.h list the common CEF threads. Task runners are also available for
+/// other CEF threads as appropriate (for example, V8 WebWorker threads).
 ///
 /*--cef(source=library)--*/
 class CefTaskRunner : public virtual CefBaseRefCounted {
  public:
   ///
-  // Returns the task runner for the current thread. Only CEF threads will have
-  // task runners. An empty reference will be returned if this method is called
-  // on an invalid thread.
+  /// Returns the task runner for the current thread. Only CEF threads will have
+  /// task runners. An empty reference will be returned if this method is called
+  /// on an invalid thread.
   ///
   /*--cef()--*/
   static CefRefPtr<CefTaskRunner> GetForCurrentThread();
 
   ///
-  // Returns the task runner for the specified CEF thread.
+  /// Returns the task runner for the specified CEF thread.
   ///
   /*--cef()--*/
   static CefRefPtr<CefTaskRunner> GetForThread(CefThreadId threadId);
 
   ///
-  // Returns true if this object is pointing to the same task runner as |that|
-  // object.
+  /// Returns true if this object is pointing to the same task runner as |that|
+  /// object.
   ///
   /*--cef()--*/
   virtual bool IsSame(CefRefPtr<CefTaskRunner> that) = 0;
 
   ///
-  // Returns true if this task runner belongs to the current thread.
+  /// Returns true if this task runner belongs to the current thread.
   ///
   /*--cef()--*/
   virtual bool BelongsToCurrentThread() = 0;
 
   ///
-  // Returns true if this task runner is for the specified CEF thread.
+  /// Returns true if this task runner is for the specified CEF thread.
   ///
   /*--cef()--*/
   virtual bool BelongsToThread(CefThreadId threadId) = 0;
 
   ///
-  // Post a task for execution on the thread associated with this task runner.
-  // Execution will occur asynchronously.
+  /// Post a task for execution on the thread associated with this task runner.
+  /// Execution will occur asynchronously.
   ///
   /*--cef()--*/
   virtual bool PostTask(CefRefPtr<CefTask> task) = 0;
 
   ///
-  // Post a task for delayed execution on the thread associated with this task
-  // runner. Execution will occur asynchronously. Delayed tasks are not
-  // supported on V8 WebWorker threads and will be executed without the
-  // specified delay.
+  /// Post a task for delayed execution on the thread associated with this task
+  /// runner. Execution will occur asynchronously. Delayed tasks are not
+  /// supported on V8 WebWorker threads and will be executed without the
+  /// specified delay.
   ///
   /*--cef()--*/
-  virtual bool PostDelayedTask(CefRefPtr<CefTask> task, int64 delay_ms) = 0;
+  virtual bool PostDelayedTask(CefRefPtr<CefTask> task, int64_t delay_ms) = 0;
 };
 
 ///
-// Returns true if called on the specified thread. Equivalent to using
-// CefTaskRunner::GetForThread(threadId)->BelongsToCurrentThread().
+/// Returns true if called on the specified thread. Equivalent to using
+/// CefTaskRunner::GetForThread(threadId)->BelongsToCurrentThread().
 ///
 /*--cef()--*/
 bool CefCurrentlyOn(CefThreadId threadId);
 
 ///
-// Post a task for execution on the specified thread. Equivalent to
-// using CefTaskRunner::GetForThread(threadId)->PostTask(task).
+/// Post a task for execution on the specified thread. Equivalent to
+/// using CefTaskRunner::GetForThread(threadId)->PostTask(task).
 ///
 /*--cef()--*/
 bool CefPostTask(CefThreadId threadId, CefRefPtr<CefTask> task);
 
 ///
-// Post a task for delayed execution on the specified thread. Equivalent to
-// using CefTaskRunner::GetForThread(threadId)->PostDelayedTask(task, delay_ms).
+/// Post a task for delayed execution on the specified thread. Equivalent to
+/// using CefTaskRunner::GetForThread(threadId)->PostDelayedTask(task,
+/// delay_ms).
 ///
 /*--cef()--*/
 bool CefPostDelayedTask(CefThreadId threadId,
                         CefRefPtr<CefTask> task,
-                        int64 delay_ms);
+                        int64_t delay_ms);
 
 #endif  // CEF_INCLUDE_CEF_TASK_H_
diff --git a/src/include/cef_thread.h b/src/include/cef_thread.h
index 1d0bd4c..da00c1e 100644
--- a/src/include/cef_thread.h
+++ b/src/include/cef_thread.h
@@ -42,30 +42,30 @@
 #include "include/internal/cef_thread_internal.h"
 
 ///
-// A simple thread abstraction that establishes a message loop on a new thread.
-// The consumer uses CefTaskRunner to execute code on the thread's message loop.
-// The thread is terminated when the CefThread object is destroyed or Stop() is
-// called. All pending tasks queued on the thread's message loop will run to
-// completion before the thread is terminated. CreateThread() can be called on
-// any valid CEF thread in either the browser or render process. This class
-// should only be used for tasks that require a dedicated thread. In most cases
-// you can post tasks to an existing CEF thread instead of creating a new one;
-// see cef_task.h for details.
+/// A simple thread abstraction that establishes a message loop on a new thread.
+/// The consumer uses CefTaskRunner to execute code on the thread's message
+/// loop. The thread is terminated when the CefThread object is destroyed or
+/// Stop() is called. All pending tasks queued on the thread's message loop will
+/// run to completion before the thread is terminated. CreateThread() can be
+/// called on any valid CEF thread in either the browser or render process. This
+/// class should only be used for tasks that require a dedicated thread. In most
+/// cases you can post tasks to an existing CEF thread instead of creating a new
+/// one; see cef_task.h for details.
 ///
 /*--cef(source=library)--*/
 class CefThread : public CefBaseRefCounted {
  public:
   ///
-  // Create and start a new thread. This method does not block waiting for the
-  // thread to run initialization. |display_name| is the name that will be used
-  // to identify the thread. |priority| is the thread execution priority.
-  // |message_loop_type| indicates the set of asynchronous events that the
-  // thread can process. If |stoppable| is true the thread will stopped and
-  // joined on destruction or when Stop() is called; otherwise, the the thread
-  // cannot be stopped and will be leaked on shutdown. On Windows the
-  // |com_init_mode| value specifies how COM will be initialized for the thread.
-  // If |com_init_mode| is set to COM_INIT_MODE_STA then |message_loop_type|
-  // must be set to ML_TYPE_UI.
+  /// Create and start a new thread. This method does not block waiting for the
+  /// thread to run initialization. |display_name| is the name that will be used
+  /// to identify the thread. |priority| is the thread execution priority.
+  /// |message_loop_type| indicates the set of asynchronous events that the
+  /// thread can process. If |stoppable| is true the thread will stopped and
+  /// joined on destruction or when Stop() is called; otherwise, the thread
+  /// cannot be stopped and will be leaked on shutdown. On Windows the
+  /// |com_init_mode| value specifies how COM will be initialized for the
+  /// thread. If |com_init_mode| is set to COM_INIT_MODE_STA then
+  /// |message_loop_type| must be set to ML_TYPE_UI.
   ///
   /*--cef(optional_param=display_name)--*/
   static CefRefPtr<CefThread> CreateThread(
@@ -76,8 +76,8 @@
       cef_com_init_mode_t com_init_mode);
 
   ///
-  // Create and start a new thread with default/recommended values.
-  // |display_name| is the name that will be used to identify the thread.
+  /// Create and start a new thread with default/recommended values.
+  /// |display_name| is the name that will be used to identify the thread.
   ///
   static CefRefPtr<CefThread> CreateThread(const CefString& display_name) {
     return CreateThread(display_name, TP_NORMAL, ML_TYPE_DEFAULT, true,
@@ -85,30 +85,30 @@
   }
 
   ///
-  // Returns the CefTaskRunner that will execute code on this thread's message
-  // loop. This method is safe to call from any thread.
+  /// Returns the CefTaskRunner that will execute code on this thread's message
+  /// loop. This method is safe to call from any thread.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefTaskRunner> GetTaskRunner() = 0;
 
   ///
-  // Returns the platform thread ID. It will return the same value after Stop()
-  // is called. This method is safe to call from any thread.
+  /// Returns the platform thread ID. It will return the same value after Stop()
+  /// is called. This method is safe to call from any thread.
   ///
   /*--cef(default_retval=kInvalidPlatformThreadId)--*/
   virtual cef_platform_thread_id_t GetPlatformThreadId() = 0;
 
   ///
-  // Stop and join the thread. This method must be called from the same thread
-  // that called CreateThread(). Do not call this method if CreateThread() was
-  // called with a |stoppable| value of false.
+  /// Stop and join the thread. This method must be called from the same thread
+  /// that called CreateThread(). Do not call this method if CreateThread() was
+  /// called with a |stoppable| value of false.
   ///
   /*--cef()--*/
   virtual void Stop() = 0;
 
   ///
-  // Returns true if the thread is currently running. This method must be called
-  // from the same thread that called CreateThread().
+  /// Returns true if the thread is currently running. This method must be
+  /// called from the same thread that called CreateThread().
   ///
   /*--cef()--*/
   virtual bool IsRunning() = 0;
diff --git a/src/include/cef_trace.h b/src/include/cef_trace.h
index bc92d38..2fa71ee 100644
--- a/src/include/cef_trace.h
+++ b/src/include/cef_trace.h
@@ -45,66 +45,67 @@
 #include "include/cef_callback.h"
 
 ///
-// Implement this interface to receive notification when tracing has completed.
-// The methods of this class will be called on the browser process UI thread.
+/// Implement this interface to receive notification when tracing has completed.
+/// The methods of this class will be called on the browser process UI thread.
 ///
 /*--cef(source=client)--*/
 class CefEndTracingCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Called after all processes have sent their trace data. |tracing_file| is
-  // the path at which tracing data was written. The client is responsible for
-  // deleting |tracing_file|.
+  /// Called after all processes have sent their trace data. |tracing_file| is
+  /// the path at which tracing data was written. The client is responsible for
+  /// deleting |tracing_file|.
   ///
   /*--cef()--*/
   virtual void OnEndTracingComplete(const CefString& tracing_file) = 0;
 };
 
 ///
-// Start tracing events on all processes. Tracing is initialized asynchronously
-// and |callback| will be executed on the UI thread after initialization is
-// complete.
-//
-// If CefBeginTracing was called previously, or if a CefEndTracingAsync call is
-// pending, CefBeginTracing will fail and return false.
-//
-// |categories| is a comma-delimited list of category wildcards. A category can
-// have an optional '-' prefix to make it an excluded category. Having both
-// included and excluded categories in the same list is not supported.
-//
-// Example: "test_MyTest*"
-// Example: "test_MyTest*,test_OtherStuff"
-// Example: "-excluded_category1,-excluded_category2"
-//
-// This function must be called on the browser process UI thread.
+/// Start tracing events on all processes. Tracing is initialized asynchronously
+/// and |callback| will be executed on the UI thread after initialization is
+/// complete.
+///
+/// If CefBeginTracing was called previously, or if a CefEndTracingAsync call is
+/// pending, CefBeginTracing will fail and return false.
+///
+/// |categories| is a comma-delimited list of category wildcards. A category can
+/// have an optional '-' prefix to make it an excluded category. Having both
+/// included and excluded categories in the same list is not supported.
+///
+/// Examples:
+/// - "test_MyTest*"
+/// - "test_MyTest*,test_OtherStuff"
+/// - "-excluded_category1,-excluded_category2"
+///
+/// This function must be called on the browser process UI thread.
 ///
 /*--cef(optional_param=categories,optional_param=callback)--*/
 bool CefBeginTracing(const CefString& categories,
                      CefRefPtr<CefCompletionCallback> callback);
 
 ///
-// Stop tracing events on all processes.
-//
-// This function will fail and return false if a previous call to
-// CefEndTracingAsync is already pending or if CefBeginTracing was not called.
-//
-// |tracing_file| is the path at which tracing data will be written and
-// |callback| is the callback that will be executed once all processes have
-// sent their trace data. If |tracing_file| is empty a new temporary file path
-// will be used. If |callback| is empty no trace data will be written.
-//
-// This function must be called on the browser process UI thread.
+/// Stop tracing events on all processes.
+///
+/// This function will fail and return false if a previous call to
+/// CefEndTracingAsync is already pending or if CefBeginTracing was not called.
+///
+/// |tracing_file| is the path at which tracing data will be written and
+/// |callback| is the callback that will be executed once all processes have
+/// sent their trace data. If |tracing_file| is empty a new temporary file path
+/// will be used. If |callback| is empty no trace data will be written.
+///
+/// This function must be called on the browser process UI thread.
 ///
 /*--cef(optional_param=tracing_file,optional_param=callback)--*/
 bool CefEndTracing(const CefString& tracing_file,
                    CefRefPtr<CefEndTracingCallback> callback);
 
 ///
-// Returns the current system trace time or, if none is defined, the current
-// high-res time. Can be used by clients to synchronize with the time
-// information in trace events.
+/// Returns the current system trace time or, if none is defined, the current
+/// high-res time. Can be used by clients to synchronize with the time
+/// information in trace events.
 ///
 /*--cef()--*/
-int64 CefNowFromSystemTraceTime();
+int64_t CefNowFromSystemTraceTime();
 
 #endif  // CEF_INCLUDE_CEF_TRACE_H_
diff --git a/src/include/cef_urlrequest.h b/src/include/cef_urlrequest.h
index 8966eb8..77a82a6 100644
--- a/src/include/cef_urlrequest.h
+++ b/src/include/cef_urlrequest.h
@@ -47,11 +47,11 @@
 class CefURLRequestClient;
 
 ///
-// Class used to make a URL request. URL requests are not associated with a
-// browser instance so no CefClient callbacks will be executed. URL requests
-// can be created on any valid CEF thread in either the browser or render
-// process. Once created the methods of the URL request object must be accessed
-// on the same thread that created it.
+/// Class used to make a URL request. URL requests are not associated with a
+/// browser instance so no CefClient callbacks will be executed. URL requests
+/// can be created on any valid CEF thread in either the browser or render
+/// process. Once created the methods of the URL request object must be accessed
+/// on the same thread that created it.
 ///
 /*--cef(source=library)--*/
 class CefURLRequest : public virtual CefBaseRefCounted {
@@ -60,25 +60,19 @@
   typedef cef_errorcode_t ErrorCode;
 
   ///
-  // Create a new URL request that is not associated with a specific browser or
-  // frame. Use CefFrame::CreateURLRequest instead if you want the request to
-  // have this association, in which case it may be handled differently (see
-  // documentation on that method). Requests may originate from the both browser
-  // process and the render process.
-  //
-  // For requests originating from the browser process:
-  //   - It may be intercepted by the client via CefResourceRequestHandler or
-  //     CefSchemeHandlerFactory.
-  //   - POST data may only contain only a single element of type PDE_TYPE_FILE
-  //     or PDE_TYPE_BYTES.
-  //   - If |request_context| is empty the global request context will be used.
-  // For requests originating from the render process:
-  //   - It cannot be intercepted by the client so only http(s) and blob schemes
-  //     are supported.
-  //   - POST data may only contain a single element of type PDE_TYPE_BYTES.
-  //   - The |request_context| parameter must be NULL.
-  //
-  // The |request| object will be marked as read-only after calling this method.
+  /// Create a new URL request that is not associated with a specific browser or
+  /// frame. Use CefFrame::CreateURLRequest instead if you want the request to
+  /// have this association, in which case it may be handled differently (see
+  /// documentation on that method). A request created with this method may only
+  /// originate from the browser process, and will behave as follows:
+  ///   - It may be intercepted by the client via CefResourceRequestHandler or
+  ///     CefSchemeHandlerFactory.
+  ///   - POST data may only contain only a single element of type PDE_TYPE_FILE
+  ///     or PDE_TYPE_BYTES.
+  ///   - If |request_context| is empty the global request context will be used.
+  ///
+  /// The |request| object will be marked as read-only after calling this
+  /// method.
   ///
   /*--cef(optional_param=request_context)--*/
   static CefRefPtr<CefURLRequest> Create(
@@ -87,94 +81,94 @@
       CefRefPtr<CefRequestContext> request_context);
 
   ///
-  // Returns the request object used to create this URL request. The returned
-  // object is read-only and should not be modified.
+  /// Returns the request object used to create this URL request. The returned
+  /// object is read-only and should not be modified.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefRequest> GetRequest() = 0;
 
   ///
-  // Returns the client.
+  /// Returns the client.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefURLRequestClient> GetClient() = 0;
 
   ///
-  // Returns the request status.
+  /// Returns the request status.
   ///
   /*--cef(default_retval=UR_UNKNOWN)--*/
   virtual Status GetRequestStatus() = 0;
 
   ///
-  // Returns the request error if status is UR_CANCELED or UR_FAILED, or 0
-  // otherwise.
+  /// Returns the request error if status is UR_CANCELED or UR_FAILED, or 0
+  /// otherwise.
   ///
   /*--cef(default_retval=ERR_NONE)--*/
   virtual ErrorCode GetRequestError() = 0;
 
   ///
-  // Returns the response, or NULL if no response information is available.
-  // Response information will only be available after the upload has completed.
-  // The returned object is read-only and should not be modified.
+  /// Returns the response, or NULL if no response information is available.
+  /// Response information will only be available after the upload has
+  /// completed. The returned object is read-only and should not be modified.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefResponse> GetResponse() = 0;
 
   ///
-  // Returns true if the response body was served from the cache. This includes
-  // responses for which revalidation was required.
+  /// Returns true if the response body was served from the cache. This includes
+  /// responses for which revalidation was required.
   ///
   /*--cef()--*/
   virtual bool ResponseWasCached() = 0;
 
   ///
-  // Cancel the request.
+  /// Cancel the request.
   ///
   /*--cef()--*/
   virtual void Cancel() = 0;
 };
 
 ///
-// Interface that should be implemented by the CefURLRequest client. The
-// methods of this class will be called on the same thread that created the
-// request unless otherwise documented.
+/// Interface that should be implemented by the CefURLRequest client. The
+/// methods of this class will be called on the same thread that created the
+/// request unless otherwise documented.
 ///
 /*--cef(source=client)--*/
 class CefURLRequestClient : public virtual CefBaseRefCounted {
  public:
   ///
-  // Notifies the client that the request has completed. Use the
-  // CefURLRequest::GetRequestStatus method to determine if the request was
-  // successful or not.
+  /// Notifies the client that the request has completed. Use the
+  /// CefURLRequest::GetRequestStatus method to determine if the request was
+  /// successful or not.
   ///
   /*--cef()--*/
   virtual void OnRequestComplete(CefRefPtr<CefURLRequest> request) = 0;
 
   ///
-  // Notifies the client of upload progress. |current| denotes the number of
-  // bytes sent so far and |total| is the total size of uploading data (or -1 if
-  // chunked upload is enabled). This method will only be called if the
-  // UR_FLAG_REPORT_UPLOAD_PROGRESS flag is set on the request.
+  /// Notifies the client of upload progress. |current| denotes the number of
+  /// bytes sent so far and |total| is the total size of uploading data (or -1
+  /// if chunked upload is enabled). This method will only be called if the
+  /// UR_FLAG_REPORT_UPLOAD_PROGRESS flag is set on the request.
   ///
   /*--cef()--*/
   virtual void OnUploadProgress(CefRefPtr<CefURLRequest> request,
-                                int64 current,
-                                int64 total) = 0;
+                                int64_t current,
+                                int64_t total) = 0;
 
   ///
-  // Notifies the client of download progress. |current| denotes the number of
-  // bytes received up to the call and |total| is the expected total size of the
-  // response (or -1 if not determined).
+  /// Notifies the client of download progress. |current| denotes the number of
+  /// bytes received up to the call and |total| is the expected total size of
+  /// the response (or -1 if not determined).
   ///
   /*--cef()--*/
   virtual void OnDownloadProgress(CefRefPtr<CefURLRequest> request,
-                                  int64 current,
-                                  int64 total) = 0;
+                                  int64_t current,
+                                  int64_t total) = 0;
 
   ///
-  // Called when some part of the response is read. |data| contains the current
-  // bytes received since the last call. This method will not be called if the
-  // UR_FLAG_NO_DOWNLOAD_DATA flag is set on the request.
+  /// Called when some part of the response is read. |data| contains the current
+  /// bytes received since the last call. This method will not be called if the
+  /// UR_FLAG_NO_DOWNLOAD_DATA flag is set on the request.
   ///
   /*--cef()--*/
   virtual void OnDownloadData(CefRefPtr<CefURLRequest> request,
@@ -182,15 +176,15 @@
                               size_t data_length) = 0;
 
   ///
-  // Called on the IO thread when the browser needs credentials from the user.
-  // |isProxy| indicates whether the host is a proxy server. |host| contains the
-  // hostname and |port| contains the port number. Return true to continue the
-  // request and call CefAuthCallback::Continue() when the authentication
-  // information is available. If the request has an associated browser/frame
-  // then returning false will result in a call to GetAuthCredentials on the
-  // CefRequestHandler associated with that browser, if any. Otherwise,
-  // returning false will cancel the request immediately. This method will only
-  // be called for requests initiated from the browser process.
+  /// Called on the IO thread when the browser needs credentials from the user.
+  /// |isProxy| indicates whether the host is a proxy server. |host| contains
+  /// the hostname and |port| contains the port number. Return true to continue
+  /// the request and call CefAuthCallback::Continue() when the authentication
+  /// information is available. If the request has an associated browser/frame
+  /// then returning false will result in a call to GetAuthCredentials on the
+  /// CefRequestHandler associated with that browser, if any. Otherwise,
+  /// returning false will cancel the request immediately. This method will only
+  /// be called for requests initiated from the browser process.
   ///
   /*--cef(optional_param=realm)--*/
   virtual bool GetAuthCredentials(bool isProxy,
diff --git a/src/include/cef_v8.h b/src/include/cef_v8.h
index 8bbc028..f6a01c1 100644
--- a/src/include/cef_v8.h
+++ b/src/include/cef_v8.h
@@ -50,63 +50,64 @@
 class CefV8Value;
 
 ///
-// Register a new V8 extension with the specified JavaScript extension code and
-// handler. Functions implemented by the handler are prototyped using the
-// keyword 'native'. The calling of a native function is restricted to the scope
-// in which the prototype of the native function is defined. This function may
-// only be called on the render process main thread.
-//
-// Example JavaScript extension code:
-// <pre>
-//   // create the 'example' global object if it doesn't already exist.
-//   if (!example)
-//     example = {};
-//   // create the 'example.test' global object if it doesn't already exist.
-//   if (!example.test)
-//     example.test = {};
-//   (function() {
-//     // Define the function 'example.test.myfunction'.
-//     example.test.myfunction = function() {
-//       // Call CefV8Handler::Execute() with the function name 'MyFunction'
-//       // and no arguments.
-//       native function MyFunction();
-//       return MyFunction();
-//     };
-//     // Define the getter function for parameter 'example.test.myparam'.
-//     example.test.__defineGetter__('myparam', function() {
-//       // Call CefV8Handler::Execute() with the function name 'GetMyParam'
-//       // and no arguments.
-//       native function GetMyParam();
-//       return GetMyParam();
-//     });
-//     // Define the setter function for parameter 'example.test.myparam'.
-//     example.test.__defineSetter__('myparam', function(b) {
-//       // Call CefV8Handler::Execute() with the function name 'SetMyParam'
-//       // and a single argument.
-//       native function SetMyParam();
-//       if(b) SetMyParam(b);
-//     });
-//
-//     // Extension definitions can also contain normal JavaScript variables
-//     // and functions.
-//     var myint = 0;
-//     example.test.increment = function() {
-//       myint += 1;
-//       return myint;
-//     };
-//   })();
-// </pre>
-// Example usage in the page:
-// <pre>
-//   // Call the function.
-//   example.test.myfunction();
-//   // Set the parameter.
-//   example.test.myparam = value;
-//   // Get the parameter.
-//   value = example.test.myparam;
-//   // Call another function.
-//   example.test.increment();
-// </pre>
+/// Register a new V8 extension with the specified JavaScript extension code and
+/// handler. Functions implemented by the handler are prototyped using the
+/// keyword 'native'. The calling of a native function is restricted to the
+/// scope in which the prototype of the native function is defined. This
+/// function may only be called on the render process main thread.
+///
+/// Example JavaScript extension code:
+/// <pre>
+///   // create the 'example' global object if it doesn't already exist.
+///   if (!example)
+///     example = {};
+///   // create the 'example.test' global object if it doesn't already exist.
+///   if (!example.test)
+///     example.test = {};
+///   (function() {
+///     // Define the function 'example.test.myfunction'.
+///     example.test.myfunction = function() {
+///       // Call CefV8Handler::Execute() with the function name 'MyFunction'
+///       // and no arguments.
+///       native function MyFunction();
+///       return MyFunction();
+///     };
+///     // Define the getter function for parameter 'example.test.myparam'.
+///     example.test.__defineGetter__('myparam', function() {
+///       // Call CefV8Handler::Execute() with the function name 'GetMyParam'
+///       // and no arguments.
+///       native function GetMyParam();
+///       return GetMyParam();
+///     });
+///     // Define the setter function for parameter 'example.test.myparam'.
+///     example.test.__defineSetter__('myparam', function(b) {
+///       // Call CefV8Handler::Execute() with the function name 'SetMyParam'
+///       // and a single argument.
+///       native function SetMyParam();
+///       if(b) SetMyParam(b);
+///     });
+///
+///     // Extension definitions can also contain normal JavaScript variables
+///     // and functions.
+///     var myint = 0;
+///     example.test.increment = function() {
+///       myint += 1;
+///       return myint;
+///     };
+///   })();
+/// </pre>
+///
+/// Example usage in the page:
+/// <pre>
+///   // Call the function.
+///   example.test.myfunction();
+///   // Set the parameter.
+///   example.test.myparam = value;
+///   // Get the parameter.
+///   value = example.test.myparam;
+///   // Call another function.
+///   example.test.increment();
+/// </pre>
 ///
 /*--cef(optional_param=handler)--*/
 bool CefRegisterExtension(const CefString& extension_name,
@@ -114,101 +115,101 @@
                           CefRefPtr<CefV8Handler> handler);
 
 ///
-// Class representing a V8 context handle. V8 handles can only be accessed from
-// the thread on which they are created. Valid threads for creating a V8 handle
-// include the render process main thread (TID_RENDERER) and WebWorker threads.
-// A task runner for posting tasks on the associated thread can be retrieved via
-// the CefV8Context::GetTaskRunner() method.
+/// Class representing a V8 context handle. V8 handles can only be accessed from
+/// the thread on which they are created. Valid threads for creating a V8 handle
+/// include the render process main thread (TID_RENDERER) and WebWorker threads.
+/// A task runner for posting tasks on the associated thread can be retrieved
+/// via the CefV8Context::GetTaskRunner() method.
 ///
 /*--cef(source=library,no_debugct_check)--*/
 class CefV8Context : public virtual CefBaseRefCounted {
  public:
   ///
-  // Returns the current (top) context object in the V8 context stack.
+  /// Returns the current (top) context object in the V8 context stack.
   ///
   /*--cef()--*/
   static CefRefPtr<CefV8Context> GetCurrentContext();
 
   ///
-  // Returns the entered (bottom) context object in the V8 context stack.
+  /// Returns the entered (bottom) context object in the V8 context stack.
   ///
   /*--cef()--*/
   static CefRefPtr<CefV8Context> GetEnteredContext();
 
   ///
-  // Returns true if V8 is currently inside a context.
+  /// Returns true if V8 is currently inside a context.
   ///
   /*--cef()--*/
   static bool InContext();
 
   ///
-  // Returns the task runner associated with this context. V8 handles can only
-  // be accessed from the thread on which they are created. This method can be
-  // called on any render process thread.
+  /// Returns the task runner associated with this context. V8 handles can only
+  /// be accessed from the thread on which they are created. This method can be
+  /// called on any render process thread.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefTaskRunner> GetTaskRunner() = 0;
 
   ///
-  // Returns true if the underlying handle is valid and it can be accessed on
-  // the current thread. Do not call any other methods if this method returns
-  // false.
+  /// Returns true if the underlying handle is valid and it can be accessed on
+  /// the current thread. Do not call any other methods if this method returns
+  /// false.
   ///
   /*--cef()--*/
   virtual bool IsValid() = 0;
 
   ///
-  // Returns the browser for this context. This method will return an empty
-  // reference for WebWorker contexts.
+  /// Returns the browser for this context. This method will return an empty
+  /// reference for WebWorker contexts.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefBrowser> GetBrowser() = 0;
 
   ///
-  // Returns the frame for this context. This method will return an empty
-  // reference for WebWorker contexts.
+  /// Returns the frame for this context. This method will return an empty
+  /// reference for WebWorker contexts.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefFrame> GetFrame() = 0;
 
   ///
-  // Returns the global object for this context. The context must be entered
-  // before calling this method.
+  /// Returns the global object for this context. The context must be entered
+  /// before calling this method.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefV8Value> GetGlobal() = 0;
 
   ///
-  // Enter this context. A context must be explicitly entered before creating a
-  // V8 Object, Array, Function or Date asynchronously. Exit() must be called
-  // the same number of times as Enter() before releasing this context. V8
-  // objects belong to the context in which they are created. Returns true if
-  // the scope was entered successfully.
+  /// Enter this context. A context must be explicitly entered before creating a
+  /// V8 Object, Array, Function or Date asynchronously. Exit() must be called
+  /// the same number of times as Enter() before releasing this context. V8
+  /// objects belong to the context in which they are created. Returns true if
+  /// the scope was entered successfully.
   ///
   /*--cef()--*/
   virtual bool Enter() = 0;
 
   ///
-  // Exit this context. Call this method only after calling Enter(). Returns
-  // true if the scope was exited successfully.
+  /// Exit this context. Call this method only after calling Enter(). Returns
+  /// true if the scope was exited successfully.
   ///
   /*--cef()--*/
   virtual bool Exit() = 0;
 
   ///
-  // Returns true if this object is pointing to the same handle as |that|
-  // object.
+  /// Returns true if this object is pointing to the same handle as |that|
+  /// object.
   ///
   /*--cef()--*/
   virtual bool IsSame(CefRefPtr<CefV8Context> that) = 0;
 
   ///
-  // Execute a string of JavaScript code in this V8 context. The |script_url|
-  // parameter is the URL where the script in question can be found, if any.
-  // The |start_line| parameter is the base line number to use for error
-  // reporting. On success |retval| will be set to the return value, if any, and
-  // the function will return true. On failure |exception| will be set to the
-  // exception, if any, and the function will return false.
+  /// Execute a string of JavaScript code in this V8 context. The |script_url|
+  /// parameter is the URL where the script in question can be found, if any.
+  /// The |start_line| parameter is the base line number to use for error
+  /// reporting. On success |retval| will be set to the return value, if any,
+  /// and the function will return true. On failure |exception| will be set to
+  /// the exception, if any, and the function will return false.
   ///
   /*--cef(optional_param=script_url)--*/
   virtual bool Eval(const CefString& code,
@@ -221,18 +222,19 @@
 typedef std::vector<CefRefPtr<CefV8Value>> CefV8ValueList;
 
 ///
-// Interface that should be implemented to handle V8 function calls. The methods
-// of this class will be called on the thread associated with the V8 function.
+/// Interface that should be implemented to handle V8 function calls. The
+/// methods of this class will be called on the thread associated with the V8
+/// function.
 ///
 /*--cef(source=client,no_debugct_check)--*/
 class CefV8Handler : public virtual CefBaseRefCounted {
  public:
   ///
-  // Handle execution of the function identified by |name|. |object| is the
-  // receiver ('this' object) of the function. |arguments| is the list of
-  // arguments passed to the function. If execution succeeds set |retval| to the
-  // function return value. If execution fails set |exception| to the exception
-  // that will be thrown. Return true if execution was handled.
+  /// Handle execution of the function identified by |name|. |object| is the
+  /// receiver ('this' object) of the function. |arguments| is the list of
+  /// arguments passed to the function. If execution succeeds set |retval| to
+  /// the function return value. If execution fails set |exception| to the
+  /// exception that will be thrown. Return true if execution was handled.
   ///
   /*--cef()--*/
   virtual bool Execute(const CefString& name,
@@ -243,19 +245,19 @@
 };
 
 ///
-// Interface that should be implemented to handle V8 accessor calls. Accessor
-// identifiers are registered by calling CefV8Value::SetValue(). The methods
-// of this class will be called on the thread associated with the V8 accessor.
+/// Interface that should be implemented to handle V8 accessor calls. Accessor
+/// identifiers are registered by calling CefV8Value::SetValue(). The methods
+/// of this class will be called on the thread associated with the V8 accessor.
 ///
 /*--cef(source=client,no_debugct_check)--*/
 class CefV8Accessor : public virtual CefBaseRefCounted {
  public:
   ///
-  // Handle retrieval the accessor value identified by |name|. |object| is the
-  // receiver ('this' object) of the accessor. If retrieval succeeds set
-  // |retval| to the return value. If retrieval fails set |exception| to the
-  // exception that will be thrown. Return true if accessor retrieval was
-  // handled.
+  /// Handle retrieval the accessor value identified by |name|. |object| is the
+  /// receiver ('this' object) of the accessor. If retrieval succeeds set
+  /// |retval| to the return value. If retrieval fails set |exception| to the
+  /// exception that will be thrown. Return true if accessor retrieval was
+  /// handled.
   ///
   /*--cef()--*/
   virtual bool Get(const CefString& name,
@@ -264,11 +266,11 @@
                    CefString& exception) = 0;
 
   ///
-  // Handle assignment of the accessor value identified by |name|. |object| is
-  // the receiver ('this' object) of the accessor. |value| is the new value
-  // being assigned to the accessor. If assignment fails set |exception| to the
-  // exception that will be thrown. Return true if accessor assignment was
-  // handled.
+  /// Handle assignment of the accessor value identified by |name|. |object| is
+  /// the receiver ('this' object) of the accessor. |value| is the new value
+  /// being assigned to the accessor. If assignment fails set |exception| to the
+  /// exception that will be thrown. Return true if accessor assignment was
+  /// handled.
   ///
   /*--cef()--*/
   virtual bool Set(const CefString& name,
@@ -278,24 +280,24 @@
 };
 
 ///
-// Interface that should be implemented to handle V8 interceptor calls. The
-// methods of this class will be called on the thread associated with the V8
-// interceptor. Interceptor's named property handlers (with first argument of
-// type CefString) are called when object is indexed by string. Indexed property
-// handlers (with first argument of type int) are called when object is indexed
-// by integer.
+/// Interface that should be implemented to handle V8 interceptor calls. The
+/// methods of this class will be called on the thread associated with the V8
+/// interceptor. Interceptor's named property handlers (with first argument of
+/// type CefString) are called when object is indexed by string. Indexed
+/// property handlers (with first argument of type int) are called when object
+/// is indexed by integer.
 ///
 /*--cef(source=client,no_debugct_check)--*/
 class CefV8Interceptor : public virtual CefBaseRefCounted {
  public:
   ///
-  // Handle retrieval of the interceptor value identified by |name|. |object| is
-  // the receiver ('this' object) of the interceptor. If retrieval succeeds, set
-  // |retval| to the return value. If the requested value does not exist, don't
-  // set either |retval| or |exception|. If retrieval fails, set |exception| to
-  // the exception that will be thrown. If the property has an associated
-  // accessor, it will be called only if you don't set |retval|.
-  // Return true if interceptor retrieval was handled, false otherwise.
+  /// Handle retrieval of the interceptor value identified by |name|. |object|
+  /// is the receiver ('this' object) of the interceptor. If retrieval succeeds,
+  /// set |retval| to the return value. If the requested value does not exist,
+  /// don't set either |retval| or |exception|. If retrieval fails, set
+  /// |exception| to the exception that will be thrown. If the property has an
+  /// associated accessor, it will be called only if you don't set |retval|.
+  /// Return true if interceptor retrieval was handled, false otherwise.
   ///
   /*--cef(capi_name=get_byname)--*/
   virtual bool Get(const CefString& name,
@@ -304,12 +306,12 @@
                    CefString& exception) = 0;
 
   ///
-  // Handle retrieval of the interceptor value identified by |index|. |object|
-  // is the receiver ('this' object) of the interceptor. If retrieval succeeds,
-  // set |retval| to the return value. If the requested value does not exist,
-  // don't set either |retval| or |exception|. If retrieval fails, set
-  // |exception| to the exception that will be thrown.
-  // Return true if interceptor retrieval was handled, false otherwise.
+  /// Handle retrieval of the interceptor value identified by |index|. |object|
+  /// is the receiver ('this' object) of the interceptor. If retrieval succeeds,
+  /// set |retval| to the return value. If the requested value does not exist,
+  /// don't set either |retval| or |exception|. If retrieval fails, set
+  /// |exception| to the exception that will be thrown.
+  /// Return true if interceptor retrieval was handled, false otherwise.
   ///
   /*--cef(capi_name=get_byindex,index_param=index)--*/
   virtual bool Get(int index,
@@ -318,12 +320,12 @@
                    CefString& exception) = 0;
 
   ///
-  // Handle assignment of the interceptor value identified by |name|. |object|
-  // is the receiver ('this' object) of the interceptor. |value| is the new
-  // value being assigned to the interceptor. If assignment fails, set
-  // |exception| to the exception that will be thrown. This setter will always
-  // be called, even when the property has an associated accessor.
-  // Return true if interceptor assignment was handled, false otherwise.
+  /// Handle assignment of the interceptor value identified by |name|. |object|
+  /// is the receiver ('this' object) of the interceptor. |value| is the new
+  /// value being assigned to the interceptor. If assignment fails, set
+  /// |exception| to the exception that will be thrown. This setter will always
+  /// be called, even when the property has an associated accessor.
+  /// Return true if interceptor assignment was handled, false otherwise.
   ///
   /*--cef(capi_name=set_byname)--*/
   virtual bool Set(const CefString& name,
@@ -332,11 +334,11 @@
                    CefString& exception) = 0;
 
   ///
-  // Handle assignment of the interceptor value identified by |index|. |object|
-  // is the receiver ('this' object) of the interceptor. |value| is the new
-  // value being assigned to the interceptor. If assignment fails, set
-  // |exception| to the exception that will be thrown.
-  // Return true if interceptor assignment was handled, false otherwise.
+  /// Handle assignment of the interceptor value identified by |index|. |object|
+  /// is the receiver ('this' object) of the interceptor. |value| is the new
+  /// value being assigned to the interceptor. If assignment fails, set
+  /// |exception| to the exception that will be thrown.
+  /// Return true if interceptor assignment was handled, false otherwise.
   ///
   /*--cef(capi_name=set_byindex,index_param=index)--*/
   virtual bool Set(int index,
@@ -346,88 +348,88 @@
 };
 
 ///
-// Class representing a V8 exception. The methods of this class may be called on
-// any render process thread.
+/// Class representing a V8 exception. The methods of this class may be called
+/// on any render process thread.
 ///
 /*--cef(source=library,no_debugct_check)--*/
 class CefV8Exception : public virtual CefBaseRefCounted {
  public:
   ///
-  // Returns the exception message.
+  /// Returns the exception message.
   ///
   /*--cef()--*/
   virtual CefString GetMessage() = 0;
 
   ///
-  // Returns the line of source code that the exception occurred within.
+  /// Returns the line of source code that the exception occurred within.
   ///
   /*--cef()--*/
   virtual CefString GetSourceLine() = 0;
 
   ///
-  // Returns the resource name for the script from where the function causing
-  // the error originates.
+  /// Returns the resource name for the script from where the function causing
+  /// the error originates.
   ///
   /*--cef()--*/
   virtual CefString GetScriptResourceName() = 0;
 
   ///
-  // Returns the 1-based number of the line where the error occurred or 0 if the
-  // line number is unknown.
+  /// Returns the 1-based number of the line where the error occurred or 0 if
+  /// the line number is unknown.
   ///
   /*--cef()--*/
   virtual int GetLineNumber() = 0;
 
   ///
-  // Returns the index within the script of the first character where the error
-  // occurred.
+  /// Returns the index within the script of the first character where the error
+  /// occurred.
   ///
   /*--cef()--*/
   virtual int GetStartPosition() = 0;
 
   ///
-  // Returns the index within the script of the last character where the error
-  // occurred.
+  /// Returns the index within the script of the last character where the error
+  /// occurred.
   ///
   /*--cef()--*/
   virtual int GetEndPosition() = 0;
 
   ///
-  // Returns the index within the line of the first character where the error
-  // occurred.
+  /// Returns the index within the line of the first character where the error
+  /// occurred.
   ///
   /*--cef()--*/
   virtual int GetStartColumn() = 0;
 
   ///
-  // Returns the index within the line of the last character where the error
-  // occurred.
+  /// Returns the index within the line of the last character where the error
+  /// occurred.
   ///
   /*--cef()--*/
   virtual int GetEndColumn() = 0;
 };
 
 ///
-// Callback interface that is passed to CefV8Value::CreateArrayBuffer.
+/// Callback interface that is passed to CefV8Value::CreateArrayBuffer.
 ///
 /*--cef(source=client,no_debugct_check)--*/
 class CefV8ArrayBufferReleaseCallback : public virtual CefBaseRefCounted {
  public:
   ///
-  // Called to release |buffer| when the ArrayBuffer JS object is garbage
-  // collected. |buffer| is the value that was passed to CreateArrayBuffer along
-  // with this object.
+  /// Called to release |buffer| when the ArrayBuffer JS object is garbage
+  /// collected. |buffer| is the value that was passed to CreateArrayBuffer
+  /// along with this object.
   ///
   /*--cef()--*/
   virtual void ReleaseBuffer(void* buffer) = 0;
 };
 
 ///
-// Class representing a V8 value handle. V8 handles can only be accessed from
-// the thread on which they are created. Valid threads for creating a V8 handle
-// include the render process main thread (TID_RENDERER) and WebWorker threads.
-// A task runner for posting tasks on the associated thread can be retrieved via
-// the CefV8Context::GetTaskRunner() method.
+/// Class representing a V8 value handle. V8 handles can only be accessed from
+/// the thread on which they are created. Valid threads for creating a V8 handle
+/// include the render process main thread (TID_RENDERER) and WebWorker threads.
+/// A task runner for posting tasks on the associated thread can be retrieved
+/// via the CefV8Context::GetTaskRunner() method.
 ///
 /*--cef(source=library,no_debugct_check)--*/
 class CefV8Value : public virtual CefBaseRefCounted {
@@ -436,62 +438,62 @@
   typedef cef_v8_propertyattribute_t PropertyAttribute;
 
   ///
-  // Create a new CefV8Value object of type undefined.
+  /// Create a new CefV8Value object of type undefined.
   ///
   /*--cef()--*/
   static CefRefPtr<CefV8Value> CreateUndefined();
 
   ///
-  // Create a new CefV8Value object of type null.
+  /// Create a new CefV8Value object of type null.
   ///
   /*--cef()--*/
   static CefRefPtr<CefV8Value> CreateNull();
 
   ///
-  // Create a new CefV8Value object of type bool.
+  /// Create a new CefV8Value object of type bool.
   ///
   /*--cef()--*/
   static CefRefPtr<CefV8Value> CreateBool(bool value);
 
   ///
-  // Create a new CefV8Value object of type int.
+  /// Create a new CefV8Value object of type int.
   ///
   /*--cef()--*/
-  static CefRefPtr<CefV8Value> CreateInt(int32 value);
+  static CefRefPtr<CefV8Value> CreateInt(int32_t value);
 
   ///
-  // Create a new CefV8Value object of type unsigned int.
+  /// Create a new CefV8Value object of type unsigned int.
   ///
   /*--cef()--*/
-  static CefRefPtr<CefV8Value> CreateUInt(uint32 value);
+  static CefRefPtr<CefV8Value> CreateUInt(uint32_t value);
 
   ///
-  // Create a new CefV8Value object of type double.
+  /// Create a new CefV8Value object of type double.
   ///
   /*--cef()--*/
   static CefRefPtr<CefV8Value> CreateDouble(double value);
 
   ///
-  // Create a new CefV8Value object of type Date. This method should only be
-  // called from within the scope of a CefRenderProcessHandler, CefV8Handler or
-  // CefV8Accessor callback, or in combination with calling Enter() and Exit()
-  // on a stored CefV8Context reference.
+  /// Create a new CefV8Value object of type Date. This method should only be
+  /// called from within the scope of a CefRenderProcessHandler, CefV8Handler or
+  /// CefV8Accessor callback, or in combination with calling Enter() and Exit()
+  /// on a stored CefV8Context reference.
   ///
   /*--cef()--*/
-  static CefRefPtr<CefV8Value> CreateDate(const CefTime& date);
+  static CefRefPtr<CefV8Value> CreateDate(CefBaseTime date);
 
   ///
-  // Create a new CefV8Value object of type string.
+  /// Create a new CefV8Value object of type string.
   ///
   /*--cef(optional_param=value)--*/
   static CefRefPtr<CefV8Value> CreateString(const CefString& value);
 
   ///
-  // Create a new CefV8Value object of type object with optional accessor and/or
-  // interceptor. This method should only be called from within the scope of a
-  // CefRenderProcessHandler, CefV8Handler or CefV8Accessor callback, or in
-  // combination with calling Enter() and Exit() on a stored CefV8Context
-  // reference.
+  /// Create a new CefV8Value object of type object with optional accessor
+  /// and/or interceptor. This method should only be called from within the
+  /// scope of a CefRenderProcessHandler, CefV8Handler or CefV8Accessor
+  /// callback, or in combination with calling Enter() and Exit() on a stored
+  /// CefV8Context reference.
   ///
   /*--cef(optional_param=accessor, optional_param=interceptor)--*/
   static CefRefPtr<CefV8Value> CreateObject(
@@ -499,260 +501,275 @@
       CefRefPtr<CefV8Interceptor> interceptor);
 
   ///
-  // Create a new CefV8Value object of type array with the specified |length|.
-  // If |length| is negative the returned array will have length 0. This method
-  // should only be called from within the scope of a CefRenderProcessHandler,
-  // CefV8Handler or CefV8Accessor callback, or in combination with calling
-  // Enter() and Exit() on a stored CefV8Context reference.
+  /// Create a new CefV8Value object of type array with the specified |length|.
+  /// If |length| is negative the returned array will have length 0. This method
+  /// should only be called from within the scope of a CefRenderProcessHandler,
+  /// CefV8Handler or CefV8Accessor callback, or in combination with calling
+  /// Enter() and Exit() on a stored CefV8Context reference.
   ///
   /*--cef()--*/
   static CefRefPtr<CefV8Value> CreateArray(int length);
 
   ///
-  // Create a new CefV8Value object of type ArrayBuffer which wraps the provided
-  // |buffer| of size |length| bytes. The ArrayBuffer is externalized, meaning
-  // that it does not own |buffer|. The caller is responsible for freeing
-  // |buffer| when requested via a call to CefV8ArrayBufferReleaseCallback::
-  // ReleaseBuffer. This method should only be called from within the scope of a
-  // CefRenderProcessHandler, CefV8Handler or CefV8Accessor callback, or in
-  // combination with calling Enter() and Exit() on a stored CefV8Context
-  // reference.
+  /// Create a new CefV8Value object of type ArrayBuffer which wraps the
+  /// provided |buffer| of size |length| bytes. The ArrayBuffer is externalized,
+  /// meaning that it does not own |buffer|. The caller is responsible for
+  /// freeing |buffer| when requested via a call to
+  /// CefV8ArrayBufferReleaseCallback::ReleaseBuffer. This method should only
+  /// be called from within the scope of a CefRenderProcessHandler, CefV8Handler
+  /// or CefV8Accessor callback, or in combination with calling Enter() and
+  /// Exit() on a stored CefV8Context reference.
   ///
-  /*--cef()--*/
+  /*--cef(optional_param=buffer)--*/
   static CefRefPtr<CefV8Value> CreateArrayBuffer(
       void* buffer,
       size_t length,
       CefRefPtr<CefV8ArrayBufferReleaseCallback> release_callback);
 
   ///
-  // Create a new CefV8Value object of type function. This method should only be
-  // called from within the scope of a CefRenderProcessHandler, CefV8Handler or
-  // CefV8Accessor callback, or in combination with calling Enter() and Exit()
-  // on a stored CefV8Context reference.
+  /// Create a new CefV8Value object of type function. This method should only
+  /// be called from within the scope of a CefRenderProcessHandler, CefV8Handler
+  /// or CefV8Accessor callback, or in combination with calling Enter() and
+  /// Exit() on a stored CefV8Context reference.
   ///
   /*--cef()--*/
   static CefRefPtr<CefV8Value> CreateFunction(const CefString& name,
                                               CefRefPtr<CefV8Handler> handler);
 
   ///
-  // Returns true if the underlying handle is valid and it can be accessed on
-  // the current thread. Do not call any other methods if this method returns
-  // false.
+  /// Create a new CefV8Value object of type Promise. This method should only be
+  /// called from within the scope of a CefRenderProcessHandler, CefV8Handler or
+  /// CefV8Accessor callback, or in combination with calling Enter() and Exit()
+  /// on a stored CefV8Context reference.
+  ///
+  /*--cef()--*/
+  static CefRefPtr<CefV8Value> CreatePromise();
+
+  ///
+  /// Returns true if the underlying handle is valid and it can be accessed on
+  /// the current thread. Do not call any other methods if this method returns
+  /// false.
   ///
   /*--cef()--*/
   virtual bool IsValid() = 0;
 
   ///
-  // True if the value type is undefined.
+  /// True if the value type is undefined.
   ///
   /*--cef()--*/
   virtual bool IsUndefined() = 0;
 
   ///
-  // True if the value type is null.
+  /// True if the value type is null.
   ///
   /*--cef()--*/
   virtual bool IsNull() = 0;
 
   ///
-  // True if the value type is bool.
+  /// True if the value type is bool.
   ///
   /*--cef()--*/
   virtual bool IsBool() = 0;
 
   ///
-  // True if the value type is int.
+  /// True if the value type is int.
   ///
   /*--cef()--*/
   virtual bool IsInt() = 0;
 
   ///
-  // True if the value type is unsigned int.
+  /// True if the value type is unsigned int.
   ///
   /*--cef()--*/
   virtual bool IsUInt() = 0;
 
   ///
-  // True if the value type is double.
+  /// True if the value type is double.
   ///
   /*--cef()--*/
   virtual bool IsDouble() = 0;
 
   ///
-  // True if the value type is Date.
+  /// True if the value type is Date.
   ///
   /*--cef()--*/
   virtual bool IsDate() = 0;
 
   ///
-  // True if the value type is string.
+  /// True if the value type is string.
   ///
   /*--cef()--*/
   virtual bool IsString() = 0;
 
   ///
-  // True if the value type is object.
+  /// True if the value type is object.
   ///
   /*--cef()--*/
   virtual bool IsObject() = 0;
 
   ///
-  // True if the value type is array.
+  /// True if the value type is array.
   ///
   /*--cef()--*/
   virtual bool IsArray() = 0;
 
   ///
-  // True if the value type is an ArrayBuffer.
+  /// True if the value type is an ArrayBuffer.
   ///
   /*--cef()--*/
   virtual bool IsArrayBuffer() = 0;
 
   ///
-  // True if the value type is function.
+  /// True if the value type is function.
   ///
   /*--cef()--*/
   virtual bool IsFunction() = 0;
 
   ///
-  // Returns true if this object is pointing to the same handle as |that|
-  // object.
+  /// True if the value type is a Promise.
+  ///
+  /*--cef()--*/
+  virtual bool IsPromise() = 0;
+
+  ///
+  /// Returns true if this object is pointing to the same handle as |that|
+  /// object.
   ///
   /*--cef()--*/
   virtual bool IsSame(CefRefPtr<CefV8Value> that) = 0;
 
   ///
-  // Return a bool value.
+  /// Return a bool value.
   ///
   /*--cef()--*/
   virtual bool GetBoolValue() = 0;
 
   ///
-  // Return an int value.
+  /// Return an int value.
   ///
   /*--cef()--*/
-  virtual int32 GetIntValue() = 0;
+  virtual int32_t GetIntValue() = 0;
 
   ///
-  // Return an unsigned int value.
+  /// Return an unsigned int value.
   ///
   /*--cef()--*/
-  virtual uint32 GetUIntValue() = 0;
+  virtual uint32_t GetUIntValue() = 0;
 
   ///
-  // Return a double value.
+  /// Return a double value.
   ///
   /*--cef()--*/
   virtual double GetDoubleValue() = 0;
 
   ///
-  // Return a Date value.
+  /// Return a Date value.
   ///
   /*--cef()--*/
-  virtual CefTime GetDateValue() = 0;
+  virtual CefBaseTime GetDateValue() = 0;
 
   ///
-  // Return a string value.
+  /// Return a string value.
   ///
   /*--cef()--*/
   virtual CefString GetStringValue() = 0;
 
-  // OBJECT METHODS - These methods are only available on objects. Arrays and
-  // functions are also objects. String- and integer-based keys can be used
-  // interchangably with the framework converting between them as necessary.
+  /// OBJECT METHODS - These methods are only available on objects. Arrays and
+  /// functions are also objects. String- and integer-based keys can be used
+  /// interchangably with the framework converting between them as necessary.
 
   ///
-  // Returns true if this is a user created object.
+  /// Returns true if this is a user created object.
   ///
   /*--cef()--*/
   virtual bool IsUserCreated() = 0;
 
   ///
-  // Returns true if the last method call resulted in an exception. This
-  // attribute exists only in the scope of the current CEF value object.
+  /// Returns true if the last method call resulted in an exception. This
+  /// attribute exists only in the scope of the current CEF value object.
   ///
   /*--cef()--*/
   virtual bool HasException() = 0;
 
   ///
-  // Returns the exception resulting from the last method call. This attribute
-  // exists only in the scope of the current CEF value object.
+  /// Returns the exception resulting from the last method call. This attribute
+  /// exists only in the scope of the current CEF value object.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefV8Exception> GetException() = 0;
 
   ///
-  // Clears the last exception and returns true on success.
+  /// Clears the last exception and returns true on success.
   ///
   /*--cef()--*/
   virtual bool ClearException() = 0;
 
   ///
-  // Returns true if this object will re-throw future exceptions. This attribute
-  // exists only in the scope of the current CEF value object.
+  /// Returns true if this object will re-throw future exceptions. This
+  /// attribute exists only in the scope of the current CEF value object.
   ///
   /*--cef()--*/
   virtual bool WillRethrowExceptions() = 0;
 
   ///
-  // Set whether this object will re-throw future exceptions. By default
-  // exceptions are not re-thrown. If a exception is re-thrown the current
-  // context should not be accessed again until after the exception has been
-  // caught and not re-thrown. Returns true on success. This attribute exists
-  // only in the scope of the current CEF value object.
+  /// Set whether this object will re-throw future exceptions. By default
+  /// exceptions are not re-thrown. If a exception is re-thrown the current
+  /// context should not be accessed again until after the exception has been
+  /// caught and not re-thrown. Returns true on success. This attribute exists
+  /// only in the scope of the current CEF value object.
   ///
   /*--cef()--*/
   virtual bool SetRethrowExceptions(bool rethrow) = 0;
 
   ///
-  // Returns true if the object has a value with the specified identifier.
+  /// Returns true if the object has a value with the specified identifier.
   ///
   /*--cef(capi_name=has_value_bykey,optional_param=key)--*/
   virtual bool HasValue(const CefString& key) = 0;
 
   ///
-  // Returns true if the object has a value with the specified identifier.
+  /// Returns true if the object has a value with the specified identifier.
   ///
   /*--cef(capi_name=has_value_byindex,index_param=index)--*/
   virtual bool HasValue(int index) = 0;
 
   ///
-  // Deletes the value with the specified identifier and returns true on
-  // success. Returns false if this method is called incorrectly or an exception
-  // is thrown. For read-only and don't-delete values this method will return
-  // true even though deletion failed.
+  /// Deletes the value with the specified identifier and returns true on
+  /// success. Returns false if this method is called incorrectly or an
+  /// exception is thrown. For read-only and don't-delete values this method
+  /// will return true even though deletion failed.
   ///
   /*--cef(capi_name=delete_value_bykey,optional_param=key)--*/
   virtual bool DeleteValue(const CefString& key) = 0;
 
   ///
-  // Deletes the value with the specified identifier and returns true on
-  // success. Returns false if this method is called incorrectly, deletion fails
-  // or an exception is thrown. For read-only and don't-delete values this
-  // method will return true even though deletion failed.
+  /// Deletes the value with the specified identifier and returns true on
+  /// success. Returns false if this method is called incorrectly, deletion
+  /// fails or an exception is thrown. For read-only and don't-delete values
+  /// this method will return true even though deletion failed.
   ///
   /*--cef(capi_name=delete_value_byindex,index_param=index)--*/
   virtual bool DeleteValue(int index) = 0;
 
   ///
-  // Returns the value with the specified identifier on success. Returns NULL
-  // if this method is called incorrectly or an exception is thrown.
+  /// Returns the value with the specified identifier on success. Returns NULL
+  /// if this method is called incorrectly or an exception is thrown.
   ///
   /*--cef(capi_name=get_value_bykey,optional_param=key)--*/
   virtual CefRefPtr<CefV8Value> GetValue(const CefString& key) = 0;
 
   ///
-  // Returns the value with the specified identifier on success. Returns NULL
-  // if this method is called incorrectly or an exception is thrown.
+  /// Returns the value with the specified identifier on success. Returns NULL
+  /// if this method is called incorrectly or an exception is thrown.
   ///
   /*--cef(capi_name=get_value_byindex,index_param=index)--*/
   virtual CefRefPtr<CefV8Value> GetValue(int index) = 0;
 
   ///
-  // Associates a value with the specified identifier and returns true on
-  // success. Returns false if this method is called incorrectly or an exception
-  // is thrown. For read-only values this method will return true even though
-  // assignment failed.
+  /// Associates a value with the specified identifier and returns true on
+  /// success. Returns false if this method is called incorrectly or an
+  /// exception is thrown. For read-only values this method will return true
+  /// even though assignment failed.
   ///
   /*--cef(capi_name=set_value_bykey,optional_param=key)--*/
   virtual bool SetValue(const CefString& key,
@@ -760,20 +777,20 @@
                         PropertyAttribute attribute) = 0;
 
   ///
-  // Associates a value with the specified identifier and returns true on
-  // success. Returns false if this method is called incorrectly or an exception
-  // is thrown. For read-only values this method will return true even though
-  // assignment failed.
+  /// Associates a value with the specified identifier and returns true on
+  /// success. Returns false if this method is called incorrectly or an
+  /// exception is thrown. For read-only values this method will return true
+  /// even though assignment failed.
   ///
   /*--cef(capi_name=set_value_byindex,index_param=index)--*/
   virtual bool SetValue(int index, CefRefPtr<CefV8Value> value) = 0;
 
   ///
-  // Registers an identifier and returns true on success. Access to the
-  // identifier will be forwarded to the CefV8Accessor instance passed to
-  // CefV8Value::CreateObject(). Returns false if this method is called
-  // incorrectly or an exception is thrown. For read-only values this method
-  // will return true even though assignment failed.
+  /// Registers an identifier and returns true on success. Access to the
+  /// identifier will be forwarded to the CefV8Accessor instance passed to
+  /// CefV8Value::CreateObject(). Returns false if this method is called
+  /// incorrectly or an exception is thrown. For read-only values this method
+  /// will return true even though assignment failed.
   ///
   /*--cef(capi_name=set_value_byaccessor,optional_param=key)--*/
   virtual bool SetValue(const CefString& key,
@@ -781,43 +798,43 @@
                         PropertyAttribute attribute) = 0;
 
   ///
-  // Read the keys for the object's values into the specified vector. Integer-
-  // based keys will also be returned as strings.
+  /// Read the keys for the object's values into the specified vector. Integer-
+  /// based keys will also be returned as strings.
   ///
   /*--cef()--*/
   virtual bool GetKeys(std::vector<CefString>& keys) = 0;
 
   ///
-  // Sets the user data for this object and returns true on success. Returns
-  // false if this method is called incorrectly. This method can only be called
-  // on user created objects.
+  /// Sets the user data for this object and returns true on success. Returns
+  /// false if this method is called incorrectly. This method can only be called
+  /// on user created objects.
   ///
   /*--cef(optional_param=user_data)--*/
   virtual bool SetUserData(CefRefPtr<CefBaseRefCounted> user_data) = 0;
 
   ///
-  // Returns the user data, if any, assigned to this object.
+  /// Returns the user data, if any, assigned to this object.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefBaseRefCounted> GetUserData() = 0;
 
   ///
-  // Returns the amount of externally allocated memory registered for the
-  // object.
+  /// Returns the amount of externally allocated memory registered for the
+  /// object.
   ///
   /*--cef()--*/
   virtual int GetExternallyAllocatedMemory() = 0;
 
   ///
-  // Adjusts the amount of registered external memory for the object. Used to
-  // give V8 an indication of the amount of externally allocated memory that is
-  // kept alive by JavaScript objects. V8 uses this information to decide when
-  // to perform global garbage collection. Each CefV8Value tracks the amount of
-  // external memory associated with it and automatically decreases the global
-  // total by the appropriate amount on its destruction. |change_in_bytes|
-  // specifies the number of bytes to adjust by. This method returns the number
-  // of bytes associated with the object after the adjustment. This method can
-  // only be called on user created objects.
+  /// Adjusts the amount of registered external memory for the object. Used to
+  /// give V8 an indication of the amount of externally allocated memory that is
+  /// kept alive by JavaScript objects. V8 uses this information to decide when
+  /// to perform global garbage collection. Each CefV8Value tracks the amount of
+  /// external memory associated with it and automatically decreases the global
+  /// total by the appropriate amount on its destruction. |change_in_bytes|
+  /// specifies the number of bytes to adjust by. This method returns the number
+  /// of bytes associated with the object after the adjustment. This method can
+  /// only be called on user created objects.
   ///
   /*--cef()--*/
   virtual int AdjustExternallyAllocatedMemory(int change_in_bytes) = 0;
@@ -825,7 +842,7 @@
   // ARRAY METHODS - These methods are only available on arrays.
 
   ///
-  // Returns the number of elements in the array.
+  /// Returns the number of elements in the array.
   ///
   /*--cef()--*/
   virtual int GetArrayLength() = 0;
@@ -833,45 +850,59 @@
   // ARRAY BUFFER METHODS - These methods are only available on ArrayBuffers.
 
   ///
-  // Returns the ReleaseCallback object associated with the ArrayBuffer or NULL
-  // if the ArrayBuffer was not created with CreateArrayBuffer.
+  /// Returns the ReleaseCallback object associated with the ArrayBuffer or NULL
+  /// if the ArrayBuffer was not created with CreateArrayBuffer.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefV8ArrayBufferReleaseCallback>
   GetArrayBufferReleaseCallback() = 0;
 
   ///
-  // Prevent the ArrayBuffer from using it's memory block by setting the length
-  // to zero. This operation cannot be undone. If the ArrayBuffer was created
-  // with CreateArrayBuffer then CefV8ArrayBufferReleaseCallback::ReleaseBuffer
-  // will be called to release the underlying buffer.
+  /// Prevent the ArrayBuffer from using it's memory block by setting the length
+  /// to zero. This operation cannot be undone. If the ArrayBuffer was created
+  /// with CreateArrayBuffer then CefV8ArrayBufferReleaseCallback::ReleaseBuffer
+  /// will be called to release the underlying buffer.
   ///
   /*--cef()--*/
   virtual bool NeuterArrayBuffer() = 0;
 
+  ///
+  /// Returns the length (in bytes) of the ArrayBuffer.
+  ///
+  /*--cef()--*/
+  virtual size_t GetArrayBufferByteLength() = 0;
+
+  ///
+  /// Returns a pointer to the beginning of the memory block for this
+  /// ArrayBuffer backing store. The returned pointer is valid as long as the
+  /// CefV8Value is alive.
+  ///
+  /*--cef()--*/
+  virtual void* GetArrayBufferData() = 0;
+
   // FUNCTION METHODS - These methods are only available on functions.
 
   ///
-  // Returns the function name.
+  /// Returns the function name.
   ///
   /*--cef()--*/
   virtual CefString GetFunctionName() = 0;
 
   ///
-  // Returns the function handler or NULL if not a CEF-created function.
+  /// Returns the function handler or NULL if not a CEF-created function.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefV8Handler> GetFunctionHandler() = 0;
 
   ///
-  // Execute the function using the current V8 context. This method should only
-  // be called from within the scope of a CefV8Handler or CefV8Accessor
-  // callback, or in combination with calling Enter() and Exit() on a stored
-  // CefV8Context reference. |object| is the receiver ('this' object) of the
-  // function. If |object| is empty the current context's global object will be
-  // used. |arguments| is the list of arguments that will be passed to the
-  // function. Returns the function return value on success. Returns NULL if
-  // this method is called incorrectly or an exception is thrown.
+  /// Execute the function using the current V8 context. This method should only
+  /// be called from within the scope of a CefV8Handler or CefV8Accessor
+  /// callback, or in combination with calling Enter() and Exit() on a stored
+  /// CefV8Context reference. |object| is the receiver ('this' object) of the
+  /// function. If |object| is empty the current context's global object will be
+  /// used. |arguments| is the list of arguments that will be passed to the
+  /// function. Returns the function return value on success. Returns NULL if
+  /// this method is called incorrectly or an exception is thrown.
   ///
   /*--cef(optional_param=object)--*/
   virtual CefRefPtr<CefV8Value> ExecuteFunction(
@@ -879,117 +910,140 @@
       const CefV8ValueList& arguments) = 0;
 
   ///
-  // Execute the function using the specified V8 context. |object| is the
-  // receiver ('this' object) of the function. If |object| is empty the
-  // specified context's global object will be used. |arguments| is the list of
-  // arguments that will be passed to the function. Returns the function return
-  // value on success. Returns NULL if this method is called incorrectly or an
-  // exception is thrown.
+  /// Execute the function using the specified V8 context. |object| is the
+  /// receiver ('this' object) of the function. If |object| is empty the
+  /// specified context's global object will be used. |arguments| is the list of
+  /// arguments that will be passed to the function. Returns the function return
+  /// value on success. Returns NULL if this method is called incorrectly or an
+  /// exception is thrown.
   ///
   /*--cef(optional_param=object)--*/
   virtual CefRefPtr<CefV8Value> ExecuteFunctionWithContext(
       CefRefPtr<CefV8Context> context,
       CefRefPtr<CefV8Value> object,
       const CefV8ValueList& arguments) = 0;
+
+  // PROMISE METHODS - These methods are only available on Promises.
+
+  ///
+  /// Resolve the Promise using the current V8 context. This method should only
+  /// be called from within the scope of a CefV8Handler or CefV8Accessor
+  /// callback, or in combination with calling Enter() and Exit() on a stored
+  /// CefV8Context reference. |arg| is the argument passed to the resolved
+  /// promise. Returns true on success. Returns false if this method is called
+  /// incorrectly or an exception is thrown.
+  ///
+  /*--cef(optional_param=arg)--*/
+  virtual bool ResolvePromise(CefRefPtr<CefV8Value> arg) = 0;
+
+  ///
+  /// Reject the Promise using the current V8 context. This method should only
+  /// be called from within the scope of a CefV8Handler or CefV8Accessor
+  /// callback, or in combination with calling Enter() and Exit() on a stored
+  /// CefV8Context reference. Returns true on success. Returns false if this
+  /// method is called incorrectly or an exception is thrown.
+  ///
+  /*--cef()--*/
+  virtual bool RejectPromise(const CefString& errorMsg) = 0;
 };
 
 ///
-// Class representing a V8 stack trace handle. V8 handles can only be accessed
-// from the thread on which they are created. Valid threads for creating a V8
-// handle include the render process main thread (TID_RENDERER) and WebWorker
-// threads. A task runner for posting tasks on the associated thread can be
-// retrieved via the CefV8Context::GetTaskRunner() method.
+/// Class representing a V8 stack trace handle. V8 handles can only be accessed
+/// from the thread on which they are created. Valid threads for creating a V8
+/// handle include the render process main thread (TID_RENDERER) and WebWorker
+/// threads. A task runner for posting tasks on the associated thread can be
+/// retrieved via the CefV8Context::GetTaskRunner() method.
 ///
 /*--cef(source=library)--*/
 class CefV8StackTrace : public virtual CefBaseRefCounted {
  public:
   ///
-  // Returns the stack trace for the currently active context. |frame_limit| is
-  // the maximum number of frames that will be captured.
+  /// Returns the stack trace for the currently active context. |frame_limit| is
+  /// the maximum number of frames that will be captured.
   ///
   /*--cef()--*/
   static CefRefPtr<CefV8StackTrace> GetCurrent(int frame_limit);
 
   ///
-  // Returns true if the underlying handle is valid and it can be accessed on
-  // the current thread. Do not call any other methods if this method returns
-  // false.
+  /// Returns true if the underlying handle is valid and it can be accessed on
+  /// the current thread. Do not call any other methods if this method returns
+  /// false.
   ///
   /*--cef()--*/
   virtual bool IsValid() = 0;
 
   ///
-  // Returns the number of stack frames.
+  /// Returns the number of stack frames.
   ///
   /*--cef()--*/
   virtual int GetFrameCount() = 0;
 
   ///
-  // Returns the stack frame at the specified 0-based index.
+  /// Returns the stack frame at the specified 0-based index.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefV8StackFrame> GetFrame(int index) = 0;
 };
 
 ///
-// Class representing a V8 stack frame handle. V8 handles can only be accessed
-// from the thread on which they are created. Valid threads for creating a V8
-// handle include the render process main thread (TID_RENDERER) and WebWorker
-// threads. A task runner for posting tasks on the associated thread can be
-// retrieved via the CefV8Context::GetTaskRunner() method.
+/// Class representing a V8 stack frame handle. V8 handles can only be accessed
+/// from the thread on which they are created. Valid threads for creating a V8
+/// handle include the render process main thread (TID_RENDERER) and WebWorker
+/// threads. A task runner for posting tasks on the associated thread can be
+/// retrieved via the CefV8Context::GetTaskRunner() method.
 ///
 /*--cef(source=library,no_debugct_check)--*/
 class CefV8StackFrame : public virtual CefBaseRefCounted {
  public:
   ///
-  // Returns true if the underlying handle is valid and it can be accessed on
-  // the current thread. Do not call any other methods if this method returns
-  // false.
+  /// Returns true if the underlying handle is valid and it can be accessed on
+  /// the current thread. Do not call any other methods if this method returns
+  /// false.
   ///
   /*--cef()--*/
   virtual bool IsValid() = 0;
 
   ///
-  // Returns the name of the resource script that contains the function.
+  /// Returns the name of the resource script that contains the function.
   ///
   /*--cef()--*/
   virtual CefString GetScriptName() = 0;
 
   ///
-  // Returns the name of the resource script that contains the function or the
-  // sourceURL value if the script name is undefined and its source ends with
-  // a "//@ sourceURL=..." string.
+  /// Returns the name of the resource script that contains the function or the
+  /// sourceURL value if the script name is undefined and its source ends with
+  /// a "//@ sourceURL=..." string.
   ///
   /*--cef()--*/
   virtual CefString GetScriptNameOrSourceURL() = 0;
 
   ///
-  // Returns the name of the function.
+  /// Returns the name of the function.
   ///
   /*--cef()--*/
   virtual CefString GetFunctionName() = 0;
 
   ///
-  // Returns the 1-based line number for the function call or 0 if unknown.
+  /// Returns the 1-based line number for the function call or 0 if unknown.
   ///
   /*--cef()--*/
   virtual int GetLineNumber() = 0;
 
   ///
-  // Returns the 1-based column offset on the line for the function call or 0 if
-  // unknown.
+  /// Returns the 1-based column offset on the line for the function call or 0
+  /// if unknown.
   ///
   /*--cef()--*/
   virtual int GetColumn() = 0;
 
   ///
-  // Returns true if the function was compiled using eval().
+  /// Returns true if the function was compiled using eval().
   ///
   /*--cef()--*/
   virtual bool IsEval() = 0;
 
   ///
-  // Returns true if the function was called as a constructor via "new".
+  /// Returns true if the function was called as a constructor via "new".
   ///
   /*--cef()--*/
   virtual bool IsConstructor() = 0;
diff --git a/src/include/cef_values.h b/src/include/cef_values.h
index be88794..f7bcb79 100644
--- a/src/include/cef_values.h
+++ b/src/include/cef_values.h
@@ -48,244 +48,252 @@
 typedef cef_value_type_t CefValueType;
 
 ///
-// Class that wraps other data value types. Complex types (binary, dictionary
-// and list) will be referenced but not owned by this object. Can be used on any
-// process and thread.
+/// Class that wraps other data value types. Complex types (binary, dictionary
+/// and list) will be referenced but not owned by this object. Can be used on
+/// any process and thread.
 ///
 /*--cef(source=library)--*/
 class CefValue : public virtual CefBaseRefCounted {
  public:
   ///
-  // Creates a new object.
+  /// Creates a new object.
   ///
   /*--cef()--*/
   static CefRefPtr<CefValue> Create();
 
   ///
-  // Returns true if the underlying data is valid. This will always be true for
-  // simple types. For complex types (binary, dictionary and list) the
-  // underlying data may become invalid if owned by another object (e.g. list or
-  // dictionary) and that other object is then modified or destroyed. This value
-  // object can be re-used by calling Set*() even if the underlying data is
-  // invalid.
+  /// Returns true if the underlying data is valid. This will always be true for
+  /// simple types. For complex types (binary, dictionary and list) the
+  /// underlying data may become invalid if owned by another object (e.g. list
+  /// or dictionary) and that other object is then modified or destroyed. This
+  /// value object can be re-used by calling Set*() even if the underlying data
+  /// is invalid.
   ///
   /*--cef()--*/
   virtual bool IsValid() = 0;
 
   ///
-  // Returns true if the underlying data is owned by another object.
+  /// Returns true if the underlying data is owned by another object.
   ///
   /*--cef()--*/
   virtual bool IsOwned() = 0;
 
   ///
-  // Returns true if the underlying data is read-only. Some APIs may expose
-  // read-only objects.
+  /// Returns true if the underlying data is read-only. Some APIs may expose
+  /// read-only objects.
   ///
   /*--cef()--*/
   virtual bool IsReadOnly() = 0;
 
   ///
-  // Returns true if this object and |that| object have the same underlying
-  // data. If true modifications to this object will also affect |that| object
-  // and vice-versa.
+  /// Returns true if this object and |that| object have the same underlying
+  /// data. If true modifications to this object will also affect |that| object
+  /// and vice-versa.
   ///
   /*--cef()--*/
   virtual bool IsSame(CefRefPtr<CefValue> that) = 0;
 
   ///
-  // Returns true if this object and |that| object have an equivalent underlying
-  // value but are not necessarily the same object.
+  /// Returns true if this object and |that| object have an equivalent
+  /// underlying value but are not necessarily the same object.
   ///
   /*--cef()--*/
   virtual bool IsEqual(CefRefPtr<CefValue> that) = 0;
 
   ///
-  // Returns a copy of this object. The underlying data will also be copied.
+  /// Returns a copy of this object. The underlying data will also be copied.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefValue> Copy() = 0;
 
   ///
-  // Returns the underlying value type.
+  /// Returns the underlying value type.
   ///
   /*--cef(default_retval=VTYPE_INVALID)--*/
   virtual CefValueType GetType() = 0;
 
   ///
-  // Returns the underlying value as type bool.
+  /// Returns the underlying value as type bool.
   ///
   /*--cef()--*/
   virtual bool GetBool() = 0;
 
   ///
-  // Returns the underlying value as type int.
+  /// Returns the underlying value as type int.
   ///
   /*--cef()--*/
   virtual int GetInt() = 0;
 
   ///
-  // Returns the underlying value as type double.
+  /// Returns the underlying value as type double.
   ///
   /*--cef()--*/
   virtual double GetDouble() = 0;
 
   ///
-  // Returns the underlying value as type string.
+  /// Returns the underlying value as type string.
   ///
   /*--cef()--*/
   virtual CefString GetString() = 0;
 
   ///
-  // Returns the underlying value as type binary. The returned reference may
-  // become invalid if the value is owned by another object or if ownership is
-  // transferred to another object in the future. To maintain a reference to
-  // the value after assigning ownership to a dictionary or list pass this
-  // object to the SetValue() method instead of passing the returned reference
-  // to SetBinary().
+  /// Returns the underlying value as type binary. The returned reference may
+  /// become invalid if the value is owned by another object or if ownership is
+  /// transferred to another object in the future. To maintain a reference to
+  /// the value after assigning ownership to a dictionary or list pass this
+  /// object to the SetValue() method instead of passing the returned reference
+  /// to SetBinary().
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefBinaryValue> GetBinary() = 0;
 
   ///
-  // Returns the underlying value as type dictionary. The returned reference may
-  // become invalid if the value is owned by another object or if ownership is
-  // transferred to another object in the future. To maintain a reference to
-  // the value after assigning ownership to a dictionary or list pass this
-  // object to the SetValue() method instead of passing the returned reference
-  // to SetDictionary().
+  /// Returns the underlying value as type dictionary. The returned reference
+  /// may become invalid if the value is owned by another object or if ownership
+  /// is transferred to another object in the future. To maintain a reference to
+  /// the value after assigning ownership to a dictionary or list pass this
+  /// object to the SetValue() method instead of passing the returned reference
+  /// to SetDictionary().
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDictionaryValue> GetDictionary() = 0;
 
   ///
-  // Returns the underlying value as type list. The returned reference may
-  // become invalid if the value is owned by another object or if ownership is
-  // transferred to another object in the future. To maintain a reference to
-  // the value after assigning ownership to a dictionary or list pass this
-  // object to the SetValue() method instead of passing the returned reference
-  // to SetList().
+  /// Returns the underlying value as type list. The returned reference may
+  /// become invalid if the value is owned by another object or if ownership is
+  /// transferred to another object in the future. To maintain a reference to
+  /// the value after assigning ownership to a dictionary or list pass this
+  /// object to the SetValue() method instead of passing the returned reference
+  /// to SetList().
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefListValue> GetList() = 0;
 
   ///
-  // Sets the underlying value as type null. Returns true if the value was set
-  // successfully.
+  /// Sets the underlying value as type null. Returns true if the value was set
+  /// successfully.
   ///
   /*--cef()--*/
   virtual bool SetNull() = 0;
 
   ///
-  // Sets the underlying value as type bool. Returns true if the value was set
-  // successfully.
+  /// Sets the underlying value as type bool. Returns true if the value was set
+  /// successfully.
   ///
   /*--cef()--*/
   virtual bool SetBool(bool value) = 0;
 
   ///
-  // Sets the underlying value as type int. Returns true if the value was set
-  // successfully.
+  /// Sets the underlying value as type int. Returns true if the value was set
+  /// successfully.
   ///
   /*--cef()--*/
   virtual bool SetInt(int value) = 0;
 
   ///
-  // Sets the underlying value as type double. Returns true if the value was set
-  // successfully.
+  /// Sets the underlying value as type double. Returns true if the value was
+  /// set successfully.
   ///
   /*--cef()--*/
   virtual bool SetDouble(double value) = 0;
 
   ///
-  // Sets the underlying value as type string. Returns true if the value was set
-  // successfully.
+  /// Sets the underlying value as type string. Returns true if the value was
+  /// set successfully.
   ///
   /*--cef(optional_param=value)--*/
   virtual bool SetString(const CefString& value) = 0;
 
   ///
-  // Sets the underlying value as type binary. Returns true if the value was set
-  // successfully. This object keeps a reference to |value| and ownership of the
-  // underlying data remains unchanged.
+  /// Sets the underlying value as type binary. Returns true if the value was
+  /// set successfully. This object keeps a reference to |value| and ownership
+  /// of the underlying data remains unchanged.
   ///
   /*--cef()--*/
   virtual bool SetBinary(CefRefPtr<CefBinaryValue> value) = 0;
 
   ///
-  // Sets the underlying value as type dict. Returns true if the value was set
-  // successfully. This object keeps a reference to |value| and ownership of the
-  // underlying data remains unchanged.
+  /// Sets the underlying value as type dict. Returns true if the value was set
+  /// successfully. This object keeps a reference to |value| and ownership of
+  /// the underlying data remains unchanged.
   ///
   /*--cef()--*/
   virtual bool SetDictionary(CefRefPtr<CefDictionaryValue> value) = 0;
 
   ///
-  // Sets the underlying value as type list. Returns true if the value was set
-  // successfully. This object keeps a reference to |value| and ownership of the
-  // underlying data remains unchanged.
+  /// Sets the underlying value as type list. Returns true if the value was set
+  /// successfully. This object keeps a reference to |value| and ownership of
+  /// the underlying data remains unchanged.
   ///
   /*--cef()--*/
   virtual bool SetList(CefRefPtr<CefListValue> value) = 0;
 };
 
 ///
-// Class representing a binary value. Can be used on any process and thread.
+/// Class representing a binary value. Can be used on any process and thread.
 ///
 /*--cef(source=library)--*/
 class CefBinaryValue : public virtual CefBaseRefCounted {
  public:
   ///
-  // Creates a new object that is not owned by any other object. The specified
-  // |data| will be copied.
+  /// Creates a new object that is not owned by any other object. The specified
+  /// |data| will be copied.
   ///
   /*--cef()--*/
   static CefRefPtr<CefBinaryValue> Create(const void* data, size_t data_size);
 
   ///
-  // Returns true if this object is valid. This object may become invalid if
-  // the underlying data is owned by another object (e.g. list or dictionary)
-  // and that other object is then modified or destroyed. Do not call any other
-  // methods if this method returns false.
+  /// Returns true if this object is valid. This object may become invalid if
+  /// the underlying data is owned by another object (e.g. list or dictionary)
+  /// and that other object is then modified or destroyed. Do not call any other
+  /// methods if this method returns false.
   ///
   /*--cef()--*/
   virtual bool IsValid() = 0;
 
   ///
-  // Returns true if this object is currently owned by another object.
+  /// Returns true if this object is currently owned by another object.
   ///
   /*--cef()--*/
   virtual bool IsOwned() = 0;
 
   ///
-  // Returns true if this object and |that| object have the same underlying
-  // data.
+  /// Returns true if this object and |that| object have the same underlying
+  /// data.
   ///
   /*--cef()--*/
   virtual bool IsSame(CefRefPtr<CefBinaryValue> that) = 0;
 
   ///
-  // Returns true if this object and |that| object have an equivalent underlying
-  // value but are not necessarily the same object.
+  /// Returns true if this object and |that| object have an equivalent
+  /// underlying value but are not necessarily the same object.
   ///
   /*--cef()--*/
   virtual bool IsEqual(CefRefPtr<CefBinaryValue> that) = 0;
 
   ///
-  // Returns a copy of this object. The data in this object will also be copied.
+  /// Returns a copy of this object. The data in this object will also be
+  /// copied.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefBinaryValue> Copy() = 0;
 
   ///
-  // Returns the data size.
+  /// Returns a pointer to the beginning of the memory block.
+  /// The returned pointer is valid as long as the CefBinaryValue is alive.
+  ///
+  /*--cef()--*/
+  virtual const void* GetRawData() = 0;
+
+  ///
+  /// Returns the data size.
   ///
   /*--cef()--*/
   virtual size_t GetSize() = 0;
 
   ///
-  // Read up to |buffer_size| number of bytes into |buffer|. Reading begins at
-  // the specified byte |data_offset|. Returns the number of bytes read.
+  /// Read up to |buffer_size| number of bytes into |buffer|. Reading begins at
+  /// the specified byte |data_offset|. Returns the number of bytes read.
   ///
   /*--cef()--*/
   virtual size_t GetData(void* buffer,
@@ -294,7 +302,8 @@
 };
 
 ///
-// Class representing a dictionary value. Can be used on any process and thread.
+/// Class representing a dictionary value. Can be used on any process and
+/// thread.
 ///
 /*--cef(source=library)--*/
 class CefDictionaryValue : public virtual CefBaseRefCounted {
@@ -302,444 +311,444 @@
   typedef std::vector<CefString> KeyList;
 
   ///
-  // Creates a new object that is not owned by any other object.
+  /// Creates a new object that is not owned by any other object.
   ///
   /*--cef()--*/
   static CefRefPtr<CefDictionaryValue> Create();
 
   ///
-  // Returns true if this object is valid. This object may become invalid if
-  // the underlying data is owned by another object (e.g. list or dictionary)
-  // and that other object is then modified or destroyed. Do not call any other
-  // methods if this method returns false.
+  /// Returns true if this object is valid. This object may become invalid if
+  /// the underlying data is owned by another object (e.g. list or dictionary)
+  /// and that other object is then modified or destroyed. Do not call any other
+  /// methods if this method returns false.
   ///
   /*--cef()--*/
   virtual bool IsValid() = 0;
 
   ///
-  // Returns true if this object is currently owned by another object.
+  /// Returns true if this object is currently owned by another object.
   ///
   /*--cef()--*/
   virtual bool IsOwned() = 0;
 
   ///
-  // Returns true if the values of this object are read-only. Some APIs may
-  // expose read-only objects.
+  /// Returns true if the values of this object are read-only. Some APIs may
+  /// expose read-only objects.
   ///
   /*--cef()--*/
   virtual bool IsReadOnly() = 0;
 
   ///
-  // Returns true if this object and |that| object have the same underlying
-  // data. If true modifications to this object will also affect |that| object
-  // and vice-versa.
+  /// Returns true if this object and |that| object have the same underlying
+  /// data. If true modifications to this object will also affect |that| object
+  /// and vice-versa.
   ///
   /*--cef()--*/
   virtual bool IsSame(CefRefPtr<CefDictionaryValue> that) = 0;
 
   ///
-  // Returns true if this object and |that| object have an equivalent underlying
-  // value but are not necessarily the same object.
+  /// Returns true if this object and |that| object have an equivalent
+  /// underlying value but are not necessarily the same object.
   ///
   /*--cef()--*/
   virtual bool IsEqual(CefRefPtr<CefDictionaryValue> that) = 0;
 
   ///
-  // Returns a writable copy of this object. If |exclude_empty_children| is true
-  // any empty dictionaries or lists will be excluded from the copy.
+  /// Returns a writable copy of this object. If |exclude_empty_children| is
+  /// true any empty dictionaries or lists will be excluded from the copy.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDictionaryValue> Copy(bool exclude_empty_children) = 0;
 
   ///
-  // Returns the number of values.
+  /// Returns the number of values.
   ///
   /*--cef()--*/
   virtual size_t GetSize() = 0;
 
   ///
-  // Removes all values. Returns true on success.
+  /// Removes all values. Returns true on success.
   ///
   /*--cef()--*/
   virtual bool Clear() = 0;
 
   ///
-  // Returns true if the current dictionary has a value for the given key.
+  /// Returns true if the current dictionary has a value for the given key.
   ///
   /*--cef()--*/
   virtual bool HasKey(const CefString& key) = 0;
 
   ///
-  // Reads all keys for this dictionary into the specified vector.
+  /// Reads all keys for this dictionary into the specified vector.
   ///
   /*--cef()--*/
   virtual bool GetKeys(KeyList& keys) = 0;
 
   ///
-  // Removes the value at the specified key. Returns true is the value was
-  // removed successfully.
+  /// Removes the value at the specified key. Returns true is the value was
+  /// removed successfully.
   ///
   /*--cef()--*/
   virtual bool Remove(const CefString& key) = 0;
 
   ///
-  // Returns the value type for the specified key.
+  /// Returns the value type for the specified key.
   ///
   /*--cef(default_retval=VTYPE_INVALID)--*/
   virtual CefValueType GetType(const CefString& key) = 0;
 
   ///
-  // Returns the value at the specified key. For simple types the returned
-  // value will copy existing data and modifications to the value will not
-  // modify this object. For complex types (binary, dictionary and list) the
-  // returned value will reference existing data and modifications to the value
-  // will modify this object.
+  /// Returns the value at the specified key. For simple types the returned
+  /// value will copy existing data and modifications to the value will not
+  /// modify this object. For complex types (binary, dictionary and list) the
+  /// returned value will reference existing data and modifications to the value
+  /// will modify this object.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefValue> GetValue(const CefString& key) = 0;
 
   ///
-  // Returns the value at the specified key as type bool.
+  /// Returns the value at the specified key as type bool.
   ///
   /*--cef()--*/
   virtual bool GetBool(const CefString& key) = 0;
 
   ///
-  // Returns the value at the specified key as type int.
+  /// Returns the value at the specified key as type int.
   ///
   /*--cef()--*/
   virtual int GetInt(const CefString& key) = 0;
 
   ///
-  // Returns the value at the specified key as type double.
+  /// Returns the value at the specified key as type double.
   ///
   /*--cef()--*/
   virtual double GetDouble(const CefString& key) = 0;
 
   ///
-  // Returns the value at the specified key as type string.
+  /// Returns the value at the specified key as type string.
   ///
   /*--cef()--*/
   virtual CefString GetString(const CefString& key) = 0;
 
   ///
-  // Returns the value at the specified key as type binary. The returned
-  // value will reference existing data.
+  /// Returns the value at the specified key as type binary. The returned
+  /// value will reference existing data.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefBinaryValue> GetBinary(const CefString& key) = 0;
 
   ///
-  // Returns the value at the specified key as type dictionary. The returned
-  // value will reference existing data and modifications to the value will
-  // modify this object.
+  /// Returns the value at the specified key as type dictionary. The returned
+  /// value will reference existing data and modifications to the value will
+  /// modify this object.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDictionaryValue> GetDictionary(const CefString& key) = 0;
 
   ///
-  // Returns the value at the specified key as type list. The returned value
-  // will reference existing data and modifications to the value will modify
-  // this object.
+  /// Returns the value at the specified key as type list. The returned value
+  /// will reference existing data and modifications to the value will modify
+  /// this object.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefListValue> GetList(const CefString& key) = 0;
 
   ///
-  // Sets the value at the specified key. Returns true if the value was set
-  // successfully. If |value| represents simple data then the underlying data
-  // will be copied and modifications to |value| will not modify this object. If
-  // |value| represents complex data (binary, dictionary or list) then the
-  // underlying data will be referenced and modifications to |value| will modify
-  // this object.
+  /// Sets the value at the specified key. Returns true if the value was set
+  /// successfully. If |value| represents simple data then the underlying data
+  /// will be copied and modifications to |value| will not modify this object.
+  /// If |value| represents complex data (binary, dictionary or list) then the
+  /// underlying data will be referenced and modifications to |value| will
+  /// modify this object.
   ///
   /*--cef()--*/
   virtual bool SetValue(const CefString& key, CefRefPtr<CefValue> value) = 0;
 
   ///
-  // Sets the value at the specified key as type null. Returns true if the
-  // value was set successfully.
+  /// Sets the value at the specified key as type null. Returns true if the
+  /// value was set successfully.
   ///
   /*--cef()--*/
   virtual bool SetNull(const CefString& key) = 0;
 
   ///
-  // Sets the value at the specified key as type bool. Returns true if the
-  // value was set successfully.
+  /// Sets the value at the specified key as type bool. Returns true if the
+  /// value was set successfully.
   ///
   /*--cef()--*/
   virtual bool SetBool(const CefString& key, bool value) = 0;
 
   ///
-  // Sets the value at the specified key as type int. Returns true if the
-  // value was set successfully.
+  /// Sets the value at the specified key as type int. Returns true if the
+  /// value was set successfully.
   ///
   /*--cef()--*/
   virtual bool SetInt(const CefString& key, int value) = 0;
 
   ///
-  // Sets the value at the specified key as type double. Returns true if the
-  // value was set successfully.
+  /// Sets the value at the specified key as type double. Returns true if the
+  /// value was set successfully.
   ///
   /*--cef()--*/
   virtual bool SetDouble(const CefString& key, double value) = 0;
 
   ///
-  // Sets the value at the specified key as type string. Returns true if the
-  // value was set successfully.
+  /// Sets the value at the specified key as type string. Returns true if the
+  /// value was set successfully.
   ///
   /*--cef(optional_param=value)--*/
   virtual bool SetString(const CefString& key, const CefString& value) = 0;
 
   ///
-  // Sets the value at the specified key as type binary. Returns true if the
-  // value was set successfully. If |value| is currently owned by another object
-  // then the value will be copied and the |value| reference will not change.
-  // Otherwise, ownership will be transferred to this object and the |value|
-  // reference will be invalidated.
+  /// Sets the value at the specified key as type binary. Returns true if the
+  /// value was set successfully. If |value| is currently owned by another
+  /// object then the value will be copied and the |value| reference will not
+  /// change. Otherwise, ownership will be transferred to this object and the
+  /// |value| reference will be invalidated.
   ///
   /*--cef()--*/
   virtual bool SetBinary(const CefString& key,
                          CefRefPtr<CefBinaryValue> value) = 0;
 
   ///
-  // Sets the value at the specified key as type dict. Returns true if the
-  // value was set successfully. If |value| is currently owned by another object
-  // then the value will be copied and the |value| reference will not change.
-  // Otherwise, ownership will be transferred to this object and the |value|
-  // reference will be invalidated.
+  /// Sets the value at the specified key as type dict. Returns true if the
+  /// value was set successfully. If |value| is currently owned by another
+  /// object then the value will be copied and the |value| reference will not
+  /// change. Otherwise, ownership will be transferred to this object and the
+  /// |value| reference will be invalidated.
   ///
   /*--cef()--*/
   virtual bool SetDictionary(const CefString& key,
                              CefRefPtr<CefDictionaryValue> value) = 0;
 
   ///
-  // Sets the value at the specified key as type list. Returns true if the
-  // value was set successfully. If |value| is currently owned by another object
-  // then the value will be copied and the |value| reference will not change.
-  // Otherwise, ownership will be transferred to this object and the |value|
-  // reference will be invalidated.
+  /// Sets the value at the specified key as type list. Returns true if the
+  /// value was set successfully. If |value| is currently owned by another
+  /// object then the value will be copied and the |value| reference will not
+  /// change. Otherwise, ownership will be transferred to this object and the
+  /// |value| reference will be invalidated.
   ///
   /*--cef()--*/
   virtual bool SetList(const CefString& key, CefRefPtr<CefListValue> value) = 0;
 };
 
 ///
-// Class representing a list value. Can be used on any process and thread.
+/// Class representing a list value. Can be used on any process and thread.
 ///
 /*--cef(source=library)--*/
 class CefListValue : public virtual CefBaseRefCounted {
  public:
   ///
-  // Creates a new object that is not owned by any other object.
+  /// Creates a new object that is not owned by any other object.
   ///
   /*--cef()--*/
   static CefRefPtr<CefListValue> Create();
 
   ///
-  // Returns true if this object is valid. This object may become invalid if
-  // the underlying data is owned by another object (e.g. list or dictionary)
-  // and that other object is then modified or destroyed. Do not call any other
-  // methods if this method returns false.
+  /// Returns true if this object is valid. This object may become invalid if
+  /// the underlying data is owned by another object (e.g. list or dictionary)
+  /// and that other object is then modified or destroyed. Do not call any other
+  /// methods if this method returns false.
   ///
   /*--cef()--*/
   virtual bool IsValid() = 0;
 
   ///
-  // Returns true if this object is currently owned by another object.
+  /// Returns true if this object is currently owned by another object.
   ///
   /*--cef()--*/
   virtual bool IsOwned() = 0;
 
   ///
-  // Returns true if the values of this object are read-only. Some APIs may
-  // expose read-only objects.
+  /// Returns true if the values of this object are read-only. Some APIs may
+  /// expose read-only objects.
   ///
   /*--cef()--*/
   virtual bool IsReadOnly() = 0;
 
   ///
-  // Returns true if this object and |that| object have the same underlying
-  // data. If true modifications to this object will also affect |that| object
-  // and vice-versa.
+  /// Returns true if this object and |that| object have the same underlying
+  /// data. If true modifications to this object will also affect |that| object
+  /// and vice-versa.
   ///
   /*--cef()--*/
   virtual bool IsSame(CefRefPtr<CefListValue> that) = 0;
 
   ///
-  // Returns true if this object and |that| object have an equivalent underlying
-  // value but are not necessarily the same object.
+  /// Returns true if this object and |that| object have an equivalent
+  /// underlying value but are not necessarily the same object.
   ///
   /*--cef()--*/
   virtual bool IsEqual(CefRefPtr<CefListValue> that) = 0;
 
   ///
-  // Returns a writable copy of this object.
+  /// Returns a writable copy of this object.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefListValue> Copy() = 0;
 
   ///
-  // Sets the number of values. If the number of values is expanded all
-  // new value slots will default to type null. Returns true on success.
+  /// Sets the number of values. If the number of values is expanded all
+  /// new value slots will default to type null. Returns true on success.
   ///
   /*--cef()--*/
   virtual bool SetSize(size_t size) = 0;
 
   ///
-  // Returns the number of values.
+  /// Returns the number of values.
   ///
   /*--cef()--*/
   virtual size_t GetSize() = 0;
 
   ///
-  // Removes all values. Returns true on success.
+  /// Removes all values. Returns true on success.
   ///
   /*--cef()--*/
   virtual bool Clear() = 0;
 
   ///
-  // Removes the value at the specified index.
+  /// Removes the value at the specified index.
   ///
   /*--cef()--*/
   virtual bool Remove(size_t index) = 0;
 
   ///
-  // Returns the value type at the specified index.
+  /// Returns the value type at the specified index.
   ///
   /*--cef(default_retval=VTYPE_INVALID)--*/
   virtual CefValueType GetType(size_t index) = 0;
 
   ///
-  // Returns the value at the specified index. For simple types the returned
-  // value will copy existing data and modifications to the value will not
-  // modify this object. For complex types (binary, dictionary and list) the
-  // returned value will reference existing data and modifications to the value
-  // will modify this object.
+  /// Returns the value at the specified index. For simple types the returned
+  /// value will copy existing data and modifications to the value will not
+  /// modify this object. For complex types (binary, dictionary and list) the
+  /// returned value will reference existing data and modifications to the value
+  /// will modify this object.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefValue> GetValue(size_t index) = 0;
 
   ///
-  // Returns the value at the specified index as type bool.
+  /// Returns the value at the specified index as type bool.
   ///
   /*--cef()--*/
   virtual bool GetBool(size_t index) = 0;
 
   ///
-  // Returns the value at the specified index as type int.
+  /// Returns the value at the specified index as type int.
   ///
   /*--cef()--*/
   virtual int GetInt(size_t index) = 0;
 
   ///
-  // Returns the value at the specified index as type double.
+  /// Returns the value at the specified index as type double.
   ///
   /*--cef()--*/
   virtual double GetDouble(size_t index) = 0;
 
   ///
-  // Returns the value at the specified index as type string.
+  /// Returns the value at the specified index as type string.
   ///
   /*--cef()--*/
   virtual CefString GetString(size_t index) = 0;
 
   ///
-  // Returns the value at the specified index as type binary. The returned
-  // value will reference existing data.
+  /// Returns the value at the specified index as type binary. The returned
+  /// value will reference existing data.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefBinaryValue> GetBinary(size_t index) = 0;
 
   ///
-  // Returns the value at the specified index as type dictionary. The returned
-  // value will reference existing data and modifications to the value will
-  // modify this object.
+  /// Returns the value at the specified index as type dictionary. The returned
+  /// value will reference existing data and modifications to the value will
+  /// modify this object.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefDictionaryValue> GetDictionary(size_t index) = 0;
 
   ///
-  // Returns the value at the specified index as type list. The returned
-  // value will reference existing data and modifications to the value will
-  // modify this object.
+  /// Returns the value at the specified index as type list. The returned
+  /// value will reference existing data and modifications to the value will
+  /// modify this object.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefListValue> GetList(size_t index) = 0;
 
   ///
-  // Sets the value at the specified index. Returns true if the value was set
-  // successfully. If |value| represents simple data then the underlying data
-  // will be copied and modifications to |value| will not modify this object. If
-  // |value| represents complex data (binary, dictionary or list) then the
-  // underlying data will be referenced and modifications to |value| will modify
-  // this object.
+  /// Sets the value at the specified index. Returns true if the value was set
+  /// successfully. If |value| represents simple data then the underlying data
+  /// will be copied and modifications to |value| will not modify this object.
+  /// If |value| represents complex data (binary, dictionary or list) then the
+  /// underlying data will be referenced and modifications to |value| will
+  /// modify this object.
   ///
   /*--cef()--*/
   virtual bool SetValue(size_t index, CefRefPtr<CefValue> value) = 0;
 
   ///
-  // Sets the value at the specified index as type null. Returns true if the
-  // value was set successfully.
+  /// Sets the value at the specified index as type null. Returns true if the
+  /// value was set successfully.
   ///
   /*--cef()--*/
   virtual bool SetNull(size_t index) = 0;
 
   ///
-  // Sets the value at the specified index as type bool. Returns true if the
-  // value was set successfully.
+  /// Sets the value at the specified index as type bool. Returns true if the
+  /// value was set successfully.
   ///
   /*--cef()--*/
   virtual bool SetBool(size_t index, bool value) = 0;
 
   ///
-  // Sets the value at the specified index as type int. Returns true if the
-  // value was set successfully.
+  /// Sets the value at the specified index as type int. Returns true if the
+  /// value was set successfully.
   ///
   /*--cef()--*/
   virtual bool SetInt(size_t index, int value) = 0;
 
   ///
-  // Sets the value at the specified index as type double. Returns true if the
-  // value was set successfully.
+  /// Sets the value at the specified index as type double. Returns true if the
+  /// value was set successfully.
   ///
   /*--cef()--*/
   virtual bool SetDouble(size_t index, double value) = 0;
 
   ///
-  // Sets the value at the specified index as type string. Returns true if the
-  // value was set successfully.
+  /// Sets the value at the specified index as type string. Returns true if the
+  /// value was set successfully.
   ///
   /*--cef(optional_param=value)--*/
   virtual bool SetString(size_t index, const CefString& value) = 0;
 
   ///
-  // Sets the value at the specified index as type binary. Returns true if the
-  // value was set successfully. If |value| is currently owned by another object
-  // then the value will be copied and the |value| reference will not change.
-  // Otherwise, ownership will be transferred to this object and the |value|
-  // reference will be invalidated.
+  /// Sets the value at the specified index as type binary. Returns true if the
+  /// value was set successfully. If |value| is currently owned by another
+  /// object then the value will be copied and the |value| reference will not
+  /// change. Otherwise, ownership will be transferred to this object and the
+  /// |value| reference will be invalidated.
   ///
   /*--cef()--*/
   virtual bool SetBinary(size_t index, CefRefPtr<CefBinaryValue> value) = 0;
 
   ///
-  // Sets the value at the specified index as type dict. Returns true if the
-  // value was set successfully. If |value| is currently owned by another object
-  // then the value will be copied and the |value| reference will not change.
-  // Otherwise, ownership will be transferred to this object and the |value|
-  // reference will be invalidated.
+  /// Sets the value at the specified index as type dict. Returns true if the
+  /// value was set successfully. If |value| is currently owned by another
+  /// object then the value will be copied and the |value| reference will not
+  /// change. Otherwise, ownership will be transferred to this object and the
+  /// |value| reference will be invalidated.
   ///
   /*--cef()--*/
   virtual bool SetDictionary(size_t index,
                              CefRefPtr<CefDictionaryValue> value) = 0;
 
   ///
-  // Sets the value at the specified index as type list. Returns true if the
-  // value was set successfully. If |value| is currently owned by another object
-  // then the value will be copied and the |value| reference will not change.
-  // Otherwise, ownership will be transferred to this object and the |value|
-  // reference will be invalidated.
+  /// Sets the value at the specified index as type list. Returns true if the
+  /// value was set successfully. If |value| is currently owned by another
+  /// object then the value will be copied and the |value| reference will not
+  /// change. Otherwise, ownership will be transferred to this object and the
+  /// |value| reference will be invalidated.
   ///
   /*--cef()--*/
   virtual bool SetList(size_t index, CefRefPtr<CefListValue> value) = 0;
diff --git a/src/include/cef_waitable_event.h b/src/include/cef_waitable_event.h
index d89371e..fa9a938 100644
--- a/src/include/cef_waitable_event.h
+++ b/src/include/cef_waitable_event.h
@@ -41,25 +41,25 @@
 #include "include/cef_base.h"
 
 ///
-// WaitableEvent is a thread synchronization tool that allows one thread to wait
-// for another thread to finish some work. This is equivalent to using a
-// Lock+ConditionVariable to protect a simple boolean value. However, using
-// WaitableEvent in conjunction with a Lock to wait for a more complex state
-// change (e.g., for an item to be added to a queue) is not recommended. In that
-// case consider using a ConditionVariable instead of a WaitableEvent. It is
-// safe to create and/or signal a WaitableEvent from any thread. Blocking on a
-// WaitableEvent by calling the *Wait() methods is not allowed on the browser
-// process UI or IO threads.
+/// WaitableEvent is a thread synchronization tool that allows one thread to
+/// wait for another thread to finish some work. This is equivalent to using a
+/// Lock+ConditionVariable to protect a simple boolean value. However, using
+/// WaitableEvent in conjunction with a Lock to wait for a more complex state
+/// change (e.g., for an item to be added to a queue) is not recommended. In
+/// that case consider using a ConditionVariable instead of a WaitableEvent. It
+/// is safe to create and/or signal a WaitableEvent from any thread. Blocking on
+/// a WaitableEvent by calling the *Wait() methods is not allowed on the browser
+/// process UI or IO threads.
 ///
 /*--cef(source=library)--*/
 class CefWaitableEvent : public CefBaseRefCounted {
  public:
   ///
-  // Create a new waitable event. If |automatic_reset| is true then the event
-  // state is automatically reset to un-signaled after a single waiting thread
-  // has been released; otherwise, the state remains signaled until Reset() is
-  // called manually. If |initially_signaled| is true then the event will start
-  // in the signaled state.
+  /// Create a new waitable event. If |automatic_reset| is true then the event
+  /// state is automatically reset to un-signaled after a single waiting thread
+  /// has been released; otherwise, the state remains signaled until Reset() is
+  /// called manually. If |initially_signaled| is true then the event will start
+  /// in the signaled state.
   ///
   /*--cef()--*/
   static CefRefPtr<CefWaitableEvent> CreateWaitableEvent(
@@ -67,43 +67,43 @@
       bool initially_signaled);
 
   ///
-  // Put the event in the un-signaled state.
+  /// Put the event in the un-signaled state.
   ///
   /*--cef()--*/
   virtual void Reset() = 0;
 
   ///
-  // Put the event in the signaled state. This causes any thread blocked on Wait
-  // to be woken up.
+  /// Put the event in the signaled state. This causes any thread blocked on
+  /// Wait to be woken up.
   ///
   /*--cef()--*/
   virtual void Signal() = 0;
 
   ///
-  // Returns true if the event is in the signaled state, else false. If the
-  // event was created with |automatic_reset| set to true then calling this
-  // method will also cause a reset.
+  /// Returns true if the event is in the signaled state, else false. If the
+  /// event was created with |automatic_reset| set to true then calling this
+  /// method will also cause a reset.
   ///
   /*--cef()--*/
   virtual bool IsSignaled() = 0;
 
   ///
-  // Wait indefinitely for the event to be signaled. This method will not return
-  // until after the call to Signal() has completed. This method cannot be
-  // called on the browser process UI or IO threads.
+  /// Wait indefinitely for the event to be signaled. This method will not
+  /// return until after the call to Signal() has completed. This method cannot
+  /// be called on the browser process UI or IO threads.
   ///
   /*--cef()--*/
   virtual void Wait() = 0;
 
   ///
-  // Wait up to |max_ms| milliseconds for the event to be signaled. Returns true
-  // if the event was signaled. A return value of false does not necessarily
-  // mean that |max_ms| was exceeded. This method will not return until after
-  // the call to Signal() has completed. This method cannot be called on the
-  // browser process UI or IO threads.
+  /// Wait up to |max_ms| milliseconds for the event to be signaled. Returns
+  /// true if the event was signaled. A return value of false does not
+  /// necessarily mean that |max_ms| was exceeded. This method will not return
+  /// until after the call to Signal() has completed. This method cannot be
+  /// called on the browser process UI or IO threads.
   ///
   /*--cef()--*/
-  virtual bool TimedWait(int64 max_ms) = 0;
+  virtual bool TimedWait(int64_t max_ms) = 0;
 };
 
 #endif  // CEF_INCLUDE_CEF_WAITABLE_EVENT_H_
diff --git a/src/include/cef_web_plugin.h b/src/include/cef_web_plugin.h
deleted file mode 100644
index 118788b..0000000
--- a/src/include/cef_web_plugin.h
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright (c) 2012 Marshall A. Greenblatt. 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.
-//
-// ---------------------------------------------------------------------------
-//
-// The contents of this file must follow a specific format in order to
-// support the CEF translator tool. See the translator.README.txt file in the
-// tools directory for more information.
-//
-
-#ifndef CEF_INCLUDE_CEF_WEB_PLUGIN_H_
-#define CEF_INCLUDE_CEF_WEB_PLUGIN_H_
-
-#include "include/cef_base.h"
-
-class CefBrowser;
-
-///
-// Information about a specific web plugin.
-///
-/*--cef(source=library)--*/
-class CefWebPluginInfo : public virtual CefBaseRefCounted {
- public:
-  ///
-  // Returns the plugin name (i.e. Flash).
-  ///
-  /*--cef()--*/
-  virtual CefString GetName() = 0;
-
-  ///
-  // Returns the plugin file path (DLL/bundle/library).
-  ///
-  /*--cef()--*/
-  virtual CefString GetPath() = 0;
-
-  ///
-  // Returns the version of the plugin (may be OS-specific).
-  ///
-  /*--cef()--*/
-  virtual CefString GetVersion() = 0;
-
-  ///
-  // Returns a description of the plugin from the version information.
-  ///
-  /*--cef()--*/
-  virtual CefString GetDescription() = 0;
-};
-
-///
-// Interface to implement for visiting web plugin information. The methods of
-// this class will be called on the browser process UI thread.
-///
-/*--cef(source=client)--*/
-class CefWebPluginInfoVisitor : public virtual CefBaseRefCounted {
- public:
-  ///
-  // Method that will be called once for each plugin. |count| is the 0-based
-  // index for the current plugin. |total| is the total number of plugins.
-  // Return false to stop visiting plugins. This method may never be called if
-  // no plugins are found.
-  ///
-  /*--cef()--*/
-  virtual bool Visit(CefRefPtr<CefWebPluginInfo> info,
-                     int count,
-                     int total) = 0;
-};
-
-///
-// Visit web plugin information. Can be called on any thread in the browser
-// process.
-///
-/*--cef()--*/
-void CefVisitWebPluginInfo(CefRefPtr<CefWebPluginInfoVisitor> visitor);
-
-///
-// Cause the plugin list to refresh the next time it is accessed regardless
-// of whether it has already been loaded. Can be called on any thread in the
-// browser process.
-///
-/*--cef()--*/
-void CefRefreshWebPlugins();
-
-///
-// Unregister an internal plugin. This may be undone the next time
-// CefRefreshWebPlugins() is called. Can be called on any thread in the browser
-// process.
-///
-/*--cef()--*/
-void CefUnregisterInternalWebPlugin(const CefString& path);
-
-///
-// Register a plugin crash. Can be called on any thread in the browser process
-// but will be executed on the IO thread.
-///
-/*--cef()--*/
-void CefRegisterWebPluginCrash(const CefString& path);
-
-///
-// Interface to implement for receiving unstable plugin information. The methods
-// of this class will be called on the browser process IO thread.
-///
-/*--cef(source=client)--*/
-class CefWebPluginUnstableCallback : public virtual CefBaseRefCounted {
- public:
-  ///
-  // Method that will be called for the requested plugin. |unstable| will be
-  // true if the plugin has reached the crash count threshold of 3 times in 120
-  // seconds.
-  ///
-  /*--cef()--*/
-  virtual void IsUnstable(const CefString& path, bool unstable) = 0;
-};
-
-///
-// Query if a plugin is unstable. Can be called on any thread in the browser
-// process.
-///
-/*--cef()--*/
-void CefIsWebPluginUnstable(const CefString& path,
-                            CefRefPtr<CefWebPluginUnstableCallback> callback);
-
-///
-// Implement this interface to receive notification when CDM registration is
-// complete. The methods of this class will be called on the browser process
-// UI thread.
-///
-/*--cef(source=client)--*/
-class CefRegisterCdmCallback : public virtual CefBaseRefCounted {
- public:
-  ///
-  // Method that will be called when CDM registration is complete. |result|
-  // will be CEF_CDM_REGISTRATION_ERROR_NONE if registration completed
-  // successfully. Otherwise, |result| and |error_message| will contain
-  // additional information about why registration failed.
-  ///
-  /*--cef(optional_param=error_message)--*/
-  virtual void OnCdmRegistrationComplete(cef_cdm_registration_error_t result,
-                                         const CefString& error_message) = 0;
-};
-
-///
-// Register the Widevine CDM plugin.
-//
-// The client application is responsible for downloading an appropriate
-// platform-specific CDM binary distribution from Google, extracting the
-// contents, and building the required directory structure on the local machine.
-// The CefBrowserHost::StartDownload method and CefZipArchive class can be used
-// to implement this functionality in CEF. Contact Google via
-// https://www.widevine.com/contact.html for details on CDM download.
-//
-// |path| is a directory that must contain the following files:
-//   1. manifest.json file from the CDM binary distribution (see below).
-//   2. widevinecdm file from the CDM binary distribution (e.g.
-//      widevinecdm.dll on on Windows, libwidevinecdm.dylib on OS X,
-//      libwidevinecdm.so on Linux).
-//
-// If any of these files are missing or if the manifest file has incorrect
-// contents the registration will fail and |callback| will receive a |result|
-// value of CEF_CDM_REGISTRATION_ERROR_INCORRECT_CONTENTS.
-//
-// The manifest.json file must contain the following keys:
-//   A. "os": Supported OS (e.g. "mac", "win" or "linux").
-//   B. "arch": Supported architecture (e.g. "ia32" or "x64").
-//   C. "x-cdm-module-versions": Module API version (e.g. "4").
-//   D. "x-cdm-interface-versions": Interface API version (e.g. "8").
-//   E. "x-cdm-host-versions": Host API version (e.g. "8").
-//   F. "version": CDM version (e.g. "1.4.8.903").
-//   G. "x-cdm-codecs": List of supported codecs (e.g. "vp8,vp9.0,avc1").
-//
-// A through E are used to verify compatibility with the current Chromium
-// version. If the CDM is not compatible the registration will fail and
-// |callback| will receive a |result| value of
-// CEF_CDM_REGISTRATION_ERROR_INCOMPATIBLE.
-//
-// |callback| will be executed asynchronously once registration is complete.
-//
-// On Linux this function must be called before CefInitialize() and the
-// registration cannot be changed during runtime. If registration is not
-// supported at the time that CefRegisterWidevineCdm() is called then |callback|
-// will receive a |result| value of CEF_CDM_REGISTRATION_ERROR_NOT_SUPPORTED.
-///
-/*--cef(optional_param=callback)--*/
-void CefRegisterWidevineCdm(const CefString& path,
-                            CefRefPtr<CefRegisterCdmCallback> callback);
-
-#endif  // CEF_INCLUDE_CEF_WEB_PLUGIN_H_
diff --git a/src/include/cef_x509_certificate.h b/src/include/cef_x509_certificate.h
index b466a6a..68ae752 100644
--- a/src/include/cef_x509_certificate.h
+++ b/src/include/cef_x509_certificate.h
@@ -44,70 +44,58 @@
 #include "include/cef_values.h"
 
 ///
-// Class representing the issuer or subject field of an X.509 certificate.
+/// Class representing the issuer or subject field of an X.509 certificate.
 ///
 /*--cef(source=library)--*/
 class CefX509CertPrincipal : public virtual CefBaseRefCounted {
  public:
   ///
-  // Returns a name that can be used to represent the issuer. It tries in this
-  // order: Common Name (CN), Organization Name (O) and Organizational Unit
-  // Name (OU) and returns the first non-empty one found.
+  /// Returns a name that can be used to represent the issuer. It tries in this
+  /// order: Common Name (CN), Organization Name (O) and Organizational Unit
+  /// Name (OU) and returns the first non-empty one found.
   ///
   /*--cef()--*/
   virtual CefString GetDisplayName() = 0;
 
   ///
-  // Returns the common name.
+  /// Returns the common name.
   ///
   /*--cef()--*/
   virtual CefString GetCommonName() = 0;
 
   ///
-  // Returns the locality name.
+  /// Returns the locality name.
   ///
   /*--cef()--*/
   virtual CefString GetLocalityName() = 0;
 
   ///
-  // Returns the state or province name.
+  /// Returns the state or province name.
   ///
   /*--cef()--*/
   virtual CefString GetStateOrProvinceName() = 0;
 
   ///
-  // Returns the country name.
+  /// Returns the country name.
   ///
   /*--cef()--*/
   virtual CefString GetCountryName() = 0;
 
   ///
-  // Retrieve the list of street addresses.
-  ///
-  /*--cef()--*/
-  virtual void GetStreetAddresses(std::vector<CefString>& addresses) = 0;
-
-  ///
-  // Retrieve the list of organization names.
+  /// Retrieve the list of organization names.
   ///
   /*--cef()--*/
   virtual void GetOrganizationNames(std::vector<CefString>& names) = 0;
 
   ///
-  // Retrieve the list of organization unit names.
+  /// Retrieve the list of organization unit names.
   ///
   /*--cef()--*/
   virtual void GetOrganizationUnitNames(std::vector<CefString>& names) = 0;
-
-  ///
-  // Retrieve the list of domain components.
-  ///
-  /*--cef()--*/
-  virtual void GetDomainComponents(std::vector<CefString>& components) = 0;
 };
 
 ///
-// Class representing a X.509 certificate.
+/// Class representing a X.509 certificate.
 ///
 /*--cef(source=library)--*/
 class CefX509Certificate : public virtual CefBaseRefCounted {
@@ -115,71 +103,71 @@
   typedef std::vector<CefRefPtr<CefBinaryValue>> IssuerChainBinaryList;
 
   ///
-  // Returns the subject of the X.509 certificate. For HTTPS server
-  // certificates this represents the web server.  The common name of the
-  // subject should match the host name of the web server.
+  /// Returns the subject of the X.509 certificate. For HTTPS server
+  /// certificates this represents the web server.  The common name of the
+  /// subject should match the host name of the web server.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefX509CertPrincipal> GetSubject() = 0;
 
   ///
-  // Returns the issuer of the X.509 certificate.
+  /// Returns the issuer of the X.509 certificate.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefX509CertPrincipal> GetIssuer() = 0;
 
   ///
-  // Returns the DER encoded serial number for the X.509 certificate. The value
-  // possibly includes a leading 00 byte.
+  /// Returns the DER encoded serial number for the X.509 certificate. The value
+  /// possibly includes a leading 00 byte.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefBinaryValue> GetSerialNumber() = 0;
 
   ///
-  // Returns the date before which the X.509 certificate is invalid.
-  // CefTime.GetTimeT() will return 0 if no date was specified.
+  /// Returns the date before which the X.509 certificate is invalid.
+  /// CefBaseTime.GetTimeT() will return 0 if no date was specified.
   ///
   /*--cef()--*/
-  virtual CefTime GetValidStart() = 0;
+  virtual CefBaseTime GetValidStart() = 0;
 
   ///
-  // Returns the date after which the X.509 certificate is invalid.
-  // CefTime.GetTimeT() will return 0 if no date was specified.
+  /// Returns the date after which the X.509 certificate is invalid.
+  /// CefBaseTime.GetTimeT() will return 0 if no date was specified.
   ///
   /*--cef()--*/
-  virtual CefTime GetValidExpiry() = 0;
+  virtual CefBaseTime GetValidExpiry() = 0;
 
   ///
-  // Returns the DER encoded data for the X.509 certificate.
+  /// Returns the DER encoded data for the X.509 certificate.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefBinaryValue> GetDEREncoded() = 0;
 
   ///
-  // Returns the PEM encoded data for the X.509 certificate.
+  /// Returns the PEM encoded data for the X.509 certificate.
   ///
   /*--cef()--*/
   virtual CefRefPtr<CefBinaryValue> GetPEMEncoded() = 0;
 
   ///
-  // Returns the number of certificates in the issuer chain.
-  // If 0, the certificate is self-signed.
+  /// Returns the number of certificates in the issuer chain.
+  /// If 0, the certificate is self-signed.
   ///
   /*--cef()--*/
   virtual size_t GetIssuerChainSize() = 0;
 
   ///
-  // Returns the DER encoded data for the certificate issuer chain.
-  // If we failed to encode a certificate in the chain it is still
-  // present in the array but is an empty string.
+  /// Returns the DER encoded data for the certificate issuer chain.
+  /// If we failed to encode a certificate in the chain it is still
+  /// present in the array but is an empty string.
   ///
   /*--cef(count_func=chain:GetIssuerChainSize)--*/
   virtual void GetDEREncodedIssuerChain(IssuerChainBinaryList& chain) = 0;
 
   ///
-  // Returns the PEM encoded data for the certificate issuer chain.
-  // If we failed to encode a certificate in the chain it is still
-  // present in the array but is an empty string.
+  /// Returns the PEM encoded data for the certificate issuer chain.
+  /// If we failed to encode a certificate in the chain it is still
+  /// present in the array but is an empty string.
   ///
   /*--cef(count_func=chain:GetIssuerChainSize)--*/
   virtual void GetPEMEncodedIssuerChain(IssuerChainBinaryList& chain) = 0;
diff --git a/src/include/cef_xml_reader.h b/src/include/cef_xml_reader.h
index 5269ef5..055d522 100644
--- a/src/include/cef_xml_reader.h
+++ b/src/include/cef_xml_reader.h
@@ -42,9 +42,9 @@
 #include "include/cef_stream.h"
 
 ///
-// Class that supports the reading of XML data via the libxml streaming API.
-// The methods of this class should only be called on the thread that creates
-// the object.
+/// Class that supports the reading of XML data via the libxml streaming API.
+/// The methods of this class should only be called on the thread that creates
+/// the object.
 ///
 /*--cef(source=library)--*/
 class CefXmlReader : public virtual CefBaseRefCounted {
@@ -53,8 +53,8 @@
   typedef cef_xml_node_type_t NodeType;
 
   ///
-  // Create a new CefXmlReader object. The returned object's methods can only
-  // be called from the thread that created the object.
+  /// Create a new CefXmlReader object. The returned object's methods can only
+  /// be called from the thread that created the object.
   ///
   /*--cef()--*/
   static CefRefPtr<CefXmlReader> Create(CefRefPtr<CefStreamReader> stream,
@@ -62,202 +62,202 @@
                                         const CefString& URI);
 
   ///
-  // Moves the cursor to the next node in the document. This method must be
-  // called at least once to set the current cursor position. Returns true if
-  // the cursor position was set successfully.
+  /// Moves the cursor to the next node in the document. This method must be
+  /// called at least once to set the current cursor position. Returns true if
+  /// the cursor position was set successfully.
   ///
   /*--cef()--*/
   virtual bool MoveToNextNode() = 0;
 
   ///
-  // Close the document. This should be called directly to ensure that cleanup
-  // occurs on the correct thread.
+  /// Close the document. This should be called directly to ensure that cleanup
+  /// occurs on the correct thread.
   ///
   /*--cef()--*/
   virtual bool Close() = 0;
 
   ///
-  // Returns true if an error has been reported by the XML parser.
+  /// Returns true if an error has been reported by the XML parser.
   ///
   /*--cef()--*/
   virtual bool HasError() = 0;
 
   ///
-  // Returns the error string.
+  /// Returns the error string.
   ///
   /*--cef()--*/
   virtual CefString GetError() = 0;
 
-  // The below methods retrieve data for the node at the current cursor
-  // position.
+  /// The below methods retrieve data for the node at the current cursor
+  /// position.
 
   ///
-  // Returns the node type.
+  /// Returns the node type.
   ///
   /*--cef(default_retval=XML_NODE_UNSUPPORTED)--*/
   virtual NodeType GetType() = 0;
 
   ///
-  // Returns the node depth. Depth starts at 0 for the root node.
+  /// Returns the node depth. Depth starts at 0 for the root node.
   ///
   /*--cef()--*/
   virtual int GetDepth() = 0;
 
   ///
-  // Returns the local name. See
-  // http://www.w3.org/TR/REC-xml-names/#NT-LocalPart for additional details.
+  /// Returns the local name. See
+  /// http://www.w3.org/TR/REC-xml-names/#NT-LocalPart for additional details.
   ///
   /*--cef()--*/
   virtual CefString GetLocalName() = 0;
 
   ///
-  // Returns the namespace prefix. See http://www.w3.org/TR/REC-xml-names/ for
-  // additional details.
+  /// Returns the namespace prefix. See http://www.w3.org/TR/REC-xml-names/ for
+  /// additional details.
   ///
   /*--cef()--*/
   virtual CefString GetPrefix() = 0;
 
   ///
-  // Returns the qualified name, equal to (Prefix:)LocalName. See
-  // http://www.w3.org/TR/REC-xml-names/#ns-qualnames for additional details.
+  /// Returns the qualified name, equal to (Prefix:)LocalName. See
+  /// http://www.w3.org/TR/REC-xml-names/#ns-qualnames for additional details.
   ///
   /*--cef()--*/
   virtual CefString GetQualifiedName() = 0;
 
   ///
-  // Returns the URI defining the namespace associated with the node. See
-  // http://www.w3.org/TR/REC-xml-names/ for additional details.
+  /// Returns the URI defining the namespace associated with the node. See
+  /// http://www.w3.org/TR/REC-xml-names/ for additional details.
   ///