/* * 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. */ #pragma once #include #include #include #include #include #include namespace facebook::react { using NativeMutationObserverObserveOptions = NativeMutationObserverCxxBaseNativeMutationObserverObserveOptions< // mutationObserverId MutationObserverId, // targetShadowNode jsi::Object, // subtree bool>; template <> struct Bridging : NativeMutationObserverCxxBaseNativeMutationObserverObserveOptionsBridging< // mutationObserverId MutationObserverId, // targetShadowNode jsi::Object, // subtree bool> {}; using NativeMutationRecord = NativeMutationObserverCxxBaseNativeMutationRecord< // mutationObserverId MutationObserverId, // target jsi::Value, // addedNodes std::vector, // removedNodes std::vector>; template <> struct Bridging : NativeMutationObserverCxxBaseNativeMutationRecordBridging< // mutationObserverId MutationObserverId, // target jsi::Value, // addedNodes std::vector, // removedNodes std::vector> {}; class NativeMutationObserver : public NativeMutationObserverCxxSpec, std::enable_shared_from_this { public: NativeMutationObserver(std::shared_ptr jsInvoker); void observe( jsi::Runtime& runtime, NativeMutationObserverObserveOptions options); void unobserve( jsi::Runtime& runtime, MutationObserverId mutationObserverId, jsi::Object targetShadowNode); void connect( jsi::Runtime& runtime, AsyncCallback<> notifyMutationObservers, jsi::Function getPublicInstanceFromInstanceHandle); void disconnect(jsi::Runtime& runtime); std::vector takeRecords(jsi::Runtime& runtime); private: MutationObserverManager mutationObserverManager_{}; std::vector pendingRecords_; // This is passed to `connect` so we can retain references to public instances // when mutation occur, before React cleans up unmounted instances. jsi::Value getPublicInstanceFromInstanceHandle_ = jsi::Value::undefined(); std::function getPublicInstanceFromShadowNode_; bool notifiedMutationObservers_{}; std::function notifyMutationObservers_; void onMutations(std::vector& records); void notifyMutationObserversIfNecessary(); std::vector getPublicInstancesFromShadowNodes( const std::vector& shadowNodes) const; }; } // namespace facebook::react