Version 1
[yaffs-website] / vendor / jcalderonzumba / mink-phantomjs-driver / src / KeyboardTrait.php
diff --git a/vendor/jcalderonzumba/mink-phantomjs-driver/src/KeyboardTrait.php b/vendor/jcalderonzumba/mink-phantomjs-driver/src/KeyboardTrait.php
new file mode 100644 (file)
index 0000000..2b0c96d
--- /dev/null
@@ -0,0 +1,95 @@
+<?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);
+  }
+}