Introduce a hash of Chromium sandbox interface files to detect
incompatibilities between bootstrap.exe and libcef.dll at runtime,
allowing the strict version check to be skipped when interfaces match.
Core implementation:
- Add sandbox_compat_hash.py to calculate SHA-256 of interface files
(chrome_elf_main.h, sandbox.h, sandbox_types.h, sandbox.mojom)
- Update make_version_header.py to generate CEF_SANDBOX_COMPAT_HASH
- Add sandbox_compat_hash field to cef_version_info_t struct
- Add entry 3 to cef_api_hash() for retrieving the hash
- Compare hashes in cef_scoped_library_loader_win.cc during load
Version management:
- Include sandbox_compat in cef_api_versions.json and cef_api_untracked.json
- Compare sandbox_compat for untracked versions (NEXT, EXPERIMENTAL)
- Trigger version bumps when sandbox interface files change
Build automation:
- Update cefbuilds JSON builder to include sandbox_compat in version records
- Run version_manager.py -a after Chromium updates on release branches
to auto-detect hash changes and add new API versions
- Exclude platform-specific includes (anything in < >) from the
clang preprocessor by using `!defined(GENERATING_CEF_API_HASH)`
in CEF header files.
- Define "target platforms" by passing platform- and architecture-
specific ifdefs to the clang preprocessor. Grep for `defined(OS_`
to identify headers that require target platform processing, and
then process for each target as the platform-specific API hash
contribution.
- Delete the univeral hash which is no longer a useful concept.
- Generated files are now created when running cef_create_projects or
the new version_manager.py tool. These files are still created in the
cef/ source tree (same location as before) but Git ignores them due to
the generated .gitignore file.
- API hashes are committed to Git as a new cef_api_versions.json file.
This file is used for both code generation and CEF version calculation
(replacing the previous usage of cef_api_hash.h for this purpose).
It will be updated by the CEF admin before merging breaking API
changes upstream.
- As an added benefit to the above, contributor PRs will no longer
contain generated code that is susceptible to frequent merge conflicts.
- From a code generation perspective, the main difference is that we now
use versioned structs (e.g. cef_browser_0_t instead of cef_browser_t)
on the libcef (dll/framework) side. Most of the make_*.py tool changes
are related to supporting this.
- From the client perspective, you can now define CEF_API_VERSION in the
project configuration (or get CEF_EXPERIMENTAL by default). This
define will change the API exposed in CEF’s include/ and include/capi
header files. All client-side targets including libcef_dll_wrapper
will need be recompiled when changing this define.
- Examples of the new API-related define usage are provided in
cef_api_version_test.h, api_version_test_impl.cc and
api_version_unittest.cc.
To test:
- Run `ceftests --gtest_filter=ApiVersionTest.*`
- Add `cef_api_version=13300` to GN_DEFINES. Re-run configure, build and
ceftests steps.
- Repeat with 13301, 13302, 13303 (all supported test versions).