Class: Capybara::Lightpanda::Keyboard

Inherits:
Object
  • Object
show all
Defined in:
lib/capybara/lightpanda/keyboard.rb

Overview

rubocop:disable Metrics/ClassLength

Constant Summary collapse

KEYS =

Capybara symbol -> CDP key definition.

{
  cancel: { key: "Cancel", code: "Abort", keyCode: 3 },
  help: { key: "Help", code: "Help", keyCode: 6 },
  backspace: { key: "Backspace", code: "Backspace", keyCode: 8 },
  tab: { key: "Tab", code: "Tab", keyCode: 9 },
  clear: { key: "Clear", code: "NumLock", keyCode: 12 },
  return: { key: "Enter", code: "Enter", keyCode: 13, text: "\r" },
  enter: { key: "Enter", code: "Enter", keyCode: 13, text: "\r" },
  shift: { key: "Shift", code: "ShiftLeft", keyCode: 16 },
  control: { key: "Control", code: "ControlLeft", keyCode: 17 },
  alt: { key: "Alt", code: "AltLeft", keyCode: 18 },
  pause: { key: "Pause", code: "Pause", keyCode: 19 },
  escape: { key: "Escape", code: "Escape", keyCode: 27 },
  space: { key: " ", code: "Space", keyCode: 32, text: " " },
  page_up: { key: "PageUp", code: "PageUp", keyCode: 33 },
  page_down: { key: "PageDown", code: "PageDown", keyCode: 34 },
  end: { key: "End", code: "End", keyCode: 35 },
  home: { key: "Home", code: "Home", keyCode: 36 },
  left: { key: "ArrowLeft", code: "ArrowLeft", keyCode: 37 },
  up: { key: "ArrowUp", code: "ArrowUp", keyCode: 38 },
  right: { key: "ArrowRight", code: "ArrowRight", keyCode: 39 },
  down: { key: "ArrowDown", code: "ArrowDown", keyCode: 40 },
  insert: { key: "Insert", code: "Insert", keyCode: 45 },
  delete: { key: "Delete", code: "Delete", keyCode: 46 },
  semicolon: { key: ";", code: "Semicolon", keyCode: 186, text: ";" },
  equals: { key: "=", code: "Equal", keyCode: 187, text: "=" },
  numpad0: { key: "0", code: "Numpad0", keyCode: 96, text: "0" },
  numpad1: { key: "1", code: "Numpad1", keyCode: 97, text: "1" },
  numpad2: { key: "2", code: "Numpad2", keyCode: 98, text: "2" },
  numpad3: { key: "3", code: "Numpad3", keyCode: 99, text: "3" },
  numpad4: { key: "4", code: "Numpad4", keyCode: 100, text: "4" },
  numpad5: { key: "5", code: "Numpad5", keyCode: 101, text: "5" },
  numpad6: { key: "6", code: "Numpad6", keyCode: 102, text: "6" },
  numpad7: { key: "7", code: "Numpad7", keyCode: 103, text: "7" },
  numpad8: { key: "8", code: "Numpad8", keyCode: 104, text: "8" },
  numpad9: { key: "9", code: "Numpad9", keyCode: 105, text: "9" },
  multiply: { key: "*", code: "NumpadMultiply", keyCode: 106, text: "*" },
  add: { key: "+", code: "NumpadAdd", keyCode: 107, text: "+" },
  separator: { key: ".", code: "NumpadDecimal", keyCode: 110, text: "." },
  subtract: { key: "-", code: "NumpadSubtract", keyCode: 109, text: "-" },
  decimal: { key: ".", code: "NumpadDecimal", keyCode: 110, text: "." },
  divide: { key: "/", code: "NumpadDivide", keyCode: 111, text: "/" },
  f1: { key: "F1", code: "F1", keyCode: 112 },
  f2: { key: "F2", code: "F2", keyCode: 113 },
  f3: { key: "F3", code: "F3", keyCode: 114 },
  f4: { key: "F4", code: "F4", keyCode: 115 },
  f5: { key: "F5", code: "F5", keyCode: 116 },
  f6: { key: "F6", code: "F6", keyCode: 117 },
  f7: { key: "F7", code: "F7", keyCode: 118 },
  f8: { key: "F8", code: "F8", keyCode: 119 },
  f9: { key: "F9", code: "F9", keyCode: 120 },
  f10: { key: "F10", code: "F10", keyCode: 121 },
  f11: { key: "F11", code: "F11", keyCode: 122 },
  f12: { key: "F12", code: "F12", keyCode: 123 },
  meta: { key: "Meta", code: "MetaLeft", keyCode: 91 },
  command: { key: "Meta", code: "MetaLeft", keyCode: 91 },
}.freeze
MODIFIERS =
{
  alt: 1,
  control: 2, ctrl: 2,
  meta: 4, command: 4,
  shift: 8,
}.freeze

Instance Method Summary collapse

Constructor Details

#initialize(browser) ⇒ Keyboard

Returns a new instance of Keyboard.



72
73
74
# File 'lib/capybara/lightpanda/keyboard.rb', line 72

def initialize(browser)
  @browser = browser
end

Instance Method Details

#type(*keys) ⇒ Object

A top-level modifier symbol (‘:shift`, `:ctrl`, `:alt`, `:meta`) is held for the remainder of the call — `send_keys(’ocean’, :shift, ‘side’)‘ types `oceanSIDE`. Modifier presses fire `keyDown` (not `rawKeyDown`) so JS keydown handlers see the modifier event; CDP’s ‘rawKeyDown` is documented as “no JS keyDown event is generated” and would hide the modifier from listeners that count keydown events.



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/capybara/lightpanda/keyboard.rb', line 82

def type(*keys)
  active_mods = []
  keys.each do |key|
    case key
    when Symbol
      if MODIFIERS.key?(key)
        press_modifier(key, active_mods)
      else
        dispatch_key_with_mods(key, active_mods)
      end
    when String
      key.each_char { |char| dispatch_char_with_mods(char, active_mods) }
    when Array
      type_with_modifiers(key)
    end
  end
  release_modifiers(active_mods)
end