Skip to content

Commit 1badc96

Browse files
authored
Implement getBoundingRect and ElementProviderFromPoint for Fabric (#11508)
* working impl of getBoundingRect and ElementProviderFromPoint * yarn format * Change files * Minor polish * yarn format * fix upstream break in TurboModule.h
1 parent d8f6102 commit 1badc96

25 files changed

+203
-51
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "prerelease",
3+
"comment": "working impl of getBoundingRect and ElementProviderFromPoint",
4+
"packageName": "react-native-windows",
5+
"email": "[email protected]",
6+
"dependentChangeType": "patch"
7+
}

vnext/Microsoft.ReactNative/Fabric/ComponentView.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,12 @@ struct IComponentView {
6060
virtual facebook::react::SharedTouchEventEmitter touchEventEmitterAtPoint(facebook::react::Point pt) noexcept = 0;
6161
virtual facebook::react::SharedTouchEventEmitter touchEventEmitter() noexcept = 0;
6262
virtual facebook::react::Tag tag() const noexcept = 0;
63-
virtual facebook::react::Tag hitTest(facebook::react::Point pt, facebook::react::Point &localPt) const noexcept = 0;
63+
// By default, hitTests according the pointerEvents prop on the Component.
64+
// If ignorePointerEvents = true, all Components are treated as valid targets
65+
virtual facebook::react::Tag hitTest(
66+
facebook::react::Point pt,
67+
facebook::react::Point &localPt,
68+
bool ignorePointerEvents = false) const noexcept = 0;
6469
virtual int64_t sendMessage(uint32_t msg, uint64_t wParam, int64_t lParam) noexcept = 0;
6570
virtual winrt::IInspectable EnsureUiaProvider() noexcept = 0;
6671
};

vnext/Microsoft.ReactNative/Fabric/Composition/AbiCompositionViewComponentView.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,11 @@ winrt::Microsoft::ReactNative::Composition::IVisual AbiCompositionViewComponentV
119119

