class Ferrum::Keyboard

Constants

KEYS
KEYS_MAPPING
MODIFIERS

Public Class Methods

new(page) click to toggle source
# File lib/ferrum/keyboard.rb, line 29
def initialize(page)
  @page = page
end

Public Instance Methods

down(key) click to toggle source
# File lib/ferrum/keyboard.rb, line 33
def down(key)
  key = normalize_keys(Array(key))
  type = key[:text] ? "keyDown" : "rawKeyDown"
  @page.command("Input.dispatchKeyEvent", slowmoable: true, type: type, **key)
  self
end
modifiers(keys) click to toggle source
# File lib/ferrum/keyboard.rb, line 58
def modifiers(keys)
  keys.map { |k| MODIFIERS[k.to_s] }.compact.reduce(0, :|)
end
type(*keys) click to toggle source
# File lib/ferrum/keyboard.rb, line 46
def type(*keys)
  keys = normalize_keys(Array(keys))

  keys.each do |key|
    type = key[:text] ? "keyDown" : "rawKeyDown"
    @page.command("Input.dispatchKeyEvent", type: type, **key)
    @page.command("Input.dispatchKeyEvent", slowmoable: true, type: "keyUp", **key)
  end

  self
end
up(key) click to toggle source
# File lib/ferrum/keyboard.rb, line 40
def up(key)
  key = normalize_keys(Array(key))
  @page.command("Input.dispatchKeyEvent", slowmoable: true, type: "keyUp", **key)
  self
end

Private Instance Methods

combine_strings(keys) click to toggle source
# File lib/ferrum/keyboard.rb, line 108
def combine_strings(keys)
  keys
    .chunk { |k| k.is_a?(String) }
    .map { |s, k| s ? [k.reduce(&:+)] : k }
    .reduce(&:+)
end
normalize_keys(keys, pressed_keys = [], memo = []) click to toggle source
# File lib/ferrum/keyboard.rb, line 64
def normalize_keys(keys, pressed_keys = [], memo = [])
  case keys
  when Array
    pressed_keys.push([])
    memo += combine_strings(keys).map do |key|
      normalize_keys(key, pressed_keys, memo)
    end
    pressed_keys.pop
    memo.flatten.compact
  when Symbol
    key = keys.to_s.downcase

    if MODIFIERS.keys.include?(key)
      pressed_keys.last.push(key)
      nil
    else
      _key = KEYS.fetch(KEYS_MAPPING[key.to_sym] || key.to_sym)
      _key[:modifiers] = pressed_keys.flatten.map { |k| MODIFIERS[k] }.reduce(0, :|)
      to_options(_key)
    end
  when String
    pressed = pressed_keys.flatten
    keys.each_char.map do |char|
      if pressed.empty?
        key = KEYS[char] || {}
        key = key.merge(text: char, unmodifiedText: char)
        [to_options(key)]
      else
        key = KEYS[char] || {}
        text = pressed == ["shift"] ? char.upcase : char
        key = key.merge(
          text: text,
          unmodifiedText: text,
          isKeypad: key["location"] == 3,
          modifiers: pressed.map { |k| MODIFIERS[k] }.reduce(0, :|),
        )

        modifiers = pressed.map { |k| to_options(KEYS.fetch(KEYS_MAPPING[k.to_sym])) }
        modifiers + [to_options(key)]
      end.flatten
    end
  end
end
to_options(hash) click to toggle source
# File lib/ferrum/keyboard.rb, line 115
def to_options(hash)
  hash.inject({}) { |memo, (k, v)| memo.merge(k.to_sym => v) }
end