Skip to content

Bump bundled JCEF/CEF to 146.0.10 to fix macOS BrowserComponent crash (supersedes Fontations flag workaround) - #5525

Merged
shannah merged 6 commits into
masterfrom
claude/browsercomponent-macos-crash-wksb4w
Aug 6, 2026
Merged

Bump bundled JCEF/CEF to 146.0.10 to fix macOS BrowserComponent crash (supersedes Fontations flag workaround)#5525
shannah merged 6 commits into
masterfrom
claude/browsercomponent-macos-crash-wksb4w

Conversation

@shannah

@shannah shannah commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

Problem

On macOS 15.4.x (Apple Silicon), the JavaSE simulator's embedded BrowserComponent crashes the JVM with exit code 133 (SIGTRAP) as soon as it paints. The crash is entirely inside the bundled Chromium Embedded Framework (JCEF 135.0.20 / CEF 135 / Chromium 135) on the CrBrowserMain thread:

Chromium Embedded Framework  fontations_ffi$cxxbridge1$has_any_color_table
Chromium Embedded Framework  blink$cxxbridge1$crash_in_rust_with_overflow

Chromium 135's Skia Fontations (Rust) font backend panics in its color-table code path while laying out fonts. This is simulator-only — iOS (WKWebView) and Android (system WebView) are unaffected — but it makes the simulator unusable for any app showing a BrowserComponent on recent macOS.

Fix: bump the bundled CEF/Chromium

The real fix is upstream in Chromium ("disable Fontations FontConfig indexing and disregard corrupted font caches"), so this PR moves the bundled CEF forward rather than relying on a Chromium switch:

Old New
jcefmaven 135.0.20 146.0.10
CEF 135 146
Chromium 135.0.7049.85 146.0.7680.179

This supersedes the earlier flag-only workaround on this branch. --disable-features=FontationsFontBackend does not reliably stop this particular crash — it governs the renderer web-font path, not the color-font path that panics, and is known upstream not to fully take effect. The switch is kept as a low-risk, macOS-gated safety net (still overridable via -Dcef.disableFeatures); it is harmless on the newer CEF.

Transitive-dependency fallout of the bump

