Repository navigation
Use wasmMemory instead of wasmExports - #3478
Open
Shagen Ogandzhanian (Schahen) wants to merge 6356 commits into
Open
Shagen Ogandzhanian (Schahen) wants to merge 6356 commits into
Shagen Ogandzhanian (Schahen) wants to merge 6356 commits into
Conversation
Part of https://youtrack.jetbrains.com/issue/CMP-10569/Setup-GitHub-action-in-integration-branch Requirement for #3256 Reason: - `navigation-testing` doesn't redirect currently to anything - it depends on `navigation-runtime`, which redirects all the targets - there was an incompatible change between `navigation-runtime` and `navigation-testing` (remove/add methods in interface) - this change leaded to compilation error, because `navigation-testing` uses the new interface, but it depends on an interface from the old redirected `navigation-runtime` - it works in AOSP because they built both modules from sources and they don't have to preserve compatibility because it is one group ## Release Notes N/A
Propose to add not covered in other tests case with opening a Dialog or ModalBottomSheet while a focused Compose TextField has pending native iOS text composition ## Testing On branch without the fix the crash reproduces and these 2 tests fail with the same error as in the issue: https://github.com/JetBrains/compose-multiplatform-core/actions/runs/29822722732/job/88608853644?pr=3247#step:4:9314 https://github.com/JetBrains/compose-multiplatform-core/actions/runs/29822722732/job/88608853644?pr=3247#step:4:8263 On jb-main with the fix they pass in this MR 3/3 times. ## Issues Fixed Fixes: [CMP-10515](https://youtrack.jetbrains.com/issue/CMP-10515) Cover CMP-10455 with a UIKit instrumented regression test ## Release Notes N/A
Part of https://youtrack.jetbrains.com/issue/CMP-10569/Setup-GitHub-action-in-integration-branch Requirement for #3256 Copy them from the current jb-main state and change paths ## Release Notes N/A
Fixes https://youtrack.jetbrains.com/issue/CMP-10569/Setup-GitHub-action-in-integration-branch Run GitHub Actions workflows on pushes to the integration branch. ## Testing 1. go to integration branch 2. cherry pick: - #3263 - #3264 - #3256 3. update API dump 4. run GitHub actions ## Release Notes N/A
Fixed retryOnFailure (`initWithSelector: not implemented` after failing tests errors) by replacing `addMethod` with `replaceMethod` and implementing the `testCaseWithSelector:` ## Release Notes N/A
…e flag (#3261) ## Release Notes N/A
…last selectable [isMouseSelectionBetweenTextEnabled=true] (#3268)
This PR moves the JVM Skiko runtime to ui-skiko while keeping the desktop-specific publications for backward compatibility. It also removes the previously introduced `desktop-jvm-all` publication as it will be no longer needed ## Release Notes N/A
- Implement `FrameChoreographer` - one instance per UIWindowScene - that holds shared `FrameRecomposer` for all scenes inside the scene. The `FrameChoreographer` uses `CADisplayLink` to advance composition state on every frame. It also holds OutOfFrameExecutor and `DisplayLinkFrameRate`. - Layout and Draw phases now tight to the UIView layout and draw paths of the iOS platform. - Now Compose Container must be attached to window hierarchy in order to create Compose Scene. - Move PrefetchScheduler outside the MetalRedrawer to ComposeSceneMediator. Fixes https://youtrack.jetbrains.com/issue/CMP-10278 ## Release Notes ### Features - iOS - Use UIView layout and draw phases to run corresponding operation for Compose containers. --------- Co-authored-by: Vendula Švastalová <vendula.svastalova@jetbrains.com>
…nd Safari (#3273) This reverts the revert #3102 WHY: - We won't cherry-pick this change to release/1.12 where this change causes a bug with cursor position when deleting text. - But in jb-main (in progress 1.13 state) this change doesn't trigger cursor position bugs thanks to other changes related to text input Fixes https://youtrack.jetbrains.com/issue/CMP-9803/Web-Mobile.-Android.-Firefox.-Moving-cursor-with-spacebar-doesnt-work ## Testing This should be tested by QA ## Release Notes ### Fixes - Web - Fix cursor control using spacebar sliding gesture in Firefox mobile
) **Explanation:** It's possible that after a `touchstart` there is no other events. In such a case iOS Safari changes the focus, "bluring" the active text input and making the virtual keyboard hide. If there are other events after `touchstart` (usually a `touchmove` or eventually a `touchend`), then Compose will likely consume them, preventing the browser's "default" behaviour. To avoid unexpected keyboard hiding for a longtap (touchstart + delay), we call `preventDefault` for touchstart only when the corresponding pointer hits the active text input rectangle. Fixes https://youtrack.jetbrains.com/issue/CMP-10519/Web-Mobile.-iOS.-The-virtual-keyboard-hides-after-long-tap-to-trigger-the-context-menu ## Testing This should be tested by QA ## Release Notes ### Fixes - Web - _(prerelease fix)_ Virtual keyboard gets hidden after a long tap on the text field
Resolve UIViewLayoutRegion in runtime to be able to workaround the `_OBJC_CLASS_$_UIViewLayoutRegion` error Fixes https://youtrack.jetbrains.com/issue/CMP-10200/compose-multiplatform-core-PR-2555-Breaks-Non-Xcode-26-Builds-by-Introducing-LayoutRegion-Without-Guards ## Release Notes N/A
## Release Notes N/A
Fixes https://youtrack.jetbrains.com/issue/CMP-10554/Tab-doesnt-move-focus-to-HTML-interop-views Introduce an internal `Modifier.focusInteropModifier()` responsible for Focus synchronization between Compose and HTML interop elements. **Supported cases:** - Navigating using Tab/Tab+Shift throug a sequence of Compose and Html interop elements - Compose focus update after clicking an Html interop element **Implementation details:** - Added focus and blur listeners on the html interop container - so Compose can register when focus comes/leaves the interop element or its children - Added a keydown listener on the html interop container to listen to Tab/Tab+Shift to register the direction of the upcoming focus change **Known issues:** Safari: https://bugs.webkit.org/show_bug.cgi?id=22261 > Mac users expect the focus to remain in the text field if you click on a button. That’s what happens everywhere else on their computer in all the Mac applications. That's why clickin on an say html button in the interop element won't trigger a `focus` event. **Demo after the fix:** https://github.com/user-attachments/assets/6b873a21-ff9f-485d-a697-0d45435478e3 ## Testing - This should be tested by QA - Our unit tests can't reliably verify this, because the html elements will ignore "untrusted" focus/keydown events which we usually create in our tests (we'll consider a Selenium test for this) ## Release Notes ### Fixes - Web - Fix Tab focus order with interop elements
[CMP-10624](https://youtrack.jetbrains.com/issue/CMP-10624) [Web] JS app doesn't render. Uncaught TypeError: Cannot read properties. compose-multiplatform-core-compose-ui-ui-text.js ## Release Notes N/A --------- Co-authored-by: Igor Demin <igordmn@users.noreply.github.com>
## Release Notes N/A
Refactor `OffsetToFocusedRect` from composition owned state updated during measure to a `Modifier.Node()`. The previous implementation depended on `Snapshot.sendApplyNotifications()` between layout and draw to settle measurement before rendering. The `Modifier.Node()` implementation removes this workaround and aligns the render pipeline with Android. Fixes [CMP-10291](https://youtrack.jetbrains.com/issue/CMP-10291) `OffsetToFocusedRect` relies on inter-phase `Snapshot` apply between layout and draw ## Testing ##### `RenderPhasesTest.kt` - Update the render-phase test to assert that a snapshot write during layout is drawn immediately but its measurement invalidation is processed after that draw - Verify that `invalidateMeasurement()` during draw-time is settled before draw ##### `KeyboardInsetsTest.kt` - On iOS test IME stays above keyboard during animation when IME padding and `FocusableAboveKeyboard` are used ## Release Notes N/A
…nion.fromKeyword (#3287) This PR is a part of our effort of polishing our API and getting rid of as much ExperimentalComposeUiApi annotations as it makes sense. In this particular PR following changes introduced: - Experimental PointerIcon.Companion.fromKeyword is substituted with fun PointerIcon with equivalent call signature. The reasoning for this is that the (non-experimental) desktop API materialises the PointerIcon interface in a similar fashion - Demo added for both desktop and web targets - Tests were added to the web target ## Testing `./gradlew testWeb` ## Release Notes ### Features - Web - Deprecate PointerIcon.Companion.fromKeyword and introduce equivalent PointerIcon helper fun instead
## Release Notes N/A
…h-DPI screens (#3293) Fix pointer event handling to preserve sub-pixel movement on high-DPI screens - Avoid quantizing fractional pointer coordinates to whole CSS pixels, ensuring accurate sub-pixel movement detection. - Added new helper functions to read raw `clientX`/`clientY` values from events for improved precision. - Included a test verifying that sub-pixel moves are not dropped or misreported. Fixes https://youtrack.jetbrains.com/issue/CMP-10575 ## Testing New unit test ## Release Notes ### Fixes - Web - Fixed outer `HorizontalPager` stealing the touch gesture from a nested `HorizontalPager` during a slow drag
Use custom enter/exit animations on iOS when the defaults are changed Fixes https://youtrack.jetbrains.com/issue/CMP-10639 ## Release Notes ### Fixes - Navigation - Fix pop animations on iOS when custom enter/exit animations are set
…y centering in the screen (#3291)
…mpletely (#3297) The purpose of this PR is to remove entirely `@ExperimentalComposeUiApi` annotation from `ComposeViewportConfiguration`, here's the reasoning: * ComposeViewportConfiguration::isA11YEnabled - is flag that definitely will stay and hardly can be commonised (on iOS there's no such flag but rather application relies mobile settings) * isClearFocusOnMouseDownEnabled is shadowing the ComposeUiFlags.isClearFocusOnMouseDownEnabled which is common and is still `@ExperimentalComposeUiApi`-annotated - but for ComposeViewportConfiguration it's detail of implementation hidden from user so we can safely remove our annotation * enableBrowserWindowInsets won't be commonized because of desktop * Removing all three annotations lead to possibility to remove the annotation on class as well ## Testing Not needed ## Release Notes ### Highlights - Web - ComposeViewportConfiguration is no longer experimental
…omposeViewport (#3300) We consider this API stable enough ## Testing Not needed ## Release Notes ### Highlights - Web - ComposeViewportConfiguration is no longer experimental
#3302) The same logic as in AndroidInputDispatcher Fixes https://youtrack.jetbrains.com/issue/CMP-10655 ## Testing New tests for the case ## Release Notes ### Fixes - Multiple Platforms - Fixed an issue in `runComposeUiTest` V2 when input events required `waitForIdle` to be processed
#3303) Fixes https://youtrack.jetbrains.com/issue/CMP-7230/Blurry-components-in-zoomed-in-browser Fixes https://youtrack.jetbrains.com/issue/CMP-8456/Web-Incorrect-position-on-canvas-after-zoom-in-out Demo: https://github.com/user-attachments/assets/2575b4f9-a2e1-4cd4-8577-0d426e7f542a ## Testing This should be tested by QA ## Release Notes ### Fixes - Web - Fix blurred UI when zooming
Use `waitUntil` instead of fixed timeout to assert test conditions Fixes https://youtrack.jetbrains.com/issue/CMP-10831/Fix-androidx.compose.ui.window.FocusedViewsListTest.testRemovingFocusWithDelay ## Release Notes N/A
This improves the scrolling UX in Compose. ## Release Notes N/A
…3453) The contenteditable div in a11y layer is intentionally scrollable. But it doesn't have to be scrollable via pointer / touch interactions. Disabling the touch-action lets Compose handle the gestures. Fixes https://youtrack.jetbrains.com/issue/CMP-10826 ## Testing This should be tested by QA ## Release Notes ### Fixes - Web - _(pre-release)_ Fix browser interferens with scroll and text selection gesture in a multiline TextField
…eb (#3446) Starting from iOS Safari 27, repeated focus requests override previous pending ones. If the new request happens not during user interaction (e.g. in rAF), all pending focus requests are ignored. Fixes https://youtrack.jetbrains.com/issue/CMP-10825 ## Testing This should be tested by QA ## Release Notes ### Fixes - Web - Adapt backing text input focus behaviour for iOS Safari 27.0
Fixes [CMP-10854](https://youtrack.jetbrains.com/issue/CMP-10854) Merge navigation3 1.2.0 ``` androidx.navigation3 1.2.0 811e8c9 16311390 9/23/2026 ``` There are no [changes](https://android.googlesource.com/platform/frameworks/support/+log/ac5360fca92abb996fe01dcbf06db1a31227566e..811e8c9c37f4955d520fe0cf7e39d96866066abc/navigation3) ## Release Notes N/A
## Testing build and run mpp demo ## Release Notes N/A
Avoid re-layout when `TextInputView` resigns first responder. Fixes https://youtrack.jetbrains.com/issue/CMP-10848 ## Release Notes ### Fixes - iOS - Fixed a crash when a TextField lost focus due to a Dialog being displayed. --------- Co-authored-by: Vendula Švastalová <vendula.svastalova@jetbrains.com>
Fixes https://youtrack.jetbrains.com/issue/CMP-10637/Animation-speed-of-the-list-bounce-effect-on-iOS-feels-a-bit-different ## Release Notes ### Fixes - iOS - Align oberscroll snapping animation with iOS animation
- Introduced `CMPAccessibilityTraitToggle` to enhance accessibility support for toggleable components. - Updated toggleable component handling in iOS to better utilize accessibility traits and state descriptions. - Added instrumented tests for toggle semantics. Fixes https://youtrack.jetbrains.com/issue/CMP-10834/iOS-VoiceOver-does-not-announce-the-off-state-of-a-toggle ## Release Notes ### Fixes - iOS - Fix toggleable state announcement and match it with the native `UISwitch` / `Toggle`
Root cause of CMP-10753: the browser applies an autosuggest insertion natively to the `contenteditable` element and moves the DOM caret; the resulting `selectionchange` was translated into a `SetSelectionCommand` and reached Compose *before* the queued `beforeinput` checkpoint. Autosuggest/autocorrect produces no `keydown`, so the existing `pauseSelectionChangeListener` guard never engaged. ### Changes: - `DomInputStrategy.kt`: the `beforeinput` handler now sets `pauseSelectionChangeListener = true`, and the `selectionchange` listener additionally bails out while `nativeInputEventsProcessor.isCheckpointScheduled` — covering the whole window between event capture and processing. - `NativeInputEventsProcessor.kt`: `resolveSelection()` now honours collapsed target ranges, always emitting `SetSelectionCommand(startOffset, endOffset)`, which pins the insertion point to what the browser reported and makes commits immune to caret drift. ## Testing ./gradlew testWeb and manual ## Release Notes ### Fixes - Web - Fix autosuggestion in iOS
Refactor `FrameChoreographer` to be shared per window instead of the window scene. Update `CMPView` and `CMPViewController` to force-restart compose scene when it's moving between windows to force re-attach to correct `FrameChoreographer` Fixes https://youtrack.jetbrains.com/issue/CMP-10769/Force-restart-Compose-scene-when-moving-between-different-UIWindowScenes ## Release Notes N/A
…erhead (#3413) As done in common source sets value classes See these PRs for more context: https://android-review.googlesource.com/c/platform/frameworks/support/+/4165586 https://android-review.googlesource.com/c/platform/frameworks/support/+/4160767 https://android-review.googlesource.com/c/platform/frameworks/support/+/4169968 (internal value classes get getterized and inlined) ## Release Notes ### Migration Notes - Desktop - Libraries using experimental `DragAndDropTransferAction` must be recompiled because of a binary incompatible change. --------- Co-authored-by: Igor Demin <igordmn@users.noreply.github.com>
(This is reopening of a previous PR) 1. Reuse Matrix33 in SkiaBackedPath (same behaviour as Android) 2. Cache FloatArray for addRoundRect methods in Path and GraphicsLayer (Skiko classes, same as Android) 3. Added SkiaCanvasHolder (same as Android) which caches the SkiaBackedCanvas object across frames to avoid its allocationon every frame (avoids substantial amount of allocations and aligns with Android's behaviour too) Fixes https://youtrack.jetbrains.com/issue/CMP-9463/Web-asComposeCanvas-method-returns-object-allocated-on-each-rendered-frame (for all targets, not only web) ## Release Notes N/A --------- Co-authored-by: Igor Demin <igordmn@users.noreply.github.com>
WebKit commit WebKit/WebKit@6ada1137f92b allows native selection gestures to bypass page event cancellation near selection handles. Although intended to fix text selection on Outlook, the change applies globally and appears to interfere with canvas editors using a hidden backing contenteditable. After Select All, a second long press could select a word in Compose without delivering pointerup. This left the selection gesture unfinished, hid the context menu, and made the TextField stop responding. Set opacity to 0 while the Compose selection is a range, before syncing that range to the DOM, to suppress native selection interaction. Restore opacity to 1 when the selection is collapsed so Safari can still reveal the focused field above the software keyboard. Keep the backing input focused and its IME anchor in place. Exclude the backing input from DOM hit testing with pointer-events: none. Also clip the native caret to the input bounds, since overflow: hidden alone does not reliably prevent Safari from painting it outside the narrow input. Fixes https://youtrack.jetbrains.com/issue/CMP-10539 ## Testing This should be tested by QA ## Release Notes ### Fixes - Web - Fixed text selection issues in Compose text fields on iOS 27 WebKit.
Follow-up of #3339 Merge after mentioned PR is merged (desktop changes only, skiko logic is handled in said PR) Fixes https://youtrack.jetbrains.com/issue/CMP-10741/Desktop-Report-real-device-characteristics-to-mediaQuery ## Release Notes N/A
## Release Notes N/A --------- Co-authored-by: Igor Demin <igordmn@users.noreply.github.com>
…ustom fallback source in Compose web apps (#3476) Fixes https://youtrack.jetbrains.com/issue/CMP-10335 **Description:** By default, it will download the fonts from `https://fonts.gstatic.com/s/` Usage example 1: ```kotlin createComposeWindow( configure = { fontFallbackUrl = "https://custom.fonts.com" } ) { BasicText("გამარჯობა") } ``` Usage example 2 (to disable the fallback completely): ```kotlin createComposeWindow( configure = { fontFallbackUrl = null } ) { BasicText("გამარჯობა") // unless an additional font fallback is provided, this text will be displayed as □□□□□□□□□ } ``` ## Testing - Added new tests - This should be tested by QA ## Release Notes ### Fixes - Web - Support fonts fallback url customization via `ComposeViewportConfiguration.fontFallbackUrl` config
Shagen Ogandzhanian (Schahen)
requested a review
from Oleksandr Karpovich (eymar)
October 2, 2026 16:30
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes [https://youtrack.jetbrains.com/issue/CMP-10879]
Testing
If web demo is running and you can see it - it's fine )
Release Notes
N/A