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

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(browser) ⇒ Keyboard

Returns a new instance of Keyboard.



89
90
91
# File 'lib/capybara/lightpanda/keyboard.rb', line 89

def initialize(browser)
  @browser = browser
end

Class Method Details

.shifted(char) ⇒ Object



85
86
87
# File 'lib/capybara/lightpanda/keyboard.rb', line 85

def self.shifted(char)
  SHIFT_MAP[char] || char.upcase
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.



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/capybara/lightpanda/keyboard.rb', line 99

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