1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace Facebook\WebDriver; 4*04fd306cSNickeau 5*04fd306cSNickeau/** 6*04fd306cSNickeau * Representations of pressable keys that aren't text. 7*04fd306cSNickeau * These are stored in the Unicode PUA (Private Use Area) code points. 8*04fd306cSNickeau * @see https://w3c.github.io/webdriver/#keyboard-actions 9*04fd306cSNickeau */ 10*04fd306cSNickeauclass WebDriverKeys 11*04fd306cSNickeau{ 12*04fd306cSNickeau const NULL = "\xEE\x80\x80"; 13*04fd306cSNickeau const CANCEL = "\xEE\x80\x81"; 14*04fd306cSNickeau const HELP = "\xEE\x80\x82"; 15*04fd306cSNickeau const BACKSPACE = "\xEE\x80\x83"; 16*04fd306cSNickeau const TAB = "\xEE\x80\x84"; 17*04fd306cSNickeau const CLEAR = "\xEE\x80\x85"; 18*04fd306cSNickeau const RETURN_KEY = "\xEE\x80\x86"; 19*04fd306cSNickeau const ENTER = "\xEE\x80\x87"; 20*04fd306cSNickeau const SHIFT = "\xEE\x80\x88"; 21*04fd306cSNickeau const CONTROL = "\xEE\x80\x89"; 22*04fd306cSNickeau const ALT = "\xEE\x80\x8A"; 23*04fd306cSNickeau const PAUSE = "\xEE\x80\x8B"; 24*04fd306cSNickeau const ESCAPE = "\xEE\x80\x8C"; 25*04fd306cSNickeau const SPACE = "\xEE\x80\x8D"; 26*04fd306cSNickeau const PAGE_UP = "\xEE\x80\x8E"; 27*04fd306cSNickeau const PAGE_DOWN = "\xEE\x80\x8F"; 28*04fd306cSNickeau const END = "\xEE\x80\x90"; 29*04fd306cSNickeau const HOME = "\xEE\x80\x91"; 30*04fd306cSNickeau const ARROW_LEFT = "\xEE\x80\x92"; 31*04fd306cSNickeau const ARROW_UP = "\xEE\x80\x93"; 32*04fd306cSNickeau const ARROW_RIGHT = "\xEE\x80\x94"; 33*04fd306cSNickeau const ARROW_DOWN = "\xEE\x80\x95"; 34*04fd306cSNickeau const INSERT = "\xEE\x80\x96"; 35*04fd306cSNickeau const DELETE = "\xEE\x80\x97"; 36*04fd306cSNickeau const SEMICOLON = "\xEE\x80\x98"; 37*04fd306cSNickeau const EQUALS = "\xEE\x80\x99"; 38*04fd306cSNickeau const NUMPAD0 = "\xEE\x80\x9A"; 39*04fd306cSNickeau const NUMPAD1 = "\xEE\x80\x9B"; 40*04fd306cSNickeau const NUMPAD2 = "\xEE\x80\x9C"; 41*04fd306cSNickeau const NUMPAD3 = "\xEE\x80\x9D"; 42*04fd306cSNickeau const NUMPAD4 = "\xEE\x80\x9E"; 43*04fd306cSNickeau const NUMPAD5 = "\xEE\x80\x9F"; 44*04fd306cSNickeau const NUMPAD6 = "\xEE\x80\xA0"; 45*04fd306cSNickeau const NUMPAD7 = "\xEE\x80\xA1"; 46*04fd306cSNickeau const NUMPAD8 = "\xEE\x80\xA2"; 47*04fd306cSNickeau const NUMPAD9 = "\xEE\x80\xA3"; 48*04fd306cSNickeau const MULTIPLY = "\xEE\x80\xA4"; 49*04fd306cSNickeau const ADD = "\xEE\x80\xA5"; 50*04fd306cSNickeau const SEPARATOR = "\xEE\x80\xA6"; 51*04fd306cSNickeau const SUBTRACT = "\xEE\x80\xA7"; 52*04fd306cSNickeau const DECIMAL = "\xEE\x80\xA8"; 53*04fd306cSNickeau const DIVIDE = "\xEE\x80\xA9"; 54*04fd306cSNickeau const F1 = "\xEE\x80\xB1"; 55*04fd306cSNickeau const F2 = "\xEE\x80\xB2"; 56*04fd306cSNickeau const F3 = "\xEE\x80\xB3"; 57*04fd306cSNickeau const F4 = "\xEE\x80\xB4"; 58*04fd306cSNickeau const F5 = "\xEE\x80\xB5"; 59*04fd306cSNickeau const F6 = "\xEE\x80\xB6"; 60*04fd306cSNickeau const F7 = "\xEE\x80\xB7"; 61*04fd306cSNickeau const F8 = "\xEE\x80\xB8"; 62*04fd306cSNickeau const F9 = "\xEE\x80\xB9"; 63*04fd306cSNickeau const F10 = "\xEE\x80\xBA"; 64*04fd306cSNickeau const F11 = "\xEE\x80\xBB"; 65*04fd306cSNickeau const F12 = "\xEE\x80\xBC"; 66*04fd306cSNickeau const META = "\xEE\x80\xBD"; 67*04fd306cSNickeau const ZENKAKU_HANKAKU = "\xEE\x80\xC0"; 68*04fd306cSNickeau const RIGHT_SHIFT = "\xEE\x81\x90"; 69*04fd306cSNickeau const RIGHT_CONTROL = "\xEE\x81\x91"; 70*04fd306cSNickeau const RIGHT_ALT = "\xEE\x81\x92"; 71*04fd306cSNickeau const RIGHT_META = "\xEE\x81\x93"; 72*04fd306cSNickeau const NUMPAD_PAGE_UP = "\xEE\x81\x94"; 73*04fd306cSNickeau const NUMPAD_PAGE_DOWN = "\xEE\x81\x95"; 74*04fd306cSNickeau const NUMPAD_END = "\xEE\x81\x96"; 75*04fd306cSNickeau const NUMPAD_HOME = "\xEE\x81\x97"; 76*04fd306cSNickeau const NUMPAD_ARROW_LEFT = "\xEE\x81\x98"; 77*04fd306cSNickeau const NUMPAD_ARROW_UP = "\xEE\x81\x99"; 78*04fd306cSNickeau const NUMPAD_ARROW_RIGHT = "\xEE\x81\x9A"; 79*04fd306cSNickeau const NUMPAD_ARROW_DOWN = "\xEE\x81\x9B"; 80*04fd306cSNickeau const NUMPAD_ARROW_INSERT = "\xEE\x81\x9C"; 81*04fd306cSNickeau const NUMPAD_ARROW_DELETE = "\xEE\x81\x9D"; 82*04fd306cSNickeau // Aliases 83*04fd306cSNickeau const LEFT_SHIFT = self::SHIFT; 84*04fd306cSNickeau const LEFT_CONTROL = self::CONTROL; 85*04fd306cSNickeau const LEFT_ALT = self::ALT; 86*04fd306cSNickeau const LEFT = self::ARROW_LEFT; 87*04fd306cSNickeau const UP = self::ARROW_UP; 88*04fd306cSNickeau const RIGHT = self::ARROW_RIGHT; 89*04fd306cSNickeau const DOWN = self::ARROW_DOWN; 90*04fd306cSNickeau const COMMAND = self::META; 91*04fd306cSNickeau 92*04fd306cSNickeau /** 93*04fd306cSNickeau * Encode input of `sendKeys()` to appropriate format according to protocol. 94*04fd306cSNickeau * 95*04fd306cSNickeau * @param string|array|int|float $keys 96*04fd306cSNickeau * @param bool $isW3cCompliant 97*04fd306cSNickeau * @return array|string 98*04fd306cSNickeau */ 99*04fd306cSNickeau public static function encode($keys, $isW3cCompliant = false) 100*04fd306cSNickeau { 101*04fd306cSNickeau if (is_numeric($keys)) { 102*04fd306cSNickeau $keys = (string) $keys; 103*04fd306cSNickeau } 104*04fd306cSNickeau 105*04fd306cSNickeau if (is_string($keys)) { 106*04fd306cSNickeau $keys = [$keys]; 107*04fd306cSNickeau } 108*04fd306cSNickeau 109*04fd306cSNickeau if (!is_array($keys)) { 110*04fd306cSNickeau if (!$isW3cCompliant) { 111*04fd306cSNickeau return []; 112*04fd306cSNickeau } 113*04fd306cSNickeau 114*04fd306cSNickeau return ''; 115*04fd306cSNickeau } 116*04fd306cSNickeau 117*04fd306cSNickeau $encoded = []; 118*04fd306cSNickeau foreach ($keys as $key) { 119*04fd306cSNickeau if (is_array($key)) { 120*04fd306cSNickeau // handle key modifiers 121*04fd306cSNickeau $key = implode('', $key) . self::NULL; // the NULL clears the input state (eg. previous modifiers) 122*04fd306cSNickeau } 123*04fd306cSNickeau $encoded[] = (string) $key; 124*04fd306cSNickeau } 125*04fd306cSNickeau 126*04fd306cSNickeau if (!$isW3cCompliant) { 127*04fd306cSNickeau return $encoded; 128*04fd306cSNickeau } 129*04fd306cSNickeau 130*04fd306cSNickeau return implode('', $encoded); 131*04fd306cSNickeau } 132*04fd306cSNickeau} 133