Skip to content

Use wasmMemory instead of wasmExports - #3478

Open
Shagen Ogandzhanian (Schahen) wants to merge 6356 commits into
androidx-mainfrom
sh/CMP-10879-wasmMemory
Open

Shagen Ogandzhanian (Schahen) wants to merge 6356 commits into
androidx-mainfrom
sh/CMP-10879-wasmMemory

Conversation

@Schahen

Copy link
Copy Markdown

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

Igor Demin (igordmn) and others added 30 commits July 27, 2026 11:57
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
…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
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
…3285)

Small addition to the
#3173
Added a possibility to enable logging to the file to simplify analysis
by the AI agent

## 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
…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
…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
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
## 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>
- 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.