From 04fbdd347b5d16d4de6d430f337e7188d0d2ddea Mon Sep 17 00:00:00 2001 From: Valentin Shergin Date: Tue, 9 Oct 2018 16:25:15 -0700 Subject: [PATCH] Fabric: Proper parsing of Accessibility Props Summary: Previsouly, we basically didn't support Accessibility at all. Reviewed By: mdvacca Differential Revision: D10250635 fbshipit-source-id: d33eed8f56374f57310654653f41c312cb5942e6 --- .../view/accessibility/AccessibilityProps.cpp | 38 ++++++- .../view/accessibility/AccessibilityProps.h | 7 +- .../accessibilityPropsConversions.h | 106 ++++++++++++++++++ .../accessibilityValuesConversions.cpp | 24 ---- .../accessibilityValuesConversions.h | 19 ---- 5 files changed, 147 insertions(+), 47 deletions(-) create mode 100644 ReactCommon/fabric/components/view/accessibility/accessibilityPropsConversions.h delete mode 100644 ReactCommon/fabric/components/view/accessibility/accessibilityValuesConversions.cpp delete mode 100644 ReactCommon/fabric/components/view/accessibility/accessibilityValuesConversions.h diff --git a/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.cpp b/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.cpp index ee8f45c10..84d18dfc8 100644 --- a/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.cpp +++ b/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.cpp @@ -7,14 +7,48 @@ #include "AccessibilityProps.h" -#include "accessibilityValuesConversions.h" +#include +#include +#include namespace facebook { namespace react { AccessibilityProps::AccessibilityProps( const AccessibilityProps &sourceProps, - const RawProps &rawProps) {} + const RawProps &rawProps) + : accessible(convertRawProp( + rawProps, + "accessible", + sourceProps.accessible)), + accessibilityTraits(convertRawProp( + rawProps, + "accessibilityTraits", + sourceProps.accessibilityTraits)), + accessibilityLabel(convertRawProp( + rawProps, + "accessibilityLabel", + sourceProps.accessibilityLabel)), + accessibilityHint(convertRawProp( + rawProps, + "accessibilityHint", + sourceProps.accessibilityHint)), + accessibilityActions(convertRawProp( + rawProps, + "accessibilityActions", + sourceProps.accessibilityActions)), + accessibilityViewIsModal(convertRawProp( + rawProps, + "accessibilityViewIsModal", + sourceProps.accessibilityViewIsModal)), + accessibilityElementsHidden(convertRawProp( + rawProps, + "accessibilityElementsHidden", + sourceProps.accessibilityElementsHidden)), + accessibilityIgnoresInvertColors(convertRawProp( + rawProps, + "accessibilityIgnoresInvertColors", + sourceProps.accessibilityIgnoresInvertColors)) {} } // namespace react } // namespace facebook diff --git a/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.h b/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.h index c279d1d05..66fe55389 100644 --- a/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.h +++ b/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.h @@ -29,11 +29,14 @@ class AccessibilityProps : public virtual DebugStringConvertible { #pragma mark - Props const bool accessible{false}; - const std::vector accessibilityActions{}; - const std::string accessibilityLabel{""}; const AccessibilityTraits accessibilityTraits{AccessibilityTraits::None}; + const std::string accessibilityLabel{""}; + const std::string accessibilityHint{""}; + const std::vector accessibilityActions{}; const bool accessibilityViewIsModal{false}; const bool accessibilityElementsHidden{false}; + const bool accessibilityIgnoresInvertColors{false}; + const std::string testId{""}; }; } // namespace react diff --git a/ReactCommon/fabric/components/view/accessibility/accessibilityPropsConversions.h b/ReactCommon/fabric/components/view/accessibility/accessibilityPropsConversions.h new file mode 100644 index 000000000..59e425c78 --- /dev/null +++ b/ReactCommon/fabric/components/view/accessibility/accessibilityPropsConversions.h @@ -0,0 +1,106 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +inline void fromString(const std::string &string, AccessibilityTraits &result) { + if (string == "none") { + result = AccessibilityTraits::None; + return; + } + if (string == "button") { + result = AccessibilityTraits::Button; + return; + } + if (string == "link") { + result = AccessibilityTraits::Link; + return; + } + if (string == "image") { + result = AccessibilityTraits::Image; + return; + } + if (string == "selected") { + result = AccessibilityTraits::Selected; + return; + } + if (string == "plays") { + result = AccessibilityTraits::PlaysSound; + return; + } + if (string == "keyboardkey") { + result = AccessibilityTraits::KeyboardKey; + return; + } + if (string == "text") { + result = AccessibilityTraits::StaticText; + return; + } + if (string == "disabled") { + result = AccessibilityTraits::NotEnabled; + return; + } + if (string == "frequentUpdates") { + result = AccessibilityTraits::UpdatesFrequently; + return; + } + if (string == "search") { + result = AccessibilityTraits::SearchField; + return; + } + if (string == "startsMedia") { + result = AccessibilityTraits::StartsMediaSession; + return; + } + if (string == "adjustable") { + result = AccessibilityTraits::Adjustable; + return; + } + if (string == "allowsDirectInteraction") { + result = AccessibilityTraits::DirectInteraction; + return; + } + if (string == "pageTurn") { + result = AccessibilityTraits::CausesPageTurn; + return; + } + if (string == "header") { + result = AccessibilityTraits::Header; + return; + } + abort(); +} + +inline void fromDynamic( + const folly::dynamic &value, + AccessibilityTraits &result) { + if (value.isString()) { + fromString(value.asString(), result); + return; + } + + if (value.isArray()) { + result = {}; + for (auto &item : value) { + auto string = item.asString(); + AccessibilityTraits itemAccessibilityTraits; + fromString(value.asString(), itemAccessibilityTraits); + result = result | itemAccessibilityTraits; + } + } + + abort(); +} + +} // namespace react +} // namespace facebook diff --git a/ReactCommon/fabric/components/view/accessibility/accessibilityValuesConversions.cpp b/ReactCommon/fabric/components/view/accessibility/accessibilityValuesConversions.cpp deleted file mode 100644 index f017851b1..000000000 --- a/ReactCommon/fabric/components/view/accessibility/accessibilityValuesConversions.cpp +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#include "accessibilityValuesConversions.h" - -#include - -namespace facebook { -namespace react { - -AccessibilityTraits accessibilityTraitsFromDynamic( - const folly::dynamic &value) { - assert(value.isString()); - - // FIXME: Not clear yet. - abort(); -} - -} // namespace react -} // namespace facebook diff --git a/ReactCommon/fabric/components/view/accessibility/accessibilityValuesConversions.h b/ReactCommon/fabric/components/view/accessibility/accessibilityValuesConversions.h deleted file mode 100644 index 210900da3..000000000 --- a/ReactCommon/fabric/components/view/accessibility/accessibilityValuesConversions.h +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#pragma once - -#include -#include - -namespace facebook { -namespace react { - -AccessibilityTraits accessibilityTraitsFromDynamic(const folly::dynamic &value); - -} // namespace react -} // namespace facebook