JCEF Maven 146 pulls commons-compress 1.28.0, whose GzipCompressorInputStream calls AbstractStreamBuilder.getInputStream() and therefore requires commons-io 2.20.0. With an older commons-io on the classpath, native-bundle extraction throws IllegalAccessError at startup (the BrowserComponent never paints). The repo previously pinned commons-io 2.16.1, so the bump had to carry a matching commons-io update through every path that assembles the simulator classpath (Maven reactor, the javase module's own POM for standalone consumers, and the legacy Ant helper-jar script).

Files touched

  • maven/pom.xml
    • jcefmaven.version146.0.10, and jcef.versionjcef-d3de827+cef-146.0.10+g8219561+chromium-146.0.7680.179. That jcef.version string is the exact me.friwi:jcef-api build tag that jcefmaven 146.0.10 depends on transitively (verified against jcefmaven's pom); scripts/ci-install-upstream-jcef-jar.sh downloads jcef-api by this string for the legacy Ant build.
    • dependencyManagement bump of commons-io 2.16.1 → 2.20.0. Because dependencyManagement overrides transitive versions regardless of a downstream module's direct pin, this is what actually fixes the CI CEF/FFmpeg smoke app (a reactor module that pulls codenameone-javase transitively).
  • maven/javase/pom.xml — pins commons-io 2.20.0 directly (with an updated rationale comment). This keeps standalone consumers of codenameone-javase — which don't inherit the reactor's dependencyManagement — on 2.20.0 as well.
  • scripts/ci-install-upstream-jcef-jar.sh — aligns the helper jars installed for the legacy Ant build (commons-compress 1.28.0, commons-codec 1.19.0, commons-io 2.20.0, commons-lang3 3.18.0) with what jcefmaven 146 resolves, plus a comment explaining they must track jcefmaven.version.
  • Ports/JavaSE/src/com/codename1/impl/javase/cef/CEFBrowserComponent.java
    • Javadoc updated to note the crash is fixed upstream in the newer CEF and the FontationsFontBackend switch is retained only as a safety net.
    • Behavior change (safety net): on macOS, createArgs() appends --disable-features=FontationsFontBackend by default; -Dcef.disableFeatures=<value> overrides it (empty value disables the default). The final computed CEF argument list is logged via the Codename One Log facility at DEBUG.

Verification

  • Both new artifacts resolve from Maven Central: me.friwi:jcefmaven:146.0.10 and me.friwi:jcef-api:jcef-d3de827+cef-146.0.10+g8219561+chromium-146.0.7680.179.
  • jcefmaven 146.0.10's pom declares the jcef-api dependency at exactly the jcef.version string above.
  • Local macOS run (Apple Silicon) confirmed the JCEF 135 Fontations SIGTRAP is gone with 146 — the simulator now proceeds into native extraction (which is where the commons-io mismatch surfaced and was then fixed).
  • PR CI build-test / static-analysis legs are green on the tip; the CEF/FFmpeg smoke matrix (ubuntu/windows/macos) exercises the extraction path that the commons-io fix targets.
  • On-device confirmation of paint-without-crash on macOS 15.4+ Apple Silicon is still the definitive check — there is no macOS host in CI for the native BrowserComponent paint.

🤖 Generated with Claude Code

Chromium 135 (CEF 135 / JCEF 135.0.20) bundled with the JavaSE simulator
ships the Skia "Fontations" Rust font backend. On recent macOS it panics
in its color-table code path (has_any_color_table ->
crash_in_rust_with_overflow) while laying out fonts, killing the simulator
JVM with SIGTRAP (exit 133) as soon as a BrowserComponent paints.

Pass --disable-features=FontationsFontBackend to CEF so Chromium falls back
to the FreeType backend. The switch is added to the jcef args in
CEFBrowserComponent.createArgs() (jcefmaven makes
onBeforeCommandLineProcessing final, so args must be supplied to the
builder). Chromium propagates --disable-features to the CEF helper
subprocesses automatically via its FeatureList mechanism.

- Gated to macOS so Windows/Linux behavior is unchanged.
- Overridable via the -Dcef.disableFeatures system property (used verbatim
  when set, on any platform).
- Simulator-only; the iOS (WKWebView) and Android (system WebView) ports
  are untouched.
- Logs the final CEF arg list at startup for verification.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017xWRvY1jXzi3522dBqFraD
Copilot AI lite review requested due to automatic review settings August 5, 2026 19:52

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR addresses a macOS-only JavaSE simulator crash in the embedded CEF-based BrowserComponent by disabling Chromium’s Fontations font backend via --disable-features=FontationsFontBackend, with an override mechanism for advanced users.

Changes:

  • Adds a macOS default for Chromium --disable-features to disable FontationsFontBackend.
  • Introduces -Dcef.disableFeatures=... to override the --disable-features value (or disable the default).
  • Emits the final computed CEF argument list at startup.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +119 to +122
* System property that overrides the value passed to Chromium's
* {@code --disable-features} switch. When set (even to the empty string) it is
* used verbatim; when unset the platform default from {@link #defaultDisableFeatures()}
* is applied.
args.add("--disable-features=" + disableFeatures);
}

System.out.println("CEF Args: " + args);
…ntics

- Log the final CEF arg list via com.codename1.io.Log (Log.DEBUG) instead of
  System.out, matching the rest of the CEF integration (JavaCEFSEPort) so it
  respects the log level/redirection rather than always writing to stdout.
- Correct the cef.disableFeatures Javadoc to match the implementation: a
  non-empty value is used verbatim, and an empty value clears the default so
  no --disable-features switch is passed (the switch was never emitted for an
  empty value).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017xWRvY1jXzi3522dBqFraD
Copilot AI review requested due to automatic review settings August 5, 2026 19:58
@github-actions

github-actions Bot commented Aug 5, 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

shai-almog commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

Compared 12 screenshots: 12 matched.
✅ JavaSE simulator integration screenshots matched stored baselines.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.

Suppressed comments (2)

Ports/JavaSE/src/com/codename1/impl/javase/cef/CEFBrowserComponent.java:126

  • DISABLE_FEATURES_PROPERTY is only used inside this class, so it can be private to avoid expanding the package API surface unnecessarily.
    static final String DISABLE_FEATURES_PROPERTY = "cef.disableFeatures";

Ports/JavaSE/src/com/codename1/impl/javase/cef/CEFBrowserComponent.java:184

  • The log message is built eagerly ("CEF Args: " + args), even when DEBUG logging is disabled. Guarding it avoids the extra toString()/allocation work when Log.getLevel() is higher than DEBUG.
        Log.p("CEF Args: " + args, Log.DEBUG);

The JavaSE simulator renders BrowserComponent via me.friwi:jcefmaven, pinned
to CEF/Chromium 135. Chromium 135's Skia "Fontations" Rust font backend
panics on macOS (fontations_ffi ... has_any_color_table ->
crash_in_rust_with_overflow, SIGTRAP / exit 133) as soon as a
BrowserComponent paints.

--disable-features=FontationsFontBackend (added earlier on this branch, see
PR #5525) does not reliably stop this particular crash -- it governs the
renderer web-font path, not the color-font path that panics, and is known
upstream not to fully take effect. The real fix is upstream in a newer
Chromium ("disable Fontations FontConfig indexing and disregard corrupted
font caches"), so this bumps the bundled CEF instead of relying on the flag.

  jcefmaven 135.0.20 (CEF 135 / Chromium 135.0.7049.85)
    -> jcefmaven 146.0.10 (CEF 146 / Chromium 146.0.7680.179)

- maven/pom.xml: update jcefmaven.version and jcef.version. The jcef.version
  is the exact me.friwi:jcef-api build tag jcefmaven 146.0.10 depends on
  transitively (jcef-d3de827+cef-146.0.10+g8219561+chromium-146.0.7680.179);
  scripts/ci-install-upstream-jcef-jar.sh downloads jcef-api by this string
  for the Ant build. Both artifacts confirmed resolvable from Maven Central.
- CEFBrowserComponent: keep the macOS-gated FontationsFontBackend switch as a
  low-risk safety net (still overridable via -Dcef.disableFeatures) and note
  in the Javadoc that the crash is fixed upstream in the newer CEF.

scripts/ci-install-upstream-jcef-jar.sh, maven/javase/pom.xml and
CN1JcefRuntimeTest.java read the version from maven/pom.xml / the property
and hardcode no version, so they need no change.

On-device confirmation of paint-without-crash on macOS 15.4+ Apple Silicon is
still required (no macOS host in CI).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017xWRvY1jXzi3522dBqFraD
Copilot AI review requested due to automatic review settings August 6, 2026 01:08
@shannah shannah changed the title Fix macOS BrowserComponent SIGTRAP crash in JavaSE simulator (CEF 135 Fontations) Bump bundled JCEF/CEF to 146.0.10 to fix macOS BrowserComponent crash (supersedes Fontations flag workaround) Aug 6, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 2 out of 2 changed files in this pull request and generated no new comments.

Suppressed comments (2)

Ports/JavaSE/src/com/codename1/impl/javase/cef/CEFBrowserComponent.java:188

  • This adds a new debug log line printing the full CEF argument list. Since the PR description states behavior is unchanged in this file, either document this behavioral change (log output) in the PR description or gate it behind an explicit debug/system property so it doesn’t change default simulator logging.
        Log.p("CEF Args: " + args, Log.DEBUG);

Ports/JavaSE/src/com/codename1/impl/javase/cef/CEFBrowserComponent.java:186

  • The PR description says this file’s changes are Javadoc-only / “behavior unchanged”, but createArgs() now conditionally adds a new Chromium flag (--disable-features=...) based on the cef.disableFeatures system property and a macOS default. If this behavior change is intended as the retained safety net, please update the PR description accordingly; otherwise revert/guard this block to keep runtime args unchanged.

This issue also appears on line 188 of the same file.

        String prop = System.getProperty(DISABLE_FEATURES_PROPERTY);
        String disableFeatures = prop != null ? prop : defaultDisableFeatures();
        if (disableFeatures != null && disableFeatures.length() > 0) {
            args.add("--disable-features=" + disableFeatures);
        }

@shai-almog

shai-almog commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

Compared 151 screenshots: 151 matched.

Native Android coverage

  • 📊 Line coverage: 8.04% (7799/97060 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 8.04% (41436/515259), branch 2.86% (1391/48675), complexity 3.19% (1664/52236), method 4.90% (1355/27630), class 10.00% (368/3680)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6367 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • kotlin.collections.kotlin.collections.CollectionsKt___CollectionsKt – 0.00% (0/1187 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/736 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/625 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.Frame – 0.00% (0/570 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 8.04% (7799/97060 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 8.04% (41436/515259), branch 2.86% (1391/48675), complexity 3.19% (1664/52236), method 4.90% (1355/27630), class 10.00% (368/3680)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6367 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • kotlin.collections.kotlin.collections.CollectionsKt___CollectionsKt – 0.00% (0/1187 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/736 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/625 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.Frame – 0.00% (0/570 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 242ms / native 111ms = 2.1x speedup
SIMD float-mul (64K x300) java 203ms / native 185ms = 1.0x 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 75.000 ms
Base64 CN1 decode 91.000 ms
Base64 native encode 328.000 ms
Base64 encode ratio (CN1/native) 0.229x (77.1% faster)
Base64 native decode 300.000 ms
Base64 decode ratio (CN1/native) 0.303x (69.7% faster)
Image encode benchmark status skipped (SIMD unsupported)

After bumping to jcefmaven 146.0.10, the CEF+ffmpeg smoke test (and a real
BrowserComponent app on macOS) failed at native-bundle extraction with:

  java.lang.IllegalAccessError: class ...compress.compressors.gzip
  .GzipCompressorInputStream tried to access protected method
  ...commons.io.build.AbstractStreamBuilder.getInputStream()
  at me.friwi.jcefmaven.impl.step.extract.TarGzExtractor.extractTarGZ

JCEF Maven 146 pulls commons-compress 1.28.0, which calls
AbstractStreamBuilder.getInputStream() and declares commons-io 2.20.0. The
javase module pinned commons-io to 2.16.1 (sized for the old commons-compress
1.27.1 under jcefmaven 135), so the mismatch broke extraction. Note the crash
happened AFTER CEF 146 downloaded and began extracting -- i.e. past the
Fontations SIGTRAP the version bump set out to fix.

- maven/javase/pom.xml: pin commons-io 2.16.1 -> 2.20.0 to match
  commons-compress 1.28.0's requirement.
- scripts/ci-install-upstream-jcef-jar.sh: bump the Ant build's helper jars to
  the versions jcefmaven 146 resolves (commons-compress 1.28.0, commons-io
  2.20.0, commons-codec 1.19.0, commons-lang3 3.18.0) so the Ant JavaSE build
  extracts the native bundle with the same, compatible stack.

All four artifacts confirmed resolvable from Maven Central.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017xWRvY1jXzi3522dBqFraD
Copilot AI review requested due to automatic review settings August 6, 2026 01:30

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.

Suppressed comments (4)

maven/javase/pom.xml:157

  • PR description states no change is needed in maven/javase/pom.xml, but this PR does change it (pins commons-io to 2.20.0 and updates the explanatory comment). Please update the PR description (or revert this change if it’s not intended) so reviewers/CI triage have an accurate inventory of touched files.
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.20.0</version>
        </dependency>

scripts/ci-install-upstream-jcef-jar.sh:63

  • PR description says no change is needed in scripts/ci-install-upstream-jcef-jar.sh, but this PR updates the helper jar versions (commons-compress/codec/io/lang3) and adds new rationale comments. Please update the PR description (or revert the script changes if they’re not intended) so it accurately lists all modified files and behavioral impacts on the legacy Ant build.
install_artifact me/friwi jcef-api "$jcef_ver" jcef.jar
install_artifact me/friwi jcefmaven "$jcefmaven_ver" jcefmaven.jar
# These helper jars mirror JCEF Maven's transitive dependencies for the Ant
# build. Keep them aligned with the versions jcefmaven.version actually resolves
# (JCEF Maven 146 -> commons-compress 1.28.0, which in turn requires commons-io
# 2.20.0; a stale commons-io throws IllegalAccessError while extracting the
# native bundle). commons-codec/commons-lang3 track commons-compress 1.28.0.
install_artifact org/apache/commons commons-compress 1.28.0 commons-compress.jar
install_artifact com/google/code/gson gson 2.11.0 gson.jar
install_artifact commons-codec commons-codec 1.19.0 commons-codec.jar
install_artifact commons-io commons-io 2.20.0 commons-io.jar
install_artifact org/apache/commons commons-lang3 3.18.0 commons-lang3.jar

Ports/JavaSE/src/com/codename1/impl/javase/cef/CEFBrowserComponent.java:189

  • PR description says the CEFBrowserComponent change is Javadoc-only and that behavior is unchanged, but this patch adds runtime behavior: it conditionally appends a new Chromium arg (--disable-features=...) based on a system property/default and also logs the full CEF args list. Please update the PR description (or adjust the code) so the documented scope matches the actual behavior changes.
        String prop = System.getProperty(DISABLE_FEATURES_PROPERTY);
        String disableFeatures = prop != null ? prop : defaultDisableFeatures();
        if (disableFeatures != null && disableFeatures.length() > 0) {
            args.add("--disable-features=" + disableFeatures);
        }

        Log.p("CEF Args: " + args, Log.DEBUG);
        return args.toArray(new String[args.size()]);

maven/javase/pom.xml:151

  • The comment says the reactor manages Commons IO at 2.14.0, but the root maven/pom.xml dependencyManagement currently pins commons-io to 2.16.1. This comment should be updated so it stays accurate for future bumps/debugging.
             otherwise manages Commons IO at 2.14.0, so pin it here. Keep this in

The previous commit pinned commons-io 2.20.0 in maven/javase/pom.xml, but the
root reactor's dependencyManagement still forced commons-io 2.16.1. Any reactor
module that pulls codenameone-javase transitively -- notably the
javase-cef-ffmpeg-smoke app used by the CI smoke test -- has commons-io managed
back down to 2.16.1, so it kept hitting the IllegalAccessError from
commons-compress 1.28.0 during JCEF native extraction even after the javase pin.

dependencyManagement overrides transitive versions regardless of a downstream
module's direct pin, so the managed version must move too. Bump the reactor
management to 2.20.0 to match commons-compress 1.28.0 (and the javase pin).
commons-codec/commons-lang3/commons-compress are not reactor-managed, so they
already resolve to the versions JCEF Maven 146 needs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017xWRvY1jXzi3522dBqFraD
Copilot AI review requested due to automatic review settings August 6, 2026 01:39

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.

Suppressed comments (3)

maven/javase/pom.xml:151

  • The comment claims the reactor otherwise manages Commons IO at 2.14.0, but there is no such version pin elsewhere in this reactor (and the root pom now manages commons-io to 2.20.0). This makes the rationale misleading and likely to go stale again; please reword to avoid a specific outdated version number.
             otherwise manages Commons IO at 2.14.0, so pin it here. Keep this in

scripts/ci-install-upstream-jcef-jar.sh:58

  • The PR description says no change was needed in scripts/ci-install-upstream-jcef-jar.sh and that it hardcodes no version strings, but this change updates hardcoded helper-jar versions (commons-compress/codecs/io/lang3). Please update the PR description (or its "Files touched"/"No change needed" sections) to reflect this so maintainers know these pins must stay aligned with jcefmaven.version.
# These helper jars mirror JCEF Maven's transitive dependencies for the Ant
# build. Keep them aligned with the versions jcefmaven.version actually resolves
# (JCEF Maven 146 -> commons-compress 1.28.0, which in turn requires commons-io
# 2.20.0; a stale commons-io throws IllegalAccessError while extracting the
# native bundle). commons-codec/commons-lang3 track commons-compress 1.28.0.

Ports/JavaSE/src/com/codename1/impl/javase/cef/CEFBrowserComponent.java:186

  • The PR description states CEFBrowserComponent behavior is unchanged, but createArgs() now conditionally adds a new Chromium argument (--disable-features=...) by default on macOS (unless -Dcef.disableFeatures overrides it). Please update the PR description to reflect this behavioral change so it’s clear the safety-net flag is being applied by default.
        String prop = System.getProperty(DISABLE_FEATURES_PROPERTY);
        String disableFeatures = prop != null ? prop : defaultDisableFeatures();
        if (disableFeatures != null && disableFeatures.length() > 0) {
            args.add("--disable-features=" + disableFeatures);
        }

@shai-almog

shai-almog commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

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

The comment claimed the reactor manages commons-io at 2.14.0, but the root
reactor dependencyManagement now pins it to 2.20.0 (matching this direct pin).
Reword to describe why the direct pin remains -- it keeps standalone consumers
of codenameone-javase, which don't inherit the reactor's dependencyManagement,
on commons-io 2.20.0 as well. Addresses Copilot review feedback.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017xWRvY1jXzi3522dBqFraD
Copilot AI review requested due to automatic review settings August 6, 2026 02:45

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.

@shannah
shannah marked this pull request as ready for review August 6, 2026 03:15
@shai-almog

shai-almog commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

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

@shai-almog

shai-almog commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

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

@shai-almog

shai-almog commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

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

Benchmark Results

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

Build and Run Timing

Metric Duration
Simulator Boot 89000 ms
Simulator Boot (Run) 2000 ms
App Install 36000 ms
App Launch 4000 ms
Test Execution 444000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 57ms / native 3ms = 19.0x speedup
SIMD float-mul (64K x300) java 65ms / native 3ms = 21.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 182.000 ms
Base64 CN1 decode 93.000 ms
Base64 native encode 684.000 ms
Base64 encode ratio (CN1/native) 0.266x (73.4% faster)
Base64 native decode 273.000 ms
Base64 decode ratio (CN1/native) 0.341x (65.9% faster)
Base64 SIMD encode 54.000 ms
Base64 encode ratio (SIMD/CN1) 0.297x (70.3% faster)
Base64 SIMD decode 47.000 ms
Base64 decode ratio (SIMD/CN1) 0.505x (49.5% faster)
Base64 encode ratio (SIMD/native) 0.079x (92.1% faster)
Base64 decode ratio (SIMD/native) 0.172x (82.8% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 25.000 ms
Image createMask (SIMD on) 102.000 ms
Image createMask ratio (SIMD on/off) 4.080x (308.0% slower)
Image applyMask (SIMD off) 259.000 ms
Image applyMask (SIMD on) 196.000 ms
Image applyMask ratio (SIMD on/off) 0.757x (24.3% faster)
Image modifyAlpha (SIMD off) 92.000 ms
Image modifyAlpha (SIMD on) 119.000 ms
Image modifyAlpha ratio (SIMD on/off) 1.293x (29.3% slower)
Image modifyAlpha removeColor (SIMD off) 119.000 ms
Image modifyAlpha removeColor (SIMD on) 117.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.983x (1.7% faster)

@shai-almog

shai-almog commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

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

Benchmark Results

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

Build and Run Timing

Metric Duration
Simulator Boot 77000 ms
Simulator Boot (Run) 1000 ms
App Install 12000 ms
App Launch 1000 ms
Test Execution 516000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 55ms / native 3ms = 18.3x speedup
SIMD float-mul (64K x300) java 55ms / native 3ms = 18.3x 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 441.000 ms
Base64 CN1 decode 334.000 ms
Base64 native encode 1019.000 ms
Base64 encode ratio (CN1/native) 0.433x (56.7% faster)
Base64 native decode 8909.000 ms
Base64 decode ratio (CN1/native) 0.037x (96.3% faster)
Base64 SIMD encode 93.000 ms
Base64 encode ratio (SIMD/CN1) 0.211x (78.9% faster)
Base64 SIMD decode 127.000 ms
Base64 decode ratio (SIMD/CN1) 0.380x (62.0% faster)
Base64 encode ratio (SIMD/native) 0.091x (90.9% faster)
Base64 decode ratio (SIMD/native) 0.014x (98.6% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 9.000 ms
Image createMask (SIMD on) 4.000 ms
Image createMask ratio (SIMD on/off) 0.444x (55.6% faster)
Image applyMask (SIMD off) 91.000 ms
Image applyMask (SIMD on) 184.000 ms
Image applyMask ratio (SIMD on/off) 2.022x (102.2% slower)
Image modifyAlpha (SIMD off) 203.000 ms
Image modifyAlpha (SIMD on) 178.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.877x (12.3% faster)
Image modifyAlpha removeColor (SIMD off) 260.000 ms
Image modifyAlpha removeColor (SIMD on) 249.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.958x (4.2% faster)

@shai-almog

shai-almog commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

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

Benchmark Results

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

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 95ms / native 12ms = 7.9x speedup
SIMD float-mul (64K x300) java 88ms / native 7ms = 12.5x 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 164.000 ms
Base64 CN1 decode 166.000 ms
Base64 native encode 718.000 ms
Base64 encode ratio (CN1/native) 0.228x (77.2% faster)
Base64 native decode 549.000 ms
Base64 decode ratio (CN1/native) 0.302x (69.8% faster)
Base64 SIMD encode 68.000 ms
Base64 encode ratio (SIMD/CN1) 0.415x (58.5% faster)
Base64 SIMD decode 46.000 ms
Base64 decode ratio (SIMD/CN1) 0.277x (72.3% faster)
Base64 encode ratio (SIMD/native) 0.095x (90.5% faster)
Base64 decode ratio (SIMD/native) 0.084x (91.6% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 7.000 ms
Image createMask (SIMD on) 3.000 ms
Image createMask ratio (SIMD on/off) 0.429x (57.1% faster)
Image applyMask (SIMD off) 65.000 ms
Image applyMask (SIMD on) 103.000 ms
Image applyMask ratio (SIMD on/off) 1.585x (58.5% slower)
Image modifyAlpha (SIMD off) 55.000 ms
Image modifyAlpha (SIMD on) 53.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.964x (3.6% faster)
Image modifyAlpha removeColor (SIMD off) 51.000 ms
Image modifyAlpha removeColor (SIMD on) 42.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.824x (17.6% faster)

@shannah
shannah merged commit ab2ad1c into master Aug 6, 2026
36 checks passed
@shannah
shannah deleted the claude/browsercomponent-macos-crash-wksb4w branch August 6, 2026 12:09
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.

4 participants