Skip to content

Rich text + code editor API; dogfood CodeEditor in Playground#5272

Merged
liannacasper merged 11 commits into
masterfrom
rich-text-and-code-editor-api
Jun 25, 2026
Merged

Rich text + code editor API; dogfood CodeEditor in Playground#5272
liannacasper merged 11 commits into
masterfrom
rich-text-and-code-editor-api

Conversation

@shai-almog

@shai-almog shai-almog commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds two cross-platform native visual editors to Codename One.

  • RichTextArea — a WYSIWYG rich text / HTML editor: bold/italic/underline, lists, links, fore/highlight colors, headings, get/setHtml, change events, placeholder.
  • CodeEditor — an IDE-style editor: syntax highlighting (java/kotlin/js/python/css/xml/json/c), line-number gutter, light/dark themes, bracket/quote auto-close, async code completion (CodeCompletionProvider/CodeCompletion), and diagnostics (CodeDiagnostic → squiggly underlines + gutter markers + tooltips).

Both sit on AbstractEditorComponent, which speaks a semantic command/query/event channel with two interchangeable backends:

  1. A 100% cross-platform BrowserComponent engine (self-contained HTML/JS in the core jar) — iOS (WKWebView), Android (WebView), desktop (CEF), web (iframe), with native virtual-keyboard + physical-keyboard handling for free.
  2. An optional native backend a port may supply (CodenameOneImplementation#createNativeEditorPeer / editorPeerCommand / editorPeerQuery). CodeEditor#setEngineURL(...) also lets an app back the editor with a richer engine.

Conditional CodeMirror bundling

The Android/iOS builders detect com.codename1.ui.CodeEditor usage and gate optional CodeMirror bundling only when the API is used (CN1_USE_CODEMIRROR). The out-of-repo BuildDaemon copies are tracked separately.

Tests & docs

  • 33 deterministic unit tests (RichTextAreaTest, CodeEditorTest) via a new editor SPI backing in TestCodenameOneImplementation — green.
  • New RichTextArea + CodeEditor developer-guide sections with authentic screenshots.

Verification

  • Core compiles clean (JDK 25) and Java-5 clean (-source 1.5); maven-plugin builds; SpotBugs clean.
  • Unit tests pass (33/33). The built-in CodeEditor engine renders correctly (verified by rendering the exact engine HTML: syntax highlighting, a red wavy diagnostic squiggle + gutter marker, and the completion popup).

Notes / deferred

  • iOS black background fix: the native web widget is created transparent (WKWebView opaque=NO); the editor page now paints an opaque background and pins color-scheme so the dark peer no longer shows through.
  • Playground dogfood was proven locally against the in-repo core but is not in this PR — the Playground smoke test intentionally builds against the released CN1 (which lacks CodeEditor), so it can't compile there until the API ships in a release. Follow-up.
  • Screenshot-test screens were removed: the BrowserComponent-backed editors hang the screenshot suite on tvOS/watchOS (no reliable web view there, and those sub-platforms aren't distinguishable from iOS at runtime). The unit tests + engine render cover the editors.

🤖 Generated with Claude Code

…n Playground

Introduces two cross-platform native visual editors and proves the code editor
in the Codename One Playground.

Core (com.codename1.ui):
- RichTextArea: WYSIWYG rich text / HTML editor (bold/italic/lists/links/colors/
  headings, get/set HTML, change events, placeholder).
- CodeEditor: IDE-style editor with syntax highlighting, line-number gutter,
  light/dark themes, bracket/quote auto-close, async code completion
  (CodeCompletionProvider/CodeCompletion) and diagnostics (CodeDiagnostic:
  squiggly underlines + gutter markers + tooltips).
- AbstractEditorComponent: a semantic command/query/event channel with two
  interchangeable backends - a 100% cross-platform BrowserComponent fallback
  (works on every platform, native VKB + physical keyboard for free) and an
  optional native backend a port can supply (CodenameOneImplementation
  createNativeEditorPeer / editorPeerCommand / editorPeerQuery). CodeEditor also
  exposes setEngineURL(...) so an app can back it with a richer editor engine.

Builders: detect com.codename1.ui.CodeEditor usage and gate optional CodeMirror
bundling only when the API is used (AndroidGradleBuilder/IPhoneBuilder +
CN1_USE_CODEMIRROR placeholder in the iOS header). Mirror to BuildDaemon copies
is tracked separately (out of this repo).

Tests: 33 deterministic unit tests (RichTextAreaTest, CodeEditorTest) driven by a
new editor SPI backing in TestCodenameOneImplementation; screenshot-test screens
for both editors registered in the hellocodenameone suite (JS-port-skipped like
BrowserComponent).

Docs: new RichTextArea + CodeEditor developer-guide sections with authentic
screenshots.

Playground: PlaygroundBrowserEditor now uses CodeEditor on every non-web platform
(replacing the bare TextArea), with completion fed from the same CN1 API metadata
(PlaygroundCompletion), diagnostics, theme sync and Java/CSS modes. The web port
keeps Monaco unchanged (no regression), and a TextArea fallback engages
automatically where the platform web widget cannot initialise.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

Developer Guide build artifacts are available for download from this workflow run:

Developer Guide quality checks:

  • AsciiDoc linter: No issues found (report)
  • Vale: No alerts found (report)
  • Paragraph capitalization: No paragraph capitalization issues (report)
  • LanguageTool: No grammar matches (report)
  • Image references: No unused images detected (report)

@shai-almog

shai-almog commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 138 screenshots: 138 matched.

Native Android coverage

  • 📊 Line coverage: 14.55% (8932/61395 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 11.79% (43961/372771), branch 5.23% (1836/35075), complexity 6.25% (2098/33590), method 10.82% (1697/15689), class 17.63% (392/2223)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6327 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.ClassReader – 0.00% (0/1519 lines covered)
      • kotlin.collections.kotlin.collections.CollectionsKt___CollectionsKt – 0.00% (0/1148 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.MethodWriter – 0.00% (0/923 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/730 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/623 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.Frame – 0.00% (0/564 lines covered)
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysJvmKt – 0.00% (0/495 lines covered)
      • kotlinx.coroutines.kotlinx.coroutines.JobSupport – 0.00% (0/423 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 14.55% (8932/61395 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 11.79% (43961/372771), branch 5.23% (1836/35075), complexity 6.25% (2098/33590), method 10.82% (1697/15689), class 17.63% (392/2223)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6327 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.ClassReader – 0.00% (0/1519 lines covered)
      • kotlin.collections.kotlin.collections.CollectionsKt___CollectionsKt – 0.00% (0/1148 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.MethodWriter – 0.00% (0/923 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/730 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/623 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.Frame – 0.00% (0/564 lines covered)
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysJvmKt – 0.00% (0/495 lines covered)
      • kotlinx.coroutines.kotlinx.coroutines.JobSupport – 0.00% (0/423 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 226ms / native 147ms = 1.5x speedup
SIMD float-mul (64K x300) java 114ms / native 130ms = 0.8x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 191.000 ms
Base64 CN1 decode 223.000 ms
Base64 native encode 866.000 ms
Base64 encode ratio (CN1/native) 0.221x (77.9% faster)
Base64 native decode 998.000 ms
Base64 decode ratio (CN1/native) 0.223x (77.7% faster)
Image encode benchmark status skipped (SIMD unsupported)

@github-actions

Copy link
Copy Markdown
Contributor

Cloudflare Preview

@shai-almog

shai-almog commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 136 screenshots: 136 matched.
Native Linux port (x64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub x64 runner. Baseline: scripts/linux/screenshots.

@shai-almog

shai-almog commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 136 screenshots: 136 matched.
Native Linux port (arm64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub arm64 runner. Baseline: scripts/linux/screenshots-arm.

@shai-almog

shai-almog commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 130 screenshots: 130 matched.
✅ JavaScript-port screenshot tests passed.

@shai-almog

shai-almog commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 134 screenshots: 134 matched.
Native Windows port, REAL shipping pipeline: the hellocodenameone screenshot suite rendered by a binary CROSS-COMPILED on Linux (clang-cl + xwin, WebView2 linked) and RUN on a Windows x64 runner. Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 50ms / native 2ms = 25.0x speedup
SIMD float-mul (64K x300) java 51ms / native 3ms = 17.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 256.000 ms
Base64 CN1 decode 142.000 ms
Base64 SIMD encode 106.000 ms
Base64 encode ratio (SIMD/CN1) 0.414x (58.6% faster)
Base64 SIMD decode 100.000 ms
captureWindowToPngBytes window target is not WIC-backed

@shai-almog

shai-almog commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 136 screenshots: 136 matched.
✅ Native Mac screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 157 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 61ms / native 7ms = 8.7x speedup
SIMD float-mul (64K x300) java 63ms / native 3ms = 21.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 592.000 ms
Base64 CN1 decode 248.000 ms
Base64 native encode 1381.000 ms
Base64 encode ratio (CN1/native) 0.429x (57.1% faster)
Base64 native decode 562.000 ms
Base64 decode ratio (CN1/native) 0.441x (55.9% faster)
Base64 SIMD encode 68.000 ms
Base64 encode ratio (SIMD/CN1) 0.115x (88.5% faster)
Base64 SIMD decode 56.000 ms
Base64 decode ratio (SIMD/CN1) 0.226x (77.4% faster)
Base64 encode ratio (SIMD/native) 0.049x (95.1% faster)
Base64 decode ratio (SIMD/native) 0.100x (90.0% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 90.000 ms
Image createMask (SIMD on) 2.000 ms
Image createMask ratio (SIMD on/off) 0.022x (97.8% faster)
Image applyMask (SIMD off) 181.000 ms
Image applyMask (SIMD on) 116.000 ms
Image applyMask ratio (SIMD on/off) 0.641x (35.9% faster)
Image modifyAlpha (SIMD off) 155.000 ms
Image modifyAlpha (SIMD on) 115.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.742x (25.8% faster)
Image modifyAlpha removeColor (SIMD off) 196.000 ms
Image modifyAlpha removeColor (SIMD on) 144.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.735x (26.5% faster)

@shai-almog

shai-almog commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 213 screenshots: 213 matched.
✅ Native Apple Watch (watchOS, Core Graphics) screenshot tests passed.

@shai-almog

shai-almog commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 135 screenshots: 135 matched.
✅ Native Apple TV (tvOS, Metal) screenshot tests passed.

@shai-almog

shai-almog commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 133 screenshots: 133 matched.
✅ Native iOS screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 278 seconds

Build and Run Timing

Metric Duration
Simulator Boot 97000 ms
Simulator Boot (Run) 1000 ms
App Install 24000 ms
App Launch 4000 ms
Test Execution 454000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 162ms / native 3ms = 54.0x speedup
SIMD float-mul (64K x300) java 72ms / native 3ms = 24.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 628.000 ms
Base64 CN1 decode 396.000 ms
Base64 native encode 1178.000 ms
Base64 encode ratio (CN1/native) 0.533x (46.7% faster)
Base64 native decode 1497.000 ms
Base64 decode ratio (CN1/native) 0.265x (73.5% faster)
Base64 SIMD encode 170.000 ms
Base64 encode ratio (SIMD/CN1) 0.271x (72.9% faster)
Base64 SIMD decode 169.000 ms
Base64 decode ratio (SIMD/CN1) 0.427x (57.3% faster)
Base64 encode ratio (SIMD/native) 0.144x (85.6% faster)
Base64 decode ratio (SIMD/native) 0.113x (88.7% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 26.000 ms
Image createMask (SIMD on) 3.000 ms
Image createMask ratio (SIMD on/off) 0.115x (88.5% faster)
Image applyMask (SIMD off) 124.000 ms
Image applyMask (SIMD on) 285.000 ms
Image applyMask ratio (SIMD on/off) 2.298x (129.8% slower)
Image modifyAlpha (SIMD off) 194.000 ms
Image modifyAlpha (SIMD on) 171.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.881x (11.9% faster)
Image modifyAlpha removeColor (SIMD off) 265.000 ms
Image modifyAlpha removeColor (SIMD on) 238.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.898x (10.2% faster)

@shai-almog

shai-almog commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 137 screenshots: 137 matched.
✅ Native iOS Metal screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 309 seconds

Build and Run Timing

Metric Duration
Simulator Boot 67000 ms
Simulator Boot (Run) 1000 ms
App Install 11000 ms
App Launch 1000 ms
Test Execution 366000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 339ms / native 4ms = 84.7x speedup
SIMD float-mul (64K x300) java 258ms / native 5ms = 51.6x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 737.000 ms
Base64 CN1 decode 570.000 ms
Base64 native encode 1706.000 ms
Base64 encode ratio (CN1/native) 0.432x (56.8% faster)
Base64 native decode 546.000 ms
Base64 decode ratio (CN1/native) 1.044x (4.4% slower)
Base64 SIMD encode 289.000 ms
Base64 encode ratio (SIMD/CN1) 0.392x (60.8% faster)
Base64 SIMD decode 65.000 ms
Base64 decode ratio (SIMD/CN1) 0.114x (88.6% faster)
Base64 encode ratio (SIMD/native) 0.169x (83.1% faster)
Base64 decode ratio (SIMD/native) 0.119x (88.1% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 57.000 ms
Image createMask (SIMD on) 26.000 ms
Image createMask ratio (SIMD on/off) 0.456x (54.4% faster)
Image applyMask (SIMD off) 245.000 ms
Image applyMask (SIMD on) 249.000 ms
Image applyMask ratio (SIMD on/off) 1.016x (1.6% slower)
Image modifyAlpha (SIMD off) 198.000 ms
Image modifyAlpha (SIMD on) 188.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.949x (5.1% faster)
Image modifyAlpha removeColor (SIMD off) 192.000 ms
Image modifyAlpha removeColor (SIMD on) 107.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.557x (44.3% faster)

shai-almog and others added 3 commits June 23, 2026 20:17
- iOS: RichTextArea showed black because the native web widget is created
  transparent (WKWebView opaque=NO) and the editor page had no background, so the
  dark peer showed through. Give the page an opaque white background and pin
  color-scheme:light (also on CodeEditor) so device dark mode does not invert it.
- SpotBugs (build-test 8): remove the unread pendingText/pendingHtml fields, make
  CodeEditorHtml.PAGE a runtime constant (static initializer) so the ~13KB string
  is not inlined/duplicated into other classes, and convert the three flagged
  anonymous callbacks into named static nested classes.
- Vale (developer guide): fix five contraction/style alerts in the new sections.
- Screenshot tests: remove RichTextArea/CodeEditor screenshot screens. The
  BrowserComponent-backed editors hang the screenshot suite on tvOS/watchOS (no
  reliable web view there, and those sub-platforms can't be distinguished from
  iOS at runtime). The 33 unit tests + engine rendering already cover the editors.
- Playground: revert the CodeEditor dogfood from this PR. The Playground smoke
  test intentionally builds against the released CN1 (which lacks CodeEditor), so
  the integration can't compile there yet; it lands once CodeEditor ships in a
  release. Proven locally against the in-repo core.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- PMD gate (build-test): add the required @OverRide annotations, make
  CodeEditorHtml final, and convert index for-loops to foreach.
- LanguageTool gate (build): hyphenate "cross-platform" in the dev guide.
- Re-add RichTextArea/CodeEditor screenshot screens with a hard-bounded capture
  (fires shortly after the editor is ready, or after a few seconds regardless) so
  platforms that can't render/capture the web peer produce a screenshot instead of
  stalling the suite. Goldens to be recorded from CI artifacts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Checkstyle: re-indent the CodeEditorHtml.PAGE static-initializer continuation
  to 12 spaces (the static {} block adds an indentation level).
- Record RichTextArea/CodeEditor screenshot goldens from the CI artifacts for
  every platform that runs the suite: ios, ios-metal, ios-tv, ios-watch,
  mac-native and javascript. The capture is rendered on iOS/Metal (real editor
  with syntax highlighting + gutter), and a deterministic blank/black peer on
  platforms that don't capture peer-component pixels (tvOS/watchOS/JS) - all
  stable goldens. A small per-test .tolerance absorbs web-render AA variance.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

✅ Continuous Quality Report

Test & Coverage

Static Analysis

  • SpotBugs [Report archive]
    • ByteCodeTranslator: 0 findings (no issues)
    • android: 0 findings (no issues)
    • codenameone-maven-plugin: 0 findings (no issues)
    • core-unittests: 0 findings (no issues)
    • ios: 0 findings (no issues)
  • PMD: 0 findings (no issues) [Report archive]
  • Checkstyle: 0 findings (no issues) [Report archive]

Generated automatically by the PR CI workflow.

shai-almog and others added 7 commits June 24, 2026 04:02
These suites also run the editor tests (Android/iOS native WebView renders the
editor; Linux/Windows capture a deterministic blank peer). Their gate tolerates a
missing golden so CI was green, but the screenshots showed up as new -- record
them from the CI artifacts so every platform's golden set is complete.
The CodeEditor page used color-scheme 'light dark'; on iOS the WKWebView base
background then follows the device appearance, so a capture that beats the page's
first paint shows black in dark appearance (RichTextArea already pinned 'light'
and was unaffected). Pin CodeEditor to color-scheme 'light' too, and lengthen the
screenshot settle/bound so the rendered content is reliably on screen before
capture. Goldens (rendered state) are unchanged.
…tor capture

- linux-build-run.yml: the screenshot compare job was report-only; gate it now
  (CN1SS_FAIL_ON_MISMATCH=1, fail on missing_expected) for BOTH x64 and arm64 so
  the Linux baselines stay in sync.
- Seed the editor goldens for the Linux ARM baseline (scripts/linux/screenshots-arm),
  which were missing; re-record x64 from the latest run for consistency.
- JavaScript port: skip the RichTextArea/CodeEditor screenshot tests. The JS-port
  screenshot is CN1's internal canvas render streamed by the app, which never
  includes the editor's DOM <iframe> peer, so the capture is always blank (same
  reason BrowserComponentScreenshotTest is skipped on JS). Drop the blank JS
  goldens; iOS/Android capture the native web view and DO render these.
The JS port streams CN1's internal canvas render, which never includes the
editor's DOM <iframe> peer, so RichTextArea/CodeEditor capture as a
deterministic blank there. The earlier shouldForceTimeoutInHtml5 skip did NOT
suppress that frame (the app still streams it), so removing the JS goldens left
them reported as "Reference screenshot missing". Revert to the working config:
run the editor tests on JS (like every other port) and commit the blank JS
goldens so the baseline is in sync.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…race

On fresh GitHub macOS runners the first xcodebuild against a freshly-generated
project occasionally runs before Xcode has enumerated its build destinations,
so the Mac Catalyst build aborts in ~2s with an empty "Available destinations"
list and "Unable to find a destination matching { platform:macOS, variant:Mac
Catalyst }". It is a destination-cache race, not a missing component (Catalyst
is the host macOS SDK already in Xcode -- nothing to download) and not a code
error (the same project builds ~71% of the time).

Mirror what the iOS scripts already do: poll -showdestinations until the
Catalyst destination is listed (up to 90s) before building, and retry the build
up to 3x but ONLY when the log shows the destination-resolution race -- a real
clang/link failure still fails fast.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@liannacasper liannacasper merged commit 68ef229 into master Jun 25, 2026
48 checks passed
@liannacasper liannacasper deleted the rich-text-and-code-editor-api branch June 25, 2026 09:03
shai-almog added a commit that referenced this pull request Jun 26, 2026
…s, integrity) (#5289)

* Blog: weekly release series (analytics, maps, TV, editors, integrity)

Adds the weekly release blog series for the 2026-06-26 cycle: a parent
roundup framed around funding open source without the "bait and switch"
(GPL+CE + optional SPI-backed paid services), plus five feature follow-ups.

Posts (docs/website/content/blog):
- funding-open-source-without-the-bait-and-switch (parent, Fri)
- vector-and-native-maps (Sat) - PR #5264
- rich-text-and-code-editing (Sun) - PR #5272
- privacy-first-analytics (Mon) - PR #5266
- apple-tv-and-android-tv (Tue) - PR #5261
- device-integrity-and-app-review (Wed) - PRs #5277 / #5268
Thursday's Game Builder tutorial 2 already exists and is linked.

Each post carries a generated hero image, real in-body screenshots
(maps, editors, app-review widget, a 4K Apple TV ChatView render) and/or
a mermaid diagram. All code samples were verified against the merged
source APIs (MapView/MapStyle, the Analytics SPI + consent gate,
CodeEditor/RichTextArea, DeviceIntegrity, AppReview) and the CSS uses the
real @media device-tv / device-watch syntax.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Blog: fix prose-gate findings (accept-list, vocab, typography, sentence starts)

Resolve the 30 net-new blog-prose-gate findings:
- LanguageTool accept-list: leanback, Classpath, relicense, forkable,
  kotlin, dogfood
- Vale CodenameOne vocab: facade (suppresses proselint.Diacritical)
- mermaid node labels read as prose, so Analytics.event(...) -> event()
- reword four parent sentences that began with a {{< post-link >}}
  shortcode (stripped before lint -> lowercase sentence start)
- Oxford comma, 320x180 -> 320x180 (x sign), 'and so on' -> 'among others',
  'to snapshot' reworded

Vale runs clean (0 findings) locally on all six posts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Blog: revise series per review feedback

Parent: fix the 'every service ships behind an SPI' claim (services are
optional, we win on integration depth, e.g. crash protection via the build
servers); correct the 'We Will Not Sabotage Your Code' callback (weeks, not
years); drop 'genuinely/honest'; note analytics is included down to the basic
tier with data retention as the gate; non-Google-Play maps differentiator;
banking-customer hardening for DeviceIntegrity; respectful TeaVM/JS-port
wording, drop undocumented 'local-javascript', JS port now aligned and in
final production-ready stages; 'feature deep-dives' instead of links 'going
live'; comments-below for feedback.

Analytics: add the first-party backend section with two console screenshots
(Overview KPIs, Events, Segments, User flow, Goals, Reports), built-in
purchase events and goals; drop 'honest'.

Maps: de-cringe opener, stop overstating peer z-order, refocus on vendor
lock-in without deriding native maps, native-Mac screenshot attribution,
'code still works', drop the iOS-sim validation line, 'The tradeoff'.

Editors: remove the iOS transparent-webview anecdote and 'We did run the thing'.
TV: remove the TVOS_PORT.md guards aside. Device: trim the guarantee sentence,
drop the 'I promised' opener.

Vale runs clean (0 findings) locally on all six posts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.

2 participants