Skip to content

Commit 9aef2ba

Browse files
sammy-SCmeta-codesync[bot]
authored andcommitted
Fix Fantom getRenderedOutput not reflecting removed props
Summary: `RenderOutput::renderView` merged old cached props with new debug props via `mergeDynamicProps`. Since `getDebugProps()` omits default-valued props, removed props were never cleared from the cache. Also, `renderedViews_.insert()` never overwrote existing entries. Fix by reading debug props directly and using `insert_or_assign`. Changelog: [Internal] Differential Revision: D95055704
1 parent f81f73e commit 9aef2ba

File tree

2 files changed

+24
-11
lines changed

2 files changed

+24
-11
lines changed

packages/react-native/Libraries/Components/View/__tests__/View-itest.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -670,6 +670,28 @@ describe('<View>', () => {
670670
);
671671
});
672672
});
673+
674+
describe('nativeID', () => {
675+
it('resets nativeID when removed', () => {
676+
const root = Fantom.createRoot();
677+
678+
Fantom.runTask(() => {
679+
root.render(<View nativeID="my-id" collapsable={false} />);
680+
});
681+
682+
expect(root.getRenderedOutput({props: ['nativeID']}).toJSX()).toEqual(
683+
<rn-view nativeID="my-id" />,
684+
);
685+
686+
Fantom.runTask(() => {
687+
root.render(<View collapsable={false} />);
688+
});
689+
690+
expect(root.getRenderedOutput({props: ['nativeID']}).toJSX()).toEqual(
691+
<rn-view />,
692+
);
693+
});
694+
});
673695
});
674696

675697
describe('ref', () => {

private/react-native-fantom/tester/src/render/RenderOutput.cpp

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
#include <react/debug/react_native_assert.h>
1010
#include <react/renderer/components/text/ParagraphState.h>
1111
#include <react/renderer/core/ConcreteState.h>
12-
#include <react/renderer/core/DynamicPropsUtilities.h>
1312

1413
namespace facebook::react {
1514

@@ -61,15 +60,7 @@ folly::dynamic RenderOutput::renderView(
6160
element["type"] = view.componentName;
6261

6362
#if RN_DEBUG_STRING_CONVERTIBLE
64-
folly::dynamic props = nullptr;
65-
if (auto it = renderedViews_.find(view.tag); it != renderedViews_.end()) {
66-
props = mergeDynamicProps(
67-
it->second["props"],
68-
renderProps(view.props->getDebugProps()),
69-
NullValueStrategy::Override);
70-
} else {
71-
props = renderProps(view.props->getDebugProps());
72-
}
63+
folly::dynamic props = renderProps(view.props->getDebugProps());
7364
#else
7465
folly::dynamic props = folly::dynamic::object;
7566
#endif
@@ -96,7 +87,7 @@ folly::dynamic RenderOutput::renderView(
9687
#endif
9788
element["props"] = props;
9889

99-
renderedViews_.insert({view.tag, element});
90+
renderedViews_.insert_or_assign(view.tag, element);
10091

10192
return element;
10293
}

0 commit comments

Comments
 (0)