Add NUM_VALUES for enums and size for structs (see #3836)

API versioning requires that enumerations end with a count value
(`*_NUM_VALUES`) and structs begin with a size value (`size_t size`).
Wrapper templates are updated to support structs with different size
values indicating different versions.

To test:
Run `ceftests --gtest_filter=ApiVersionTest.StructVersion*`
This commit is contained in:
Marshall Greenblatt
2025-01-09 19:14:53 -05:00
parent ee5cec12d2
commit 81a5005bc0
43 changed files with 777 additions and 228 deletions

View File

@@ -18,7 +18,7 @@ media::ChannelLayoutConfig TranslateChannelLayout(
// between those enums and existing values don't ever change, so it's enough
// to check that there are no new ones added.
static_assert(
static_cast<int>(CEF_CHANNEL_LAYOUT_MAX) ==
static_cast<int>(CEF_CHANNEL_NUM_VALUES) - 1 ==
static_cast<int>(media::CHANNEL_LAYOUT_MAX),
"cef_channel_layout_t must match the ChannelLayout enum in Chromium");

View File

@@ -379,18 +379,22 @@ void CefBrowserContentsDelegate::PrimaryMainFrameRenderProcessGone(
base::TerminationStatus status) {
static_assert(static_cast<int>(CEF_RESULT_CODE_CHROME_FIRST) ==
static_cast<int>(chrome::RESULT_CODE_CHROME_START),
"enum mismatch");
"CEF_RESULT_CODE_CHROME_FIRST must match "
"chrome::RESULT_CODE_CHROME_START");
static_assert(static_cast<int>(CEF_RESULT_CODE_CHROME_LAST) ==
static_cast<int>(chrome::RESULT_CODE_CHROME_LAST_CODE),
"enum mismatch");
"CEF_RESULT_CODE_CHROME_LAST must match "
"chrome::RESULT_CODE_CHROME_LAST_CODE");
#if defined(OS_WIN)
static_assert(static_cast<int>(CEF_RESULT_CODE_SANDBOX_FATAL_FIRST) ==
static_cast<int>(sandbox::SBOX_FATAL_INTEGRITY),
"enum mismatch");
static_assert(static_cast<int>(CEF_RESULT_CODE_SANDBOX_FATAL_LAST) ==
static_cast<int>(sandbox::SBOX_FATAL_LAST),
"enum mismatch");
"CEF_RESULT_CODE_SANDBOX_FATAL_FIRST must match "
"sandbox::SBOX_FATAL_INTEGRITY");
static_assert(
static_cast<int>(CEF_RESULT_CODE_SANDBOX_FATAL_LAST) ==
static_cast<int>(sandbox::SBOX_FATAL_LAST),
"CEF_RESULT_CODE_SANDBOX_FATAL_LAST must match sandbox::SBOX_FATAL_LAST");
#endif
cef_termination_status_t ts = TS_ABNORMAL_TERMINATION;

View File

