xref: /plugin/combo/vendor/php-webdriver/webdriver/lib/Remote/JsonWireCompat.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeaunamespace Facebook\WebDriver\Remote;
4*04fd306cSNickeau
5*04fd306cSNickeauuse Facebook\WebDriver\WebDriverBy;
6*04fd306cSNickeau
7*04fd306cSNickeau/**
8*04fd306cSNickeau * Compatibility layer between W3C's WebDriver and the legacy JsonWire protocol.
9*04fd306cSNickeau *
10*04fd306cSNickeau * @internal
11*04fd306cSNickeau */
12*04fd306cSNickeauabstract class JsonWireCompat
13*04fd306cSNickeau{
14*04fd306cSNickeau    /**
15*04fd306cSNickeau     * Element identifier defined in the W3C's WebDriver protocol.
16*04fd306cSNickeau     *
17*04fd306cSNickeau     * @see https://w3c.github.io/webdriver/webdriver-spec.html#elements
18*04fd306cSNickeau     */
19*04fd306cSNickeau    const WEB_DRIVER_ELEMENT_IDENTIFIER = 'element-6066-11e4-a52e-4f735466cecf';
20*04fd306cSNickeau
21*04fd306cSNickeau    public static function getElement(array $rawElement)
22*04fd306cSNickeau    {
23*04fd306cSNickeau        if (array_key_exists(self::WEB_DRIVER_ELEMENT_IDENTIFIER, $rawElement)) {
24*04fd306cSNickeau            // W3C's WebDriver
25*04fd306cSNickeau            return $rawElement[self::WEB_DRIVER_ELEMENT_IDENTIFIER];
26*04fd306cSNickeau        }
27*04fd306cSNickeau
28*04fd306cSNickeau        // Legacy JsonWire
29*04fd306cSNickeau        return $rawElement['ELEMENT'];
30*04fd306cSNickeau    }
31*04fd306cSNickeau
32*04fd306cSNickeau    /**
33*04fd306cSNickeau     * @param WebDriverBy $by
34*04fd306cSNickeau     * @param bool $isW3cCompliant
35*04fd306cSNickeau     *
36*04fd306cSNickeau     * @return array
37*04fd306cSNickeau     */
38*04fd306cSNickeau    public static function getUsing(WebDriverBy $by, $isW3cCompliant)
39*04fd306cSNickeau    {
40*04fd306cSNickeau        $mechanism = $by->getMechanism();
41*04fd306cSNickeau        $value = $by->getValue();
42*04fd306cSNickeau
43*04fd306cSNickeau        if ($isW3cCompliant) {
44*04fd306cSNickeau            switch ($mechanism) {
45*04fd306cSNickeau                // Convert to CSS selectors
46*04fd306cSNickeau                case 'class name':
47*04fd306cSNickeau                    $mechanism = 'css selector';
48*04fd306cSNickeau                    $value = sprintf('.%s', self::escapeSelector($value));
49*04fd306cSNickeau                    break;
50*04fd306cSNickeau                case 'id':
51*04fd306cSNickeau                    $mechanism = 'css selector';
52*04fd306cSNickeau                    $value = sprintf('#%s', self::escapeSelector($value));
53*04fd306cSNickeau                    break;
54*04fd306cSNickeau                case 'name':
55*04fd306cSNickeau                    $mechanism = 'css selector';
56*04fd306cSNickeau                    $value = sprintf('[name=\'%s\']', self::escapeSelector($value));
57*04fd306cSNickeau                    break;
58*04fd306cSNickeau            }
59*04fd306cSNickeau        }
60*04fd306cSNickeau
61*04fd306cSNickeau        return ['using' => $mechanism, 'value' => $value];
62*04fd306cSNickeau    }
63*04fd306cSNickeau
64*04fd306cSNickeau    /**
65*04fd306cSNickeau     * Escapes a CSS selector.
66*04fd306cSNickeau     *
67*04fd306cSNickeau     * Code adapted from the Zend Escaper project.
68*04fd306cSNickeau     *
69*04fd306cSNickeau     * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
70*04fd306cSNickeau     * @see https://github.com/zendframework/zend-escaper/blob/master/src/Escaper.php
71*04fd306cSNickeau     *
72*04fd306cSNickeau     * @param string $selector
73*04fd306cSNickeau     * @return string
74*04fd306cSNickeau     */
75*04fd306cSNickeau    private static function escapeSelector($selector)
76*04fd306cSNickeau    {
77*04fd306cSNickeau        return preg_replace_callback('/[^a-z0-9]/iSu', function ($matches) {
78*04fd306cSNickeau            $chr = $matches[0];
79*04fd306cSNickeau            if (mb_strlen($chr) === 1) {
80*04fd306cSNickeau                $ord = ord($chr);
81*04fd306cSNickeau            } else {
82*04fd306cSNickeau                $chr = mb_convert_encoding($chr, 'UTF-32BE', 'UTF-8');
83*04fd306cSNickeau                $ord = hexdec(bin2hex($chr));
84*04fd306cSNickeau            }
85*04fd306cSNickeau
86*04fd306cSNickeau            return sprintf('\\%X ', $ord);
87*04fd306cSNickeau        }, $selector);
88*04fd306cSNickeau    }
89*04fd306cSNickeau}
90