From a9e4a021f916c04a1ac70bf3348bbe84131e65ed Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Wed, 26 Apr 2023 21:49:23 -0700 Subject: [PATCH] Add JavaScript bindings for Errata API Summary: Wire C ABI to embind to expose to JS Differential Revision: https://internalfb.com/D45297215 fbshipit-source-id: bf1bb8761d764062169f48efa7675841b0941db1 --- javascript/src_js/wrapAsm.d.ts | 13 +++++++++ javascript/src_native/Config.cc | 12 +++++++-- javascript/src_native/Config.hh | 6 +++-- javascript/src_native/embind.cc | 2 ++ javascript/tests/YGErrataTest.test.js | 38 +++++++++++++++++++++++++++ 5 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 javascript/tests/YGErrataTest.test.js diff --git a/javascript/src_js/wrapAsm.d.ts b/javascript/src_js/wrapAsm.d.ts index 4af2cd6707..022ac5f349 100644 --- a/javascript/src_js/wrapAsm.d.ts +++ b/javascript/src_js/wrapAsm.d.ts @@ -12,6 +12,7 @@ import type { Direction, Display, Edge, + Errata, ExperimentalFeature, FlexDirection, Gutter, @@ -52,8 +53,20 @@ export type Config = { enabled: boolean ): void; setPointScaleFactor(factor: number): void; + /** + * @deprecated Please use "getErrata()" + */ useLegacyStretchBehaviour(): boolean; + /** + * @deprecated "setUseLegacyStretchBehaviour" will be removed in the next + * release. Usage should be replaced with "setErrata(ERRATA_ALL)" to opt out + * of all future breaking conformance fixes, or + * "setErrata(ERRATA_STRETCH_FLEX_BASIS)" to opt out of the specific + * conformance fix previously disabled by "UseLegacyStretchBehaviour". + */ setUseLegacyStretchBehaviour(useLegacyStretchBehaviour: boolean): void; + getErrata(): Errata, + setErrata(errata: Errata): void, useWebDefaults(): boolean; setUseWebDefaults(useWebDefaults: boolean): void; }; diff --git a/javascript/src_native/Config.cc b/javascript/src_native/Config.cc index 3824f519c1..ebcfe44a1d 100644 --- a/javascript/src_native/Config.cc +++ b/javascript/src_native/Config.cc @@ -36,6 +36,10 @@ void Config::setUseLegacyStretchBehaviour(bool useLegacyStretchBehaviour) { YGConfigSetUseLegacyStretchBehaviour(m_config, useLegacyStretchBehaviour); } +void Config::setErrata(int errata) { + YGConfigSetErrata(m_config, static_cast(errata)); +} + void Config::setUseWebDefaults(bool useWebDefaults) { YGConfigSetUseWebDefaults(m_config, useWebDefaults); } @@ -45,10 +49,14 @@ bool Config::isExperimentalFeatureEnabled(int feature) const { m_config, static_cast(feature)); } -bool Config::useLegacyStretchBehaviour() { +bool Config::useLegacyStretchBehaviour() const { return YGConfigGetUseLegacyStretchBehaviour(m_config); } -bool Config::useWebDefaults() { +int Config::getErrata() const { + return static_cast(YGConfigGetErrata(m_config)); +} + +bool Config::useWebDefaults() const { return YGConfigGetUseWebDefaults(m_config); } diff --git a/javascript/src_native/Config.hh b/javascript/src_native/Config.hh index ccebfa67ac..5abfdd5b40 100644 --- a/javascript/src_native/Config.hh +++ b/javascript/src_native/Config.hh @@ -33,12 +33,14 @@ public: // Setters void setExperimentalFeatureEnabled(int feature, bool enabled); void setPointScaleFactor(float pixelsInPoint); void setUseLegacyStretchBehaviour(bool useLegacyStretchBehaviour); + void setErrata(int errata); void setUseWebDefaults(bool useWebDefaults); public: // Getters bool isExperimentalFeatureEnabled(int feature) const; - bool useLegacyStretchBehaviour(); - bool useWebDefaults(); + bool useLegacyStretchBehaviour() const; + int getErrata() const; + bool useWebDefaults() const; private: YGConfigRef m_config; diff --git a/javascript/src_native/embind.cc b/javascript/src_native/embind.cc index a59c8e4008..280d9328ec 100644 --- a/javascript/src_native/embind.cc +++ b/javascript/src_native/embind.cc @@ -34,10 +34,12 @@ EMSCRIPTEN_BINDINGS(YOGA_LAYOUT) { .function("setPointScaleFactor", &Config::setPointScaleFactor) .function( "setUseLegacyStretchBehaviour", &Config::setUseLegacyStretchBehaviour) + .function("setErrata", &Config::setErrata) .function("setUseWebDefaults", &Config::setUseWebDefaults) .function( "isExperimentalFeatureEnabled", &Config::isExperimentalFeatureEnabled) .function("useLegacyStretchBehaviour", &Config::useLegacyStretchBehaviour) + .function("getErrata", &Config::getErrata) .function("useWebDefaults", &Config::useWebDefaults); value_object("Layout") diff --git a/javascript/tests/YGErrataTest.test.js b/javascript/tests/YGErrataTest.test.js new file mode 100644 index 0000000000..4a26815104 --- /dev/null +++ b/javascript/tests/YGErrataTest.test.js @@ -0,0 +1,38 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +test("errata_all_contains_example_errata", () => { + const config = Yoga.Config.create(); + config.setErrata(Yoga.ERRATA_ALL); + + expect(config.getErrata()).toBe(Yoga.ERRATA_ALL); + expect(config.getErrata() & Yoga.ERRATA_STRETCH_FLEX_BASIS).not.toBe(0); + + config.free(); +}); + +test("errata_none_omits_example_errata", () => { + const config = Yoga.Config.create(); + config.setErrata(Yoga.ERRATA_NONE); + + expect(config.getErrata()).toBe(Yoga.ERRATA_NONE); + expect(config.getErrata() & Yoga.ERRATA_STRETCH_FLEX_BASIS).toBe(0); + + config.free(); +}); + +test("errata_is_settable", () => { + const config = Yoga.Config.create(); + + config.setErrata(Yoga.ERRATA_ALL); + expect(config.getErrata()).toBe(Yoga.ERRATA_ALL); + + config.setErrata(Yoga.ERRATA_NONE); + expect(config.getErrata()).toBe(Yoga.ERRATA_NONE); + + config.free(); +});