Skip to content

[webview_flutter][webview_flutter_wkwebview]On macOS, keyboard input monitoring can enter an infinite loop. #170316

Open
@gws890814

Description

@gws890814

What package does this bug report belong to?

webview_flutter

What target platforms are you seeing this bug on?

macOS

Have you already upgraded your packages?

Yes

Dependency versions

pubspec.lock
[Paste file content here]

Steps to reproduce

While using webview_flutter for desktop development, I employed NSEvent.addLocalMonitorForEvents in Swift to monitor keyboard input. However, when certain shortcuts (e.g., Cmd + D) are pressed, the listener gets triggered infinitely.

Expected results

The listener triggers only once.

Actual results

The listener triggers multiple times or even enters an infinite triggering loop.

Code sample

Code sample
keyboardEventMonitor = NSEvent.addLocalMonitorForEvents(matching: [.keyDown]) {
      [weak self] event in
      guard let self = self else { return event }

      if self.AllowKeyboard == nil {
        var modifierFlags: [String] = []
        if event.modifierFlags.contains(.shift) {
          modifierFlags.append("shift")
        }
        if event.modifierFlags.contains(.control) {
          modifierFlags.append("control")
        }
        if event.modifierFlags.contains(.option) {
          modifierFlags.append("option")
        }
        if event.modifierFlags.contains(.command) {
          modifierFlags.append("command")
        }
        if event.modifierFlags.contains(.capsLock) {
          modifierFlags.append("capsLock")
        }
        if event.modifierFlags.contains(.function) {
          modifierFlags.append("function")
        }
        if event.modifierFlags.contains(.numericPad) {
          modifierFlags.append("numericPad")
        }
        if event.modifierFlags.contains(.help) {
          modifierFlags.append("help")
        }
        if event.modifierFlags.contains(.deviceIndependentFlagsMask) {
          modifierFlags.append("deviceIndependentFlagsMask")
        }

        emitEvent(
          "keyboard",
          args: [
            "keyCode": event.keyCode,
            "modifierFlags": modifierFlags,
            "characters": event.characters,
            "charactersIgnoringModifiers": event.charactersIgnoringModifiers,
          ],
          callback: { id, args in
            if args as? Bool ?? true {
              self.AllowKeyboard = event
              NSApp.sendEvent(event)
            }
          }
        )
        return nil
      }

      self.AllowKeyboard = nil

      if event.modifierFlags.contains(.command) && event.keyCode == 13 {
        self.close()
        return nil
      }
      
      print("Infinite loop here")

      return event
    }

Screenshots or Videos

Screenshots / Video demonstration

[Upload media here]

Logs

Logs
[Paste your logs here]

Flutter Doctor output

Doctor output

Metadata

Metadata

Assignees

No one assigned

    Labels

    in triagePresently being triaged by the triage teamwaiting for customer responseThe Flutter team cannot make further progress on this issue until the original reporter responds

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions