/* * 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 namespace facebook::react { using NativeMutationObserverObserveOptions = NativeMutationObserverNativeMutationObserverObserveOptions< // mutationObserverId MutationObserverId, // targetShadowNode jsi::Object, // subtree bool>; template <> struct Bridging : NativeMutationObserverNativeMutationObserverObserveOptionsBridging< NativeMutationObserverObserveOptions> {}; using NativeMutationRecord = NativeMutationObserverNativeMutationRecord< // mutationObserverId MutationObserverId, // target jsi::Value, // addedNodes std::vector, // removedNodes std::vector>; template <> struct Bridging : NativeMutationObserverNativeMutationRecordBridging { }; class NativeMutationObserver : public NativeMutationObserverCxxSpec { 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, jsi::Function notifyMutationObservers, SyncCallback getPublicInstanceFromInstanceHandle); void disconnect(jsi::Runtime& runtime); std::vector takeRecords(jsi::Runtime& runtime); private: MutationObserverManager mutationObserverManager_{}; std::vector pendingRecords_; // We need to keep a reference to the JS runtime so we can schedule the // notifications as microtasks when mutations occur. This is safe because // mutations will only happen when executing JavaScript and because this // native module will never survive the runtime. jsi::Runtime* runtime_{}; bool notifiedMutationObservers_{}; std::optional notifyMutationObservers_; std::optional> getPublicInstanceFromInstanceHandle_; void onMutations(std::vector& records); void notifyMutationObserversIfNecessary(); jsi::Value getPublicInstanceFromShadowNode( const ShadowNode& shadowNode) const; std::vector getPublicInstancesFromShadowNodes( const std::vector& shadowNodes) const; }; } // namespace facebook::react