mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	Compare commits
	
		
			20 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 700dc254a7 | ||
|  | 934eaba67c | ||
|  | e260cbb922 | ||
|  | 857e7ebc07 | ||
|  | 88c82d244f | ||
|  | 052c2d2722 | ||
|  | 2265ad3ce2 | ||
|  | cbcd0c4bca | ||
|  | 416ffeb215 | ||
|  | 281379bbbc | ||
|  | 1ec346dc4b | ||
|  | b9a2143541 | ||
|  | db997d194f | ||
|  | d0138cbb07 | ||
|  | 16be664a15 | ||
|  | 15a2dd016a | ||
|  | eef96a89d6 | ||
|  | 7336129066 | ||
|  | 629d936795 | ||
|  | 2927c34f74 | 
							
								
								
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -35,7 +35,6 @@ | |||||||
| .metadata | .metadata | ||||||
| .project | .project | ||||||
| .pydevproject | .pydevproject | ||||||
| .vscode |  | ||||||
| # Settings directory for eclipse | # Settings directory for eclipse | ||||||
| /.settings | /.settings | ||||||
| .checkstyle | .checkstyle | ||||||
| @@ -43,14 +42,8 @@ cscope.* | |||||||
| Session.vim | Session.vim | ||||||
| tags | tags | ||||||
| Thumbs.db | Thumbs.db | ||||||
| # IDE's |  | ||||||
| .vs/ |  | ||||||
| .kdev4/ |  | ||||||
| *.kdev4 |  | ||||||
| # CEF generated directories | # CEF generated directories | ||||||
| /binary_distrib | /binary_distrib | ||||||
| /docs | /docs | ||||||
| # CEF generated files | # CEF generated files | ||||||
| /include/cef_config.h |  | ||||||
| /include/cef_version.h | /include/cef_version.h | ||||||
| .ccls-cache/ |  | ||||||
|   | |||||||
| @@ -1,8 +1,6 @@ | |||||||
| # This file is an addendum to the Chromium AUTHORS file. It lists authors | # This file is an addendum to the Chromium AUTHORS file. | ||||||
| # through March 16, 2015 when Git was introduced for source code management. | # Names should be added to this file like so: | ||||||
| # A list of additional authors added after that date can be found by executing | # Name or Organization <email address> | ||||||
| # this command on a local Git checkout: |  | ||||||
| # git log --all --format="%aN <%aE>" | sort -u |  | ||||||
|  |  | ||||||
| Marshall Greenblatt <magreenblatt@gmail.com> | Marshall Greenblatt <magreenblatt@gmail.com> | ||||||
| Jamie Kirkpatrick <jkp@spotify.com> | Jamie Kirkpatrick <jkp@spotify.com> | ||||||
|   | |||||||
| @@ -7,6 +7,5 @@ | |||||||
| # https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding | # https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding | ||||||
|  |  | ||||||
| { | { | ||||||
|   'chromium_checkout': 'refs/tags/97.0.4692.99', |   'chromium_checkout': 'refs/tags/61.0.3163.91', | ||||||
|   'depot_tools_checkout': 'f7b8f8f3cd' |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,66 +0,0 @@ | |||||||
| # The Chromium Embedded Framework (CEF) project is built on top of the Chromium |  | ||||||
| # project source tree. When updating Chromium to a new version certain files and |  | ||||||
| # patterns should be observed for changes. If changes are detected then the CEF |  | ||||||
| # source code or patch files will likely need to be updated. |  | ||||||
| # |  | ||||||
| # Add `--log-chromium-changes` to the automate-git.py command-line to output |  | ||||||
| # the following files in the <download-dir>: |  | ||||||
| # |  | ||||||
| # * chromium_update_changes.diff |  | ||||||
| #   Files in the chromium/src directory that have changed. See the 'files' |  | ||||||
| #   section below. |  | ||||||
| # |  | ||||||
| # * chromium_update_patterns.txt |  | ||||||
| #   Files in the chromium/src directory that contain invalid/unexpected |  | ||||||
| #   patterns. See the 'patterns' section below. Failure of this step is |  | ||||||
| #   considered a fatal error during update. |  | ||||||
| # |  | ||||||
| # * chromium_update_patches.txt |  | ||||||
| #   Output from attempting to update existing Chromium patch files using the |  | ||||||
| #   patch_updater.py tool. Failure of this step is considered a fatal error |  | ||||||
| #   during update. |  | ||||||
| # |  | ||||||
| # For complete update instructions see: |  | ||||||
| # https://bitbucket.org/chromiumembedded/cef/wiki/ChromiumUpdate.md |  | ||||||
|  |  | ||||||
| { |  | ||||||
|   # 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/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', |  | ||||||
|     'chrome/renderer/chrome_content_renderer_client.*', |  | ||||||
|     'chrome/renderer/extensions/chrome_extensions_renderer_client.*', |  | ||||||
|     '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', |  | ||||||
|     'content/shell/app/*', |  | ||||||
|     'content/shell/browser/shell_*', |  | ||||||
|     'content/shell/browser/renderer_host/shell_*', |  | ||||||
|     'content/shell/common/shell_*', |  | ||||||
|     'content/shell/gpu/shell_*', |  | ||||||
|     'content/shell/renderer/shell_*', |  | ||||||
|     'content/shell/utility/shell_*', |  | ||||||
|     'extensions/shell/*', |  | ||||||
|     'net/base/features.cc', |  | ||||||
|     'net/cookies/cookie_store.h', |  | ||||||
|     'services/network/public/cpp/features.cc', |  | ||||||
|     'ui/base/ui_base_features.cc', |  | ||||||
|   ], |  | ||||||
|   # Patterns that should not be found in the chromium/src directory after |  | ||||||
|   # applying patch files. |  | ||||||
|   'patterns': [], |  | ||||||
| } |  | ||||||
| @@ -11,9 +11,9 @@ | |||||||
| # CMake-generated project formats that have been tested with this CEF binary | # CMake-generated project formats that have been tested with this CEF binary | ||||||
| # distribution include: | # distribution include: | ||||||
| # | # | ||||||
| # Linux:      Ninja, GCC 7.5.0+, Unix Makefiles | # Linux:      Ninja, Unix Makefiles | ||||||
| # MacOS:      Ninja, Xcode 12.2 to 13.0 | # Mac OS X:   Ninja, Xcode 5+ | ||||||
| # Windows:    Ninja, Visual Studio 2019+ | # Windows:    Ninja, Visual Studio 2010+ | ||||||
| # | # | ||||||
| # Ninja is a cross-platform open-source tool for running fast builds using | # 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 | # pre-installed platform toolchains (GNU, clang, Xcode or MSVC). It can be | ||||||
| @@ -36,27 +36,25 @@ | |||||||
| # | # | ||||||
| # The below requirements must be met to build this CEF binary distribution. | # The below requirements must be met to build this CEF binary distribution. | ||||||
| # | # | ||||||
| # - CMake version 3.19 or newer. | # - CMake version 2.8.12.1 or newer. | ||||||
| # | # | ||||||
| # - Linux requirements: | # - Linux requirements: | ||||||
| #   Currently supported distributions include Debian 10 (Buster), Ubuntu 18 | #   Currently supported distributions include Debian Wheezy, Ubuntu Precise, and | ||||||
| #   (Bionic Beaver), and related. Ubuntu 18.04 64-bit with GCC 7.5.0+ is | #   related. Ubuntu 14.04 64-bit is recommended. Newer versions will likely also | ||||||
| #   recommended. Newer versions will likely also work but may not have been | #   work but may not have been tested. | ||||||
| #   tested. |  | ||||||
| #   Required packages include: | #   Required packages include: | ||||||
| #     build-essential | #     build-essential | ||||||
| #     libgtk3.0-dev     (required by the cefclient target only) | #     libgtk2.0-dev     (required by the cefclient target only) | ||||||
|  | #     libgtkglext1-dev  (required by the cefclient target only) | ||||||
| # | # | ||||||
| # - MacOS requirements: | # - Mac OS X requirements: | ||||||
| #   Xcode 12.2 to 13.0 building on MacOS 10.15.4 (Catalina) or newer. Only | #   Xcode 5 or newer building on Mac OS X 10.9 (Mavericks) or newer. Xcode 8.3 | ||||||
| #   64-bit builds are supported. The Xcode command-line tools must also be | #   and OS X 10.12 are recommended. The Xcode command-line tools must also be | ||||||
| #   installed. Newer Xcode versions may not have been been tested and are not | #   installed. Only 64-bit builds are supported on OS X. | ||||||
| #   recommended. |  | ||||||
| # | # | ||||||
| # - Windows requirements: | # - Windows requirements: | ||||||
| #   Visual Studio 2019 or newer building on Windows 7 or newer. Windows 10 | #   Visual Studio 2010 or newer building on Windows 7 or newer. Visual Studio | ||||||
| #   64-bit is recommended. Newer versions will likely also work but may not have | #   2015 Update 3 and Windows 10 64-bit are recommended. | ||||||
| #   been tested. |  | ||||||
| # | # | ||||||
| # BUILD EXAMPLES | # BUILD EXAMPLES | ||||||
| # | # | ||||||
| @@ -77,7 +75,7 @@ | |||||||
| #     > cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug .. | #     > cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug .. | ||||||
| #     > ninja cefclient cefsimple | #     > ninja cefclient cefsimple | ||||||
| # | # | ||||||
| # To perform a MacOS build using a 64-bit CEF binary distribution: | # To perform a Mac OS X build using a 64-bit CEF binary distribution: | ||||||
| #   Using the Xcode IDE: | #   Using the Xcode IDE: | ||||||
| #     > cmake -G "Xcode" -DPROJECT_ARCH="x86_64" .. | #     > cmake -G "Xcode" -DPROJECT_ARCH="x86_64" .. | ||||||
| #     Open build\cef.xcodeproj in Xcode and select Product > Build. | #     Open build\cef.xcodeproj in Xcode and select Product > Build. | ||||||
| @@ -86,54 +84,33 @@ | |||||||
| #     > cmake -G "Ninja" -DPROJECT_ARCH="x86_64" -DCMAKE_BUILD_TYPE=Debug .. | #     > cmake -G "Ninja" -DPROJECT_ARCH="x86_64" -DCMAKE_BUILD_TYPE=Debug .. | ||||||
| #     > ninja cefclient cefsimple | #     > 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: | # To perform a Windows build using a 32-bit CEF binary distribution: | ||||||
| #   Using the Visual Studio 2019 IDE: | #   Using the Visual Studio 2015 IDE: | ||||||
| #     > cmake -G "Visual Studio 16" -A Win32 .. | #     > cmake -G "Visual Studio 14" .. | ||||||
| #     Open build\cef.sln in Visual Studio and select Build > Build Solution. | #     Open build\cef.sln in Visual Studio and select Build > Build Solution. | ||||||
| # | # | ||||||
| #   Using Ninja with Visual Studio 2019 command-line tools: | #   Using Ninja with Visual Studio 2015 command-line tools: | ||||||
| #     (this path may be different depending on your Visual Studio installation) | #     (this path may be different depending on your Visual Studio installation) | ||||||
| #     > "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvars32.bat" | #     > "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat" | ||||||
| #     > cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug .. | #     > cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug .. | ||||||
| #     > ninja cefclient cefsimple | #     > ninja cefclient cefsimple | ||||||
| # | # | ||||||
| # To perform a Windows build using a 64-bit CEF binary distribution: | # To perform a Windows build using a 64-bit CEF binary distribution: | ||||||
| #   Using the Visual Studio 2019 IDE: | #   Using the Visual Studio 2015 IDE: | ||||||
| #     > cmake -G "Visual Studio 16" -A x64 .. | #     > cmake -G "Visual Studio 14 Win64" .. | ||||||
| #     Open build\cef.sln in Visual Studio and select Build > Build Solution. | #     Open build\cef.sln in Visual Studio and select Build > Build Solution. | ||||||
| # | # | ||||||
| #   Using Ninja with Visual Studio 2019 command-line tools: | #   Using Ninja with Visual Studio 2015 command-line tools: | ||||||
| #     (this path may be different depending on your Visual Studio installation) | #     (this path may be different depending on your Visual Studio installation) | ||||||
| #     > "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvars64.bat" | #     > "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat" | ||||||
| #     > cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug .. | #     > cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug .. | ||||||
| #     > ninja cefclient cefsimple | #     > ninja cefclient cefsimple | ||||||
| # |  | ||||||
| # To perform a Windows build using an ARM64 CEF binary distribution: |  | ||||||
| #   Using the Visual Studio 2019 IDE: |  | ||||||
| #     > cmake -G "Visual Studio 16" -A arm64 .. |  | ||||||
| #     Open build\cef.sln in Visual Studio and select Build > Build Solution. |  | ||||||
| # |  | ||||||
| #   Using Ninja with Visual Studio 2019 command-line tools: |  | ||||||
| #     (this path may be different depending on your Visual Studio installation) |  | ||||||
| #     > "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvarsamd64_arm64.bat" |  | ||||||
| #     > cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug .. |  | ||||||
| #     > ninja cefsimple |  | ||||||
|  |  | ||||||
| # | # | ||||||
| # Global setup. | # Global setup. | ||||||
| # | # | ||||||
|  |  | ||||||
| # For VS2019 and Xcode 12+ support. | cmake_minimum_required(VERSION 2.8.12.1) | ||||||
| cmake_minimum_required(VERSION 3.19) |  | ||||||
|  |  | ||||||
| # Only generate Debug and Release configuration types. | # Only generate Debug and Release configuration types. | ||||||
| set(CMAKE_CONFIGURATION_TYPES Debug Release) | set(CMAKE_CONFIGURATION_TYPES Debug Release) | ||||||
| @@ -222,15 +199,10 @@ add_subdirectory(${CEF_LIBCEF_DLL_WRAPPER_PATH} libcef_dll_wrapper) | |||||||
| # Include application targets. | # Include application targets. | ||||||
| # Comes from the <target>/CMakeLists.txt file in the current directory. | # Comes from the <target>/CMakeLists.txt file in the current directory. | ||||||
| # TODO: Change these lines to match your project target when you copy this file. | # TODO: Change these lines to match your project target when you copy this file. | ||||||
| if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/tests") | add_subdirectory(tests/cefclient) | ||||||
|   add_subdirectory(tests/cefsimple) | add_subdirectory(tests/cefsimple) | ||||||
|   add_subdirectory(tests/gtest) | add_subdirectory(tests/gtest) | ||||||
|   add_subdirectory(tests/ceftests) | add_subdirectory(tests/ceftests) | ||||||
| endif() |  | ||||||
|  |  | ||||||
| if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/tests/cefclient") |  | ||||||
|   add_subdirectory(tests/cefclient) |  | ||||||
| endif() |  | ||||||
|  |  | ||||||
| # Display configuration settings. | # Display configuration settings. | ||||||
| PRINT_CEF_CONFIG() | PRINT_CEF_CONFIG() | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2008-2020 Marshall A. Greenblatt. Portions Copyright (c) | // Copyright (c) 2008-2014 Marshall A. Greenblatt. Portions Copyright (c) | ||||||
| // 2006-2009 Google Inc. All rights reserved. | // 2006-2009 Google Inc. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
|   | |||||||
| @@ -7,11 +7,10 @@ The Chromium Embedded Framework (CEF) is a simple framework for embedding Chromi | |||||||
| * General Usage - https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage | * General Usage - https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage | ||||||
| * Master Build Quick-Start - https://bitbucket.org/chromiumembedded/cef/wiki/MasterBuildQuickStart | * Master Build Quick-Start - https://bitbucket.org/chromiumembedded/cef/wiki/MasterBuildQuickStart | ||||||
| * Branches and Building - https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding | * 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/ | * Support Forum - http://www.magpcss.org/ceforum/ | ||||||
| * CEF1 C++ API Docs - http://magpcss.org/ceforum/apidocs/ | * CEF1 C++ API Docs - http://magpcss.org/ceforum/apidocs/ | ||||||
| * CEF3 C++ API Docs - http://magpcss.org/ceforum/apidocs3/ | * CEF3 C++ API Docs - http://magpcss.org/ceforum/apidocs3/ | ||||||
| * Downloads - https://cef-builds.spotifycdn.com/index.html | * Downloads - http://opensource.spotify.com/cefbuilds/index.html | ||||||
| * Donations - http://www.magpcss.org/ceforum/donate.php | * Donations - http://www.magpcss.org/ceforum/donate.php | ||||||
|  |  | ||||||
| # Introduction | # Introduction | ||||||
| @@ -33,7 +32,7 @@ Users new to CEF development should start by reading the [Tutorial](https://bitb | |||||||
|  |  | ||||||
| # Binary Distributions | # Binary Distributions | ||||||
|  |  | ||||||
| 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. | 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. | ||||||
|  |  | ||||||
| # Source Distributions | # Source Distributions | ||||||
|  |  | ||||||
| @@ -43,14 +42,13 @@ The CEF project is an extension of the Chromium project. CEF maintains developme | |||||||
|  |  | ||||||
| The base CEF framework includes support for the C and C++ programming languages. Thanks to the hard work of external maintainers CEF can integrate with a number of other programming languages and frameworks. These external projects are not maintained by CEF so please contact the respective project maintainer if you have any questions or issues. | The base CEF framework includes support for the C and C++ programming languages. Thanks to the hard work of external maintainers CEF can integrate with a number of other programming languages and frameworks. These external projects are not maintained by CEF so please contact the respective project maintainer if you have any questions or issues. | ||||||
|  |  | ||||||
| * .Net (CEF3) - https://github.com/cefsharp/CefSharp | * .Net - https://github.com/chillitom/CefSharp | ||||||
| * .Net (CEF1) - https://bitbucket.org/fddima/cefglue | * .Net (CEF1) - https://bitbucket.org/fddima/cefglue | ||||||
| * .Net/Mono (CEF3) - https://bitbucket.org/xilium/xilium.cefglue | * .Net/Mono (CEF3) - https://bitbucket.org/xilium/xilium.cefglue | ||||||
| * .Net (CEF3) - https://bitbucket.org/chromiumfx/chromiumfx | * .Net (CEF3) - https://bitbucket.org/chromiumfx/chromiumfx | ||||||
| * Delphi (CEF1) - http://code.google.com/p/delphichromiumembedded/ | * Delphi (CEF1) - http://code.google.com/p/delphichromiumembedded/ | ||||||
| * Delphi (CEF3) - https://github.com/hgourvest/dcef3 | * Delphi (CEF3) - https://github.com/hgourvest/dcef3 | ||||||
| * Delphi (CEF3) - https://github.com/salvadordf/CEF4Delphi | * Delphi (CEF3) - https://github.com/salvadordf/CEF4Delphi | ||||||
| * Go - https://github.com/richardwilkes/cef |  | ||||||
| * Go - https://github.com/CzarekTomczak/cef2go | * Go - https://github.com/CzarekTomczak/cef2go | ||||||
| * Java - https://bitbucket.org/chromiumembedded/java-cef | * Java - https://bitbucket.org/chromiumembedded/java-cef | ||||||
| * Java - http://code.google.com/p/javacef/ | * Java - http://code.google.com/p/javacef/ | ||||||
|   | |||||||
							
								
								
									
										142
									
								
								cef_paths.gypi
									
									
									
									
									
								
							
							
						
						
									
										142
									
								
								cef_paths.gypi
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | |||||||
| # Copyright (c) 2022 The Chromium Embedded Framework Authors. All rights | # Copyright (c) 2017 The Chromium Embedded Framework Authors. All rights | ||||||
| # reserved. Use of this source code is governed by a BSD-style license that | # reserved. Use of this source code is governed by a BSD-style license that | ||||||
| # can be found in the LICENSE file. | # can be found in the LICENSE file. | ||||||
| # | # | ||||||
| @@ -8,7 +8,7 @@ | |||||||
| # by hand. See the translator.README.txt file in the tools directory for | # by hand. See the translator.README.txt file in the tools directory for | ||||||
| # more information. | # more information. | ||||||
| # | # | ||||||
| # $hash=872dedb7e5a2f36745446c3d0c9ad8bd5850adb7$ | # $hash=20588ad142633d169a929c7631888e287ab66b9a$ | ||||||
| # | # | ||||||
|  |  | ||||||
| { | { | ||||||
| @@ -16,7 +16,6 @@ | |||||||
|     'autogen_cpp_includes': [ |     'autogen_cpp_includes': [ | ||||||
|       'include/cef_accessibility_handler.h', |       'include/cef_accessibility_handler.h', | ||||||
|       'include/cef_app.h', |       'include/cef_app.h', | ||||||
|       'include/cef_audio_handler.h', |  | ||||||
|       'include/cef_auth_callback.h', |       'include/cef_auth_callback.h', | ||||||
|       'include/cef_browser.h', |       'include/cef_browser.h', | ||||||
|       'include/cef_browser_process_handler.h', |       'include/cef_browser_process_handler.h', | ||||||
| @@ -26,7 +25,6 @@ | |||||||
|       'include/cef_context_menu_handler.h', |       'include/cef_context_menu_handler.h', | ||||||
|       'include/cef_cookie.h', |       'include/cef_cookie.h', | ||||||
|       'include/cef_crash_util.h', |       'include/cef_crash_util.h', | ||||||
|       'include/cef_devtools_message_observer.h', |  | ||||||
|       'include/cef_dialog_handler.h', |       'include/cef_dialog_handler.h', | ||||||
|       'include/cef_display_handler.h', |       'include/cef_display_handler.h', | ||||||
|       'include/cef_dom.h', |       'include/cef_dom.h', | ||||||
| @@ -34,20 +32,17 @@ | |||||||
|       'include/cef_download_item.h', |       'include/cef_download_item.h', | ||||||
|       'include/cef_drag_data.h', |       'include/cef_drag_data.h', | ||||||
|       'include/cef_drag_handler.h', |       'include/cef_drag_handler.h', | ||||||
|       'include/cef_extension.h', |  | ||||||
|       'include/cef_extension_handler.h', |  | ||||||
|       'include/cef_file_util.h', |       'include/cef_file_util.h', | ||||||
|       'include/cef_find_handler.h', |       'include/cef_find_handler.h', | ||||||
|       'include/cef_focus_handler.h', |       'include/cef_focus_handler.h', | ||||||
|       'include/cef_frame.h', |       'include/cef_frame.h', | ||||||
|       'include/cef_frame_handler.h', |       'include/cef_geolocation.h', | ||||||
|       'include/cef_i18n_util.h', |       'include/cef_geolocation_handler.h', | ||||||
|       'include/cef_image.h', |       'include/cef_image.h', | ||||||
|       'include/cef_jsdialog_handler.h', |       'include/cef_jsdialog_handler.h', | ||||||
|       'include/cef_keyboard_handler.h', |       'include/cef_keyboard_handler.h', | ||||||
|       'include/cef_life_span_handler.h', |       'include/cef_life_span_handler.h', | ||||||
|       'include/cef_load_handler.h', |       'include/cef_load_handler.h', | ||||||
|       'include/cef_media_router.h', |  | ||||||
|       'include/cef_menu_model.h', |       'include/cef_menu_model.h', | ||||||
|       'include/cef_menu_model_delegate.h', |       'include/cef_menu_model_delegate.h', | ||||||
|       'include/cef_navigation_entry.h', |       'include/cef_navigation_entry.h', | ||||||
| @@ -58,7 +53,6 @@ | |||||||
|       'include/cef_print_settings.h', |       'include/cef_print_settings.h', | ||||||
|       'include/cef_process_message.h', |       'include/cef_process_message.h', | ||||||
|       'include/cef_process_util.h', |       'include/cef_process_util.h', | ||||||
|       'include/cef_registration.h', |  | ||||||
|       'include/cef_render_handler.h', |       'include/cef_render_handler.h', | ||||||
|       'include/cef_render_process_handler.h', |       'include/cef_render_process_handler.h', | ||||||
|       'include/cef_request.h', |       'include/cef_request.h', | ||||||
| @@ -68,11 +62,9 @@ | |||||||
|       'include/cef_resource_bundle.h', |       'include/cef_resource_bundle.h', | ||||||
|       'include/cef_resource_bundle_handler.h', |       'include/cef_resource_bundle_handler.h', | ||||||
|       'include/cef_resource_handler.h', |       'include/cef_resource_handler.h', | ||||||
|       'include/cef_resource_request_handler.h', |  | ||||||
|       'include/cef_response.h', |       'include/cef_response.h', | ||||||
|       'include/cef_response_filter.h', |       'include/cef_response_filter.h', | ||||||
|       'include/cef_scheme.h', |       'include/cef_scheme.h', | ||||||
|       'include/cef_server.h', |  | ||||||
|       'include/cef_ssl_info.h', |       'include/cef_ssl_info.h', | ||||||
|       'include/cef_ssl_status.h', |       'include/cef_ssl_status.h', | ||||||
|       'include/cef_stream.h', |       'include/cef_stream.h', | ||||||
| @@ -101,7 +93,6 @@ | |||||||
|       'include/views/cef_layout.h', |       'include/views/cef_layout.h', | ||||||
|       'include/views/cef_menu_button.h', |       'include/views/cef_menu_button.h', | ||||||
|       'include/views/cef_menu_button_delegate.h', |       'include/views/cef_menu_button_delegate.h', | ||||||
|       'include/views/cef_overlay_controller.h', |  | ||||||
|       'include/views/cef_panel.h', |       'include/views/cef_panel.h', | ||||||
|       'include/views/cef_panel_delegate.h', |       'include/views/cef_panel_delegate.h', | ||||||
|       'include/views/cef_scroll_view.h', |       'include/views/cef_scroll_view.h', | ||||||
| @@ -115,7 +106,6 @@ | |||||||
|     'autogen_capi_includes': [ |     'autogen_capi_includes': [ | ||||||
|       'include/capi/cef_accessibility_handler_capi.h', |       'include/capi/cef_accessibility_handler_capi.h', | ||||||
|       'include/capi/cef_app_capi.h', |       'include/capi/cef_app_capi.h', | ||||||
|       'include/capi/cef_audio_handler_capi.h', |  | ||||||
|       'include/capi/cef_auth_callback_capi.h', |       'include/capi/cef_auth_callback_capi.h', | ||||||
|       'include/capi/cef_browser_capi.h', |       'include/capi/cef_browser_capi.h', | ||||||
|       'include/capi/cef_browser_process_handler_capi.h', |       'include/capi/cef_browser_process_handler_capi.h', | ||||||
| @@ -125,7 +115,6 @@ | |||||||
|       'include/capi/cef_context_menu_handler_capi.h', |       'include/capi/cef_context_menu_handler_capi.h', | ||||||
|       'include/capi/cef_cookie_capi.h', |       'include/capi/cef_cookie_capi.h', | ||||||
|       'include/capi/cef_crash_util_capi.h', |       'include/capi/cef_crash_util_capi.h', | ||||||
|       'include/capi/cef_devtools_message_observer_capi.h', |  | ||||||
|       'include/capi/cef_dialog_handler_capi.h', |       'include/capi/cef_dialog_handler_capi.h', | ||||||
|       'include/capi/cef_display_handler_capi.h', |       'include/capi/cef_display_handler_capi.h', | ||||||
|       'include/capi/cef_dom_capi.h', |       'include/capi/cef_dom_capi.h', | ||||||
| @@ -133,20 +122,17 @@ | |||||||
|       'include/capi/cef_download_item_capi.h', |       'include/capi/cef_download_item_capi.h', | ||||||
|       'include/capi/cef_drag_data_capi.h', |       'include/capi/cef_drag_data_capi.h', | ||||||
|       'include/capi/cef_drag_handler_capi.h', |       'include/capi/cef_drag_handler_capi.h', | ||||||
|       'include/capi/cef_extension_capi.h', |  | ||||||
|       'include/capi/cef_extension_handler_capi.h', |  | ||||||
|       'include/capi/cef_file_util_capi.h', |       'include/capi/cef_file_util_capi.h', | ||||||
|       'include/capi/cef_find_handler_capi.h', |       'include/capi/cef_find_handler_capi.h', | ||||||
|       'include/capi/cef_focus_handler_capi.h', |       'include/capi/cef_focus_handler_capi.h', | ||||||
|       'include/capi/cef_frame_capi.h', |       'include/capi/cef_frame_capi.h', | ||||||
|       'include/capi/cef_frame_handler_capi.h', |       'include/capi/cef_geolocation_capi.h', | ||||||
|       'include/capi/cef_i18n_util_capi.h', |       'include/capi/cef_geolocation_handler_capi.h', | ||||||
|       'include/capi/cef_image_capi.h', |       'include/capi/cef_image_capi.h', | ||||||
|       'include/capi/cef_jsdialog_handler_capi.h', |       'include/capi/cef_jsdialog_handler_capi.h', | ||||||
|       'include/capi/cef_keyboard_handler_capi.h', |       'include/capi/cef_keyboard_handler_capi.h', | ||||||
|       'include/capi/cef_life_span_handler_capi.h', |       'include/capi/cef_life_span_handler_capi.h', | ||||||
|       'include/capi/cef_load_handler_capi.h', |       'include/capi/cef_load_handler_capi.h', | ||||||
|       'include/capi/cef_media_router_capi.h', |  | ||||||
|       'include/capi/cef_menu_model_capi.h', |       'include/capi/cef_menu_model_capi.h', | ||||||
|       'include/capi/cef_menu_model_delegate_capi.h', |       'include/capi/cef_menu_model_delegate_capi.h', | ||||||
|       'include/capi/cef_navigation_entry_capi.h', |       'include/capi/cef_navigation_entry_capi.h', | ||||||
| @@ -157,7 +143,6 @@ | |||||||
|       'include/capi/cef_print_settings_capi.h', |       'include/capi/cef_print_settings_capi.h', | ||||||
|       'include/capi/cef_process_message_capi.h', |       'include/capi/cef_process_message_capi.h', | ||||||
|       'include/capi/cef_process_util_capi.h', |       'include/capi/cef_process_util_capi.h', | ||||||
|       'include/capi/cef_registration_capi.h', |  | ||||||
|       'include/capi/cef_render_handler_capi.h', |       'include/capi/cef_render_handler_capi.h', | ||||||
|       'include/capi/cef_render_process_handler_capi.h', |       'include/capi/cef_render_process_handler_capi.h', | ||||||
|       'include/capi/cef_request_capi.h', |       'include/capi/cef_request_capi.h', | ||||||
| @@ -167,11 +152,9 @@ | |||||||
|       'include/capi/cef_resource_bundle_capi.h', |       'include/capi/cef_resource_bundle_capi.h', | ||||||
|       'include/capi/cef_resource_bundle_handler_capi.h', |       'include/capi/cef_resource_bundle_handler_capi.h', | ||||||
|       'include/capi/cef_resource_handler_capi.h', |       'include/capi/cef_resource_handler_capi.h', | ||||||
|       'include/capi/cef_resource_request_handler_capi.h', |  | ||||||
|       'include/capi/cef_response_capi.h', |       'include/capi/cef_response_capi.h', | ||||||
|       'include/capi/cef_response_filter_capi.h', |       'include/capi/cef_response_filter_capi.h', | ||||||
|       'include/capi/cef_scheme_capi.h', |       'include/capi/cef_scheme_capi.h', | ||||||
|       'include/capi/cef_server_capi.h', |  | ||||||
|       'include/capi/cef_ssl_info_capi.h', |       'include/capi/cef_ssl_info_capi.h', | ||||||
|       'include/capi/cef_ssl_status_capi.h', |       'include/capi/cef_ssl_status_capi.h', | ||||||
|       'include/capi/cef_stream_capi.h', |       'include/capi/cef_stream_capi.h', | ||||||
| @@ -200,7 +183,6 @@ | |||||||
|       'include/capi/views/cef_layout_capi.h', |       'include/capi/views/cef_layout_capi.h', | ||||||
|       'include/capi/views/cef_menu_button_capi.h', |       'include/capi/views/cef_menu_button_capi.h', | ||||||
|       'include/capi/views/cef_menu_button_delegate_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_capi.h', | ||||||
|       'include/capi/views/cef_panel_delegate_capi.h', |       'include/capi/views/cef_panel_delegate_capi.h', | ||||||
|       'include/capi/views/cef_scroll_view_capi.h', |       'include/capi/views/cef_scroll_view_capi.h', | ||||||
| @@ -216,8 +198,6 @@ | |||||||
|       'libcef_dll/ctocpp/accessibility_handler_ctocpp.h', |       'libcef_dll/ctocpp/accessibility_handler_ctocpp.h', | ||||||
|       'libcef_dll/ctocpp/app_ctocpp.cc', |       'libcef_dll/ctocpp/app_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/app_ctocpp.h', |       'libcef_dll/ctocpp/app_ctocpp.h', | ||||||
|       'libcef_dll/ctocpp/audio_handler_ctocpp.cc', |  | ||||||
|       'libcef_dll/ctocpp/audio_handler_ctocpp.h', |  | ||||||
|       'libcef_dll/cpptoc/auth_callback_cpptoc.cc', |       'libcef_dll/cpptoc/auth_callback_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/auth_callback_cpptoc.h', |       'libcef_dll/cpptoc/auth_callback_cpptoc.h', | ||||||
|       'libcef_dll/cpptoc/before_download_callback_cpptoc.cc', |       'libcef_dll/cpptoc/before_download_callback_cpptoc.cc', | ||||||
| @@ -252,8 +232,6 @@ | |||||||
|       'libcef_dll/ctocpp/context_menu_handler_ctocpp.h', |       'libcef_dll/ctocpp/context_menu_handler_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/context_menu_params_cpptoc.cc', |       'libcef_dll/cpptoc/context_menu_params_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/context_menu_params_cpptoc.h', |       'libcef_dll/cpptoc/context_menu_params_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/cookie_access_filter_ctocpp.cc', |  | ||||||
|       'libcef_dll/ctocpp/cookie_access_filter_ctocpp.h', |  | ||||||
|       'libcef_dll/cpptoc/cookie_manager_cpptoc.cc', |       'libcef_dll/cpptoc/cookie_manager_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/cookie_manager_cpptoc.h', |       'libcef_dll/cpptoc/cookie_manager_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/cookie_visitor_ctocpp.cc', |       'libcef_dll/ctocpp/cookie_visitor_ctocpp.cc', | ||||||
| @@ -266,8 +244,6 @@ | |||||||
|       'libcef_dll/ctocpp/domvisitor_ctocpp.h', |       'libcef_dll/ctocpp/domvisitor_ctocpp.h', | ||||||
|       'libcef_dll/ctocpp/delete_cookies_callback_ctocpp.cc', |       'libcef_dll/ctocpp/delete_cookies_callback_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/delete_cookies_callback_ctocpp.h', |       'libcef_dll/ctocpp/delete_cookies_callback_ctocpp.h', | ||||||
|       'libcef_dll/ctocpp/dev_tools_message_observer_ctocpp.cc', |  | ||||||
|       'libcef_dll/ctocpp/dev_tools_message_observer_ctocpp.h', |  | ||||||
|       'libcef_dll/ctocpp/dialog_handler_ctocpp.cc', |       'libcef_dll/ctocpp/dialog_handler_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/dialog_handler_ctocpp.h', |       'libcef_dll/ctocpp/dialog_handler_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/dictionary_value_cpptoc.cc', |       'libcef_dll/cpptoc/dictionary_value_cpptoc.cc', | ||||||
| @@ -290,10 +266,6 @@ | |||||||
|       'libcef_dll/ctocpp/drag_handler_ctocpp.h', |       'libcef_dll/ctocpp/drag_handler_ctocpp.h', | ||||||
|       'libcef_dll/ctocpp/end_tracing_callback_ctocpp.cc', |       'libcef_dll/ctocpp/end_tracing_callback_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/end_tracing_callback_ctocpp.h', |       'libcef_dll/ctocpp/end_tracing_callback_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/extension_cpptoc.cc', |  | ||||||
|       'libcef_dll/cpptoc/extension_cpptoc.h', |  | ||||||
|       'libcef_dll/ctocpp/extension_handler_ctocpp.cc', |  | ||||||
|       'libcef_dll/ctocpp/extension_handler_ctocpp.h', |  | ||||||
|       'libcef_dll/cpptoc/file_dialog_callback_cpptoc.cc', |       'libcef_dll/cpptoc/file_dialog_callback_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/file_dialog_callback_cpptoc.h', |       'libcef_dll/cpptoc/file_dialog_callback_cpptoc.h', | ||||||
|       'libcef_dll/cpptoc/views/fill_layout_cpptoc.cc', |       'libcef_dll/cpptoc/views/fill_layout_cpptoc.cc', | ||||||
| @@ -304,10 +276,12 @@ | |||||||
|       'libcef_dll/ctocpp/focus_handler_ctocpp.h', |       'libcef_dll/ctocpp/focus_handler_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/frame_cpptoc.cc', |       'libcef_dll/cpptoc/frame_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/frame_cpptoc.h', |       'libcef_dll/cpptoc/frame_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/frame_handler_ctocpp.cc', |       'libcef_dll/cpptoc/geolocation_callback_cpptoc.cc', | ||||||
|       'libcef_dll/ctocpp/frame_handler_ctocpp.h', |       'libcef_dll/cpptoc/geolocation_callback_cpptoc.h', | ||||||
|       'libcef_dll/cpptoc/get_extension_resource_callback_cpptoc.cc', |       'libcef_dll/ctocpp/geolocation_handler_ctocpp.cc', | ||||||
|       'libcef_dll/cpptoc/get_extension_resource_callback_cpptoc.h', |       'libcef_dll/ctocpp/geolocation_handler_ctocpp.h', | ||||||
|  |       'libcef_dll/ctocpp/get_geolocation_callback_ctocpp.cc', | ||||||
|  |       'libcef_dll/ctocpp/get_geolocation_callback_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/image_cpptoc.cc', |       'libcef_dll/cpptoc/image_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/image_cpptoc.h', |       'libcef_dll/cpptoc/image_cpptoc.h', | ||||||
|       'libcef_dll/cpptoc/jsdialog_callback_cpptoc.cc', |       'libcef_dll/cpptoc/jsdialog_callback_cpptoc.cc', | ||||||
| @@ -326,26 +300,10 @@ | |||||||
|       'libcef_dll/cpptoc/list_value_cpptoc.h', |       'libcef_dll/cpptoc/list_value_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/load_handler_ctocpp.cc', |       'libcef_dll/ctocpp/load_handler_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/load_handler_ctocpp.h', |       'libcef_dll/ctocpp/load_handler_ctocpp.h', | ||||||
|       'libcef_dll/ctocpp/media_observer_ctocpp.cc', |  | ||||||
|       'libcef_dll/ctocpp/media_observer_ctocpp.h', |  | ||||||
|       'libcef_dll/cpptoc/media_route_cpptoc.cc', |  | ||||||
|       'libcef_dll/cpptoc/media_route_cpptoc.h', |  | ||||||
|       'libcef_dll/ctocpp/media_route_create_callback_ctocpp.cc', |  | ||||||
|       'libcef_dll/ctocpp/media_route_create_callback_ctocpp.h', |  | ||||||
|       'libcef_dll/cpptoc/media_router_cpptoc.cc', |  | ||||||
|       'libcef_dll/cpptoc/media_router_cpptoc.h', |  | ||||||
|       'libcef_dll/cpptoc/media_sink_cpptoc.cc', |  | ||||||
|       'libcef_dll/cpptoc/media_sink_cpptoc.h', |  | ||||||
|       'libcef_dll/ctocpp/media_sink_device_info_callback_ctocpp.cc', |  | ||||||
|       'libcef_dll/ctocpp/media_sink_device_info_callback_ctocpp.h', |  | ||||||
|       'libcef_dll/cpptoc/media_source_cpptoc.cc', |  | ||||||
|       'libcef_dll/cpptoc/media_source_cpptoc.h', |  | ||||||
|       'libcef_dll/cpptoc/views/menu_button_cpptoc.cc', |       'libcef_dll/cpptoc/views/menu_button_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/views/menu_button_cpptoc.h', |       'libcef_dll/cpptoc/views/menu_button_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/views/menu_button_delegate_ctocpp.cc', |       'libcef_dll/ctocpp/views/menu_button_delegate_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/views/menu_button_delegate_ctocpp.h', |       'libcef_dll/ctocpp/views/menu_button_delegate_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/views/menu_button_pressed_lock_cpptoc.cc', |  | ||||||
|       'libcef_dll/cpptoc/views/menu_button_pressed_lock_cpptoc.h', |  | ||||||
|       'libcef_dll/cpptoc/menu_model_cpptoc.cc', |       'libcef_dll/cpptoc/menu_model_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/menu_model_cpptoc.h', |       'libcef_dll/cpptoc/menu_model_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/menu_model_delegate_ctocpp.cc', |       'libcef_dll/ctocpp/menu_model_delegate_ctocpp.cc', | ||||||
| @@ -354,8 +312,6 @@ | |||||||
|       'libcef_dll/cpptoc/navigation_entry_cpptoc.h', |       'libcef_dll/cpptoc/navigation_entry_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/navigation_entry_visitor_ctocpp.cc', |       'libcef_dll/ctocpp/navigation_entry_visitor_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/navigation_entry_visitor_ctocpp.h', |       '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.cc', | ||||||
|       'libcef_dll/cpptoc/views/panel_cpptoc.h', |       'libcef_dll/cpptoc/views/panel_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/views/panel_delegate_ctocpp.cc', |       'libcef_dll/ctocpp/views/panel_delegate_ctocpp.cc', | ||||||
| @@ -378,14 +334,16 @@ | |||||||
|       'libcef_dll/cpptoc/process_message_cpptoc.h', |       'libcef_dll/cpptoc/process_message_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/read_handler_ctocpp.cc', |       'libcef_dll/ctocpp/read_handler_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/read_handler_ctocpp.h', |       'libcef_dll/ctocpp/read_handler_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/registration_cpptoc.cc', |       'libcef_dll/ctocpp/register_cdm_callback_ctocpp.cc', | ||||||
|       'libcef_dll/cpptoc/registration_cpptoc.h', |       'libcef_dll/ctocpp/register_cdm_callback_ctocpp.h', | ||||||
|       'libcef_dll/ctocpp/render_handler_ctocpp.cc', |       'libcef_dll/ctocpp/render_handler_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/render_handler_ctocpp.h', |       'libcef_dll/ctocpp/render_handler_ctocpp.h', | ||||||
|       'libcef_dll/ctocpp/render_process_handler_ctocpp.cc', |       'libcef_dll/ctocpp/render_process_handler_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/render_process_handler_ctocpp.h', |       'libcef_dll/ctocpp/render_process_handler_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/request_cpptoc.cc', |       'libcef_dll/cpptoc/request_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/request_cpptoc.h', |       '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.cc', | ||||||
|       'libcef_dll/cpptoc/request_context_cpptoc.h', |       'libcef_dll/cpptoc/request_context_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/request_context_handler_ctocpp.cc', |       'libcef_dll/ctocpp/request_context_handler_ctocpp.cc', | ||||||
| @@ -400,12 +358,6 @@ | |||||||
|       'libcef_dll/ctocpp/resource_bundle_handler_ctocpp.h', |       'libcef_dll/ctocpp/resource_bundle_handler_ctocpp.h', | ||||||
|       'libcef_dll/ctocpp/resource_handler_ctocpp.cc', |       'libcef_dll/ctocpp/resource_handler_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/resource_handler_ctocpp.h', |       'libcef_dll/ctocpp/resource_handler_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/resource_read_callback_cpptoc.cc', |  | ||||||
|       'libcef_dll/cpptoc/resource_read_callback_cpptoc.h', |  | ||||||
|       'libcef_dll/ctocpp/resource_request_handler_ctocpp.cc', |  | ||||||
|       'libcef_dll/ctocpp/resource_request_handler_ctocpp.h', |  | ||||||
|       'libcef_dll/cpptoc/resource_skip_callback_cpptoc.cc', |  | ||||||
|       'libcef_dll/cpptoc/resource_skip_callback_cpptoc.h', |  | ||||||
|       'libcef_dll/cpptoc/response_cpptoc.cc', |       'libcef_dll/cpptoc/response_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/response_cpptoc.h', |       'libcef_dll/cpptoc/response_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/response_filter_ctocpp.cc', |       'libcef_dll/ctocpp/response_filter_ctocpp.cc', | ||||||
| @@ -426,10 +378,6 @@ | |||||||
|       'libcef_dll/cpptoc/views/scroll_view_cpptoc.h', |       'libcef_dll/cpptoc/views/scroll_view_cpptoc.h', | ||||||
|       'libcef_dll/cpptoc/select_client_certificate_callback_cpptoc.cc', |       'libcef_dll/cpptoc/select_client_certificate_callback_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/select_client_certificate_callback_cpptoc.h', |       'libcef_dll/cpptoc/select_client_certificate_callback_cpptoc.h', | ||||||
|       'libcef_dll/cpptoc/server_cpptoc.cc', |  | ||||||
|       'libcef_dll/cpptoc/server_cpptoc.h', |  | ||||||
|       'libcef_dll/ctocpp/server_handler_ctocpp.cc', |  | ||||||
|       'libcef_dll/ctocpp/server_handler_ctocpp.h', |  | ||||||
|       'libcef_dll/ctocpp/set_cookie_callback_ctocpp.cc', |       'libcef_dll/ctocpp/set_cookie_callback_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/set_cookie_callback_ctocpp.h', |       'libcef_dll/ctocpp/set_cookie_callback_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/stream_reader_cpptoc.cc', |       'libcef_dll/cpptoc/stream_reader_cpptoc.cc', | ||||||
| @@ -476,8 +424,6 @@ | |||||||
|       'libcef_dll/ctocpp/urlrequest_client_ctocpp.h', |       'libcef_dll/ctocpp/urlrequest_client_ctocpp.h', | ||||||
|       'libcef_dll/ctocpp/v8accessor_ctocpp.cc', |       'libcef_dll/ctocpp/v8accessor_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/v8accessor_ctocpp.h', |       'libcef_dll/ctocpp/v8accessor_ctocpp.h', | ||||||
|       'libcef_dll/ctocpp/v8array_buffer_release_callback_ctocpp.cc', |  | ||||||
|       'libcef_dll/ctocpp/v8array_buffer_release_callback_ctocpp.h', |  | ||||||
|       'libcef_dll/cpptoc/v8context_cpptoc.cc', |       'libcef_dll/cpptoc/v8context_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/v8context_cpptoc.h', |       'libcef_dll/cpptoc/v8context_cpptoc.h', | ||||||
|       'libcef_dll/cpptoc/v8exception_cpptoc.cc', |       'libcef_dll/cpptoc/v8exception_cpptoc.cc', | ||||||
| @@ -526,8 +472,6 @@ | |||||||
|       'libcef_dll/cpptoc/accessibility_handler_cpptoc.h', |       'libcef_dll/cpptoc/accessibility_handler_cpptoc.h', | ||||||
|       'libcef_dll/cpptoc/app_cpptoc.cc', |       'libcef_dll/cpptoc/app_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/app_cpptoc.h', |       'libcef_dll/cpptoc/app_cpptoc.h', | ||||||
|       'libcef_dll/cpptoc/audio_handler_cpptoc.cc', |  | ||||||
|       'libcef_dll/cpptoc/audio_handler_cpptoc.h', |  | ||||||
|       'libcef_dll/ctocpp/auth_callback_ctocpp.cc', |       'libcef_dll/ctocpp/auth_callback_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/auth_callback_ctocpp.h', |       'libcef_dll/ctocpp/auth_callback_ctocpp.h', | ||||||
|       'libcef_dll/ctocpp/before_download_callback_ctocpp.cc', |       'libcef_dll/ctocpp/before_download_callback_ctocpp.cc', | ||||||
| @@ -562,8 +506,6 @@ | |||||||
|       'libcef_dll/cpptoc/context_menu_handler_cpptoc.h', |       'libcef_dll/cpptoc/context_menu_handler_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/context_menu_params_ctocpp.cc', |       'libcef_dll/ctocpp/context_menu_params_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/context_menu_params_ctocpp.h', |       'libcef_dll/ctocpp/context_menu_params_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/cookie_access_filter_cpptoc.cc', |  | ||||||
|       'libcef_dll/cpptoc/cookie_access_filter_cpptoc.h', |  | ||||||
|       'libcef_dll/ctocpp/cookie_manager_ctocpp.cc', |       'libcef_dll/ctocpp/cookie_manager_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/cookie_manager_ctocpp.h', |       'libcef_dll/ctocpp/cookie_manager_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/cookie_visitor_cpptoc.cc', |       'libcef_dll/cpptoc/cookie_visitor_cpptoc.cc', | ||||||
| @@ -576,8 +518,6 @@ | |||||||
|       'libcef_dll/cpptoc/domvisitor_cpptoc.h', |       'libcef_dll/cpptoc/domvisitor_cpptoc.h', | ||||||
|       'libcef_dll/cpptoc/delete_cookies_callback_cpptoc.cc', |       'libcef_dll/cpptoc/delete_cookies_callback_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/delete_cookies_callback_cpptoc.h', |       'libcef_dll/cpptoc/delete_cookies_callback_cpptoc.h', | ||||||
|       'libcef_dll/cpptoc/dev_tools_message_observer_cpptoc.cc', |  | ||||||
|       'libcef_dll/cpptoc/dev_tools_message_observer_cpptoc.h', |  | ||||||
|       'libcef_dll/cpptoc/dialog_handler_cpptoc.cc', |       'libcef_dll/cpptoc/dialog_handler_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/dialog_handler_cpptoc.h', |       'libcef_dll/cpptoc/dialog_handler_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/dictionary_value_ctocpp.cc', |       'libcef_dll/ctocpp/dictionary_value_ctocpp.cc', | ||||||
| @@ -600,10 +540,6 @@ | |||||||
|       'libcef_dll/cpptoc/drag_handler_cpptoc.h', |       'libcef_dll/cpptoc/drag_handler_cpptoc.h', | ||||||
|       'libcef_dll/cpptoc/end_tracing_callback_cpptoc.cc', |       'libcef_dll/cpptoc/end_tracing_callback_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/end_tracing_callback_cpptoc.h', |       'libcef_dll/cpptoc/end_tracing_callback_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/extension_ctocpp.cc', |  | ||||||
|       'libcef_dll/ctocpp/extension_ctocpp.h', |  | ||||||
|       'libcef_dll/cpptoc/extension_handler_cpptoc.cc', |  | ||||||
|       'libcef_dll/cpptoc/extension_handler_cpptoc.h', |  | ||||||
|       'libcef_dll/ctocpp/file_dialog_callback_ctocpp.cc', |       'libcef_dll/ctocpp/file_dialog_callback_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/file_dialog_callback_ctocpp.h', |       'libcef_dll/ctocpp/file_dialog_callback_ctocpp.h', | ||||||
|       'libcef_dll/ctocpp/views/fill_layout_ctocpp.cc', |       'libcef_dll/ctocpp/views/fill_layout_ctocpp.cc', | ||||||
| @@ -614,10 +550,12 @@ | |||||||
|       'libcef_dll/cpptoc/focus_handler_cpptoc.h', |       'libcef_dll/cpptoc/focus_handler_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/frame_ctocpp.cc', |       'libcef_dll/ctocpp/frame_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/frame_ctocpp.h', |       'libcef_dll/ctocpp/frame_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/frame_handler_cpptoc.cc', |       'libcef_dll/ctocpp/geolocation_callback_ctocpp.cc', | ||||||
|       'libcef_dll/cpptoc/frame_handler_cpptoc.h', |       'libcef_dll/ctocpp/geolocation_callback_ctocpp.h', | ||||||
|       'libcef_dll/ctocpp/get_extension_resource_callback_ctocpp.cc', |       'libcef_dll/cpptoc/geolocation_handler_cpptoc.cc', | ||||||
|       'libcef_dll/ctocpp/get_extension_resource_callback_ctocpp.h', |       'libcef_dll/cpptoc/geolocation_handler_cpptoc.h', | ||||||
|  |       'libcef_dll/cpptoc/get_geolocation_callback_cpptoc.cc', | ||||||
|  |       'libcef_dll/cpptoc/get_geolocation_callback_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/image_ctocpp.cc', |       'libcef_dll/ctocpp/image_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/image_ctocpp.h', |       'libcef_dll/ctocpp/image_ctocpp.h', | ||||||
|       'libcef_dll/ctocpp/jsdialog_callback_ctocpp.cc', |       'libcef_dll/ctocpp/jsdialog_callback_ctocpp.cc', | ||||||
| @@ -636,26 +574,10 @@ | |||||||
|       'libcef_dll/ctocpp/list_value_ctocpp.h', |       'libcef_dll/ctocpp/list_value_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/load_handler_cpptoc.cc', |       'libcef_dll/cpptoc/load_handler_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/load_handler_cpptoc.h', |       'libcef_dll/cpptoc/load_handler_cpptoc.h', | ||||||
|       'libcef_dll/cpptoc/media_observer_cpptoc.cc', |  | ||||||
|       'libcef_dll/cpptoc/media_observer_cpptoc.h', |  | ||||||
|       'libcef_dll/ctocpp/media_route_ctocpp.cc', |  | ||||||
|       'libcef_dll/ctocpp/media_route_ctocpp.h', |  | ||||||
|       'libcef_dll/cpptoc/media_route_create_callback_cpptoc.cc', |  | ||||||
|       'libcef_dll/cpptoc/media_route_create_callback_cpptoc.h', |  | ||||||
|       'libcef_dll/ctocpp/media_router_ctocpp.cc', |  | ||||||
|       'libcef_dll/ctocpp/media_router_ctocpp.h', |  | ||||||
|       'libcef_dll/ctocpp/media_sink_ctocpp.cc', |  | ||||||
|       'libcef_dll/ctocpp/media_sink_ctocpp.h', |  | ||||||
|       'libcef_dll/cpptoc/media_sink_device_info_callback_cpptoc.cc', |  | ||||||
|       'libcef_dll/cpptoc/media_sink_device_info_callback_cpptoc.h', |  | ||||||
|       'libcef_dll/ctocpp/media_source_ctocpp.cc', |  | ||||||
|       'libcef_dll/ctocpp/media_source_ctocpp.h', |  | ||||||
|       'libcef_dll/ctocpp/views/menu_button_ctocpp.cc', |       'libcef_dll/ctocpp/views/menu_button_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/views/menu_button_ctocpp.h', |       'libcef_dll/ctocpp/views/menu_button_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/views/menu_button_delegate_cpptoc.cc', |       'libcef_dll/cpptoc/views/menu_button_delegate_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/views/menu_button_delegate_cpptoc.h', |       'libcef_dll/cpptoc/views/menu_button_delegate_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/views/menu_button_pressed_lock_ctocpp.cc', |  | ||||||
|       'libcef_dll/ctocpp/views/menu_button_pressed_lock_ctocpp.h', |  | ||||||
|       'libcef_dll/ctocpp/menu_model_ctocpp.cc', |       'libcef_dll/ctocpp/menu_model_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/menu_model_ctocpp.h', |       'libcef_dll/ctocpp/menu_model_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/menu_model_delegate_cpptoc.cc', |       'libcef_dll/cpptoc/menu_model_delegate_cpptoc.cc', | ||||||
| @@ -664,8 +586,6 @@ | |||||||
|       'libcef_dll/ctocpp/navigation_entry_ctocpp.h', |       'libcef_dll/ctocpp/navigation_entry_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/navigation_entry_visitor_cpptoc.cc', |       'libcef_dll/cpptoc/navigation_entry_visitor_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/navigation_entry_visitor_cpptoc.h', |       '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.cc', | ||||||
|       'libcef_dll/ctocpp/views/panel_ctocpp.h', |       'libcef_dll/ctocpp/views/panel_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/views/panel_delegate_cpptoc.cc', |       'libcef_dll/cpptoc/views/panel_delegate_cpptoc.cc', | ||||||
| @@ -688,14 +608,16 @@ | |||||||
|       'libcef_dll/ctocpp/process_message_ctocpp.h', |       'libcef_dll/ctocpp/process_message_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/read_handler_cpptoc.cc', |       'libcef_dll/cpptoc/read_handler_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/read_handler_cpptoc.h', |       'libcef_dll/cpptoc/read_handler_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/registration_ctocpp.cc', |       'libcef_dll/cpptoc/register_cdm_callback_cpptoc.cc', | ||||||
|       'libcef_dll/ctocpp/registration_ctocpp.h', |       'libcef_dll/cpptoc/register_cdm_callback_cpptoc.h', | ||||||
|       'libcef_dll/cpptoc/render_handler_cpptoc.cc', |       'libcef_dll/cpptoc/render_handler_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/render_handler_cpptoc.h', |       'libcef_dll/cpptoc/render_handler_cpptoc.h', | ||||||
|       'libcef_dll/cpptoc/render_process_handler_cpptoc.cc', |       'libcef_dll/cpptoc/render_process_handler_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/render_process_handler_cpptoc.h', |       'libcef_dll/cpptoc/render_process_handler_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/request_ctocpp.cc', |       'libcef_dll/ctocpp/request_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/request_ctocpp.h', |       '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.cc', | ||||||
|       'libcef_dll/ctocpp/request_context_ctocpp.h', |       'libcef_dll/ctocpp/request_context_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/request_context_handler_cpptoc.cc', |       'libcef_dll/cpptoc/request_context_handler_cpptoc.cc', | ||||||
| @@ -710,12 +632,6 @@ | |||||||
|       'libcef_dll/cpptoc/resource_bundle_handler_cpptoc.h', |       'libcef_dll/cpptoc/resource_bundle_handler_cpptoc.h', | ||||||
|       'libcef_dll/cpptoc/resource_handler_cpptoc.cc', |       'libcef_dll/cpptoc/resource_handler_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/resource_handler_cpptoc.h', |       'libcef_dll/cpptoc/resource_handler_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/resource_read_callback_ctocpp.cc', |  | ||||||
|       'libcef_dll/ctocpp/resource_read_callback_ctocpp.h', |  | ||||||
|       'libcef_dll/cpptoc/resource_request_handler_cpptoc.cc', |  | ||||||
|       'libcef_dll/cpptoc/resource_request_handler_cpptoc.h', |  | ||||||
|       'libcef_dll/ctocpp/resource_skip_callback_ctocpp.cc', |  | ||||||
|       'libcef_dll/ctocpp/resource_skip_callback_ctocpp.h', |  | ||||||
|       'libcef_dll/ctocpp/response_ctocpp.cc', |       'libcef_dll/ctocpp/response_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/response_ctocpp.h', |       'libcef_dll/ctocpp/response_ctocpp.h', | ||||||
|       'libcef_dll/cpptoc/response_filter_cpptoc.cc', |       'libcef_dll/cpptoc/response_filter_cpptoc.cc', | ||||||
| @@ -736,10 +652,6 @@ | |||||||
|       'libcef_dll/ctocpp/views/scroll_view_ctocpp.h', |       'libcef_dll/ctocpp/views/scroll_view_ctocpp.h', | ||||||
|       'libcef_dll/ctocpp/select_client_certificate_callback_ctocpp.cc', |       'libcef_dll/ctocpp/select_client_certificate_callback_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/select_client_certificate_callback_ctocpp.h', |       'libcef_dll/ctocpp/select_client_certificate_callback_ctocpp.h', | ||||||
|       'libcef_dll/ctocpp/server_ctocpp.cc', |  | ||||||
|       'libcef_dll/ctocpp/server_ctocpp.h', |  | ||||||
|       'libcef_dll/cpptoc/server_handler_cpptoc.cc', |  | ||||||
|       'libcef_dll/cpptoc/server_handler_cpptoc.h', |  | ||||||
|       'libcef_dll/cpptoc/set_cookie_callback_cpptoc.cc', |       'libcef_dll/cpptoc/set_cookie_callback_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/set_cookie_callback_cpptoc.h', |       'libcef_dll/cpptoc/set_cookie_callback_cpptoc.h', | ||||||
|       'libcef_dll/ctocpp/stream_reader_ctocpp.cc', |       'libcef_dll/ctocpp/stream_reader_ctocpp.cc', | ||||||
| @@ -786,8 +698,6 @@ | |||||||
|       'libcef_dll/cpptoc/urlrequest_client_cpptoc.h', |       'libcef_dll/cpptoc/urlrequest_client_cpptoc.h', | ||||||
|       'libcef_dll/cpptoc/v8accessor_cpptoc.cc', |       'libcef_dll/cpptoc/v8accessor_cpptoc.cc', | ||||||
|       'libcef_dll/cpptoc/v8accessor_cpptoc.h', |       'libcef_dll/cpptoc/v8accessor_cpptoc.h', | ||||||
|       'libcef_dll/cpptoc/v8array_buffer_release_callback_cpptoc.cc', |  | ||||||
|       'libcef_dll/cpptoc/v8array_buffer_release_callback_cpptoc.h', |  | ||||||
|       'libcef_dll/ctocpp/v8context_ctocpp.cc', |       'libcef_dll/ctocpp/v8context_ctocpp.cc', | ||||||
|       'libcef_dll/ctocpp/v8context_ctocpp.h', |       'libcef_dll/ctocpp/v8context_ctocpp.h', | ||||||
|       'libcef_dll/ctocpp/v8exception_ctocpp.cc', |       'libcef_dll/ctocpp/v8exception_ctocpp.cc', | ||||||
|   | |||||||
							
								
								
									
										192
									
								
								cef_paths2.gypi
									
									
									
									
									
								
							
							
						
						
									
										192
									
								
								cef_paths2.gypi
									
									
									
									
									
								
							| @@ -5,28 +5,28 @@ | |||||||
| { | { | ||||||
|   'variables': { |   'variables': { | ||||||
|     'includes_common': [ |     'includes_common': [ | ||||||
|       'include/base/cef_atomic_flag.h', |  | ||||||
|       'include/base/cef_atomic_ref_count.h', |       'include/base/cef_atomic_ref_count.h', | ||||||
|       'include/base/cef_auto_reset.h', |       'include/base/cef_atomicops.h', | ||||||
|       'include/base/cef_basictypes.h', |       'include/base/cef_basictypes.h', | ||||||
|       'include/base/cef_bind.h', |       'include/base/cef_bind.h', | ||||||
|  |       'include/base/cef_bind_helpers.h', | ||||||
|       'include/base/cef_build.h', |       'include/base/cef_build.h', | ||||||
|       'include/base/cef_callback.h', |       'include/base/cef_callback.h', | ||||||
|       'include/base/cef_callback_forward.h', |       'include/base/cef_callback_forward.h', | ||||||
|       'include/base/cef_callback_helpers.h', |       'include/base/cef_callback_helpers.h', | ||||||
|       'include/base/cef_callback_list.h', |       'include/base/cef_callback_list.h', | ||||||
|       'include/base/cef_cancelable_callback.h', |       'include/base/cef_cancelable_callback.h', | ||||||
|       'include/base/cef_compiler_specific.h', |  | ||||||
|       'include/base/cef_cxx17_backports.h', |  | ||||||
|       'include/base/cef_lock.h', |       'include/base/cef_lock.h', | ||||||
|       'include/base/cef_logging.h', |       'include/base/cef_logging.h', | ||||||
|       'include/base/cef_macros.h', |       'include/base/cef_macros.h', | ||||||
|  |       'include/base/cef_move.h', | ||||||
|       'include/base/cef_platform_thread.h', |       'include/base/cef_platform_thread.h', | ||||||
|       'include/base/cef_ptr_util.h', |  | ||||||
|       'include/base/cef_ref_counted.h', |       'include/base/cef_ref_counted.h', | ||||||
|       'include/base/cef_scoped_refptr.h', |       'include/base/cef_scoped_ptr.h', | ||||||
|  |       'include/base/cef_string16.h', | ||||||
|       'include/base/cef_template_util.h', |       'include/base/cef_template_util.h', | ||||||
|       'include/base/cef_thread_checker.h', |       'include/base/cef_thread_checker.h', | ||||||
|  |       'include/base/cef_thread_collision_warner.h', | ||||||
|       'include/base/cef_trace_event.h', |       'include/base/cef_trace_event.h', | ||||||
|       'include/base/cef_tuple.h', |       'include/base/cef_tuple.h', | ||||||
|       'include/base/cef_weak_ptr.h', |       'include/base/cef_weak_ptr.h', | ||||||
| @@ -34,29 +34,23 @@ | |||||||
|       'include/base/internal/cef_callback_internal.h', |       'include/base/internal/cef_callback_internal.h', | ||||||
|       'include/base/internal/cef_lock_impl.h', |       'include/base/internal/cef_lock_impl.h', | ||||||
|       'include/base/internal/cef_raw_scoped_refptr_mismatch_checker.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/base/internal/cef_thread_checker_impl.h', | ||||||
|       'include/cef_api_hash.h', |  | ||||||
|       'include/cef_base.h', |       'include/cef_base.h', | ||||||
|       'include/cef_config.h', |  | ||||||
|       'include/cef_version.h', |       'include/cef_version.h', | ||||||
|       'include/internal/cef_export.h', |       'include/internal/cef_export.h', | ||||||
|       'include/internal/cef_ptr.h', |  | ||||||
|       'include/internal/cef_string_wrappers.h', |  | ||||||
|       'include/internal/cef_types_wrappers.h', |  | ||||||
|     ], |  | ||||||
|     'includes_common_capi': [ |  | ||||||
|       'include/internal/cef_logging_internal.h', |       'include/internal/cef_logging_internal.h', | ||||||
|  |       'include/internal/cef_ptr.h', | ||||||
|       'include/internal/cef_string.h', |       'include/internal/cef_string.h', | ||||||
|       'include/internal/cef_string_list.h', |       'include/internal/cef_string_list.h', | ||||||
|       'include/internal/cef_string_map.h', |       'include/internal/cef_string_map.h', | ||||||
|       'include/internal/cef_string_multimap.h', |       'include/internal/cef_string_multimap.h', | ||||||
|       'include/internal/cef_string_types.h', |       'include/internal/cef_string_types.h', | ||||||
|  |       'include/internal/cef_string_wrappers.h', | ||||||
|       'include/internal/cef_thread_internal.h', |       'include/internal/cef_thread_internal.h', | ||||||
|       'include/internal/cef_time.h', |       'include/internal/cef_time.h', | ||||||
|       'include/internal/cef_trace_event_internal.h', |       'include/internal/cef_trace_event_internal.h', | ||||||
|       'include/internal/cef_types.h', |       'include/internal/cef_types.h', | ||||||
|       'include/internal/cef_types_geometry.h', |       'include/internal/cef_types_wrappers.h', | ||||||
|     ], |     ], | ||||||
|     'includes_capi': [ |     'includes_capi': [ | ||||||
|       'include/capi/cef_base_capi.h', |       'include/capi/cef_base_capi.h', | ||||||
| @@ -72,30 +66,25 @@ | |||||||
|       'include/wrapper/cef_xml_object.h', |       'include/wrapper/cef_xml_object.h', | ||||||
|       'include/wrapper/cef_zip_archive.h', |       'include/wrapper/cef_zip_archive.h', | ||||||
|     ], |     ], | ||||||
|     'includes_wrapper_mac': [ |  | ||||||
|       'include/wrapper/cef_library_loader.h', |  | ||||||
|     ], |  | ||||||
|     'includes_win': [ |     'includes_win': [ | ||||||
|  |       'include/base/internal/cef_atomicops_x86_msvc.h', | ||||||
|  |       'include/base/internal/cef_bind_internal_win.h', | ||||||
|       'include/cef_sandbox_win.h', |       'include/cef_sandbox_win.h', | ||||||
|  |       'include/internal/cef_types_win.h', | ||||||
|       'include/internal/cef_win.h', |       'include/internal/cef_win.h', | ||||||
|     ], |     ], | ||||||
|     'includes_win_capi': [ |  | ||||||
|       'include/internal/cef_types_win.h', |  | ||||||
|     ], |  | ||||||
|     'includes_mac': [ |     'includes_mac': [ | ||||||
|       'include/base/cef_scoped_typeref_mac.h', |       'include/base/internal/cef_atomicops_atomicword_compat.h', | ||||||
|       'include/base/internal/cef_scoped_block_mac.h', |       'include/base/internal/cef_atomicops_mac.h', | ||||||
|       'include/cef_application_mac.h', |       'include/cef_application_mac.h', | ||||||
|       'include/cef_sandbox_mac.h', |  | ||||||
|       'include/internal/cef_mac.h', |       'include/internal/cef_mac.h', | ||||||
|     ], |  | ||||||
|     'includes_mac_capi': [ |  | ||||||
|       'include/internal/cef_types_mac.h', |       'include/internal/cef_types_mac.h', | ||||||
|     ], |     ], | ||||||
|     'includes_linux': [ |     'includes_linux': [ | ||||||
|  |       'include/base/internal/cef_atomicops_atomicword_compat.h', | ||||||
|  |       'include/base/internal/cef_atomicops_arm_gcc.h', | ||||||
|  |       'include/base/internal/cef_atomicops_x86_gcc.h', | ||||||
|       'include/internal/cef_linux.h', |       'include/internal/cef_linux.h', | ||||||
|     ], |  | ||||||
|     'includes_linux_capi': [ |  | ||||||
|       'include/internal/cef_types_linux.h', |       'include/internal/cef_types_linux.h', | ||||||
|     ], |     ], | ||||||
|     'libcef_sources_common': [ |     'libcef_sources_common': [ | ||||||
| @@ -111,21 +100,22 @@ | |||||||
|       'libcef_dll/libcef_dll2.cc', |       'libcef_dll/libcef_dll2.cc', | ||||||
|       'libcef_dll/ptr_util.h', |       'libcef_dll/ptr_util.h', | ||||||
|       'libcef_dll/resource.h', |       'libcef_dll/resource.h', | ||||||
|       'libcef_dll/shutdown_checker.cc', |  | ||||||
|       'libcef_dll/shutdown_checker.h', |  | ||||||
|       'libcef_dll/transfer_util.cc', |       'libcef_dll/transfer_util.cc', | ||||||
|       'libcef_dll/transfer_util.h', |       'libcef_dll/transfer_util.h', | ||||||
|       'libcef_dll/wrapper_types.h', |       'libcef_dll/wrapper_types.h', | ||||||
|     ], |     ], | ||||||
|     'libcef_dll_wrapper_sources_base': [ |     'libcef_dll_wrapper_sources_base': [ | ||||||
|       'libcef_dll/base/cef_atomic_flag.cc', |       'libcef_dll/base/cef_atomicops_x86_gcc.cc', | ||||||
|  |       'libcef_dll/base/cef_bind_helpers.cc', | ||||||
|       'libcef_dll/base/cef_callback_helpers.cc', |       'libcef_dll/base/cef_callback_helpers.cc', | ||||||
|       'libcef_dll/base/cef_callback_internal.cc', |       'libcef_dll/base/cef_callback_internal.cc', | ||||||
|       'libcef_dll/base/cef_lock.cc', |       'libcef_dll/base/cef_lock.cc', | ||||||
|       'libcef_dll/base/cef_lock_impl.cc', |       'libcef_dll/base/cef_lock_impl.cc', | ||||||
|       'libcef_dll/base/cef_logging.cc', |       'libcef_dll/base/cef_logging.cc', | ||||||
|       'libcef_dll/base/cef_ref_counted.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_thread_checker_impl.cc', | ||||||
|  |       'libcef_dll/base/cef_thread_collision_warner.cc', | ||||||
|       'libcef_dll/base/cef_weak_ptr.cc', |       'libcef_dll/base/cef_weak_ptr.cc', | ||||||
|     ], |     ], | ||||||
|     'libcef_dll_wrapper_sources_common': [ |     'libcef_dll_wrapper_sources_common': [ | ||||||
| @@ -137,8 +127,7 @@ | |||||||
|       'libcef_dll/cpptoc/cpptoc_scoped.h', |       'libcef_dll/cpptoc/cpptoc_scoped.h', | ||||||
|       'libcef_dll/ctocpp/ctocpp_ref_counted.h', |       'libcef_dll/ctocpp/ctocpp_ref_counted.h', | ||||||
|       'libcef_dll/ctocpp/ctocpp_scoped.h', |       'libcef_dll/ctocpp/ctocpp_scoped.h', | ||||||
|       'libcef_dll/shutdown_checker.cc', |       'libcef_dll/ptr_util.h', | ||||||
|       'libcef_dll/shutdown_checker.h', |  | ||||||
|       'libcef_dll/transfer_util.cc', |       'libcef_dll/transfer_util.cc', | ||||||
|       'libcef_dll/transfer_util.h', |       'libcef_dll/transfer_util.h', | ||||||
|       'libcef_dll/wrapper_types.h', |       'libcef_dll/wrapper_types.h', | ||||||
| @@ -154,17 +143,9 @@ | |||||||
|       'libcef_dll/wrapper/libcef_dll_wrapper.cc', |       'libcef_dll/wrapper/libcef_dll_wrapper.cc', | ||||||
|       'libcef_dll/wrapper/libcef_dll_wrapper2.cc', |       'libcef_dll/wrapper/libcef_dll_wrapper2.cc', | ||||||
|     ], |     ], | ||||||
|     'libcef_dll_wrapper_sources_mac': [ |  | ||||||
|       'libcef_dll/wrapper/cef_library_loader_mac.mm', |  | ||||||
|       'libcef_dll/wrapper/libcef_dll_dylib.cc', |  | ||||||
|     ], |  | ||||||
|     'shared_sources_browser': [ |     'shared_sources_browser': [ | ||||||
|       'tests/shared/browser/client_app_browser.cc', |       'tests/shared/browser/client_app_browser.cc', | ||||||
|       'tests/shared/browser/client_app_browser.h', |       'tests/shared/browser/client_app_browser.h', | ||||||
|       'tests/shared/browser/extension_util.cc', |  | ||||||
|       'tests/shared/browser/extension_util.h', |  | ||||||
|       'tests/shared/browser/file_util.cc', |  | ||||||
|       'tests/shared/browser/file_util.h', |  | ||||||
|       'tests/shared/browser/geometry_util.cc', |       'tests/shared/browser/geometry_util.cc', | ||||||
|       'tests/shared/browser/geometry_util.h', |       'tests/shared/browser/geometry_util.h', | ||||||
|       'tests/shared/browser/main_message_loop.cc', |       'tests/shared/browser/main_message_loop.cc', | ||||||
| @@ -174,6 +155,8 @@ | |||||||
|       'tests/shared/browser/main_message_loop_std.cc', |       'tests/shared/browser/main_message_loop_std.cc', | ||||||
|       'tests/shared/browser/main_message_loop_std.h', |       'tests/shared/browser/main_message_loop_std.h', | ||||||
|       'tests/shared/browser/resource_util.h', |       'tests/shared/browser/resource_util.h', | ||||||
|  |       'tests/shared/browser/resource_util.cc', | ||||||
|  |       'tests/shared/browser/resource_util.h', | ||||||
|     ], |     ], | ||||||
|     'shared_sources_common': [ |     'shared_sources_common': [ | ||||||
|       'tests/shared/common/client_app.cc', |       'tests/shared/common/client_app.cc', | ||||||
| @@ -231,18 +214,15 @@ | |||||||
|       'tests/cefclient/browser/client_types.h', |       'tests/cefclient/browser/client_types.h', | ||||||
|       'tests/cefclient/browser/dialog_test.cc', |       'tests/cefclient/browser/dialog_test.cc', | ||||||
|       'tests/cefclient/browser/dialog_test.h', |       'tests/cefclient/browser/dialog_test.h', | ||||||
|       'tests/cefclient/browser/image_cache.cc', |       'tests/cefclient/browser/drm_test.cc', | ||||||
|       'tests/cefclient/browser/image_cache.h', |       'tests/cefclient/browser/drm_test.h', | ||||||
|       'tests/cefclient/browser/main_context.cc', |       'tests/cefclient/browser/main_context.cc', | ||||||
|       'tests/cefclient/browser/main_context.h', |       'tests/cefclient/browser/main_context.h', | ||||||
|       'tests/cefclient/browser/main_context_impl.cc', |       'tests/cefclient/browser/main_context_impl.cc', | ||||||
|       'tests/cefclient/browser/main_context_impl.h', |       'tests/cefclient/browser/main_context_impl.h', | ||||||
|       'tests/cefclient/browser/media_router_test.cc', |  | ||||||
|       'tests/cefclient/browser/media_router_test.h', |  | ||||||
|       'tests/cefclient/browser/osr_dragdrop_events.h', |       'tests/cefclient/browser/osr_dragdrop_events.h', | ||||||
|       'tests/cefclient/browser/osr_renderer.h', |       'tests/cefclient/browser/osr_renderer.h', | ||||||
|       'tests/cefclient/browser/osr_renderer.cc', |       'tests/cefclient/browser/osr_renderer.cc', | ||||||
|       'tests/cefclient/browser/osr_renderer_settings.h', |  | ||||||
|       'tests/cefclient/browser/preferences_test.cc', |       'tests/cefclient/browser/preferences_test.cc', | ||||||
|       'tests/cefclient/browser/preferences_test.h', |       'tests/cefclient/browser/preferences_test.h', | ||||||
|       'tests/cefclient/browser/resource.h', |       'tests/cefclient/browser/resource.h', | ||||||
| @@ -253,31 +233,17 @@ | |||||||
|       'tests/cefclient/browser/root_window_create.cc', |       'tests/cefclient/browser/root_window_create.cc', | ||||||
|       'tests/cefclient/browser/root_window_manager.cc', |       'tests/cefclient/browser/root_window_manager.cc', | ||||||
|       'tests/cefclient/browser/root_window_manager.h', |       '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.cc', | ||||||
|       'tests/cefclient/browser/scheme_test.h', |       'tests/cefclient/browser/scheme_test.h', | ||||||
|       'tests/cefclient/browser/server_test.cc', |  | ||||||
|       'tests/cefclient/browser/server_test.h', |  | ||||||
|       'tests/cefclient/browser/temp_window.h', |       'tests/cefclient/browser/temp_window.h', | ||||||
|       'tests/cefclient/browser/test_runner.cc', |       'tests/cefclient/browser/test_runner.cc', | ||||||
|       'tests/cefclient/browser/test_runner.h', |       'tests/cefclient/browser/test_runner.h', | ||||||
|       'tests/cefclient/browser/urlrequest_test.cc', |       'tests/cefclient/browser/urlrequest_test.cc', | ||||||
|       'tests/cefclient/browser/urlrequest_test.h', |       '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.cc', | ||||||
|       'tests/cefclient/browser/window_test.h', |       'tests/cefclient/browser/window_test.h', | ||||||
|       'tests/cefclient/browser/window_test_runner.cc', |       'tests/cefclient/browser/window_test_runner.cc', | ||||||
|       'tests/cefclient/browser/window_test_runner.h', |       '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': [ |     'cefclient_sources_common': [ | ||||||
|       'tests/cefclient/common/client_app_delegates_common.cc', |       'tests/cefclient/common/client_app_delegates_common.cc', | ||||||
| @@ -297,9 +263,9 @@ | |||||||
|       'tests/cefclient/resources/binding.html', |       'tests/cefclient/resources/binding.html', | ||||||
|       'tests/cefclient/resources/dialogs.html', |       'tests/cefclient/resources/dialogs.html', | ||||||
|       'tests/cefclient/resources/draggable.html', |       'tests/cefclient/resources/draggable.html', | ||||||
|  |       'tests/cefclient/resources/drm.html', | ||||||
|       'tests/cefclient/resources/localstorage.html', |       'tests/cefclient/resources/localstorage.html', | ||||||
|       'tests/cefclient/resources/logo.png', |       'tests/cefclient/resources/logo.png', | ||||||
|       'tests/cefclient/resources/media_router.html', |  | ||||||
|       'tests/cefclient/resources/menu_icon.1x.png', |       'tests/cefclient/resources/menu_icon.1x.png', | ||||||
|       'tests/cefclient/resources/menu_icon.2x.png', |       'tests/cefclient/resources/menu_icon.2x.png', | ||||||
|       'tests/cefclient/resources/other_tests.html', |       'tests/cefclient/resources/other_tests.html', | ||||||
| @@ -307,20 +273,11 @@ | |||||||
|       'tests/cefclient/resources/performance2.html', |       'tests/cefclient/resources/performance2.html', | ||||||
|       'tests/cefclient/resources/preferences.html', |       'tests/cefclient/resources/preferences.html', | ||||||
|       'tests/cefclient/resources/response_filter.html', |       'tests/cefclient/resources/response_filter.html', | ||||||
|       'tests/cefclient/resources/server.html', |  | ||||||
|       'tests/cefclient/resources/transparency.html', |       'tests/cefclient/resources/transparency.html', | ||||||
|       'tests/cefclient/resources/urlrequest.html', |       'tests/cefclient/resources/urlrequest.html', | ||||||
|       'tests/cefclient/resources/websocket.html', |  | ||||||
|       'tests/cefclient/resources/window.html', |       'tests/cefclient/resources/window.html', | ||||||
|       'tests/cefclient/resources/xmlhttprequest.html', |       'tests/cefclient/resources/xmlhttprequest.html', | ||||||
|     ], |     ], | ||||||
|     'cefclient_sources_resources_extensions_set_page_color': [ |  | ||||||
|       'tests/cefclient/resources/extensions/set_page_color/icon.png', |  | ||||||
|       'tests/cefclient/resources/extensions/set_page_color/manifest.json', |  | ||||||
|       'tests/cefclient/resources/extensions/set_page_color/popup.html', |  | ||||||
|       'tests/cefclient/resources/extensions/set_page_color/popup.js', |  | ||||||
|       'tests/cefclient/resources/extensions/set_page_color/README.md', |  | ||||||
|     ], |  | ||||||
|     'cefclient_sources_win': [ |     'cefclient_sources_win': [ | ||||||
|       'tests/cefclient/browser/browser_window_osr_win.cc', |       'tests/cefclient/browser/browser_window_osr_win.cc', | ||||||
|       'tests/cefclient/browser/browser_window_osr_win.h', |       'tests/cefclient/browser/browser_window_osr_win.h', | ||||||
| @@ -338,29 +295,29 @@ | |||||||
|       'tests/cefclient/browser/osr_dragdrop_win.h', |       'tests/cefclient/browser/osr_dragdrop_win.h', | ||||||
|       'tests/cefclient/browser/osr_ime_handler_win.cc', |       'tests/cefclient/browser/osr_ime_handler_win.cc', | ||||||
|       'tests/cefclient/browser/osr_ime_handler_win.h', |       'tests/cefclient/browser/osr_ime_handler_win.h', | ||||||
|       'tests/cefclient/browser/osr_d3d11_win.cc', |  | ||||||
|       'tests/cefclient/browser/osr_d3d11_win.h', |  | ||||||
|       'tests/cefclient/browser/osr_render_handler_win.cc', |  | ||||||
|       'tests/cefclient/browser/osr_render_handler_win.h', |  | ||||||
|       'tests/cefclient/browser/osr_render_handler_win_d3d11.cc', |  | ||||||
|       'tests/cefclient/browser/osr_render_handler_win_d3d11.h', |  | ||||||
|       'tests/cefclient/browser/osr_render_handler_win_gl.cc', |  | ||||||
|       'tests/cefclient/browser/osr_render_handler_win_gl.h', |  | ||||||
|       'tests/cefclient/browser/osr_window_win.cc', |       'tests/cefclient/browser/osr_window_win.cc', | ||||||
|       'tests/cefclient/browser/osr_window_win.h', |       'tests/cefclient/browser/osr_window_win.h', | ||||||
|       'tests/cefclient/browser/resource_util_win_idmap.cc', |       '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.cc', | ||||||
|       'tests/cefclient/browser/root_window_win.h', |       'tests/cefclient/browser/root_window_win.h', | ||||||
|       'tests/cefclient/browser/temp_window_win.cc', |       'tests/cefclient/browser/temp_window_win.cc', | ||||||
|       'tests/cefclient/browser/temp_window_win.h', |       '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.cc', | ||||||
|       'tests/cefclient/browser/window_test_runner_win.h', |       'tests/cefclient/browser/window_test_runner_win.h', | ||||||
|       'tests/cefclient/cefclient_win.cc', |       'tests/cefclient/cefclient_win.cc', | ||||||
|       'tests/cefclient/resources/win/cefclient.rc', |  | ||||||
|     ], |  | ||||||
|     'cefclient_sources_resources_win': [ |  | ||||||
|       'tests/cefclient/resources/win/cefclient.exe.manifest', |       'tests/cefclient/resources/win/cefclient.exe.manifest', | ||||||
|       'tests/cefclient/resources/win/cefclient.ico', |       'tests/cefclient/resources/win/cefclient.ico', | ||||||
|  |       'tests/cefclient/resources/win/cefclient.rc', | ||||||
|       'tests/cefclient/resources/win/small.ico', |       'tests/cefclient/resources/win/small.ico', | ||||||
|     ], |     ], | ||||||
|     'cefclient_sources_mac': [ |     'cefclient_sources_mac': [ | ||||||
| @@ -398,19 +355,25 @@ | |||||||
|       'tests/cefclient/browser/dialog_handler_gtk.cc', |       'tests/cefclient/browser/dialog_handler_gtk.cc', | ||||||
|       'tests/cefclient/browser/dialog_handler_gtk.h', |       'tests/cefclient/browser/dialog_handler_gtk.h', | ||||||
|       'tests/cefclient/browser/main_context_impl_posix.cc', |       'tests/cefclient/browser/main_context_impl_posix.cc', | ||||||
|       'tests/cefclient/browser/main_message_loop_multithreaded_gtk.cc', |  | ||||||
|       'tests/cefclient/browser/main_message_loop_multithreaded_gtk.h', |  | ||||||
|       'tests/cefclient/browser/print_handler_gtk.cc', |       'tests/cefclient/browser/print_handler_gtk.cc', | ||||||
|       'tests/cefclient/browser/print_handler_gtk.h', |       'tests/cefclient/browser/print_handler_gtk.h', | ||||||
|       'tests/cefclient/browser/resource_util_linux.cc', |       'tests/cefclient/browser/resource_util_linux.cc', | ||||||
|       'tests/cefclient/browser/root_window_gtk.cc', |       'tests/cefclient/browser/root_window_gtk.cc', | ||||||
|       'tests/cefclient/browser/root_window_gtk.h', |       '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.cc', | ||||||
|       'tests/cefclient/browser/temp_window_x11.h', |       'tests/cefclient/browser/temp_window_x11.h', | ||||||
|       'tests/cefclient/browser/util_gtk.cc', |       'tests/cefclient/browser/views_menu_bar.cc', | ||||||
|       'tests/cefclient/browser/util_gtk.h', |       '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.cc', | ||||||
|       'tests/cefclient/browser/window_test_runner_gtk.h', |       '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', |       'tests/cefclient/cefclient_gtk.cc', | ||||||
|     ], |     ], | ||||||
|     'cefsimple_sources_common': [ |     'cefsimple_sources_common': [ | ||||||
| @@ -420,13 +383,11 @@ | |||||||
|       'tests/cefsimple/simple_handler.h', |       'tests/cefsimple/simple_handler.h', | ||||||
|     ], |     ], | ||||||
|     'cefsimple_sources_win': [ |     'cefsimple_sources_win': [ | ||||||
|  |       'tests/cefsimple/cefsimple.exe.manifest', | ||||||
|       'tests/cefsimple/cefsimple.rc', |       'tests/cefsimple/cefsimple.rc', | ||||||
|       'tests/cefsimple/cefsimple_win.cc', |       'tests/cefsimple/cefsimple_win.cc', | ||||||
|       'tests/cefsimple/simple_handler_win.cc', |       'tests/cefsimple/simple_handler_win.cc', | ||||||
|       'tests/cefsimple/resource.h', |       'tests/cefsimple/resource.h', | ||||||
|     ], |  | ||||||
|     'cefsimple_sources_resources_win': [ |  | ||||||
|       'tests/cefsimple/cefsimple.exe.manifest', |  | ||||||
|       'tests/cefsimple/res/cefsimple.ico', |       'tests/cefsimple/res/cefsimple.ico', | ||||||
|       'tests/cefsimple/res/small.ico', |       'tests/cefsimple/res/small.ico', | ||||||
|     ], |     ], | ||||||
| @@ -448,27 +409,19 @@ | |||||||
|       'tests/cefsimple/simple_handler_linux.cc', |       'tests/cefsimple/simple_handler_linux.cc', | ||||||
|     ], |     ], | ||||||
|     'ceftests_sources_common': [ |     'ceftests_sources_common': [ | ||||||
|       'tests/ceftests/audio_output_unittest.cc', |  | ||||||
|       'tests/ceftests/browser_info_map_unittest.cc', |       'tests/ceftests/browser_info_map_unittest.cc', | ||||||
|       'tests/ceftests/command_line_unittest.cc', |       'tests/ceftests/command_line_unittest.cc', | ||||||
|       'tests/ceftests/cookie_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/dialog_unittest.cc', | ||||||
|       'tests/ceftests/display_unittest.cc', |       'tests/ceftests/display_unittest.cc', | ||||||
|       'tests/ceftests/dom_unittest.cc', |       'tests/ceftests/dom_unittest.cc', | ||||||
|       'tests/ceftests/download_unittest.cc', |       'tests/ceftests/download_unittest.cc', | ||||||
|       'tests/ceftests/draggable_regions_unittest.cc', |       'tests/ceftests/draggable_regions_unittest.cc', | ||||||
|       'tests/ceftests/extensions/background_unittest.cc', |       'tests/ceftests/file_util.cc', | ||||||
|       'tests/ceftests/extensions/chrome_alarms_unittest.cc', |       'tests/ceftests/file_util.h', | ||||||
|       'tests/ceftests/extensions/chrome_storage_unittest.cc', |  | ||||||
|       'tests/ceftests/extensions/chrome_tabs_unittest.cc', |  | ||||||
|       'tests/ceftests/extensions/extension_test_handler.cc', |  | ||||||
|       'tests/ceftests/extensions/extension_test_handler.h', |  | ||||||
|       'tests/ceftests/extensions/view_unittest.cc', |  | ||||||
|       'tests/ceftests/file_util_unittest.cc', |       'tests/ceftests/file_util_unittest.cc', | ||||||
|       'tests/ceftests/frame_handler_unittest.cc', |  | ||||||
|       'tests/ceftests/frame_unittest.cc', |       'tests/ceftests/frame_unittest.cc', | ||||||
|  |       'tests/ceftests/geolocation_unittest.cc', | ||||||
|       'tests/ceftests/image_unittest.cc', |       'tests/ceftests/image_unittest.cc', | ||||||
|       'tests/ceftests/image_util.cc', |       'tests/ceftests/image_util.cc', | ||||||
|       'tests/ceftests/image_util.h', |       'tests/ceftests/image_util.h', | ||||||
| @@ -480,23 +433,20 @@ | |||||||
|       'tests/ceftests/osr_accessibility_unittest.cc', |       'tests/ceftests/osr_accessibility_unittest.cc', | ||||||
|       'tests/ceftests/osr_display_unittest.cc', |       'tests/ceftests/osr_display_unittest.cc', | ||||||
|       'tests/ceftests/parser_unittest.cc', |       'tests/ceftests/parser_unittest.cc', | ||||||
|       'tests/ceftests/pdf_viewer_unittest.cc', |       'tests/ceftests/plugin_unittest.cc', | ||||||
|       'tests/ceftests/preference_unittest.cc', |       'tests/ceftests/preference_unittest.cc', | ||||||
|       'tests/ceftests/print_unittest.cc', |       'tests/ceftests/print_unittest.cc', | ||||||
|       'tests/ceftests/process_message_unittest.cc', |       'tests/ceftests/process_message_unittest.cc', | ||||||
|       'tests/ceftests/request_context_unittest.cc', |       'tests/ceftests/request_context_unittest.cc', | ||||||
|       'tests/ceftests/request_handler_unittest.cc', |       'tests/ceftests/request_handler_unittest.cc', | ||||||
|       'tests/ceftests/request_unittest.cc', |       'tests/ceftests/request_unittest.cc', | ||||||
|       'tests/ceftests/response_unittest.cc', |  | ||||||
|       'tests/ceftests/resource.h', |       'tests/ceftests/resource.h', | ||||||
|       'tests/ceftests/resource_manager_unittest.cc', |       'tests/ceftests/resource_manager_unittest.cc', | ||||||
|       'tests/ceftests/resource_request_handler_unittest.cc', |  | ||||||
|       'tests/ceftests/routing_test_handler.cc', |       'tests/ceftests/routing_test_handler.cc', | ||||||
|       'tests/ceftests/routing_test_handler.h', |       'tests/ceftests/routing_test_handler.h', | ||||||
|       'tests/ceftests/run_all_unittests.cc', |       'tests/ceftests/run_all_unittests.cc', | ||||||
|       'tests/ceftests/scheme_handler_unittest.cc', |       'tests/ceftests/scheme_handler_unittest.cc', | ||||||
|       'tests/ceftests/scoped_temp_dir_unittest.cc', |       'tests/ceftests/scoped_temp_dir_unittest.cc', | ||||||
|       'tests/ceftests/server_unittest.cc', |  | ||||||
|       'tests/ceftests/stream_unittest.cc', |       'tests/ceftests/stream_unittest.cc', | ||||||
|       'tests/ceftests/stream_resource_handler_unittest.cc', |       'tests/ceftests/stream_resource_handler_unittest.cc', | ||||||
|       'tests/ceftests/string_unittest.cc', |       'tests/ceftests/string_unittest.cc', | ||||||
| @@ -504,11 +454,6 @@ | |||||||
|       'tests/ceftests/task_unittest.cc', |       'tests/ceftests/task_unittest.cc', | ||||||
|       'tests/ceftests/test_handler.cc', |       'tests/ceftests/test_handler.cc', | ||||||
|       'tests/ceftests/test_handler.h', |       '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_unittest.cc', |  | ||||||
|       'tests/ceftests/test_suite.cc', |       'tests/ceftests/test_suite.cc', | ||||||
|       'tests/ceftests/test_suite.h', |       'tests/ceftests/test_suite.h', | ||||||
|       'tests/ceftests/test_util.cc', |       'tests/ceftests/test_util.cc', | ||||||
| @@ -517,12 +462,17 @@ | |||||||
|       'tests/ceftests/thread_helper.h', |       'tests/ceftests/thread_helper.h', | ||||||
|       'tests/ceftests/thread_unittest.cc', |       'tests/ceftests/thread_unittest.cc', | ||||||
|       'tests/ceftests/tracing_unittest.cc', |       'tests/ceftests/tracing_unittest.cc', | ||||||
|       'tests/ceftests/track_callback.h', |  | ||||||
|       'tests/ceftests/translator_unittest.cc', |       'tests/ceftests/translator_unittest.cc', | ||||||
|       'tests/ceftests/urlrequest_unittest.cc', |       'tests/ceftests/urlrequest_unittest.cc', | ||||||
|       'tests/ceftests/v8_unittest.cc', |       'tests/ceftests/v8_unittest.cc', | ||||||
|       'tests/ceftests/values_unittest.cc', |       'tests/ceftests/values_unittest.cc', | ||||||
|       'tests/ceftests/version_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/button_unittest.cc', | ||||||
|       'tests/ceftests/views/panel_unittest.cc', |       'tests/ceftests/views/panel_unittest.cc', | ||||||
|       'tests/ceftests/views/scroll_view_unittest.cc', |       'tests/ceftests/views/scroll_view_unittest.cc', | ||||||
| @@ -530,18 +480,12 @@ | |||||||
|       'tests/ceftests/views/test_window_delegate.h', |       'tests/ceftests/views/test_window_delegate.h', | ||||||
|       'tests/ceftests/views/textfield_unittest.cc', |       'tests/ceftests/views/textfield_unittest.cc', | ||||||
|       'tests/ceftests/views/window_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': [ |     'ceftests_sources_win': [ | ||||||
|       'tests/ceftests/resource_util_win_idmap.cc', |       'tests/ceftests/resource_util_win_idmap.cc', | ||||||
|       'tests/ceftests/resources/win/ceftests.rc', |  | ||||||
|     ], |  | ||||||
|     'ceftests_sources_resources_win': [ |  | ||||||
|       'tests/ceftests/resources/win/ceftests.exe.manifest', |       'tests/ceftests/resources/win/ceftests.exe.manifest', | ||||||
|       'tests/ceftests/resources/win/ceftests.ico', |       'tests/ceftests/resources/win/ceftests.ico', | ||||||
|  |       'tests/ceftests/resources/win/ceftests.rc', | ||||||
|       'tests/ceftests/resources/win/small.ico', |       'tests/ceftests/resources/win/small.ico', | ||||||
|     ], |     ], | ||||||
|     'ceftests_sources_mac': [ |     'ceftests_sources_mac': [ | ||||||
| @@ -550,41 +494,33 @@ | |||||||
|       'tests/ceftests/run_all_unittests_mac.mm', |       'tests/ceftests/run_all_unittests_mac.mm', | ||||||
|     ], |     ], | ||||||
|     'ceftests_sources_mac_helper': [ |     'ceftests_sources_mac_helper': [ | ||||||
|       'tests/shared/browser/file_util.cc', |       'tests/shared/browser/resource_util.cc', | ||||||
|       'tests/shared/browser/file_util.h', |  | ||||||
|       'tests/shared/browser/resource_util.h', |       'tests/shared/browser/resource_util.h', | ||||||
|       'tests/shared/browser/resource_util_mac.mm', |       'tests/shared/browser/resource_util_mac.mm', | ||||||
|       'tests/shared/browser/resource_util_posix.cc', |       'tests/shared/browser/resource_util_posix.cc', | ||||||
|       'tests/ceftests/audio_output_unittest.cc', |  | ||||||
|       'tests/ceftests/client_app_delegates.cc', |       'tests/ceftests/client_app_delegates.cc', | ||||||
|       'tests/ceftests/cookie_unittest.cc', |       'tests/ceftests/cookie_unittest.cc', | ||||||
|       'tests/ceftests/cors_unittest.cc', |  | ||||||
|       'tests/ceftests/dom_unittest.cc', |       'tests/ceftests/dom_unittest.cc', | ||||||
|  |       'tests/ceftests/file_util.cc', | ||||||
|  |       'tests/ceftests/file_util.h', | ||||||
|       'tests/ceftests/frame_unittest.cc', |       'tests/ceftests/frame_unittest.cc', | ||||||
|       'tests/ceftests/message_router_unittest.cc', |       'tests/ceftests/message_router_unittest.cc', | ||||||
|       'tests/ceftests/navigation_unittest.cc', |       'tests/ceftests/navigation_unittest.cc', | ||||||
|       'tests/ceftests/pdf_viewer_unittest.cc', |       'tests/ceftests/plugin_unittest.cc', | ||||||
|       'tests/ceftests/preference_unittest.cc', |       'tests/ceftests/preference_unittest.cc', | ||||||
|       'tests/ceftests/process_message_unittest.cc', |       'tests/ceftests/process_message_unittest.cc', | ||||||
|       'tests/ceftests/request_handler_unittest.cc', |       'tests/ceftests/request_handler_unittest.cc', | ||||||
|       'tests/ceftests/request_unittest.cc', |       'tests/ceftests/request_unittest.cc', | ||||||
|       'tests/ceftests/response_unittest.cc', |  | ||||||
|       'tests/ceftests/resource_request_handler_unittest.cc', |  | ||||||
|       'tests/ceftests/routing_test_handler.cc', |       'tests/ceftests/routing_test_handler.cc', | ||||||
|       'tests/ceftests/routing_test_handler.h', |       'tests/ceftests/routing_test_handler.h', | ||||||
|       'tests/ceftests/scheme_handler_unittest.cc', |       'tests/ceftests/scheme_handler_unittest.cc', | ||||||
|       'tests/ceftests/urlrequest_unittest.cc', |       'tests/ceftests/urlrequest_unittest.cc', | ||||||
|       'tests/ceftests/test_handler.cc', |       'tests/ceftests/test_handler.cc', | ||||||
|       'tests/ceftests/test_handler.h', |       '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_suite.cc', |       'tests/ceftests/test_suite.cc', | ||||||
|       'tests/ceftests/test_suite.h', |       'tests/ceftests/test_suite.h', | ||||||
|       'tests/ceftests/test_util.cc', |       'tests/ceftests/test_util.cc', | ||||||
|       'tests/ceftests/test_util.h', |       'tests/ceftests/test_util.h', | ||||||
|       'tests/ceftests/track_callback.h', |  | ||||||
|       'tests/ceftests/thread_helper.cc', |       'tests/ceftests/thread_helper.cc', | ||||||
|       'tests/ceftests/thread_helper.h', |       'tests/ceftests/thread_helper.h', | ||||||
|       'tests/ceftests/thread_unittest.cc', |       'tests/ceftests/thread_unittest.cc', | ||||||
|   | |||||||
							
								
								
									
										130
									
								
								cef_repack_locales.gni
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								cef_repack_locales.gni
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,130 @@ | |||||||
|  | # 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}/content/app/strings/content_strings_${locale}.pak", | ||||||
|  |       "${root_gen_dir}/extensions/strings/extensions_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", | ||||||
|  |       "//content/app/strings", | ||||||
|  |       "//extensions/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 | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -25,17 +25,16 @@ macro(PRINT_CEF_CONFIG) | |||||||
|  |  | ||||||
|   message(STATUS "Binary distribution root:     ${_CEF_ROOT}") |   message(STATUS "Binary distribution root:     ${_CEF_ROOT}") | ||||||
|  |  | ||||||
|   if(OS_MAC) |   if(OS_MACOSX) | ||||||
|     message(STATUS "Base SDK:                     ${CMAKE_OSX_SYSROOT}") |     message(STATUS "Base SDK:                     ${CMAKE_OSX_SYSROOT}") | ||||||
|     message(STATUS "Target SDK:                   ${CEF_TARGET_SDK}") |     message(STATUS "Target SDK:                   ${CEF_TARGET_SDK}") | ||||||
|   endif() |   endif() | ||||||
|  |  | ||||||
|   if(OS_WINDOWS) |   if(OS_WINDOWS) | ||||||
|  |     message(STATUS "CEF Windows sandbox:          ${USE_SANDBOX}") | ||||||
|     message(STATUS "Visual Studio ATL support:    ${USE_ATL}") |     message(STATUS "Visual Studio ATL support:    ${USE_ATL}") | ||||||
|   endif() |   endif() | ||||||
|  |  | ||||||
|   message(STATUS "CEF sandbox:                  ${USE_SANDBOX}") |  | ||||||
|  |  | ||||||
|   set(_libraries ${CEF_STANDARD_LIBS}) |   set(_libraries ${CEF_STANDARD_LIBS}) | ||||||
|   if(OS_WINDOWS AND USE_SANDBOX) |   if(OS_WINDOWS AND USE_SANDBOX) | ||||||
|     list(APPEND _libraries ${CEF_SANDBOX_STANDARD_LIBS}) |     list(APPEND _libraries ${CEF_SANDBOX_STANDARD_LIBS}) | ||||||
| @@ -75,8 +74,8 @@ macro(APPEND_PLATFORM_SOURCES name_of_list) | |||||||
|   if(OS_WINDOWS AND ${name_of_list}_WINDOWS) |   if(OS_WINDOWS AND ${name_of_list}_WINDOWS) | ||||||
|     list(APPEND ${name_of_list} ${${name_of_list}_WINDOWS}) |     list(APPEND ${name_of_list} ${${name_of_list}_WINDOWS}) | ||||||
|   endif() |   endif() | ||||||
|   if(OS_MAC AND ${name_of_list}_MAC) |   if(OS_MACOSX AND ${name_of_list}_MACOSX) | ||||||
|     list(APPEND ${name_of_list} ${${name_of_list}_MAC}) |     list(APPEND ${name_of_list} ${${name_of_list}_MACOSX}) | ||||||
|   endif() |   endif() | ||||||
| endmacro() | endmacro() | ||||||
|  |  | ||||||
| @@ -102,19 +101,7 @@ macro(COPY_FILES target file_list source_dir target_dir) | |||||||
|     set(source_file ${source_dir}/${FILENAME}) |     set(source_file ${source_dir}/${FILENAME}) | ||||||
|     get_filename_component(target_name ${FILENAME} NAME) |     get_filename_component(target_name ${FILENAME} NAME) | ||||||
|     set(target_file ${target_dir}/${target_name}) |     set(target_file ${target_dir}/${target_name}) | ||||||
|  |     if(IS_DIRECTORY ${source_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( |       add_custom_command( | ||||||
|         TARGET ${target} |         TARGET ${target} | ||||||
|         POST_BUILD |         POST_BUILD | ||||||
| @@ -184,10 +171,26 @@ endif(OS_LINUX) | |||||||
| # Mac OS X macros. | # Mac OS X macros. | ||||||
| # | # | ||||||
|  |  | ||||||
| if(OS_MAC) | if(OS_MACOSX) | ||||||
|  |  | ||||||
|  | # Fix the framework rpath in the helper executable. | ||||||
|  | macro(FIX_MACOSX_HELPER_FRAMEWORK_RPATH target) | ||||||
|  |   # The helper is in $app_name.app/Contents/Frameworks/$app_name Helper.app/Contents/MacOS/ | ||||||
|  |   # so set rpath up to Contents/ so that the loader can find Frameworks/. | ||||||
|  |   set_target_properties(${target} PROPERTIES INSTALL_RPATH "@executable_path/../../../..") | ||||||
|  |   set_target_properties(${target} PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE) | ||||||
|  | endmacro() | ||||||
|  |  | ||||||
|  | # Fix the framework rpath in the main executable. | ||||||
|  | macro(FIX_MACOSX_MAIN_FRAMEWORK_RPATH target) | ||||||
|  |   # The main app is at $app_name.app/Contents/MacOS/$app_name | ||||||
|  |   # so set rpath up to Contents/ so that the loader can find Frameworks/. | ||||||
|  |   set_target_properties(${target} PROPERTIES INSTALL_RPATH "@executable_path/..") | ||||||
|  |   set_target_properties(${target} PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE) | ||||||
|  | endmacro() | ||||||
|  |  | ||||||
| # Manually process and copy over resource files. | # Manually process and copy over resource files. | ||||||
| macro(COPY_MAC_RESOURCES resource_list prefix_list target source_dir app_path) | macro(COPY_MACOSX_RESOURCES resource_list prefix_list target source_dir app_path) | ||||||
|   foreach(FILENAME ${resource_list}) |   foreach(FILENAME ${resource_list}) | ||||||
|     # Remove one or more prefixes from the source paths. |     # Remove one or more prefixes from the source paths. | ||||||
|     set(TARGET_FILENAME "${FILENAME}") |     set(TARGET_FILENAME "${FILENAME}") | ||||||
| @@ -229,7 +232,7 @@ macro(COPY_MAC_RESOURCES resource_list prefix_list target source_dir app_path) | |||||||
|   endforeach() |   endforeach() | ||||||
| endmacro() | endmacro() | ||||||
|  |  | ||||||
| endif(OS_MAC) | endif(OS_MACOSX) | ||||||
|  |  | ||||||
|  |  | ||||||
| # | # | ||||||
| @@ -298,7 +301,7 @@ macro(SET_COMMON_TARGET_PROPERTIES target) | |||||||
|     set_property(TARGET ${target} PROPERTY LINK_FLAGS_RELEASE ${_flags_str}) |     set_property(TARGET ${target} PROPERTY LINK_FLAGS_RELEASE ${_flags_str}) | ||||||
|   endif() |   endif() | ||||||
|  |  | ||||||
|   if(OS_MAC) |   if(OS_MACOSX) | ||||||
|     # Set Xcode target properties. |     # Set Xcode target properties. | ||||||
|     set_target_properties(${target} PROPERTIES |     set_target_properties(${target} PROPERTIES | ||||||
|       XCODE_ATTRIBUTE_ALWAYS_SEARCH_USER_PATHS                    NO |       XCODE_ATTRIBUTE_ALWAYS_SEARCH_USER_PATHS                    NO | ||||||
|   | |||||||
| @@ -14,8 +14,7 @@ endif() | |||||||
|  |  | ||||||
| # Determine the platform. | # Determine the platform. | ||||||
| if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") | if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") | ||||||
|   set(OS_MAC 1) |   set(OS_MACOSX 1) | ||||||
|   set(OS_MACOSX 1)  # For backwards compatibility. |  | ||||||
|   set(OS_POSIX 1) |   set(OS_POSIX 1) | ||||||
| elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") | elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") | ||||||
|   set(OS_LINUX 1) |   set(OS_LINUX 1) | ||||||
| @@ -26,15 +25,13 @@ endif() | |||||||
|  |  | ||||||
| # Determine the project architecture. | # Determine the project architecture. | ||||||
| if(NOT DEFINED PROJECT_ARCH) | if(NOT DEFINED PROJECT_ARCH) | ||||||
|   if(OS_WINDOWS AND "${CMAKE_GENERATOR_PLATFORM}" STREQUAL "arm64") |   if(CMAKE_SIZEOF_VOID_P MATCHES 8) | ||||||
|     set(PROJECT_ARCH "arm64") |  | ||||||
|   elseif(CMAKE_SIZEOF_VOID_P MATCHES 8) |  | ||||||
|     set(PROJECT_ARCH "x86_64") |     set(PROJECT_ARCH "x86_64") | ||||||
|   else() |   else() | ||||||
|     set(PROJECT_ARCH "x86") |     set(PROJECT_ARCH "x86") | ||||||
|   endif() |   endif() | ||||||
|  |  | ||||||
|   if(OS_MAC) |   if(OS_MACOSX) | ||||||
|     # PROJECT_ARCH should be specified on Mac OS X. |     # PROJECT_ARCH should be specified on Mac OS X. | ||||||
|     message(WARNING "No PROJECT_ARCH value specified, using ${PROJECT_ARCH}") |     message(WARNING "No PROJECT_ARCH value specified, using ${PROJECT_ARCH}") | ||||||
|   endif() |   endif() | ||||||
| @@ -69,10 +66,6 @@ list(APPEND CEF_COMPILER_DEFINES | |||||||
|   ) |   ) | ||||||
|  |  | ||||||
|  |  | ||||||
| # Configure use of the sandbox. |  | ||||||
| option(USE_SANDBOX "Enable or disable use of the sandbox." ON) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| # | # | ||||||
| # Linux configuration. | # Linux configuration. | ||||||
| # | # | ||||||
| @@ -93,9 +86,6 @@ if(OS_LINUX) | |||||||
|     -Werror                         # Treat warnings as errors |     -Werror                         # Treat warnings as errors | ||||||
|     -Wno-missing-field-initializers # Don't warn about missing field initializers |     -Wno-missing-field-initializers # Don't warn about missing field initializers | ||||||
|     -Wno-unused-parameter           # Don't warn about unused parameters |     -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 |   list(APPEND CEF_C_COMPILER_FLAGS | ||||||
|     -std=c99                        # Use the C99 language standard |     -std=c99                        # Use the C99 language standard | ||||||
| @@ -105,7 +95,7 @@ if(OS_LINUX) | |||||||
|     -fno-rtti                       # Disable real-time type information |     -fno-rtti                       # Disable real-time type information | ||||||
|     -fno-threadsafe-statics         # Don't generate thread-safe statics |     -fno-threadsafe-statics         # Don't generate thread-safe statics | ||||||
|     -fvisibility-inlines-hidden     # Give hidden visibility to inlined class member functions |     -fvisibility-inlines-hidden     # Give hidden visibility to inlined class member functions | ||||||
|     -std=c++14                      # Use the C++14 language standard |     -std=gnu++11                    # Use the C++11 language standard including GNU extensions | ||||||
|     -Wsign-compare                  # Warn about mixed signed/unsigned type comparisons |     -Wsign-compare                  # Warn about mixed signed/unsigned type comparisons | ||||||
|     ) |     ) | ||||||
|   list(APPEND CEF_COMPILER_FLAGS_DEBUG |   list(APPEND CEF_COMPILER_FLAGS_DEBUG | ||||||
| @@ -145,13 +135,6 @@ if(OS_LINUX) | |||||||
|   include(CheckCCompilerFlag) |   include(CheckCCompilerFlag) | ||||||
|   include(CheckCXXCompilerFlag) |   include(CheckCXXCompilerFlag) | ||||||
|  |  | ||||||
|   CHECK_CXX_COMPILER_FLAG(-Wno-undefined-var-template COMPILER_SUPPORTS_NO_UNDEFINED_VAR_TEMPLATE) |  | ||||||
|   if(COMPILER_SUPPORTS_NO_UNDEFINED_VAR_TEMPLATE) |  | ||||||
|     list(APPEND CEF_CXX_COMPILER_FLAGS |  | ||||||
|       -Wno-undefined-var-template   # Don't warn about potentially uninstantiated static members |  | ||||||
|       ) |  | ||||||
|   endif() |  | ||||||
|  |  | ||||||
|   CHECK_C_COMPILER_FLAG(-Wno-unused-local-typedefs COMPILER_SUPPORTS_NO_UNUSED_LOCAL_TYPEDEFS) |   CHECK_C_COMPILER_FLAG(-Wno-unused-local-typedefs COMPILER_SUPPORTS_NO_UNUSED_LOCAL_TYPEDEFS) | ||||||
|   if(COMPILER_SUPPORTS_NO_UNUSED_LOCAL_TYPEDEFS) |   if(COMPILER_SUPPORTS_NO_UNUSED_LOCAL_TYPEDEFS) | ||||||
|     list(APPEND CEF_C_COMPILER_FLAGS |     list(APPEND CEF_C_COMPILER_FLAGS | ||||||
| @@ -173,12 +156,6 @@ if(OS_LINUX) | |||||||
|       ) |       ) | ||||||
|   endif() |   endif() | ||||||
|  |  | ||||||
|   if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") |  | ||||||
|     list(APPEND CEF_CXX_COMPILER_FLAGS |  | ||||||
|       -Wno-attributes             # The cfi-icall attribute is not supported by the GNU C++ compiler |  | ||||||
|       ) |  | ||||||
|   endif() |  | ||||||
|  |  | ||||||
|   if(PROJECT_ARCH STREQUAL "x86_64") |   if(PROJECT_ARCH STREQUAL "x86_64") | ||||||
|     # 64-bit architecture. |     # 64-bit architecture. | ||||||
|     list(APPEND CEF_COMPILER_FLAGS |     list(APPEND CEF_COMPILER_FLAGS | ||||||
| @@ -220,30 +197,20 @@ if(OS_LINUX) | |||||||
|   set(CEF_BINARY_FILES |   set(CEF_BINARY_FILES | ||||||
|     chrome-sandbox |     chrome-sandbox | ||||||
|     libcef.so |     libcef.so | ||||||
|     libEGL.so |     natives_blob.bin | ||||||
|     libGLESv2.so |  | ||||||
|     libvk_swiftshader.so |  | ||||||
|     libvulkan.so.1 |  | ||||||
|     snapshot_blob.bin |     snapshot_blob.bin | ||||||
|     v8_context_snapshot.bin |  | ||||||
|     vk_swiftshader_icd.json |  | ||||||
|     swiftshader |  | ||||||
|     ) |     ) | ||||||
|  |  | ||||||
|   # List of CEF resource files. |   # List of CEF resource files. | ||||||
|   set(CEF_RESOURCE_FILES |   set(CEF_RESOURCE_FILES | ||||||
|     chrome_100_percent.pak |     cef.pak | ||||||
|     chrome_200_percent.pak |     cef_100_percent.pak | ||||||
|     resources.pak |     cef_200_percent.pak | ||||||
|  |     cef_extensions.pak | ||||||
|  |     devtools_resources.pak | ||||||
|     icudtl.dat |     icudtl.dat | ||||||
|     locales |     locales | ||||||
|     ) |     ) | ||||||
|  |  | ||||||
|   if(USE_SANDBOX) |  | ||||||
|     list(APPEND CEF_COMPILER_DEFINES |  | ||||||
|       CEF_USE_SANDBOX   # Used by apps to test if the sandbox is enabled |  | ||||||
|       ) |  | ||||||
|   endif() |  | ||||||
| endif() | endif() | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -251,7 +218,7 @@ endif() | |||||||
| # Mac OS X configuration. | # Mac OS X configuration. | ||||||
| # | # | ||||||
|  |  | ||||||
| if(OS_MAC) | if(OS_MACOSX) | ||||||
|   # Platform-specific compiler/linker flags. |   # Platform-specific compiler/linker flags. | ||||||
|   # See also Xcode target properties in cef_macros.cmake. |   # See also Xcode target properties in cef_macros.cmake. | ||||||
|   set(CEF_LIBTYPE SHARED) |   set(CEF_LIBTYPE SHARED) | ||||||
| @@ -277,7 +244,7 @@ if(OS_MAC) | |||||||
|     -fno-threadsafe-statics         # Don't generate thread-safe statics |     -fno-threadsafe-statics         # Don't generate thread-safe statics | ||||||
|     -fobjc-call-cxx-cdtors          # Call the constructor/destructor of C++ instance variables in ObjC objects |     -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 |     -fvisibility-inlines-hidden     # Give hidden visibility to inlined class member functions | ||||||
|     -std=c++14                      # Use the C++14 language standard |     -std=gnu++11                    # Use the C++11 language standard including GNU extensions | ||||||
|     -Wno-narrowing                  # Don't warn about type narrowing |     -Wno-narrowing                  # Don't warn about type narrowing | ||||||
|     -Wsign-compare                  # Warn about mixed signed/unsigned type comparisons |     -Wsign-compare                  # Warn about mixed signed/unsigned type comparisons | ||||||
|     ) |     ) | ||||||
| @@ -315,7 +282,7 @@ if(OS_MAC) | |||||||
|  |  | ||||||
|   # Find the newest available base SDK. |   # Find the newest available base SDK. | ||||||
|   execute_process(COMMAND xcode-select --print-path OUTPUT_VARIABLE XCODE_PATH OUTPUT_STRIP_TRAILING_WHITESPACE) |   execute_process(COMMAND xcode-select --print-path OUTPUT_VARIABLE XCODE_PATH OUTPUT_STRIP_TRAILING_WHITESPACE) | ||||||
|   foreach(OS_VERSION 10.15 10.14 10.13 10.12 10.11) |   foreach(OS_VERSION 10.11 10.10 10.9) | ||||||
|     set(SDK "${XCODE_PATH}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX${OS_VERSION}.sdk") |     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}") |     if(NOT "${CMAKE_OSX_SYSROOT}" AND EXISTS "${SDK}" AND IS_DIRECTORY "${SDK}") | ||||||
|       set(CMAKE_OSX_SYSROOT ${SDK}) |       set(CMAKE_OSX_SYSROOT ${SDK}) | ||||||
| @@ -323,7 +290,7 @@ if(OS_MAC) | |||||||
|   endforeach() |   endforeach() | ||||||
|  |  | ||||||
|   # Target SDK. |   # Target SDK. | ||||||
|   set(CEF_TARGET_SDK               "10.11") |   set(CEF_TARGET_SDK               "10.9") | ||||||
|   list(APPEND CEF_COMPILER_FLAGS |   list(APPEND CEF_COMPILER_FLAGS | ||||||
|     -mmacosx-version-min=${CEF_TARGET_SDK} |     -mmacosx-version-min=${CEF_TARGET_SDK} | ||||||
|   ) |   ) | ||||||
| @@ -332,38 +299,18 @@ if(OS_MAC) | |||||||
|   # Target architecture. |   # Target architecture. | ||||||
|   if(PROJECT_ARCH STREQUAL "x86_64") |   if(PROJECT_ARCH STREQUAL "x86_64") | ||||||
|     set(CMAKE_OSX_ARCHITECTURES "x86_64") |     set(CMAKE_OSX_ARCHITECTURES "x86_64") | ||||||
|   elseif(PROJECT_ARCH STREQUAL "arm64") |  | ||||||
|     set(CMAKE_OSX_ARCHITECTURES "arm64") |  | ||||||
|   else() |   else() | ||||||
|     set(CMAKE_OSX_ARCHITECTURES "i386") |     set(CMAKE_OSX_ARCHITECTURES "i386") | ||||||
|   endif() |   endif() | ||||||
|  |  | ||||||
|   # Prevent Xcode 11 from doing automatic codesigning. |  | ||||||
|   set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "") |  | ||||||
|  |  | ||||||
|   # CEF directory paths. |   # CEF directory paths. | ||||||
|   set(CEF_BINARY_DIR          "${_CEF_ROOT}/$<CONFIGURATION>") |   set(CEF_BINARY_DIR          "${_CEF_ROOT}/$<CONFIGURATION>") | ||||||
|   set(CEF_BINARY_DIR_DEBUG    "${_CEF_ROOT}/Debug") |   set(CEF_BINARY_DIR_DEBUG    "${_CEF_ROOT}/Debug") | ||||||
|   set(CEF_BINARY_DIR_RELEASE  "${_CEF_ROOT}/Release") |   set(CEF_BINARY_DIR_RELEASE  "${_CEF_ROOT}/Release") | ||||||
|  |  | ||||||
|   if(USE_SANDBOX) |   # CEF library paths. | ||||||
|     list(APPEND CEF_COMPILER_DEFINES |   set(CEF_LIB_DEBUG   "${CEF_BINARY_DIR_DEBUG}/Chromium Embedded Framework.framework/Chromium Embedded Framework") | ||||||
|       CEF_USE_SANDBOX   # Used by apps to test if the sandbox is enabled |   set(CEF_LIB_RELEASE "${CEF_BINARY_DIR_RELEASE}/Chromium Embedded Framework.framework/Chromium Embedded Framework") | ||||||
|       ) |  | ||||||
|  |  | ||||||
|     # 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") |  | ||||||
|   endif() |  | ||||||
|  |  | ||||||
|   # CEF Helper app suffixes. |  | ||||||
|   # Format is "<name suffix>:<target suffix>:<plist suffix>". |  | ||||||
|   set(CEF_HELPER_APP_SUFFIXES |  | ||||||
|     "::" |  | ||||||
|     " (GPU):_gpu:.gpu" |  | ||||||
|     " (Plugin):_plugin:.plugin" |  | ||||||
|     " (Renderer):_renderer:.renderer" |  | ||||||
|     ) |  | ||||||
| endif() | endif() | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -380,25 +327,18 @@ if(OS_WINDOWS) | |||||||
|     set(CMAKE_CXX_FLAGS_RELEASE "") |     set(CMAKE_CXX_FLAGS_RELEASE "") | ||||||
|   endif() |   endif() | ||||||
|  |  | ||||||
|   if(USE_SANDBOX) |   # Configure use of the sandbox. | ||||||
|     # Check if the current MSVC version is compatible with the cef_sandbox.lib |   option(USE_SANDBOX "Enable or disable use of the sandbox." ON) | ||||||
|     # static library. We require VS2015 or newer. |   if(USE_SANDBOX AND NOT MSVC_VERSION EQUAL 1900 AND NOT MSVC_VERSION EQUAL 1910) | ||||||
|     if(MSVC_VERSION LESS 1900) |     # The cef_sandbox.lib static library is currently built with VS2015, which | ||||||
|       message(WARNING "CEF sandbox is not compatible with the current MSVC version (${MSVC_VERSION})") |     # is compatible with VS2015 and VS2017. It will not link successfully with | ||||||
|       set(USE_SANDBOX OFF) |     # other VS versions. | ||||||
|     endif() |     set(USE_SANDBOX OFF) | ||||||
|   endif() |   endif() | ||||||
|  |  | ||||||
|   # Consumers who run into LNK4099 warnings can pass /Z7 instead (see issue #385). |   # Consumers who run into LNK4099 warnings can pass /Z7 instead (see issue #385). | ||||||
|   set(CEF_DEBUG_INFO_FLAG "/Zi" CACHE STRING "Optional flag specifying specific /Z flag to use") |   set(CEF_DEBUG_INFO_FLAG "/Zi" CACHE STRING "Optional flag specifying specific /Z flag to use") | ||||||
|  |  | ||||||
|   # Consumers using different runtime types may want to pass different flags |  | ||||||
|   set(CEF_RUNTIME_LIBRARY_FLAG "/MT" CACHE STRING "Optional flag specifying which runtime to use") |  | ||||||
|   if (CEF_RUNTIME_LIBRARY_FLAG) |  | ||||||
|     list(APPEND CEF_COMPILER_FLAGS_DEBUG ${CEF_RUNTIME_LIBRARY_FLAG}d) |  | ||||||
|     list(APPEND CEF_COMPILER_FLAGS_RELEASE ${CEF_RUNTIME_LIBRARY_FLAG}) |  | ||||||
|   endif() |  | ||||||
|  |  | ||||||
|   # Platform-specific compiler/linker flags. |   # Platform-specific compiler/linker flags. | ||||||
|   set(CEF_LIBTYPE STATIC) |   set(CEF_LIBTYPE STATIC) | ||||||
|   list(APPEND CEF_COMPILER_FLAGS |   list(APPEND CEF_COMPILER_FLAGS | ||||||
| @@ -410,7 +350,6 @@ if(OS_WINDOWS) | |||||||
|     /wd4100       # Ignore "unreferenced formal parameter" warning |     /wd4100       # Ignore "unreferenced formal parameter" warning | ||||||
|     /wd4127       # Ignore "conditional expression is constant" warning |     /wd4127       # Ignore "conditional expression is constant" warning | ||||||
|     /wd4244       # Ignore "conversion possible loss of data" 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 |     /wd4481       # Ignore "nonstandard extension used: override" warning | ||||||
|     /wd4512       # Ignore "assignment operator could not be generated" warning |     /wd4512       # Ignore "assignment operator could not be generated" warning | ||||||
|     /wd4701       # Ignore "potentially uninitialized local variable" warning |     /wd4701       # Ignore "potentially uninitialized local variable" warning | ||||||
| @@ -419,10 +358,12 @@ if(OS_WINDOWS) | |||||||
|     ${CEF_DEBUG_INFO_FLAG} |     ${CEF_DEBUG_INFO_FLAG} | ||||||
|     ) |     ) | ||||||
|   list(APPEND CEF_COMPILER_FLAGS_DEBUG |   list(APPEND CEF_COMPILER_FLAGS_DEBUG | ||||||
|  |     /MTd          # Multithreaded debug runtime | ||||||
|     /RTC1         # Disable optimizations |     /RTC1         # Disable optimizations | ||||||
|     /Od           # Enable basic run-time checks |     /Od           # Enable basic run-time checks | ||||||
|     ) |     ) | ||||||
|   list(APPEND CEF_COMPILER_FLAGS_RELEASE |   list(APPEND CEF_COMPILER_FLAGS_RELEASE | ||||||
|  |     /MT           # Multithreaded release runtime | ||||||
|     /O2           # Optimize for maximum speed |     /O2           # Optimize for maximum speed | ||||||
|     /Ob2          # Inline any suitable function |     /Ob2          # Inline any suitable function | ||||||
|     /GF           # Enable string pooling |     /GF           # Enable string pooling | ||||||
| @@ -449,7 +390,6 @@ if(OS_WINDOWS) | |||||||
|   # Standard libraries. |   # Standard libraries. | ||||||
|   set(CEF_STANDARD_LIBS |   set(CEF_STANDARD_LIBS | ||||||
|     comctl32.lib |     comctl32.lib | ||||||
|     gdi32.lib |  | ||||||
|     rpcrt4.lib |     rpcrt4.lib | ||||||
|     shlwapi.lib |     shlwapi.lib | ||||||
|     ws2_32.lib |     ws2_32.lib | ||||||
| @@ -468,28 +408,22 @@ if(OS_WINDOWS) | |||||||
|   # List of CEF binary files. |   # List of CEF binary files. | ||||||
|   set(CEF_BINARY_FILES |   set(CEF_BINARY_FILES | ||||||
|     chrome_elf.dll |     chrome_elf.dll | ||||||
|  |     d3dcompiler_43.dll | ||||||
|  |     d3dcompiler_47.dll | ||||||
|     libcef.dll |     libcef.dll | ||||||
|     libEGL.dll |     libEGL.dll | ||||||
|     libGLESv2.dll |     libGLESv2.dll | ||||||
|  |     natives_blob.bin | ||||||
|     snapshot_blob.bin |     snapshot_blob.bin | ||||||
|     v8_context_snapshot.bin |  | ||||||
|     vk_swiftshader.dll |  | ||||||
|     vk_swiftshader_icd.json |  | ||||||
|     vulkan-1.dll |  | ||||||
|     swiftshader |  | ||||||
|     ) |     ) | ||||||
|  |  | ||||||
|   if(NOT PROJECT_ARCH STREQUAL "arm64") |  | ||||||
|     list(APPEND CEF_BINARY_FILES |  | ||||||
|       d3dcompiler_47.dll |  | ||||||
|       ) |  | ||||||
|   endif() |  | ||||||
|  |  | ||||||
|   # List of CEF resource files. |   # List of CEF resource files. | ||||||
|   set(CEF_RESOURCE_FILES |   set(CEF_RESOURCE_FILES | ||||||
|     chrome_100_percent.pak |     cef.pak | ||||||
|     chrome_200_percent.pak |     cef_100_percent.pak | ||||||
|     resources.pak |     cef_200_percent.pak | ||||||
|  |     cef_extensions.pak | ||||||
|  |     devtools_resources.pak | ||||||
|     icudtl.dat |     icudtl.dat | ||||||
|     locales |     locales | ||||||
|     ) |     ) | ||||||
| @@ -499,23 +433,12 @@ if(OS_WINDOWS) | |||||||
|       PSAPI_VERSION=1   # Required by cef_sandbox.lib |       PSAPI_VERSION=1   # Required by cef_sandbox.lib | ||||||
|       CEF_USE_SANDBOX   # Used by apps to test if the sandbox is enabled |       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. |     # Libraries required by cef_sandbox.lib. | ||||||
|     set(CEF_SANDBOX_STANDARD_LIBS |     set(CEF_SANDBOX_STANDARD_LIBS | ||||||
|       Advapi32.lib |  | ||||||
|       dbghelp.lib |       dbghelp.lib | ||||||
|       Delayimp.lib |  | ||||||
|       OleAut32.lib |  | ||||||
|       PowrProf.lib |  | ||||||
|       Propsys.lib |  | ||||||
|       psapi.lib |       psapi.lib | ||||||
|       SetupAPI.lib |  | ||||||
|       Shell32.lib |  | ||||||
|       version.lib |       version.lib | ||||||
|       wbemuuid.lib |  | ||||||
|       winmm.lib |       winmm.lib | ||||||
|       ) |       ) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,87 +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_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_macros.h" |  | ||||||
| #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(); |  | ||||||
|  |  | ||||||
|   // 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_; |  | ||||||
|  |  | ||||||
|   DISALLOW_COPY_AND_ASSIGN(AtomicFlag); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| }  // namespace base |  | ||||||
|  |  | ||||||
| #endif  // !USING_CHROMIUM_INCLUDES |  | ||||||
|  |  | ||||||
| #endif  // CEF_INCLUDE_BASE_CEF_ATOMIC_FLAG_H_ |  | ||||||
| @@ -43,66 +43,120 @@ | |||||||
| // When building CEF include the Chromium header directly. | // When building CEF include the Chromium header directly. | ||||||
| #include "base/atomic_ref_count.h" | #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 | #else  // !USING_CHROMIUM_INCLUDES | ||||||
| // The following is substantially similar to the Chromium implementation. | // The following is substantially similar to the Chromium implementation. | ||||||
| // If the Chromium implementation diverges the below implementation should be | // If the Chromium implementation diverges the below implementation should be | ||||||
| // updated to match. | // updated to match. | ||||||
|  |  | ||||||
| #include <atomic> | #include "include/base/cef_atomicops.h" | ||||||
|  |  | ||||||
|  | // Annotations are not currently supported. | ||||||
|  | #define ANNOTATE_HAPPENS_BEFORE(obj) /* empty */ | ||||||
|  | #define ANNOTATE_HAPPENS_AFTER(obj)  /* empty */ | ||||||
|  |  | ||||||
|  | // Used when declaring a base::AtomicRefCount value. This is an integer/ptr type | ||||||
|  | // with CEF headers. | ||||||
|  | #define ATOMIC_DECLARATION = 0 | ||||||
|  |  | ||||||
| namespace base { | namespace base { | ||||||
|  |  | ||||||
| class AtomicRefCount { | typedef subtle::Atomic32 AtomicRefCount; | ||||||
|  public: |  | ||||||
|   constexpr AtomicRefCount() : ref_count_(0) {} |  | ||||||
|   explicit constexpr AtomicRefCount(int initial_value) |  | ||||||
|       : ref_count_(initial_value) {} |  | ||||||
|  |  | ||||||
|   // Increment a reference count. | // Increment a reference count by "increment", which must exceed 0. | ||||||
|   // Returns the previous value of the count. | inline void AtomicRefCountIncN(volatile AtomicRefCount* ptr, | ||||||
|   int Increment() { return Increment(1); } |                                AtomicRefCount increment) { | ||||||
|  |   subtle::NoBarrier_AtomicIncrement(ptr, increment); | ||||||
|  | } | ||||||
|  |  | ||||||
|   // Increment a reference count by "increment", which must exceed 0. | // Decrement a reference count by "decrement", which must exceed 0, | ||||||
|   // Returns the previous value of the count. | // and return whether the result is non-zero. | ||||||
|   int Increment(int increment) { | // Insert barriers to ensure that state written before the reference count | ||||||
|     return ref_count_.fetch_add(increment, std::memory_order_relaxed); | // became zero will be visible to a thread that has just made the count zero. | ||||||
|  | inline bool AtomicRefCountDecN(volatile AtomicRefCount* ptr, | ||||||
|  |                                AtomicRefCount decrement) { | ||||||
|  |   ANNOTATE_HAPPENS_BEFORE(ptr); | ||||||
|  |   bool res = (subtle::Barrier_AtomicIncrement(ptr, -decrement) != 0); | ||||||
|  |   if (!res) { | ||||||
|  |     ANNOTATE_HAPPENS_AFTER(ptr); | ||||||
|   } |   } | ||||||
|  |   return res; | ||||||
|  | } | ||||||
|  |  | ||||||
|   // Decrement a reference count, and return whether the result is non-zero. | // Increment a reference count by 1. | ||||||
|   // Insert barriers to ensure that state written before the reference count | inline void AtomicRefCountInc(volatile AtomicRefCount* ptr) { | ||||||
|   // became zero will be visible to a thread that has just made the count zero. |   base::AtomicRefCountIncN(ptr, 1); | ||||||
|   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). | // Decrement a reference count by 1 and return whether the result is non-zero. | ||||||
|     // However, there are toolchain issues that make that not work as well at | // Insert barriers to ensure that state written before the reference count | ||||||
|     // present (notably TSAN doesn't like it). | // became zero will be visible to a thread that has just made the count zero. | ||||||
|     return ref_count_.fetch_sub(1, std::memory_order_acq_rel) != 1; | inline bool AtomicRefCountDec(volatile AtomicRefCount* ptr) { | ||||||
|  |   return base::AtomicRefCountDecN(ptr, 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Return whether the reference count is one.  If the reference count is used | ||||||
|  | // in the conventional way, a refrerence count of 1 implies that the current | ||||||
|  | // thread owns the reference and no other thread shares it.  This call performs | ||||||
|  | // the test for a reference count of one, and performs the memory barrier | ||||||
|  | // needed for the owning thread to act on the object, knowing that it has | ||||||
|  | // exclusive access to the object. | ||||||
|  | inline bool AtomicRefCountIsOne(volatile AtomicRefCount* ptr) { | ||||||
|  |   bool res = (subtle::Acquire_Load(ptr) == 1); | ||||||
|  |   if (res) { | ||||||
|  |     ANNOTATE_HAPPENS_AFTER(ptr); | ||||||
|   } |   } | ||||||
|  |   return res; | ||||||
|  | } | ||||||
|  |  | ||||||
|   // Return whether the reference count is one.  If the reference count is used | // Return whether the reference count is zero.  With conventional object | ||||||
|   // in the conventional way, a refrerence count of 1 implies that the current | // referencing counting, the object will be destroyed, so the reference count | ||||||
|   // thread owns the reference and no other thread shares it.  This call | // should never be zero.  Hence this is generally used for a debug check. | ||||||
|   // performs the test for a reference count of one, and performs the memory | inline bool AtomicRefCountIsZero(volatile AtomicRefCount* ptr) { | ||||||
|   // barrier needed for the owning thread to act on the object, knowing that it |   bool res = (subtle::Acquire_Load(ptr) == 0); | ||||||
|   // has exclusive access to the object. |   if (res) { | ||||||
|   bool IsOne() const { return ref_count_.load(std::memory_order_acquire) == 1; } |     ANNOTATE_HAPPENS_AFTER(ptr); | ||||||
|  |  | ||||||
|   // 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 | }  // namespace base | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										199
									
								
								include/base/cef_atomicops.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										199
									
								
								include/base/cef_atomicops.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,199 @@ | |||||||
|  | // 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_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) | ||||||
|  | #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_ | ||||||
| @@ -1,89 +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. |  | ||||||
|  |  | ||||||
| // 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_ |  | ||||||
| @@ -42,7 +42,7 @@ | |||||||
| // | // | ||||||
| // On Mac OS X, |long long| is used for 64-bit types for compatibility with | // On Mac OS X, |long long| is used for 64-bit types for compatibility with | ||||||
| // <inttypes.h> format macros even in the LP64 model. | // <inttypes.h> format macros even in the LP64 model. | ||||||
| #if defined(__LP64__) && !defined(OS_MAC) && !defined(OS_OPENBSD) | #if defined(__LP64__) && !defined(OS_MACOSX) && !defined(OS_OPENBSD) | ||||||
| typedef long int64; | typedef long int64; | ||||||
| typedef unsigned long uint64; | typedef unsigned long uint64; | ||||||
| #else | #else | ||||||
| @@ -64,17 +64,8 @@ typedef int int32; | |||||||
| typedef unsigned int uint32; | typedef unsigned int uint32; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef _INT16 |  | ||||||
| #define _INT16 |  | ||||||
| typedef short int16; |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifndef _UINT16 |  | ||||||
| #define _UINT16 |  | ||||||
| typedef unsigned short uint16; |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // UTF-16 character type. | // UTF-16 character type. | ||||||
|  | // This should be kept synchronized with base/strings/string16.h | ||||||
| #ifndef char16 | #ifndef char16 | ||||||
| #if defined(WCHAR_T_IS_UTF16) | #if defined(WCHAR_T_IS_UTF16) | ||||||
| typedef wchar_t char16; | typedef wchar_t char16; | ||||||
|   | |||||||
| @@ -28,47 +28,16 @@ | |||||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  | ||||||
| // ----------------------------------------------------------------------------- |  | ||||||
| // Usage documentation |  | ||||||
| // ----------------------------------------------------------------------------- |  | ||||||
| // |  | ||||||
| // Overview: |  | ||||||
| // 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(). |  | ||||||
| // |  | ||||||
| //   // 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); |  | ||||||
| // |  | ||||||
| // 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. |  | ||||||
| // |  | ||||||
| //   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() |  | ||||||
| // |  | ||||||
| // See //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_ | #ifndef CEF_INCLUDE_BASE_CEF_BIND_H_ | ||||||
| #define CEF_INCLUDE_BASE_CEF_BIND_H_ | #define CEF_INCLUDE_BASE_CEF_BIND_H_ | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #if defined(USING_CHROMIUM_INCLUDES) | #if defined(BASE_BIND_H_) | ||||||
|  | // Do nothing if the Chromium header has already been included. | ||||||
|  | // This can happen in cases where Chromium code is used directly by the | ||||||
|  | // client application. When using Chromium code directly always include | ||||||
|  | // the Chromium header first to avoid type conflicts. | ||||||
|  | #elif defined(USING_CHROMIUM_INCLUDES) | ||||||
| // When building CEF include the Chromium header directly. | // When building CEF include the Chromium header directly. | ||||||
| #include "base/bind.h" | #include "base/bind.h" | ||||||
| #else  // !USING_CHROMIUM_INCLUDES | #else  // !USING_CHROMIUM_INCLUDES | ||||||
| @@ -76,275 +45,529 @@ | |||||||
| // If the Chromium implementation diverges the below implementation should be | // If the Chromium implementation diverges the below implementation should be | ||||||
| // updated to match. | // updated to match. | ||||||
|  |  | ||||||
| #include <functional> |  | ||||||
| #include <memory> |  | ||||||
| #include <type_traits> |  | ||||||
| #include <utility> |  | ||||||
|  |  | ||||||
| #include "include/base/cef_build.h" |  | ||||||
| #include "include/base/cef_compiler_specific.h" |  | ||||||
| #include "include/base/cef_template_util.h" |  | ||||||
| #include "include/base/internal/cef_bind_internal.h" | #include "include/base/internal/cef_bind_internal.h" | ||||||
|  | #include "include/base/internal/cef_callback_internal.h" | ||||||
|  |  | ||||||
| #if defined(OS_APPLE) && !HAS_FEATURE(objc_arc) | // ----------------------------------------------------------------------------- | ||||||
| #include "include/base/internal/cef_scoped_block_mac.h" | // Usage documentation | ||||||
| #endif | // ----------------------------------------------------------------------------- | ||||||
|  | // | ||||||
|  | // See base/cef_callback.h for documentation. | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // ----------------------------------------------------------------------------- | ||||||
|  | // Implementation notes | ||||||
|  | // ----------------------------------------------------------------------------- | ||||||
|  | // | ||||||
|  | // If you're reading the implementation, before proceeding further, you should | ||||||
|  | // read the top comment of base/bind_internal.h for a definition of common | ||||||
|  | // terms and concepts. | ||||||
|  | // | ||||||
|  | // RETURN TYPES | ||||||
|  | // | ||||||
|  | // Though Bind()'s result is meant to be stored in a Callback<> type, it | ||||||
|  | // cannot actually return the exact type without requiring a large amount | ||||||
|  | // of extra template specializations. The problem is that in order to | ||||||
|  | // discern the correct specialization of Callback<>, Bind would need to | ||||||
|  | // unwrap the function signature to determine the signature's arity, and | ||||||
|  | // whether or not it is a method. | ||||||
|  | // | ||||||
|  | // Each unique combination of (arity, function_type, num_prebound) where | ||||||
|  | // function_type is one of {function, method, const_method} would require | ||||||
|  | // one specialization.  We eventually have to do a similar number of | ||||||
|  | // specializations anyways in the implementation (see the Invoker<>, | ||||||
|  | // classes).  However, it is avoidable in Bind if we return the result | ||||||
|  | // via an indirection like we do below. | ||||||
|  | // | ||||||
|  | // TODO(ajwong): We might be able to avoid this now, but need to test. | ||||||
|  | // | ||||||
|  | // It is possible to move most of the COMPILE_ASSERT asserts into BindState<>, | ||||||
|  | // but it feels a little nicer to have the asserts here so people do not | ||||||
|  | // need to crack open bind_internal.h.  On the other hand, it makes Bind() | ||||||
|  | // harder to read. | ||||||
|  |  | ||||||
| namespace base { | namespace base { | ||||||
|  |  | ||||||
| // Bind as OnceCallback. | template <typename Functor> | ||||||
| template <typename Functor, typename... Args> | base::Callback<typename cef_internal::BindState< | ||||||
| inline OnceCallback<internal::MakeUnboundRunType<Functor, Args...>> BindOnce( |     typename cef_internal::FunctorTraits<Functor>::RunnableType, | ||||||
|     Functor&& functor, |     typename cef_internal::FunctorTraits<Functor>::RunType, | ||||||
|     Args&&... args) { |     void()>::UnboundRunType> | ||||||
|   static_assert(!internal::IsOnceCallback<std::decay_t<Functor>>() || | Bind(Functor functor) { | ||||||
|                     (std::is_rvalue_reference<Functor&&>() && |   // Typedefs for how to store and run the functor. | ||||||
|                      !std::is_const<std::remove_reference_t<Functor>>()), |   typedef | ||||||
|                 "BindOnce requires non-const rvalue for OnceCallback binding." |       typename cef_internal::FunctorTraits<Functor>::RunnableType RunnableType; | ||||||
|                 " I.e.: base::BindOnce(std::move(callback))."); |   typedef typename cef_internal::FunctorTraits<Functor>::RunType RunType; | ||||||
|   static_assert( |  | ||||||
|       conjunction< |  | ||||||
|           internal::AssertBindArgIsNotBasePassed<std::decay_t<Args>>...>::value, |  | ||||||
|       "Use std::move() instead of base::Passed() with base::BindOnce()"); |  | ||||||
|  |  | ||||||
|   return internal::BindImpl<OnceCallback>(std::forward<Functor>(functor), |   typedef cef_internal::BindState<RunnableType, RunType, void()> BindState; | ||||||
|                                           std::forward<Args>(args)...); |  | ||||||
|  |   return Callback<typename BindState::UnboundRunType>( | ||||||
|  |       new BindState(cef_internal::MakeRunnable(functor))); | ||||||
| } | } | ||||||
|  |  | ||||||
| // Bind as RepeatingCallback. | template <typename Functor, typename P1> | ||||||
| template <typename Functor, typename... Args> | base::Callback<typename cef_internal::BindState< | ||||||
| inline RepeatingCallback<internal::MakeUnboundRunType<Functor, Args...>> |     typename cef_internal::FunctorTraits<Functor>::RunnableType, | ||||||
| BindRepeating(Functor&& functor, Args&&... args) { |     typename cef_internal::FunctorTraits<Functor>::RunType, | ||||||
|   static_assert( |     void(typename cef_internal::CallbackParamTraits<P1>::StorageType)>:: | ||||||
|       !internal::IsOnceCallback<std::decay_t<Functor>>(), |                    UnboundRunType> | ||||||
|       "BindRepeating cannot bind OnceCallback. Use BindOnce with std::move()."); | 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; | ||||||
|  |  | ||||||
|   return internal::BindImpl<RepeatingCallback>(std::forward<Functor>(functor), |   // Use RunnableType::RunType instead of RunType above because our | ||||||
|                                                std::forward<Args>(args)...); |   // 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)); | ||||||
| } | } | ||||||
|  |  | ||||||
| // Special cases for binding to a base::Callback without extra bound arguments. | template <typename Functor, typename P1, typename P2> | ||||||
| // We CHECK() the validity of callback to guard against null pointers | base::Callback<typename cef_internal::BindState< | ||||||
| // accidentally ending up in posted tasks, causing hard-to-debug crashes. |     typename cef_internal::FunctorTraits<Functor>::RunnableType, | ||||||
| template <typename Signature> |     typename cef_internal::FunctorTraits<Functor>::RunType, | ||||||
| OnceCallback<Signature> BindOnce(OnceCallback<Signature> callback) { |     void(typename cef_internal::CallbackParamTraits<P1>::StorageType, | ||||||
|   CHECK(callback); |          typename cef_internal::CallbackParamTraits<P2>::StorageType)>:: | ||||||
|   return callback; |                    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)); | ||||||
| } | } | ||||||
|  |  | ||||||
| template <typename Signature> | template <typename Functor, typename P1, typename P2, typename P3> | ||||||
| OnceCallback<Signature> BindOnce(RepeatingCallback<Signature> callback) { | base::Callback<typename cef_internal::BindState< | ||||||
|   CHECK(callback); |     typename cef_internal::FunctorTraits<Functor>::RunnableType, | ||||||
|   return callback; |     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> | template <typename Functor, typename P1, typename P2, typename P3, typename P4> | ||||||
| RepeatingCallback<Signature> BindRepeating( | base::Callback<typename cef_internal::BindState< | ||||||
|     RepeatingCallback<Signature> callback) { |     typename cef_internal::FunctorTraits<Functor>::RunnableType, | ||||||
|   CHECK(callback); |     typename cef_internal::FunctorTraits<Functor>::RunType, | ||||||
|   return callback; |     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)); | ||||||
| } | } | ||||||
|  |  | ||||||
| // Unretained() allows binding a non-refcounted class, and to disable | template <typename Functor, | ||||||
| // refcounting on arguments that are refcounted objects. |           typename P1, | ||||||
| // |           typename P2, | ||||||
| // EXAMPLE OF Unretained(): |           typename P3, | ||||||
| // |           typename P4, | ||||||
| //   class Foo { |           typename P5> | ||||||
| //    public: | base::Callback<typename cef_internal::BindState< | ||||||
| //     void func() { cout << "Foo:f" << endl; } |     typename cef_internal::FunctorTraits<Functor>::RunnableType, | ||||||
| //   }; |     typename cef_internal::FunctorTraits<Functor>::RunType, | ||||||
| // |     void(typename cef_internal::CallbackParamTraits<P1>::StorageType, | ||||||
| //   // In some function somewhere. |          typename cef_internal::CallbackParamTraits<P2>::StorageType, | ||||||
| //   Foo foo; |          typename cef_internal::CallbackParamTraits<P3>::StorageType, | ||||||
| //   OnceClosure foo_callback = |          typename cef_internal::CallbackParamTraits<P4>::StorageType, | ||||||
| //       BindOnce(&Foo::func, Unretained(&foo)); |          typename cef_internal::CallbackParamTraits<P5>::StorageType)>:: | ||||||
| //   std::move(foo_callback).Run();  // Prints "Foo:f". |                    UnboundRunType> | ||||||
| // | Bind(Functor functor, | ||||||
| // Without the Unretained() wrapper on |&foo|, the above call would fail |      const P1& p1, | ||||||
| // to compile because Foo does not support the AddRef() and Release() methods. |      const P2& p2, | ||||||
| template <typename T> |      const P3& p3, | ||||||
| inline internal::UnretainedWrapper<T> Unretained(T* o) { |      const P4& p4, | ||||||
|   return internal::UnretainedWrapper<T>(o); |      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)); | ||||||
| } | } | ||||||
|  |  | ||||||
| // RetainedRef() accepts a ref counted object and retains a reference to it. | template <typename Functor, | ||||||
| // When the callback is called, the object is passed as a raw pointer. |           typename P1, | ||||||
| // |           typename P2, | ||||||
| // EXAMPLE OF RetainedRef(): |           typename P3, | ||||||
| // |           typename P4, | ||||||
| //    void foo(RefCountedBytes* bytes) {} |           typename P5, | ||||||
| // |           typename P6> | ||||||
| //    scoped_refptr<RefCountedBytes> bytes = ...; | base::Callback<typename cef_internal::BindState< | ||||||
| //    OnceClosure callback = BindOnce(&foo, base::RetainedRef(bytes)); |     typename cef_internal::FunctorTraits<Functor>::RunnableType, | ||||||
| //    std::move(callback).Run(); |     typename cef_internal::FunctorTraits<Functor>::RunType, | ||||||
| // |     void(typename cef_internal::CallbackParamTraits<P1>::StorageType, | ||||||
| // Without RetainedRef, the scoped_refptr would try to implicitly convert to |          typename cef_internal::CallbackParamTraits<P2>::StorageType, | ||||||
| // a raw pointer and fail compilation: |          typename cef_internal::CallbackParamTraits<P3>::StorageType, | ||||||
| // |          typename cef_internal::CallbackParamTraits<P4>::StorageType, | ||||||
| //    OnceClosure callback = BindOnce(&foo, bytes); // ERROR! |          typename cef_internal::CallbackParamTraits<P5>::StorageType, | ||||||
| template <typename T> |          typename cef_internal::CallbackParamTraits<P6>::StorageType)>:: | ||||||
| inline internal::RetainedRefWrapper<T> RetainedRef(T* o) { |                    UnboundRunType> | ||||||
|   return internal::RetainedRefWrapper<T>(o); | Bind(Functor functor, | ||||||
| } |      const P1& p1, | ||||||
| template <typename T> |      const P2& p2, | ||||||
| inline internal::RetainedRefWrapper<T> RetainedRef(scoped_refptr<T> o) { |      const P3& p3, | ||||||
|   return internal::RetainedRefWrapper<T>(std::move(o)); |      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)); | ||||||
| } | } | ||||||
|  |  | ||||||
| // Owned() transfers ownership of an object to the callback resulting from | template <typename Functor, | ||||||
| // bind; the object will be deleted when the callback is deleted. |           typename P1, | ||||||
| // |           typename P2, | ||||||
| // EXAMPLE OF Owned(): |           typename P3, | ||||||
| // |           typename P4, | ||||||
| //   void foo(int* arg) { cout << *arg << endl } |           typename P5, | ||||||
| // |           typename P6, | ||||||
| //   int* pn = new int(1); |           typename P7> | ||||||
| //   RepeatingClosure foo_callback = BindRepeating(&foo, Owned(pn)); | base::Callback<typename cef_internal::BindState< | ||||||
| // |     typename cef_internal::FunctorTraits<Functor>::RunnableType, | ||||||
| //   foo_callback.Run();  // Prints "1" |     typename cef_internal::FunctorTraits<Functor>::RunType, | ||||||
| //   foo_callback.Run();  // Prints "1" |     void(typename cef_internal::CallbackParamTraits<P1>::StorageType, | ||||||
| //   *pn = 2; |          typename cef_internal::CallbackParamTraits<P2>::StorageType, | ||||||
| //   foo_callback.Run();  // Prints "2" |          typename cef_internal::CallbackParamTraits<P3>::StorageType, | ||||||
| // |          typename cef_internal::CallbackParamTraits<P4>::StorageType, | ||||||
| //   foo_callback.Reset();  // |pn| is deleted.  Also will happen when |          typename cef_internal::CallbackParamTraits<P5>::StorageType, | ||||||
| //                          // |foo_callback| goes out of scope. |          typename cef_internal::CallbackParamTraits<P6>::StorageType, | ||||||
| // |          typename cef_internal::CallbackParamTraits<P7>::StorageType)>:: | ||||||
| // Without Owned(), someone would have to know to delete |pn| when the last |                    UnboundRunType> | ||||||
| // reference to the callback is deleted. | Bind(Functor functor, | ||||||
| template <typename T> |      const P1& p1, | ||||||
| inline internal::OwnedWrapper<T> Owned(T* o) { |      const P2& p2, | ||||||
|   return internal::OwnedWrapper<T>(o); |      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; | ||||||
|  |  | ||||||
| template <typename T, typename Deleter> |   // Use RunnableType::RunType instead of RunType above because our | ||||||
| inline internal::OwnedWrapper<T, Deleter> Owned( |   // checks should below for bound references need to know what the actual | ||||||
|     std::unique_ptr<T, Deleter>&& ptr) { |   // functor is going to interpret the argument as. | ||||||
|   return internal::OwnedWrapper<T, Deleter>(std::move(ptr)); |   typedef cef_internal::FunctionTraits<typename RunnableType::RunType> | ||||||
| } |       BoundFunctorTraits; | ||||||
|  |  | ||||||
| // OwnedRef() stores an object in the callback resulting from |   // Do not allow binding a non-const reference parameter. Non-const reference | ||||||
| // bind and passes a reference to the object to the bound function. |   // parameters are disallowed by the Google style guide.  Also, binding a | ||||||
| // |   // non-const reference parameter can make for subtle bugs because the | ||||||
| // EXAMPLE OF OwnedRef(): |   // invoked function will receive a reference to the stored copy of the | ||||||
| // |   // argument and not the original. | ||||||
| //   void foo(int& arg) { cout << ++arg << endl } |   COMPILE_ASSERT( | ||||||
| // |       !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value || | ||||||
| //   int counter = 0; |         is_non_const_reference<typename BoundFunctorTraits::A2Type>::value || | ||||||
| //   RepeatingClosure foo_callback = BindRepeating(&foo, OwnedRef(counter)); |         is_non_const_reference<typename BoundFunctorTraits::A3Type>::value || | ||||||
| // |         is_non_const_reference<typename BoundFunctorTraits::A4Type>::value || | ||||||
| //   foo_callback.Run();  // Prints "1" |         is_non_const_reference<typename BoundFunctorTraits::A5Type>::value || | ||||||
| //   foo_callback.Run();  // Prints "2" |         is_non_const_reference<typename BoundFunctorTraits::A6Type>::value || | ||||||
| //   foo_callback.Run();  // Prints "3" |         is_non_const_reference<typename BoundFunctorTraits::A7Type>::value), | ||||||
| // |       do_not_bind_functions_with_nonconst_ref); | ||||||
| //   cout << counter;     // Prints "0", OwnedRef creates a copy of counter. |  | ||||||
| // |  | ||||||
| //  Supports OnceCallbacks as well, useful to pass placeholder arguments: |  | ||||||
| // |  | ||||||
| //   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" |  | ||||||
| // |  | ||||||
| // Without OwnedRef() it would not be possible to pass a mutable reference to an |  | ||||||
| // object owned by the callback. |  | ||||||
| template <typename T> |  | ||||||
| internal::OwnedRefWrapper<std::decay_t<T>> OwnedRef(T&& t) { |  | ||||||
|   return internal::OwnedRefWrapper<std::decay_t<T>>(std::forward<T>(t)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Passed() is for transferring movable-but-not-copyable types (eg. unique_ptr) |   // For methods, we need to be careful for parameter 1.  We do not require | ||||||
| // through a RepeatingCallback. Logically, this signifies a destructive transfer |   // a scoped_refptr because BindState<> itself takes care of AddRef() for | ||||||
| // of the state of the argument into the target function. Invoking |   // methods. We also disallow binding of an array as the method's target | ||||||
| // RepeatingCallback::Run() twice on a callback that was created with a Passed() |   // object. | ||||||
| // argument will CHECK() because the first invocation would have already |   COMPILE_ASSERT(cef_internal::HasIsMethodTag<RunnableType>::value || | ||||||
| // transferred ownership to the target function. |                      !cef_internal::NeedsScopedRefptrButGetsRawPtr<P1>::value, | ||||||
| // |                  p1_is_refcounted_type_and_needs_scoped_refptr); | ||||||
| // Note that Passed() is not necessary with BindOnce(), as std::move() does the |   COMPILE_ASSERT(!cef_internal::HasIsMethodTag<RunnableType>::value || | ||||||
| // same thing. Avoid Passed() in favor of std::move() with BindOnce(). |                      !is_array<P1>::value, | ||||||
| // |                  first_bound_argument_to_method_cannot_be_array); | ||||||
| // EXAMPLE OF Passed(): |   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P2>::value, | ||||||
| // |                  p2_is_refcounted_type_and_needs_scoped_refptr); | ||||||
| //   void TakesOwnership(std::unique_ptr<Foo> arg) { } |   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P3>::value, | ||||||
| //   std::unique_ptr<Foo> CreateFoo() { return std::make_unique<Foo>(); |                  p3_is_refcounted_type_and_needs_scoped_refptr); | ||||||
| //   } |   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P4>::value, | ||||||
| // |                  p4_is_refcounted_type_and_needs_scoped_refptr); | ||||||
| //   auto f = std::make_unique<Foo>(); |   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P5>::value, | ||||||
| // |                  p5_is_refcounted_type_and_needs_scoped_refptr); | ||||||
| //   // |cb| is given ownership of Foo(). |f| is now NULL. |   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P6>::value, | ||||||
| //   // You can use std::move(f) in place of &f, but it's more verbose. |                  p6_is_refcounted_type_and_needs_scoped_refptr); | ||||||
| //   RepeatingClosure cb = BindRepeating(&TakesOwnership, Passed(&f)); |   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P7>::value, | ||||||
| // |                  p7_is_refcounted_type_and_needs_scoped_refptr); | ||||||
| //   // Run was never called so |cb| still owns Foo() and deletes |   typedef cef_internal::BindState< | ||||||
| //   // it on Reset(). |       RunnableType, RunType, | ||||||
| //   cb.Reset(); |       void(typename cef_internal::CallbackParamTraits<P1>::StorageType, | ||||||
| // |            typename cef_internal::CallbackParamTraits<P2>::StorageType, | ||||||
| //   // |cb| is given a new Foo created by CreateFoo(). |            typename cef_internal::CallbackParamTraits<P3>::StorageType, | ||||||
| //   cb = BindRepeating(&TakesOwnership, Passed(CreateFoo())); |            typename cef_internal::CallbackParamTraits<P4>::StorageType, | ||||||
| // |            typename cef_internal::CallbackParamTraits<P5>::StorageType, | ||||||
| //   // |arg| in TakesOwnership() is given ownership of Foo(). |cb| |            typename cef_internal::CallbackParamTraits<P6>::StorageType, | ||||||
| //   // no longer owns Foo() and, if reset, would not delete Foo(). |            typename cef_internal::CallbackParamTraits<P7>::StorageType)> | ||||||
| //   cb.Run();  // Foo() is now transferred to |arg| and deleted. |       BindState; | ||||||
| //   cb.Run();  // This CHECK()s since Foo() already been used once. |  | ||||||
| // |  | ||||||
| // 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 internal::PassedWrapper<T> Passed(T&& scoper) { |  | ||||||
|   return internal::PassedWrapper<T>(std::move(scoper)); |  | ||||||
| } |  | ||||||
| template <typename T> |  | ||||||
| inline internal::PassedWrapper<T> Passed(T* scoper) { |  | ||||||
|   return internal::PassedWrapper<T>(std::move(*scoper)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // IgnoreResult() is used to adapt a function or callback with a return type to |   return Callback<typename BindState::UnboundRunType>(new BindState( | ||||||
| // one with a void return. This is most useful if you have a function with, |       cef_internal::MakeRunnable(functor), p1, p2, p3, p4, p5, p6, p7)); | ||||||
| // 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(): |  | ||||||
| // |  | ||||||
| //   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); |  | ||||||
| template <typename T> |  | ||||||
| inline internal::IgnoreResultHelper<T> IgnoreResult(T data) { |  | ||||||
|   return 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(): |  | ||||||
| // |  | ||||||
| //   // 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". |  | ||||||
| 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 | }  // namespace base | ||||||
|  |  | ||||||
| #endif  // !USING_CHROMIUM_INCLUDES | #endif  // !USING_CHROMIUM_INCLUDES | ||||||
|   | |||||||
							
								
								
									
										579
									
								
								include/base/cef_bind_helpers.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										579
									
								
								include/base/cef_bind_helpers.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,579 @@ | |||||||
|  | // 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_ | ||||||
| @@ -27,128 +27,53 @@ | |||||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  | ||||||
| // This file adds defines about the platform we're currently building on. |  | ||||||
| // |  | ||||||
| //  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 |  | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_BASE_CEF_BUILD_H_ | #ifndef CEF_INCLUDE_BASE_CEF_BUILD_H_ | ||||||
| #define CEF_INCLUDE_BASE_CEF_BUILD_H_ | #define CEF_INCLUDE_BASE_CEF_BUILD_H_ | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #if defined(USING_CHROMIUM_INCLUDES) | #if defined(USING_CHROMIUM_INCLUDES) | ||||||
| // When building CEF include the Chromium header directly. | // When building CEF include the Chromium header directly. | ||||||
| #include "build/build_config.h" | #include "base/compiler_specific.h" | ||||||
| #else  // !USING_CHROMIUM_INCLUDES | #else  // !USING_CHROMIUM_INCLUDES | ||||||
| // The following is substantially similar to the Chromium implementation. | // The following is substantially similar to the Chromium implementation. | ||||||
| // If the Chromium implementation diverges the below implementation should be | // If the Chromium implementation diverges the below implementation should be | ||||||
| // updated to match. | // updated to match. | ||||||
|  |  | ||||||
| // A set of macros to use for platform detection. | #if defined(_WIN32) | ||||||
| #if defined(ANDROID) | #ifndef OS_WIN | ||||||
| #define OS_ANDROID 1 |  | ||||||
| #elif defined(__APPLE__) |  | ||||||
| // 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 |  | ||||||
| #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 | #define OS_WIN 1 | ||||||
| #elif defined(__Fuchsia__) | #endif | ||||||
| #define OS_FUCHSIA 1 | #elif defined(__APPLE__) | ||||||
| #elif defined(__FreeBSD__) | #ifndef OS_MACOSX | ||||||
| #define OS_FREEBSD 1 | #define OS_MACOSX 1 | ||||||
| #elif defined(__NetBSD__) | #endif | ||||||
| #define OS_NETBSD 1 | #elif defined(__linux__) | ||||||
| #elif defined(__OpenBSD__) | #ifndef OS_LINUX | ||||||
| #define OS_OPENBSD 1 | #define OS_LINUX 1 | ||||||
| #elif defined(__sun) | #endif | ||||||
| #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 | #else | ||||||
| #error Please add support for your platform in include/base/cef_build.h | #error Please add support for your platform in 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 | #endif | ||||||
|  |  | ||||||
| // For access to standard POSIXish features, use OS_POSIX instead of a | // For access to standard POSIXish features, use OS_POSIX instead of a | ||||||
| // more specific macro. | // more specific macro. | ||||||
| #if defined(OS_AIX) || defined(OS_ANDROID) || defined(OS_ASMJS) ||  \ | #if defined(OS_MACOSX) || defined(OS_LINUX) | ||||||
|     defined(OS_FREEBSD) || defined(OS_IOS) || defined(OS_LINUX) ||  \ | #ifndef OS_POSIX | ||||||
|     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 | #define OS_POSIX 1 | ||||||
| #endif | #endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
| // Compiler detection. Note: clang masquerades as GCC on POSIX and as MSVC on | // Compiler detection. | ||||||
| // Windows. |  | ||||||
| #if defined(__GNUC__) | #if defined(__GNUC__) | ||||||
|  | #ifndef COMPILER_GCC | ||||||
| #define COMPILER_GCC 1 | #define COMPILER_GCC 1 | ||||||
|  | #endif | ||||||
| #elif defined(_MSC_VER) | #elif defined(_MSC_VER) | ||||||
|  | #ifndef COMPILER_MSVC | ||||||
| #define COMPILER_MSVC 1 | #define COMPILER_MSVC 1 | ||||||
|  | #endif | ||||||
| #else | #else | ||||||
| #error Please add support for your compiler in build/build_config.h | #error Please add support for your compiler in cef_build.h | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| // Processor architecture detection.  For more info on what's defined, see: | // Processor architecture detection.  For more info on what's defined, see: | ||||||
| @@ -165,72 +90,31 @@ | |||||||
| #define ARCH_CPU_X86 1 | #define ARCH_CPU_X86 1 | ||||||
| #define ARCH_CPU_32_BITS 1 | #define ARCH_CPU_32_BITS 1 | ||||||
| #define ARCH_CPU_LITTLE_ENDIAN 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__) | #elif defined(__ARMEL__) | ||||||
| #define ARCH_CPU_ARM_FAMILY 1 | #define ARCH_CPU_ARM_FAMILY 1 | ||||||
| #define ARCH_CPU_ARMEL 1 | #define ARCH_CPU_ARMEL 1 | ||||||
| #define ARCH_CPU_32_BITS 1 | #define ARCH_CPU_32_BITS 1 | ||||||
| #define ARCH_CPU_LITTLE_ENDIAN 1 | #define ARCH_CPU_LITTLE_ENDIAN 1 | ||||||
| #elif defined(__aarch64__) || defined(_M_ARM64) | #elif defined(__aarch64__) | ||||||
| #define ARCH_CPU_ARM_FAMILY 1 | #define ARCH_CPU_ARM_FAMILY 1 | ||||||
| #define ARCH_CPU_ARM64 1 | #define ARCH_CPU_ARM64 1 | ||||||
| #define ARCH_CPU_64_BITS 1 | #define ARCH_CPU_64_BITS 1 | ||||||
| #define ARCH_CPU_LITTLE_ENDIAN 1 | #define ARCH_CPU_LITTLE_ENDIAN 1 | ||||||
| #elif defined(__pnacl__) || defined(__asmjs__) || defined(__wasm__) | #elif defined(__pnacl__) | ||||||
| #define ARCH_CPU_32_BITS 1 | #define ARCH_CPU_32_BITS 1 | ||||||
| #define ARCH_CPU_LITTLE_ENDIAN 1 | #define ARCH_CPU_LITTLE_ENDIAN 1 | ||||||
| #elif defined(__MIPSEL__) | #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_MIPS_FAMILY 1 | ||||||
| #define ARCH_CPU_MIPSEL 1 | #define ARCH_CPU_MIPSEL 1 | ||||||
| #define ARCH_CPU_32_BITS 1 | #define ARCH_CPU_32_BITS 1 | ||||||
| #define ARCH_CPU_LITTLE_ENDIAN 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 | #else | ||||||
| #define ARCH_CPU_MIPS_FAMILY 1 | #error Please add support for your architecture in cef_build.h | ||||||
| #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 | #endif | ||||||
|  |  | ||||||
| // Type detection for wchar_t. | // Type detection for wchar_t. | ||||||
| #if defined(OS_WIN) | #if defined(OS_WIN) | ||||||
| #define WCHAR_T_IS_UTF16 | #define WCHAR_T_IS_UTF16 | ||||||
| #elif defined(OS_FUCHSIA) |  | ||||||
| #define WCHAR_T_IS_UTF32 |  | ||||||
| #elif defined(OS_POSIX) && defined(COMPILER_GCC) && defined(__WCHAR_MAX__) && \ | #elif defined(OS_POSIX) && defined(COMPILER_GCC) && defined(__WCHAR_MAX__) && \ | ||||||
|     (__WCHAR_MAX__ == 0x7fffffff || __WCHAR_MAX__ == 0xffffffff) |     (__WCHAR_MAX__ == 0x7fffffff || __WCHAR_MAX__ == 0xffffffff) | ||||||
| #define WCHAR_T_IS_UTF32 | #define WCHAR_T_IS_UTF32 | ||||||
| @@ -242,18 +126,72 @@ | |||||||
| // short wchar works for them. | // short wchar works for them. | ||||||
| #define WCHAR_T_IS_UTF16 | #define WCHAR_T_IS_UTF16 | ||||||
| #else | #else | ||||||
| #error Please add support for your compiler in include/base/cef_build.h | #error Please add support for your compiler in cef_build.h | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #if defined(OS_ANDROID) | // Annotate a function indicating the caller must examine the return value. | ||||||
| // The compiler thinks std::string::const_iterator and "const char*" are | // Use like: | ||||||
| // equivalent types. | //   int foo() WARN_UNUSED_RESULT; | ||||||
| #define STD_STRING_ITERATOR_IS_CHAR_POINTER | // To explicitly ignore a result, see |ignore_result()| in <base/macros.h>. | ||||||
| // The compiler thinks std::u16string::const_iterator and "char16*" are | #ifndef WARN_UNUSED_RESULT | ||||||
| // equivalent types. | #if defined(COMPILER_GCC) | ||||||
| #define BASE_STRING16_ITERATOR_IS_CHAR16_POINTER | #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 | #endif | ||||||
|  |  | ||||||
| #endif  // !USING_CHROMIUM_INCLUDES | #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_ | #endif  // CEF_INCLUDE_BASE_CEF_BUILD_H_ | ||||||
|   | |||||||
| @@ -28,46 +28,16 @@ | |||||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  | ||||||
| // ----------------------------------------------------------------------------- |  | ||||||
| // Usage documentation |  | ||||||
| // ----------------------------------------------------------------------------- |  | ||||||
| // |  | ||||||
| // Overview: |  | ||||||
| // 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. |  | ||||||
| // |  | ||||||
| //   // 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. |  | ||||||
| // |  | ||||||
| // 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/+/HEAD/docs/callback.md |  | ||||||
| // for the full documentation. |  | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_BASE_CEF_CALLBACK_H_ | #ifndef CEF_INCLUDE_BASE_CEF_CALLBACK_H_ | ||||||
| #define CEF_INCLUDE_BASE_CEF_CALLBACK_H_ | #define CEF_INCLUDE_BASE_CEF_CALLBACK_H_ | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #if defined(USING_CHROMIUM_INCLUDES) | #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) | ||||||
| // When building CEF include the Chromium header directly. | // When building CEF include the Chromium header directly. | ||||||
| #include "base/callback.h" | #include "base/callback.h" | ||||||
| #else  // !USING_CHROMIUM_INCLUDES | #else  // !USING_CHROMIUM_INCLUDES | ||||||
| @@ -75,175 +45,755 @@ | |||||||
| // If the Chromium implementation diverges the below implementation should be | // If the Chromium implementation diverges the below implementation should be | ||||||
| // updated to match. | // updated to match. | ||||||
|  |  | ||||||
| #include <stddef.h> |  | ||||||
|  |  | ||||||
| #include "include/base/cef_bind.h" |  | ||||||
| #include "include/base/cef_callback_forward.h" | #include "include/base/cef_callback_forward.h" | ||||||
| #include "include/base/cef_logging.h" | #include "include/base/cef_template_util.h" | ||||||
| #include "include/base/internal/cef_callback_internal.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 { | namespace base { | ||||||
|  |  | ||||||
| template <typename R, typename... Args> | // First, we forward declare the Callback class template. This informs the | ||||||
| class OnceCallback<R(Args...)> : public internal::CallbackBase { | // 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 { | ||||||
|  public: |  public: | ||||||
|   using ResultType = R; |   typedef R(RunType)(); | ||||||
|   using RunType = R(Args...); |  | ||||||
|   using PolymorphicInvoke = R (*)(internal::BindStateBase*, |  | ||||||
|                                   internal::PassingType<Args>...); |  | ||||||
|  |  | ||||||
|   constexpr OnceCallback() = default; |   Callback() : CallbackBase(NULL) {} | ||||||
|   OnceCallback(std::nullptr_t) = delete; |  | ||||||
|  |  | ||||||
|   explicit OnceCallback(internal::BindStateBase* bind_state) |   // Note that this constructor CANNOT be explicit, and that Bind() CANNOT | ||||||
|       : internal::CallbackBase(bind_state) {} |   // return the exact Callback<> type.  See base/bind.h for details. | ||||||
|  |   template <typename Runnable, typename BindRunType, typename BoundArgsType> | ||||||
|   OnceCallback(const OnceCallback&) = delete; |   Callback( | ||||||
|   OnceCallback& operator=(const OnceCallback&) = delete; |       cef_internal::BindState<Runnable, BindRunType, BoundArgsType>* bind_state) | ||||||
|  |       : CallbackBase(bind_state) { | ||||||
|   OnceCallback(OnceCallback&&) noexcept = default; |     // Force the assignment to a local variable of PolymorphicInvoke | ||||||
|   OnceCallback& operator=(OnceCallback&&) noexcept = default; |     // so the compiler will typecheck that the passed in Run() method has | ||||||
|  |     // the correct type. | ||||||
|   OnceCallback(RepeatingCallback<RunType> other) |     PolymorphicInvoke invoke_func = | ||||||
|       : internal::CallbackBase(std::move(other)) {} |         &cef_internal::BindState<Runnable, BindRunType, | ||||||
|  |                                  BoundArgsType>::InvokerType::Run; | ||||||
|   OnceCallback& operator=(RepeatingCallback<RunType> other) { |     polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); | ||||||
|     static_cast<internal::CallbackBase&>(*this) = std::move(other); |  | ||||||
|     return *this; |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   R Run(Args... args) const& { |   bool Equals(const Callback& other) const { | ||||||
|     static_assert(!sizeof(*this), |     return CallbackBase::Equals(other); | ||||||
|                   "OnceCallback::Run() may only be invoked on a non-const " |  | ||||||
|                   "rvalue, i.e. std::move(callback).Run()."); |  | ||||||
|     NOTREACHED(); |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   R Run(Args... args) && { |   R Run() const { | ||||||
|     // 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 = |     PolymorphicInvoke f = | ||||||
|         reinterpret_cast<PolymorphicInvoke>(cb.polymorphic_invoke()); |         reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); | ||||||
|     return f(cb.bind_state_.get(), std::forward<Args>(args)...); |  | ||||||
|  |     return f(bind_state_.get()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // Then() returns a new OnceCallback that receives the same arguments as |  private: | ||||||
|   // |this|, and with the return type of |then|. The returned callback will: |   typedef R (*PolymorphicInvoke)(cef_internal::BindStateBase*); | ||||||
|   // 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( |  | ||||||
|         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( |  | ||||||
|         internal::ThenHelper< |  | ||||||
|             OnceCallback, |  | ||||||
|             RepeatingCallback<ThenR(ThenArgs...)>>::CreateTrampoline(), |  | ||||||
|         std::move(*this), std::move(then)); |  | ||||||
|   } |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| template <typename R, typename... Args> | template <typename R, typename A1> | ||||||
| class RepeatingCallback<R(Args...)> : public internal::CallbackBaseCopyable { | class Callback<R(A1)> : public cef_internal::CallbackBase { | ||||||
|  public: |  public: | ||||||
|   using ResultType = R; |   typedef R(RunType)(A1); | ||||||
|   using RunType = R(Args...); |  | ||||||
|   using PolymorphicInvoke = R (*)(internal::BindStateBase*, |  | ||||||
|                                   internal::PassingType<Args>...); |  | ||||||
|  |  | ||||||
|   constexpr RepeatingCallback() = default; |   Callback() : CallbackBase(NULL) {} | ||||||
|   RepeatingCallback(std::nullptr_t) = delete; |  | ||||||
|  |  | ||||||
|   explicit RepeatingCallback(internal::BindStateBase* bind_state) |   // Note that this constructor CANNOT be explicit, and that Bind() CANNOT | ||||||
|       : internal::CallbackBaseCopyable(bind_state) {} |   // return the exact Callback<> type.  See base/bind.h for details. | ||||||
|  |   template <typename Runnable, typename BindRunType, typename BoundArgsType> | ||||||
|   // Copyable and movable. |   Callback( | ||||||
|   RepeatingCallback(const RepeatingCallback&) = default; |       cef_internal::BindState<Runnable, BindRunType, BoundArgsType>* bind_state) | ||||||
|   RepeatingCallback& operator=(const RepeatingCallback&) = default; |       : CallbackBase(bind_state) { | ||||||
|   RepeatingCallback(RepeatingCallback&&) noexcept = default; |     // Force the assignment to a local variable of PolymorphicInvoke | ||||||
|   RepeatingCallback& operator=(RepeatingCallback&&) noexcept = default; |     // so the compiler will typecheck that the passed in Run() method has | ||||||
|  |     // the correct type. | ||||||
|   bool operator==(const RepeatingCallback& other) const { |     PolymorphicInvoke invoke_func = | ||||||
|     return EqualsInternal(other); |         &cef_internal::BindState<Runnable, BindRunType, | ||||||
|  |                                  BoundArgsType>::InvokerType::Run; | ||||||
|  |     polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   bool operator!=(const RepeatingCallback& other) const { |   bool Equals(const Callback& other) const { | ||||||
|     return !operator==(other); |     return CallbackBase::Equals(other); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   R Run(Args... args) const& { |   R Run(typename cef_internal::CallbackParamTraits<A1>::ForwardType a1) const { | ||||||
|     PolymorphicInvoke f = |     PolymorphicInvoke f = | ||||||
|         reinterpret_cast<PolymorphicInvoke>(this->polymorphic_invoke()); |         reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); | ||||||
|     return f(this->bind_state_.get(), std::forward<Args>(args)...); |  | ||||||
|  |     return f(bind_state_.get(), cef_internal::CallbackForward(a1)); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   R Run(Args... args) && { |  private: | ||||||
|     // Move the callback instance into a local variable before the invocation, |   typedef R (*PolymorphicInvoke)( | ||||||
|     // that ensures the internal state is cleared after the invocation. |       cef_internal::BindStateBase*, | ||||||
|     // It's not safe to touch |this| after the invocation, since running the |       typename cef_internal::CallbackParamTraits<A1>::ForwardType); | ||||||
|     // bound function may destroy |this|. |  | ||||||
|     RepeatingCallback cb = std::move(*this); |  | ||||||
|     PolymorphicInvoke f = |  | ||||||
|         reinterpret_cast<PolymorphicInvoke>(cb.polymorphic_invoke()); |  | ||||||
|     return f(std::move(cb).bind_state_.get(), std::forward<Args>(args)...); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // 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( |  | ||||||
|         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( |  | ||||||
|         internal::ThenHelper< |  | ||||||
|             RepeatingCallback, |  | ||||||
|             RepeatingCallback<ThenR(ThenArgs...)>>::CreateTrampoline(), |  | ||||||
|         std::move(*this), std::move(then)); |  | ||||||
|   } |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | 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 { | ||||||
|  |     PolymorphicInvoke f = | ||||||
|  |         reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); | ||||||
|  |  | ||||||
|  |     return f(bind_state_.get(), cef_internal::CallbackForward(a1), | ||||||
|  |              cef_internal::CallbackForward(a2)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |  private: | ||||||
|  |   typedef R (*PolymorphicInvoke)( | ||||||
|  |       cef_internal::BindStateBase*, | ||||||
|  |       typename cef_internal::CallbackParamTraits<A1>::ForwardType, | ||||||
|  |       typename cef_internal::CallbackParamTraits<A2>::ForwardType); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | 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 | }  // namespace base | ||||||
|  |  | ||||||
| #endif  // !USING_CHROMIUM_INCLUDES | #endif  // !USING_CHROMIUM_INCLUDES | ||||||
|   | |||||||
| @@ -32,7 +32,12 @@ | |||||||
| #define INCLUDE_BASE_CEF_CALLBACK_FORWARD_H_ | #define INCLUDE_BASE_CEF_CALLBACK_FORWARD_H_ | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #if defined(USING_CHROMIUM_INCLUDES) | #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) | ||||||
| // When building CEF include the Chromium header directly. | // When building CEF include the Chromium header directly. | ||||||
| #include "base/callback_forward.h" | #include "base/callback_forward.h" | ||||||
| #else  // !USING_CHROMIUM_INCLUDES | #else  // !USING_CHROMIUM_INCLUDES | ||||||
| @@ -42,17 +47,10 @@ | |||||||
|  |  | ||||||
| namespace base { | namespace base { | ||||||
|  |  | ||||||
| template <typename Signature> | template <typename Sig> | ||||||
| class OnceCallback; | class Callback; | ||||||
|  |  | ||||||
| template <typename Signature> | typedef Callback<void(void)> Closure; | ||||||
| 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 | }  // namespace base | ||||||
|  |  | ||||||
|   | |||||||
| @@ -32,12 +32,21 @@ | |||||||
| // are implemented using templates, with a class per callback signature, adding | // are implemented using templates, with a class per callback signature, adding | ||||||
| // methods to Callback<> itself is unattractive (lots of extra code gets | // methods to Callback<> itself is unattractive (lots of extra code gets | ||||||
| // generated).  Instead, consider adding methods here. | // 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_ | #ifndef CEF_INCLUDE_BASE_CEF_CALLBACK_HELPERS_H_ | ||||||
| #define CEF_INCLUDE_BASE_CEF_CALLBACK_HELPERS_H_ | #define CEF_INCLUDE_BASE_CEF_CALLBACK_HELPERS_H_ | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #if defined(USING_CHROMIUM_INCLUDES) | #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) | ||||||
| // When building CEF include the Chromium header directly. | // When building CEF include the Chromium header directly. | ||||||
| #include "base/callback_helpers.h" | #include "base/callback_helpers.h" | ||||||
| #else  // !USING_CHROMIUM_INCLUDES | #else  // !USING_CHROMIUM_INCLUDES | ||||||
| @@ -45,195 +54,38 @@ | |||||||
| // If the Chromium implementation diverges the below implementation should be | // If the Chromium implementation diverges the below implementation should be | ||||||
| // updated to match. | // updated to match. | ||||||
|  |  | ||||||
| #include <atomic> | #include "include/base/cef_basictypes.h" | ||||||
| #include <memory> | #include "include/base/cef_build.h" | ||||||
| #include <type_traits> |  | ||||||
| #include <utility> |  | ||||||
|  |  | ||||||
| #include "include/base/cef_bind.h" |  | ||||||
| #include "include/base/cef_callback.h" | #include "include/base/cef_callback.h" | ||||||
| #include "include/base/cef_compiler_specific.h" | #include "include/base/cef_macros.h" | ||||||
| #include "include/base/cef_logging.h" |  | ||||||
|  |  | ||||||
| namespace base { | namespace base { | ||||||
|  |  | ||||||
| namespace internal { | template <typename Sig> | ||||||
|  | base::Callback<Sig> ResetAndReturn(base::Callback<Sig>* cb) { | ||||||
| template <typename T> |   base::Callback<Sig> ret(*cb); | ||||||
| struct IsBaseCallbackImpl : std::false_type {}; |   cb->Reset(); | ||||||
|  |   return ret; | ||||||
| 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: |  | ||||||
| // template <template <typename> class CallbackType, |  | ||||||
| //           ... other template args ..., |  | ||||||
| //           typename = EnableIfIsBaseCallback<CallbackType>> |  | ||||||
| // void DoStuff(CallbackType<...> cb, ...); |  | ||||||
| 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)); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // Wraps the given OnceCallback and returns two OnceCallbacks with an identical | // ScopedClosureRunner is akin to scoped_ptr for Closures. It ensures that the | ||||||
| // signature. On first invokation of either returned callbacks, the original | // Closure is executed and deleted no matter how the current scope exits. | ||||||
| // 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 { | class ScopedClosureRunner { | ||||||
|  public: |  public: | ||||||
|   ScopedClosureRunner(); |   ScopedClosureRunner(); | ||||||
|   explicit ScopedClosureRunner(OnceClosure closure); |   explicit ScopedClosureRunner(const Closure& 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(); |   ~ScopedClosureRunner(); | ||||||
|  |  | ||||||
|   explicit operator bool() const { return !!closure_; } |   void Reset(); | ||||||
|  |   void Reset(const Closure& closure); | ||||||
|   // Calls the current closure and resets it, so it wont be called again. |   Closure Release() WARN_UNUSED_RESULT; | ||||||
|   void RunAndReset(); |  | ||||||
|  |  | ||||||
|   // Replaces closure with the new one releasing the old one without calling it. |  | ||||||
|   void ReplaceClosure(OnceClosure closure); |  | ||||||
|  |  | ||||||
|   // Releases the Closure without calling. |  | ||||||
|   OnceClosure Release() WARN_UNUSED_RESULT; |  | ||||||
|  |  | ||||||
|  private: |  private: | ||||||
|   OnceClosure closure_; |   Closure closure_; | ||||||
| }; |  | ||||||
|  |  | ||||||
| // Creates a null callback. |   DISALLOW_COPY_AND_ASSIGN(ScopedClosureRunner); | ||||||
| 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 | }  // namespace base | ||||||
|  |  | ||||||
| #endif  // !USING_CHROMIUM_INCLUDES | #endif  // !USING_CHROMIUM_INCLUDES | ||||||
|   | |||||||
| @@ -28,60 +28,16 @@ | |||||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  | ||||||
| // OVERVIEW: |  | ||||||
| // |  | ||||||
| // 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: |  | ||||||
| // |  | ||||||
| // 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))); |  | ||||||
| // }; |  | ||||||
| // |  | ||||||
| // UNSUPPORTED: |  | ||||||
| // |  | ||||||
| // * Destroying the CallbackList during callback notification. |  | ||||||
| // |  | ||||||
| // This is possible to support, but not currently necessary. |  | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_BASE_CEF_CALLBACK_LIST_H_ | #ifndef CEF_INCLUDE_BASE_CEF_CALLBACK_LIST_H_ | ||||||
| #define CEF_INCLUDE_BASE_CEF_CALLBACK_LIST_H_ | #define CEF_INCLUDE_BASE_CEF_CALLBACK_LIST_H_ | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #if defined(USING_CHROMIUM_INCLUDES) | #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) | ||||||
| // When building CEF include the Chromium header directly. | // When building CEF include the Chromium header directly. | ||||||
| #include "base/callback_list.h" | #include "base/callback_list.h" | ||||||
| #else  // !USING_CHROMIUM_INCLUDES | #else  // !USING_CHROMIUM_INCLUDES | ||||||
| @@ -89,304 +45,402 @@ | |||||||
| // If the Chromium implementation diverges the below implementation should be | // If the Chromium implementation diverges the below implementation should be | ||||||
| // updated to match. | // updated to match. | ||||||
|  |  | ||||||
| #include <algorithm> |  | ||||||
| #include <list> | #include <list> | ||||||
| #include <memory> |  | ||||||
| #include <utility> |  | ||||||
|  |  | ||||||
| #include "include/base/cef_auto_reset.h" | #include "include/base/cef_basictypes.h" | ||||||
| #include "include/base/cef_bind.h" | #include "include/base/cef_build.h" | ||||||
| #include "include/base/cef_callback.h" | #include "include/base/cef_callback.h" | ||||||
| #include "include/base/cef_callback_helpers.h" |  | ||||||
| #include "include/base/cef_compiler_specific.h" |  | ||||||
| #include "include/base/cef_logging.h" | #include "include/base/cef_logging.h" | ||||||
| #include "include/base/cef_weak_ptr.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); | ||||||
|  | // }; | ||||||
|  |  | ||||||
| namespace base { | namespace base { | ||||||
| namespace internal { |  | ||||||
| template <typename CallbackListImpl> |  | ||||||
| class CallbackListBase; |  | ||||||
| }  // namespace internal |  | ||||||
|  |  | ||||||
| template <typename Signature> | namespace cef_internal { | ||||||
| class OnceCallbackList; |  | ||||||
|  |  | ||||||
| template <typename Signature> | template <typename CallbackType> | ||||||
| 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 { | class CallbackListBase { | ||||||
|  public: |  public: | ||||||
|   using CallbackType = |   class Subscription { | ||||||
|       typename CallbackListTraits<CallbackListImpl>::CallbackType; |    public: | ||||||
|   static_assert(IsBaseCallback<CallbackType>::value, ""); |     Subscription(CallbackListBase<CallbackType>* list, | ||||||
|  |                  typename std::list<CallbackType>::iterator iter) | ||||||
|  |         : list_(list), iter_(iter) {} | ||||||
|  |  | ||||||
|   // TODO(crbug.com/1103086): Update references to use this directly and by |     ~Subscription() { | ||||||
|   // value, then remove. |       if (list_->active_iterator_count_) { | ||||||
|   using Subscription = CallbackListSubscription; |         iter_->Reset(); | ||||||
|  |       } else { | ||||||
|   CallbackListBase() = default; |         list_->callbacks_.erase(iter_); | ||||||
|   CallbackListBase(const CallbackListBase&) = delete; |         if (!list_->removal_callback_.is_null()) | ||||||
|   CallbackListBase& operator=(const CallbackListBase&) = delete; |           list_->removal_callback_.Run(); | ||||||
|  |       } | ||||||
|   ~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|. |  | ||||||
|   CallbackListSubscription Add(CallbackType cb) WARN_UNUSED_RESULT { |  | ||||||
|     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...); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // Re-entrant invocations shouldn't prune anything from the list. This can |    private: | ||||||
|     // invalidate iterators from underneath higher call frames. It's safe to |     CallbackListBase<CallbackType>* list_; | ||||||
|     // simply do nothing, since the outermost frame will continue through here |     typename std::list<CallbackType>::iterator iter_; | ||||||
|     // and prune all null callbacks below. |  | ||||||
|     if (iterating_) |  | ||||||
|       return; |  | ||||||
|  |  | ||||||
|     // Any null callbacks remaining in the list were canceled due to |     DISALLOW_COPY_AND_ASSIGN(Subscription); | ||||||
|     // Subscription destruction during iteration, and can safely be erased now. |   }; | ||||||
|     const size_t erased_callbacks = |  | ||||||
|         EraseIf(callbacks_, [](const auto& cb) { return cb.is_null(); }); |  | ||||||
|  |  | ||||||
|     // Run |removal_callback_| if any callbacks were canceled. Note that we |   // Add a callback to the list. The callback will remain registered until the | ||||||
|     // cannot simply compare list sizes before and after iterating, since |   // returned Subscription is destroyed, which must occur before the | ||||||
|     // notification may result in Add()ing new callbacks as well as canceling |   // CallbackList is destroyed. | ||||||
|     // them. Also note that if this is a OnceCallbackList, the OnceCallbacks |   scoped_ptr<Subscription> Add(const CallbackType& cb) WARN_UNUSED_RESULT { | ||||||
|     // that were executed above have all been removed regardless of whether |     DCHECK(!cb.is_null()); | ||||||
|     // they're counted in |erased_callbacks_|. |     return scoped_ptr<Subscription>( | ||||||
|     if (removal_callback_ && |         new Subscription(this, callbacks_.insert(callbacks_.end(), cb))); | ||||||
|         (erased_callbacks || IsOnceCallback<CallbackType>::value)) |   } | ||||||
|       removal_callback_.Run();  // May delete |this|! |  | ||||||
|  |   // 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(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  protected: |  protected: | ||||||
|   using Callbacks = typename CallbackListTraits<CallbackListImpl>::Callbacks; |   // 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_; | ||||||
|  |     } | ||||||
|  |  | ||||||
|   // Holds non-null callbacks, which will be called during Notify(). |     Iterator(const Iterator& iter) | ||||||
|   Callbacks callbacks_; |         : list_(iter.list_), list_iter_(iter.list_iter_) { | ||||||
|  |       ++list_->active_iterator_count_; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  private: |     ~Iterator() { | ||||||
|   // Cancels the callback pointed to by |it|, which is guaranteed to be valid. |       if (list_ && --list_->active_iterator_count_ == 0) { | ||||||
|   void CancelCallback(const typename Callbacks::iterator& it) { |         list_->Compact(); | ||||||
|     if (static_cast<CallbackListImpl*>(this)->CancelNullCallback(it)) |       } | ||||||
|       return; |     } | ||||||
|  |  | ||||||
|     if (iterating_) { |     CallbackType* GetNext() { | ||||||
|       // Calling erase() here is unsafe, since the loop in Notify() may be |       while ((list_iter_ != list_->callbacks_.end()) && list_iter_->is_null()) | ||||||
|       // referencing this same iterator, e.g. if adjacent callbacks' |         ++list_iter_; | ||||||
|       // Subscriptions are both destroyed when the first one is Run().  Just |  | ||||||
|       // reset the callback and let Notify() clean it up at the end. |       CallbackType* cb = NULL; | ||||||
|       it->Reset(); |       if (list_iter_ != list_->callbacks_.end()) { | ||||||
|     } else { |         cb = &(*list_iter_); | ||||||
|       callbacks_.erase(it); |         ++list_iter_; | ||||||
|       if (removal_callback_) |       } | ||||||
|         removal_callback_.Run();  // May delete |this|! |       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); } | ||||||
|  |  | ||||||
|  |   // 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; | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       if (updated && !removal_callback_.is_null()) | ||||||
|  |         removal_callback_.Run(); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // Set while Notify() is traversing |callbacks_|.  Used primarily to avoid |  private: | ||||||
|   // invalidating iterators that may be in use. |   std::list<CallbackType> callbacks_; | ||||||
|   bool iterating_ = false; |   int active_iterator_count_; | ||||||
|  |   Closure removal_callback_; | ||||||
|  |  | ||||||
|   // Called after elements are removed from |callbacks_|. |   DISALLOW_COPY_AND_ASSIGN(CallbackListBase); | ||||||
|   RepeatingClosure removal_callback_; |  | ||||||
|  |  | ||||||
|   WeakPtrFactory<CallbackListBase> weak_ptr_factory_{this}; |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| }  // namespace internal | }  // namespace cef_internal | ||||||
|  |  | ||||||
| template <typename Signature> | template <typename Sig> | ||||||
| class OnceCallbackList | class CallbackList; | ||||||
|     : public internal::CallbackListBase<OnceCallbackList<Signature>> { |  | ||||||
|  private: |  | ||||||
|   friend internal::CallbackListBase<OnceCallbackList>; |  | ||||||
|   using Traits = internal::CallbackListTraits<OnceCallbackList>; |  | ||||||
|  |  | ||||||
|   // Runs the current callback, which may cancel it or any other callbacks. | template <> | ||||||
|   template <typename... RunArgs> | class CallbackList<void(void)> | ||||||
|   void RunCallback(typename Traits::Callbacks::iterator it, RunArgs&&... args) { |     : public cef_internal::CallbackListBase<Callback<void(void)>> { | ||||||
|     // OnceCallbacks still have Subscriptions with outstanding iterators; |  public: | ||||||
|     // splice() removes them from |callbacks_| without invalidating those. |   typedef Callback<void(void)> CallbackType; | ||||||
|     null_callbacks_.splice(null_callbacks_.end(), this->callbacks_, it); |  | ||||||
|  |  | ||||||
|     // NOTE: Intentionally does not call std::forward<RunArgs>(args)...; see |   CallbackList() {} | ||||||
|     // comments in Notify(). |  | ||||||
|     std::move(*it).Run(args...); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // If |it| refers to an already-canceled callback, does any necessary cleanup |   void Notify() { | ||||||
|   // and returns true.  Otherwise returns false. |     cef_internal::CallbackListBase<CallbackType>::Iterator it = | ||||||
|   bool CancelNullCallback(const typename Traits::Callbacks::iterator& it) { |         this->GetIterator(); | ||||||
|     if (it->is_null()) { |     CallbackType* cb; | ||||||
|       null_callbacks_.erase(it); |     while ((cb = it.GetNext()) != NULL) { | ||||||
|       return true; |       cb->Run(); | ||||||
|     } |     } | ||||||
|     return false; |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // 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 Signature> |  | ||||||
| class RepeatingCallbackList |  | ||||||
|     : public internal::CallbackListBase<RepeatingCallbackList<Signature>> { |  | ||||||
|  private: |  private: | ||||||
|   friend internal::CallbackListBase<RepeatingCallbackList>; |   DISALLOW_COPY_AND_ASSIGN(CallbackList); | ||||||
|   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...); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // 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; |  | ||||||
|   } |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // Syntactic sugar to parallel that used for Callbacks. | template <typename A1> | ||||||
| // ClosureList explicitly not provided since it is not used, and CallbackList | class CallbackList<void(A1)> | ||||||
| // is deprecated. {Once,Repeating}ClosureList should instead be used. |     : public cef_internal::CallbackListBase<Callback<void(A1)>> { | ||||||
| using OnceClosureList = OnceCallbackList<void()>; |  public: | ||||||
| using RepeatingClosureList = RepeatingCallbackList<void()>; |   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); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |  private: | ||||||
|  |   DISALLOW_COPY_AND_ASSIGN(CallbackList); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | 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); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |  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); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |  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); | ||||||
|  | }; | ||||||
|  |  | ||||||
| }  // namespace base | }  // namespace base | ||||||
|  |  | ||||||
|   | |||||||
| @@ -27,7 +27,7 @@ | |||||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | // | ||||||
| // CancelableCallback is a wrapper around base::Callback that allows | // CancelableCallback is a wrapper around base::Callback that allows | ||||||
| // cancellation of a callback. CancelableCallback takes a reference on the | // cancellation of a callback. CancelableCallback takes a reference on the | ||||||
| // wrapped callback until this object is destroyed or Reset()/Cancel() are | // wrapped callback until this object is destroyed or Reset()/Cancel() are | ||||||
| @@ -52,26 +52,29 @@ | |||||||
| // to the message loop, the intensive test runs, the message loop is run, | // to the message loop, the intensive test runs, the message loop is run, | ||||||
| // then the callback is cancelled. | // then the callback is cancelled. | ||||||
| // | // | ||||||
| // RunLoop run_loop; |  | ||||||
| // |  | ||||||
| // void TimeoutCallback(const std::string& timeout_message) { | // void TimeoutCallback(const std::string& timeout_message) { | ||||||
| //   FAIL() << timeout_message; | //   FAIL() << timeout_message; | ||||||
| //   run_loop.QuitWhenIdle(); | //   MessageLoop::current()->QuitWhenIdle(); | ||||||
| // } | // } | ||||||
| // | // | ||||||
| // CancelableOnceClosure timeout( | // CancelableClosure timeout(base::Bind(&TimeoutCallback, "Test timed out.")); | ||||||
| //     base::BindOnce(&TimeoutCallback, "Test timed out.")); | // MessageLoop::current()->PostDelayedTask(FROM_HERE, timeout.callback(), | ||||||
| // ThreadTaskRunnerHandle::Get()->PostDelayedTask(FROM_HERE, timeout.callback(), | //                                         4000)  // 4 seconds to run. | ||||||
| //                                                TimeDelta::FromSeconds(4)); |  | ||||||
| // RunIntensiveTest(); | // RunIntensiveTest(); | ||||||
| // run_loop.Run(); | // MessageLoop::current()->Run(); | ||||||
| // timeout.Cancel();  // Hopefully this is hit before the timeout callback runs. | // timeout.Cancel();  // Hopefully this is hit before the timeout callback runs. | ||||||
|  | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_BASE_CEF_CANCELABLE_CALLBACK_H_ | #ifndef CEF_INCLUDE_BASE_CEF_CANCELABLE_CALLBACK_H_ | ||||||
| #define CEF_INCLUDE_BASE_CEF_CANCELABLE_CALLBACK_H_ | #define CEF_INCLUDE_BASE_CEF_CANCELABLE_CALLBACK_H_ | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #if defined(USING_CHROMIUM_INCLUDES) | #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) | ||||||
| // When building CEF include the Chromium header directly. | // When building CEF include the Chromium header directly. | ||||||
| #include "base/cancelable_callback.h" | #include "base/cancelable_callback.h" | ||||||
| #else  // !USING_CHROMIUM_INCLUDES | #else  // !USING_CHROMIUM_INCLUDES | ||||||
| @@ -79,36 +82,37 @@ | |||||||
| // If the Chromium implementation diverges the below implementation should be | // If the Chromium implementation diverges the below implementation should be | ||||||
| // updated to match. | // updated to match. | ||||||
|  |  | ||||||
| #include <utility> |  | ||||||
|  |  | ||||||
| #include "include/base/cef_bind.h" | #include "include/base/cef_bind.h" | ||||||
|  | #include "include/base/cef_build.h" | ||||||
| #include "include/base/cef_callback.h" | #include "include/base/cef_callback.h" | ||||||
| #include "include/base/cef_compiler_specific.h" |  | ||||||
| #include "include/base/cef_logging.h" | #include "include/base/cef_logging.h" | ||||||
|  | #include "include/base/cef_macros.h" | ||||||
| #include "include/base/cef_weak_ptr.h" | #include "include/base/cef_weak_ptr.h" | ||||||
| #include "include/base/internal/cef_callback_internal.h" | #include "include/base/internal/cef_callback_internal.h" | ||||||
|  |  | ||||||
| namespace base { | namespace base { | ||||||
| namespace internal { |  | ||||||
|  |  | ||||||
| template <typename CallbackType> | template <typename Sig> | ||||||
| class CancelableCallbackImpl { | class CancelableCallback; | ||||||
|  |  | ||||||
|  | template <> | ||||||
|  | class CancelableCallback<void(void)> { | ||||||
|  public: |  public: | ||||||
|   CancelableCallbackImpl() = default; |   CancelableCallback() : weak_factory_(this) {} | ||||||
|   CancelableCallbackImpl(const CancelableCallbackImpl&) = delete; |  | ||||||
|   CancelableCallbackImpl& operator=(const CancelableCallbackImpl&) = delete; |  | ||||||
|  |  | ||||||
|   // |callback| must not be null. |   // |callback| must not be null. | ||||||
|   explicit CancelableCallbackImpl(CallbackType callback) |   explicit CancelableCallback(const base::Callback<void(void)>& callback) | ||||||
|       : callback_(std::move(callback)) { |       : weak_factory_(this), callback_(callback) { | ||||||
|     DCHECK(callback_); |     DCHECK(!callback.is_null()); | ||||||
|  |     InitializeForwarder(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   ~CancelableCallbackImpl() = default; |   ~CancelableCallback() {} | ||||||
|  |  | ||||||
|   // Cancels and drops the reference to the wrapped callback. |   // Cancels and drops the reference to the wrapped callback. | ||||||
|   void Cancel() { |   void Cancel() { | ||||||
|     weak_ptr_factory_.InvalidateWeakPtrs(); |     weak_factory_.InvalidateWeakPtrs(); | ||||||
|  |     forwarder_.Reset(); | ||||||
|     callback_.Reset(); |     callback_.Reset(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -117,66 +121,170 @@ class CancelableCallbackImpl { | |||||||
|  |  | ||||||
|   // Sets |callback| as the closure that may be cancelled. |callback| may not |   // Sets |callback| as the closure that may be cancelled. |callback| may not | ||||||
|   // be null. Outstanding and any previously wrapped callbacks are cancelled. |   // be null. Outstanding and any previously wrapped callbacks are cancelled. | ||||||
|   void Reset(CallbackType callback) { |   void Reset(const base::Callback<void(void)>& callback) { | ||||||
|     DCHECK(callback); |     DCHECK(!callback.is_null()); | ||||||
|  |  | ||||||
|     // Outstanding tasks (e.g., posted to a message loop) must not be called. |     // Outstanding tasks (e.g., posted to a message loop) must not be called. | ||||||
|     Cancel(); |     Cancel(); | ||||||
|     callback_ = std::move(callback); |  | ||||||
|  |     // |forwarder_| is no longer valid after Cancel(), so re-bind. | ||||||
|  |     InitializeForwarder(); | ||||||
|  |  | ||||||
|  |     callback_ = callback; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // Returns a callback that can be disabled by calling Cancel(). |   // Returns a callback that can be disabled by calling Cancel(). | ||||||
|   CallbackType callback() const { |   const base::Callback<void(void)>& callback() const { return forwarder_; } | ||||||
|     if (!callback_) |  | ||||||
|       return CallbackType(); |  | ||||||
|     CallbackType forwarder; |  | ||||||
|     MakeForwarder(&forwarder); |  | ||||||
|     return forwarder; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|  private: |  private: | ||||||
|   template <typename... Args> |   void Forward() { callback_.Run(); } | ||||||
|   void MakeForwarder(RepeatingCallback<void(Args...)>* out) const { |  | ||||||
|     using ForwarderType = void (CancelableCallbackImpl::*)(Args...); |   // Helper method to bind |forwarder_| using a weak pointer from | ||||||
|     ForwarderType forwarder = &CancelableCallbackImpl::ForwardRepeating; |   // |weak_factory_|. | ||||||
|     *out = BindRepeating(forwarder, weak_ptr_factory_.GetWeakPtr()); |   void InitializeForwarder() { | ||||||
|  |     forwarder_ = base::Bind(&CancelableCallback<void(void)>::Forward, | ||||||
|  |                             weak_factory_.GetWeakPtr()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   template <typename... Args> |   // Used to ensure Forward() is not run when this object is destroyed. | ||||||
|   void MakeForwarder(OnceCallback<void(Args...)>* out) const { |   base::WeakPtrFactory<CancelableCallback<void(void)>> weak_factory_; | ||||||
|     using ForwarderType = void (CancelableCallbackImpl::*)(Args...); |  | ||||||
|     ForwarderType forwarder = &CancelableCallbackImpl::ForwardOnce; |  | ||||||
|     *out = BindOnce(forwarder, weak_ptr_factory_.GetWeakPtr()); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   template <typename... Args> |   // The wrapper closure. | ||||||
|   void ForwardRepeating(Args... args) { |   base::Callback<void(void)> forwarder_; | ||||||
|     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. |   // The stored closure that may be cancelled. | ||||||
|   CallbackType callback_; |   base::Callback<void(void)> callback_; | ||||||
|   mutable base::WeakPtrFactory<CancelableCallbackImpl> weak_ptr_factory_{this}; |  | ||||||
|  |   DISALLOW_COPY_AND_ASSIGN(CancelableCallback); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| }  // namespace internal | template <typename A1> | ||||||
|  | class CancelableCallback<void(A1)> { | ||||||
|  |  public: | ||||||
|  |   CancelableCallback() : weak_factory_(this) {} | ||||||
|  |  | ||||||
| // Consider using base::WeakPtr directly instead of base::CancelableCallback for |   // |callback| must not be null. | ||||||
| // the task cancellation. |   explicit CancelableCallback(const base::Callback<void(A1)>& callback) | ||||||
| template <typename Signature> |       : weak_factory_(this), callback_(callback) { | ||||||
| using CancelableOnceCallback = |     DCHECK(!callback.is_null()); | ||||||
|     internal::CancelableCallbackImpl<OnceCallback<Signature>>; |     InitializeForwarder(); | ||||||
| using CancelableOnceClosure = CancelableOnceCallback<void()>; |   } | ||||||
|  |  | ||||||
| template <typename Signature> |   ~CancelableCallback() {} | ||||||
| using CancelableRepeatingCallback = |  | ||||||
|     internal::CancelableCallbackImpl<RepeatingCallback<Signature>>; |   // Cancels and drops the reference to the wrapped callback. | ||||||
| using CancelableRepeatingClosure = CancelableRepeatingCallback<void()>; |   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; | ||||||
|  |  | ||||||
| }  // namespace base | }  // namespace base | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,423 +0,0 @@ | |||||||
| // 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(BASE_COMPILER_SPECIFIC_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/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 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); |  | ||||||
| #define ALLOW_UNUSED_LOCAL(x) (void)x |  | ||||||
|  |  | ||||||
| // Annotate a typedef or function indicating it's ok if it's not used. |  | ||||||
| // Use like: |  | ||||||
| //   typedef Foo Bar ALLOW_UNUSED_TYPE; |  | ||||||
| #if defined(COMPILER_GCC) || defined(__clang__) |  | ||||||
| #define ALLOW_UNUSED_TYPE __attribute__((unused)) |  | ||||||
| #else |  | ||||||
| #define ALLOW_UNUSED_TYPE |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // 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 |  | ||||||
|  |  | ||||||
| // 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. |  | ||||||
| #undef WARN_UNUSED_RESULT |  | ||||||
| #if defined(COMPILER_GCC) || defined(__clang__) |  | ||||||
| #define WARN_UNUSED_RESULT __attribute__((warn_unused_result)) |  | ||||||
| #else |  | ||||||
| #define WARN_UNUSED_RESULT |  | ||||||
| #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 |  | ||||||
|  |  | ||||||
| // Macro for telling -Wimplicit-fallthrough that a fallthrough is intentional. |  | ||||||
| #if defined(__clang__) |  | ||||||
| #define FALLTHROUGH [[clang::fallthrough]] |  | ||||||
| #else |  | ||||||
| #define FALLTHROUGH |  | ||||||
| #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_ |  | ||||||
| @@ -1,133 +0,0 @@ | |||||||
| // Copyright (c) 2021 Marshall A. Greenblatt. Portions copyright (c) 2021 |  | ||||||
| // 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_CXX17_BACKPORTS_H_ |  | ||||||
| #define CEF_INCLUDE_BASE_CEF_CXX17_BACKPORTS_H_ |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| #if defined(USING_CHROMIUM_INCLUDES) |  | ||||||
| // When building CEF include the Chromium header directly. |  | ||||||
| // TODO(cef): Change to "base/cxx17_backports.h" in M93. |  | ||||||
| #include "base/stl_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 <array> |  | ||||||
| #include <initializer_list> |  | ||||||
| #include <memory> |  | ||||||
| #include <string> |  | ||||||
|  |  | ||||||
| namespace base { |  | ||||||
|  |  | ||||||
| // C++14 implementation of C++17's std::size(): |  | ||||||
| // http://en.cppreference.com/w/cpp/iterator/size |  | ||||||
| template <typename Container> |  | ||||||
| constexpr auto size(const Container& c) -> decltype(c.size()) { |  | ||||||
|   return c.size(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T, size_t N> |  | ||||||
| constexpr size_t size(const T (&array)[N]) noexcept { |  | ||||||
|   return N; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // C++14 implementation of C++17's std::empty(): |  | ||||||
| // http://en.cppreference.com/w/cpp/iterator/empty |  | ||||||
| template <typename Container> |  | ||||||
| constexpr auto empty(const Container& c) -> decltype(c.empty()) { |  | ||||||
|   return c.empty(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T, size_t N> |  | ||||||
| constexpr bool empty(const T (&array)[N]) noexcept { |  | ||||||
|   return false; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| constexpr bool empty(std::initializer_list<T> il) noexcept { |  | ||||||
|   return il.size() == 0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // C++14 implementation of C++17's std::data(): |  | ||||||
| // http://en.cppreference.com/w/cpp/iterator/data |  | ||||||
| template <typename Container> |  | ||||||
| constexpr auto data(Container& c) -> decltype(c.data()) { |  | ||||||
|   return c.data(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // std::basic_string::data() had no mutable overload prior to C++17 [1]. |  | ||||||
| // Hence this overload is provided. |  | ||||||
| // Note: str[0] is safe even for empty strings, as they are guaranteed to be |  | ||||||
| // null-terminated [2]. |  | ||||||
| // |  | ||||||
| // [1] http://en.cppreference.com/w/cpp/string/basic_string/data |  | ||||||
| // [2] http://en.cppreference.com/w/cpp/string/basic_string/operator_at |  | ||||||
| template <typename CharT, typename Traits, typename Allocator> |  | ||||||
| CharT* data(std::basic_string<CharT, Traits, Allocator>& str) { |  | ||||||
|   return std::addressof(str[0]); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename Container> |  | ||||||
| constexpr auto data(const Container& c) -> decltype(c.data()) { |  | ||||||
|   return c.data(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T, size_t N> |  | ||||||
| constexpr T* data(T (&array)[N]) noexcept { |  | ||||||
|   return array; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| constexpr const T* data(std::initializer_list<T> il) noexcept { |  | ||||||
|   return il.begin(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // std::array::data() was not constexpr prior to C++17 [1]. |  | ||||||
| // Hence these overloads are provided. |  | ||||||
| // |  | ||||||
| // [1] https://en.cppreference.com/w/cpp/container/array/data |  | ||||||
| template <typename T, size_t N> |  | ||||||
| constexpr T* data(std::array<T, N>& array) noexcept { |  | ||||||
|   return !array.empty() ? &array[0] : nullptr; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T, size_t N> |  | ||||||
| constexpr const T* data(const std::array<T, N>& array) noexcept { |  | ||||||
|   return !array.empty() ? &array[0] : nullptr; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| }  // namespace base |  | ||||||
|  |  | ||||||
| #endif  // !USING_CHROMIUM_INCLUDES |  | ||||||
|  |  | ||||||
| #endif  // CEF_INCLUDE_BASE_CEF_CXX17_BACKPORTS_H_ |  | ||||||
| @@ -32,7 +32,12 @@ | |||||||
| #define CEF_INCLUDE_BASE_CEF_LOCK_H_ | #define CEF_INCLUDE_BASE_CEF_LOCK_H_ | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #if defined(USING_CHROMIUM_INCLUDES) | #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) | ||||||
| // When building CEF include the Chromium header directly. | // When building CEF include the Chromium header directly. | ||||||
| #include "base/synchronization/lock.h" | #include "base/synchronization/lock.h" | ||||||
| #else  // !USING_CHROMIUM_INCLUDES | #else  // !USING_CHROMIUM_INCLUDES | ||||||
|   | |||||||
| @@ -136,11 +136,7 @@ | |||||||
| #define CEF_INCLUDE_BASE_CEF_LOGGING_H_ | #define CEF_INCLUDE_BASE_CEF_LOGGING_H_ | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #if defined(USING_CHROMIUM_INCLUDES) | #if defined(DCHECK) | ||||||
| // 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. | // Do nothing if the macros provided by this header already exist. | ||||||
| // This can happen in cases where Chromium code is used directly by the | // This can happen in cases where Chromium code is used directly by the | ||||||
| // client application. When using Chromium code directly always include | // client application. When using Chromium code directly always include | ||||||
| @@ -148,12 +144,15 @@ | |||||||
|  |  | ||||||
| // Always define the DCHECK_IS_ON macro which is used from other CEF headers. | // Always define the DCHECK_IS_ON macro which is used from other CEF headers. | ||||||
| #if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON) | #if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON) | ||||||
| #define DCHECK_IS_ON() false | #define DCHECK_IS_ON() 0 | ||||||
| #else | #else | ||||||
| #define DCHECK_IS_ON() true | #define DCHECK_IS_ON() 1 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #else  // !defined(DCHECK) | #elif defined(USING_CHROMIUM_INCLUDES) | ||||||
|  | // When building CEF include the Chromium header directly. | ||||||
|  | #include "base/logging.h" | ||||||
|  | #else  // !USING_CHROMIUM_INCLUDES | ||||||
| // The following is substantially similar to the Chromium implementation. | // The following is substantially similar to the Chromium implementation. | ||||||
| // If the Chromium implementation diverges the below implementation should be | // If the Chromium implementation diverges the below implementation should be | ||||||
| // updated to match. | // updated to match. | ||||||
| @@ -203,19 +202,19 @@ const LogSeverity LOG_DFATAL = LOG_FATAL; | |||||||
| // by LOG() and LOG_IF, etc. Since these are used all over our code, it's | // by LOG() and LOG_IF, etc. Since these are used all over our code, it's | ||||||
| // better to have compact code for these operations. | // better to have compact code for these operations. | ||||||
| #define COMPACT_GOOGLE_LOG_EX_INFO(ClassName, ...)                    \ | #define COMPACT_GOOGLE_LOG_EX_INFO(ClassName, ...)                    \ | ||||||
|   ::cef::logging::ClassName(__FILE__, __LINE__, ::cef::logging::LOG_INFO, \ |   cef::logging::ClassName(__FILE__, __LINE__, cef::logging::LOG_INFO, \ | ||||||
|                           ##__VA_ARGS__) |                           ##__VA_ARGS__) | ||||||
| #define COMPACT_GOOGLE_LOG_EX_WARNING(ClassName, ...)                    \ | #define COMPACT_GOOGLE_LOG_EX_WARNING(ClassName, ...)                    \ | ||||||
|   ::cef::logging::ClassName(__FILE__, __LINE__, ::cef::logging::LOG_WARNING, \ |   cef::logging::ClassName(__FILE__, __LINE__, cef::logging::LOG_WARNING, \ | ||||||
|                           ##__VA_ARGS__) |                           ##__VA_ARGS__) | ||||||
| #define COMPACT_GOOGLE_LOG_EX_ERROR(ClassName, ...)                    \ | #define COMPACT_GOOGLE_LOG_EX_ERROR(ClassName, ...)                    \ | ||||||
|   ::cef::logging::ClassName(__FILE__, __LINE__, ::cef::logging::LOG_ERROR, \ |   cef::logging::ClassName(__FILE__, __LINE__, cef::logging::LOG_ERROR, \ | ||||||
|                           ##__VA_ARGS__) |                           ##__VA_ARGS__) | ||||||
| #define COMPACT_GOOGLE_LOG_EX_FATAL(ClassName, ...)                    \ | #define COMPACT_GOOGLE_LOG_EX_FATAL(ClassName, ...)                    \ | ||||||
|   ::cef::logging::ClassName(__FILE__, __LINE__, ::cef::logging::LOG_FATAL, \ |   cef::logging::ClassName(__FILE__, __LINE__, cef::logging::LOG_FATAL, \ | ||||||
|                           ##__VA_ARGS__) |                           ##__VA_ARGS__) | ||||||
| #define COMPACT_GOOGLE_LOG_EX_DFATAL(ClassName, ...)                    \ | #define COMPACT_GOOGLE_LOG_EX_DFATAL(ClassName, ...)                    \ | ||||||
|   ::cef::logging::ClassName(__FILE__, __LINE__, ::cef::logging::LOG_DFATAL, \ |   cef::logging::ClassName(__FILE__, __LINE__, cef::logging::LOG_DFATAL, \ | ||||||
|                           ##__VA_ARGS__) |                           ##__VA_ARGS__) | ||||||
|  |  | ||||||
| #define COMPACT_GOOGLE_LOG_INFO COMPACT_GOOGLE_LOG_EX_INFO(LogMessage) | #define COMPACT_GOOGLE_LOG_INFO COMPACT_GOOGLE_LOG_EX_INFO(LogMessage) | ||||||
| @@ -554,7 +553,12 @@ const LogSeverity LOG_DCHECK = LOG_INFO; | |||||||
| #define DCHECK_GE(val1, val2) DCHECK_OP(GE, >=, val1, val2) | #define DCHECK_GE(val1, val2) DCHECK_OP(GE, >=, val1, val2) | ||||||
| #define DCHECK_GT(val1, val2) DCHECK_OP(GT, >, 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) | #define NOTREACHED() DCHECK(false) | ||||||
|  | #endif | ||||||
|  |  | ||||||
| // Redefine the standard assert to use our nice log files | // Redefine the standard assert to use our nice log files | ||||||
| #undef assert | #undef assert | ||||||
|   | |||||||
| @@ -41,38 +41,180 @@ | |||||||
| // If the Chromium implementation diverges the below implementation should be | // If the Chromium implementation diverges the below implementation should be | ||||||
| // updated to match. | // updated to match. | ||||||
|  |  | ||||||
| // ALL DISALLOW_xxx MACROS ARE DEPRECATED; DO NOT USE IN NEW CODE. | #include <stddef.h>                  // For size_t. | ||||||
| // Use explicit deletions instead.  See the section on copyability/movability in | #include "include/base/cef_build.h"  // For COMPILER_MSVC | ||||||
| // //styleguide/c++/c++-dos-and-donts.md for more information. |  | ||||||
|  |  | ||||||
| // DEPRECATED: See above. Makes a class uncopyable. | #if !defined(arraysize) | ||||||
| #define DISALLOW_COPY(TypeName) TypeName(const TypeName&) = delete |  | ||||||
|  |  | ||||||
| // DEPRECATED: See above. Makes a class unassignable. | // The arraysize(arr) macro returns the # of elements in an array arr. | ||||||
| #define DISALLOW_ASSIGN(TypeName) TypeName& operator=(const TypeName&) = delete | // 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 uncopyable and unassignable. | // 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 | ||||||
| #define DISALLOW_COPY_AND_ASSIGN(TypeName) \ | #define DISALLOW_COPY_AND_ASSIGN(TypeName) \ | ||||||
|   DISALLOW_COPY(TypeName);                 \ |   TypeName(const TypeName&);               \ | ||||||
|   DISALLOW_ASSIGN(TypeName) |   void operator=(const TypeName&) | ||||||
|  |  | ||||||
| // DEPRECATED: See above. Disallow all implicit constructors, namely the | #endif  // !DISALLOW_COPY_AND_ASSIGN | ||||||
|  |  | ||||||
|  | #if !defined(DISALLOW_IMPLICIT_CONSTRUCTORS) | ||||||
|  |  | ||||||
|  | // A macro to disallow all the implicit constructors, namely the | ||||||
| // default constructor, copy constructor and operator= functions. | // 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) \ | #define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \ | ||||||
|   TypeName() = delete;                           \ |   TypeName();                                    \ | ||||||
|   DISALLOW_COPY_AND_ASSIGN(TypeName) |   DISALLOW_COPY_AND_ASSIGN(TypeName) | ||||||
|  |  | ||||||
| // Used to explicitly mark the return value of a function as unused. If you are | #endif  // !DISALLOW_IMPLICIT_CONSTRUCTORS | ||||||
| // really sure you don't want to do anything with the return value of a function |  | ||||||
| // that has been marked WARN_UNUSED_RESULT, wrap it with this. Example: | #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: | ||||||
| // | // | ||||||
| //   std::unique_ptr<MyType> my_var = ...; | //   COMPILE_ASSERT(ARRAYSIZE_UNSAFE(content_type_names) == CONTENT_NUM_TYPES, | ||||||
| //   if (TakeOwnership(my_var.get()) == SUCCESS) | //                  content_type_names_incorrect_size); | ||||||
| //     ignore_result(my_var.release()); |  | ||||||
| // | // | ||||||
| template <typename T> | // or to make sure a struct is smaller than a certain size: | ||||||
| inline void ignore_result(const T&) {} | // | ||||||
|  | //   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 | #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_ | #endif  // CEF_INCLUDE_BASE_CEF_MACROS_H_ | ||||||
|   | |||||||
							
								
								
									
										261
									
								
								include/base/cef_move.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										261
									
								
								include/base/cef_move.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,261 @@ | |||||||
|  | // 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_ | ||||||
| @@ -35,7 +35,12 @@ | |||||||
| #ifndef CEF_INCLUDE_BASE_PLATFORM_THREAD_H_ | #ifndef CEF_INCLUDE_BASE_PLATFORM_THREAD_H_ | ||||||
| #define CEF_INCLUDE_BASE_PLATFORM_THREAD_H_ | #define CEF_INCLUDE_BASE_PLATFORM_THREAD_H_ | ||||||
|  |  | ||||||
| #if defined(USING_CHROMIUM_INCLUDES) | #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) | ||||||
| // When building CEF include the Chromium header directly. | // When building CEF include the Chromium header directly. | ||||||
| #include "base/threading/platform_thread.h" | #include "base/threading/platform_thread.h" | ||||||
| #else  // !USING_CHROMIUM_INCLUDES | #else  // !USING_CHROMIUM_INCLUDES | ||||||
|   | |||||||
| @@ -1,58 +0,0 @@ | |||||||
| // 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 |  | ||||||
| // 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 INCLUDE_BASE_CEF_PTR_UTIL_H_ |  | ||||||
| #define INCLUDE_BASE_CEF_PTR_UTIL_H_ |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| #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 { |  | ||||||
|  |  | ||||||
| // 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. |  | ||||||
| template <typename T> |  | ||||||
| std::unique_ptr<T> WrapUnique(T* ptr) { |  | ||||||
|   return std::unique_ptr<T>(ptr); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| }  // namespace base |  | ||||||
|  |  | ||||||
| #endif  // INCLUDE_BASE_CEF_PTR_UTIL_H_ |  | ||||||
| @@ -33,7 +33,12 @@ | |||||||
| #define CEF_INCLUDE_BASE_CEF_REF_COUNTED_H_ | #define CEF_INCLUDE_BASE_CEF_REF_COUNTED_H_ | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #if defined(USING_CHROMIUM_INCLUDES) | #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) | ||||||
| // When building CEF include the Chromium header directly. | // When building CEF include the Chromium header directly. | ||||||
| #include "base/memory/ref_counted.h" | #include "base/memory/ref_counted.h" | ||||||
| #else  // !USING_CHROMIUM_INCLUDES | #else  // !USING_CHROMIUM_INCLUDES | ||||||
| @@ -41,39 +46,29 @@ | |||||||
| // If the Chromium implementation diverges the below implementation should be | // If the Chromium implementation diverges the below implementation should be | ||||||
| // updated to match. | // updated to match. | ||||||
|  |  | ||||||
| #include <stddef.h> | #include <cassert> | ||||||
|  |  | ||||||
| #include <utility> |  | ||||||
|  |  | ||||||
| #include "include/base/cef_atomic_ref_count.h" | #include "include/base/cef_atomic_ref_count.h" | ||||||
| #include "include/base/cef_build.h" | #include "include/base/cef_build.h" | ||||||
| #include "include/base/cef_compiler_specific.h" |  | ||||||
| #include "include/base/cef_logging.h" | #include "include/base/cef_logging.h" | ||||||
| #include "include/base/cef_macros.h" | #include "include/base/cef_thread_collision_warner.h" | ||||||
| #include "include/base/cef_scoped_refptr.h" |  | ||||||
| #include "include/base/cef_template_util.h" |  | ||||||
| #include "include/base/cef_thread_checker.h" |  | ||||||
|  |  | ||||||
| namespace base { | namespace base { | ||||||
|  |  | ||||||
| namespace cef_subtle { | namespace cef_subtle { | ||||||
|  |  | ||||||
| class RefCountedBase { | class RefCountedBase { | ||||||
|  public: |  public: | ||||||
|   bool HasOneRef() const { return ref_count_ == 1; } |   bool HasOneRef() const { return ref_count_ == 1; } | ||||||
|   bool HasAtLeastOneRef() const { return ref_count_ >= 1; } |  | ||||||
|  |  | ||||||
|  protected: |  protected: | ||||||
|   explicit RefCountedBase(StartRefCountFromZeroTag) { |   RefCountedBase() | ||||||
|  |       : ref_count_(0) | ||||||
| #if DCHECK_IS_ON() | #if DCHECK_IS_ON() | ||||||
|     thread_checker_.DetachFromThread(); |         , | ||||||
| #endif |         in_dtor_(false) | ||||||
|   } |  | ||||||
|  |  | ||||||
|   explicit RefCountedBase(StartRefCountFromOneTag) : ref_count_(1) { |  | ||||||
| #if DCHECK_IS_ON() |  | ||||||
|     needs_adopt_ref_ = true; |  | ||||||
|     thread_checker_.DetachFromThread(); |  | ||||||
| #endif | #endif | ||||||
|  |   { | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   ~RefCountedBase() { |   ~RefCountedBase() { | ||||||
| @@ -83,169 +78,26 @@ class RefCountedBase { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   void AddRef() const { |   void AddRef() const { | ||||||
|  | // TODO(maruel): Add back once it doesn't assert 500 times/sec. | ||||||
|  | // Current thread books the critical section "AddRelease" | ||||||
|  | // without release it. | ||||||
|  | // DFAKE_SCOPED_LOCK_THREAD_LOCKED(add_release_); | ||||||
| #if DCHECK_IS_ON() | #if DCHECK_IS_ON() | ||||||
|     DCHECK(!in_dtor_); |     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 | #endif | ||||||
|  |     ++ref_count_; | ||||||
|     AddRefImpl(); |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // Returns true if the object should self-delete. |   // Returns true if the object should self-delete. | ||||||
|   bool Release() const { |   bool Release() const { | ||||||
|     ReleaseImpl(); | // TODO(maruel): Add back once it doesn't assert 500 times/sec. | ||||||
|  | // Current thread books the critical section "AddRelease" | ||||||
|  | // without release it. | ||||||
|  | // DFAKE_SCOPED_LOCK_THREAD_LOCKED(add_release_); | ||||||
| #if DCHECK_IS_ON() | #if DCHECK_IS_ON() | ||||||
|     DCHECK(!in_dtor_); |     DCHECK(!in_dtor_); | ||||||
|     if (ref_count_ == 0) |  | ||||||
|       in_dtor_ = true; |  | ||||||
|  |  | ||||||
|     if (ref_count_ >= 1) |  | ||||||
|       DCHECK(CalledOnValidThread()); |  | ||||||
|     if (ref_count_ == 1) |  | ||||||
|       thread_checker_.DetachFromThread(); |  | ||||||
| #endif | #endif | ||||||
|  |     if (--ref_count_ == 0) { | ||||||
|     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: |  | ||||||
|   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 |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| #if defined(ARCH_CPU_64_BITS) |  | ||||||
|   void AddRefImpl() const; |  | ||||||
|   void ReleaseImpl() const; |  | ||||||
| #else |  | ||||||
|   void AddRefImpl() const { ++ref_count_; } |  | ||||||
|   void ReleaseImpl() const { --ref_count_; } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #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 |  | ||||||
|  |  | ||||||
|   DISALLOW_COPY_AND_ASSIGN(RefCountedBase); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| class RefCountedThreadSafeBase { |  | ||||||
|  public: |  | ||||||
|   bool HasOneRef() const; |  | ||||||
|   bool HasAtLeastOneRef() const; |  | ||||||
|  |  | ||||||
|  protected: |  | ||||||
|   explicit constexpr RefCountedThreadSafeBase(StartRefCountFromZeroTag) {} |  | ||||||
|   explicit constexpr RefCountedThreadSafeBase(StartRefCountFromOneTag) |  | ||||||
|       : ref_count_(1) { |  | ||||||
| #if DCHECK_IS_ON() |  | ||||||
|     needs_adopt_ref_ = true; |  | ||||||
| #endif |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| #if DCHECK_IS_ON() |  | ||||||
|   ~RefCountedThreadSafeBase(); |  | ||||||
| #else |  | ||||||
|   ~RefCountedThreadSafeBase() = default; |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // 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() | #if DCHECK_IS_ON() | ||||||
|       in_dtor_ = true; |       in_dtor_ = true; | ||||||
| #endif | #endif | ||||||
| @@ -254,44 +106,44 @@ class RefCountedThreadSafeBase { | |||||||
|     return false; |     return false; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   mutable AtomicRefCount ref_count_{0}; |  private: | ||||||
|  |   mutable int ref_count_; | ||||||
| #if DCHECK_IS_ON() | #if DCHECK_IS_ON() | ||||||
|   mutable bool needs_adopt_ref_ = false; |   mutable bool in_dtor_; | ||||||
|   mutable bool in_dtor_ = false; | #endif | ||||||
|  |  | ||||||
|  |   DFAKE_MUTEX(add_release_); | ||||||
|  |  | ||||||
|  |   DISALLOW_COPY_AND_ASSIGN(RefCountedBase); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | class RefCountedThreadSafeBase { | ||||||
|  |  public: | ||||||
|  |   bool HasOneRef() const; | ||||||
|  |  | ||||||
|  |  protected: | ||||||
|  |   RefCountedThreadSafeBase(); | ||||||
|  |   ~RefCountedThreadSafeBase(); | ||||||
|  |  | ||||||
|  |   void AddRef() const; | ||||||
|  |  | ||||||
|  |   // Returns true if the object should self-delete. | ||||||
|  |   bool Release() const; | ||||||
|  |  | ||||||
|  |  private: | ||||||
|  |   mutable AtomicRefCount ref_count_; | ||||||
|  | #if DCHECK_IS_ON() | ||||||
|  |   mutable bool in_dtor_; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   DISALLOW_COPY_AND_ASSIGN(RefCountedThreadSafeBase); |   DISALLOW_COPY_AND_ASSIGN(RefCountedThreadSafeBase); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // 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 | }  // namespace cef_subtle | ||||||
|  |  | ||||||
| using ScopedAllowCrossThreadRefCountAccess = |  | ||||||
|     cef_subtle::ScopedAllowCrossThreadRefCountAccess; |  | ||||||
|  |  | ||||||
| // | // | ||||||
| // A base class for reference counted classes.  Otherwise, known as a cheap | // 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 | // knock-off of WebKit's RefCounted<T> class.  To use this guy just extend your | ||||||
| // class from it like so: | // class from it like so: | ||||||
| // | // | ||||||
| //   class MyFoo : public base::RefCounted<MyFoo> { | //   class MyFoo : public base::RefCounted<MyFoo> { | ||||||
| @@ -301,86 +153,26 @@ using ScopedAllowCrossThreadRefCountAccess = | |||||||
| //     ~MyFoo(); | //     ~MyFoo(); | ||||||
| //   }; | //   }; | ||||||
| // | // | ||||||
| // Usage Notes: | // You should always make your destructor private, to avoid any code deleting | ||||||
| // 1. You should always make your destructor non-public, to avoid any code | // the object accidently while there are references to it. | ||||||
| // deleting the object accidentally while there are references to it. | template <class T> | ||||||
| // 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. |  | ||||||
| // |  | ||||||
| // |  | ||||||
| // 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; |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| struct DefaultRefCountedTraits { |  | ||||||
|   static void Destruct(const T* x) { |  | ||||||
|     RefCounted<T, DefaultRefCountedTraits>::DeleteInternal(x); |  | ||||||
|   } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <class T, typename Traits = DefaultRefCountedTraits<T>> |  | ||||||
| class RefCounted : public cef_subtle::RefCountedBase { | class RefCounted : public cef_subtle::RefCountedBase { | ||||||
|  public: |  public: | ||||||
|   static constexpr cef_subtle::StartRefCountFromZeroTag kRefCountPreference = |   RefCounted() {} | ||||||
|       cef_subtle::kStartRefCountFromZeroTag; |  | ||||||
|  |  | ||||||
|   RefCounted() : cef_subtle::RefCountedBase(T::kRefCountPreference) {} |  | ||||||
|  |  | ||||||
|   void AddRef() const { cef_subtle::RefCountedBase::AddRef(); } |   void AddRef() const { cef_subtle::RefCountedBase::AddRef(); } | ||||||
|  |  | ||||||
|   void Release() const { |   void Release() const { | ||||||
|     if (cef_subtle::RefCountedBase::Release()) { |     if (cef_subtle::RefCountedBase::Release()) { | ||||||
|       // Prune the code paths which the static analyzer may take to simulate |       delete static_cast<const T*>(this); | ||||||
|       // 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: |  protected: | ||||||
|   ~RefCounted() = default; |   ~RefCounted() {} | ||||||
|  |  | ||||||
|  private: |  private: | ||||||
|   friend struct DefaultRefCountedTraits<T>; |   DISALLOW_COPY_AND_ASSIGN(RefCounted<T>); | ||||||
|   template <typename U> |  | ||||||
|   static void DeleteInternal(const U* x) { |  | ||||||
|     delete x; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   DISALLOW_COPY_AND_ASSIGN(RefCounted); |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // Forward declaration. | // Forward declaration. | ||||||
| @@ -412,44 +204,25 @@ struct DefaultRefCountedThreadSafeTraits { | |||||||
| //    private: | //    private: | ||||||
| //     friend class base::RefCountedThreadSafe<MyFoo>; | //     friend class base::RefCountedThreadSafe<MyFoo>; | ||||||
| //     ~MyFoo(); | //     ~MyFoo(); | ||||||
| // |  | ||||||
| // 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>> | template <class T, typename Traits = DefaultRefCountedThreadSafeTraits<T>> | ||||||
| class RefCountedThreadSafe : public cef_subtle::RefCountedThreadSafeBase { | class RefCountedThreadSafe : public cef_subtle::RefCountedThreadSafeBase { | ||||||
|  public: |  public: | ||||||
|   static constexpr cef_subtle::StartRefCountFromZeroTag kRefCountPreference = |   RefCountedThreadSafe() {} | ||||||
|       cef_subtle::kStartRefCountFromZeroTag; |  | ||||||
|  |  | ||||||
|   explicit RefCountedThreadSafe() |   void AddRef() const { cef_subtle::RefCountedThreadSafeBase::AddRef(); } | ||||||
|       : cef_subtle::RefCountedThreadSafeBase(T::kRefCountPreference) {} |  | ||||||
|  |  | ||||||
|   void AddRef() const { AddRefImpl(T::kRefCountPreference); } |  | ||||||
|  |  | ||||||
|   void Release() const { |   void Release() const { | ||||||
|     if (cef_subtle::RefCountedThreadSafeBase::Release()) { |     if (cef_subtle::RefCountedThreadSafeBase::Release()) { | ||||||
|       ANALYZER_SKIP_THIS_PATH(); |  | ||||||
|       Traits::Destruct(static_cast<const T*>(this)); |       Traits::Destruct(static_cast<const T*>(this)); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  protected: |  protected: | ||||||
|   ~RefCountedThreadSafe() = default; |   ~RefCountedThreadSafe() {} | ||||||
|  |  | ||||||
|  private: |  private: | ||||||
|   friend struct DefaultRefCountedThreadSafeTraits<T>; |   friend struct DefaultRefCountedThreadSafeTraits<T>; | ||||||
|   template <typename U> |   static void DeleteInternal(const T* x) { delete x; } | ||||||
|   static void DeleteInternal(const U* x) { |  | ||||||
|     delete x; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   void AddRefImpl(cef_subtle::StartRefCountFromZeroTag) const { |  | ||||||
|     cef_subtle::RefCountedThreadSafeBase::AddRef(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   void AddRefImpl(cef_subtle::StartRefCountFromOneTag) const { |  | ||||||
|     cef_subtle::RefCountedThreadSafeBase::AddRefWithCheck(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   DISALLOW_COPY_AND_ASSIGN(RefCountedThreadSafe); |   DISALLOW_COPY_AND_ASSIGN(RefCountedThreadSafe); | ||||||
| }; | }; | ||||||
| @@ -464,30 +237,142 @@ class RefCountedData | |||||||
|  public: |  public: | ||||||
|   RefCountedData() : data() {} |   RefCountedData() : data() {} | ||||||
|   RefCountedData(const T& in_value) : data(in_value) {} |   RefCountedData(const T& in_value) : data(in_value) {} | ||||||
|   RefCountedData(T&& in_value) : data(std::move(in_value)) {} |  | ||||||
|   template <typename... Args> |  | ||||||
|   explicit RefCountedData(in_place_t, Args&&... args) |  | ||||||
|       : data(std::forward<Args>(args)...) {} |  | ||||||
|  |  | ||||||
|   T data; |   T data; | ||||||
|  |  | ||||||
|  private: |  private: | ||||||
|   friend class base::RefCountedThreadSafe<base::RefCountedData<T>>; |   friend class base::RefCountedThreadSafe<base::RefCountedData<T>>; | ||||||
|   ~RefCountedData() = default; |   ~RefCountedData() {} | ||||||
| }; | }; | ||||||
|  |  | ||||||
| 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 | }  // 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  // !USING_CHROMIUM_INCLUDES | ||||||
|  |  | ||||||
| #endif  // CEF_INCLUDE_BASE_CEF_REF_COUNTED_H_ | #endif  // CEF_INCLUDE_BASE_CEF_REF_COUNTED_H_ | ||||||
|   | |||||||
							
								
								
									
										625
									
								
								include/base/cef_scoped_ptr.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										625
									
								
								include/base/cef_scoped_ptr.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,625 @@ | |||||||
|  | // 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_ | ||||||
| @@ -1,412 +0,0 @@ | |||||||
| // 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_compiler_specific.h" |  | ||||||
| #include "include/base/cef_logging.h" |  | ||||||
| #include "include/base/cef_macros.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: |  | ||||||
| // |  | ||||||
| //   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); |  | ||||||
| //   } |  | ||||||
| // |  | ||||||
| // 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 = MakeRefCounted<MyFoo>(); |  | ||||||
| //     scoped_refptr<MyFoo> b; |  | ||||||
| // |  | ||||||
| //     b.swap(a); |  | ||||||
| //     // now, |b| references the MyFoo object, and |a| references nullptr. |  | ||||||
| //   } |  | ||||||
| // |  | ||||||
| // To make both |a| and |b| in the above example reference the same MyFoo |  | ||||||
| // object, simply use the assignment operator: |  | ||||||
| // |  | ||||||
| //   { |  | ||||||
| //     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. |  | ||||||
| //   } |  | ||||||
| // |  | ||||||
| // 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. |  | ||||||
|   T* release() WARN_UNUSED_RESULT; |  | ||||||
|  |  | ||||||
|   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_ |  | ||||||
| @@ -1,180 +0,0 @@ | |||||||
| // 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. |  | ||||||
|  |  | ||||||
| // 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: |  | ||||||
| // |  | ||||||
| //   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); } |  | ||||||
| //   }; |  | ||||||
| // |  | ||||||
| // 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: |  | ||||||
| // |  | ||||||
| //   base::ScopedTypeRef<CGLContextObj> context; |  | ||||||
| //   CGLCreateContext(pixel_format, share_group, context.InitializeInto()); |  | ||||||
| // |  | ||||||
| // 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|. |  | ||||||
|  |  | ||||||
| #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_compiler_specific.h" |  | ||||||
| #include "include/base/cef_logging.h" |  | ||||||
| #include "include/base/internal/cef_scoped_policy.h" |  | ||||||
|  |  | ||||||
| namespace base { |  | ||||||
|  |  | ||||||
| template<typename T> |  | ||||||
| struct ScopedTypeRefTraits; |  | ||||||
|  |  | ||||||
| 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. |  | ||||||
|   element_type* InitializeInto() WARN_UNUSED_RESULT { |  | ||||||
|     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(). |  | ||||||
|   element_type release() WARN_UNUSED_RESULT { |  | ||||||
|     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_ |  | ||||||
							
								
								
									
										214
									
								
								include/base/cef_string16.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										214
									
								
								include/base/cef_string16.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,214 @@ | |||||||
|  | // 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 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, base::string16_char_traits> 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<base::char16, | ||||||
|  |                                         base::string16_char_traits>; | ||||||
|  |  | ||||||
|  | #endif  // WCHAR_T_IS_UTF32 | ||||||
|  |  | ||||||
|  | #endif  // !USING_CHROMIUM_INCLUDES | ||||||
|  |  | ||||||
|  | #endif  // CEF_INCLUDE_BASE_CEF_STRING16_H_ | ||||||
| @@ -32,7 +32,12 @@ | |||||||
| #define CEF_INCLUDE_BASE_CEF_TEMPLATE_UTIL_H_ | #define CEF_INCLUDE_BASE_CEF_TEMPLATE_UTIL_H_ | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #if defined(USING_CHROMIUM_INCLUDES) | #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. | // When building CEF include the Chromium header directly. | ||||||
| #include "base/template_util.h" | #include "base/template_util.h" | ||||||
| #else  // !USING_CHROMIUM_INCLUDES | #else  // !USING_CHROMIUM_INCLUDES | ||||||
| @@ -40,370 +45,170 @@ | |||||||
| // If the Chromium implementation diverges the below implementation should be | // If the Chromium implementation diverges the below implementation should be | ||||||
| // updated to match. | // updated to match. | ||||||
|  |  | ||||||
| #include <stddef.h> | #include <cstddef>  // For size_t. | ||||||
| #include <iosfwd> |  | ||||||
| #include <iterator> |  | ||||||
| #include <type_traits> |  | ||||||
| #include <utility> |  | ||||||
| #include <vector> |  | ||||||
|  |  | ||||||
| #include "include/base/cef_build.h" | #include "include/base/cef_build.h" | ||||||
|  |  | ||||||
| // Some versions of libstdc++ have partial support for type_traits, but misses |  | ||||||
| // a smaller subset while removing some of the older non-standard stuff. Assume |  | ||||||
| // that all versions below 5.0 fall in this category, along with one 5.0 |  | ||||||
| // experimental release. Test for this by consulting compiler major version, |  | ||||||
| // the only reliable option available, so theoretically this could fail should |  | ||||||
| // you attempt to mix an earlier version of libstdc++ with >= GCC5. But |  | ||||||
| // that's unlikely to work out, especially as GCC5 changed ABI. |  | ||||||
| #define CR_GLIBCXX_5_0_0 20150123 |  | ||||||
| #if (defined(__GNUC__) && __GNUC__ < 5) || \ |  | ||||||
|     (defined(__GLIBCXX__) && __GLIBCXX__ == CR_GLIBCXX_5_0_0) |  | ||||||
| #define CR_USE_FALLBACKS_FOR_OLD_EXPERIMENTAL_GLIBCXX |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // This hacks around using gcc with libc++ which has some incompatibilies. |  | ||||||
| // - is_trivially_* doesn't work: https://llvm.org/bugs/show_bug.cgi?id=27538 |  | ||||||
| // TODO(danakj): Remove this when android builders are all using a newer version |  | ||||||
| // of gcc, or the android ndk is updated to a newer libc++ that works with older |  | ||||||
| // gcc versions. |  | ||||||
| #if !defined(__clang__) && defined(_LIBCPP_VERSION) |  | ||||||
| #define CR_USE_FALLBACKS_FOR_GCC_WITH_LIBCXX |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| namespace base { | namespace base { | ||||||
|  |  | ||||||
| template <class T> struct is_non_const_reference : std::false_type {}; | // template definitions from tr1 | ||||||
| template <class T> struct is_non_const_reference<T&> : std::true_type {}; |  | ||||||
| template <class T> struct is_non_const_reference<const T&> : std::false_type {}; |  | ||||||
|  |  | ||||||
| namespace internal { | template <class T, T v> | ||||||
|  | struct integral_constant { | ||||||
| // Implementation detail of base::void_t below. |   static const T value = v; | ||||||
| template <typename...> |   typedef T value_type; | ||||||
| struct make_void { |   typedef integral_constant<T, v> type; | ||||||
|   using type = void; |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| }  // namespace internal | template <class T, T v> | ||||||
|  | const T integral_constant<T, v>::value; | ||||||
|  |  | ||||||
| // base::void_t is an implementation of std::void_t from C++17. | typedef integral_constant<bool, true> true_type; | ||||||
| // | typedef integral_constant<bool, false> false_type; | ||||||
| // We use |base::internal::make_void| as a helper struct to avoid a C++14 |  | ||||||
| // defect: |  | ||||||
| //   http://en.cppreference.com/w/cpp/types/void_t |  | ||||||
| //   http://open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#1558 |  | ||||||
| template <typename... Ts> |  | ||||||
| using void_t = typename ::base::internal::make_void<Ts...>::type; |  | ||||||
|  |  | ||||||
| namespace internal { |  | ||||||
|  |  | ||||||
| // Uses expression SFINAE to detect whether using operator<< would work. |  | ||||||
| template <typename T, typename = void> |  | ||||||
| struct SupportsOstreamOperator : std::false_type {}; |  | ||||||
| template <typename T> |  | ||||||
| struct SupportsOstreamOperator<T, |  | ||||||
|                                decltype(void(std::declval<std::ostream&>() |  | ||||||
|                                              << std::declval<T>()))> |  | ||||||
|     : std::true_type {}; |  | ||||||
|  |  | ||||||
| template <typename T, typename = void> |  | ||||||
| struct SupportsToString : std::false_type {}; |  | ||||||
| template <typename T> |  | ||||||
| struct SupportsToString<T, decltype(void(std::declval<T>().ToString()))> |  | ||||||
|     : std::true_type {}; |  | ||||||
|  |  | ||||||
| // Used to detech whether the given type is an iterator.  This is normally used |  | ||||||
| // with std::enable_if to provide disambiguation for functions that take |  | ||||||
| // templatzed iterators as input. |  | ||||||
| template <typename T, typename = void> |  | ||||||
| struct is_iterator : std::false_type {}; |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| struct is_iterator<T, |  | ||||||
|                    void_t<typename std::iterator_traits<T>::iterator_category>> |  | ||||||
|     : std::true_type {}; |  | ||||||
|  |  | ||||||
| // Helper to express preferences in an overload set. If more than one overload |  | ||||||
| // are available for a given set of parameters the overload with the higher |  | ||||||
| // priority will be chosen. |  | ||||||
| template <size_t I> |  | ||||||
| struct priority_tag : priority_tag<I - 1> {}; |  | ||||||
|  |  | ||||||
| template <> |  | ||||||
| struct priority_tag<0> {}; |  | ||||||
|  |  | ||||||
| }  // namespace internal |  | ||||||
|  |  | ||||||
| // is_trivially_copyable is especially hard to get right. |  | ||||||
| // - Older versions of libstdc++ will fail to have it like they do for other |  | ||||||
| //   type traits. This has become a subset of the second point, but used to be |  | ||||||
| //   handled independently. |  | ||||||
| // - An experimental release of gcc includes most of type_traits but misses |  | ||||||
| //   is_trivially_copyable, so we still have to avoid using libstdc++ in this |  | ||||||
| //   case, which is covered by CR_USE_FALLBACKS_FOR_OLD_EXPERIMENTAL_GLIBCXX. |  | ||||||
| // - When compiling libc++ from before r239653, with a gcc compiler, the |  | ||||||
| //   std::is_trivially_copyable can fail. So we need to work around that by not |  | ||||||
| //   using the one in libc++ in this case. This is covered by the |  | ||||||
| //   CR_USE_FALLBACKS_FOR_GCC_WITH_LIBCXX define, and is discussed in |  | ||||||
| //   https://llvm.org/bugs/show_bug.cgi?id=27538#c1 where they point out that |  | ||||||
| //   in libc++'s commit r239653 this is fixed by libc++ checking for gcc 5.1. |  | ||||||
| // - In both of the above cases we are using the gcc compiler. When defining |  | ||||||
| //   this ourselves on compiler intrinsics, the __is_trivially_copyable() |  | ||||||
| //   intrinsic is not available on gcc before version 5.1 (see the discussion in |  | ||||||
| //   https://llvm.org/bugs/show_bug.cgi?id=27538#c1 again), so we must check for |  | ||||||
| //   that version. |  | ||||||
| // - When __is_trivially_copyable() is not available because we are on gcc older |  | ||||||
| //   than 5.1, we need to fall back to something, so we use __has_trivial_copy() |  | ||||||
| //   instead based on what was done one-off in bit_cast() previously. |  | ||||||
|  |  | ||||||
| // TODO(crbug.com/554293): Remove this when all platforms have this in the std |  | ||||||
| // namespace and it works with gcc as needed. |  | ||||||
| #if defined(CR_USE_FALLBACKS_FOR_OLD_EXPERIMENTAL_GLIBCXX) || \ |  | ||||||
|     defined(CR_USE_FALLBACKS_FOR_GCC_WITH_LIBCXX) |  | ||||||
| template <typename T> |  | ||||||
| struct is_trivially_copyable { |  | ||||||
| // TODO(danakj): Remove this when android builders are all using a newer version |  | ||||||
| // of gcc, or the android ndk is updated to a newer libc++ that does this for |  | ||||||
| // us. |  | ||||||
| #if _GNUC_VER >= 501 |  | ||||||
|   static constexpr bool value = __is_trivially_copyable(T); |  | ||||||
| #else |  | ||||||
|   static constexpr bool value = |  | ||||||
|       __has_trivial_copy(T) && __has_trivial_destructor(T); |  | ||||||
| #endif |  | ||||||
| }; |  | ||||||
| #else |  | ||||||
| template <class T> | template <class T> | ||||||
| using is_trivially_copyable = std::is_trivially_copyable<T>; | struct is_pointer : false_type {}; | ||||||
| #endif | template <class T> | ||||||
|  | struct is_pointer<T*> : true_type {}; | ||||||
|  |  | ||||||
| #if defined(__GNUC__) && !defined(__clang__) && __GNUC__ <= 7 | // Member function pointer detection up to four params. Add more as needed | ||||||
| // Workaround for g++7 and earlier family. | // below. This is built-in to C++ 11, and we can remove this when we switch. | ||||||
| // Due to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80654, without this |  | ||||||
| // Optional<std::vector<T>> where T is non-copyable causes a compile error. |  | ||||||
| // As we know it is not trivially copy constructible, explicitly declare so. |  | ||||||
| template <typename T> | template <typename T> | ||||||
| struct is_trivially_copy_constructible | struct is_member_function_pointer : false_type {}; | ||||||
|     : std::is_trivially_copy_constructible<T> {}; |  | ||||||
|  |  | ||||||
| template <typename... T> | template <typename R, typename Z> | ||||||
| struct is_trivially_copy_constructible<std::vector<T...>> : std::false_type {}; | struct is_member_function_pointer<R (Z::*)()> : true_type {}; | ||||||
| #else | template <typename R, typename Z> | ||||||
| // Otherwise use std::is_trivially_copy_constructible as is. | struct is_member_function_pointer<R (Z::*)() const> : true_type {}; | ||||||
| template <typename T> |  | ||||||
| using is_trivially_copy_constructible = std::is_trivially_copy_constructible<T>; |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // base::in_place_t is an implementation of std::in_place_t from | template <typename R, typename Z, typename A> | ||||||
| // C++17. A tag type used to request in-place construction in template vararg | struct is_member_function_pointer<R (Z::*)(A)> : true_type {}; | ||||||
| // constructors. | template <typename R, typename Z, typename A> | ||||||
|  | struct is_member_function_pointer<R (Z::*)(A) const> : true_type {}; | ||||||
|  |  | ||||||
| // Specification: | template <typename R, typename Z, typename A, typename B> | ||||||
| // https://en.cppreference.com/w/cpp/utility/in_place | struct is_member_function_pointer<R (Z::*)(A, B)> : true_type {}; | ||||||
| struct in_place_t {}; | template <typename R, typename Z, typename A, typename B> | ||||||
| constexpr in_place_t in_place = {}; | struct is_member_function_pointer<R (Z::*)(A, B) const> : true_type {}; | ||||||
|  |  | ||||||
| // base::in_place_type_t is an implementation of std::in_place_type_t from | template <typename R, typename Z, typename A, typename B, typename C> | ||||||
| // C++17. A tag type used for in-place construction when the type to construct | struct is_member_function_pointer<R (Z::*)(A, B, C)> : true_type {}; | ||||||
| // needs to be specified, such as with base::unique_any, designed to be a | template <typename R, typename Z, typename A, typename B, typename C> | ||||||
| // drop-in replacement. | struct is_member_function_pointer<R (Z::*)(A, B, C) const> : true_type {}; | ||||||
|  |  | ||||||
| // Specification: | template <typename R, | ||||||
| // http://en.cppreference.com/w/cpp/utility/in_place |           typename Z, | ||||||
| template <typename T> |           typename A, | ||||||
| struct in_place_type_t {}; |           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 <typename T> | template <class T, class U> | ||||||
| struct is_in_place_type_t { | struct is_same : public false_type {}; | ||||||
|   static constexpr bool value = false; | 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]; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| template <typename... Ts> | // This class is an implementation detail for is_convertible, and you | ||||||
| struct is_in_place_type_t<in_place_type_t<Ts...>> { | // don't need to know how it works to use is_convertible. For those | ||||||
|   static constexpr bool value = true; | // 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(); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // C++14 implementation of C++17's std::bool_constant. | // Used to determine if a type is a struct/union/class. Inspired by Boost's | ||||||
| // | // is_class type_trait implementation. | ||||||
| // Reference: https://en.cppreference.com/w/cpp/types/integral_constant | struct IsClassHelper { | ||||||
| // Specification: https://wg21.link/meta.type.synop |   template <typename C> | ||||||
| template <bool B> |   static YesType Test(void (C::*)(void)); | ||||||
| using bool_constant = std::integral_constant<bool, B>; |  | ||||||
|  |  | ||||||
| // C++14 implementation of C++17's std::conjunction. |   template <typename C> | ||||||
| // |   static NoType Test(...); | ||||||
| // Reference: https://en.cppreference.com/w/cpp/types/conjunction |  | ||||||
| // Specification: https://wg21.link/meta.logical#1.itemdecl:1 |  | ||||||
| template <typename...> |  | ||||||
| struct conjunction : std::true_type {}; |  | ||||||
|  |  | ||||||
| template <typename B1> |  | ||||||
| struct conjunction<B1> : B1 {}; |  | ||||||
|  |  | ||||||
| template <typename B1, typename... Bn> |  | ||||||
| struct conjunction<B1, Bn...> |  | ||||||
|     : std::conditional_t<static_cast<bool>(B1::value), conjunction<Bn...>, B1> { |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // C++14 implementation of C++17's std::disjunction. | }  // namespace cef_internal | ||||||
|  |  | ||||||
|  | // Inherits from true_type if From is convertible to To, false_type otherwise. | ||||||
| // | // | ||||||
| // Reference: https://en.cppreference.com/w/cpp/types/disjunction | // Note that if the type is convertible, this will be a true_type REGARDLESS | ||||||
| // Specification: https://wg21.link/meta.logical#itemdecl:2 | // of whether or not the conversion would emit a warning. | ||||||
| template <typename...> | template <typename From, typename To> | ||||||
| struct disjunction : std::false_type {}; | struct is_convertible | ||||||
|  |     : integral_constant<bool, | ||||||
| template <typename B1> |                         sizeof(cef_internal::ConvertHelper::Test<To>( | ||||||
| struct disjunction<B1> : B1 {}; |                             cef_internal::ConvertHelper::Create<From>())) == | ||||||
|  |                             sizeof(cef_internal::YesType)> {}; | ||||||
| template <typename B1, typename... Bn> |  | ||||||
| struct disjunction<B1, Bn...> |  | ||||||
|     : std::conditional_t<static_cast<bool>(B1::value), B1, disjunction<Bn...>> { |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| // C++14 implementation of C++17's std::negation. |  | ||||||
| // |  | ||||||
| // Reference: https://en.cppreference.com/w/cpp/types/negation |  | ||||||
| // Specification: https://wg21.link/meta.logical#itemdecl:3 |  | ||||||
| template <typename B> |  | ||||||
| struct negation : bool_constant<!static_cast<bool>(B::value)> {}; |  | ||||||
|  |  | ||||||
| // Implementation of C++17's invoke_result. |  | ||||||
| // |  | ||||||
| // This implementation adds references to `Functor` and `Args` to work around |  | ||||||
| // some quirks of std::result_of. See the #Notes section of [1] for details. |  | ||||||
| // |  | ||||||
| // References: |  | ||||||
| // [1] https://en.cppreference.com/w/cpp/types/result_of |  | ||||||
| // [2] https://wg21.link/meta.trans.other#lib:invoke_result |  | ||||||
| template <typename Functor, typename... Args> |  | ||||||
| using invoke_result = std::result_of<Functor && (Args && ...)>; |  | ||||||
|  |  | ||||||
| // Implementation of C++17's std::invoke_result_t. |  | ||||||
| // |  | ||||||
| // Reference: https://wg21.link/meta.type.synop#lib:invoke_result_t |  | ||||||
| template <typename Functor, typename... Args> |  | ||||||
| using invoke_result_t = typename invoke_result<Functor, Args...>::type; |  | ||||||
|  |  | ||||||
| namespace internal { |  | ||||||
|  |  | ||||||
| // Base case, `InvokeResult` does not have a nested type member. This means `F` |  | ||||||
| // could not be invoked with `Args...` and thus is not invocable. |  | ||||||
| template <typename InvokeResult, typename R, typename = void> |  | ||||||
| struct IsInvocableImpl : std::false_type {}; |  | ||||||
|  |  | ||||||
| // Happy case, `InvokeResult` does have a nested type member. Now check whether |  | ||||||
| // `InvokeResult::type` is convertible to `R`. Short circuit in case |  | ||||||
| // `std::is_void<R>`. |  | ||||||
| template <typename InvokeResult, typename R> |  | ||||||
| struct IsInvocableImpl<InvokeResult, R, void_t<typename InvokeResult::type>> |  | ||||||
|     : disjunction<std::is_void<R>, |  | ||||||
|                   std::is_convertible<typename InvokeResult::type, R>> {}; |  | ||||||
|  |  | ||||||
| }  // namespace internal |  | ||||||
|  |  | ||||||
| // Implementation of C++17's std::is_invocable_r. |  | ||||||
| // |  | ||||||
| // Returns whether `F` can be invoked with `Args...` and the result is |  | ||||||
| // convertible to `R`. |  | ||||||
| // |  | ||||||
| // Reference: https://wg21.link/meta.rel#lib:is_invocable_r |  | ||||||
| template <typename R, typename F, typename... Args> |  | ||||||
| struct is_invocable_r |  | ||||||
|     : internal::IsInvocableImpl<invoke_result<F, Args...>, R> {}; |  | ||||||
|  |  | ||||||
| // Implementation of C++17's std::is_invocable. |  | ||||||
| // |  | ||||||
| // Returns whether `F` can be invoked with `Args...`. |  | ||||||
| // |  | ||||||
| // Reference: https://wg21.link/meta.rel#lib:is_invocable |  | ||||||
| template <typename F, typename... Args> |  | ||||||
| struct is_invocable : is_invocable_r<void, F, Args...> {}; |  | ||||||
|  |  | ||||||
| namespace internal { |  | ||||||
|  |  | ||||||
| // The indirection with std::is_enum<T> is required, because instantiating |  | ||||||
| // std::underlying_type_t<T> when T is not an enum is UB prior to C++20. |  | ||||||
| template <typename T, bool = std::is_enum<T>::value> |  | ||||||
| struct IsScopedEnumImpl : std::false_type {}; |  | ||||||
|  |  | ||||||
| template <typename T> | template <typename T> | ||||||
| struct IsScopedEnumImpl<T, /*std::is_enum<T>::value=*/true> | struct is_class | ||||||
|     : negation<std::is_convertible<T, std::underlying_type_t<T>>> {}; |     : integral_constant<bool, | ||||||
|  |                         sizeof(cef_internal::IsClassHelper::Test<T>(0)) == | ||||||
|  |                             sizeof(cef_internal::YesType)> {}; | ||||||
|  |  | ||||||
| }  // namespace internal | template <bool B, class T = void> | ||||||
|  | struct enable_if {}; | ||||||
|  |  | ||||||
| // Implementation of C++23's std::is_scoped_enum | template <class T> | ||||||
| // | struct enable_if<true, T> { | ||||||
| // Reference: https://en.cppreference.com/w/cpp/types/is_scoped_enum |   typedef T type; | ||||||
| template <typename T> |  | ||||||
| struct is_scoped_enum : internal::IsScopedEnumImpl<T> {}; |  | ||||||
|  |  | ||||||
| // Implementation of C++20's std::remove_cvref. |  | ||||||
| // |  | ||||||
| // References: |  | ||||||
| // - https://en.cppreference.com/w/cpp/types/remove_cvref |  | ||||||
| // - https://wg21.link/meta.trans.other#lib:remove_cvref |  | ||||||
| template <typename T> |  | ||||||
| struct remove_cvref { |  | ||||||
|   using type = std::remove_cv_t<std::remove_reference_t<T>>; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| // Implementation of C++20's std::remove_cvref_t. |  | ||||||
| // |  | ||||||
| // References: |  | ||||||
| // - https://en.cppreference.com/w/cpp/types/remove_cvref |  | ||||||
| // - https://wg21.link/meta.type.synop#lib:remove_cvref_t |  | ||||||
| template <typename T> |  | ||||||
| using remove_cvref_t = typename remove_cvref<T>::type; |  | ||||||
|  |  | ||||||
| // Simplified implementation of C++20's std::iter_value_t. |  | ||||||
| // As opposed to std::iter_value_t, this implementation does not restrict |  | ||||||
| // the type of `Iter` and does not consider specializations of |  | ||||||
| // `indirectly_readable_traits`. |  | ||||||
| // |  | ||||||
| // Reference: https://wg21.link/readable.traits#2 |  | ||||||
| template <typename Iter> |  | ||||||
| using iter_value_t = |  | ||||||
|     typename std::iterator_traits<remove_cvref_t<Iter>>::value_type; |  | ||||||
|  |  | ||||||
| // Simplified implementation of C++20's std::iter_reference_t. |  | ||||||
| // As opposed to std::iter_reference_t, this implementation does not restrict |  | ||||||
| // the type of `Iter`. |  | ||||||
| // |  | ||||||
| // Reference: https://wg21.link/iterator.synopsis#:~:text=iter_reference_t |  | ||||||
| template <typename Iter> |  | ||||||
| using iter_reference_t = decltype(*std::declval<Iter&>()); |  | ||||||
|  |  | ||||||
| // Simplified implementation of C++20's std::indirect_result_t. As opposed to |  | ||||||
| // std::indirect_result_t, this implementation does not restrict the type of |  | ||||||
| // `Func` and `Iters`. |  | ||||||
| // |  | ||||||
| // Reference: https://wg21.link/iterator.synopsis#:~:text=indirect_result_t |  | ||||||
| template <typename Func, typename... Iters> |  | ||||||
| using indirect_result_t = invoke_result_t<Func, iter_reference_t<Iters>...>; |  | ||||||
|  |  | ||||||
| // Simplified implementation of C++20's std::projected. As opposed to |  | ||||||
| // std::projected, this implementation does not explicitly restrict the type of |  | ||||||
| // `Iter` and `Proj`, but rather does so implicitly by requiring |  | ||||||
| // `indirect_result_t<Proj, Iter>` is a valid type. This is required for SFINAE |  | ||||||
| // friendliness. |  | ||||||
| // |  | ||||||
| // Reference: https://wg21.link/projected |  | ||||||
| template <typename Iter, |  | ||||||
|           typename Proj, |  | ||||||
|           typename IndirectResultT = indirect_result_t<Proj, Iter>> |  | ||||||
| struct projected { |  | ||||||
|   using value_type = remove_cvref_t<IndirectResultT>; |  | ||||||
|  |  | ||||||
|   IndirectResultT operator*() const;  // not defined |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| }  // namespace base | }  // namespace base | ||||||
|  |  | ||||||
| #undef CR_USE_FALLBACKS_FOR_GCC_WITH_LIBCXX |  | ||||||
| #undef CR_USE_FALLBACKS_FOR_OLD_EXPERIMENTAL_GLIBCXX |  | ||||||
|  |  | ||||||
| #endif  // !USING_CHROMIUM_INCLUDES | #endif  // !USING_CHROMIUM_INCLUDES | ||||||
|  |  | ||||||
| #endif  // CEF_INCLUDE_BASE_CEF_TEMPLATE_UTIL_H_ | #endif  // CEF_INCLUDE_BASE_CEF_TEMPLATE_UTIL_H_ | ||||||
|   | |||||||
| @@ -32,7 +32,12 @@ | |||||||
| #define CEF_INCLUDE_BASE_THREAD_CHECKER_H_ | #define CEF_INCLUDE_BASE_THREAD_CHECKER_H_ | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #if defined(USING_CHROMIUM_INCLUDES) | #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) | ||||||
| // When building CEF include the Chromium header directly. | // When building CEF include the Chromium header directly. | ||||||
| #include "base/threading/thread_checker.h" | #include "base/threading/thread_checker.h" | ||||||
| #else  // !USING_CHROMIUM_INCLUDES | #else  // !USING_CHROMIUM_INCLUDES | ||||||
|   | |||||||
							
								
								
									
										276
									
								
								include/base/cef_thread_collision_warner.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										276
									
								
								include/base/cef_thread_collision_warner.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,276 @@ | |||||||
|  | // 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_THREAD_COLLISION_WARNER_H_ | ||||||
|  | #define CEF_INCLUDE_BASE_CEF_THREAD_COLLISION_WARNER_H_ | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #if defined(BASE_THREADING_THREAD_COLLISION_WARNER_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/threading/thread_collision_warner.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 "include/base/cef_atomicops.h" | ||||||
|  | #include "include/base/cef_basictypes.h" | ||||||
|  | #include "include/base/cef_build.h" | ||||||
|  | #include "include/base/cef_logging.h" | ||||||
|  | #include "include/base/cef_macros.h" | ||||||
|  |  | ||||||
|  | // A helper class alongside macros to be used to verify assumptions about thread | ||||||
|  | // safety of a class. | ||||||
|  | // | ||||||
|  | // Example: Queue implementation non thread-safe but still usable if clients | ||||||
|  | //          are synchronized somehow. | ||||||
|  | // | ||||||
|  | //          In this case the macro DFAKE_SCOPED_LOCK has to be | ||||||
|  | //          used, it checks that if a thread is inside the push/pop then | ||||||
|  | //          noone else is still inside the pop/push | ||||||
|  | // | ||||||
|  | // class NonThreadSafeQueue { | ||||||
|  | //  public: | ||||||
|  | //   ... | ||||||
|  | //   void push(int) { DFAKE_SCOPED_LOCK(push_pop_); ... } | ||||||
|  | //   int pop() { DFAKE_SCOPED_LOCK(push_pop_); ... } | ||||||
|  | //   ... | ||||||
|  | //  private: | ||||||
|  | //   DFAKE_MUTEX(push_pop_); | ||||||
|  | // }; | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Example: Queue implementation non thread-safe but still usable if clients | ||||||
|  | //          are synchronized somehow, it calls a method to "protect" from | ||||||
|  | //          a "protected" method | ||||||
|  | // | ||||||
|  | //          In this case the macro DFAKE_SCOPED_RECURSIVE_LOCK | ||||||
|  | //          has to be used, it checks that if a thread is inside the push/pop | ||||||
|  | //          then noone else is still inside the pop/push | ||||||
|  | // | ||||||
|  | // class NonThreadSafeQueue { | ||||||
|  | //  public: | ||||||
|  | //   void push(int) { | ||||||
|  | //     DFAKE_SCOPED_LOCK(push_pop_); | ||||||
|  | //     ... | ||||||
|  | //   } | ||||||
|  | //   int pop() { | ||||||
|  | //     DFAKE_SCOPED_RECURSIVE_LOCK(push_pop_); | ||||||
|  | //     bar(); | ||||||
|  | //     ... | ||||||
|  | //   } | ||||||
|  | //   void bar() { DFAKE_SCOPED_RECURSIVE_LOCK(push_pop_); ... } | ||||||
|  | //   ... | ||||||
|  | //  private: | ||||||
|  | //   DFAKE_MUTEX(push_pop_); | ||||||
|  | // }; | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Example: Queue implementation not usable even if clients are synchronized, | ||||||
|  | //          so only one thread in the class life cycle can use the two members | ||||||
|  | //          push/pop. | ||||||
|  | // | ||||||
|  | //          In this case the macro DFAKE_SCOPED_LOCK_THREAD_LOCKED pins the | ||||||
|  | //          specified | ||||||
|  | //          critical section the first time a thread enters push or pop, from | ||||||
|  | //          that time on only that thread is allowed to execute push or pop. | ||||||
|  | // | ||||||
|  | // class NonThreadSafeQueue { | ||||||
|  | //  public: | ||||||
|  | //   ... | ||||||
|  | //   void push(int) { DFAKE_SCOPED_LOCK_THREAD_LOCKED(push_pop_); ... } | ||||||
|  | //   int pop() { DFAKE_SCOPED_LOCK_THREAD_LOCKED(push_pop_); ... } | ||||||
|  | //   ... | ||||||
|  | //  private: | ||||||
|  | //   DFAKE_MUTEX(push_pop_); | ||||||
|  | // }; | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Example: Class that has to be contructed/destroyed on same thread, it has | ||||||
|  | //          a "shareable" method (with external synchronization) and a not | ||||||
|  | //          shareable method (even with external synchronization). | ||||||
|  | // | ||||||
|  | //          In this case 3 Critical sections have to be defined | ||||||
|  | // | ||||||
|  | // class ExoticClass { | ||||||
|  | //  public: | ||||||
|  | //   ExoticClass() { DFAKE_SCOPED_LOCK_THREAD_LOCKED(ctor_dtor_); ... } | ||||||
|  | //   ~ExoticClass() { DFAKE_SCOPED_LOCK_THREAD_LOCKED(ctor_dtor_); ... } | ||||||
|  | // | ||||||
|  | //   void Shareable() { DFAKE_SCOPED_LOCK(shareable_section_); ... } | ||||||
|  | //   void NotShareable() { DFAKE_SCOPED_LOCK_THREAD_LOCKED(ctor_dtor_); ... } | ||||||
|  | //   ... | ||||||
|  | //  private: | ||||||
|  | //   DFAKE_MUTEX(ctor_dtor_); | ||||||
|  | //   DFAKE_MUTEX(shareable_section_); | ||||||
|  | // }; | ||||||
|  |  | ||||||
|  | #if DCHECK_IS_ON() | ||||||
|  |  | ||||||
|  | // Defines a class member that acts like a mutex. It is used only as a | ||||||
|  | // verification tool. | ||||||
|  | #define DFAKE_MUTEX(obj) mutable base::ThreadCollisionWarner obj | ||||||
|  | // Asserts the call is never called simultaneously in two threads. Used at | ||||||
|  | // member function scope. | ||||||
|  | #define DFAKE_SCOPED_LOCK(obj) \ | ||||||
|  |   base::ThreadCollisionWarner::ScopedCheck s_check_##obj(&obj) | ||||||
|  | // Asserts the call is never called simultaneously in two threads. Used at | ||||||
|  | // member function scope. Same as DFAKE_SCOPED_LOCK but allows recursive locks. | ||||||
|  | #define DFAKE_SCOPED_RECURSIVE_LOCK(obj) \ | ||||||
|  |   base::ThreadCollisionWarner::ScopedRecursiveCheck sr_check_##obj(&obj) | ||||||
|  | // Asserts the code is always executed in the same thread. | ||||||
|  | #define DFAKE_SCOPED_LOCK_THREAD_LOCKED(obj) \ | ||||||
|  |   base::ThreadCollisionWarner::Check check_##obj(&obj) | ||||||
|  |  | ||||||
|  | #else | ||||||
|  |  | ||||||
|  | #define DFAKE_MUTEX(obj) typedef void InternalFakeMutexType##obj | ||||||
|  | #define DFAKE_SCOPED_LOCK(obj) ((void)0) | ||||||
|  | #define DFAKE_SCOPED_RECURSIVE_LOCK(obj) ((void)0) | ||||||
|  | #define DFAKE_SCOPED_LOCK_THREAD_LOCKED(obj) ((void)0) | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | namespace base { | ||||||
|  |  | ||||||
|  | // The class ThreadCollisionWarner uses an Asserter to notify the collision | ||||||
|  | // AsserterBase is the interfaces and DCheckAsserter is the default asserter | ||||||
|  | // used. During the unit tests is used another class that doesn't "DCHECK" | ||||||
|  | // in case of collision (check thread_collision_warner_unittests.cc) | ||||||
|  | struct AsserterBase { | ||||||
|  |   virtual ~AsserterBase() {} | ||||||
|  |   virtual void warn() = 0; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | struct DCheckAsserter : public AsserterBase { | ||||||
|  |   virtual ~DCheckAsserter() {} | ||||||
|  |   virtual void warn() OVERRIDE; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | class ThreadCollisionWarner { | ||||||
|  |  public: | ||||||
|  |   // The parameter asserter is there only for test purpose | ||||||
|  |   explicit ThreadCollisionWarner(AsserterBase* asserter = new DCheckAsserter()) | ||||||
|  |       : valid_thread_id_(0), counter_(0), asserter_(asserter) {} | ||||||
|  |  | ||||||
|  |   ~ThreadCollisionWarner() { delete asserter_; } | ||||||
|  |  | ||||||
|  |   // This class is meant to be used through the macro | ||||||
|  |   // DFAKE_SCOPED_LOCK_THREAD_LOCKED | ||||||
|  |   // it doesn't leave the critical section, as opposed to ScopedCheck, | ||||||
|  |   // because the critical section being pinned is allowed to be used only | ||||||
|  |   // from one thread | ||||||
|  |   class Check { | ||||||
|  |    public: | ||||||
|  |     explicit Check(ThreadCollisionWarner* warner) : warner_(warner) { | ||||||
|  |       warner_->EnterSelf(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     ~Check() {} | ||||||
|  |  | ||||||
|  |    private: | ||||||
|  |     ThreadCollisionWarner* warner_; | ||||||
|  |  | ||||||
|  |     DISALLOW_COPY_AND_ASSIGN(Check); | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   // This class is meant to be used through the macro | ||||||
|  |   // DFAKE_SCOPED_LOCK | ||||||
|  |   class ScopedCheck { | ||||||
|  |    public: | ||||||
|  |     explicit ScopedCheck(ThreadCollisionWarner* warner) : warner_(warner) { | ||||||
|  |       warner_->Enter(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     ~ScopedCheck() { warner_->Leave(); } | ||||||
|  |  | ||||||
|  |    private: | ||||||
|  |     ThreadCollisionWarner* warner_; | ||||||
|  |  | ||||||
|  |     DISALLOW_COPY_AND_ASSIGN(ScopedCheck); | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   // This class is meant to be used through the macro | ||||||
|  |   // DFAKE_SCOPED_RECURSIVE_LOCK | ||||||
|  |   class ScopedRecursiveCheck { | ||||||
|  |    public: | ||||||
|  |     explicit ScopedRecursiveCheck(ThreadCollisionWarner* warner) | ||||||
|  |         : warner_(warner) { | ||||||
|  |       warner_->EnterSelf(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     ~ScopedRecursiveCheck() { warner_->Leave(); } | ||||||
|  |  | ||||||
|  |    private: | ||||||
|  |     ThreadCollisionWarner* warner_; | ||||||
|  |  | ||||||
|  |     DISALLOW_COPY_AND_ASSIGN(ScopedRecursiveCheck); | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |  private: | ||||||
|  |   // This method stores the current thread identifier and does a DCHECK | ||||||
|  |   // if a another thread has already done it, it is safe if same thread | ||||||
|  |   // calls this multiple time (recursion allowed). | ||||||
|  |   void EnterSelf(); | ||||||
|  |  | ||||||
|  |   // Same as EnterSelf but recursion is not allowed. | ||||||
|  |   void Enter(); | ||||||
|  |  | ||||||
|  |   // Removes the thread_id stored in order to allow other threads to | ||||||
|  |   // call EnterSelf or Enter. | ||||||
|  |   void Leave(); | ||||||
|  |  | ||||||
|  |   // This stores the thread id that is inside the critical section, if the | ||||||
|  |   // value is 0 then no thread is inside. | ||||||
|  |   volatile subtle::Atomic32 valid_thread_id_; | ||||||
|  |  | ||||||
|  |   // Counter to trace how many time a critical section was "pinned" | ||||||
|  |   // (when allowed) in order to unpin it when counter_ reaches 0. | ||||||
|  |   volatile subtle::Atomic32 counter_; | ||||||
|  |  | ||||||
|  |   // Here only for class unit tests purpose, during the test I need to not | ||||||
|  |   // DCHECK but notify the collision with something else. | ||||||
|  |   AsserterBase* asserter_; | ||||||
|  |  | ||||||
|  |   DISALLOW_COPY_AND_ASSIGN(ThreadCollisionWarner); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | }  // namespace base | ||||||
|  |  | ||||||
|  | #endif  // !USING_CHROMIUM_INCLUDES | ||||||
|  |  | ||||||
|  | #endif  // CEF_INCLUDE_BASE_CEF_THREAD_COLLISION_WARNER_H_ | ||||||
| @@ -140,7 +140,12 @@ | |||||||
| #define CEF_INCLUDE_BASE_CEF_TRACE_EVENT_H_ | #define CEF_INCLUDE_BASE_CEF_TRACE_EVENT_H_ | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #if defined(USING_CHROMIUM_INCLUDES) | #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. | // When building CEF include the Chromium header directly. | ||||||
| #include "base/trace_event/trace_event.h" | #include "base/trace_event/trace_event.h" | ||||||
| #else  // !USING_CHROMIUM_INCLUDES | #else  // !USING_CHROMIUM_INCLUDES | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -29,7 +29,7 @@ | |||||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | // 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, | // Weak pointers are pointers to an object that do not affect its lifetime, | ||||||
| // and which may be invalidated (i.e. reset to nullptr) by the object, or its | // 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. | // 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 | // Weak pointers are useful when an object needs to be accessed safely by one | ||||||
| @@ -42,24 +42,25 @@ | |||||||
| // | // | ||||||
| //  class Controller { | //  class Controller { | ||||||
| //   public: | //   public: | ||||||
|  | //    Controller() : weak_factory_(this) {} | ||||||
| //    void SpawnWorker() { Worker::StartNew(weak_factory_.GetWeakPtr()); } | //    void SpawnWorker() { Worker::StartNew(weak_factory_.GetWeakPtr()); } | ||||||
| //    void WorkComplete(const Result& result) { ... } | //    void WorkComplete(const Result& result) { ... } | ||||||
| //   private: | //   private: | ||||||
| //    // Member variables should appear before the WeakPtrFactory, to ensure | //    // Member variables should appear before the WeakPtrFactory, to ensure | ||||||
| //    // that any WeakPtrs to Controller are invalidated before its members | //    // that any WeakPtrs to Controller are invalidated before its members | ||||||
| //    // variable's destructors are executed, rendering them invalid. | //    // variable's destructors are executed, rendering them invalid. | ||||||
| //    WeakPtrFactory<Controller> weak_factory_{this}; | //    WeakPtrFactory<Controller> weak_factory_; | ||||||
| //  }; | //  }; | ||||||
| // | // | ||||||
| //  class Worker { | //  class Worker { | ||||||
| //   public: | //   public: | ||||||
| //    static void StartNew(WeakPtr<Controller> controller) { | //    static void StartNew(const WeakPtr<Controller>& controller) { | ||||||
| //      Worker* worker = new Worker(std::move(controller)); | //      Worker* worker = new Worker(controller); | ||||||
| //      // Kick off asynchronous processing... | //      // Kick off asynchronous processing... | ||||||
| //    } | //    } | ||||||
| //   private: | //   private: | ||||||
| //    Worker(WeakPtr<Controller> controller) | //    Worker(const WeakPtr<Controller>& controller) | ||||||
| //        : controller_(std::move(controller)) {} | //        : controller_(controller) {} | ||||||
| //    void DidCompleteAsynchronousProcessing(const Result& result) { | //    void DidCompleteAsynchronousProcessing(const Result& result) { | ||||||
| //      if (controller_) | //      if (controller_) | ||||||
| //        controller_->WorkComplete(result); | //        controller_->WorkComplete(result); | ||||||
| @@ -74,19 +75,18 @@ | |||||||
| // ------------------------- IMPORTANT: Thread-safety ------------------------- | // ------------------------- IMPORTANT: Thread-safety ------------------------- | ||||||
|  |  | ||||||
| // Weak pointers may be passed safely between threads, but must always be | // Weak pointers may be passed safely between threads, but must always be | ||||||
| // dereferenced and invalidated on the same ThreaddTaskRunner otherwise | // dereferenced and invalidated on the same thread otherwise checking the | ||||||
| // checking the pointer would be racey. | // pointer would be racey. | ||||||
| // | // | ||||||
| // To ensure correct use, the first time a WeakPtr issued by a WeakPtrFactory | // 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 | // is dereferenced, the factory and its WeakPtrs become bound to the calling | ||||||
| // thread or current ThreaddWorkerPool token, and cannot be dereferenced or | // thread, and cannot be dereferenced or invalidated on any other thread. Bound | ||||||
| // invalidated on any other task runner. Bound WeakPtrs can still be handed | // WeakPtrs can still be handed off to other threads, e.g. to use to post tasks | ||||||
| // off to other task runners, e.g. to use to post tasks back to object on the | // back to object on the bound thread. | ||||||
| // bound thread. |  | ||||||
| // | // | ||||||
| // If all WeakPtr objects are destroyed or invalidated then the factory is | // If all WeakPtr objects are destroyed or invalidated then the factory is | ||||||
| // unbound from the ThreaddTaskRunner/Thread. The WeakPtrFactory may then be | // unbound from the SequencedTaskRunner/Thread. The WeakPtrFactory may then be | ||||||
| // destroyed, or new WeakPtr objects may be used, from a different thread. | // 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 | // 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 | // the correct thread to enforce that other WeakPtr objects will enforce they | ||||||
| @@ -96,7 +96,12 @@ | |||||||
| #define CEF_INCLUDE_BASE_CEF_WEAK_PTR_H_ | #define CEF_INCLUDE_BASE_CEF_WEAK_PTR_H_ | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #if defined(USING_CHROMIUM_INCLUDES) | #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) | ||||||
| // When building CEF include the Chromium header directly. | // When building CEF include the Chromium header directly. | ||||||
| #include "base/memory/weak_ptr.h" | #include "base/memory/weak_ptr.h" | ||||||
| #else  // !USING_CHROMIUM_INCLUDES | #else  // !USING_CHROMIUM_INCLUDES | ||||||
| @@ -104,13 +109,10 @@ | |||||||
| // If the Chromium implementation diverges the below implementation should be | // If the Chromium implementation diverges the below implementation should be | ||||||
| // updated to match. | // updated to match. | ||||||
|  |  | ||||||
| #include <cstddef> | #include "include/base/cef_basictypes.h" | ||||||
| #include <type_traits> |  | ||||||
|  |  | ||||||
| #include "include/base/cef_atomic_flag.h" |  | ||||||
| #include "include/base/cef_logging.h" | #include "include/base/cef_logging.h" | ||||||
| #include "include/base/cef_macros.h" |  | ||||||
| #include "include/base/cef_ref_counted.h" | #include "include/base/cef_ref_counted.h" | ||||||
|  | #include "include/base/cef_template_util.h" | ||||||
| #include "include/base/cef_thread_checker.h" | #include "include/base/cef_thread_checker.h" | ||||||
|  |  | ||||||
| namespace base { | namespace base { | ||||||
| @@ -120,14 +122,14 @@ class SupportsWeakPtr; | |||||||
| template <typename T> | template <typename T> | ||||||
| class WeakPtr; | class WeakPtr; | ||||||
|  |  | ||||||
| namespace internal { | namespace cef_internal { | ||||||
| // These classes are part of the WeakPtr implementation. | // These classes are part of the WeakPtr implementation. | ||||||
| // DO NOT USE THESE CLASSES DIRECTLY YOURSELF. | // DO NOT USE THESE CLASSES DIRECTLY YOURSELF. | ||||||
|  |  | ||||||
| class WeakReference { | class WeakReference { | ||||||
|  public: |  public: | ||||||
|   // Although Flag is bound to a specific ThreaddTaskRunner, it may be |   // Although Flag is bound to a specific thread, it may be deleted from another | ||||||
|   // deleted from another via base::WeakPtr::~WeakPtr(). |   // via base::WeakPtr::~WeakPtr(). | ||||||
|   class Flag : public RefCountedThreadSafe<Flag> { |   class Flag : public RefCountedThreadSafe<Flag> { | ||||||
|    public: |    public: | ||||||
|     Flag(); |     Flag(); | ||||||
| @@ -135,30 +137,23 @@ class WeakReference { | |||||||
|     void Invalidate(); |     void Invalidate(); | ||||||
|     bool IsValid() const; |     bool IsValid() const; | ||||||
|  |  | ||||||
|     bool MaybeValid() const; |  | ||||||
|  |  | ||||||
|     void DetachFromThread(); |  | ||||||
|  |  | ||||||
|    private: |    private: | ||||||
|     friend class base::RefCountedThreadSafe<Flag>; |     friend class base::RefCountedThreadSafe<Flag>; | ||||||
|  |  | ||||||
|     ~Flag(); |     ~Flag(); | ||||||
|  |  | ||||||
|     base::ThreadChecker thread_checker_; |     // The current Chromium implementation uses SequenceChecker instead of | ||||||
|     AtomicFlag invalidated_; |     // ThreadChecker to support SequencedWorkerPools. CEF does not yet expose | ||||||
|  |     // the concept of SequencedWorkerPools. | ||||||
|  |     ThreadChecker thread_checker_; | ||||||
|  |     bool is_valid_; | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   WeakReference(); |   WeakReference(); | ||||||
|   explicit WeakReference(const scoped_refptr<Flag>& flag); |   explicit WeakReference(const Flag* flag); | ||||||
|   ~WeakReference(); |   ~WeakReference(); | ||||||
|  |  | ||||||
|   WeakReference(WeakReference&& other) noexcept; |   bool is_valid() const; | ||||||
|   WeakReference(const WeakReference& other); |  | ||||||
|   WeakReference& operator=(WeakReference&& other) noexcept = default; |  | ||||||
|   WeakReference& operator=(const WeakReference& other) = default; |  | ||||||
|  |  | ||||||
|   bool IsValid() const; |  | ||||||
|   bool MaybeValid() const; |  | ||||||
|  |  | ||||||
|  private: |  private: | ||||||
|   scoped_refptr<const Flag> flag_; |   scoped_refptr<const Flag> flag_; | ||||||
| @@ -171,12 +166,12 @@ class WeakReferenceOwner { | |||||||
|  |  | ||||||
|   WeakReference GetRef() const; |   WeakReference GetRef() const; | ||||||
|  |  | ||||||
|   bool HasRefs() const { return !flag_->HasOneRef(); } |   bool HasRefs() const { return flag_.get() && !flag_->HasOneRef(); } | ||||||
|  |  | ||||||
|   void Invalidate(); |   void Invalidate(); | ||||||
|  |  | ||||||
|  private: |  private: | ||||||
|   scoped_refptr<WeakReference::Flag> flag_; |   mutable scoped_refptr<WeakReference::Flag> flag_; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // This class simplifies the implementation of WeakPtr's type conversion | // This class simplifies the implementation of WeakPtr's type conversion | ||||||
| @@ -188,24 +183,10 @@ class WeakPtrBase { | |||||||
|   WeakPtrBase(); |   WeakPtrBase(); | ||||||
|   ~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_ = internal::WeakReference(); |  | ||||||
|     ptr_ = 0; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|  protected: |  protected: | ||||||
|   WeakPtrBase(const WeakReference& ref, uintptr_t ptr); |   explicit WeakPtrBase(const WeakReference& ref); | ||||||
|  |  | ||||||
|   WeakReference ref_; |   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 | // This class provides a common implementation of common functions that would | ||||||
| @@ -217,14 +198,13 @@ class SupportsWeakPtrBase { | |||||||
|   // conversion will only compile if there is exists a Base which inherits |   // conversion will only compile if there is exists a Base which inherits | ||||||
|   // from SupportsWeakPtr<Base>. See base::AsWeakPtr() below for a helper |   // from SupportsWeakPtr<Base>. See base::AsWeakPtr() below for a helper | ||||||
|   // function that makes calling this easier. |   // function that makes calling this easier. | ||||||
|   // |  | ||||||
|   // Precondition: t != nullptr |  | ||||||
|   template <typename Derived> |   template <typename Derived> | ||||||
|   static WeakPtr<Derived> StaticAsWeakPtr(Derived* t) { |   static WeakPtr<Derived> StaticAsWeakPtr(Derived* t) { | ||||||
|     static_assert( |     typedef is_convertible<Derived, cef_internal::SupportsWeakPtrBase&> | ||||||
|         std::is_base_of<internal::SupportsWeakPtrBase, Derived>::value, |         convertible; | ||||||
|         "AsWeakPtr argument must inherit from SupportsWeakPtr"); |     COMPILE_ASSERT(convertible::value, | ||||||
|     return AsWeakPtrImpl<Derived>(t); |                    AsWeakPtr_argument_inherits_from_SupportsWeakPtr); | ||||||
|  |     return AsWeakPtrImpl<Derived>(t, *t); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  private: |  private: | ||||||
| @@ -232,14 +212,14 @@ class SupportsWeakPtrBase { | |||||||
|   // which is an instance of SupportsWeakPtr<Base>. We can then safely |   // which is an instance of SupportsWeakPtr<Base>. We can then safely | ||||||
|   // static_cast the Base* to a Derived*. |   // static_cast the Base* to a Derived*. | ||||||
|   template <typename Derived, typename Base> |   template <typename Derived, typename Base> | ||||||
|   static WeakPtr<Derived> AsWeakPtrImpl(SupportsWeakPtr<Base>* t) { |   static WeakPtr<Derived> AsWeakPtrImpl(Derived* t, | ||||||
|     WeakPtr<Base> ptr = t->AsWeakPtr(); |                                         const SupportsWeakPtr<Base>&) { | ||||||
|     return WeakPtr<Derived>( |     WeakPtr<Base> ptr = t->Base::AsWeakPtr(); | ||||||
|         ptr.ref_, static_cast<Derived*>(reinterpret_cast<Base*>(ptr.ptr_))); |     return WeakPtr<Derived>(ptr.ref_, static_cast<Derived*>(ptr.ptr_)); | ||||||
|   } |   } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| }  // namespace internal | }  // namespace cef_internal | ||||||
|  |  | ||||||
| template <typename T> | template <typename T> | ||||||
| class WeakPtrFactory; | class WeakPtrFactory; | ||||||
| @@ -258,96 +238,65 @@ class WeakPtrFactory; | |||||||
| //     foo->method(); | //     foo->method(); | ||||||
| // | // | ||||||
| template <typename T> | template <typename T> | ||||||
| class WeakPtr : public internal::WeakPtrBase { | class WeakPtr : public cef_internal::WeakPtrBase { | ||||||
|  public: |  public: | ||||||
|   WeakPtr() = default; |   WeakPtr() : ptr_(NULL) {} | ||||||
|   WeakPtr(std::nullptr_t) {} |  | ||||||
|  |  | ||||||
|   // Allow conversion from U to T provided U "is a" T. Note that this |   // Allow conversion from U to T provided U "is a" T. Note that this | ||||||
|   // is separate from the (implicit) copy and move constructors. |   // is separate from the (implicit) copy constructor. | ||||||
|   template <typename U> |   template <typename U> | ||||||
|   WeakPtr(const WeakPtr<U>& other) : WeakPtrBase(other) { |   WeakPtr(const WeakPtr<U>& other) : WeakPtrBase(other), ptr_(other.ptr_) {} | ||||||
|     // 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 { |   T* get() const { return ref_.is_valid() ? ptr_ : NULL; } | ||||||
|     return ref_.IsValid() ? reinterpret_cast<T*>(ptr_) : nullptr; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   T& operator*() const { |   T& operator*() const { | ||||||
|     CHECK(ref_.IsValid()); |     DCHECK(get() != NULL); | ||||||
|     return *get(); |     return *get(); | ||||||
|   } |   } | ||||||
|   T* operator->() const { |   T* operator->() const { | ||||||
|     CHECK(ref_.IsValid()); |     DCHECK(get() != NULL); | ||||||
|     return get(); |     return get(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // Allow conditionals to test validity, e.g. if (weak_ptr) {...}; |   // Allow WeakPtr<element_type> to be used in boolean expressions, but not | ||||||
|   explicit operator bool() const { return get() != nullptr; } |   // implicitly convertible to a real bool (which is dangerous). | ||||||
|  |  | ||||||
|   // 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 |   // Note that this trick is only safe when the == and != operators | ||||||
|   // instance isn't being re-assigned or reset() racily with this call. |   // are declared explicitly, as otherwise "weak_ptr1 == weak_ptr2" | ||||||
|   bool MaybeValid() const { return ref_.MaybeValid(); } |   // will compile but do the wrong thing (i.e., convert to Testable | ||||||
|  |   // and then do the comparison). | ||||||
|  |  private: | ||||||
|  |   typedef T* WeakPtr::*Testable; | ||||||
|  |  | ||||||
|   // Returns whether the object |this| points to has been invalidated. This can |  public: | ||||||
|   // be used to distinguish a WeakPtr to a destroyed object from one that has |   operator Testable() const { return get() ? &WeakPtr::ptr_ : NULL; } | ||||||
|   // been explicitly set to null. |  | ||||||
|   bool WasInvalidated() const { return ptr_ && !ref_.IsValid(); } |   void reset() { | ||||||
|  |     ref_ = cef_internal::WeakReference(); | ||||||
|  |     ptr_ = NULL; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  private: |  private: | ||||||
|   friend class internal::SupportsWeakPtrBase; |   // 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> |   template <typename U> | ||||||
|   friend class WeakPtr; |   friend class WeakPtr; | ||||||
|   friend class SupportsWeakPtr<T>; |   friend class SupportsWeakPtr<T>; | ||||||
|   friend class WeakPtrFactory<T>; |   friend class WeakPtrFactory<T>; | ||||||
|  |  | ||||||
|   WeakPtr(const internal::WeakReference& ref, T* ptr) |   WeakPtr(const cef_internal::WeakReference& ref, T* ptr) | ||||||
|       : WeakPtrBase(ref, reinterpret_cast<uintptr_t>(ptr)) {} |       : WeakPtrBase(ref), ptr_(ptr) {} | ||||||
| }; |  | ||||||
|  |  | ||||||
| // Allow callers to compare WeakPtrs against nullptr to test validity. |   // This pointer is only valid when ref_.is_valid() is true.  Otherwise, its | ||||||
| template <class T> |   // value is undefined (as opposed to NULL). | ||||||
| bool operator!=(const WeakPtr<T>& weak_ptr, std::nullptr_t) { |   T* ptr_; | ||||||
|   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 internal { |  | ||||||
| class WeakPtrFactoryBase { |  | ||||||
|  protected: |  | ||||||
|   WeakPtrFactoryBase(uintptr_t ptr); |  | ||||||
|   ~WeakPtrFactoryBase(); |  | ||||||
|   internal::WeakReferenceOwner weak_reference_owner_; |  | ||||||
|   uintptr_t ptr_; |  | ||||||
| }; | }; | ||||||
| }  // namespace internal |  | ||||||
|  |  | ||||||
| // A class may be composed of a WeakPtrFactory and thereby | // A class may be composed of a WeakPtrFactory and thereby | ||||||
| // control how it exposes weak pointers to itself.  This is helpful if you only | // control how it exposes weak pointers to itself.  This is helpful if you only | ||||||
| @@ -355,16 +304,15 @@ class WeakPtrFactoryBase { | |||||||
| // useful when working with primitive types.  For example, you could have a | // 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. | // WeakPtrFactory<bool> that is used to pass around a weak reference to a bool. | ||||||
| template <class T> | template <class T> | ||||||
| class WeakPtrFactory : public internal::WeakPtrFactoryBase { | class WeakPtrFactory { | ||||||
|  public: |  public: | ||||||
|   explicit WeakPtrFactory(T* ptr) |   explicit WeakPtrFactory(T* ptr) : ptr_(ptr) {} | ||||||
|       : WeakPtrFactoryBase(reinterpret_cast<uintptr_t>(ptr)) {} |  | ||||||
|  |  | ||||||
|   ~WeakPtrFactory() = default; |   ~WeakPtrFactory() { ptr_ = NULL; } | ||||||
|  |  | ||||||
|   WeakPtr<T> GetWeakPtr() const { |   WeakPtr<T> GetWeakPtr() { | ||||||
|     return WeakPtr<T>(weak_reference_owner_.GetRef(), |     DCHECK(ptr_); | ||||||
|                       reinterpret_cast<T*>(ptr_)); |     return WeakPtr<T>(weak_reference_owner_.GetRef(), ptr_); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // Call this method to invalidate all existing weak pointers. |   // Call this method to invalidate all existing weak pointers. | ||||||
| @@ -380,6 +328,8 @@ class WeakPtrFactory : public internal::WeakPtrFactoryBase { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|  private: |  private: | ||||||
|  |   cef_internal::WeakReferenceOwner weak_reference_owner_; | ||||||
|  |   T* ptr_; | ||||||
|   DISALLOW_IMPLICIT_CONSTRUCTORS(WeakPtrFactory); |   DISALLOW_IMPLICIT_CONSTRUCTORS(WeakPtrFactory); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -389,19 +339,19 @@ class WeakPtrFactory : public internal::WeakPtrFactoryBase { | |||||||
| // weak pointers to the class until after the derived class' members have been | // weak pointers to the class until after the derived class' members have been | ||||||
| // destroyed, its use can lead to subtle use-after-destroy issues. | // destroyed, its use can lead to subtle use-after-destroy issues. | ||||||
| template <class T> | template <class T> | ||||||
| class SupportsWeakPtr : public internal::SupportsWeakPtrBase { | class SupportsWeakPtr : public cef_internal::SupportsWeakPtrBase { | ||||||
|  public: |  public: | ||||||
|   SupportsWeakPtr() = default; |   SupportsWeakPtr() {} | ||||||
|  |  | ||||||
|   WeakPtr<T> AsWeakPtr() { |   WeakPtr<T> AsWeakPtr() { | ||||||
|     return WeakPtr<T>(weak_reference_owner_.GetRef(), static_cast<T*>(this)); |     return WeakPtr<T>(weak_reference_owner_.GetRef(), static_cast<T*>(this)); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  protected: |  protected: | ||||||
|   ~SupportsWeakPtr() = default; |   ~SupportsWeakPtr() {} | ||||||
|  |  | ||||||
|  private: |  private: | ||||||
|   internal::WeakReferenceOwner weak_reference_owner_; |   cef_internal::WeakReferenceOwner weak_reference_owner_; | ||||||
|   DISALLOW_COPY_AND_ASSIGN(SupportsWeakPtr); |   DISALLOW_COPY_AND_ASSIGN(SupportsWeakPtr); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -425,7 +375,7 @@ class SupportsWeakPtr : public internal::SupportsWeakPtrBase { | |||||||
|  |  | ||||||
| template <typename Derived> | template <typename Derived> | ||||||
| WeakPtr<Derived> AsWeakPtr(Derived* t) { | WeakPtr<Derived> AsWeakPtr(Derived* t) { | ||||||
|   return internal::SupportsWeakPtrBase::StaticAsWeakPtr<Derived>(t); |   return cef_internal::SupportsWeakPtrBase::StaticAsWeakPtr<Derived>(t); | ||||||
| } | } | ||||||
|  |  | ||||||
| }  // namespace base | }  // namespace base | ||||||
|   | |||||||
							
								
								
									
										325
									
								
								include/base/internal/cef_atomicops_arm_gcc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										325
									
								
								include/base/internal/cef_atomicops_arm_gcc.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,325 @@ | |||||||
|  | // 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_ | ||||||
							
								
								
									
										124
									
								
								include/base/internal/cef_atomicops_atomicword_compat.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								include/base/internal/cef_atomicops_atomicword_compat.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | |||||||
|  | // 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_ | ||||||
							
								
								
									
										223
									
								
								include/base/internal/cef_atomicops_mac.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										223
									
								
								include/base/internal/cef_atomicops_mac.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,223 @@ | |||||||
|  | // 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_ | ||||||
							
								
								
									
										268
									
								
								include/base/internal/cef_atomicops_x86_gcc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										268
									
								
								include/base/internal/cef_atomicops_x86_gcc.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,268 @@ | |||||||
|  | // 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_ | ||||||
							
								
								
									
										221
									
								
								include/base/internal/cef_atomicops_x86_msvc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										221
									
								
								include/base/internal/cef_atomicops_x86_msvc.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,221 @@ | |||||||
|  | // 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_ | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										396
									
								
								include/base/internal/cef_bind_internal_win.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										396
									
								
								include/base/internal/cef_bind_internal_win.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,396 @@ | |||||||
|  | // 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_64) | ||||||
|  |  | ||||||
|  | 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_X86_64) | ||||||
|  |  | ||||||
|  | #endif  // CEF_INCLUDE_BASE_INTERNAL_CEF_BIND_INTERNAL_WIN_H_ | ||||||
| @@ -36,156 +36,72 @@ | |||||||
| #ifndef CEF_INCLUDE_BASE_INTERNAL_CEF_CALLBACK_INTERNAL_H_ | #ifndef CEF_INCLUDE_BASE_INTERNAL_CEF_CALLBACK_INTERNAL_H_ | ||||||
| #define CEF_INCLUDE_BASE_INTERNAL_CEF_CALLBACK_INTERNAL_H_ | #define CEF_INCLUDE_BASE_INTERNAL_CEF_CALLBACK_INTERNAL_H_ | ||||||
|  |  | ||||||
| #include "include/base/cef_callback_forward.h" | #include <stddef.h> | ||||||
|  |  | ||||||
|  | #include "include/base/cef_atomic_ref_count.h" | ||||||
|  | #include "include/base/cef_macros.h" | ||||||
| #include "include/base/cef_ref_counted.h" | #include "include/base/cef_ref_counted.h" | ||||||
|  | #include "include/base/cef_scoped_ptr.h" | ||||||
| namespace base { | #include "include/base/cef_template_util.h" | ||||||
|  |  | ||||||
| struct FakeBindState; |  | ||||||
|  |  | ||||||
| namespace 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> | template <typename T> | ||||||
| using PassingType = std::conditional_t<std::is_scalar<T>::value, T, T&&>; | class ScopedVector; | ||||||
|  |  | ||||||
| // BindStateBase is used to provide an opaque handle that the Callback | namespace base { | ||||||
| // class can use to represent a function object with bound arguments.  It | namespace cef_internal { | ||||||
| // behaves as an existential type that is used by a corresponding | class CallbackBase; | ||||||
| // 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 { | // At the base level, the only task is to add reference counting data. Don't use | ||||||
|     IS_CANCELLED, | // RefCountedThreadSafe since it requires the destructor to be a virtual method. | ||||||
|     MAYBE_VALID, | // 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. | ||||||
|   using InvokeFuncStorage = void (*)(); | class BindStateBase { | ||||||
|  |  protected: | ||||||
|   BindStateBase(const BindStateBase&) = delete; |   explicit BindStateBase(void (*destructor)(BindStateBase*)) | ||||||
|   BindStateBase& operator=(const BindStateBase&) = delete; |       : ref_count_(0), destructor_(destructor) {} | ||||||
|  |   ~BindStateBase() {} | ||||||
|  |  | ||||||
|  private: |  private: | ||||||
|   BindStateBase(InvokeFuncStorage polymorphic_invoke, |   friend class scoped_refptr<BindStateBase>; | ||||||
|                 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 CallbackBase; | ||||||
|   friend class CallbackBaseCopyable; |  | ||||||
|  |  | ||||||
|   // Allowlist subclasses that access the destructor of BindStateBase. |   void AddRef(); | ||||||
|   template <typename Functor, typename... BoundArgs> |   void Release(); | ||||||
|   friend struct BindState; |  | ||||||
|   friend struct ::base::FakeBindState; |  | ||||||
|  |  | ||||||
|   bool IsCancelled() const { |   AtomicRefCount ref_count_; | ||||||
|     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|. |   // Pointer to a function that will properly destroy |this|. | ||||||
|   void (*destructor_)(const BindStateBase*); |   void (*destructor_)(BindStateBase*); | ||||||
|   bool (*query_cancellation_traits_)(const BindStateBase*, |  | ||||||
|                                      CancellationQueryMode mode); |   DISALLOW_COPY_AND_ASSIGN(BindStateBase); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // Holds the Callback methods that don't require specialization to reduce | // Holds the Callback methods that don't require specialization to reduce | ||||||
| // template bloat. | // template bloat. | ||||||
| // CallbackBase<MoveOnly> is a direct base class of MoveOnly callbacks, and |  | ||||||
| // CallbackBase<Copyable> uses CallbackBase<MoveOnly> for its implementation. |  | ||||||
| class CallbackBase { | class CallbackBase { | ||||||
|  public: |  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). |   // Returns true if Callback is null (doesn't refer to anything). | ||||||
|   bool is_null() const { return !bind_state_; } |   bool is_null() const { return bind_state_.get() == NULL; } | ||||||
|   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. |   // Returns the Callback into an uninitialized state. | ||||||
|   void Reset(); |   void Reset(); | ||||||
|  |  | ||||||
|  protected: |  protected: | ||||||
|   friend class FinallyExecutorCommon; |   // In C++, it is safe to cast function pointers to function pointers of | ||||||
|   friend class ThenAndCatchExecutorCommon; |   // 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 | ||||||
|   template <typename ReturnType> |   // the original type on usage. | ||||||
|   friend class PostTaskExecutor; |   typedef void (*InvokeFuncStorage)(void); | ||||||
|  |  | ||||||
|   using InvokeFuncStorage = BindStateBase::InvokeFuncStorage; |  | ||||||
|  |  | ||||||
|   // Returns true if this callback equals |other|. |other| may be null. |   // Returns true if this callback equals |other|. |other| may be null. | ||||||
|   bool EqualsInternal(const CallbackBase& other) const; |   bool Equals(const CallbackBase& other) const; | ||||||
|  |  | ||||||
|   constexpr inline CallbackBase(); |  | ||||||
|  |  | ||||||
|   // Allow initializing of |bind_state_| via the constructor to avoid default |   // Allow initializing of |bind_state_| via the constructor to avoid default | ||||||
|   // initialization of the scoped_refptr. |   // initialization of the scoped_refptr.  We do not also initialize | ||||||
|   explicit inline CallbackBase(BindStateBase* bind_state); |   // |polymorphic_invoke_| here because doing a normal assignment in the | ||||||
|  |   // derived Callback templates makes for much nicer compiler errors. | ||||||
|   InvokeFuncStorage polymorphic_invoke() const { |   explicit CallbackBase(BindStateBase* bind_state); | ||||||
|     return bind_state_->polymorphic_invoke_; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // Force the destructor to be instantiated inside this translation unit so |   // Force the destructor to be instantiated inside this translation unit so | ||||||
|   // that our subclasses will not get inlined versions.  Avoids more template |   // that our subclasses will not get inlined versions.  Avoids more template | ||||||
| @@ -193,83 +109,116 @@ class CallbackBase { | |||||||
|   ~CallbackBase(); |   ~CallbackBase(); | ||||||
|  |  | ||||||
|   scoped_refptr<BindStateBase> bind_state_; |   scoped_refptr<BindStateBase> bind_state_; | ||||||
|  |   InvokeFuncStorage polymorphic_invoke_; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| constexpr CallbackBase::CallbackBase() = default; | // A helper template to determine if given type is non-const move-only-type, | ||||||
| CallbackBase::CallbackBase(CallbackBase&&) noexcept = default; | // i.e. if a value of the given type should be passed via .Pass() in a | ||||||
| CallbackBase::CallbackBase(BindStateBase* bind_state) | // destructive way. | ||||||
|     : bind_state_(AdoptRef(bind_state)) {} | template <typename T> | ||||||
|  | struct IsMoveOnlyType { | ||||||
|  |   template <typename U> | ||||||
|  |   static YesType Test(const typename U::MoveOnlyTypeForCPP03*); | ||||||
|  |  | ||||||
| // CallbackBase<Copyable> is a direct base class of Copyable Callbacks. |   template <typename U> | ||||||
| class CallbackBaseCopyable : public CallbackBase { |   static NoType Test(...); | ||||||
|  public: |  | ||||||
|   CallbackBaseCopyable(const CallbackBaseCopyable& c); |  | ||||||
|   CallbackBaseCopyable(CallbackBaseCopyable&& c) noexcept = default; |  | ||||||
|   CallbackBaseCopyable& operator=(const CallbackBaseCopyable& c); |  | ||||||
|   CallbackBaseCopyable& operator=(CallbackBaseCopyable&& c) noexcept; |  | ||||||
|  |  | ||||||
|  protected: |   static const bool value = | ||||||
|   constexpr CallbackBaseCopyable() = default; |       sizeof(Test<T>(0)) == sizeof(YesType) && !is_const<T>::value; | ||||||
|   explicit CallbackBaseCopyable(BindStateBase* bind_state) |  | ||||||
|       : CallbackBase(bind_state) {} |  | ||||||
|   ~CallbackBaseCopyable() = default; |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // Helpers for the `Then()` implementation. | // This is a typetraits object that's used to take an argument type, and | ||||||
| template <typename OriginalCallback, typename ThenCallback> | // extract a suitable type for storing and forwarding arguments. | ||||||
| struct ThenHelper; | // | ||||||
|  | // In particular, it strips off references, and converts arrays to | ||||||
| // Specialization when original callback returns `void`. | // pointers for storage; and it avoids accidentally trying to create a | ||||||
| template <template <typename> class OriginalCallback, | // "reference of a reference" if the argument is a reference type. | ||||||
|           template <typename> | // | ||||||
|           class ThenCallback, | // This array type becomes an issue for storage because we are passing bound | ||||||
|           typename... OriginalArgs, | // parameters by const reference. In this case, we end up passing an actual | ||||||
|           typename ThenR, | // array type in the initializer list which C++ does not allow.  This will | ||||||
|           typename... ThenArgs> | // break passing of C-string literals. | ||||||
| struct ThenHelper<OriginalCallback<void(OriginalArgs...)>, | template <typename T, bool is_move_only = IsMoveOnlyType<T>::value> | ||||||
|                   ThenCallback<ThenR(ThenArgs...)>> { | struct CallbackParamTraits { | ||||||
|   static_assert(sizeof...(ThenArgs) == 0, |   typedef const T& ForwardType; | ||||||
|                 "|then| callback cannot accept parameters if |this| has a " |   typedef T StorageType; | ||||||
|                 "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(); |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // Specialization when original callback returns a non-void type. | // The Storage should almost be impossible to trigger unless someone manually | ||||||
| template <template <typename> class OriginalCallback, | // specifies type of the bind parameters.  However, in case they do, | ||||||
|           template <typename> | // this will guard against us accidentally storing a reference parameter. | ||||||
|           class ThenCallback, | // | ||||||
|           typename OriginalR, | // The ForwardType should only be used for unbound arguments. | ||||||
|           typename... OriginalArgs, | template <typename T> | ||||||
|           typename ThenR, | struct CallbackParamTraits<T&, false> { | ||||||
|           typename... ThenArgs> |   typedef T& ForwardType; | ||||||
| struct ThenHelper<OriginalCallback<OriginalR(OriginalArgs...)>, |   typedef T StorageType; | ||||||
|                   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)...)); |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| }  // namespace internal | // 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 | }  // namespace base | ||||||
|  |  | ||||||
| #endif  // CEF_INCLUDE_BASE_INTERNAL_CEF_CALLBACK_INTERNAL_H_ | #endif  // CEF_INCLUDE_BASE_INTERNAL_CEF_CALLBACK_INTERNAL_H_ | ||||||
|   | |||||||
| @@ -1,8 +0,0 @@ | |||||||
| // Copyright (c) 2019 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. |  | ||||||
| // |  | ||||||
| // Include net error codes from the Chromium source location. When creating a |  | ||||||
| // CEF binary distribution this file will be replaced with the Chromium version. |  | ||||||
|  |  | ||||||
| #include "net/base/net_error_list.h" |  | ||||||
| @@ -32,9 +32,10 @@ | |||||||
| #ifndef CEF_INCLUDE_BASE_INTERNAL_CEF_RAW_SCOPED_REFPTR_MISMATCH_CHECKER_H_ | #ifndef CEF_INCLUDE_BASE_INTERNAL_CEF_RAW_SCOPED_REFPTR_MISMATCH_CHECKER_H_ | ||||||
| #define CEF_INCLUDE_BASE_INTERNAL_CEF_RAW_SCOPED_REFPTR_MISMATCH_CHECKER_H_ | #define CEF_INCLUDE_BASE_INTERNAL_CEF_RAW_SCOPED_REFPTR_MISMATCH_CHECKER_H_ | ||||||
|  |  | ||||||
| #include <type_traits> | #include "include/base/cef_build.h" | ||||||
|  | #include "include/base/cef_ref_counted.h" | ||||||
| #include "include/base/cef_template_util.h" | #include "include/base/cef_template_util.h" | ||||||
|  | #include "include/base/cef_tuple.h" | ||||||
|  |  | ||||||
| // It is dangerous to post a task with a T* argument where T is a subtype of | // 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 | // RefCounted(Base|ThreadSafeBase), since by the time the parameter is used, the | ||||||
| @@ -45,30 +46,135 @@ | |||||||
|  |  | ||||||
| namespace base { | namespace base { | ||||||
|  |  | ||||||
| // This is a base internal implementation file used by task.h and callback.h. | namespace cef_internal { | ||||||
| // Not for public consumption, so we wrap it in namespace internal. |  | ||||||
| namespace internal { |  | ||||||
|  |  | ||||||
| template <typename T, typename = void> |  | ||||||
| struct IsRefCountedType : std::false_type {}; |  | ||||||
|  |  | ||||||
| template <typename T> | template <typename T> | ||||||
| struct IsRefCountedType<T, | struct NeedsScopedRefptrButGetsRawPtr { | ||||||
|                         void_t<decltype(std::declval<T*>()->AddRef()), | #if defined(OS_WIN) | ||||||
|                                decltype(std::declval<T*>()->Release())>> |   enum { value = base::false_type::value }; | ||||||
|     : std::true_type {}; | #else | ||||||
|  |   enum { | ||||||
| // Human readable translation: you needed to be a scoped_refptr if you are a raw |     // Human readable translation: you needed to be a scoped_refptr if you are a | ||||||
| // pointer type and are convertible to a RefCounted(Base|ThreadSafeBase) type. |     // raw pointer type and are convertible to a RefCounted(Base|ThreadSafeBase) | ||||||
| template <typename T> |     // type. | ||||||
| struct NeedsScopedRefptrButGetsRawPtr |     value = (is_pointer<T>::value && | ||||||
|     : conjunction<std::is_pointer<T>, |              (is_convertible<T, subtle::RefCountedBase*>::value || | ||||||
|                   IsRefCountedType<std::remove_pointer_t<T>>> { |               is_convertible<T, subtle::RefCountedThreadSafeBase*>::value)) | ||||||
|   static_assert(!std::is_reference<T>::value, |   }; | ||||||
|                 "NeedsScopedRefptrButGetsRawPtr requires non-reference type."); | #endif | ||||||
| }; | }; | ||||||
|  |  | ||||||
| }  // namespace internal | 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) | ||||||
|  |   }; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | }  // namespace cef_internal | ||||||
|  |  | ||||||
| }  // namespace base | }  // namespace base | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,66 +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/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 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 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, internal::ScopedBlockTraits<B>>; |  | ||||||
|  |  | ||||||
| }  // namespace mac |  | ||||||
| }  // namespace base |  | ||||||
|  |  | ||||||
| #endif  // CEF_INCLUDE_BASE_INTERNAL_CEF_SCOPED_BLOCK_MAC_H_ |  | ||||||
| @@ -1,53 +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/memory/scoped_policy.h |  | ||||||
| // instead. |  | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_BASE_INTERNAL_CEF_SCOPED_POLICY_H_ |  | ||||||
| #define CEF_INCLUDE_BASE_INTERNAL_CEF_SCOPED_POLICY_H_ |  | ||||||
|  |  | ||||||
| namespace base { |  | ||||||
| namespace scoped_policy { |  | ||||||
|  |  | ||||||
| // 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 |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| }  // namespace scoped_policy |  | ||||||
| }  // namespace base |  | ||||||
|  |  | ||||||
| #endif  // CEF_INCLUDE_BASE_INTERNAL_CEF_SCOPED_POLICY_H_ |  | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=306e44d49ab6198a0fa1bcea50e8a25ee18672be$ | // $hash=ade29136d75b33f63cf65db4b91de9cd66114562$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_ACCESSIBILITY_HANDLER_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_ACCESSIBILITY_HANDLER_CAPI_H_ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=adfba3dd6479b96a95639c13ee1e07bed7b335d0$ | // $hash=52ce63b881a6e3d2d13a39b81ad2626f366fc130$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_APP_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_APP_CAPI_H_ | ||||||
|   | |||||||
| @@ -1,121 +0,0 @@ | |||||||
| // 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=fd8d34089842ee8f8490ef1828c3091d12052e28$ |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_AUDIO_HANDLER_CAPI_H_ |  | ||||||
| #define CEF_INCLUDE_CAPI_CEF_AUDIO_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 audio events. |  | ||||||
| /// |  | ||||||
| typedef struct _cef_audio_handler_t { |  | ||||||
|   /// |  | ||||||
|   // 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. |  | ||||||
|   /// |  | ||||||
|   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. |  | ||||||
|   /// |  | ||||||
|   void(CEF_CALLBACK* on_audio_stream_started)( |  | ||||||
|       struct _cef_audio_handler_t* self, |  | ||||||
|       struct _cef_browser_t* browser, |  | ||||||
|       const cef_audio_parameters_t* params, |  | ||||||
|       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. |  | ||||||
|   /// |  | ||||||
|   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); |  | ||||||
|  |  | ||||||
|   /// |  | ||||||
|   // 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. |  | ||||||
|   /// |  | ||||||
|   void(CEF_CALLBACK* on_audio_stream_error)(struct _cef_audio_handler_t* self, |  | ||||||
|                                             struct _cef_browser_t* browser, |  | ||||||
|                                             const cef_string_t* message); |  | ||||||
| } cef_audio_handler_t; |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #endif  // CEF_INCLUDE_CAPI_CEF_AUDIO_HANDLER_CAPI_H_ |  | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=01a33de48ac9780f78d606d8aee2429ddb0c81a2$ | // $hash=639d58245ecd39624d39ee8b49e0e4e056d1c4ed$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_AUTH_CALLBACK_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_AUTH_CALLBACK_CAPI_H_ | ||||||
|   | |||||||
| @@ -69,11 +69,6 @@ typedef struct _cef_base_ref_counted_t { | |||||||
|   // Returns true (1) if the current reference count is 1. |   // Returns true (1) if the current reference count is 1. | ||||||
|   /// |   /// | ||||||
|   int(CEF_CALLBACK* has_one_ref)(struct _cef_base_ref_counted_t* self); |   int(CEF_CALLBACK* has_one_ref)(struct _cef_base_ref_counted_t* self); | ||||||
|  |  | ||||||
|   /// |  | ||||||
|   // Returns true (1) if the current reference count is at least 1. |  | ||||||
|   /// |  | ||||||
|   int(CEF_CALLBACK* has_at_least_one_ref)(struct _cef_base_ref_counted_t* self); |  | ||||||
| } cef_base_ref_counted_t; | } cef_base_ref_counted_t; | ||||||
|  |  | ||||||
| /// | /// | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=8af93d03e0b2a6b50d7612b145599600285b76d4$ | // $hash=b6308ab5e97eb9f7af95f1f4c371fd6e7edbf852$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_BROWSER_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_BROWSER_CAPI_H_ | ||||||
| @@ -41,12 +41,11 @@ | |||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include "include/capi/cef_base_capi.h" | #include "include/capi/cef_base_capi.h" | ||||||
| #include "include/capi/cef_devtools_message_observer_capi.h" |  | ||||||
| #include "include/capi/cef_drag_data_capi.h" | #include "include/capi/cef_drag_data_capi.h" | ||||||
| #include "include/capi/cef_frame_capi.h" | #include "include/capi/cef_frame_capi.h" | ||||||
| #include "include/capi/cef_image_capi.h" | #include "include/capi/cef_image_capi.h" | ||||||
| #include "include/capi/cef_navigation_entry_capi.h" | #include "include/capi/cef_navigation_entry_capi.h" | ||||||
| #include "include/capi/cef_registration_capi.h" | #include "include/capi/cef_process_message_capi.h" | ||||||
| #include "include/capi/cef_request_context_capi.h" | #include "include/capi/cef_request_context_capi.h" | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| @@ -57,10 +56,10 @@ struct _cef_browser_host_t; | |||||||
| struct _cef_client_t; | struct _cef_client_t; | ||||||
|  |  | ||||||
| /// | /// | ||||||
| // Structure used to represent a browser. When used in the browser process the | // Structure used to represent a browser window. When used in the browser | ||||||
| // functions of this structure may be called on any thread unless otherwise | // process the functions of this structure may be called on any thread unless | ||||||
| // indicated in the comments. When used in the render process the functions of | // otherwise indicated in the comments. When used in the render process the | ||||||
| // this structure may only be called on the main thread. | // functions of this structure may only be called on the main thread. | ||||||
| /// | /// | ||||||
| typedef struct _cef_browser_t { | typedef struct _cef_browser_t { | ||||||
|   /// |   /// | ||||||
| @@ -68,12 +67,6 @@ typedef struct _cef_browser_t { | |||||||
|   /// |   /// | ||||||
|   cef_base_ref_counted_t base; |   cef_base_ref_counted_t base; | ||||||
|  |  | ||||||
|   /// |  | ||||||
|   // 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 |   // Returns the browser host object. This function can only be called in the | ||||||
|   // browser process. |   // browser process. | ||||||
| @@ -122,8 +115,7 @@ typedef struct _cef_browser_t { | |||||||
|   void(CEF_CALLBACK* stop_load)(struct _cef_browser_t* self); |   void(CEF_CALLBACK* stop_load)(struct _cef_browser_t* self); | ||||||
|  |  | ||||||
|   /// |   /// | ||||||
|   // Returns the globally unique identifier for this browser. This value is also |   // Returns the globally unique identifier for this browser. | ||||||
|   // used as the tabId for extension APIs. |  | ||||||
|   /// |   /// | ||||||
|   int(CEF_CALLBACK* get_identifier)(struct _cef_browser_t* self); |   int(CEF_CALLBACK* get_identifier)(struct _cef_browser_t* self); | ||||||
|  |  | ||||||
| @@ -135,7 +127,7 @@ typedef struct _cef_browser_t { | |||||||
|                              struct _cef_browser_t* that); |                              struct _cef_browser_t* that); | ||||||
|  |  | ||||||
|   /// |   /// | ||||||
|   // Returns true (1) if the browser is a popup. |   // Returns true (1) if the window is a popup window. | ||||||
|   /// |   /// | ||||||
|   int(CEF_CALLBACK* is_popup)(struct _cef_browser_t* self); |   int(CEF_CALLBACK* is_popup)(struct _cef_browser_t* self); | ||||||
|  |  | ||||||
| @@ -145,19 +137,13 @@ typedef struct _cef_browser_t { | |||||||
|   int(CEF_CALLBACK* has_document)(struct _cef_browser_t* self); |   int(CEF_CALLBACK* has_document)(struct _cef_browser_t* self); | ||||||
|  |  | ||||||
|   /// |   /// | ||||||
|   // Returns the main (top-level) frame for the browser. In the browser process |   // Returns the main (top-level) frame for the browser window. | ||||||
|   // 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_frame_t*(CEF_CALLBACK* get_main_frame)( | ||||||
|       struct _cef_browser_t* self); |       struct _cef_browser_t* self); | ||||||
|  |  | ||||||
|   /// |   /// | ||||||
|   // Returns the focused frame for the browser. |   // Returns the focused frame for the browser window. | ||||||
|   /// |   /// | ||||||
|   struct _cef_frame_t*(CEF_CALLBACK* get_focused_frame)( |   struct _cef_frame_t*(CEF_CALLBACK* get_focused_frame)( | ||||||
|       struct _cef_browser_t* self); |       struct _cef_browser_t* self); | ||||||
| @@ -192,6 +178,15 @@ typedef struct _cef_browser_t { | |||||||
|   /// |   /// | ||||||
|   void(CEF_CALLBACK* get_frame_names)(struct _cef_browser_t* self, |   void(CEF_CALLBACK* get_frame_names)(struct _cef_browser_t* self, | ||||||
|                                       cef_string_list_t names); |                                       cef_string_list_t names); | ||||||
|  |  | ||||||
|  |   /// | ||||||
|  |   // Send a message to the specified |target_process|. Returns true (1) if the | ||||||
|  |   // message was sent successfully. | ||||||
|  |   /// | ||||||
|  |   int(CEF_CALLBACK* send_process_message)( | ||||||
|  |       struct _cef_browser_t* self, | ||||||
|  |       cef_process_id_t target_process, | ||||||
|  |       struct _cef_process_message_t* message); | ||||||
| } cef_browser_t; | } cef_browser_t; | ||||||
|  |  | ||||||
| /// | /// | ||||||
| @@ -286,10 +281,10 @@ typedef struct _cef_download_image_callback_t { | |||||||
| } cef_download_image_callback_t; | } cef_download_image_callback_t; | ||||||
|  |  | ||||||
| /// | /// | ||||||
| // Structure used to represent the browser process aspects of a browser. The | // Structure used to represent the browser process aspects of a browser window. | ||||||
| // functions of this structure can only be called in the browser process. They | // The functions of this structure can only be called in the browser process. | ||||||
| // may be called on any thread in that process unless otherwise indicated in the | // They may be called on any thread in that process unless otherwise indicated | ||||||
| // comments. | // in the comments. | ||||||
| /// | /// | ||||||
| typedef struct _cef_browser_host_t { | typedef struct _cef_browser_host_t { | ||||||
|   /// |   /// | ||||||
| @@ -318,12 +313,11 @@ typedef struct _cef_browser_host_t { | |||||||
|  |  | ||||||
|   /// |   /// | ||||||
|   // Helper for closing a browser. Call this function from the top-level window |   // Helper for closing a browser. Call this function from the top-level window | ||||||
|   // close handler (if any). Internally this calls CloseBrowser(false (0)) if |   // close handler. Internally this calls CloseBrowser(false (0)) if the close | ||||||
|   // the close has not yet been initiated. This function returns false (0) while |   // has not yet been initiated. This function returns false (0) while the close | ||||||
|   // the close is pending and true (1) after the close has completed. See |   // is pending and true (1) after the close has completed. See close_browser() | ||||||
|   // close_browser() and cef_life_span_handler_t::do_close() documentation for |   // and cef_life_span_handler_t::do_close() documentation for additional usage | ||||||
|   // additional usage information. This function must be called on the browser |   // information. This function must be called on the browser process UI thread. | ||||||
|   // process UI thread. |  | ||||||
|   /// |   /// | ||||||
|   int(CEF_CALLBACK* try_close_browser)(struct _cef_browser_host_t* self); |   int(CEF_CALLBACK* try_close_browser)(struct _cef_browser_host_t* self); | ||||||
|  |  | ||||||
| @@ -333,19 +327,18 @@ typedef struct _cef_browser_host_t { | |||||||
|   void(CEF_CALLBACK* set_focus)(struct _cef_browser_host_t* self, int focus); |   void(CEF_CALLBACK* set_focus)(struct _cef_browser_host_t* self, int focus); | ||||||
|  |  | ||||||
|   /// |   /// | ||||||
|   // Retrieve the window handle (if any) for this browser. If this browser is |   // Retrieve the window handle for this browser. If this browser is wrapped in | ||||||
|   // wrapped in a cef_browser_view_t this function should be called on the |   // a cef_browser_view_t this function should be called on the browser process | ||||||
|   // browser process UI thread and it will return the handle for the top-level |   // UI thread and it will return the handle for the top-level native window. | ||||||
|   // native window. |  | ||||||
|   /// |   /// | ||||||
|   cef_window_handle_t(CEF_CALLBACK* get_window_handle)( |   cef_window_handle_t(CEF_CALLBACK* get_window_handle)( | ||||||
|       struct _cef_browser_host_t* self); |       struct _cef_browser_host_t* self); | ||||||
|  |  | ||||||
|   /// |   /// | ||||||
|   // Retrieve the window handle (if any) of the browser that opened this |   // Retrieve the window handle of the browser that opened this browser. Will | ||||||
|   // browser. Will return NULL for non-popup browsers or if this browser is |   // return NULL for non-popup windows or if this browser is wrapped in a | ||||||
|   // wrapped in a cef_browser_view_t. This function can be used in combination |   // cef_browser_view_t. This function can be used in combination with custom | ||||||
|   // with custom handling of modal windows. |   // handling of modal windows. | ||||||
|   /// |   /// | ||||||
|   cef_window_handle_t(CEF_CALLBACK* get_opener_window_handle)( |   cef_window_handle_t(CEF_CALLBACK* get_opener_window_handle)( | ||||||
|       struct _cef_browser_host_t* self); |       struct _cef_browser_host_t* self); | ||||||
| @@ -500,71 +493,6 @@ typedef struct _cef_browser_host_t { | |||||||
|   /// |   /// | ||||||
|   int(CEF_CALLBACK* has_dev_tools)(struct _cef_browser_host_t* self); |   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. |  | ||||||
|   /// |  | ||||||
|   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. |  | ||||||
|   /// |  | ||||||
|   int(CEF_CALLBACK* execute_dev_tools_method)( |  | ||||||
|       struct _cef_browser_host_t* self, |  | ||||||
|       int message_id, |  | ||||||
|       const cef_string_t* method, |  | ||||||
|       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. |  | ||||||
|   /// |  | ||||||
|   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 |   // Retrieve a snapshot of current navigation entries as values sent to the | ||||||
|   // specified visitor. If |current_only| is true (1) only the current |   // specified visitor. If |current_only| is true (1) only the current | ||||||
| @@ -576,6 +504,19 @@ typedef struct _cef_browser_host_t { | |||||||
|       struct _cef_navigation_entry_visitor_t* visitor, |       struct _cef_navigation_entry_visitor_t* visitor, | ||||||
|       int current_only); |       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 |   // If a misspelled word is currently selected in an editable node calling this | ||||||
|   // function will replace it with the specified |word|. |   // function will replace it with the specified |word|. | ||||||
| @@ -629,13 +570,6 @@ typedef struct _cef_browser_host_t { | |||||||
|   void(CEF_CALLBACK* invalidate)(struct _cef_browser_host_t* self, |   void(CEF_CALLBACK* invalidate)(struct _cef_browser_host_t* self, | ||||||
|                                  cef_paint_element_type_t type); |                                  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). |  | ||||||
|   /// |  | ||||||
|   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. | ||||||
|   /// |   /// | ||||||
| @@ -676,10 +610,10 @@ typedef struct _cef_browser_host_t { | |||||||
|       int deltaY); |       int deltaY); | ||||||
|  |  | ||||||
|   /// |   /// | ||||||
|   // Send a touch event to the browser for a windowless browser. |   // Send a focus event to the browser. | ||||||
|   /// |   /// | ||||||
|   void(CEF_CALLBACK* send_touch_event)(struct _cef_browser_host_t* self, |   void(CEF_CALLBACK* send_focus_event)(struct _cef_browser_host_t* self, | ||||||
|                                        const struct _cef_touch_event_t* event); |                                        int setFocus); | ||||||
|  |  | ||||||
|   /// |   /// | ||||||
|   // Send a capture lost event to the browser. |   // Send a capture lost event to the browser. | ||||||
| @@ -878,76 +812,32 @@ typedef struct _cef_browser_host_t { | |||||||
|   /// |   /// | ||||||
|   void(CEF_CALLBACK* set_accessibility_state)(struct _cef_browser_host_t* self, |   void(CEF_CALLBACK* set_accessibility_state)(struct _cef_browser_host_t* self, | ||||||
|                                               cef_state_t accessibility_state); |                                               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. |  | ||||||
|   /// |  | ||||||
|   void(CEF_CALLBACK* set_auto_resize_enabled)(struct _cef_browser_host_t* self, |  | ||||||
|                                               int enabled, |  | ||||||
|                                               const cef_size_t* min_size, |  | ||||||
|                                               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. |  | ||||||
|   /// |  | ||||||
|   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. |  | ||||||
|   /// |  | ||||||
|   int(CEF_CALLBACK* is_background_host)(struct _cef_browser_host_t* self); |  | ||||||
|  |  | ||||||
|   /// |  | ||||||
|   //  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. |  | ||||||
|   /// |  | ||||||
|   int(CEF_CALLBACK* is_audio_muted)(struct _cef_browser_host_t* self); |  | ||||||
| } cef_browser_host_t; | } cef_browser_host_t; | ||||||
|  |  | ||||||
| /// | /// | ||||||
| // Create a new browser using the window parameters specified by |windowInfo|. | // Create a new browser window using the window parameters specified by | ||||||
| // All values will be copied internally and the actual window (if any) will be | // |windowInfo|. All values will be copied internally and the actual window will | ||||||
| // created on the UI thread. If |request_context| is NULL the global request | // 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 | // 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 | // thread and will not block. | ||||||
| // 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( | CEF_EXPORT int cef_browser_host_create_browser( | ||||||
|     const cef_window_info_t* windowInfo, |     const cef_window_info_t* windowInfo, | ||||||
|     struct _cef_client_t* client, |     struct _cef_client_t* client, | ||||||
|     const cef_string_t* url, |     const cef_string_t* url, | ||||||
|     const struct _cef_browser_settings_t* settings, |     const struct _cef_browser_settings_t* settings, | ||||||
|     struct _cef_dictionary_value_t* extra_info, |  | ||||||
|     struct _cef_request_context_t* request_context); |     struct _cef_request_context_t* request_context); | ||||||
|  |  | ||||||
| /// | /// | ||||||
| // Create a new browser using the window parameters specified by |windowInfo|. | // Create a new browser window using the window parameters specified by | ||||||
| // If |request_context| is NULL the global request context will be used. This | // |windowInfo|. If |request_context| is NULL the global request context will be | ||||||
| // function can only be called on the browser process UI thread. The optional | // used. This function can only be called on the browser process UI thread. | ||||||
| // |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( | CEF_EXPORT cef_browser_t* cef_browser_host_create_browser_sync( | ||||||
|     const cef_window_info_t* windowInfo, |     const cef_window_info_t* windowInfo, | ||||||
|     struct _cef_client_t* client, |     struct _cef_client_t* client, | ||||||
|     const cef_string_t* url, |     const cef_string_t* url, | ||||||
|     const struct _cef_browser_settings_t* settings, |     const struct _cef_browser_settings_t* settings, | ||||||
|     struct _cef_dictionary_value_t* extra_info, |  | ||||||
|     struct _cef_request_context_t* request_context); |     struct _cef_request_context_t* request_context); | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=8c97f9b58c642c144cc37824ad820192640307cb$ | // $hash=0868c7d129e35c38b207b1066fd5eba0c1eef45c$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_BROWSER_PROCESS_HANDLER_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_BROWSER_PROCESS_HANDLER_CAPI_H_ | ||||||
| @@ -41,8 +41,8 @@ | |||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include "include/capi/cef_base_capi.h" | #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_command_line_capi.h" | ||||||
|  | #include "include/capi/cef_print_handler_capi.h" | ||||||
| #include "include/capi/cef_values_capi.h" | #include "include/capi/cef_values_capi.h" | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| @@ -78,6 +78,24 @@ typedef struct _cef_browser_process_handler_t { | |||||||
|       struct _cef_browser_process_handler_t* self, |       struct _cef_browser_process_handler_t* self, | ||||||
|       struct _cef_command_line_t* command_line); |       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 |   // Called from any thread when work has been scheduled for the browser process | ||||||
|   // main (UI) thread. This callback is used in combination with CefSettings. |   // main (UI) thread. This callback is used in combination with CefSettings. | ||||||
| @@ -94,16 +112,6 @@ typedef struct _cef_browser_process_handler_t { | |||||||
|   void(CEF_CALLBACK* on_schedule_message_pump_work)( |   void(CEF_CALLBACK* on_schedule_message_pump_work)( | ||||||
|       struct _cef_browser_process_handler_t* self, |       struct _cef_browser_process_handler_t* self, | ||||||
|       int64 delay_ms); |       int64 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; | } cef_browser_process_handler_t; | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=10ef5088ce2a5c6ffb38f8864d3aad6e5ac88b40$ | // $hash=68de2255fd429696d62115786fc480f1d5f9882b$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_CALLBACK_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_CALLBACK_CAPI_H_ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // modification, are permitted provided that the following conditions are | ||||||
| @@ -33,14 +33,13 @@ | |||||||
| // by hand. See the translator.README.txt file in the tools directory for | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=8b099ca3b9cfbd41840cdf64586a0b884abaffae$ | // $hash=7f554250e73537ece3f8f67310c23e718f91d41b$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_CLIENT_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_CLIENT_CAPI_H_ | ||||||
| #define CEF_INCLUDE_CAPI_CEF_CLIENT_CAPI_H_ | #define CEF_INCLUDE_CAPI_CEF_CLIENT_CAPI_H_ | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include "include/capi/cef_audio_handler_capi.h" |  | ||||||
| #include "include/capi/cef_base_capi.h" | #include "include/capi/cef_base_capi.h" | ||||||
| #include "include/capi/cef_context_menu_handler_capi.h" | #include "include/capi/cef_context_menu_handler_capi.h" | ||||||
| #include "include/capi/cef_dialog_handler_capi.h" | #include "include/capi/cef_dialog_handler_capi.h" | ||||||
| @@ -49,12 +48,11 @@ | |||||||
| #include "include/capi/cef_drag_handler_capi.h" | #include "include/capi/cef_drag_handler_capi.h" | ||||||
| #include "include/capi/cef_find_handler_capi.h" | #include "include/capi/cef_find_handler_capi.h" | ||||||
| #include "include/capi/cef_focus_handler_capi.h" | #include "include/capi/cef_focus_handler_capi.h" | ||||||
| #include "include/capi/cef_frame_handler_capi.h" | #include "include/capi/cef_geolocation_handler_capi.h" | ||||||
| #include "include/capi/cef_jsdialog_handler_capi.h" | #include "include/capi/cef_jsdialog_handler_capi.h" | ||||||
| #include "include/capi/cef_keyboard_handler_capi.h" | #include "include/capi/cef_keyboard_handler_capi.h" | ||||||
| #include "include/capi/cef_life_span_handler_capi.h" | #include "include/capi/cef_life_span_handler_capi.h" | ||||||
| #include "include/capi/cef_load_handler_capi.h" | #include "include/capi/cef_load_handler_capi.h" | ||||||
| #include "include/capi/cef_print_handler_capi.h" |  | ||||||
| #include "include/capi/cef_process_message_capi.h" | #include "include/capi/cef_process_message_capi.h" | ||||||
| #include "include/capi/cef_render_handler_capi.h" | #include "include/capi/cef_render_handler_capi.h" | ||||||
| #include "include/capi/cef_request_handler_capi.h" | #include "include/capi/cef_request_handler_capi.h" | ||||||
| @@ -72,12 +70,6 @@ typedef struct _cef_client_t { | |||||||
|   /// |   /// | ||||||
|   cef_base_ref_counted_t base; |   cef_base_ref_counted_t base; | ||||||
|  |  | ||||||
|   /// |  | ||||||
|   // 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 |   // Return the handler for context menus. If no handler is provided the default | ||||||
|   // implementation will be used. |   // implementation will be used. | ||||||
| @@ -124,11 +116,10 @@ typedef struct _cef_client_t { | |||||||
|       struct _cef_client_t* self); |       struct _cef_client_t* self); | ||||||
|  |  | ||||||
|   /// |   /// | ||||||
|   // Return the handler for events related to cef_frame_t lifespan. This |   // Return the handler for geolocation permissions requests. If no handler is | ||||||
|   // function will be called once during cef_browser_t creation and the result |   // provided geolocation access will be denied by default. | ||||||
|   // will be cached for performance reasons. |  | ||||||
|   /// |   /// | ||||||
|   struct _cef_frame_handler_t*(CEF_CALLBACK* get_frame_handler)( |   struct _cef_geolocation_handler_t*(CEF_CALLBACK* get_geolocation_handler)( | ||||||
|       struct _cef_client_t* self); |       struct _cef_client_t* self); | ||||||
|  |  | ||||||
|   /// |   /// | ||||||
| @@ -156,13 +147,6 @@ typedef struct _cef_client_t { | |||||||
|   struct _cef_load_handler_t*(CEF_CALLBACK* get_load_handler)( |   struct _cef_load_handler_t*(CEF_CALLBACK* get_load_handler)( | ||||||
|       struct _cef_client_t* self); |       struct _cef_client_t* self); | ||||||
|  |  | ||||||
|   /// |  | ||||||
|   // 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. |   // Return the handler for off-screen rendering events. | ||||||
|   /// |   /// | ||||||
| @@ -177,13 +161,12 @@ typedef struct _cef_client_t { | |||||||
|  |  | ||||||
|   /// |   /// | ||||||
|   // Called when a new message is received from a different process. Return true |   // 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 |   // (1) if the message was handled or false (0) otherwise. Do not keep a | ||||||
|   // a reference to |message| outside of this callback. |   // reference to or attempt to access the message outside of this callback. | ||||||
|   /// |   /// | ||||||
|   int(CEF_CALLBACK* on_process_message_received)( |   int(CEF_CALLBACK* on_process_message_received)( | ||||||
|       struct _cef_client_t* self, |       struct _cef_client_t* self, | ||||||
|       struct _cef_browser_t* browser, |       struct _cef_browser_t* browser, | ||||||
|       struct _cef_frame_t* frame, |  | ||||||
|       cef_process_id_t source_process, |       cef_process_id_t source_process, | ||||||
|       struct _cef_process_message_t* message); |       struct _cef_process_message_t* message); | ||||||
| } cef_client_t; | } cef_client_t; | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=93f3d769c0d48ed6e1d91ad8a8e2f95d4ee54287$ | // $hash=b917030321dc11ddfc8d8939239dda7952d2f955$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_COMMAND_LINE_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_COMMAND_LINE_CAPI_H_ | ||||||
| @@ -53,9 +53,8 @@ extern "C" { | |||||||
| // optionally have a value specified using the '=' delimiter (e.g. | // optionally have a value specified using the '=' delimiter (e.g. | ||||||
| // "-switch=value"). An argument of "--" will terminate switch parsing with all | // "-switch=value"). An argument of "--" will terminate switch parsing with all | ||||||
| // subsequent tokens, regardless of prefix, being interpreted as non-switch | // subsequent tokens, regardless of prefix, being interpreted as non-switch | ||||||
| // arguments. Switch names should be lowercase ASCII and will be converted to | // arguments. Switch names are considered case-insensitive. This structure can | ||||||
| // such if necessary. Switch values will retain the original case and UTF8 | // be used before cef_initialize() is called. | ||||||
| // encoding. This structure can be used before cef_initialize() is called. |  | ||||||
| /// | /// | ||||||
| typedef struct _cef_command_line_t { | typedef struct _cef_command_line_t { | ||||||
|   /// |   /// | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=fd33ce439e4379d231b6be16bdc1786f314d98e4$ | // $hash=2e295ba277083061103147a400bc30f78e6a94f5$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_CONTEXT_MENU_HANDLER_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_CONTEXT_MENU_HANDLER_CAPI_H_ | ||||||
| @@ -294,6 +294,11 @@ typedef struct _cef_context_menu_params_t { | |||||||
|   // items). |   // items). | ||||||
|   /// |   /// | ||||||
|   int(CEF_CALLBACK* is_custom_menu)(struct _cef_context_menu_params_t* self); |   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; | } cef_context_menu_params_t; | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=d9790a35d74621e985b917935a4fca74ba7db1e0$ | // $hash=c2bf8084385f3c795ae7494da6970a0a61b96ac6$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_COOKIE_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_COOKIE_CAPI_H_ | ||||||
| @@ -62,7 +62,18 @@ typedef struct _cef_cookie_manager_t { | |||||||
|   cef_base_ref_counted_t base; |   cef_base_ref_counted_t base; | ||||||
|  |  | ||||||
|   /// |   /// | ||||||
|   // Visit all cookies on the UI thread. The returned cookies are ordered by |   // Set the schemes supported by this manager. The default schemes ("http", | ||||||
|  |   // "https", "ws" and "wss") will always be supported. If |callback| is non- | ||||||
|  |   // NULL it will be executed asnychronously on the IO 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, | ||||||
|  |       struct _cef_completion_callback_t* callback); | ||||||
|  |  | ||||||
|  |   /// | ||||||
|  |   // Visit all cookies on the IO thread. The returned cookies are ordered by | ||||||
|   // longest path, then by earliest creation date. Returns false (0) if cookies |   // longest path, then by earliest creation date. Returns false (0) if cookies | ||||||
|   // cannot be accessed. |   // cannot be accessed. | ||||||
|   /// |   /// | ||||||
| @@ -70,7 +81,7 @@ typedef struct _cef_cookie_manager_t { | |||||||
|                                        struct _cef_cookie_visitor_t* visitor); |                                        struct _cef_cookie_visitor_t* visitor); | ||||||
|  |  | ||||||
|   /// |   /// | ||||||
|   // Visit a subset of cookies on the UI thread. The results are filtered by the |   // Visit a subset of cookies on the IO thread. The results are filtered by the | ||||||
|   // given url scheme, host, domain and path. If |includeHttpOnly| is true (1) |   // given url scheme, host, domain and path. If |includeHttpOnly| is true (1) | ||||||
|   // HTTP-only cookies will also be included in the results. The returned |   // HTTP-only cookies will also be included in the results. The returned | ||||||
|   // cookies are ordered by longest path, then by earliest creation date. |   // cookies are ordered by longest path, then by earliest creation date. | ||||||
| @@ -87,7 +98,7 @@ typedef struct _cef_cookie_manager_t { | |||||||
|   // check for disallowed characters (e.g. the ';' character is disallowed |   // check for disallowed characters (e.g. the ';' character is disallowed | ||||||
|   // within the cookie value attribute) and fail without setting the cookie if |   // 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 |   // 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 |   // asnychronously on the IO thread after the cookie has been set. Returns | ||||||
|   // false (0) if an invalid URL is specified or if cookies cannot be accessed. |   // 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, |   int(CEF_CALLBACK* set_cookie)(struct _cef_cookie_manager_t* self, | ||||||
| @@ -101,7 +112,7 @@ typedef struct _cef_cookie_manager_t { | |||||||
|   // both will be deleted. If only |url| is specified all host cookies (but not |   // 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 |   // 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- |   // 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 |   // NULL it will be executed asnychronously on the IO thread after the cookies | ||||||
|   // have been deleted. Returns false (0) if a non-NULL invalid URL is specified |   // 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 |   // or if cookies cannot be accessed. Cookies can alternately be deleted using | ||||||
|   // the Visit*Cookies() functions. |   // the Visit*Cookies() functions. | ||||||
| @@ -112,9 +123,25 @@ typedef struct _cef_cookie_manager_t { | |||||||
|       const cef_string_t* cookie_name, |       const cef_string_t* cookie_name, | ||||||
|       struct _cef_delete_cookies_callback_t* callback); |       struct _cef_delete_cookies_callback_t* callback); | ||||||
|  |  | ||||||
|  |   /// | ||||||
|  |   // Sets the directory path that will be used for storing cookie data. If | ||||||
|  |   // |path| is NULL data will be stored in memory only. Otherwise, data will be | ||||||
|  |   // stored at the specified |path|. To persist session cookies (cookies without | ||||||
|  |   // an expiry date or validity interval) set |persist_session_cookies| to true | ||||||
|  |   // (1). Session cookies are generally intended to be transient and most Web | ||||||
|  |   // browsers do not persist them. If |callback| is non-NULL it will be executed | ||||||
|  |   // asnychronously on the IO thread after the manager's storage has been | ||||||
|  |   // initialized. Returns false (0) if cookies cannot be accessed. | ||||||
|  |   /// | ||||||
|  |   int(CEF_CALLBACK* set_storage_path)( | ||||||
|  |       struct _cef_cookie_manager_t* self, | ||||||
|  |       const cef_string_t* path, | ||||||
|  |       int persist_session_cookies, | ||||||
|  |       struct _cef_completion_callback_t* callback); | ||||||
|  |  | ||||||
|   /// |   /// | ||||||
|   // Flush the backing store (if any) to disk. If |callback| is non-NULL it will |   // 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. |   // be executed asnychronously on the IO thread after the flush is complete. | ||||||
|   // Returns false (0) if cookies cannot be accessed. |   // Returns false (0) if cookies cannot be accessed. | ||||||
|   /// |   /// | ||||||
|   int(CEF_CALLBACK* flush_store)(struct _cef_cookie_manager_t* self, |   int(CEF_CALLBACK* flush_store)(struct _cef_cookie_manager_t* self, | ||||||
| @@ -124,17 +151,31 @@ typedef struct _cef_cookie_manager_t { | |||||||
| /// | /// | ||||||
| // Returns the global cookie manager. By default data will be stored at | // Returns the global cookie manager. By default data will be stored at | ||||||
| // CefSettings.cache_path if specified or in memory otherwise. If |callback| is | // 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 | // non-NULL it will be executed asnychronously on the IO thread after the | ||||||
| // manager's storage has been initialized. Using this function is equivalent to | // manager's storage has been initialized. Using this function is equivalent to | ||||||
| // calling cef_request_context_t::cef_request_context_get_global_context()->GetD | // calling cef_request_tContext::cef_request_context_get_global_context()->get_d | ||||||
| // efaultCookieManager(). | // efault_cookie_manager(). | ||||||
| /// | /// | ||||||
| CEF_EXPORT cef_cookie_manager_t* cef_cookie_manager_get_global_manager( | CEF_EXPORT cef_cookie_manager_t* cef_cookie_manager_get_global_manager( | ||||||
|     struct _cef_completion_callback_t* callback); |     struct _cef_completion_callback_t* callback); | ||||||
|  |  | ||||||
|  | /// | ||||||
|  | // Creates a new cookie manager. If |path| is NULL data will be stored in memory | ||||||
|  | // only. Otherwise, data will be stored at the specified |path|. To persist | ||||||
|  | // session cookies (cookies without an expiry date or validity interval) set | ||||||
|  | // |persist_session_cookies| to true (1). Session cookies are generally intended | ||||||
|  | // to be transient and most Web browsers do not persist them. If |callback| is | ||||||
|  | // non-NULL it will be executed asnychronously on the IO thread after the | ||||||
|  | // manager's storage has been initialized. | ||||||
|  | /// | ||||||
|  | CEF_EXPORT cef_cookie_manager_t* cef_cookie_manager_create_manager( | ||||||
|  |     const cef_string_t* path, | ||||||
|  |     int persist_session_cookies, | ||||||
|  |     struct _cef_completion_callback_t* callback); | ||||||
|  |  | ||||||
| /// | /// | ||||||
| // Structure to implement for visiting cookie values. The functions of this | // Structure to implement for visiting cookie values. The functions of this | ||||||
| // structure will always be called on the UI thread. | // structure will always be called on the IO thread. | ||||||
| /// | /// | ||||||
| typedef struct _cef_cookie_visitor_t { | typedef struct _cef_cookie_visitor_t { | ||||||
|   /// |   /// | ||||||
| @@ -186,7 +227,7 @@ typedef struct _cef_delete_cookies_callback_t { | |||||||
|  |  | ||||||
|   /// |   /// | ||||||
|   // Method that will be called upon completion. |num_deleted| will be the |   // Method that will be called upon completion. |num_deleted| will be the | ||||||
|   // number of cookies that were deleted. |   // number of cookies that were deleted or -1 if unknown. | ||||||
|   /// |   /// | ||||||
|   void(CEF_CALLBACK* on_complete)(struct _cef_delete_cookies_callback_t* self, |   void(CEF_CALLBACK* on_complete)(struct _cef_delete_cookies_callback_t* self, | ||||||
|                                   int num_deleted); |                                   int num_deleted); | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=0460e68eb7d1b1188706c42d14beafbf9a6f7126$ | // $hash=8b7354f5a1ad6b255d77e477c64374b927f4fe28$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_CRASH_UTIL_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_CRASH_UTIL_CAPI_H_ | ||||||
| @@ -129,12 +129,14 @@ extern "C" { | |||||||
| // | // | ||||||
| // CrashKeys section: | // CrashKeys section: | ||||||
| // | // | ||||||
| // A maximum of 26 crash keys of each size can be specified for use by the | // Any number of crash keys can be specified for use by the application. Crash | ||||||
| // application. Crash key values will be truncated based on the specified size | // key values will be truncated based on the specified size (small = 63 bytes, | ||||||
| // (small = 64 bytes, medium = 256 bytes, large = 1024 bytes). The value of | // medium = 252 bytes, large = 1008 bytes). The value of crash keys can be set | ||||||
| // crash keys can be set from any thread or process using the | // from any thread or process using the CefSetCrashKeyValue function. These | ||||||
| // CefSetCrashKeyValue function. These key/value pairs will be sent to the crash | // key/value pairs will be sent to the crash server along with the crash dump | ||||||
| // server along with the crash dump file. | // file. Medium and large values will be chunked for submission. For example, if | ||||||
|  | // your key is named "mykey" then the value will be broken into ordered chunks | ||||||
|  | // and submitted using keys named "mykey-1", "mykey-2", etc. | ||||||
| /// | /// | ||||||
| CEF_EXPORT int cef_crash_reporting_enabled(); | CEF_EXPORT int cef_crash_reporting_enabled(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,147 +0,0 @@ | |||||||
| // 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=ec62239c2b24ff512b64ca758be825ff57fb3b6b$ |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_DEVTOOLS_MESSAGE_OBSERVER_CAPI_H_ |  | ||||||
| #define CEF_INCLUDE_CAPI_CEF_DEVTOOLS_MESSAGE_OBSERVER_CAPI_H_ |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| #include "include/capi/cef_base_capi.h" |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus |  | ||||||
| extern "C" { |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| 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. |  | ||||||
| /// |  | ||||||
| typedef struct _cef_dev_tools_message_observer_t { |  | ||||||
|   /// |  | ||||||
|   // 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). |  | ||||||
|   /// |  | ||||||
|   int(CEF_CALLBACK* on_dev_tools_message)( |  | ||||||
|       struct _cef_dev_tools_message_observer_t* self, |  | ||||||
|       struct _cef_browser_t* browser, |  | ||||||
|       const void* message, |  | ||||||
|       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. |  | ||||||
|   /// |  | ||||||
|   void(CEF_CALLBACK* on_dev_tools_method_result)( |  | ||||||
|       struct _cef_dev_tools_message_observer_t* self, |  | ||||||
|       struct _cef_browser_t* browser, |  | ||||||
|       int message_id, |  | ||||||
|       int success, |  | ||||||
|       const void* result, |  | ||||||
|       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. |  | ||||||
|   /// |  | ||||||
|   void(CEF_CALLBACK* on_dev_tools_event)( |  | ||||||
|       struct _cef_dev_tools_message_observer_t* self, |  | ||||||
|       struct _cef_browser_t* browser, |  | ||||||
|       const cef_string_t* method, |  | ||||||
|       const void* params, |  | ||||||
|       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. |  | ||||||
|   /// |  | ||||||
|   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. |  | ||||||
|   /// |  | ||||||
|   void(CEF_CALLBACK* on_dev_tools_agent_detached)( |  | ||||||
|       struct _cef_dev_tools_message_observer_t* self, |  | ||||||
|       struct _cef_browser_t* browser); |  | ||||||
| } cef_dev_tools_message_observer_t; |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #endif  // CEF_INCLUDE_CAPI_CEF_DEVTOOLS_MESSAGE_OBSERVER_CAPI_H_ |  | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=0f56154217707d141912dc8a298279df8df04311$ | // $hash=b8a44f4f624ba51107d06ff3d1a7934e83765786$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_DIALOG_HANDLER_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_DIALOG_HANDLER_CAPI_H_ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=142637539a094a03adc71d2f3f5b711ba64918b1$ | // $hash=f0f3fd4cab00c0eb11956e674a111cb30d3af100$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_DISPLAY_HANDLER_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_DISPLAY_HANDLER_CAPI_H_ | ||||||
| @@ -118,42 +118,9 @@ typedef struct _cef_display_handler_t { | |||||||
|   /// |   /// | ||||||
|   int(CEF_CALLBACK* on_console_message)(struct _cef_display_handler_t* self, |   int(CEF_CALLBACK* on_console_message)(struct _cef_display_handler_t* self, | ||||||
|                                         struct _cef_browser_t* browser, |                                         struct _cef_browser_t* browser, | ||||||
|                                         cef_log_severity_t level, |  | ||||||
|                                         const cef_string_t* message, |                                         const cef_string_t* message, | ||||||
|                                         const cef_string_t* source, |                                         const cef_string_t* source, | ||||||
|                                         int line); |                                         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. |  | ||||||
|   /// |  | ||||||
|   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. |  | ||||||
|   /// |  | ||||||
|   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 struct _cef_cursor_info_t* custom_cursor_info); |  | ||||||
| } cef_display_handler_t; | } cef_display_handler_t; | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=c6de3fb4d64a2b2ad06a4b9c5e9d7625d40b5bb6$ | // $hash=db82ff508cb1b4a03001b8b30bc5126186ee1bd2$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_DOM_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_DOM_CAPI_H_ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=ec13ec3e2819e4ac49792c3a1c57bc60b45fb95b$ | // $hash=4475f7e48898bdef8051c849873fb2528320cd9c$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_DOWNLOAD_HANDLER_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_DOWNLOAD_HANDLER_CAPI_H_ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=b9f0d91dd2fdb3625365ff8b332b08e1f0ea1187$ | // $hash=cc669703d613f5a6a5bae95030835dc99f55a6fa$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_DOWNLOAD_ITEM_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_DOWNLOAD_ITEM_CAPI_H_ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=b6e3236a062cd25ec26c3daeb1940d1e1bf0d96a$ | // $hash=a4b5264c1e685cad86203772631460684ee7820d$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_DRAG_DATA_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_DRAG_DATA_CAPI_H_ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=5b2051c42c1d4c41b85ca823d34b26bfa5de6777$ | // $hash=c557dad9522f4bd4c6b3295d149c6b893fc18d52$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_DRAG_HANDLER_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_DRAG_HANDLER_CAPI_H_ | ||||||
| @@ -43,7 +43,6 @@ | |||||||
| #include "include/capi/cef_base_capi.h" | #include "include/capi/cef_base_capi.h" | ||||||
| #include "include/capi/cef_browser_capi.h" | #include "include/capi/cef_browser_capi.h" | ||||||
| #include "include/capi/cef_drag_data_capi.h" | #include "include/capi/cef_drag_data_capi.h" | ||||||
| #include "include/capi/cef_frame_capi.h" |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| extern "C" { | extern "C" { | ||||||
| @@ -80,7 +79,6 @@ typedef struct _cef_drag_handler_t { | |||||||
|   void(CEF_CALLBACK* on_draggable_regions_changed)( |   void(CEF_CALLBACK* on_draggable_regions_changed)( | ||||||
|       struct _cef_drag_handler_t* self, |       struct _cef_drag_handler_t* self, | ||||||
|       struct _cef_browser_t* browser, |       struct _cef_browser_t* browser, | ||||||
|       struct _cef_frame_t* frame, |  | ||||||
|       size_t regionsCount, |       size_t regionsCount, | ||||||
|       cef_draggable_region_t const* regions); |       cef_draggable_region_t const* regions); | ||||||
| } cef_drag_handler_t; | } cef_drag_handler_t; | ||||||
|   | |||||||
| @@ -1,130 +0,0 @@ | |||||||
| // 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=fcfe34c1517ebdb3f00c1f737b91361e771b820d$ |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_EXTENSION_CAPI_H_ |  | ||||||
| #define CEF_INCLUDE_CAPI_CEF_EXTENSION_CAPI_H_ |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| #include "include/capi/cef_base_capi.h" |  | ||||||
| #include "include/capi/cef_values_capi.h" |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus |  | ||||||
| extern "C" { |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| struct _cef_extension_handler_t; |  | ||||||
| struct _cef_request_context_t; |  | ||||||
|  |  | ||||||
| /// |  | ||||||
| // Object representing an extension. Methods may be called on any thread unless |  | ||||||
| // otherwise indicated. |  | ||||||
| /// |  | ||||||
| typedef struct _cef_extension_t { |  | ||||||
|   /// |  | ||||||
|   // 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. |  | ||||||
|   /// |  | ||||||
|   // 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. |  | ||||||
|   /// |  | ||||||
|   // 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. |  | ||||||
|   /// |  | ||||||
|   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. |  | ||||||
|   /// |  | ||||||
|   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. |  | ||||||
|   /// |  | ||||||
|   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. |  | ||||||
|   /// |  | ||||||
|   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. |  | ||||||
|   /// |  | ||||||
|   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. |  | ||||||
|   /// |  | ||||||
|   void(CEF_CALLBACK* unload)(struct _cef_extension_t* self); |  | ||||||
| } cef_extension_t; |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #endif  // CEF_INCLUDE_CAPI_CEF_EXTENSION_CAPI_H_ |  | ||||||
| @@ -1,210 +0,0 @@ | |||||||
| // 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=768e2436e54cceb2675ddd03ebdc61b5c0785bdc$ |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_EXTENSION_HANDLER_CAPI_H_ |  | ||||||
| #define CEF_INCLUDE_CAPI_CEF_EXTENSION_HANDLER_CAPI_H_ |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| #include "include/capi/cef_base_capi.h" |  | ||||||
| #include "include/capi/cef_browser_capi.h" |  | ||||||
| #include "include/capi/cef_extension_capi.h" |  | ||||||
| #include "include/capi/cef_stream_capi.h" |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus |  | ||||||
| extern "C" { |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| struct _cef_client_t; |  | ||||||
|  |  | ||||||
| /// |  | ||||||
| // Callback structure used for asynchronous continuation of |  | ||||||
| // cef_extension_handler_t::GetExtensionResource. |  | ||||||
| /// |  | ||||||
| typedef struct _cef_get_extension_resource_callback_t { |  | ||||||
|   /// |  | ||||||
|   // Base structure. |  | ||||||
|   /// |  | ||||||
|   cef_base_ref_counted_t base; |  | ||||||
|  |  | ||||||
|   /// |  | ||||||
|   // 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. |  | ||||||
|   /// |  | ||||||
|   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. |  | ||||||
| /// |  | ||||||
| typedef struct _cef_extension_handler_t { |  | ||||||
|   /// |  | ||||||
|   // Base structure. |  | ||||||
|   /// |  | ||||||
|   cef_base_ref_counted_t base; |  | ||||||
|  |  | ||||||
|   /// |  | ||||||
|   // 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. |  | ||||||
|   /// |  | ||||||
|   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. |  | ||||||
|   /// |  | ||||||
|   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. |  | ||||||
|   /// |  | ||||||
|   int(CEF_CALLBACK* on_before_background_browser)( |  | ||||||
|       struct _cef_extension_handler_t* self, |  | ||||||
|       struct _cef_extension_t* extension, |  | ||||||
|       const cef_string_t* url, |  | ||||||
|       struct _cef_client_t** client, |  | ||||||
|       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. |  | ||||||
|   /// |  | ||||||
|   int(CEF_CALLBACK* on_before_browser)( |  | ||||||
|       struct _cef_extension_handler_t* self, |  | ||||||
|       struct _cef_extension_t* extension, |  | ||||||
|       struct _cef_browser_t* browser, |  | ||||||
|       struct _cef_browser_t* active_browser, |  | ||||||
|       int index, |  | ||||||
|       const cef_string_t* url, |  | ||||||
|       int active, |  | ||||||
|       struct _cef_window_info_t* windowInfo, |  | ||||||
|       struct _cef_client_t** client, |  | ||||||
|       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). |  | ||||||
|   /// |  | ||||||
|   struct _cef_browser_t*(CEF_CALLBACK* get_active_browser)( |  | ||||||
|       struct _cef_extension_handler_t* self, |  | ||||||
|       struct _cef_extension_t* extension, |  | ||||||
|       struct _cef_browser_t* browser, |  | ||||||
|       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). |  | ||||||
|   /// |  | ||||||
|   int(CEF_CALLBACK* can_access_browser)(struct _cef_extension_handler_t* self, |  | ||||||
|                                         struct _cef_extension_t* extension, |  | ||||||
|                                         struct _cef_browser_t* browser, |  | ||||||
|                                         int include_incognito, |  | ||||||
|                                         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. |  | ||||||
|   /// |  | ||||||
|   int(CEF_CALLBACK* get_extension_resource)( |  | ||||||
|       struct _cef_extension_handler_t* self, |  | ||||||
|       struct _cef_extension_t* extension, |  | ||||||
|       struct _cef_browser_t* browser, |  | ||||||
|       const cef_string_t* file, |  | ||||||
|       struct _cef_get_extension_resource_callback_t* callback); |  | ||||||
| } cef_extension_handler_t; |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #endif  // CEF_INCLUDE_CAPI_CEF_EXTENSION_HANDLER_CAPI_H_ |  | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=e76fa23e9682bf0865319d93e4009752ac8f854f$ | // $hash=1c02b57893a3f78c436bc2ab66c63753edfb174a$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_FILE_UTIL_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_FILE_UTIL_CAPI_H_ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=b1fe7f7db5ab92c6ae64dc1288b6fd47c80f9423$ | // $hash=975114b079fa271fecbf31ef160974941faed8a4$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_FIND_HANDLER_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_FIND_HANDLER_CAPI_H_ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=a136a2679c8af339b21a89e8ae3090a9dbb8daa7$ | // $hash=bed1f7b94e060b83e3f22eb84ce1274f2d10b3e6$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_FOCUS_HANDLER_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_FOCUS_HANDLER_CAPI_H_ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=8527ceea6b8778d6fabc1b4ef82e4faa06ba777a$ | // $hash=c1457ef21c14c40422b19b681121283eae3e9d70$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_FRAME_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_FRAME_CAPI_H_ | ||||||
| @@ -42,7 +42,6 @@ | |||||||
|  |  | ||||||
| #include "include/capi/cef_base_capi.h" | #include "include/capi/cef_base_capi.h" | ||||||
| #include "include/capi/cef_dom_capi.h" | #include "include/capi/cef_dom_capi.h" | ||||||
| #include "include/capi/cef_process_message_capi.h" |  | ||||||
| #include "include/capi/cef_request_capi.h" | #include "include/capi/cef_request_capi.h" | ||||||
| #include "include/capi/cef_stream_capi.h" | #include "include/capi/cef_stream_capi.h" | ||||||
| #include "include/capi/cef_string_visitor_capi.h" | #include "include/capi/cef_string_visitor_capi.h" | ||||||
| @@ -52,8 +51,6 @@ extern "C" { | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| struct _cef_browser_t; | struct _cef_browser_t; | ||||||
| struct _cef_urlrequest_client_t; |  | ||||||
| struct _cef_urlrequest_t; |  | ||||||
| struct _cef_v8context_t; | struct _cef_v8context_t; | ||||||
|  |  | ||||||
| /// | /// | ||||||
| @@ -131,10 +128,6 @@ typedef struct _cef_frame_t { | |||||||
|  |  | ||||||
|   /// |   /// | ||||||
|   // Load the request represented by the |request| object. |   // 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, |   void(CEF_CALLBACK* load_request)(struct _cef_frame_t* self, | ||||||
|                                    struct _cef_request_t* request); |                                    struct _cef_request_t* request); | ||||||
| @@ -145,6 +138,15 @@ typedef struct _cef_frame_t { | |||||||
|   void(CEF_CALLBACK* load_url)(struct _cef_frame_t* self, |   void(CEF_CALLBACK* load_url)(struct _cef_frame_t* self, | ||||||
|                                const cef_string_t* url); |                                const cef_string_t* url); | ||||||
|  |  | ||||||
|  |   /// | ||||||
|  |   // Load the contents of |string_val| with the specified dummy |url|. |url| | ||||||
|  |   // should have a standard scheme (for example, http scheme) or behaviors like | ||||||
|  |   // link clicks and web security restrictions may not behave as expected. | ||||||
|  |   /// | ||||||
|  |   void(CEF_CALLBACK* load_string)(struct _cef_frame_t* self, | ||||||
|  |                                   const cef_string_t* string_val, | ||||||
|  |                                   const cef_string_t* url); | ||||||
|  |  | ||||||
|   /// |   /// | ||||||
|   // Execute a string of JavaScript code in this frame. The |script_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 |   // parameter is the URL where the script in question can be found, if any. The | ||||||
| @@ -213,46 +215,6 @@ typedef struct _cef_frame_t { | |||||||
|   /// |   /// | ||||||
|   void(CEF_CALLBACK* visit_dom)(struct _cef_frame_t* self, |   void(CEF_CALLBACK* visit_dom)(struct _cef_frame_t* self, | ||||||
|                                 struct _cef_domvisitor_t* visitor); |                                 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. |  | ||||||
|   /// |  | ||||||
|   struct _cef_urlrequest_t*(CEF_CALLBACK* create_urlrequest)( |  | ||||||
|       struct _cef_frame_t* self, |  | ||||||
|       struct _cef_request_t* request, |  | ||||||
|       struct _cef_urlrequest_client_t* client); |  | ||||||
|  |  | ||||||
|   /// |  | ||||||
|   // 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, |  | ||||||
|       cef_process_id_t target_process, |  | ||||||
|       struct _cef_process_message_t* message); |  | ||||||
| } cef_frame_t; | } cef_frame_t; | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
|   | |||||||
| @@ -1,194 +0,0 @@ | |||||||
| // 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=8f791b2d1d5bea27f9e6ca5e0db731a0a76d181c$ |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #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_ |  | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
 | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved.
 | ||||||
| //
 | //
 | ||||||
| // Redistribution and use in source and binary forms, with or without
 | // Redistribution and use in source and binary forms, with or without
 | ||||||
| // modification, are permitted provided that the following conditions are
 | // 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
 | // by hand. See the translator.README.txt file in the tools directory for
 | ||||||
| // more information.
 | // more information.
 | ||||||
| //
 | //
 | ||||||
| // $hash=d5efa37953d0f0097fef20bc18f4938621c6b168$
 | // $hash=3ae57ba897d73f3fcccc955c827379746b6203af$
 | ||||||
| //
 | //
 | ||||||
| 
 | 
 | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_REGISTRATION_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_GEOLOCATION_CAPI_H_ | ||||||
| #define CEF_INCLUDE_CAPI_CEF_REGISTRATION_CAPI_H_ | #define CEF_INCLUDE_CAPI_CEF_GEOLOCATION_CAPI_H_ | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include "include/capi/cef_base_capi.h" | #include "include/capi/cef_base_capi.h" | ||||||
| @@ -47,17 +47,33 @@ extern "C" { | |||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| ///
 | ///
 | ||||||
| // Generic callback structure used for managing the lifespan of a registration.
 | // Implement this structure to receive geolocation updates. The functions of
 | ||||||
|  | // this structure will be called on the browser process UI thread.
 | ||||||
| ///
 | ///
 | ||||||
| typedef struct _cef_registration_t { | typedef struct _cef_get_geolocation_callback_t { | ||||||
|   ///
 |   ///
 | ||||||
|   // Base structure.
 |   // Base structure.
 | ||||||
|   ///
 |   ///
 | ||||||
|   cef_base_ref_counted_t base; |   cef_base_ref_counted_t base; | ||||||
| } cef_registration_t; | 
 | ||||||
|  |   ///
 | ||||||
|  |   // Called with the 'best available' location information or, if the location
 | ||||||
|  |   // update failed, with error information.
 | ||||||
|  |   ///
 | ||||||
|  |   void(CEF_CALLBACK* on_location_update)( | ||||||
|  |       struct _cef_get_geolocation_callback_t* self, | ||||||
|  |       const struct _cef_geoposition_t* position); | ||||||
|  | } cef_get_geolocation_callback_t; | ||||||
|  | 
 | ||||||
|  | ///
 | ||||||
|  | // Request a one-time geolocation update. This function bypasses any user
 | ||||||
|  | // permission checks so should only be used by code that is allowed to access
 | ||||||
|  | // location information.
 | ||||||
|  | ///
 | ||||||
|  | CEF_EXPORT int cef_get_geolocation(cef_get_geolocation_callback_t* callback); | ||||||
| 
 | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #endif  // CEF_INCLUDE_CAPI_CEF_REGISTRATION_CAPI_H_
 | #endif  // CEF_INCLUDE_CAPI_CEF_GEOLOCATION_CAPI_H_
 | ||||||
							
								
								
									
										106
									
								
								include/capi/cef_geolocation_handler_capi.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								include/capi/cef_geolocation_handler_capi.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,106 @@ | |||||||
|  | // Copyright (c) 2017 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=ec60811fcefbe02348f14ecddbe5778ce836bf53$ | ||||||
|  | // | ||||||
|  |  | ||||||
|  | #ifndef CEF_INCLUDE_CAPI_CEF_GEOLOCATION_HANDLER_CAPI_H_ | ||||||
|  | #define CEF_INCLUDE_CAPI_CEF_GEOLOCATION_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 geolocation | ||||||
|  | // permission requests. | ||||||
|  | /// | ||||||
|  | typedef struct _cef_geolocation_callback_t { | ||||||
|  |   /// | ||||||
|  |   // Base structure. | ||||||
|  |   /// | ||||||
|  |   cef_base_ref_counted_t base; | ||||||
|  |  | ||||||
|  |   /// | ||||||
|  |   // Call to allow or deny geolocation access. | ||||||
|  |   /// | ||||||
|  |   void(CEF_CALLBACK* cont)(struct _cef_geolocation_callback_t* self, int allow); | ||||||
|  | } cef_geolocation_callback_t; | ||||||
|  |  | ||||||
|  | /// | ||||||
|  | // Implement this structure to handle events related to geolocation permission | ||||||
|  | // requests. The functions of this structure will be called on the browser | ||||||
|  | // process UI thread. | ||||||
|  | /// | ||||||
|  | typedef struct _cef_geolocation_handler_t { | ||||||
|  |   /// | ||||||
|  |   // Base structure. | ||||||
|  |   /// | ||||||
|  |   cef_base_ref_counted_t base; | ||||||
|  |  | ||||||
|  |   /// | ||||||
|  |   // Called when a page requests permission to access geolocation information. | ||||||
|  |   // |requesting_url| is the URL requesting permission and |request_id| is the | ||||||
|  |   // unique ID for the permission request. Return true (1) and call | ||||||
|  |   // cef_geolocation_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_geolocation_permission)( | ||||||
|  |       struct _cef_geolocation_handler_t* self, | ||||||
|  |       struct _cef_browser_t* browser, | ||||||
|  |       const cef_string_t* requesting_url, | ||||||
|  |       int request_id, | ||||||
|  |       struct _cef_geolocation_callback_t* callback); | ||||||
|  |  | ||||||
|  |   /// | ||||||
|  |   // Called when a geolocation access request is canceled. |request_id| is the | ||||||
|  |   // unique ID for the permission request. | ||||||
|  |   /// | ||||||
|  |   void(CEF_CALLBACK* on_cancel_geolocation_permission)( | ||||||
|  |       struct _cef_geolocation_handler_t* self, | ||||||
|  |       struct _cef_browser_t* browser, | ||||||
|  |       int request_id); | ||||||
|  | } cef_geolocation_handler_t; | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif  // CEF_INCLUDE_CAPI_CEF_GEOLOCATION_HANDLER_CAPI_H_ | ||||||
| @@ -1,58 +0,0 @@ | |||||||
| // 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=b6168013910802cf6d7603892741385958026dcd$ |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #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" |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus |  | ||||||
| extern "C" { |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /// |  | ||||||
| // Returns true (1) if the application text direction is right-to-left. |  | ||||||
| /// |  | ||||||
| CEF_EXPORT int cef_is_rtl(); |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #endif  // CEF_INCLUDE_CAPI_CEF_I18N_UTIL_CAPI_H_ |  | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=b5a36ef39ff250c9d3cb1e9a8c7ee38d7e0f8b3f$ | // $hash=60f904f2f77ce6d89f9fceeeda0050273a3c9e6d$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_IMAGE_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_IMAGE_CAPI_H_ | ||||||
| @@ -53,7 +53,7 @@ extern "C" { | |||||||
| // (DIP) units. For example, if the image at scale factor 1.0 is 100x100 pixels | // (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 | // 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 | // will display with a DIP size of 100x100 units. The functions of this | ||||||
| // structure can be called on any browser process thread. | // structure must be called on the browser process UI thread. | ||||||
| /// | /// | ||||||
| typedef struct _cef_image_t { | typedef struct _cef_image_t { | ||||||
|   /// |   /// | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=c68332a779bab425aa2e6a858d20a43448631890$ | // $hash=351cff5a52f29b54d1854d5dfbb1733c8a62797d$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_JSDIALOG_HANDLER_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_JSDIALOG_HANDLER_CAPI_H_ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=140d3a3ce78f5e8ab50a24a2fd6377e7a8ea3256$ | // $hash=07c2a01bb9975fa52fdb287712f8f369557ba755$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_KEYBOARD_HANDLER_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_KEYBOARD_HANDLER_CAPI_H_ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=34a6559587adbd0dc3143989a8c6e49e0664b43e$ | // $hash=fe38af40efe76e5d6babf0644d7d4af679a4ca6f$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_LIFE_SPAN_HANDLER_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_LIFE_SPAN_HANDLER_CAPI_H_ | ||||||
| @@ -80,10 +80,7 @@ typedef struct _cef_life_span_handler_t { | |||||||
|   // modifications to |windowInfo| will be ignored if the parent browser is |   // 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 |   // 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 |   // the parent browser is destroyed before the popup browser creation completes | ||||||
|   // (indicated by a call to OnAfterCreated for the popup browser). The |   // (indicated by a call to OnAfterCreated for the popup browser). | ||||||
|   // |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)( |   int(CEF_CALLBACK* on_before_popup)( | ||||||
|       struct _cef_life_span_handler_t* self, |       struct _cef_life_span_handler_t* self, | ||||||
| @@ -97,14 +94,11 @@ typedef struct _cef_life_span_handler_t { | |||||||
|       struct _cef_window_info_t* windowInfo, |       struct _cef_window_info_t* windowInfo, | ||||||
|       struct _cef_client_t** client, |       struct _cef_client_t** client, | ||||||
|       struct _cef_browser_settings_t* settings, |       struct _cef_browser_settings_t* settings, | ||||||
|       struct _cef_dictionary_value_t** extra_info, |  | ||||||
|       int* no_javascript_access); |       int* no_javascript_access); | ||||||
|  |  | ||||||
|   /// |   /// | ||||||
|   // Called after a new browser is created. It is now safe to begin performing |   // Called after a new browser is created. This callback will be the first | ||||||
|   // actions with |browser|. cef_frame_handler_t callbacks related to initial |   // notification that references |browser|. | ||||||
|   // 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, |   void(CEF_CALLBACK* on_after_created)(struct _cef_life_span_handler_t* self, | ||||||
|                                        struct _cef_browser_t* browser); |                                        struct _cef_browser_t* browser); | ||||||
| @@ -204,14 +198,9 @@ typedef struct _cef_life_span_handler_t { | |||||||
|   /// |   /// | ||||||
|   // Called just before a browser is destroyed. Release all references to the |   // 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 |   // browser object and do not attempt to execute any functions on the browser | ||||||
|   // object (other than IsValid, GetIdentifier or IsSame) after this callback |   // object after this callback returns. This callback will be the last | ||||||
|   // returns. cef_frame_handler_t callbacks related to final main frame |   // notification that references |browser|. See do_close() documentation for | ||||||
|   // destruction will arrive after this callback and cef_browser_t::IsValid will |   // additional usage information. | ||||||
|   // 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, |   void(CEF_CALLBACK* on_before_close)(struct _cef_life_span_handler_t* self, | ||||||
|                                       struct _cef_browser_t* browser); |                                       struct _cef_browser_t* browser); | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=f51b6a0dbf264fa43ea3199327a5adb1044bfc04$ | // $hash=d8fa87bb47ec889cab864fe96f94e07bf1deb0f6$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_LOAD_HANDLER_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_LOAD_HANDLER_CAPI_H_ | ||||||
|   | |||||||
| @@ -1,349 +0,0 @@ | |||||||
| // 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=3db7459a1940c37898699cc97f69ba9249a6f1fd$ |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_MEDIA_ROUTER_CAPI_H_ |  | ||||||
| #define CEF_INCLUDE_CAPI_CEF_MEDIA_ROUTER_CAPI_H_ |  | ||||||
| #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 |  | ||||||
| extern "C" { |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| struct _cef_media_observer_t; |  | ||||||
| struct _cef_media_route_create_callback_t; |  | ||||||
| struct _cef_media_route_t; |  | ||||||
| struct _cef_media_sink_device_info_callback_t; |  | ||||||
| struct _cef_media_sink_t; |  | ||||||
| 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. |  | ||||||
| /// |  | ||||||
| typedef struct _cef_media_router_t { |  | ||||||
|   /// |  | ||||||
|   // 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. |  | ||||||
|   /// |  | ||||||
|   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>"). |  | ||||||
|   /// |  | ||||||
|   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. |  | ||||||
|   /// |  | ||||||
|   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. |  | ||||||
|   /// |  | ||||||
|   void(CEF_CALLBACK* create_route)( |  | ||||||
|       struct _cef_media_router_t* self, |  | ||||||
|       struct _cef_media_source_t* source, |  | ||||||
|       struct _cef_media_sink_t* sink, |  | ||||||
|       struct _cef_media_route_create_callback_t* callback); |  | ||||||
|  |  | ||||||
|   /// |  | ||||||
|   // 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. 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_r |  | ||||||
| // equest_context_t::cef_request_context_get_global_context()->get_media_router( |  | ||||||
| // ). |  | ||||||
| /// |  | ||||||
| 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. |  | ||||||
| /// |  | ||||||
| typedef struct _cef_media_observer_t { |  | ||||||
|   /// |  | ||||||
|   // Base structure. |  | ||||||
|   /// |  | ||||||
|   cef_base_ref_counted_t base; |  | ||||||
|  |  | ||||||
|   /// |  | ||||||
|   // 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. |  | ||||||
|   /// |  | ||||||
|   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. |  | ||||||
|   /// |  | ||||||
|   void(CEF_CALLBACK* on_route_state_changed)( |  | ||||||
|       struct _cef_media_observer_t* self, |  | ||||||
|       struct _cef_media_route_t* route, |  | ||||||
|       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. |  | ||||||
|   /// |  | ||||||
|   void(CEF_CALLBACK* on_route_message_received)( |  | ||||||
|       struct _cef_media_observer_t* self, |  | ||||||
|       struct _cef_media_route_t* route, |  | ||||||
|       const void* message, |  | ||||||
|       size_t message_size); |  | ||||||
| } 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. |  | ||||||
| /// |  | ||||||
| typedef struct _cef_media_route_t { |  | ||||||
|   /// |  | ||||||
|   // Base structure. |  | ||||||
|   /// |  | ||||||
|   cef_base_ref_counted_t base; |  | ||||||
|  |  | ||||||
|   /// |  | ||||||
|   // 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. |  | ||||||
|   /// |  | ||||||
|   struct _cef_media_source_t*(CEF_CALLBACK* get_source)( |  | ||||||
|       struct _cef_media_route_t* self); |  | ||||||
|  |  | ||||||
|   /// |  | ||||||
|   // 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. |  | ||||||
|   /// |  | ||||||
|   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. |  | ||||||
|   /// |  | ||||||
|   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. |  | ||||||
| /// |  | ||||||
| typedef struct _cef_media_route_create_callback_t { |  | ||||||
|   /// |  | ||||||
|   // 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. |  | ||||||
|   /// |  | ||||||
|   void(CEF_CALLBACK* on_media_route_create_finished)( |  | ||||||
|       struct _cef_media_route_create_callback_t* self, |  | ||||||
|       cef_media_route_create_result_t result, |  | ||||||
|       const cef_string_t* error, |  | ||||||
|       struct _cef_media_route_t* route); |  | ||||||
| } 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. |  | ||||||
| /// |  | ||||||
| typedef struct _cef_media_sink_t { |  | ||||||
|   /// |  | ||||||
|   // Base structure. |  | ||||||
|   /// |  | ||||||
|   cef_base_ref_counted_t base; |  | ||||||
|  |  | ||||||
|   /// |  | ||||||
|   // 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 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. |  | ||||||
|   /// |  | ||||||
|   cef_media_sink_icon_type_t(CEF_CALLBACK* get_icon_type)( |  | ||||||
|       struct _cef_media_sink_t* self); |  | ||||||
|  |  | ||||||
|   /// |  | ||||||
|   // 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. |  | ||||||
|   /// |  | ||||||
|   int(CEF_CALLBACK* is_cast_sink)(struct _cef_media_sink_t* self); |  | ||||||
|  |  | ||||||
|   /// |  | ||||||
|   // 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|. |  | ||||||
|   /// |  | ||||||
|   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. |  | ||||||
| /// |  | ||||||
| typedef struct _cef_media_sink_device_info_callback_t { |  | ||||||
|   /// |  | ||||||
|   // Base structure. |  | ||||||
|   /// |  | ||||||
|   cef_base_ref_counted_t base; |  | ||||||
|  |  | ||||||
|   /// |  | ||||||
|   // 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, |  | ||||||
|       const struct _cef_media_sink_device_info_t* device_info); |  | ||||||
| } 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. |  | ||||||
| /// |  | ||||||
| typedef struct _cef_media_source_t { |  | ||||||
|   /// |  | ||||||
|   // Base structure. |  | ||||||
|   /// |  | ||||||
|   cef_base_ref_counted_t base; |  | ||||||
|  |  | ||||||
|   /// |  | ||||||
|   // 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 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. |  | ||||||
|   /// |  | ||||||
|   int(CEF_CALLBACK* is_dial_source)(struct _cef_media_source_t* self); |  | ||||||
| } cef_media_source_t; |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #endif  // CEF_INCLUDE_CAPI_CEF_MEDIA_ROUTER_CAPI_H_ |  | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=9f30f2caa9eedc0d4fe963dbf0127602ffcbec61$ | // $hash=295f7f55ebe6d548aba1476e67efb2c88ab10ca5$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_MENU_MODEL_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_MENU_MODEL_CAPI_H_ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=bdb670bcaa9eb9f5748900ad25bcc061155d6076$ | // $hash=74f40f20f94ce3a6e7f3c879a3834a7108099ed4$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_MENU_MODEL_DELEGATE_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_MENU_MODEL_DELEGATE_CAPI_H_ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=3a7dd4a6a1b5e0d9191be6c4dd2f0135f43de643$ | // $hash=a862d0004de2a1bdf4c214fe87278badd90562a7$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_NAVIGATION_ENTRY_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_NAVIGATION_ENTRY_CAPI_H_ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=0939a44345bea8df7ca5f1dbd6afbe41972121f2$ | // $hash=2e5afff3277384ea9f3f74ef509c018f6d307dc4$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_ORIGIN_WHITELIST_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_ORIGIN_WHITELIST_CAPI_H_ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| // Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved. | // Copyright (c) 2017 Marshall A. Greenblatt. All rights reserved. | ||||||
| // | // | ||||||
| // Redistribution and use in source and binary forms, with or without | // Redistribution and use in source and binary forms, with or without | ||||||
| // modification, are permitted provided that the following conditions are | // 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 | // by hand. See the translator.README.txt file in the tools directory for | ||||||
| // more information. | // more information. | ||||||
| // | // | ||||||
| // $hash=f5e1c0fc43c6e85dbafa66975d9dc5e2bc7be69f$ | // $hash=d2f01fbfc3ae72a86c03399606088054b3a9337f$ | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef CEF_INCLUDE_CAPI_CEF_PARSER_CAPI_H_ | #ifndef CEF_INCLUDE_CAPI_CEF_PARSER_CAPI_H_ | ||||||
| @@ -140,24 +140,16 @@ CEF_EXPORT struct _cef_value_t* cef_parse_json( | |||||||
|     const cef_string_t* json_string, |     const cef_string_t* json_string, | ||||||
|     cef_json_parser_options_t options); |     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. |  | ||||||
| /// |  | ||||||
| CEF_EXPORT struct _cef_value_t* cef_parse_json_buffer( |  | ||||||
|     const void* json, |  | ||||||
|     size_t json_size, |  | ||||||
|     cef_json_parser_options_t options); |  | ||||||
|  |  | ||||||
| /// | /// | ||||||
| // Parses the specified |json_string| and returns a dictionary or list | // Parses the specified |json_string| and returns a dictionary or list | ||||||
| // representation. If JSON parsing fails this function returns NULL and | // representation. If JSON parsing fails this function returns NULL and | ||||||
| // populates |error_msg_out| with a formatted error message. | // populates |error_code_out| and |error_msg_out| with an error code and a | ||||||
|  | // formatted error message respectively. | ||||||
| /// | /// | ||||||
| CEF_EXPORT struct _cef_value_t* cef_parse_jsonand_return_error( | CEF_EXPORT struct _cef_value_t* cef_parse_jsonand_return_error( | ||||||
|     const cef_string_t* json_string, |     const cef_string_t* json_string, | ||||||
|     cef_json_parser_options_t options, |     cef_json_parser_options_t options, | ||||||
|  |     cef_json_parser_error_t* error_code_out, | ||||||
|     cef_string_t* error_msg_out); |     cef_string_t* error_msg_out); | ||||||
|  |  | ||||||
| /// | /// | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user