From 4fd2285f83ffce04e51cb866a45459aba802da1c Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Tue, 25 Aug 2026 02:31:25 -0700 Subject: [PATCH 1/2] Cover `react/renderer/scheduler` with Stable API guards Summary: Classifies `react/renderer/scheduler:scheduler` as a "for frameworks" target under the three-tier C++ stable API visibility model. Consumers that opt into `RN_STRICT_API` now get a warning if they include its headers directly, which they can acknowledge with `RN_ALLOW_FRAMEWORKS`; without that flag the guards are inert, so no existing build changes behaviour. Changelog: [Internal] Differential Revision: D116909091 --- .../ReactCommon/react/renderer/scheduler/CMakeLists.txt | 1 + .../ReactCommon/react/renderer/scheduler/InspectorData.h | 2 ++ .../ReactCommon/react/renderer/scheduler/Scheduler.h | 2 ++ .../ReactCommon/react/renderer/scheduler/SchedulerDelegate.h | 2 ++ .../ReactCommon/react/renderer/scheduler/SchedulerToolbox.h | 2 ++ .../ReactCommon/react/renderer/scheduler/SurfaceHandler.h | 2 ++ .../ReactCommon/react/renderer/scheduler/SurfaceManager.h | 2 ++ 7 files changed, 13 insertions(+) diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/CMakeLists.txt b/packages/react-native/ReactCommon/react/renderer/scheduler/CMakeLists.txt index e979712b3c43..be59e2415606 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/CMakeLists.txt +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/CMakeLists.txt @@ -17,6 +17,7 @@ target_link_libraries(react_renderer_scheduler folly_runtime glog jsi + react_cxxstableapi react_debug react_featureflags react_performance_cdpmetrics diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/InspectorData.h b/packages/react-native/ReactCommon/react/renderer/scheduler/InspectorData.h index d420c0329ebb..c008d9ef62a2 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/InspectorData.h +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/InspectorData.h @@ -7,6 +7,8 @@ #pragma once +#include + #include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h index bc0b7b17d802..bdac7c974223 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/SchedulerDelegate.h b/packages/react-native/ReactCommon/react/renderer/scheduler/SchedulerDelegate.h index 06d9773e4ba5..10f45018d94a 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/SchedulerDelegate.h +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/SchedulerDelegate.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/SchedulerToolbox.h b/packages/react-native/ReactCommon/react/renderer/scheduler/SchedulerToolbox.h index d38e85303ede..7d78c1ed5240 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/SchedulerToolbox.h +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/SchedulerToolbox.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/SurfaceHandler.h b/packages/react-native/ReactCommon/react/renderer/scheduler/SurfaceHandler.h index 93cfb22fef84..40a1ee28f79c 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/SurfaceHandler.h +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/SurfaceHandler.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/SurfaceManager.h b/packages/react-native/ReactCommon/react/renderer/scheduler/SurfaceManager.h index 75ef5692b2a1..ed76f11d4c11 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/SurfaceManager.h +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/SurfaceManager.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include #include From f3580b6b9bf4496de1db0ef8a8500f842ee9586b Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Tue, 25 Aug 2026 02:31:25 -0700 Subject: [PATCH 2/2] Forward declare CDP reporters and ViewTransitionModule in Scheduler.h Summary: Under the C++ Stable API RFC, `react/renderer/scheduler:scheduler` is a "for frameworks" module while `react/performance/cdpmetrics:cdpmetrics` and `react/renderer/viewtransition:viewtransition` are private. `Scheduler.h` is an exported header of the scheduler target and included all three private headers, so it transitively exposed them to consumers. `ViewTransitionModule.h` already carries the private-tier guard, so this was an active violation and not just a latent one. `Scheduler.h` only needs these types for data members. `viewTransitionModule_` was already a `std::shared_ptr`, so a forward declaration is sufficient. The two CDP reporters were held as `std::optional`, which requires a complete type, so they become `std::unique_ptr`. They are constructed conditionally behind feature flags and only ever handed to `PerformanceEntryReporter` as raw pointers, so ownership and lifetime are unchanged. `~Scheduler()` is already out of line, so the incomplete types are fine. `` and `` are now included explicitly, since they were previously pulled in transitively through the cdpmetrics headers. `Scheduler.h` is the only header in ReactCommon that reached either module, so both are now cleanly private. No build config change is needed: `cdpmetrics` and `viewtransition` are already non-exported deps of the scheduler target. Changelog: [Internal] Differential Revision: D116909092 --- .../react/renderer/scheduler/Scheduler.cpp | 18 ++++++++++++------ .../react/renderer/scheduler/Scheduler.h | 13 ++++++++----- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp index b5fa421a35ae..5d21a961dae3 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp @@ -13,6 +13,8 @@ #include #include #include +#include +#include #include #include #include @@ -23,6 +25,7 @@ #include #include #include +#include #include namespace facebook::react { @@ -44,13 +47,15 @@ Scheduler::Scheduler( if (ReactNativeFeatureFlags::enableBridgelessArchitecture() && ReactNativeFeatureFlags::cdpInteractionMetricsEnabled()) { - cdpMetricsReporter_.emplace(CdpMetricsReporter{runtimeExecutor_}); - performanceEntryReporter_->addEventListener(&*cdpMetricsReporter_); + cdpMetricsReporter_ = + std::make_unique(runtimeExecutor_); + performanceEntryReporter_->addEventListener(cdpMetricsReporter_.get()); } if (ReactNativeFeatureFlags::perfIssuesEnabled()) { - cdpPerfIssuesReporter_.emplace(CdpPerfIssuesReporter{runtimeExecutor_}); - performanceEntryReporter_->addEventListener(&*cdpPerfIssuesReporter_); + cdpPerfIssuesReporter_ = + std::make_unique(runtimeExecutor_); + performanceEntryReporter_->addEventListener(cdpPerfIssuesReporter_.get()); } eventPerformanceLogger_ = @@ -216,10 +221,11 @@ Scheduler::~Scheduler() { uiManager_->setViewTransitionDelegate(nullptr); if (cdpMetricsReporter_) { - performanceEntryReporter_->removeEventListener(&*cdpMetricsReporter_); + performanceEntryReporter_->removeEventListener(cdpMetricsReporter_.get()); } if (cdpPerfIssuesReporter_) { - performanceEntryReporter_->removeEventListener(&*cdpPerfIssuesReporter_); + performanceEntryReporter_->removeEventListener( + cdpPerfIssuesReporter_.get()); } // Then, let's verify that the requirement was satisfied. diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h index bdac7c974223..db58597aa1a9 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h @@ -11,11 +11,11 @@ #include #include +#include +#include #include #include -#include -#include #include #include #include @@ -31,11 +31,14 @@ #include #include #include -#include #include namespace facebook::react { +class CdpMetricsReporter; +class CdpPerfIssuesReporter; +class ViewTransitionModule; + /* * Scheduler coordinates Shadow Tree updates and event flows. */ @@ -147,8 +150,8 @@ class Scheduler final : public UIManagerDelegate { std::shared_ptr> eventDispatcher_; std::shared_ptr performanceEntryReporter_; - std::optional cdpMetricsReporter_; - std::optional cdpPerfIssuesReporter_; + std::unique_ptr cdpMetricsReporter_; + std::unique_ptr cdpPerfIssuesReporter_; std::shared_ptr eventPerformanceLogger_; /**