Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CupertinoTextSelectionToolbar doesn't work on web with HTML renderer #123560

Open
justinmc opened this issue Mar 27, 2023 · 1 comment
Open

CupertinoTextSelectionToolbar doesn't work on web with HTML renderer #123560

justinmc opened this issue Mar 27, 2023 · 1 comment
Labels
a: text input Entering text in a text field or keyboard related problems e: web_html HTML rendering backend for Web f: cupertino flutter/packages/flutter/cupertino repository found in release: 3.7 Found to occur in 3.7 found in release: 3.9 Found to occur in 3.9 framework flutter/packages/flutter repository. See also f: labels. has reproducible steps The issue has been confirmed reproducible and is ready to work on P2 Important issues not at the top of the work list platform-web Web applications specifically team-web Owned by Web platform team triaged-web Triaged by Web platform team

Comments

@justinmc
Copy link
Contributor

Path.combine isn't supported by the HTML renderer according to #44572, but CupertinoTextSelectionToolbar uses it:

return Path.combine(PathOperation.union, rrect, arrow);

We should either fix Path.combine on the HTML renderer, or migrate to something else for CupertinoTextSelectionToolbar.

Impact

By default, web uses the browser's context menus, so this bug will only ever appear to users that have disabled the browser context menu (recently possible with #118194). For that reason, this issue is unlikely to affect most users.

