From 9671a68f39f72d7cd9d866db8c9d13b31b824974 Mon Sep 17 00:00:00 2001 From: Iurii Onishchenko Date: Mon, 13 May 2024 15:02:15 +0300 Subject: [PATCH] Move Accessibility API from Starboard to Extension b/299639708 Change-Id: Ida75ca986b88ae444684321ae609e1aae5588bf5 --- cobalt/browser/web_module.cc | 4 + .../dom/captions/system_caption_settings.cc | 79 ++++-- cobalt/dom/captions/system_caption_settings.h | 7 + cobalt/h5vcc/h5vcc_accessibility.cc | 40 ++- starboard/elf_loader/exported_symbols.cc | 6 +- starboard/extension/accessibility.h | 242 ++++++++++++++++++ starboard/extension/extension_test.cc | 23 ++ starboard/nplb/extern_c_test.cc | 2 + starboard/nplb/include_all.c | 2 + 9 files changed, 378 insertions(+), 27 deletions(-) create mode 100644 starboard/extension/accessibility.h diff --git a/cobalt/browser/web_module.cc b/cobalt/browser/web_module.cc index 448aab92412b..8dab0833f7c6 100644 --- a/cobalt/browser/web_module.cc +++ b/cobalt/browser/web_module.cc @@ -79,7 +79,11 @@ #include "cobalt/web/environment_settings.h" #include "cobalt/web/event.h" #include "cobalt/web/url.h" +#if SB_API_VERSION < 16 #include "starboard/accessibility.h" +#else // SB_API_VERSION < 16 +#include "starboard/extension/accessibility.h" +#endif // SB_API_VERSION < 16 #include "starboard/gles.h" #if defined(ENABLE_DEBUGGER) diff --git a/cobalt/dom/captions/system_caption_settings.cc b/cobalt/dom/captions/system_caption_settings.cc index 7308247e185e..222d9d5168ec 100644 --- a/cobalt/dom/captions/system_caption_settings.cc +++ b/cobalt/dom/captions/system_caption_settings.cc @@ -27,7 +27,11 @@ #include "cobalt/dom/captions/caption_opacity_percentage.h" #include "cobalt/dom/captions/caption_state.h" #include "cobalt/web/event_target.h" +#if SB_API_VERSION < 16 #include "starboard/accessibility.h" +#else // SB_API_VERSION < 16 +#include "starboard/extension/accessibility.h" +#endif // SB_API_VERSION < 16 #include "starboard/memory.h" namespace cobalt { @@ -181,7 +185,7 @@ void SystemCaptionSettings::OnCaptionSettingsChanged() { base::Optional SystemCaptionSettings::background_color() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); if (!success) { return base::nullopt; @@ -201,7 +205,7 @@ base::Optional SystemCaptionSettings::background_color() { CaptionState SystemCaptionSettings::background_color_state() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); if (success) { return ToCobaltCaptionState(caption_settings.background_color_state); } else { @@ -212,7 +216,7 @@ CaptionState SystemCaptionSettings::background_color_state() { base::Optional SystemCaptionSettings::background_opacity() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); if (!success) { return base::nullopt; @@ -232,7 +236,7 @@ base::Optional SystemCaptionSettings::background_opacity() { CaptionState SystemCaptionSettings::background_opacity_state() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); if (success) { return ToCobaltCaptionState(caption_settings.background_opacity_state); } else { @@ -243,7 +247,7 @@ CaptionState SystemCaptionSettings::background_opacity_state() { base::Optional SystemCaptionSettings::character_edge_style() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); if (!success) { return base::nullopt; @@ -265,7 +269,7 @@ base::Optional SystemCaptionSettings::character_edge_style() { CaptionState SystemCaptionSettings::character_edge_style_state() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); if (success) { return ToCobaltCaptionState(caption_settings.character_edge_style_state); } else { @@ -276,7 +280,7 @@ CaptionState SystemCaptionSettings::character_edge_style_state() { base::Optional SystemCaptionSettings::font_color() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); if (!success) { return base::nullopt; @@ -296,7 +300,7 @@ base::Optional SystemCaptionSettings::font_color() { CaptionState SystemCaptionSettings::font_color_state() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); if (success) { return ToCobaltCaptionState(caption_settings.font_color_state); } else { @@ -307,7 +311,7 @@ CaptionState SystemCaptionSettings::font_color_state() { base::Optional SystemCaptionSettings::font_family() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); if (!success) { return base::nullopt; @@ -327,7 +331,7 @@ base::Optional SystemCaptionSettings::font_family() { CaptionState SystemCaptionSettings::font_family_state() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); if (success) { return ToCobaltCaptionState(caption_settings.font_family_state); } else { @@ -338,7 +342,7 @@ CaptionState SystemCaptionSettings::font_family_state() { base::Optional SystemCaptionSettings::font_opacity() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); if (!success) { return base::nullopt; @@ -358,7 +362,7 @@ base::Optional SystemCaptionSettings::font_opacity() { CaptionState SystemCaptionSettings::font_opacity_state() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); if (success) { return ToCobaltCaptionState(caption_settings.font_opacity_state); } else { @@ -369,7 +373,7 @@ CaptionState SystemCaptionSettings::font_opacity_state() { base::Optional SystemCaptionSettings::font_size() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); if (!success) { return base::nullopt; @@ -390,7 +394,7 @@ base::Optional SystemCaptionSettings::font_size() { CaptionState SystemCaptionSettings::font_size_state() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); if (success) { return ToCobaltCaptionState(caption_settings.font_size_state); } else { @@ -401,7 +405,7 @@ CaptionState SystemCaptionSettings::font_size_state() { base::Optional SystemCaptionSettings::window_color() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); if (!success) { return base::nullopt; @@ -421,7 +425,7 @@ base::Optional SystemCaptionSettings::window_color() { CaptionState SystemCaptionSettings::window_color_state() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); if (success) { return ToCobaltCaptionState(caption_settings.window_color_state); } else { @@ -432,7 +436,7 @@ CaptionState SystemCaptionSettings::window_color_state() { base::Optional SystemCaptionSettings::window_opacity() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); if (!success) { return base::nullopt; @@ -452,7 +456,7 @@ base::Optional SystemCaptionSettings::window_opacity() { CaptionState SystemCaptionSettings::window_opacity_state() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); if (success) { return ToCobaltCaptionState(caption_settings.window_opacity_state); } else { @@ -463,7 +467,7 @@ CaptionState SystemCaptionSettings::window_opacity_state() { bool SystemCaptionSettings::is_enabled() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); DCHECK(supports_is_enabled()); return (success && caption_settings.supports_is_enabled) @@ -473,13 +477,25 @@ bool SystemCaptionSettings::is_enabled() { void SystemCaptionSettings::set_is_enabled(bool active) { DCHECK(supports_set_enabled()); +#if SB_API_VERSION >= 16 + auto accessibility_api = + static_cast( + SbSystemGetExtension(kStarboardExtensionAccessibilityName)); + if (accessibility_api && + strcmp(accessibility_api->name, kStarboardExtensionAccessibilityName) == + 0 && + accessibility_api->version >= 1) { + accessibility_api->SetCaptionsEnabled(active); + } +#else // SB_API_VERSION >= 16 SbAccessibilitySetCaptionsEnabled(active); +#endif // SB_API_VERSION >= 16 } bool SystemCaptionSettings::supports_is_enabled() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); return (success) ? caption_settings.supports_is_enabled : false; } @@ -487,7 +503,7 @@ bool SystemCaptionSettings::supports_is_enabled() { bool SystemCaptionSettings::supports_set_enabled() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); return (success) ? caption_settings.supports_set_enabled : false; } @@ -495,7 +511,7 @@ bool SystemCaptionSettings::supports_set_enabled() { bool SystemCaptionSettings::supports_override() { SbAccessibilityCaptionSettings caption_settings; memset(&caption_settings, 0, sizeof(caption_settings)); - bool success = SbAccessibilityGetCaptionSettings(&caption_settings); + bool success = GetCaptionSettings(&caption_settings); return (success) ? caption_settings.supports_override : false; } @@ -629,6 +645,25 @@ const char* SystemCaptionSettings::CaptionOpacityPercentageToString( } } +bool SystemCaptionSettings::GetCaptionSettings( + SbAccessibilityCaptionSettings* caption_settings) { +#if SB_API_VERSION >= 16 + auto accessibility_api = + static_cast( + SbSystemGetExtension(kStarboardExtensionAccessibilityName)); + if (accessibility_api && + strcmp(accessibility_api->name, kStarboardExtensionAccessibilityName) == + 0 && + accessibility_api->version >= 1) { + return accessibility_api->GetCaptionSettings(caption_settings); + } else { + return false; + } +#else // SB_API_VERSION >= 16 + return SbAccessibilityGetCaptionSettings(caption_settings); +#endif // SB_API_VERSION >= 16 +} + } // namespace captions } // namespace dom } // namespace cobalt diff --git a/cobalt/dom/captions/system_caption_settings.h b/cobalt/dom/captions/system_caption_settings.h index afcdd71e5305..1446fa77fdc6 100644 --- a/cobalt/dom/captions/system_caption_settings.h +++ b/cobalt/dom/captions/system_caption_settings.h @@ -28,6 +28,11 @@ #include "cobalt/dom/captions/caption_state.h" #include "cobalt/script/environment_settings.h" #include "cobalt/web/event_target.h" +#if SB_API_VERSION < 16 +#include "starboard/accessibility.h" +#else // SB_API_VERSION < 16 +#include "starboard/extension/accessibility.h" +#endif // SB_API_VERSION < 16 namespace cobalt { namespace dom { @@ -93,6 +98,8 @@ class SystemCaptionSettings : public web::EventTarget { CaptionFontSizePercentage font_size); const char* CaptionOpacityPercentageToString( CaptionOpacityPercentage opacity); + + bool GetCaptionSettings(SbAccessibilityCaptionSettings* caption_settings); }; } // namespace captions } // namespace dom diff --git a/cobalt/h5vcc/h5vcc_accessibility.cc b/cobalt/h5vcc/h5vcc_accessibility.cc index 7ee5fc0f4d3d..a57f0ff98144 100644 --- a/cobalt/h5vcc/h5vcc_accessibility.cc +++ b/cobalt/h5vcc/h5vcc_accessibility.cc @@ -20,7 +20,11 @@ #include "cobalt/base/accessibility_settings_changed_event.h" #include "cobalt/base/accessibility_text_to_speech_settings_changed_event.h" #include "cobalt/browser/switches.h" +#if SB_API_VERSION < 16 #include "starboard/accessibility.h" +#else // SB_API_VERSION < 16 +#include "starboard/extension/accessibility.h" +#endif // SB_API_VERSION < 16 #include "starboard/memory.h" namespace cobalt { @@ -74,11 +78,25 @@ void H5vccAccessibility::set_built_in_screen_reader(bool value) { bool H5vccAccessibility::high_contrast_text() const { SbAccessibilityDisplaySettings settings; memset(&settings, 0, sizeof(settings)); - +#if SB_API_VERSION >= 16 + auto accessibility_api = + static_cast( + SbSystemGetExtension(kStarboardExtensionAccessibilityName)); + if (accessibility_api && + strcmp(accessibility_api->name, kStarboardExtensionAccessibilityName) == + 0 && + accessibility_api->version >= 1) { + if (!accessibility_api->GetDisplaySettings(&settings)) { + return false; + } + } else { + return false; + } +#else // SB_API_VERSION >= 16 if (!SbAccessibilityGetDisplaySettings(&settings)) { return false; } - +#endif // SB_API_VERSION >= 16 return settings.is_high_contrast_text_enabled; } @@ -89,11 +107,25 @@ bool H5vccAccessibility::text_to_speech() const { } SbAccessibilityTextToSpeechSettings settings; memset(&settings, 0, sizeof(settings)); - +#if SB_API_VERSION >= 16 + auto accessibility_api = + static_cast( + SbSystemGetExtension(kStarboardExtensionAccessibilityName)); + if (accessibility_api && + strcmp(accessibility_api->name, kStarboardExtensionAccessibilityName) == + 0 && + accessibility_api->version >= 1) { + if (!accessibility_api->GetTextToSpeechSettings(&settings)) { + return false; + } + } else { + return false; + } +#else // SB_API_VERSION >= 16 if (!SbAccessibilityGetTextToSpeechSettings(&settings)) { return false; } - +#endif // SB_API_VERSION >= 16 return settings.has_text_to_speech_setting && settings.is_text_to_speech_enabled; } diff --git a/starboard/elf_loader/exported_symbols.cc b/starboard/elf_loader/exported_symbols.cc index af9f0a12c8cc..4b5f1eb11944 100644 --- a/starboard/elf_loader/exported_symbols.cc +++ b/starboard/elf_loader/exported_symbols.cc @@ -25,7 +25,9 @@ #include #include +#if SB_API_VERSION < 16 #include "starboard/accessibility.h" +#endif // SB_API_VERSION < 16 #include "starboard/audio_sink.h" #if SB_API_VERSION < 16 #include "starboard/byte_swap.h" @@ -118,11 +120,13 @@ ExportedSymbols::ExportedSymbols() { #if SB_API_VERSION >= 16 REGISTER_SYMBOL(kSbCanMapExecutableMemory); REGISTER_SYMBOL(kHasPartialAudioFramesSupport); -#endif +#endif // SB_API_VERSION >= 16 +#if SB_API_VERSION < 16 REGISTER_SYMBOL(SbAccessibilityGetCaptionSettings); REGISTER_SYMBOL(SbAccessibilityGetDisplaySettings); REGISTER_SYMBOL(SbAccessibilityGetTextToSpeechSettings); REGISTER_SYMBOL(SbAccessibilitySetCaptionsEnabled); +#endif // SB_API_VERSION < 16 REGISTER_SYMBOL(SbAudioSinkCreate); REGISTER_SYMBOL(SbAudioSinkDestroy); REGISTER_SYMBOL(SbAudioSinkGetMaxChannels); diff --git a/starboard/extension/accessibility.h b/starboard/extension/accessibility.h new file mode 100644 index 000000000000..3adbb852793a --- /dev/null +++ b/starboard/extension/accessibility.h @@ -0,0 +1,242 @@ +// Copyright 2024 The Cobalt Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Module Overview: Starboard Accessibility module +// +// Provides access to the system options and settings related to accessibility. + +#ifndef STARBOARD_EXTENSION_ACCESSIBILITY_H_ +#define STARBOARD_EXTENSION_ACCESSIBILITY_H_ + +#include "starboard/export.h" +#include "starboard/types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define kStarboardExtensionAccessibilityName \ + "dev.starboard.extension.Accessibility" + +// A group of settings related to text-to-speech functionality, for platforms +// that expose system settings for text-to-speech. +typedef struct SbAccessibilityTextToSpeechSettings { + // Whether this platform has a system setting for text-to-speech or not. + bool has_text_to_speech_setting; + + // Whether the text-to-speech setting is enabled or not. This setting is only + // valid if |has_text_to_speech_setting| is set to true. + bool is_text_to_speech_enabled; +} SbAccessibilityTextToSpeechSettings; + +typedef struct SbAccessibilityDisplaySettings { + // Whether this platform has a system setting for high contrast text or not. + bool has_high_contrast_text_setting; + + // Whether the high contrast text setting is enabled or not. + bool is_high_contrast_text_enabled; +} SbAccessibilityDisplaySettings; + +// Enum for possible closed captioning character edge styles. +typedef enum SbAccessibilityCaptionCharacterEdgeStyle { + kSbAccessibilityCaptionCharacterEdgeStyleNone, + kSbAccessibilityCaptionCharacterEdgeStyleRaised, + kSbAccessibilityCaptionCharacterEdgeStyleDepressed, + kSbAccessibilityCaptionCharacterEdgeStyleUniform, + kSbAccessibilityCaptionCharacterEdgeStyleDropShadow, +} SbAccessibilityCaptionCharacterEdgeStyle; + +// Enum for possible closed captioning colors. +typedef enum SbAccessibilityCaptionColor { + kSbAccessibilityCaptionColorBlue, + kSbAccessibilityCaptionColorBlack, + kSbAccessibilityCaptionColorCyan, + kSbAccessibilityCaptionColorGreen, + kSbAccessibilityCaptionColorMagenta, + kSbAccessibilityCaptionColorRed, + kSbAccessibilityCaptionColorWhite, + kSbAccessibilityCaptionColorYellow, +} SbAccessibilityCaptionColor; + +// Enum for possible closed captioning font families +typedef enum SbAccessibilityCaptionFontFamily { + kSbAccessibilityCaptionFontFamilyCasual, + kSbAccessibilityCaptionFontFamilyCursive, + kSbAccessibilityCaptionFontFamilyMonospaceSansSerif, + kSbAccessibilityCaptionFontFamilyMonospaceSerif, + kSbAccessibilityCaptionFontFamilyProportionalSansSerif, + kSbAccessibilityCaptionFontFamilyProportionalSerif, + kSbAccessibilityCaptionFontFamilySmallCapitals, +} SbAccessibilityCaptionFontFamily; + +// Enum for possible closed captioning font size percentages. +typedef enum SbAccessibilityCaptionFontSizePercentage { + kSbAccessibilityCaptionFontSizePercentage25, + kSbAccessibilityCaptionFontSizePercentage50, + kSbAccessibilityCaptionFontSizePercentage75, + kSbAccessibilityCaptionFontSizePercentage100, + kSbAccessibilityCaptionFontSizePercentage125, + kSbAccessibilityCaptionFontSizePercentage150, + kSbAccessibilityCaptionFontSizePercentage175, + kSbAccessibilityCaptionFontSizePercentage200, + kSbAccessibilityCaptionFontSizePercentage225, + kSbAccessibilityCaptionFontSizePercentage250, + kSbAccessibilityCaptionFontSizePercentage275, + kSbAccessibilityCaptionFontSizePercentage300, +} SbAccessibilityCaptionFontSizePercentage; + +// Enum for possible closed captioning opacity percentages. +typedef enum SbAccessibilityCaptionOpacityPercentage { + kSbAccessibilityCaptionOpacityPercentage0, + kSbAccessibilityCaptionOpacityPercentage25, + kSbAccessibilityCaptionOpacityPercentage50, + kSbAccessibilityCaptionOpacityPercentage75, + kSbAccessibilityCaptionOpacityPercentage100, +} SbAccessibilityCaptionOpacityPercentage; + +// Enum for possible states of closed captioning properties. +typedef enum SbAccessibilityCaptionState { + // The property is not supported by the system. The application should provide + // a way to set this property, otherwise it will not be changeable. + // For any given closed captioning property, if its corresponding state + // property has a value of |kSbAccessibilityCaptionStateUnsupported|, then its + // own value is undefined. For example, if + // |SbAccessibilityCaptionColor::background_color_state| has a value of + // |kSbAccessibilityCaptionStateUnsupported|, then the value of + // |SbAccessibilityCaptionColor::background_color| is undefined. + kSbAccessibilityCaptionStateUnsupported = 0, + + // The property is supported by the system, but the user has not set it. + // The application should provide a default setting for the property to + // handle this case. + kSbAccessibilityCaptionStateUnset, + + // The user has set this property as a system default, meaning that it should + // take priority over app defaults. If + // SbAccessibilityCaptionSettings.supportsOverride contains true, this value + // should be interpreted as explicitly saying "do not override." If it + // contains false, it is up to the application to interpret any additional + // meaning of this value. + kSbAccessibilityCaptionStateSet, + + // This property should take priority over everything but application-level + // overrides, including video caption data. If + // SbAccessibilityCaptionSettings.supportsOverride contains false, then no + // fields of SbAccessibilityCaptionSettings will ever contain this value. + kSbAccessibilityCaptionStateOverride, +} SbAccessibilityCaptionState; + +// A group of settings related to system-level closed captioning settings, for +// platforms that expose closed captioning settings. +typedef struct SbAccessibilityCaptionSettings { + SbAccessibilityCaptionColor background_color; + SbAccessibilityCaptionState background_color_state; + + SbAccessibilityCaptionOpacityPercentage background_opacity; + SbAccessibilityCaptionState background_opacity_state; + + SbAccessibilityCaptionCharacterEdgeStyle character_edge_style; + SbAccessibilityCaptionState character_edge_style_state; + + SbAccessibilityCaptionColor font_color; + SbAccessibilityCaptionState font_color_state; + + SbAccessibilityCaptionFontFamily font_family; + SbAccessibilityCaptionState font_family_state; + + SbAccessibilityCaptionOpacityPercentage font_opacity; + SbAccessibilityCaptionState font_opacity_state; + + SbAccessibilityCaptionFontSizePercentage font_size; + SbAccessibilityCaptionState font_size_state; + + SbAccessibilityCaptionColor window_color; + SbAccessibilityCaptionState window_color_state; + + SbAccessibilityCaptionOpacityPercentage window_opacity; + SbAccessibilityCaptionState window_opacity_state; + + // The |is_enabled| attribute determines if the user has chosen to enable + // closed captions on their system. + bool is_enabled; + + // Some platforms support enabling or disabling captions, some support reading + // whether they are enabled from the system settings, and others support + // neither. As a result, there are separate checks for getting and setting + // the value that is contained in the |is_enabled| attribute. Modifying the + // attribute via |SbAccessibilitySetCaptionsEnabled| will change the setting + // system-wide. Attempting to read |is_enabled| when the value of + // |supports_is_enabled| is false will always return false. Attempting to set + // |is_enabled| via |SbAccessibilitySetCaptionsEnabled| when the value of + // |supports_set_enabled| is false will fail silently. + bool supports_is_enabled; + bool supports_set_enabled; + + // Some platforms may specify that when setting a property, it should override + // data from video streams and application settings (unless the application + // has its own overrides). Depending on whether this attribute contains true + // or false, the values of |SbAccessibilityCaptionState| should be interpreted + // differently. + bool supports_override; +} SbAccessibilityCaptionSettings; + +typedef struct StarboardExtensionAccessibilityApi { + // Name should be the string + // |kStarboardExtensionAccessibilityName|. This helps to validate that + // the extension API is correct. + const char* name; + + // This specifies the version of the API that is implemented. + uint32_t version; + + // Gets the platform settings related to the text-to-speech accessibility + // feature. This function returns false if |out_settings| is NULL or if it is + // not zero-initialized. + // + // |out_settings|: A pointer to a zero-initialized + // SbAccessibilityTextToSpeechSettings struct. + bool (*GetTextToSpeechSettings)( + SbAccessibilityTextToSpeechSettings* out_settings); + + // Gets the platform settings related to high contrast text. + // This function returns false if |out_settings| is NULL or if it is + // not zero-initialized. + // + // |out_settings|: A pointer to a zero-initialized + // SbAccessibilityDisplaySettings* struct. + bool (*GetDisplaySettings)(SbAccessibilityDisplaySettings* out_settings); + + // Gets the platform's settings for system-level closed captions. This + // function returns false if |caption_settings| is NULL or if it is not + // zero-initialized. + // + // |caption_settings|: A pointer to a zero-initialized + // SbAccessibilityTextToSpeechSettings struct. + bool (*GetCaptionSettings)(SbAccessibilityCaptionSettings* caption_settings); + + // Modifies whether closed captions are enabled at a system level. This + // function returns false if this feature is not supported by the platform, or + // if changing the setting is unsuccessful. This function will modify the + // setting system-wide. + // + // |enabled|: A boolean indicating whether captions should be turned on (true) + // or off (false). + bool (*SetCaptionsEnabled)(bool enabled); +} StarboardExtensionAccessibilityApi; + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // STARBOARD_EXTENSION_ACCESSIBILITY_H_ diff --git a/starboard/extension/extension_test.cc b/starboard/extension/extension_test.cc index 24dae87a815a..82ddcd9d0f75 100644 --- a/starboard/extension/extension_test.cc +++ b/starboard/extension/extension_test.cc @@ -14,6 +14,7 @@ #include +#include "starboard/extension/accessibility.h" #include "starboard/extension/configuration.h" #include "starboard/extension/crash_handler.h" #include "starboard/extension/cwrappers.h" @@ -590,5 +591,27 @@ TEST(ExtensionTest, MediaSettings) { << "Extension struct should be a singleton"; } +TEST(ExtensionTest, CobaltAccessibilityExtension) { + typedef StarboardExtensionAccessibilityApi ExtensionApi; + const char* kExtensionName = kStarboardExtensionAccessibilityName; + + const ExtensionApi* extension_api = + static_cast(SbSystemGetExtension(kExtensionName)); + if (!extension_api) { + return; + } + + EXPECT_STREQ(extension_api->name, kExtensionName); + EXPECT_EQ(extension_api->version, 1u); + EXPECT_NE(extension_api->GetTextToSpeechSettings, nullptr); + EXPECT_NE(extension_api->GetDisplaySettings, nullptr); + EXPECT_NE(extension_api->GetCaptionSettings, nullptr); + EXPECT_NE(extension_api->SetCaptionsEnabled, nullptr); + + const ExtensionApi* second_extension_api = + static_cast(SbSystemGetExtension(kExtensionName)); + EXPECT_EQ(second_extension_api, extension_api) + << "Extension struct should be a singleton"; +} } // namespace extension } // namespace starboard diff --git a/starboard/nplb/extern_c_test.cc b/starboard/nplb/extern_c_test.cc index 319b425b38a9..12300bd0658b 100644 --- a/starboard/nplb/extern_c_test.cc +++ b/starboard/nplb/extern_c_test.cc @@ -15,7 +15,9 @@ // Ensure that all starboard headers can be included inside extern "C". extern "C" { +#if SB_API_VERSION < 16 #include "starboard/accessibility.h" +#endif // SB_API_VERSION < 16 #include "starboard/atomic.h" #include "starboard/audio_sink.h" #if SB_API_VERSION < 16 diff --git a/starboard/nplb/include_all.c b/starboard/nplb/include_all.c index d083545b2238..8a5041bc7133 100644 --- a/starboard/nplb/include_all.c +++ b/starboard/nplb/include_all.c @@ -14,7 +14,9 @@ // Includes all headers in a C context to make sure they compile as C files. +#if SB_API_VERSION < 16 #include "starboard/accessibility.h" +#endif // SB_API_VERSION < 16 #include "starboard/atomic.h" #include "starboard/audio_sink.h" #if SB_API_VERSION < 16