@@ -57,7 +57,7 @@ bool CefBrowserHost::CreateBrowser(
}
// Verify that the settings structure is a valid size.
if (settings.size != sizeof(cef_browser_settings_t)) {
if (!CEF_MEMBER_EXISTS(&settings, chrome_zoom_bubble)) {
DCHECK(false) << "invalid CefBrowserSettings structure size";
return false;
}
@@ -115,7 +115,7 @@ CefRefPtr<CefBrowser> CefBrowserHost::CreateBrowserSync(
}
// Verify that the settings structure is a valid size.
if (settings.size != sizeof(cef_browser_settings_t)) {
if (!CEF_MEMBER_EXISTS(&settings, chrome_zoom_bubble)) {
DCHECK(false) << "invalid CefBrowserSettings structure size";
return nullptr;
}

View File

@@ -292,9 +292,10 @@ bool ChromeBrowserDelegate::ShowStatusBubble(bool show_by_default) {
bool ChromeBrowserDelegate::HandleCommand(int command_id,
WindowOpenDisposition disposition) {
// Verify that our enum matches Chromium's values.
static_assert(static_cast<int>(CEF_WOD_MAX_VALUE) ==
static_assert(static_cast<int>(CEF_WOD_NUM_VALUES) - 1 ==
static_cast<int>(WindowOpenDisposition::MAX_VALUE),
"enum mismatch");
"Enum values in cef_window_open_disposition_t must match "
"WindowOpenDisposition");
if (auto browser = ChromeBrowserHostImpl::GetBrowserForBrowser(browser_)) {
if (auto client = browser->GetClient()) {
@@ -333,9 +334,10 @@ bool ChromeBrowserDelegate::IsAppMenuItemEnabled(int command_id) {
bool ChromeBrowserDelegate::IsPageActionIconVisible(
PageActionIconType icon_type) {
// Verify that our enum matches Chromium's values.
static_assert(static_cast<int>(CEF_CPAIT_LAST_VALUE) - 1 ==
static_assert(static_cast<int>(CEF_CPAIT_NUM_VALUES) - 1 ==
static_cast<int>(PageActionIconType::kMaxValue),
"enum mismatch");
"Enum values in cef_chrome_page_action_icon_type_t must match "
"PageActionIconType");
if (auto client = create_params_.client) {
if (auto handler = client->GetCommandHandler()) {
@@ -349,9 +351,10 @@ bool ChromeBrowserDelegate::IsPageActionIconVisible(
bool ChromeBrowserDelegate::IsToolbarButtonVisible(
ToolbarButtonType button_type) {
// Verify that our enum matches BrowserDelegate's values.
static_assert(static_cast<int>(CEF_CTBT_MAX_VALUE) ==
static_assert(static_cast<int>(CEF_CTBT_NUM_VALUES) - 1 ==
static_cast<int>(ToolbarButtonType::kMaxValue),
"enum mismatch");
"Enum values in cef_chrome_toolbar_button_type_t must match "
"ToolbarButtonType");
if (auto client = create_params_.client) {
if (auto handler = client->GetCommandHandler()) {

View File

@@ -315,7 +315,7 @@ bool CefInitialize(const CefMainArgs& args,
return true;
}
if (settings.size != sizeof(cef_settings_t)) {
if (!CEF_MEMBER_EXISTS(&settings, disable_signal_handlers)) {
DCHECK(false) << "invalid CefSettings structure size";
return false;
}

View File

@@ -300,6 +300,9 @@ void CefFileDialogManager::RunFileDialog(
case FILE_DIALOG_SAVE:
params.mode = blink::mojom::FileChooserParams::Mode::kSave;
break;
case FILE_DIALOG_NUM_VALUES:
DCHECK(false);
return;
}
params.title = title;

View File

@@ -120,6 +120,12 @@ class CefRegistrationImpl : public CefRegistration,
static CefMediaObserver::ConnectionState ToConnectionState(
blink::mojom::PresentationConnectionState state) {
static_assert(static_cast<int>(CEF_MRCS_NUM_VALUES) - 1 ==
static_cast<int>(
blink::mojom::PresentationConnectionState::kMaxValue),
"Enum values in cef_media_route_connection_state_t must "
"match blink::mojom::PresentationConnectionState");
switch (state) {
case blink::mojom::PresentationConnectionState::CONNECTING:
return CEF_MRCS_CONNECTING;
@@ -284,6 +290,12 @@ void CefMediaRouterImpl::NotifyCurrentRoutesInternal() {
void CefMediaRouterImpl::CreateRouteCallback(
CefRefPtr<CefMediaRouteCreateCallback> callback,
const media_router::RouteRequestResult& result) {
static_assert(static_cast<int>(CEF_MRCR_NUM_VALUES) - 1 ==
static_cast<int>(
media_router::mojom::RouteRequestResultCode::kMaxValue),
"Enum values in cef_media_route_create_result_t must match "
"media_router::mojom::RouteRequestResultCode");
DCHECK(ValidContext());
if (result.result_code() != media_router::mojom::RouteRequestResultCode::OK) {

View File

@@ -105,9 +105,10 @@ CefString CefMediaSinkImpl::GetName() {
CefMediaSink::IconType CefMediaSinkImpl::GetIconType() {
// Verify that our enum matches Chromium's values.
static_assert(static_cast<int>(CEF_MSIT_TOTAL_COUNT) ==
static_assert(static_cast<int>(CEF_MSIT_NUM_VALUES) ==
static_cast<int>(media_router::SinkIconType::TOTAL_COUNT),
"enum mismatch");
"Enum values in cef_media_sink_icon_type_t must match "
"media_router::SinkIconType");
return static_cast<CefMediaSink::IconType>(sink_.icon_type());
}

View File

@@ -240,7 +240,7 @@ struct CefMenuModelImpl::Item {
bool ctrl_pressed_ = false;
bool alt_pressed_ = false;
cef_color_t colors_[CEF_MENU_COLOR_COUNT] = {0};
cef_color_t colors_[CEF_MENU_COLOR_NUM_VALUES] = {0};
gfx::FontList font_list_;
bool has_font_list_ = false;
};
@@ -744,7 +744,7 @@ bool CefMenuModelImpl::SetColorAt(int index,
return false;
}
if (color_type < 0 || color_type >= CEF_MENU_COLOR_COUNT) {
if (color_type < 0 || color_type >= CEF_MENU_COLOR_NUM_VALUES) {
return false;
}
@@ -775,7 +775,7 @@ bool CefMenuModelImpl::GetColorAt(int index,
return false;
}
if (color_type < 0 || color_type >= CEF_MENU_COLOR_COUNT) {
if (color_type < 0 || color_type >= CEF_MENU_COLOR_NUM_VALUES) {
return false;
}

View File

@@ -225,7 +225,7 @@ class CefMenuModelImpl : public CefMenuModel {
std::unique_ptr<ui::MenuModel> model_;
// Style information.
cef_color_t default_colors_[CEF_MENU_COLOR_COUNT] = {0};
cef_color_t default_colors_[CEF_MENU_COLOR_NUM_VALUES] = {0};
gfx::FontList default_font_list_;
bool has_default_font_list_ = false;

View File

@@ -178,6 +178,8 @@ ui::ImeTextSpan::UnderlineStyle GetImeUnderlineStyle(
return ui::ImeTextSpan::UnderlineStyle::kDash;
case CEF_CUS_NONE:
return ui::ImeTextSpan::UnderlineStyle::kNone;
case CEF_CUS_NUM_VALUES:
break;
}
DCHECK(false);
@@ -1474,7 +1476,7 @@ void CefRenderWidgetHostViewOSR::OnUpdateTextInputStateCalled(
CefRenderHandler::TextInputMode mode = CEF_TEXT_INPUT_MODE_NONE;
if (state && state->type != ui::TEXT_INPUT_TYPE_NONE) {
static_assert(
static_cast<int>(CEF_TEXT_INPUT_MODE_MAX) ==
static_cast<int>(CEF_TEXT_INPUT_MODE_NUM_VALUES) - 1 ==
static_cast<int>(ui::TEXT_INPUT_MODE_MAX),
"Enum values in cef_text_input_mode_t must match ui::TextInputMode");
mode = static_cast<CefRenderHandler::TextInputMode>(state->mode);

View File

@@ -137,7 +137,8 @@ void CefVideoConsumerOSR::OnFrameCaptured(
: CEF_COLOR_TYPE_BGRA_8888;
// Build extra common info.
cef_accelerated_paint_info_common_t extra = {};
cef_accelerated_paint_info_common_t extra = {
sizeof(cef_accelerated_paint_info_common_t)};
extra.timestamp = info->timestamp.InMicroseconds();
extra.coded_size = {info->coded_size.width(), info->coded_size.height()};
extra.visible_rect = {info->visible_rect.x(), info->visible_rect.y(),

View File

@@ -154,6 +154,9 @@ class CefPermissionPrompt : public permissions::PermissionPrompt {
case CEF_PERMISSION_RESULT_IGNORE:
delegate_->Ignore();
break;
case CEF_PERMISSION_RESULT_NUM_VALUES:
DCHECK(false);
return;
}
}

View File

@@ -58,6 +58,9 @@ class CefPreferenceRegistrarImpl : public CefPreferenceRegistrar {
case VTYPE_LIST:
RegisterComplexPref(nameStr, default_value);
return true;
case VTYPE_NUM_VALUES:
DCHECK(false);
return false;
};
LOG(ERROR) << "Invalid value type for preference: " << nameStr;

View File

@@ -130,6 +130,12 @@ CefRefPtr<CefRequestContext> CefRequestContext::CreateContext(
return nullptr;
}
// Verify that the settings structure is a valid size.
if (!CEF_MEMBER_EXISTS(&settings, cookieable_schemes_exclude_defaults)) {
DCHECK(false) << "invalid CefRequestContextSettings structure size";
return nullptr;
}
CefRequestContextImpl::Config config;
config.settings = settings;
config.handler = handler;

View File

@@ -200,6 +200,9 @@ class CefTestServerImpl::Context {
case CEF_TEST_CERT_EXPIRED:
test_server_->SetSSLConfig(EmbeddedTestServer::CERT_EXPIRED);
break;
case CEF_TEST_CERT_NUM_VALUES:
DCHECK(false);
return false;
}
}

View File

@@ -7,22 +7,36 @@
#include "cef/libcef/browser/thread_util.h"
namespace {
static int CefCommandIdToChromeId(cef_text_field_commands_t command_id) {
static_assert(static_cast<int>(CEF_TFC_NUM_VALUES) - 1 ==
static_cast<int>(views::Textfield::kLastCommandId),
"Enum values in cef_text_field_commands_t must match "
"views::Textfield::MenuCommands");
switch (command_id) {
case cef_text_field_commands_t::CEF_TFC_CUT:
case CEF_TFC_UNKNOWN:
return 0;
case CEF_TFC_CUT:
return views::Textfield::kCut;
case cef_text_field_commands_t::CEF_TFC_COPY:
case CEF_TFC_COPY:
return views::Textfield::kCopy;
case cef_text_field_commands_t::CEF_TFC_PASTE:
case CEF_TFC_PASTE:
return views::Textfield::kPaste;
case cef_text_field_commands_t::CEF_TFC_UNDO:
return views::Textfield::kUndo;
case cef_text_field_commands_t::CEF_TFC_DELETE:
return views::Textfield::kDelete;
case cef_text_field_commands_t::CEF_TFC_SELECT_ALL:
case CEF_TFC_SELECT_ALL:
return views::Textfield::kSelectAll;
case CEF_TFC_SELECT_WORD:
return views::Textfield::kSelectWord;
case CEF_TFC_UNDO:
return views::Textfield::kUndo;
case CEF_TFC_DELETE:
return views::Textfield::kDelete;
case CEF_TFC_NUM_VALUES:
break;
}
DCHECK(false) << "Unsupported command ID " << command_id;
return 0;
}
} // namespace
// static

View File

@@ -351,7 +351,7 @@ SkColor GetColor(const views::View* view, ui::ColorId id) {
// Verify that our enum matches Chromium's values.
static_assert(static_cast<int>(CEF_ChromeColorsEnd) ==
static_cast<int>(kChromeColorsEnd),
"enum mismatch");
"Enum values in cef_color_id_t must match ChromeColorIds");
// |color_provider| will be nullptr if |view| has not yet been added to a
// Widget.

View File

@@ -471,6 +471,9 @@ void CefWindowView::CreateWidget(gfx::AcceleratedWidget parent_widget) {
params.show_state = ui::mojom::WindowShowState::kMinimized;
#endif
break;
case CEF_SHOW_STATE_NUM_VALUES:
DCHECK(false);
break;
}
bool is_menu = false;

View File

@@ -208,7 +208,12 @@ net::CookieSameSite MakeCookieSameSite(cef_cookie_same_site_t value) {
return net::CookieSameSite::LAX_MODE;
case CEF_COOKIE_SAME_SITE_STRICT_MODE:
return net::CookieSameSite::STRICT_MODE;
case CEF_COOKIE_SAME_SITE_NUM_VALUES:
break;
}
DCHECK(false);
return net::CookieSameSite::UNSPECIFIED;
}
net::CookiePriority MakeCookiePriority(cef_cookie_priority_t value) {

View File

@@ -183,9 +183,10 @@ CefRefPtr<CefRequest> CefRequest::Create() {
CefRequestImpl::CefRequestImpl() {
// Verify that our enum matches Chromium's values.
static_assert(static_cast<int>(REFERRER_POLICY_LAST_VALUE) ==
static_cast<int>(net::ReferrerPolicy::MAX),
"enum mismatch");
static_assert(
static_cast<int>(REFERRER_POLICY_NUM_VALUES) - 1 ==
static_cast<int>(net::ReferrerPolicy::MAX),
"Enum values in cef_referrer_policy_t must match net::ReferrerPolicy");
base::AutoLock lock_scope(lock_);
Reset();
@@ -751,6 +752,8 @@ CefRequestImpl::NetReferrerPolicyToBlinkReferrerPolicy(
return network::mojom::ReferrerPolicy::kStrictOrigin;
case REFERRER_POLICY_NO_REFERRER:
return network::mojom::ReferrerPolicy::kNever;
case REFERRER_POLICY_NUM_VALUES:
break;
}
DCHECK(false);
return network::mojom::ReferrerPolicy::kDefault;