Skip to content

[web] Apply autocapitalize to text editing elements#188351

Merged
auto-submit[bot] merged 4 commits into
flutter:masterfrom
flutter-zl:fix-web-autocapitalize
Jul 1, 2026
Merged

[web] Apply autocapitalize to text editing elements#188351
auto-submit[bot] merged 4 commits into
flutter:masterfrom
flutter-zl:fix-web-autocapitalize

Conversation

@flutter-zl

Copy link
Copy Markdown
Contributor

Fixes #187231

Problem

Flutter web does not apply TextCapitalization to the hidden .flt-text-editing input for all text editing strategies. On Chromebook OSK, this can cause the first typed letter to be capitalized even when the app uses TextCapitalization.none.

Fix

Apply autocapitalize in the shared DefaultTextEditingStrategy.applyConfiguration path so all web strategies write the correct DOM attribute.

Demo

Before After
https://flutter-demo-43-before.web.app https://flutter-demo-43-after.web.app

Steps: enable Chromebook on-screen keyboard, focus the Flutter text field, dismiss the keyboard, refocus the field, then type a.

Before: the hidden Flutter input is missing autocapitalize, and Chromebook OSK may type A.
After: the hidden Flutter input has autocapitalize="off", and Chromebook OSK types a.

Manual validation

  • Confirmed before DOM omitted autocapitalize on .flt-text-editing.
  • Confirmed after DOM includes autocapitalize="off" on .flt-text-editing.
  • Confirmed Chromebook OSK behavior works as expected on the after demo.

@flutter-dashboard flutter-dashboard Bot added the CICD Run CI/CD label Jun 22, 2026
@github-actions github-actions Bot added a: text input Entering text in a text field or keyboard related problems engine flutter/engine related. See also e: labels. platform-web Web applications specifically team-web Owned by Web platform team labels Jun 22, 2026
@flutter-zl flutter-zl force-pushed the fix-web-autocapitalize branch from 2eaa8af to 57c09ce Compare June 22, 2026 21:16
@github-actions github-actions Bot removed the CICD Run CI/CD label Jun 22, 2026

@gemini-code-assist gemini-code-assist Bot 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.

Code Review

This pull request refactors how onscreen canvases are styled as overlays by dynamically setting the position: absolute CSS property only when platform views are present, rather than hardcoding it. It also centralizes the application of the autocapitalize attribute in text editing strategies and updates corresponding tests. The review feedback suggests wrapping a test's JS configuration override in a try-finally block to prevent test pollution and correcting a misleading copy-pasted comment in the text editing tests.

I am having trouble creating individual review comments. Click here to see my feedback.

engine/src/flutter/lib/web_ui/test/ui/platform_view_position_test.dart (25-64)

medium

To prevent test pollution, wrap the test body in a try-finally block to ensure that engine.debugOverrideJsConfiguration(null) is always executed, even if the test fails or throws an exception. This ensures subsequent tests are not affected by a leftover global JS configuration override.

  test('base onscreen canvas is not positioned as an overlay', () async {
    if (!isCanvasKit) {
      return;
    }

    // Force multi-surface mode to ensure OnscreenCanvasProvider is used.
    engine.debugOverrideJsConfiguration(
      <String, Object?>{'canvasKitForceMultiSurfaceRasterizer': true}.jsify()
          as engine.JsFlutterConfiguration?,
    );
    try {
      // Reset the renderer to ensure it is created with the new configuration.
      engine.renderer.debugResetRasterizer();
      engine.renderer.debugClear();

      // Create a scene with only Flutter content. This uses the base canvas, not
      // an overlay canvas interleaved with platform views.
      final recorder = ui.PictureRecorder();
      final canvas = ui.Canvas(recorder);
      canvas.drawRect(
        const ui.Rect.fromLTWH(0, 0, 100, 100),
        ui.Paint()..color = const ui.Color(0xFFFF0000),
      );

      final sb = ui.SceneBuilder();
      sb.addPicture(ui.Offset.zero, recorder.endRecording());

      await renderScene(sb.build());

      final DomElement canvasElement = (implicitView as engine.EngineFlutterView).dom.sceneHost
          .querySelectorAll('canvas')
          .single;

      expect(
        canvasElement.style.position,
        isNot('absolute'),
        reason: 'Base canvas should not be styled as a platform-view overlay.',
      );
    } finally {
      engine.debugOverrideJsConfiguration(null);
    }
  });
References
  1. Code should be tested and follow the guidance described in the writing effective tests guide. (link)

engine/src/flutter/lib/web_ui/test/engine/text_editing_test.dart (1931)

medium

The comment mentions creating a configuration with an AutofillGroup of four text fields, but the code actually creates a single text field configuration with sentences capitalization. This appears to be a copy-paste comment error and should be corrected to avoid confusion.

      // Create a configuration with sentences capitalization.
References
  1. Optimize for readability: Code is read more often than it is written. (link)

@flutter-zl flutter-zl force-pushed the fix-web-autocapitalize branch from 57c09ce to c14e255 Compare June 22, 2026 21:20
@flutter-dashboard flutter-dashboard Bot added the CICD Run CI/CD label Jun 22, 2026
@flutter-zl flutter-zl force-pushed the fix-web-autocapitalize branch from c14e255 to 53240a1 Compare June 22, 2026 23:22
@github-actions github-actions Bot removed the CICD Run CI/CD label Jun 22, 2026
@flutter-dashboard flutter-dashboard Bot added the CICD Run CI/CD label Jun 23, 2026
@flutter-zl flutter-zl requested review from harryterkelsen and mdebbar and removed request for mdebbar June 23, 2026 21:36

@harryterkelsen harryterkelsen 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.

LGTM

@flutter-zl flutter-zl added the autosubmit Merge PR when tree becomes green via auto submit App label Jun 30, 2026
@auto-submit auto-submit Bot removed the autosubmit Merge PR when tree becomes green via auto submit App label Jun 30, 2026
@auto-submit

auto-submit Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

autosubmit label was removed for flutter/flutter/188351, because The base commit of the PR is older than 7 days and can not be merged. Please merge the latest changes from the main into this branch and resubmit the PR.

@flutter-zl flutter-zl added the autosubmit Merge PR when tree becomes green via auto submit App label Jul 1, 2026
@auto-submit auto-submit Bot added this pull request to the merge queue Jul 1, 2026
Merged via the queue into flutter:master with commit ed32be4 Jul 1, 2026
200 checks passed
@flutter-dashboard flutter-dashboard Bot removed the autosubmit Merge PR when tree becomes green via auto submit App label Jul 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

a: text input Entering text in a text field or keyboard related problems CICD Run CI/CD engine flutter/engine related. See also e: labels. platform-web Web applications specifically team-web Owned by Web platform team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[web] Hidden editing <input> ignores TextCapitalization — Chromebook OSK auto-capitalizes

2 participants