Steps to reproduce

  1. On web with the HTML renderer (`flutter run -d chrome --web-renderer=html), either run the app below, or run an app with a text field and show the context menu (iOS).

Expected: The iOS context menu is shown.
Actual: An error occurs.

Demo app
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: Scaffold(
        appBar: AppBar(
          title: const Text("Demo"),
        ),
        body: Center(
          child: CupertinoTextSelectionToolbar(
            anchorAbove: Offset.zero,
            anchorBelow: Offset.zero,
            children: const <Widget>[
              Text('Hello World'),
            ],
          ),
        ),
      ),
    );
  }
}
Error
══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
The following UnimplementedError was thrown during paint():
combinePaths not implemented in HTML renderer.

The relevant error-causing widget was:
  CupertinoTextSelectionToolbar
  CupertinoTextSelectionToolbar:file:///usr/local/google/home/jmccandless/Projects/issues/sandbox/lib/main.dart:20:18

When the exception was thrown, this was the stack:
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 288:49  throw_
lib/_engine/engine/html/renderer.dart 222:5                                   combinePaths
lib/ui/path.dart 54:21                                                        combine
packages/flutter/src/cupertino/text_selection_toolbar.dart 353:17             [_clipPath]
packages/flutter/src/cupertino/text_selection_toolbar.dart 367:7              paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 169:10                             _repaintCompositedChild
packages/flutter/src/rendering/object.dart 112:5                              repaintCompositedChild
packages/flutter/src/rendering/object.dart 264:7                              [_compositeChild]
packages/flutter/src/rendering/object.dart 245:7                              paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/rendering/proxy_box.dart 2338:11                         paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/shifted_box.dart 74:14                         paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/shifted_box.dart 74:14                         paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/shifted_box.dart 74:14                         paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/box.dart 2879:14                               defaultPaint
packages/flutter/src/rendering/custom_layout.dart 408:5                       paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/material/material.dart 664:11                            paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/rendering/proxy_box.dart 2076:15                         <fn>
packages/flutter/src/rendering/object.dart 562:14                             pushClipRRect
packages/flutter/src/rendering/proxy_box.dart 2063:20                         paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 169:10                             _repaintCompositedChild
packages/flutter/src/rendering/object.dart 112:5                              repaintCompositedChild
packages/flutter/src/rendering/object.dart 264:7                              [_compositeChild]
packages/flutter/src/rendering/object.dart 245:7                              paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/material/page_transitions_theme.dart 995:23              paint
packages/flutter/src/widgets/snapshot_widget.dart 335:15                      paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/material/page_transitions_theme.dart 923:23              paint
packages/flutter/src/widgets/snapshot_widget.dart 335:15                      paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/material/page_transitions_theme.dart 995:23              paint
packages/flutter/src/widgets/snapshot_widget.dart 335:15                      paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/material/page_transitions_theme.dart 923:23              paint
packages/flutter/src/widgets/snapshot_widget.dart 335:15                      paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 169:10                             _repaintCompositedChild
packages/flutter/src/rendering/object.dart 112:5                              repaintCompositedChild
packages/flutter/src/rendering/object.dart 264:7                              [_compositeChild]
packages/flutter/src/rendering/object.dart 245:7                              paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/rendering/proxy_box.dart 3771:11                         paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/widgets/overlay.dart 860:14                              paint
packages/flutter/src/widgets/overlay.dart 1120:13                             paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/rendering/custom_paint.dart 618:11                       paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/proxy_box.dart 146:14                          paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 253:12                             paintChild
packages/flutter/src/rendering/view.dart 213:14                               paint
packages/flutter/src/rendering/object.dart 3059:7                             [_paintWithContext]
packages/flutter/src/rendering/object.dart 169:10                             _repaintCompositedChild
packages/flutter/src/rendering/object.dart 112:5                              repaintCompositedChild
packages/flutter/src/rendering/object.dart 1147:31                            flushPaint
packages/flutter/src/rendering/binding.dart 494:19                            drawFrame
packages/flutter/src/widgets/binding.dart 895:13                              drawFrame
packages/flutter/src/rendering/binding.dart 358:5                             [_handlePersistentFrameCallback]
packages/flutter/src/scheduler/binding.dart 1284:15                           [_invokeFrameCallback]
packages/flutter/src/scheduler/binding.dart 1214:9                            handleDrawFrame
The Flutter DevTools debugger and profiler on Chrome is available at: http://127.0.0.1:9100?uri=http://127.0.0.1:45743/60Ub34m_MzY=
packages/flutter/src/scheduler/binding.dart 939:7                             <fn>
dart-sdk/lib/_internal/js_dev_runtime/private/isolate_helper.dart 48:19       internalCallback

The following RenderObject was being processed when the exception was fired: _RenderCupertinoTextSelectionToolbarShape#a6eca relayoutBoundary=up5:
  needs compositing
  creator: _CupertinoTextSelectionToolbarShape ← DecoratedBox ← _CupertinoTextSelectionToolbarContent
    ← CustomSingleChildLayout ← Padding ← CupertinoTextSelectionToolbar ← Center ←
    KeyedSubtree-[GlobalKey#7ecfb] ← _BodyBuilder ← MediaQuery ← LayoutId-[<_ScaffoldSlot.body>] ←
    CustomMultiChildLayout ← ⋯
  parentData: <none> (can use size)
  constraints: BoxConstraints(0.0<=w<=1845.0, 0.0<=h<=1894.0)
  layer: OffsetLayer#2a5ab DETACHED
  size: Size(72.0, 43.0)
This RenderObject had the following descendants (showing up to depth 5):
    child: RenderDecoratedBox#b02f3 relayoutBoundary=up6 NEEDS-PAINT
      child: RenderAnimatedOpacity#d415c relayoutBoundary=up7 NEEDS-PAINT
        child: _RenderCupertinoTextSelectionToolbarItems#b39da relayoutBoundary=up8 NEEDS-PAINT
          back button: RenderMouseRegion#715dc relayoutBoundary=up9 NEEDS-PAINT
            child: RenderSemanticsGestureHandler#e3eda relayoutBoundary=up10 NEEDS-PAINT
          next button: RenderMouseRegion#0aab7 relayoutBoundary=up9 NEEDS-PAINT
            child: RenderSemanticsGestureHandler#c312e relayoutBoundary=up10 NEEDS-PAINT
          next button disabled: RenderMouseRegion#ebb00 relayoutBoundary=up9 NEEDS-PAINT
            child: RenderSemanticsGestureHandler#009b1 relayoutBoundary=up10 NEEDS-PAINT
          menu item: RenderParagraph#54494 relayoutBoundary=up9 NEEDS-PAINT
            text: TextSpan
════════════════════════════════════════════════════════════════════════════════════════════════════
@darshankawar darshankawar added the in triage Presently being triaged by the triage team label Mar 28, 2023
@darshankawar
Copy link
Member

Thanks for the report. Was able to replicate this using details provided.

stable, master flutter doctor -v
[!] Flutter (Channel stable, 3.7.7, on macOS 12.2.1 21D62 darwin-x64, locale
    en-GB)
    • Flutter version 3.7.7 on channel stable at
      /Users/dhs/documents/fluttersdk/flutter
    ! Warning: `flutter` on your path resolves to
      /Users/dhs/Documents/Fluttersdk/flutter/bin/flutter, which is not inside
      your current Flutter SDK checkout at
      /Users/dhs/documents/fluttersdk/flutter. Consider adding
      /Users/dhs/documents/fluttersdk/flutter/bin to the front of your path.
    ! Warning: `dart` on your path resolves to
      /Users/dhs/Documents/Fluttersdk/flutter/bin/dart, which is not inside your
      current Flutter SDK checkout at /Users/dhs/documents/fluttersdk/flutter.
      Consider adding /Users/dhs/documents/fluttersdk/flutter/bin to the front
      of your path.
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 2ad6cd72c0 (12 days ago), 2023-03-08 09:41:59 -0800
    • Engine revision 1837b5be5f
    • Dart version 2.19.4
    • DevTools version 2.20.1
    • If those were intentional, you can disregard the above warnings; however
      it is recommended to use "git" directly to perform update checks and
      upgrades.

[!] Xcode - develop for iOS and macOS (Xcode 12.3)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    ! Flutter recommends a minimum Xcode version of 13.
      Download the latest version or update via the Mac App Store.
    • CocoaPods version 1.11.2

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] VS Code (version 1.62.0)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.21.0

[✓] Connected device (5 available)
    • SM G975F (mobile)       • RZ8M802WY0X • android-arm64   • Android 11 (API 30)
    • Darshan's iphone (mobile)  • 21150b119064aecc249dfcfe05e259197461ce23 •
      ios            • iOS 14.4.1 18D61
    • iPhone 12 Pro Max (mobile) • A5473606-0213-4FD8-BA16-553433949729     •
      ios            • com.apple.CoreSimulator.SimRuntime.iOS-14-3 (simulator)
    • macOS (desktop)            • macos                                    •
      darwin-x64     • Mac OS X 10.15.4 19E2269 darwin-x64
    • Chrome (web)               • chrome                                   •
      web-javascript • Google Chrome 98.0.4758.80

[✓] HTTP Host Availability
    • All required HTTP hosts are available

! Doctor found issues in 1 category.

[!] Flutter (Channel master, 3.9.0-16.0.pre.42, on macOS 12.2.1 21D62
    darwin-x64, locale en-GB)
    • Flutter version 3.9.0-16.0.pre.42 on channel master at
      /Users/dhs/documents/fluttersdk/flutter
    ! Warning: `flutter` on your path resolves to
      /Users/dhs/Documents/Fluttersdk/flutter/bin/flutter, which is not inside
      your current Flutter SDK checkout at
      /Users/dhs/documents/fluttersdk/flutter. Consider adding
      /Users/dhs/documents/fluttersdk/flutter/bin to the front of your path.
    ! Warning: `dart` on your path resolves to
      /Users/dhs/Documents/Fluttersdk/flutter/bin/dart, which is not inside your
      current Flutter SDK checkout at /Users/dhs/documents/fluttersdk/flutter.
      Consider adding /Users/dhs/documents/fluttersdk/flutter/bin to the front
      of your path.
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision a8afbfa22e (47 minutes ago), 2023-03-24 00:00:20 -0400
    • Engine revision 1da070c57c
    • Dart version 3.0.0 (build 3.0.0-362.0.dev)
    • DevTools version 2.22.2
    • If those were intentional, you can disregard the above warnings; however
      it is recommended to use "git" directly to perform update checks and
      upgrades.

[!] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
    • Android SDK at /Users/dhs/Library/Android/sdk
    ✗ cmdline-tools component is missing
      Run `path/to/sdkmanager --install "cmdline-tools;latest"`
      See https://developer.android.com/studio/command-line for more details.
    ✗ Android license status unknown.
      Run `flutter doctor --android-licenses` to accept the SDK licenses.
      See https://flutter.dev/docs/get-started/install/macos#android-setup for
      more details.

[✓] Xcode - develop for iOS and macOS (Xcode 13.2.1)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Build 13C100
    • CocoaPods version 1.11.2

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] IntelliJ IDEA Ultimate Edition (version 2021.3.2)
    • IntelliJ at /Applications/IntelliJ IDEA.app
    • Flutter plugin version 65.1.4
    • Dart plugin version 213.7228

[✓] VS Code (version 1.62.0)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.29.0

[✓] Connected device (3 available)
    • Darshan's iphone (mobile) • 21150b119064aecc249dfcfe05e259197461ce23 • ios
      • iOS 15.3.1 19D52
    • macOS (desktop)           • macos                                    •
      darwin-x64     • macOS 12.2.1 21D62 darwin-x64
    • Chrome (web)              • chrome                                   •
      web-javascript • Google Chrome 109.0.5414.119

[✓] Network resources
    • All expected network resources are available.

! Doctor found issues in 1 category.
      
[!] Xcode - develop for iOS and macOS (Xcode 12.3)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    ! Flutter recommends a minimum Xcode version of 13.
      Download the latest version or update via the Mac App Store.
    • CocoaPods version 1.11.2

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] VS Code (version 1.62.0)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.21.0

[✓] Connected device (5 available)
    • SM G975F (mobile)       • RZ8M802WY0X • android-arm64   • Android 11 (API 30)
    • Darshan's iphone (mobile)  • 21150b119064aecc249dfcfe05e259197461ce23 •
      ios            • iOS 14.4.1 18D61
    • iPhone 12 Pro Max (mobile) • A5473606-0213-4FD8-BA16-553433949729     •
      ios            • com.apple.CoreSimulator.SimRuntime.iOS-14-3 (simulator)
    • macOS (desktop)            • macos                                    •
      darwin-x64     • Mac OS X 10.15.4 19E2269 darwin-x64
    • Chrome (web)               • chrome                                   •
      web-javascript • Google Chrome 98.0.4758.80

[✓] HTTP Host Availability
    • All required HTTP hosts are available

! Doctor found issues in 1 category.



@darshankawar darshankawar added platform-web Web applications specifically e: web_html HTML rendering backend for Web has reproducible steps The issue has been confirmed reproducible and is ready to work on found in release: 3.7 Found to occur in 3.7 found in release: 3.9 Found to occur in 3.9 f: cupertino flutter/packages/flutter/cupertino repository framework flutter/packages/flutter repository. See also f: labels. and removed in triage Presently being triaged by the triage team labels Mar 28, 2023
@justinmc justinmc added the a: text input Entering text in a text field or keyboard related problems label Mar 28, 2023
@yjbanov yjbanov added the P2 Important issues not at the top of the work list label Mar 30, 2023
@flutter-triage-bot flutter-triage-bot bot added multiteam-retriage-candidate team-web Owned by Web platform team triaged-web Triaged by Web platform team labels Jul 8, 2023
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 e: web_html HTML rendering backend for Web f: cupertino flutter/packages/flutter/cupertino repository found in release: 3.7 Found to occur in 3.7 found in release: 3.9 Found to occur in 3.9 framework flutter/packages/flutter repository. See also f: labels. has reproducible steps The issue has been confirmed reproducible and is ready to work on P2 Important issues not at the top of the work list platform-web Web applications specifically team-web Owned by Web platform team triaged-web Triaged by Web platform team
Projects
None yet
Development

No branches or pull requests

4 participants