120120
facebook::react::Tag AbiCompositionViewComponentView::hitTest(
121121
facebook::react::Point pt,
122-
facebook::react::Point &localPt) const noexcept {
122+
facebook::react::Point &localPt,
123+
bool ignorePointerEvents) const noexcept {
123124
facebook::react::Point ptLocal{pt.x - m_layoutMetrics.frame.origin.x, pt.y - m_layoutMetrics.frame.origin.y};
124125

125-
if ((m_props->pointerEvents == facebook::react::PointerEventsMode::Auto ||
126+
if ((ignorePointerEvents || m_props->pointerEvents == facebook::react::PointerEventsMode::Auto ||
126127
m_props->pointerEvents == facebook::react::PointerEventsMode::BoxOnly) &&
127128
ptLocal.x >= 0 && ptLocal.x <= m_layoutMetrics.frame.size.width && ptLocal.y >= 0 &&
128129
ptLocal.y <= m_layoutMetrics.frame.size.height) {

vnext/Microsoft.ReactNative/Fabric/Composition/AbiCompositionViewComponentView.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ struct AbiCompositionViewComponentView : CompositionBaseComponentView {
4343
std::vector<facebook::react::ComponentDescriptorProvider> supplementalComponentDescriptorProviders() noexcept
4444
override;
4545
facebook::react::Props::Shared props() noexcept override;
46-
facebook::react::Tag hitTest(facebook::react::Point pt, facebook::react::Point &localPt) const noexcept override;
46+
facebook::react::Tag hitTest(facebook::react::Point pt, facebook::react::Point &localPt, bool ignorePointerEvents)
47+
const noexcept override;
4748
winrt::Microsoft::ReactNative::Composition::IVisual Visual() const noexcept override;
4849

4950
private:

vnext/Microsoft.ReactNative/Fabric/Composition/ComponentViewRegistry.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ ComponentViewDescriptor const &ComponentViewRegistry::dequeueComponentViewWithCo
5858
} else if (componentHandle == facebook::react::SwitchShadowNode::Handle()) {
5959
view = SwitchComponentView::Create(compContext, tag, m_context);
6060
} else if (componentHandle == facebook::react::RootShadowNode::Handle()) {
61-
view = RootComponentView::Create(compContext, tag);
61+
view = RootComponentView::Create(compContext, tag, m_context);
6262
} else if (
6363
componentHandle == facebook::react::RawTextShadowNode::Handle() ||
6464
componentHandle == facebook::react::TextShadowNode::Handle()) {

vnext/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,30 @@ HRESULT __stdcall CompositionDynamicAutomationProvider::get_BoundingRectangle(Ui
5959
if (pRetVal == nullptr)
6060
return E_POINTER;
6161

62+
auto hr = UiaGetBoundingRectangleHelper(m_view, *pRetVal);
63+
if (FAILED(hr))
64+
return hr;
65+
66+
// Since get_BoundingRectangle needs to provide real screen coordinates back to the UIA client
67+
// we'll use the FragmentRoot's origin to offset our rect because that should have been taken
68+
// into account already.
69+
winrt::com_ptr<IRawElementProviderFragmentRoot> spFragmentRoot = nullptr;
70+
hr = get_FragmentRoot(spFragmentRoot.put());
71+
if (FAILED(hr))
72+
return hr;
73+
74+
auto spFragment = spFragmentRoot.try_as<IRawElementProviderFragment>();
75+
if (spFragment == nullptr)
76+
return E_FAIL;
77+
78+
UiaRect rect;
79+
hr = spFragment->get_BoundingRectangle(&rect);
80+
if (FAILED(hr))
81+
return hr;
82+
83+
pRetVal->left += rect.left;
84+
pRetVal->top += rect.top;
85+
6286
return S_OK;
6387
}
6488

@@ -89,10 +113,9 @@ HRESULT __stdcall CompositionDynamicAutomationProvider::get_FragmentRoot(IRawEle
89113
return UIA_E_ELEMENTNOTAVAILABLE;
90114

91115
auto uiaProvider = rootCV->EnsureUiaProvider();
92-
if (uiaProvider != nullptr) {
93-
winrt::com_ptr<IRawElementProviderFragmentRoot> spReps;
94-
uiaProvider.as(spReps);
95-
*pRetVal = spReps.detach();
116+
auto spFragmentRoot = uiaProvider.try_as<IRawElementProviderFragmentRoot>();
117+
if (spFragmentRoot) {
118+
*pRetVal = spFragmentRoot.detach();
96119
}
97120

98121
return S_OK;

vnext/Microsoft.ReactNative/Fabric/Composition/CompositionRootAutomationProvider.cpp

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ HRESULT __stdcall CompositionRootAutomationProvider::get_HostRawElementProvider(
5555
if (pRetVal == nullptr)
5656
return E_POINTER;
5757

58+
// TODO: assumes windowed
5859
if (!IsWindow(m_hwnd))
5960
return UIA_E_ELEMENTNOTAVAILABLE;
6061

@@ -67,6 +68,24 @@ HRESULT __stdcall CompositionRootAutomationProvider::get_BoundingRectangle(UiaRe
6768
if (pRetVal == nullptr)
6869
return E_POINTER;
6970

71+
// TODO: Need host site offsets
72+
// Assume we're hosted in some other visual-based hosting site
73+
if (m_hwnd == nullptr || !IsWindow(m_hwnd)) {
74+
return UiaGetBoundingRectangleHelper(m_view, *pRetVal);
75+
}
76+
77+
POINT point{0, 0};
78+
ClientToScreen(m_hwnd, &point);
79+
pRetVal->left = point.x;
80+
pRetVal->top = point.y;
81+
RECT rect;
82+
GetClientRect(m_hwnd, &rect);
83+
point.x = rect.right;
84+
point.y = rect.bottom;
85+
ClientToScreen(m_hwnd, &point);
86+
pRetVal->width = point.x - pRetVal->left;
87+
pRetVal->height = point.y - pRetVal->top;
88+
7089
return S_OK;
7190
}
7291

@@ -97,6 +116,31 @@ HRESULT __stdcall CompositionRootAutomationProvider::ElementProviderFromPoint(
97116

98117
*pRetVal = nullptr;
99118

119+
auto strongView = m_view.view();
120+
121+
if (strongView == nullptr) {
122+
return UIA_E_ELEMENTNOTAVAILABLE;
123+
}
124+
125+
auto spRootView = strongView->rootComponentView();
126+
if (spRootView == nullptr) {
127+
return UIA_E_ELEMENTNOTAVAILABLE;
128+
}
129+
130+
if (m_hwnd == nullptr || !IsWindow(m_hwnd)) {
131+
// TODO: Add support for non-HWND based hosting
132+
return E_FAIL;
133+
}
134+
135+
POINT clientPoint{static_cast<LONG>(x), static_cast<LONG>(y)};
136+
ScreenToClient(m_hwnd, &clientPoint);
137+
138+
auto provider = spRootView->UiaProviderFromPoint(clientPoint);
139+
auto spFragment = provider.try_as<IRawElementProviderFragment>();
140+
if (spFragment) {
141+
*pRetVal = spFragment.detach();
142+
}
143+
100144
return S_OK;
101145
}
102146

@@ -117,9 +161,10 @@ HRESULT __stdcall CompositionRootAutomationProvider::GetFocus(IRawElementProvide
117161

118162
if (focusedComponent) {
119163
auto focusedUiaProvider = focusedComponent->EnsureUiaProvider();
120-
winrt::com_ptr<IRawElementProviderFragment> spFragment;
121-
focusedUiaProvider.as(spFragment);
122-
*pRetVal = spFragment.detach();
164+
auto spFragment = focusedUiaProvider.try_as<IRawElementProviderFragment>();
165+
if (spFragment) {
166+
*pRetVal = spFragment.detach();
167+
}
123168
}
124169

125170
return S_OK;

vnext/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1267,21 +1267,23 @@ void CompositionViewComponentView::updateProps(
12671267
m_props = std::static_pointer_cast<facebook::react::ViewProps const>(props);
12681268
}
12691269

1270-
facebook::react::Tag CompositionViewComponentView::hitTest(facebook::react::Point pt, facebook::react::Point &localPt)
1271-
const noexcept {
1270+
facebook::react::Tag CompositionViewComponentView::hitTest(
1271+
facebook::react::Point pt,
1272+
facebook::react::Point &localPt,
1273+
bool ignorePointerEvents) const noexcept {
12721274
facebook::react::Point ptLocal{pt.x - m_layoutMetrics.frame.origin.x, pt.y - m_layoutMetrics.frame.origin.y};
12731275

12741276
facebook::react::Tag targetTag;
12751277

1276-
if ((m_props->pointerEvents == facebook::react::PointerEventsMode::Auto ||
1278+
if ((ignorePointerEvents || m_props->pointerEvents == facebook::react::PointerEventsMode::Auto ||
12771279
m_props->pointerEvents == facebook::react::PointerEventsMode::BoxNone) &&
12781280
std::any_of(m_children.rbegin(), m_children.rend(), [&targetTag, &ptLocal, &localPt](auto child) {
12791281
targetTag = static_cast<const CompositionBaseComponentView *>(child)->hitTest(ptLocal, localPt);
12801282
return targetTag != -1;
12811283
}))
12821284
return targetTag;
12831285

1284-
if ((m_props->pointerEvents == facebook::react::PointerEventsMode::Auto ||
1286+
if ((ignorePointerEvents || m_props->pointerEvents == facebook::react::PointerEventsMode::Auto ||
12851287
m_props->pointerEvents == facebook::react::PointerEventsMode::BoxOnly) &&
12861288
ptLocal.x >= 0 && ptLocal.x <= m_layoutMetrics.frame.size.width && ptLocal.y >= 0 &&
12871289
ptLocal.y <= m_layoutMetrics.frame.size.height) {

vnext/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,10 @@ struct CompositionViewComponentView : public CompositionBaseComponentView {
114114

115115
facebook::react::Props::Shared props() noexcept override;
116116

117-
facebook::react::Tag hitTest(facebook::react::Point pt, facebook::react::Point &localPt) const noexcept override;
117+
facebook::react::Tag hitTest(
118+
facebook::react::Point pt,
119+
facebook::react::Point &localPt,
120+
bool ignorePointerEvents = false) const noexcept override;
118121
bool ScrollWheel(facebook::react::Point pt, int32_t delta) noexcept override;
119122

120123
winrt::Microsoft::ReactNative::Composition::IVisual Visual() const noexcept override;

vnext/Microsoft.ReactNative/Fabric/Composition/ImageComponentView.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -362,21 +362,23 @@ facebook::react::Props::Shared ImageComponentView::props() noexcept {
362362
return m_props;
363363
}
364364

365-
facebook::react::Tag ImageComponentView::hitTest(facebook::react::Point pt, facebook::react::Point &localPt)
366-
const noexcept {
365+
facebook::react::Tag ImageComponentView::hitTest(
366+
facebook::react::Point pt,
367+
facebook::react::Point &localPt,
368+
bool ignorePointerEvents) const noexcept {
367369
facebook::react::Point ptLocal{pt.x - m_layoutMetrics.frame.origin.x, pt.y - m_layoutMetrics.frame.origin.y};
368370

369371
facebook::react::Tag targetTag;
370372

371-
if ((m_props->pointerEvents == facebook::react::PointerEventsMode::Auto ||
373+
if ((ignorePointerEvents || m_props->pointerEvents == facebook::react::PointerEventsMode::Auto ||
372374
m_props->pointerEvents == facebook::react::PointerEventsMode::BoxNone) &&
373375
std::any_of(m_children.rbegin(), m_children.rend(), [&targetTag, &ptLocal, &localPt](auto child) {
374376
targetTag = static_cast<const CompositionBaseComponentView *>(child)->hitTest(ptLocal, localPt);
375377
return targetTag != -1;
376378
}))
377379
return targetTag;
378380

379-
if ((m_props->pointerEvents == facebook::react::PointerEventsMode::Auto ||
381+
if ((ignorePointerEvents || m_props->pointerEvents == facebook::react::PointerEventsMode::Auto ||
380382
m_props->pointerEvents == facebook::react::PointerEventsMode::BoxOnly) &&
381383
ptLocal.x >= 0 && ptLocal.x <= m_layoutMetrics.frame.size.width && ptLocal.y >= 0 &&
382384
ptLocal.y <= m_layoutMetrics.frame.size.height) {

vnext/Microsoft.ReactNative/Fabric/Composition/ImageComponentView.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ struct ImageComponentView : CompositionBaseComponentView {
4949
facebook::react::Props::Shared props() noexcept override;
5050
void OnRenderingDeviceLost() noexcept override;
5151

52-
facebook::react::Tag hitTest(facebook::react::Point pt, facebook::react::Point &localPt) const noexcept override;
52+
facebook::react::Tag hitTest(facebook::react::Point pt, facebook::react::Point &localPt, bool ignorePointerEvents)
53+
const noexcept override;
5354
winrt::Microsoft::ReactNative::Composition::IVisual Visual() const noexcept override;
5455
bool focusable() const noexcept override;
5556

vnext/Microsoft.ReactNative/Fabric/Composition/ParagraphComponentView.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,10 @@ facebook::react::Props::Shared ParagraphComponentView::props() noexcept {
9999
return m_props;
100100
}
101101

102-
facebook::react::Tag ParagraphComponentView::hitTest(facebook::react::Point pt, facebook::react::Point &localPt)
103-
const noexcept {
102+
facebook::react::Tag ParagraphComponentView::hitTest(
103+
facebook::react::Point pt,
104+
facebook::react::Point &localPt,
105+
bool ignorePointerEvents) const noexcept {
104106
facebook::react::Point ptLocal{pt.x - m_layoutMetrics.frame.origin.x, pt.y - m_layoutMetrics.frame.origin.y};
105107

106108
facebook::react::Tag targetTag;
@@ -115,7 +117,7 @@ facebook::react::Tag ParagraphComponentView::hitTest(facebook::react::Point pt,
115117
return targetTag;
116118
*/
117119

118-
if ((m_props->pointerEvents == facebook::react::PointerEventsMode::Auto ||
120+
if ((ignorePointerEvents || m_props->pointerEvents == facebook::react::PointerEventsMode::Auto ||
119121
m_props->pointerEvents == facebook::react::PointerEventsMode::BoxOnly) &&
120122
ptLocal.x >= 0 && ptLocal.x <= m_layoutMetrics.frame.size.width && ptLocal.y >= 0 &&
121123
ptLocal.y <= m_layoutMetrics.frame.size.height) {

vnext/Microsoft.ReactNative/Fabric/Composition/ParagraphComponentView.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ struct ParagraphComponentView : CompositionBaseComponentView {
3636
void finalizeUpdates(RNComponentViewUpdateMask updateMask) noexcept override;
3737
void prepareForRecycle() noexcept override;
3838
facebook::react::Props::Shared props() noexcept override;
39-
facebook::react::Tag hitTest(facebook::react::Point pt, facebook::react::Point &localPt) const noexcept override;
39+
facebook::react::Tag hitTest(facebook::react::Point pt, facebook::react::Point &localPt, bool ignorePointerEvents)
40+
const noexcept override;
4041
void OnRenderingDeviceLost() noexcept override;
4142
facebook::react::SharedTouchEventEmitter touchEventEmitterAtPoint(facebook::react::Point pt) noexcept override;
4243

vnext/Microsoft.ReactNative/Fabric/Composition/RootComponentView.cpp

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,23 @@
66

77
#include "RootComponentView.h"
88

9+
#include <Fabric/FabricUIManagerModule.h>
910
#include "CompositionRootAutomationProvider.h"
1011
#include "CompositionRootView.h"
1112

1213
namespace Microsoft::ReactNative {
1314

1415
RootComponentView::RootComponentView(
1516
const winrt::Microsoft::ReactNative::Composition::ICompositionContext &compContext,
16-
facebook::react::Tag tag)
17-
: Super(compContext, tag) {}
17+
facebook::react::Tag tag,
18+
winrt::Microsoft::ReactNative::ReactContext const &reactContext)
19+
: Super(compContext, tag), m_context(reactContext) {}
1820

1921
std::shared_ptr<RootComponentView> RootComponentView::Create(
2022
const winrt::Microsoft::ReactNative::Composition::ICompositionContext &compContext,
21-
facebook::react::Tag tag) noexcept {
22-
return std::shared_ptr<RootComponentView>(new RootComponentView(compContext, tag));
23+
facebook::react::Tag tag,
24+
winrt::Microsoft::ReactNative::ReactContext const &reactContext) noexcept {
25+
return std::shared_ptr<RootComponentView>(new RootComponentView(compContext, tag, reactContext));
2326
}
2427

2528
RootComponentView *RootComponentView::rootComponentView() noexcept {
@@ -113,4 +116,23 @@ std::shared_ptr<RootComponentView> RootComponentView::getPtr() {
113116
return std::static_pointer_cast<RootComponentView>(shared_from_this());
114117
}
115118

119+
winrt::IInspectable RootComponentView::UiaProviderFromPoint(const POINT &ptPixels) noexcept {
120+
facebook::react::Point ptDips{
121+
static_cast<facebook::react::Float>(ptPixels.x) / m_layoutMetrics.pointScaleFactor,
122+
static_cast<facebook::react::Float>(ptPixels.y) / m_layoutMetrics.pointScaleFactor};
123+
124+
facebook::react::Point localPt;
125+
auto tag = hitTest(ptDips, localPt, true);
126+
127+
auto uiManager = ::Microsoft::ReactNative::FabricUIManager::FromProperties(m_context.Properties());
128+
if (uiManager == nullptr)
129+
return nullptr;
130+
131+
auto view = uiManager->GetViewRegistry().findComponentViewWithTag(tag);
132+
if (view == nullptr)
133+
return nullptr;
134+
135+
return view->EnsureUiaProvider();
136+
}
137+
116138
} // namespace Microsoft::ReactNative

vnext/Microsoft.ReactNative/Fabric/Composition/RootComponentView.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ struct RootComponentView : CompositionViewComponentView {
1818

1919
[[nodiscard]] static std::shared_ptr<RootComponentView> Create(
2020
const winrt::Microsoft::ReactNative::Composition::ICompositionContext &compContext,
21-
facebook::react::Tag tag) noexcept;
21+
facebook::react::Tag tag,
22+
winrt::Microsoft::ReactNative::ReactContext const &reactContext) noexcept;
2223

2324
std::shared_ptr<RootComponentView> getPtr();
2425

@@ -33,11 +34,15 @@ struct RootComponentView : CompositionViewComponentView {
3334

3435
winrt::IInspectable EnsureUiaProvider() noexcept override;
3536

37+
winrt::IInspectable UiaProviderFromPoint(const POINT &ptPixels) noexcept;
38+
3639
private:
3740
RootComponentView(
3841
const winrt::Microsoft::ReactNative::Composition::ICompositionContext &compContext,
39-
facebook::react::Tag tag);
42+
facebook::react::Tag tag,
43+
winrt::Microsoft::ReactNative::ReactContext const &reactContext);
4044
::Microsoft::ReactNative::IComponentView *m_focusedComponent = nullptr;
45+
winrt::Microsoft::ReactNative::ReactContext m_context;
4146
};
4247

4348
} // namespace Microsoft::ReactNative

vnext/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -335,24 +335,26 @@ void ScrollViewComponentView::ensureVisual() noexcept {
335335
}
336336
}
337337

338-
facebook::react::Tag ScrollViewComponentView::hitTest(facebook::react::Point pt, facebook::react::Point &localPt)
339-
const noexcept {
338+
facebook::react::Tag ScrollViewComponentView::hitTest(
339+
facebook::react::Point pt,
340+
facebook::react::Point &localPt,
341+
bool ignorePointerEvents) const noexcept {
340342
facebook::react::Point ptViewport{pt.x - m_layoutMetrics.frame.origin.x, pt.y - m_layoutMetrics.frame.origin.y};
341343

342344
facebook::react::Point ptContent{
343345
ptViewport.x + m_scrollVisual.ScrollPosition().x / m_layoutMetrics.pointScaleFactor,
344346
ptViewport.y + m_scrollVisual.ScrollPosition().y / m_layoutMetrics.pointScaleFactor};
345347

346348
facebook::react::Tag targetTag;
347-
if ((m_props->pointerEvents == facebook::react::PointerEventsMode::Auto ||
349+
if ((ignorePointerEvents || m_props->pointerEvents == facebook::react::PointerEventsMode::Auto ||
348350
m_props->pointerEvents == facebook::react::PointerEventsMode::BoxNone) &&
349351
std::any_of(m_children.rbegin(), m_children.rend(), [&targetTag, &ptContent, &localPt](auto child) {
350352
targetTag = static_cast<const CompositionBaseComponentView *>(child)->hitTest(ptContent, localPt);
351353
return targetTag != -1;
352354
}))
353355
return targetTag;
354356

355-
if ((m_props->pointerEvents == facebook::react::PointerEventsMode::Auto ||
357+
if ((ignorePointerEvents || m_props->pointerEvents == facebook::react::PointerEventsMode::Auto ||
356358
m_props->pointerEvents == facebook::react::PointerEventsMode::BoxOnly) &&
357359
ptViewport.x >= 0 && ptViewport.x <= m_layoutMetrics.frame.size.width && ptViewport.y >= 0 &&
358360
ptViewport.y <= m_layoutMetrics.frame.size.height) {

0 commit comments

Comments
 (0)