Files
react-native/ReactCommon/react/renderer/mounting/ShadowViewMutation.h
T
Joshua Gross bdea479a1f Fix Android crash: mark re-created nodes in Differ
Summary:
Android has some optimizations around view allocation and pre-allocation that, in the case of View Unflattening, can cause "Create" mutations to be skipped.

To make sure that doesn't happen, we add a flag to ShadowViewMutation (in the core) that any platform can consume, that indicates if the mutation is a "recreation" mutation.

It is still a bit unclear why this is needed, in the sense that I would expect props revision to increment if a view is unflattened. However, there is at least one documented reproduction where that is *not* the case. So for now, we'll have a hack pending further investigation.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D25935785

fbshipit-source-id: 6fb4f0a6dedba0fe46ba3cd558ac1daa70f671f5
2021-01-16 11:05:54 -08:00

90 lines
2.2 KiB
C++

/*
* 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 <vector>
#include <react/renderer/mounting/ShadowView.h>
namespace facebook {
namespace react {
/*
* Describes a single native view tree mutation which may contain
* pointers to an old shadow view, a new shadow view, a parent shadow view and
* final index of inserted or updated view.
* Use static methods to instantiate mutations of different types.
*/
struct ShadowViewMutation final {
using List = std::vector<ShadowViewMutation>;
#pragma mark - Designated Initializers
/*
* Creates and returns an `Create` mutation.
*/
static ShadowViewMutation CreateMutation(
ShadowView shadowView,
bool recreated = false);
/*
* Creates and returns an `Delete` mutation.
*/
static ShadowViewMutation DeleteMutation(ShadowView shadowView);
/*
* Creates and returns an `Insert` mutation.
*/
static ShadowViewMutation InsertMutation(
ShadowView parentShadowView,
ShadowView childShadowView,
int index);
/*
* Creates and returns a `Remove` mutation.
*/
static ShadowViewMutation RemoveMutation(
ShadowView parentShadowView,
ShadowView childShadowView,
int index);
/*
* Creates and returns an `Update` mutation.
*/
static ShadowViewMutation UpdateMutation(
ShadowView oldChildShadowView,
ShadowView newChildShadowView);
#pragma mark - Type
enum Type { Create = 1, Delete = 2, Insert = 4, Remove = 8, Update = 16 };
#pragma mark - Fields
Type type = {Create};
ShadowView parentShadowView = {};
ShadowView oldChildShadowView = {};
ShadowView newChildShadowView = {};
int index = -1;
bool recreated; // for Create mutations, for platform-specific optimizations
};
using ShadowViewMutationList = std::vector<ShadowViewMutation>;
#if RN_DEBUG_STRING_CONVERTIBLE
std::string getDebugName(ShadowViewMutation const &object);
std::vector<DebugStringConvertibleObject> getDebugProps(
ShadowViewMutation const &object,
DebugStringConvertibleOptions options);
#endif
} // namespace react
} // namespace facebook