From 7a6713f5baa9531f3870300fe24b356bd1483dbb Mon Sep 17 00:00:00 2001 From: Henrik Raitasola Date: Sat, 17 Oct 2026 09:26:43 +0700 Subject: [PATCH 1/2] fix(ios): keep checkbox states after inline images Checkbox states were keyed by their position in plainText, which has no image placeholders, but filtered by list ranges shifted by the number of preceding images. Every checkbox after an image lost or shifted its checked state. Key the states by the image-shifted position instead. Fixes #819 Co-Authored-By: Claude Opus 5.5 --- ios/htmlParser/HtmlParser.mm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ios/htmlParser/HtmlParser.mm b/ios/htmlParser/HtmlParser.mm index f710a7411..c730ad019 100644 --- a/ios/htmlParser/HtmlParser.mm +++ b/ios/htmlParser/HtmlParser.mm @@ -474,7 +474,12 @@ + (NSArray *_Nonnull)getTextAndStylesFromHtml:(NSString *_Nonnull)fixedHtml // Track checkbox state if we're inside a checkbox list if (insideCheckboxList) { BOOL isChecked = [currentTagParams containsString:@"checked"]; - checkboxStates[@(plainText.length)] = @(isChecked); + // Key by the position in the final NSTextStorage, which holds one + // placeholder per preceding image that 'plainText' doesn't have + // yet. This matches the image-shifted list range the states are + // later filtered by in prepareCheckboxListStyleValue:. + checkboxStates[@(plainText.length + precedingImageCount)] = + @(isChecked); } // Record the start location so we can check if it's empty when // closing From 008bb54e2b454d6a476da23790784e78f08d4627 Mon Sep 17 00:00:00 2001 From: Krystian Sienkiewicz Date: Wed, 21 Oct 2026 16:14:03 +0200 Subject: [PATCH 2/2] test(ios): add an ios e2e test --- .../flows/checkbox_after_images.yaml | 25 ++++++++++++++++++ .../screenshots/ios/checkbox_after_images.png | Bin 0 -> 9679 bytes 2 files changed, 25 insertions(+) create mode 100644 .maestro/enrichedInput/flows/checkbox_after_images.yaml create mode 100644 .maestro/enrichedInput/screenshots/ios/checkbox_after_images.png diff --git a/.maestro/enrichedInput/flows/checkbox_after_images.yaml b/.maestro/enrichedInput/flows/checkbox_after_images.yaml new file mode 100644 index 000000000..60bffc8ca --- /dev/null +++ b/.maestro/enrichedInput/flows/checkbox_after_images.yaml @@ -0,0 +1,25 @@ +appId: swmansion.enriched.example +tags: + - ios-only +--- +# PR #820 - fix(iOS): keep checkbox states after inline images +- launchApp + +- tapOn: + id: 'toggle-screen-button' + +- runFlow: + file: '../subflows/set_editor_value.yaml' + env: + VALUE: > + +

+
    +
  • B
  • +
+ + +- runFlow: + file: '../subflows/capture_or_assert_screenshot.yaml' + env: + SCREENSHOT_NAME: 'checkbox_after_images' diff --git a/.maestro/enrichedInput/screenshots/ios/checkbox_after_images.png b/.maestro/enrichedInput/screenshots/ios/checkbox_after_images.png new file mode 100644 index 0000000000000000000000000000000000000000..798496be3baebb8c29ef98cbd7f26d57bca908fe GIT binary patch literal 9679 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 D9SV?a literal 0 HcmV?d00001