From da10179238f394a101a5698db015d3cfcf6a6ac2 Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Wed, 23 Dec 2020 04:43:55 -0800 Subject: [PATCH] Pass x and y to measure callback Summary: Changelog: [internal] Previous implementation of "measure" in UIManagerBinding returned 0, 0 for x and y coordinates. Reviewed By: shergin Differential Revision: D25681586 fbshipit-source-id: fa69b6d4803f083a8299e00cae8bb59932c8bf78 --- .../react/renderer/uimanager/UIManager.h | 6 +++--- .../renderer/uimanager/UIManagerBinding.cpp | 21 ++++++++++++------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/ReactCommon/react/renderer/uimanager/UIManager.h b/ReactCommon/react/renderer/uimanager/UIManager.h index e138a6ec6e6..62f3e6ba5db 100644 --- a/ReactCommon/react/renderer/uimanager/UIManager.h +++ b/ReactCommon/react/renderer/uimanager/UIManager.h @@ -74,6 +74,9 @@ class UIManager final : public ShadowTreeDelegate { void registerCommitHook(UIManagerCommitHook const &commitHook) const; void unregisterCommitHook(UIManagerCommitHook const &commitHook) const; + ShadowNode::Shared getNewestCloneOfShadowNode( + ShadowNode const &shadowNode) const; + #pragma mark - ShadowTreeDelegate void shadowTreeDidFinishTransaction( @@ -125,9 +128,6 @@ class UIManager final : public ShadowTreeDelegate { ShadowNode::Shared const &shadowNode, Point point) const; - ShadowNode::Shared getNewestCloneOfShadowNode( - ShadowNode const &shadowNode) const; - /* * Returns layout metrics of given `shadowNode` relative to * `ancestorShadowNode` (relative to the root node in case if provided diff --git a/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp b/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp index e772a888e2d..6dbd55137db 100644 --- a/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp +++ b/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp @@ -7,10 +7,10 @@ #include "UIManagerBinding.h" -#include - #include #include +#include +#include namespace facebook { namespace react { @@ -594,10 +594,9 @@ jsi::Value UIManagerBinding::get( jsi::Value const &thisValue, jsi::Value const *arguments, size_t count) noexcept->jsi::Value { + auto shadowNode = shadowNodeFromValue(runtime, arguments[0]); auto layoutMetrics = uiManager->getRelativeLayoutMetrics( - *shadowNodeFromValue(runtime, arguments[0]), - nullptr, - {/* .includeTransform = */ true}); + *shadowNode, nullptr, {/* .includeTransform = */ true}); auto onSuccessFunction = arguments[1].getObject(runtime).getFunction(runtime); @@ -605,12 +604,20 @@ jsi::Value UIManagerBinding::get( onSuccessFunction.call(runtime, {0, 0, 0, 0, 0, 0}); return jsi::Value::undefined(); } + auto newestCloneOfShadowNode = + uiManager->getNewestCloneOfShadowNode(*shadowNode); + + auto layoutableShadowNode = traitCast( + newestCloneOfShadowNode.get()); + Point originRelativeToParent = layoutableShadowNode + ? layoutableShadowNode->getLayoutMetrics().frame.origin + : Point(); auto frame = layoutMetrics.frame; onSuccessFunction.call( runtime, - {0, - 0, + {jsi::Value{runtime, (double)originRelativeToParent.x}, + jsi::Value{runtime, (double)originRelativeToParent.y}, jsi::Value{runtime, (double)frame.size.width}, jsi::Value{runtime, (double)frame.size.height}, jsi::Value{runtime, (double)frame.origin.x},