@apollohg/react-native-rich-text-editor 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +160 -0
- package/README.md +259 -0
- package/RUST-STANDARD-LIBRARY-NOTICES.html +8266 -0
- package/ReactNativeProseEditor.podspec +59 -0
- package/THIRD_PARTY_NOTICES.md +31155 -0
- package/android/build.gradle +188 -0
- package/android/consumer-rules.pro +18 -0
- package/android/expo/build.gradle +17 -0
- package/android/src/debug/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +7 -0
- package/android/src/main/assets/editor-icons/MaterialIcons.json +2236 -0
- package/android/src/main/assets/editor-icons/MaterialIcons.ttf +0 -0
- package/android/src/main/java/com/apollohg/editor/AndroidApiCompat.kt +19 -0
- package/android/src/main/java/com/apollohg/editor/AndroidCollaborationTransport.kt +860 -0
- package/android/src/main/java/com/apollohg/editor/CaretGeometry.kt +91 -0
- package/android/src/main/java/com/apollohg/editor/CodeHighlighting.kt +141 -0
- package/android/src/main/java/com/apollohg/editor/DecodedBitmapBudget.kt +250 -0
- package/android/src/main/java/com/apollohg/editor/EditorAddons.kt +133 -0
- package/android/src/main/java/com/apollohg/editor/EditorBlockSpacing.kt +51 -0
- package/android/src/main/java/com/apollohg/editor/EditorBoxDrawable.kt +16 -0
- package/android/src/main/java/com/apollohg/editor/EditorBoxDrawing.kt +234 -0
- package/android/src/main/java/com/apollohg/editor/EditorCheckboxSpan.kt +87 -0
- package/android/src/main/java/com/apollohg/editor/EditorCodeHighlighting.kt +120 -0
- package/android/src/main/java/com/apollohg/editor/EditorDecorationLayer.java +18 -0
- package/android/src/main/java/com/apollohg/editor/EditorDocumentLayout.kt +626 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditText.kt +1042 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextAnnotations.kt +191 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextCaret.kt +100 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextClipboard.kt +101 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextComposition.kt +220 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextConfiguration.kt +316 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextCorrection.kt +303 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDeferredUpdates.kt +327 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDeletion.kt +258 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDiagnostics.kt +83 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDragDrop.kt +67 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextExternalComposition.kt +357 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextHardwareInput.kt +277 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextImages.kt +280 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextInputLifecycle.kt +183 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextInputPreparation.kt +79 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextInputTraits.kt +384 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextLayout.kt +100 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextNativeMutation.kt +243 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextPlaceholder.kt +154 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextRenderPatch.kt +347 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextRendering.kt +313 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextRustCommands.kt +281 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextSelection.kt +352 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextState.kt +113 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextTaskMarkers.kt +92 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextTextCommit.kt +327 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextToolbar.kt +84 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextUpdates.kt +245 -0
- package/android/src/main/java/com/apollohg/editor/EditorGlyphHeightCursorDrawable.kt +42 -0
- package/android/src/main/java/com/apollohg/editor/EditorHeightBehavior.kt +13 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputConnection.kt +923 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputCoordinates.kt +191 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputCorrection.kt +107 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputCursorGeometry.kt +128 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputSnapshots.kt +134 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputSurroundingDeletion.kt +321 -0
- package/android/src/main/java/com/apollohg/editor/EditorKeyboardToolbarView.kt +851 -0
- package/android/src/main/java/com/apollohg/editor/EditorMentionStyle.kt +192 -0
- package/android/src/main/java/com/apollohg/editor/EditorReconciliationWatcher.kt +46 -0
- package/android/src/main/java/com/apollohg/editor/EditorStyleSheet.kt +303 -0
- package/android/src/main/java/com/apollohg/editor/EditorStyleSheetSpans.kt +253 -0
- package/android/src/main/java/com/apollohg/editor/EditorSurfaceInputConnection.kt +67 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextDecorationDrawing.kt +143 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextSurface.kt +712 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceDragDrop.kt +94 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceInteraction.kt +708 -0
- package/android/src/main/java/com/apollohg/editor/EditorTheme.kt +650 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Adapter.kt +912 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2AdapterMutations.kt +402 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2AdapterRendering.kt +123 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2AdapterSelection.kt +203 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Backend.kt +120 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Driver.kt +87 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Registry.kt +97 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2RenderValidation.kt +409 -0
- package/android/src/main/java/com/apollohg/editor/ExpoAutoGrowStyleSizePublisher.kt +34 -0
- package/android/src/main/java/com/apollohg/editor/ImageResizeOverlayView.kt +266 -0
- package/android/src/main/java/com/apollohg/editor/ImeTextCoordinateMapper.kt +102 -0
- package/android/src/main/java/com/apollohg/editor/KeyboardToolbarImeAnimationController.kt +101 -0
- package/android/src/main/java/com/apollohg/editor/MentionSuggestionChipView.kt +234 -0
- package/android/src/main/java/com/apollohg/editor/NativeCollaborationTransportRegistry.kt +493 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoView.kt +813 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewAtoms.kt +68 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewBinding.kt +126 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewDiagnostics.kt +208 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewErrors.kt +146 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewEvents.kt +150 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewExternalComposition.kt +39 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewFocus.kt +176 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewLifecycle.kt +302 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewMentions.kt +259 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewNativeActions.kt +179 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewOutsideTap.kt +214 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPendingUpdates.kt +376 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewProperties.kt +234 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPropertyRetries.kt +197 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewToolbar.kt +285 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewTypes.kt +28 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewUpdates.kt +271 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorModule.kt +687 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorOutsideTapDispatcher.kt +380 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorV2Numbers.kt +45 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorViewRegistry.kt +372 -0
- package/android/src/main/java/com/apollohg/editor/NativeImagePipeline.kt +22 -0
- package/android/src/main/java/com/apollohg/editor/NativeToolbar.kt +193 -0
- package/android/src/main/java/com/apollohg/editor/NativeToolbarIcons.kt +177 -0
- package/android/src/main/java/com/apollohg/editor/NativeToolbarItem.kt +274 -0
- package/android/src/main/java/com/apollohg/editor/OkHttpCollaborationSocket.kt +102 -0
- package/android/src/main/java/com/apollohg/editor/OrderedListMarkerFormatter.kt +130 -0
- package/android/src/main/java/com/apollohg/editor/PointerTransparentView.java +18 -0
- package/android/src/main/java/com/apollohg/editor/PositionBridge.kt +128 -0
- package/android/src/main/java/com/apollohg/editor/ProseViewerView.kt +854 -0
- package/android/src/main/java/com/apollohg/editor/RemoteSelectionOverlayView.kt +314 -0
- package/android/src/main/java/com/apollohg/editor/RenderBlockSpans.kt +314 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridge.kt +224 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeBlockStyles.kt +407 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeElements.kt +544 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeInlineAndAtoms.kt +631 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeParagraphs.kt +215 -0
- package/android/src/main/java/com/apollohg/editor/RenderImageDecoder.kt +748 -0
- package/android/src/main/java/com/apollohg/editor/RenderImageLoader.kt +900 -0
- package/android/src/main/java/com/apollohg/editor/RenderLayoutConstants.kt +117 -0
- package/android/src/main/java/com/apollohg/editor/RenderMediaSpans.kt +337 -0
- package/android/src/main/java/com/apollohg/editor/RenderParagraphSpans.kt +182 -0
- package/android/src/main/java/com/apollohg/editor/RichTextEditorView.kt +951 -0
- package/android/src/main/java/com/apollohg/editor/SharedNativeImagePipeline.kt +78 -0
- package/android/src/main/java/com/apollohg/editor/UniffiEditorV2Backend.kt +261 -0
- package/android/src/main/java/com/apollohg/editor/viewer/AndroidProseLayoutEngine.kt +1656 -0
- package/android/src/main/java/com/apollohg/editor/viewer/FabricAttachmentSidecars.kt +80 -0
- package/android/src/main/java/com/apollohg/editor/viewer/FabricLeaseHandleBridge.kt +59 -0
- package/android/src/main/java/com/apollohg/editor/viewer/FallbackSelectionGeometry.kt +450 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseDrawingView.kt +678 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseInstrumentation.kt +608 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayout.kt +186 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutCache.kt +393 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutRegistry.kt +828 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseTheme.kt +316 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerManager.kt +900 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerPackage.kt +16 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedViewerAtoms.kt +89 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerCodeHighlighting.kt +91 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerDocument.kt +453 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerFontEnvironment.kt +282 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerImagePipeline.kt +460 -0
- package/android/src/main/jni/CMakeLists.txt +85 -0
- package/android/src/main/jni/PreparedProseViewerMeasurementsManager.cpp +334 -0
- package/android/src/main/jni/ReactNativeProseEditorSpec.h +17 -0
- package/android/src/main/jni/reactnativeproseeditor.h +6 -0
- package/android/src/main/res/values/attrs.xml +6 -0
- package/android/src/release/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +9 -0
- package/app.plugin.js +62 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseMeasurementsManager.h +62 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerComponentDescriptor.h +30 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.cpp +192 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.h +46 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerState.h +145 -0
- package/dist/AtomHost.d.ts +17 -0
- package/dist/AtomHost.js +135 -0
- package/dist/DefaultAtomChip.d.ts +2 -0
- package/dist/DefaultAtomChip.js +22 -0
- package/dist/EditorAddon.d.ts +32 -0
- package/dist/EditorAddon.js +29 -0
- package/dist/EditorAddonNormalization.d.ts +6 -0
- package/dist/EditorAddonNormalization.js +48 -0
- package/dist/EditorMentionThemeNormalization.d.ts +8 -0
- package/dist/EditorMentionThemeNormalization.js +22 -0
- package/dist/EditorMentionThemeValidation.d.ts +12 -0
- package/dist/EditorMentionThemeValidation.js +95 -0
- package/dist/EditorStyleSheet.d.ts +4 -0
- package/dist/EditorStyleSheet.js +10 -0
- package/dist/EditorStyleSheetNormalization.d.ts +3 -0
- package/dist/EditorStyleSheetNormalization.js +226 -0
- package/dist/EditorStyleSheetTypes.d.ts +151 -0
- package/dist/EditorStyleSheetTypes.js +2 -0
- package/dist/EditorTheme.d.ts +117 -0
- package/dist/EditorTheme.js +41 -0
- package/dist/EditorToolbar.d.ts +4 -0
- package/dist/EditorToolbar.js +17 -0
- package/dist/EditorToolbarComponent.d.ts +13 -0
- package/dist/EditorToolbarComponent.js +24 -0
- package/dist/EditorToolbarItems.d.ts +9 -0
- package/dist/EditorToolbarItems.js +58 -0
- package/dist/EditorToolbarRegistry.d.ts +59 -0
- package/dist/EditorToolbarRegistry.js +175 -0
- package/dist/EditorToolbarTypes.d.ts +273 -0
- package/dist/EditorToolbarTypes.js +2 -0
- package/dist/EditorToolbarVisuals.d.ts +154 -0
- package/dist/EditorToolbarVisuals.js +228 -0
- package/dist/EditorUpdateRevision.d.ts +8 -0
- package/dist/EditorUpdateRevision.js +22 -0
- package/dist/ExternalTextComposition.d.ts +45 -0
- package/dist/ExternalTextComposition.js +537 -0
- package/dist/ImageLoadingPolicy.d.ts +54 -0
- package/dist/ImageLoadingPolicy.js +60 -0
- package/dist/NativeEditorBoundaryError.d.ts +111 -0
- package/dist/NativeEditorBoundaryError.js +268 -0
- package/dist/NativeEditorBridge.d.ts +9 -0
- package/dist/NativeEditorBridge.js +37 -0
- package/dist/NativeEditorCollaborationTransport.d.ts +154 -0
- package/dist/NativeEditorCollaborationTransport.js +275 -0
- package/dist/NativeEditorCreateConfig.d.ts +16 -0
- package/dist/NativeEditorCreateConfig.js +249 -0
- package/dist/NativeEditorCreateJson.d.ts +76 -0
- package/dist/NativeEditorCreateJson.js +474 -0
- package/dist/NativeEditorCreateValidation.d.ts +32 -0
- package/dist/NativeEditorCreateValidation.js +150 -0
- package/dist/NativeEditorDocumentBridge.d.ts +72 -0
- package/dist/NativeEditorDocumentBridge.js +305 -0
- package/dist/NativeEditorDocumentHandle.d.ts +70 -0
- package/dist/NativeEditorDocumentHandle.js +89 -0
- package/dist/NativeEditorLocalAwareness.d.ts +34 -0
- package/dist/NativeEditorLocalAwareness.js +153 -0
- package/dist/NativeEditorNativeModule.d.ts +48 -0
- package/dist/NativeEditorNativeModule.js +34 -0
- package/dist/NativeEditorRenderNormalization.d.ts +22 -0
- package/dist/NativeEditorRenderNormalization.js +274 -0
- package/dist/NativeEditorResultNormalization.d.ts +108 -0
- package/dist/NativeEditorResultNormalization.js +400 -0
- package/dist/NativeEditorTypes.d.ts +318 -0
- package/dist/NativeEditorTypes.js +15 -0
- package/dist/NativeEditorV2Decimal.d.ts +5 -0
- package/dist/NativeEditorV2Decimal.js +18 -0
- package/dist/NativeProseViewer.d.ts +122 -0
- package/dist/NativeProseViewer.js +130 -0
- package/dist/NativeRichTextEditor.d.ts +3 -0
- package/dist/NativeRichTextEditor.js +6 -0
- package/dist/ResourceLimits.d.ts +100 -0
- package/dist/ResourceLimits.js +80 -0
- package/dist/RichTextEditor.d.ts +4 -0
- package/dist/RichTextEditor.js +25 -0
- package/dist/RichTextEditorNativeTypes.d.ts +122 -0
- package/dist/RichTextEditorNativeTypes.js +2 -0
- package/dist/RichTextEditorNativeView.d.ts +12 -0
- package/dist/RichTextEditorNativeView.js +15 -0
- package/dist/RichTextEditorSerialization.d.ts +53 -0
- package/dist/RichTextEditorSerialization.js +283 -0
- package/dist/RichTextEditorTypes.d.ts +281 -0
- package/dist/RichTextEditorTypes.js +2 -0
- package/dist/ViewerConfiguration.d.ts +22 -0
- package/dist/ViewerConfiguration.js +6 -0
- package/dist/YjsCollaboration.d.ts +146 -0
- package/dist/YjsCollaboration.js +496 -0
- package/dist/addons.d.ts +193 -0
- package/dist/addons.js +122 -0
- package/dist/atomConstants.d.ts +3 -0
- package/dist/atomConstants.js +6 -0
- package/dist/atomInstances.d.ts +35 -0
- package/dist/atomInstances.js +79 -0
- package/dist/atomPolicy.d.ts +4 -0
- package/dist/atomPolicy.js +47 -0
- package/dist/atomUpdates.d.ts +2 -0
- package/dist/atomUpdates.js +38 -0
- package/dist/atoms.d.ts +92 -0
- package/dist/atoms.js +222 -0
- package/dist/attributeValidation.d.ts +4 -0
- package/dist/attributeValidation.js +97 -0
- package/dist/contentExpression.d.ts +6 -0
- package/dist/contentExpression.js +335 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +78 -0
- package/dist/listMarkers.d.ts +15 -0
- package/dist/listMarkers.js +21 -0
- package/dist/schemaDefinition.d.ts +143 -0
- package/dist/schemaDefinition.js +206 -0
- package/dist/schemaDocument.d.ts +17 -0
- package/dist/schemaDocument.js +69 -0
- package/dist/schemaDocumentConstruction.d.ts +5 -0
- package/dist/schemaDocumentConstruction.js +125 -0
- package/dist/schemaNormalization.d.ts +29 -0
- package/dist/schemaNormalization.js +313 -0
- package/dist/schemaPresets.d.ts +68 -0
- package/dist/schemaPresets.js +198 -0
- package/dist/schemaResolution.d.ts +9 -0
- package/dist/schemaResolution.js +211 -0
- package/dist/schemas.d.ts +5 -0
- package/dist/schemas.js +28 -0
- package/dist/specs/PreparedProseViewerNativeComponent.d.ts +37 -0
- package/dist/specs/PreparedProseViewerNativeComponent.js +6 -0
- package/dist/useEditorToolbarInteractions.d.ts +12 -0
- package/dist/useEditorToolbarInteractions.js +218 -0
- package/dist/useEditorToolbarItems.d.ts +8 -0
- package/dist/useEditorToolbarItems.js +280 -0
- package/dist/useEditorToolbarPresentation.d.ts +4 -0
- package/dist/useEditorToolbarPresentation.js +203 -0
- package/dist/useEditorToolbarState.d.ts +63 -0
- package/dist/useEditorToolbarState.js +108 -0
- package/dist/useFocusPreservingFrames.d.ts +17 -0
- package/dist/useFocusPreservingFrames.js +108 -0
- package/dist/useNativeEditor.d.ts +66 -0
- package/dist/useNativeEditor.js +370 -0
- package/dist/useRichTextEditorCommands.d.ts +21 -0
- package/dist/useRichTextEditorCommands.js +299 -0
- package/dist/useRichTextEditorEvents.d.ts +18 -0
- package/dist/useRichTextEditorEvents.js +216 -0
- package/dist/useRichTextEditorMentions.d.ts +11 -0
- package/dist/useRichTextEditorMentions.js +316 -0
- package/dist/useRichTextEditorPresentation.d.ts +5 -0
- package/dist/useRichTextEditorPresentation.js +178 -0
- package/dist/useRichTextEditorState.d.ts +180 -0
- package/dist/useRichTextEditorState.js +405 -0
- package/dist/useRichTextEditorUpdates.d.ts +10 -0
- package/dist/useRichTextEditorUpdates.js +308 -0
- package/dist/useViewerAtoms.d.ts +38 -0
- package/dist/useViewerAtoms.js +288 -0
- package/expo-module.config.json +13 -0
- package/ios/EditorAddons.swift +354 -0
- package/ios/EditorCodeHighlighting.swift +184 -0
- package/ios/EditorCore.xcframework/Info.plist +44 -0
- package/ios/EditorCore.xcframework/ios-arm64/libeditor_core.a +0 -0
- package/ios/EditorCore.xcframework/ios-arm64_x86_64-simulator/libeditor_core.a +0 -0
- package/ios/EditorInteractionOverlays.swift +697 -0
- package/ios/EditorLayoutManager.swift +971 -0
- package/ios/EditorNodeTypes.swift +37 -0
- package/ios/EditorStyleSheet.swift +461 -0
- package/ios/EditorTextView+AttributedPatch.swift +305 -0
- package/ios/EditorTextView+Binding.swift +61 -0
- package/ios/EditorTextView+Caret.swift +333 -0
- package/ios/EditorTextView+Commands.swift +203 -0
- package/ios/EditorTextView+Delegate.swift +65 -0
- package/ios/EditorTextView+Diagnostics.swift +225 -0
- package/ios/EditorTextView+DragDrop.swift +290 -0
- package/ios/EditorTextView+ExternalComposition.swift +364 -0
- package/ios/EditorTextView+Images.swift +354 -0
- package/ios/EditorTextView+InputTraits.swift +200 -0
- package/ios/EditorTextView+KeyboardInput.swift +318 -0
- package/ios/EditorTextView+Layout.swift +245 -0
- package/ios/EditorTextView+MarkedText.swift +267 -0
- package/ios/EditorTextView+NativeInputLifecycle.swift +372 -0
- package/ios/EditorTextView+NativeMutation.swift +471 -0
- package/ios/EditorTextView+Reconciliation.swift +97 -0
- package/ios/EditorTextView+RenderPatch.swift +573 -0
- package/ios/EditorTextView+Rendering.swift +539 -0
- package/ios/EditorTextView+Selection.swift +542 -0
- package/ios/EditorTextView.swift +953 -0
- package/ios/EditorTheme.swift +626 -0
- package/ios/EditorV2Adapter+Commands.swift +204 -0
- package/ios/EditorV2Adapter+Envelope.swift +238 -0
- package/ios/EditorV2Adapter+Mutation.swift +392 -0
- package/ios/EditorV2Adapter+Registry.swift +185 -0
- package/ios/EditorV2Adapter+RenderState.swift +360 -0
- package/ios/EditorV2Adapter+RenderValidation.swift +420 -0
- package/ios/EditorV2Adapter+Selection.swift +329 -0
- package/ios/EditorV2Adapter+TextCommands.swift +430 -0
- package/ios/EditorV2Adapter.swift +376 -0
- package/ios/EditorV2Shadow.swift +353 -0
- package/ios/Generated_editor_core.swift +2378 -0
- package/ios/NativeCodeHighlighting.swift +159 -0
- package/ios/NativeCollaborationSocket.swift +144 -0
- package/ios/NativeCollaborationTransport+Protocol.swift +258 -0
- package/ios/NativeCollaborationTransport+Socket.swift +379 -0
- package/ios/NativeCollaborationTransport+Validation.swift +103 -0
- package/ios/NativeCollaborationTransport.swift +322 -0
- package/ios/NativeCollaborationTransportRegistry.swift +521 -0
- package/ios/NativeEditorExpoView+AccessoryRetry.swift +219 -0
- package/ios/NativeEditorExpoView+Binding.swift +268 -0
- package/ios/NativeEditorExpoView+Diagnostics.swift +66 -0
- package/ios/NativeEditorExpoView+Events.swift +131 -0
- package/ios/NativeEditorExpoView+Focus.swift +169 -0
- package/ios/NativeEditorExpoView+MentionRetry.swift +288 -0
- package/ios/NativeEditorExpoView+Mentions.swift +288 -0
- package/ios/NativeEditorExpoView+Properties.swift +300 -0
- package/ios/NativeEditorExpoView+Toolbar.swift +86 -0
- package/ios/NativeEditorExpoView+Updates.swift +312 -0
- package/ios/NativeEditorExpoView.swift +349 -0
- package/ios/NativeEditorModule.swift +856 -0
- package/ios/NativeEditorViewRegistry.swift +226 -0
- package/ios/NativeToolbar+ButtonStyle.swift +214 -0
- package/ios/NativeToolbar+Buttons.swift +228 -0
- package/ios/NativeToolbar+Diagnostics.swift +114 -0
- package/ios/NativeToolbar+Menu.swift +101 -0
- package/ios/NativeToolbar+Models.swift +519 -0
- package/ios/NativeToolbar+Placeholder.swift +39 -0
- package/ios/NativeToolbar.swift +612 -0
- package/ios/OrderedListMarkerFormatter.swift +103 -0
- package/ios/PositionBridge.swift +596 -0
- package/ios/ProseViewerView.swift +462 -0
- package/ios/RenderBridge+Atoms.swift +288 -0
- package/ios/RenderBridge+Attachments.swift +246 -0
- package/ios/RenderBridge+BlockBoundaries.swift +313 -0
- package/ios/RenderBridge+Style.swift +343 -0
- package/ios/RenderBridge.swift +704 -0
- package/ios/RichTextEditorView.swift +930 -0
- package/ios/SharedNativeImagePipeline+Cache.swift +189 -0
- package/ios/SharedNativeImagePipeline+Transport.swift +328 -0
- package/ios/SharedNativeImagePipeline.swift +533 -0
- package/ios/Viewer/CoreTextProseLayoutEngine+AttributedText.swift +436 -0
- package/ios/Viewer/CoreTextProseLayoutEngine+Models.swift +322 -0
- package/ios/Viewer/CoreTextProseLayoutEngine.swift +635 -0
- package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.h +4 -0
- package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.mm +767 -0
- package/ios/Viewer/Fabric/PreparedProseMeasurementsManager.mm +118 -0
- package/ios/Viewer/NativeSVGImageDecoder.h +9 -0
- package/ios/Viewer/NativeSVGImageDecoder.mm +106 -0
- package/ios/Viewer/NativeSVGPreflight.h +11 -0
- package/ios/Viewer/NativeSVGPreflight.mm +219 -0
- package/ios/Viewer/PreparedProseDrawingView.swift +639 -0
- package/ios/Viewer/PreparedProseInstrumentation.swift +387 -0
- package/ios/Viewer/PreparedProseLayout.swift +326 -0
- package/ios/Viewer/PreparedProseLayoutCache.swift +766 -0
- package/ios/Viewer/PreparedProseLayoutRegistry+Artifacts.swift +377 -0
- package/ios/Viewer/PreparedProseLayoutRegistry+Fabric.swift +582 -0
- package/ios/Viewer/PreparedProseLayoutRegistry+FabricOwnership.swift +128 -0
- package/ios/Viewer/PreparedProseLayoutRegistry.swift +381 -0
- package/ios/Viewer/ViewerDocument.swift +575 -0
- package/ios/Viewer/ViewerFontEnvironment.swift +283 -0
- package/ios/Viewer/ViewerImagePipeline.swift +478 -0
- package/ios/editor_coreFFI/editor_coreFFI.h +1023 -0
- package/ios/editor_coreFFI/module.modulemap +7 -0
- package/package.json +151 -0
- package/react-native.config.js +17 -0
- package/rust/android/arm64-v8a/libeditor_core.so +0 -0
- package/rust/android/armeabi-v7a/libeditor_core.so +0 -0
- package/rust/android/x86/libeditor_core.so +0 -0
- package/rust/android/x86_64/libeditor_core.so +0 -0
- package/rust/bindings/kotlin/uniffi/editor_core/editor_core.kt +3146 -0
- package/src/AtomHost.tsx +180 -0
- package/src/DefaultAtomChip.tsx +27 -0
- package/src/EditorAddon.ts +65 -0
- package/src/EditorAddonNormalization.ts +49 -0
- package/src/EditorMentionThemeNormalization.ts +25 -0
- package/src/EditorMentionThemeValidation.ts +133 -0
- package/src/EditorStyleSheet.ts +9 -0
- package/src/EditorStyleSheetNormalization.ts +219 -0
- package/src/EditorStyleSheetTypes.ts +189 -0
- package/src/EditorTheme.ts +196 -0
- package/src/EditorToolbar.tsx +31 -0
- package/src/EditorToolbarComponent.tsx +23 -0
- package/src/EditorToolbarItems.tsx +64 -0
- package/src/EditorToolbarRegistry.tsx +254 -0
- package/src/EditorToolbarTypes.tsx +322 -0
- package/src/EditorToolbarVisuals.tsx +270 -0
- package/src/EditorUpdateRevision.ts +26 -0
- package/src/ExternalTextComposition.ts +658 -0
- package/src/ImageLoadingPolicy.ts +125 -0
- package/src/NativeEditorBoundaryError.ts +345 -0
- package/src/NativeEditorBridge.ts +93 -0
- package/src/NativeEditorCollaborationTransport.ts +493 -0
- package/src/NativeEditorCreateConfig.ts +326 -0
- package/src/NativeEditorCreateJson.ts +579 -0
- package/src/NativeEditorCreateValidation.ts +178 -0
- package/src/NativeEditorDocumentBridge.ts +485 -0
- package/src/NativeEditorDocumentHandle.ts +168 -0
- package/src/NativeEditorLocalAwareness.ts +168 -0
- package/src/NativeEditorNativeModule.ts +97 -0
- package/src/NativeEditorRenderNormalization.ts +320 -0
- package/src/NativeEditorResultNormalization.ts +469 -0
- package/src/NativeEditorTypes.ts +366 -0
- package/src/NativeEditorV2Decimal.ts +13 -0
- package/src/NativeProseViewer.tsx +356 -0
- package/src/NativeRichTextEditor.tsx +33 -0
- package/src/ResourceLimits.ts +187 -0
- package/src/RichTextEditor.tsx +27 -0
- package/src/RichTextEditorNativeTypes.tsx +144 -0
- package/src/RichTextEditorNativeView.tsx +21 -0
- package/src/RichTextEditorSerialization.tsx +381 -0
- package/src/RichTextEditorTypes.tsx +327 -0
- package/src/ViewerConfiguration.ts +23 -0
- package/src/YjsCollaboration.ts +692 -0
- package/src/addons.ts +311 -0
- package/src/atomConstants.ts +3 -0
- package/src/atomInstances.ts +123 -0
- package/src/atomPolicy.ts +47 -0
- package/src/atomUpdates.ts +52 -0
- package/src/atoms.ts +379 -0
- package/src/attributeValidation.ts +116 -0
- package/src/contentExpression.ts +338 -0
- package/src/index.ts +295 -0
- package/src/listMarkers.ts +18 -0
- package/src/schemaDefinition.ts +395 -0
- package/src/schemaDocument.ts +92 -0
- package/src/schemaDocumentConstruction.ts +148 -0
- package/src/schemaNormalization.ts +367 -0
- package/src/schemaPresets.ts +250 -0
- package/src/schemaResolution.ts +242 -0
- package/src/schemas.ts +43 -0
- package/src/specs/PreparedProseViewerNativeComponent.ts +40 -0
- package/src/useEditorToolbarInteractions.tsx +329 -0
- package/src/useEditorToolbarItems.tsx +390 -0
- package/src/useEditorToolbarPresentation.tsx +483 -0
- package/src/useEditorToolbarState.tsx +172 -0
- package/src/useFocusPreservingFrames.ts +171 -0
- package/src/useNativeEditor.ts +534 -0
- package/src/useRichTextEditorCommands.tsx +478 -0
- package/src/useRichTextEditorEvents.tsx +342 -0
- package/src/useRichTextEditorMentions.tsx +441 -0
- package/src/useRichTextEditorPresentation.tsx +563 -0
- package/src/useRichTextEditorState.tsx +620 -0
- package/src/useRichTextEditorUpdates.tsx +403 -0
- package/src/useViewerAtoms.tsx +427 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import CryptoKit
|
|
2
|
+
import Foundation
|
|
3
|
+
import UIKit
|
|
4
|
+
|
|
5
|
+
extension PreparedProseLayoutRegistry {
|
|
6
|
+
func beginFabricMeasure(_ generation: FabricGenerationToken) -> Bool {
|
|
7
|
+
compiledCondition.lock()
|
|
8
|
+
guard isFabricLeaseActiveLocked(generation) else {
|
|
9
|
+
compiledCondition.unlock()
|
|
10
|
+
return false
|
|
11
|
+
}
|
|
12
|
+
var state = fabricMeasurementsInFlight[generation] ?? FabricMeasurementState()
|
|
13
|
+
guard !state.cancelled else {
|
|
14
|
+
compiledCondition.unlock()
|
|
15
|
+
return false
|
|
16
|
+
}
|
|
17
|
+
state.count += 1
|
|
18
|
+
fabricMeasurementsInFlight[generation] = state
|
|
19
|
+
compiledCondition.unlock()
|
|
20
|
+
return true
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
func endFabricMeasure(_ generation: FabricGenerationToken) {
|
|
24
|
+
compiledCondition.lock()
|
|
25
|
+
guard var state = fabricMeasurementsInFlight[generation] else {
|
|
26
|
+
compiledCondition.unlock()
|
|
27
|
+
return
|
|
28
|
+
}
|
|
29
|
+
let remaining = max(0, state.count - 1)
|
|
30
|
+
if remaining == 0 {
|
|
31
|
+
fabricMeasurementsInFlight.removeValue(forKey: generation)
|
|
32
|
+
} else {
|
|
33
|
+
state.count = remaining
|
|
34
|
+
fabricMeasurementsInFlight[generation] = state
|
|
35
|
+
}
|
|
36
|
+
compiledCondition.unlock()
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
func isFabricLeaseActive(_ generation: FabricGenerationToken) -> Bool {
|
|
40
|
+
compiledCondition.lock()
|
|
41
|
+
defer { compiledCondition.unlock() }
|
|
42
|
+
return isFabricLeaseActiveLocked(generation)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/// Caller must hold `compiledCondition`.
|
|
46
|
+
func isFabricLeaseActiveLocked(_ generation: FabricGenerationToken) -> Bool {
|
|
47
|
+
guard generation.leaseHandle != 0,
|
|
48
|
+
let lease = fabricLeaseStates[FabricLeaseOwner(
|
|
49
|
+
surface: generation.surface,
|
|
50
|
+
leaseHandle: generation.leaseHandle
|
|
51
|
+
)],
|
|
52
|
+
lease.active,
|
|
53
|
+
lease.permittedGenerationIdentity == nil ||
|
|
54
|
+
lease.permittedGenerationIdentity == generation.generationIdentity
|
|
55
|
+
else { return false }
|
|
56
|
+
return !(fabricMeasurementsInFlight[generation]?.cancelled ?? false)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/// Caller must hold `compiledCondition`.
|
|
60
|
+
func cancelFabricMeasurementLocked(_ generation: FabricGenerationToken) {
|
|
61
|
+
guard var state = fabricMeasurementsInFlight[generation] else { return }
|
|
62
|
+
state.cancelled = true
|
|
63
|
+
fabricMeasurementsInFlight[generation] = state
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
private func retireStaleFabricLease(
|
|
67
|
+
_ generation: FabricGenerationToken,
|
|
68
|
+
widthPixels: Int,
|
|
69
|
+
scale: CGFloat
|
|
70
|
+
) {
|
|
71
|
+
_ = layoutCache.releasePendingLease(
|
|
72
|
+
for: generation.surface,
|
|
73
|
+
generationIdentity: generation.generationIdentity,
|
|
74
|
+
widthPixels: widthPixels,
|
|
75
|
+
displayScale: scale,
|
|
76
|
+
leaseHandle: generation.leaseHandle
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
func discardCancelledFabricMeasurement(
|
|
81
|
+
_ generation: FabricGenerationToken,
|
|
82
|
+
widthPixels: Int,
|
|
83
|
+
scale: CGFloat
|
|
84
|
+
) {
|
|
85
|
+
retireStaleFabricLease(generation, widthPixels: widthPixels, scale: scale)
|
|
86
|
+
// Release can win after sidecar begin but before cache publication.
|
|
87
|
+
// This exact handle cannot clear a concurrently-created replacement.
|
|
88
|
+
FabricAttachmentSidecars.remove(
|
|
89
|
+
generation.surface,
|
|
90
|
+
leaseHandle: generation.leaseHandle
|
|
91
|
+
)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
func retainFabricGenerationOwnership(
|
|
95
|
+
_ generation: FabricGenerationToken,
|
|
96
|
+
document: ViewerDocument,
|
|
97
|
+
request: ProseViewerRequest
|
|
98
|
+
) -> Bool {
|
|
99
|
+
compiledCondition.lock()
|
|
100
|
+
guard isFabricLeaseActiveLocked(generation) else {
|
|
101
|
+
compiledCondition.unlock()
|
|
102
|
+
return false
|
|
103
|
+
}
|
|
104
|
+
documentsByFabricGeneration[generation] = document
|
|
105
|
+
failuresByFabricGeneration.removeValue(forKey: generation)
|
|
106
|
+
_ = preparedThemeLocked(for: request, generation: generation)
|
|
107
|
+
fabricOwnershipRevisions[generation, default: 0] &+= 1
|
|
108
|
+
compiledCondition.unlock()
|
|
109
|
+
return true
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
func retainFabricGenerationFailure(
|
|
113
|
+
_ generation: FabricGenerationToken,
|
|
114
|
+
error: Error
|
|
115
|
+
) -> Bool {
|
|
116
|
+
compiledCondition.lock()
|
|
117
|
+
guard isFabricLeaseActiveLocked(generation) else {
|
|
118
|
+
compiledCondition.unlock()
|
|
119
|
+
return false
|
|
120
|
+
}
|
|
121
|
+
failuresByFabricGeneration[generation] = error
|
|
122
|
+
documentsByFabricGeneration.removeValue(forKey: generation)
|
|
123
|
+
fabricOwnershipRevisions[generation, default: 0] &+= 1
|
|
124
|
+
compiledCondition.unlock()
|
|
125
|
+
return true
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
}
|
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
import CryptoKit
|
|
2
|
+
import Foundation
|
|
3
|
+
import UIKit
|
|
4
|
+
|
|
5
|
+
/// Shared compiler and prepared-layout owner for UIKit and Fabric.
|
|
6
|
+
@objc(PREPPreparedProseLayoutRegistry)
|
|
7
|
+
public final class PreparedProseLayoutRegistry: NSObject {
|
|
8
|
+
typealias DocumentCompiler = (ProseViewerRequest) throws -> ViewerDocument
|
|
9
|
+
typealias LayoutPreparation = (ViewerDocument, ProseLayoutKey, CGFloat, CGFloat) throws -> PreparedProseLayout
|
|
10
|
+
|
|
11
|
+
@objc public static var sharedRegistry: PreparedProseLayoutRegistry { shared }
|
|
12
|
+
static let shared = PreparedProseLayoutRegistry()
|
|
13
|
+
|
|
14
|
+
private final class Compilation {
|
|
15
|
+
var result: Result<ViewerDocument, Error>?
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
struct FabricMeasurementCancelled: Error {}
|
|
19
|
+
|
|
20
|
+
/// This record exists only while a measurement is executing. A release
|
|
21
|
+
/// marks it cancelled so post-layout ownership cannot be republished;
|
|
22
|
+
/// `endFabricMeasure` removes it when the final in-flight callback exits.
|
|
23
|
+
struct FabricMeasurementState {
|
|
24
|
+
var count = 0
|
|
25
|
+
var cancelled = false
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
struct FabricLeaseState {
|
|
29
|
+
var active = true
|
|
30
|
+
/// `nil` permits bounded pre-commit Yoga work before a component view
|
|
31
|
+
/// has identified the canonical state/props generation.
|
|
32
|
+
var permittedGenerationIdentity: String?
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
let lock = NSLock()
|
|
36
|
+
let compiledCondition = NSCondition()
|
|
37
|
+
var compiledDocuments: [String: ViewerDocument] = [:]
|
|
38
|
+
/// Lazy access generations keep repeated compiled-document hits O(1).
|
|
39
|
+
/// Stale tokens are skipped during eviction and bounded by compaction.
|
|
40
|
+
var compiledAccessOrder: [(key: String, generation: UInt64)] = []
|
|
41
|
+
var compiledAccessGenerations: [String: UInt64] = [:]
|
|
42
|
+
var compiledAccessOrderHead = 0
|
|
43
|
+
var nextCompiledAccessGeneration: UInt64 = 0
|
|
44
|
+
private var compiledInFlight: [String: Compilation] = [:]
|
|
45
|
+
var compilationFailures: [String: Error] = [:]
|
|
46
|
+
var compilationFailureAccessOrder: [String] = []
|
|
47
|
+
var documentsByFabricGeneration: [FabricGenerationToken: ViewerDocument] = [:]
|
|
48
|
+
var failuresByFabricGeneration: [FabricGenerationToken: Error] = [:]
|
|
49
|
+
var themesByGeneration: [String: PreparedProseTheme] = [:]
|
|
50
|
+
var themeAccessOrder: [String] = []
|
|
51
|
+
var themeOwners: [FabricGenerationToken: String] = [:]
|
|
52
|
+
var themeOwnerCounts: [String: Int] = [:]
|
|
53
|
+
var fabricMeasurementsInFlight: [FabricGenerationToken: FabricMeasurementState] = [:]
|
|
54
|
+
/// Bounded to state-family handles that still have Fabric lifecycle
|
|
55
|
+
/// ownership. Terminal lifecycle cleanup removes entries entirely.
|
|
56
|
+
var fabricLeaseStates: [FabricLeaseOwner: FabricLeaseState] = [:]
|
|
57
|
+
var fabricOwnershipRevisions: [FabricGenerationToken: UInt64] = [:]
|
|
58
|
+
var themesRetainedBytes = 0
|
|
59
|
+
var compiledRetainedBytes = 0
|
|
60
|
+
let compiledByteBudget: Int
|
|
61
|
+
let compilationFailureBudget: Int
|
|
62
|
+
let themeByteBudget: Int
|
|
63
|
+
let themeEntryBudget: Int
|
|
64
|
+
let layoutCache: PreparedProseLayoutCache
|
|
65
|
+
private let compile: DocumentCompiler
|
|
66
|
+
let prepare: LayoutPreparation
|
|
67
|
+
private(set) var layoutPreparationCount = 0
|
|
68
|
+
|
|
69
|
+
// XCTest-only lock-step hook for the mount-miss/measure ownership race.
|
|
70
|
+
// It is deliberately absent from release binaries.
|
|
71
|
+
#if DEBUG
|
|
72
|
+
var fabricMountMissAfterExactLeaseCleanupForTesting: (() -> Void)?
|
|
73
|
+
var fabricSidecarRegisteredForTesting: (() -> Void)?
|
|
74
|
+
#endif
|
|
75
|
+
|
|
76
|
+
var preparedLayoutCacheCountForTesting: Int { layoutCache.countForTesting }
|
|
77
|
+
var compiledDocumentBytesForTesting: Int {
|
|
78
|
+
compiledCondition.lock()
|
|
79
|
+
defer { compiledCondition.unlock() }
|
|
80
|
+
return compiledRetainedBytes
|
|
81
|
+
}
|
|
82
|
+
var layoutRetainedBytesForTesting: Int { layoutCache.retainedBytesForTesting }
|
|
83
|
+
var oversizedLeaseCountForTesting: Int { layoutCache.oversizedLeaseCountForTesting }
|
|
84
|
+
var pendingFabricLeaseCountForTesting: Int { layoutCache.pendingLeaseCountForTesting }
|
|
85
|
+
var mountedFabricLeaseCountForTesting: Int { layoutCache.mountedLeaseCountForTesting }
|
|
86
|
+
var fabricLeaseCountForTesting: Int { layoutCache.leaseCountForTesting }
|
|
87
|
+
struct BenchmarkResidentCensus {
|
|
88
|
+
let keys: [ProseLayoutKey]
|
|
89
|
+
let count: Int
|
|
90
|
+
let digest: String
|
|
91
|
+
}
|
|
92
|
+
func permittedFabricGenerationForTesting(_ owner: FabricLeaseOwner) -> String? {
|
|
93
|
+
compiledCondition.lock()
|
|
94
|
+
defer { compiledCondition.unlock() }
|
|
95
|
+
return fabricLeaseStates[owner]?.permittedGenerationIdentity
|
|
96
|
+
}
|
|
97
|
+
func hasFabricGenerationOwnershipForTesting(_ generation: FabricGenerationToken) -> Bool {
|
|
98
|
+
compiledCondition.lock()
|
|
99
|
+
defer { compiledCondition.unlock() }
|
|
100
|
+
if documentsByFabricGeneration[generation] != nil {
|
|
101
|
+
return themeOwners[generation] != nil
|
|
102
|
+
}
|
|
103
|
+
return failuresByFabricGeneration[generation] != nil
|
|
104
|
+
}
|
|
105
|
+
var preparedThemeCountForTesting: Int {
|
|
106
|
+
compiledCondition.lock()
|
|
107
|
+
defer { compiledCondition.unlock() }
|
|
108
|
+
return themesByGeneration.count
|
|
109
|
+
}
|
|
110
|
+
func hasFabricThemeOwnershipForTesting(_ generation: FabricGenerationToken) -> Bool {
|
|
111
|
+
compiledCondition.lock()
|
|
112
|
+
defer { compiledCondition.unlock() }
|
|
113
|
+
return themeOwners[generation] != nil
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
override convenience init() {
|
|
117
|
+
self.init(compile: Self.compileWithRust, prepare: Self.prepareWithCoreText)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
init(
|
|
121
|
+
byteBudget: Int = 32 * 1024 * 1024,
|
|
122
|
+
compiledByteBudget: Int = 8 * 1024 * 1024,
|
|
123
|
+
compilationFailureBudget: Int = 128,
|
|
124
|
+
themeByteBudget: Int = 512 * 1024,
|
|
125
|
+
themeEntryBudget: Int = 128,
|
|
126
|
+
compile: @escaping DocumentCompiler,
|
|
127
|
+
prepare: @escaping LayoutPreparation = PreparedProseLayoutRegistry.prepareWithCoreText
|
|
128
|
+
) {
|
|
129
|
+
self.compile = compile
|
|
130
|
+
self.prepare = prepare
|
|
131
|
+
layoutCache = PreparedProseLayoutCache(byteBudget: byteBudget)
|
|
132
|
+
self.compiledByteBudget = compiledByteBudget
|
|
133
|
+
self.compilationFailureBudget = compilationFailureBudget
|
|
134
|
+
self.themeByteBudget = themeByteBudget
|
|
135
|
+
self.themeEntryBudget = themeEntryBudget
|
|
136
|
+
super.init()
|
|
137
|
+
NotificationCenter.default.addObserver(
|
|
138
|
+
self,
|
|
139
|
+
selector: #selector(didReceiveMemoryWarning),
|
|
140
|
+
name: UIApplication.didReceiveMemoryWarningNotification,
|
|
141
|
+
object: nil
|
|
142
|
+
)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
deinit { NotificationCenter.default.removeObserver(self) }
|
|
146
|
+
|
|
147
|
+
func compileDocument(request: ProseViewerRequest) throws -> ViewerDocument {
|
|
148
|
+
let cacheKey = request.compiledCacheKey
|
|
149
|
+
compiledCondition.lock()
|
|
150
|
+
if let document = compiledDocuments[cacheKey] {
|
|
151
|
+
touchCompiled(cacheKey)
|
|
152
|
+
compiledCondition.unlock()
|
|
153
|
+
return document
|
|
154
|
+
}
|
|
155
|
+
if let failure = compilationFailures[cacheKey] {
|
|
156
|
+
touchCompilationFailure(cacheKey)
|
|
157
|
+
compiledCondition.unlock()
|
|
158
|
+
throw failure
|
|
159
|
+
}
|
|
160
|
+
if let compilation = compiledInFlight[cacheKey] {
|
|
161
|
+
while compilation.result == nil { compiledCondition.wait() }
|
|
162
|
+
let result = compilation.result!
|
|
163
|
+
compiledCondition.unlock()
|
|
164
|
+
return try result.get()
|
|
165
|
+
}
|
|
166
|
+
let compilation = Compilation()
|
|
167
|
+
compiledInFlight[cacheKey] = compilation
|
|
168
|
+
compiledCondition.unlock()
|
|
169
|
+
|
|
170
|
+
let compileStarted = PreparedProseInstrumentation.now()
|
|
171
|
+
let result = Result<ViewerDocument, Error> {
|
|
172
|
+
let compiled = try compile(request)
|
|
173
|
+
guard compiled.semanticKey.range(of: "^[0-9a-f]{64}$", options: .regularExpression) != nil else {
|
|
174
|
+
throw ProseViewerError.compiler(
|
|
175
|
+
domain: "viewer",
|
|
176
|
+
code: "INVALID_SEMANTIC_KEY",
|
|
177
|
+
message: "The compiler returned an invalid semantic key."
|
|
178
|
+
)
|
|
179
|
+
}
|
|
180
|
+
return compiled
|
|
181
|
+
}
|
|
182
|
+
PreparedProseInstrumentation.compiled(compileStarted, generation: request.generationIdentity)
|
|
183
|
+
|
|
184
|
+
compiledCondition.lock()
|
|
185
|
+
if case let .success(document) = result {
|
|
186
|
+
compiledDocuments[cacheKey] = document
|
|
187
|
+
compiledRetainedBytes += document.retainedBytes
|
|
188
|
+
touchCompiled(cacheKey)
|
|
189
|
+
trimCompiledToBudget()
|
|
190
|
+
PreparedProseInstrumentation.retained(.compiled, scope: "registry", bytes: compiledRetainedBytes)
|
|
191
|
+
} else if case let .failure(error) = result {
|
|
192
|
+
compilationFailures[cacheKey] = error
|
|
193
|
+
touchCompilationFailure(cacheKey)
|
|
194
|
+
trimCompilationFailuresToBudget()
|
|
195
|
+
}
|
|
196
|
+
compilation.result = result
|
|
197
|
+
compiledInFlight.removeValue(forKey: cacheKey)
|
|
198
|
+
compiledCondition.broadcast()
|
|
199
|
+
compiledCondition.unlock()
|
|
200
|
+
return try result.get()
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
func measure(
|
|
204
|
+
request: ProseViewerRequest,
|
|
205
|
+
widthPoints: CGFloat,
|
|
206
|
+
scale: CGFloat,
|
|
207
|
+
compiledDocument: ViewerDocument? = nil,
|
|
208
|
+
fabricSurface: FabricSurfaceToken? = nil,
|
|
209
|
+
fabricLeaseHandle: UInt64 = 1,
|
|
210
|
+
measurementImageState: ViewerAttachmentRevisionState? = nil
|
|
211
|
+
) -> PreparedProseLayout {
|
|
212
|
+
let generation: FabricGenerationToken?
|
|
213
|
+
if let fabricSurface, fabricLeaseHandle != 0 {
|
|
214
|
+
generation = FabricGenerationToken(
|
|
215
|
+
surface: fabricSurface,
|
|
216
|
+
generationIdentity: request.generationIdentity,
|
|
217
|
+
leaseHandle: fabricLeaseHandle
|
|
218
|
+
)
|
|
219
|
+
} else {
|
|
220
|
+
generation = nil
|
|
221
|
+
}
|
|
222
|
+
guard let widthPixels = ProseLayoutMetrics.widthPixels(widthPoints: widthPoints, scale: scale) else {
|
|
223
|
+
if let generation {
|
|
224
|
+
releaseFabricInvalidMeasurement(
|
|
225
|
+
generation,
|
|
226
|
+
widthPoints: widthPoints,
|
|
227
|
+
scale: scale
|
|
228
|
+
)
|
|
229
|
+
}
|
|
230
|
+
return invalidWidthArtifact(
|
|
231
|
+
request: request,
|
|
232
|
+
scale: scale,
|
|
233
|
+
error: .hostContract(message: "A finite positive width is required for prose measurement.")
|
|
234
|
+
)
|
|
235
|
+
}
|
|
236
|
+
let beganFabricMeasure = generation.map(beginFabricMeasure) ?? false
|
|
237
|
+
let ownedGeneration = beganFabricMeasure ? generation : nil
|
|
238
|
+
defer {
|
|
239
|
+
if let generation, beganFabricMeasure { endFabricMeasure(generation) }
|
|
240
|
+
}
|
|
241
|
+
let canonicalWidth = ProseLayoutMetrics.canonicalWidth(widthPixels: widthPixels, scale: scale)
|
|
242
|
+
// Yoga can prepare before a component view exists. Reset the matching
|
|
243
|
+
// surface sidecar before Core Text asks for intrinsic fallback.
|
|
244
|
+
let imageMeasurementState = ownedGeneration.flatMap { token -> ViewerAttachmentRevisionState? in
|
|
245
|
+
guard isFabricLeaseActive(token) else { return nil }
|
|
246
|
+
let state = FabricAttachmentSidecars.begin(
|
|
247
|
+
token.surface,
|
|
248
|
+
leaseHandle: fabricLeaseHandle,
|
|
249
|
+
semanticIdentity: request.semanticGenerationIdentity
|
|
250
|
+
)
|
|
251
|
+
#if DEBUG
|
|
252
|
+
fabricSidecarRegisteredForTesting?()
|
|
253
|
+
#endif
|
|
254
|
+
// Release may race validation and create a stale exact sidecar.
|
|
255
|
+
// Remove only this handle; a replacement family has another one.
|
|
256
|
+
guard isFabricLeaseActive(token) else {
|
|
257
|
+
FabricAttachmentSidecars.remove(token.surface, leaseHandle: token.leaseHandle)
|
|
258
|
+
return nil
|
|
259
|
+
}
|
|
260
|
+
return state
|
|
261
|
+
} ?? measurementImageState ?? generation.map { _ in
|
|
262
|
+
let state = ViewerAttachmentRevisionState()
|
|
263
|
+
_ = state.beginSemanticGeneration(request.semanticGenerationIdentity)
|
|
264
|
+
return state
|
|
265
|
+
}
|
|
266
|
+
do {
|
|
267
|
+
if let ownedGeneration, !isFabricLeaseActive(ownedGeneration) {
|
|
268
|
+
throw FabricMeasurementCancelled()
|
|
269
|
+
}
|
|
270
|
+
let document = try preparedDocument(
|
|
271
|
+
request: request,
|
|
272
|
+
compiledDocument: compiledDocument,
|
|
273
|
+
fabricGeneration: ownedGeneration
|
|
274
|
+
)
|
|
275
|
+
let key = layoutKey(for: document, request: request, widthPixels: widthPixels, scale: scale)
|
|
276
|
+
if let ownedGeneration, !isFabricLeaseActive(ownedGeneration) {
|
|
277
|
+
throw FabricMeasurementCancelled()
|
|
278
|
+
}
|
|
279
|
+
let layout = try layoutCache.value(
|
|
280
|
+
for: key,
|
|
281
|
+
fabricSurface: ownedGeneration?.surface,
|
|
282
|
+
fabricLeaseHandle: ownedGeneration?.leaseHandle,
|
|
283
|
+
shouldCreateFabricLease: {
|
|
284
|
+
guard let ownedGeneration else { return true }
|
|
285
|
+
return self.isFabricLeaseActive(ownedGeneration)
|
|
286
|
+
},
|
|
287
|
+
build: {
|
|
288
|
+
let layoutStarted = PreparedProseInstrumentation.now()
|
|
289
|
+
self.lock.lock()
|
|
290
|
+
self.layoutPreparationCount += 1
|
|
291
|
+
self.lock.unlock()
|
|
292
|
+
do {
|
|
293
|
+
var prepared: Result<PreparedProseLayout, Error>!
|
|
294
|
+
request.appearance.traits.performAsCurrent {
|
|
295
|
+
prepared = Result {
|
|
296
|
+
if let imageMeasurementState {
|
|
297
|
+
return try FabricAttachmentSidecars.withMeasurementState(imageMeasurementState) {
|
|
298
|
+
try self.prepare(document, key, canonicalWidth, scale)
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
return try self.prepare(document, key, canonicalWidth, scale)
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
let artifact = try prepared.get()
|
|
305
|
+
PreparedProseInstrumentation.laidOut(layoutStarted, generation: request.generationIdentity)
|
|
306
|
+
return artifact
|
|
307
|
+
} catch let error as ProseViewerError {
|
|
308
|
+
return self.errorArtifact(key: key, width: canonicalWidth, error: error)
|
|
309
|
+
} catch {
|
|
310
|
+
return self.errorArtifact(
|
|
311
|
+
key: key,
|
|
312
|
+
width: canonicalWidth,
|
|
313
|
+
error: .layout(message: String(describing: error))
|
|
314
|
+
)
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
)
|
|
318
|
+
if let generation = ownedGeneration,
|
|
319
|
+
!retainFabricGenerationOwnership(
|
|
320
|
+
generation,
|
|
321
|
+
document: document,
|
|
322
|
+
request: request
|
|
323
|
+
) {
|
|
324
|
+
discardCancelledFabricMeasurement(
|
|
325
|
+
generation,
|
|
326
|
+
widthPixels: widthPixels,
|
|
327
|
+
scale: scale
|
|
328
|
+
)
|
|
329
|
+
}
|
|
330
|
+
return layout
|
|
331
|
+
} catch is FabricMeasurementCancelled {
|
|
332
|
+
if let ownedGeneration {
|
|
333
|
+
discardCancelledFabricMeasurement(ownedGeneration, widthPixels: widthPixels, scale: scale)
|
|
334
|
+
}
|
|
335
|
+
return invalidWidthArtifact(
|
|
336
|
+
request: request,
|
|
337
|
+
scale: scale,
|
|
338
|
+
error: .layout(message: "A released Fabric measurement completed after its lifecycle ended.")
|
|
339
|
+
)
|
|
340
|
+
} catch let error as ProseViewerError {
|
|
341
|
+
let layout = cachedErrorArtifact(
|
|
342
|
+
request: request,
|
|
343
|
+
widthPixels: widthPixels,
|
|
344
|
+
scale: scale,
|
|
345
|
+
error: error,
|
|
346
|
+
fabricSurface: ownedGeneration?.surface,
|
|
347
|
+
fabricGeneration: ownedGeneration,
|
|
348
|
+
fabricLeaseHandle: ownedGeneration?.leaseHandle
|
|
349
|
+
)
|
|
350
|
+
if let generation = ownedGeneration,
|
|
351
|
+
!retainFabricGenerationFailure(generation, error: error) {
|
|
352
|
+
discardCancelledFabricMeasurement(
|
|
353
|
+
generation,
|
|
354
|
+
widthPixels: widthPixels,
|
|
355
|
+
scale: scale
|
|
356
|
+
)
|
|
357
|
+
}
|
|
358
|
+
return layout
|
|
359
|
+
} catch {
|
|
360
|
+
let layout = cachedErrorArtifact(
|
|
361
|
+
request: request,
|
|
362
|
+
widthPixels: widthPixels,
|
|
363
|
+
scale: scale,
|
|
364
|
+
error: .layout(message: String(describing: error)),
|
|
365
|
+
fabricSurface: ownedGeneration?.surface,
|
|
366
|
+
fabricGeneration: ownedGeneration,
|
|
367
|
+
fabricLeaseHandle: ownedGeneration?.leaseHandle
|
|
368
|
+
)
|
|
369
|
+
if let generation = ownedGeneration,
|
|
370
|
+
!retainFabricGenerationFailure(generation, error: error) {
|
|
371
|
+
discardCancelledFabricMeasurement(
|
|
372
|
+
generation,
|
|
373
|
+
widthPixels: widthPixels,
|
|
374
|
+
scale: scale
|
|
375
|
+
)
|
|
376
|
+
}
|
|
377
|
+
return layout
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
}
|