This repository has been archived on 2025-01-19. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
drupalcampbristol/web/vendor/jcalderonzumba/mink-phantomjs-driver/src/KeyboardTrait.php
2017-02-13 15:31:17 +00:00

95 lines
2.8 KiB
PHP

<?php
namespace Zumba\Mink\Driver;
use Behat\Mink\Exception\DriverException;
/**
* Class KeyboardTrait
* @package Zumba\Mink\Driver
*/
trait KeyboardTrait {
/**
* Does some normalization for the char we want to do keyboard events with.
* @param $char
* @throws DriverException
* @return string
*/
protected function normalizeCharForKeyEvent($char) {
if (!is_int($char) && !is_string($char)) {
throw new DriverException("Unsupported key type, can only be integer or string");
}
if (is_string($char) && strlen($char) !== 1) {
throw new DriverException("Key can only have ONE character");
}
$key = $char;
if (is_int($char)) {
$key = chr($char);
}
return $key;
}
/**
* Does some control and normalization for the key event modifier
* @param $modifier
* @return string
* @throws DriverException
*/
protected function keyEventModifierControl($modifier) {
if ($modifier === null) {
$modifier = "none";
}
if (!in_array($modifier, array("none", "alt", "ctrl", "shift", "meta"))) {
throw new DriverException("Unsupported key modifier $modifier");
}
return $modifier;
}
/**
* Send a key-down event to the browser element
* @param $xpath
* @param $char
* @param string $modifier
* @throws DriverException
*/
public function keyDown($xpath, $char, $modifier = null) {
$element = $this->findElement($xpath, 1);
$key = $this->normalizeCharForKeyEvent($char);
$modifier = $this->keyEventModifierControl($modifier);
return $this->browser->keyEvent($element["page_id"], $element["ids"][0], "keydown", $key, $modifier);
}
/**
* @param string $xpath
* @param string $char
* @param string $modifier
* @throws DriverException
*/
public function keyPress($xpath, $char, $modifier = null) {
$element = $this->findElement($xpath, 1);
$key = $this->normalizeCharForKeyEvent($char);
$modifier = $this->keyEventModifierControl($modifier);
return $this->browser->keyEvent($element["page_id"], $element["ids"][0], "keypress", $key, $modifier);
}
/**
* Pressed up specific keyboard key.
*
* @param string $xpath
* @param string|integer $char could be either char ('b') or char-code (98)
* @param string $modifier keyboard modifier (could be 'ctrl', 'alt', 'shift' or 'meta')
*
* @throws DriverException When the operation cannot be done
*/
public function keyUp($xpath, $char, $modifier = null) {
$this->findElement($xpath, 1);
$element = $this->findElement($xpath, 1);
$key = $this->normalizeCharForKeyEvent($char);
$modifier = $this->keyEventModifierControl($modifier);
return $this->browser->keyEvent($element["page_id"], $element["ids"][0], "keyup", $key, $modifier);
}
}