xref: /template/strap/vendor/php-webdriver/webdriver/lib/Chrome/ChromeOptions.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeaunamespace Facebook\WebDriver\Chrome;
4*04fd306cSNickeau
5*04fd306cSNickeauuse Facebook\WebDriver\Remote\DesiredCapabilities;
6*04fd306cSNickeauuse JsonSerializable;
7*04fd306cSNickeauuse ReturnTypeWillChange;
8*04fd306cSNickeau
9*04fd306cSNickeau/**
10*04fd306cSNickeau * The class manages the capabilities in ChromeDriver.
11*04fd306cSNickeau *
12*04fd306cSNickeau * @see https://sites.google.com/a/chromium.org/chromedriver/capabilities
13*04fd306cSNickeau */
14*04fd306cSNickeauclass ChromeOptions implements JsonSerializable
15*04fd306cSNickeau{
16*04fd306cSNickeau    /**
17*04fd306cSNickeau     * The key of chromeOptions in desired capabilities (in legacy OSS JsonWire protocol)
18*04fd306cSNickeau     * @todo Replace value with 'goog:chromeOptions' after JsonWire protocol support is removed
19*04fd306cSNickeau     */
20*04fd306cSNickeau    const CAPABILITY = 'chromeOptions';
21*04fd306cSNickeau    /**
22*04fd306cSNickeau     * The key of chromeOptions in desired capabilities (in W3C compatible protocol)
23*04fd306cSNickeau     */
24*04fd306cSNickeau    const CAPABILITY_W3C = 'goog:chromeOptions';
25*04fd306cSNickeau    /**
26*04fd306cSNickeau     * @var array
27*04fd306cSNickeau     */
28*04fd306cSNickeau    private $arguments = [];
29*04fd306cSNickeau    /**
30*04fd306cSNickeau     * @var string
31*04fd306cSNickeau     */
32*04fd306cSNickeau    private $binary = '';
33*04fd306cSNickeau    /**
34*04fd306cSNickeau     * @var array
35*04fd306cSNickeau     */
36*04fd306cSNickeau    private $extensions = [];
37*04fd306cSNickeau    /**
38*04fd306cSNickeau     * @var array
39*04fd306cSNickeau     */
40*04fd306cSNickeau    private $experimentalOptions = [];
41*04fd306cSNickeau
42*04fd306cSNickeau    /**
43*04fd306cSNickeau     * Return a version of the class which can JSON serialized.
44*04fd306cSNickeau     *
45*04fd306cSNickeau     * @return array
46*04fd306cSNickeau     */
47*04fd306cSNickeau    #[ReturnTypeWillChange]
48*04fd306cSNickeau    public function jsonSerialize()
49*04fd306cSNickeau    {
50*04fd306cSNickeau        return $this->toArray();
51*04fd306cSNickeau    }
52*04fd306cSNickeau
53*04fd306cSNickeau    /**
54*04fd306cSNickeau     * Sets the path of the Chrome executable. The path should be either absolute
55*04fd306cSNickeau     * or relative to the location running ChromeDriver server.
56*04fd306cSNickeau     *
57*04fd306cSNickeau     * @param string $path
58*04fd306cSNickeau     * @return ChromeOptions
59*04fd306cSNickeau     */
60*04fd306cSNickeau    public function setBinary($path)
61*04fd306cSNickeau    {
62*04fd306cSNickeau        $this->binary = $path;
63*04fd306cSNickeau
64*04fd306cSNickeau        return $this;
65*04fd306cSNickeau    }
66*04fd306cSNickeau
67*04fd306cSNickeau    /**
68*04fd306cSNickeau     * @param array $arguments
69*04fd306cSNickeau     * @return ChromeOptions
70*04fd306cSNickeau     */
71*04fd306cSNickeau    public function addArguments(array $arguments)
72*04fd306cSNickeau    {
73*04fd306cSNickeau        $this->arguments = array_merge($this->arguments, $arguments);
74*04fd306cSNickeau
75*04fd306cSNickeau        return $this;
76*04fd306cSNickeau    }
77*04fd306cSNickeau
78*04fd306cSNickeau    /**
79*04fd306cSNickeau     * Add a Chrome extension to install on browser startup. Each path should be
80*04fd306cSNickeau     * a packed Chrome extension.
81*04fd306cSNickeau     *
82*04fd306cSNickeau     * @param array $paths
83*04fd306cSNickeau     * @return ChromeOptions
84*04fd306cSNickeau     */
85*04fd306cSNickeau    public function addExtensions(array $paths)
86*04fd306cSNickeau    {
87*04fd306cSNickeau        foreach ($paths as $path) {
88*04fd306cSNickeau            $this->addExtension($path);
89*04fd306cSNickeau        }
90*04fd306cSNickeau
91*04fd306cSNickeau        return $this;
92*04fd306cSNickeau    }
93*04fd306cSNickeau
94*04fd306cSNickeau    /**
95*04fd306cSNickeau     * @param array $encoded_extensions An array of base64 encoded of the extensions.
96*04fd306cSNickeau     * @return ChromeOptions
97*04fd306cSNickeau     */
98*04fd306cSNickeau    public function addEncodedExtensions(array $encoded_extensions)
99*04fd306cSNickeau    {
100*04fd306cSNickeau        foreach ($encoded_extensions as $encoded_extension) {
101*04fd306cSNickeau            $this->addEncodedExtension($encoded_extension);
102*04fd306cSNickeau        }
103*04fd306cSNickeau
104*04fd306cSNickeau        return $this;
105*04fd306cSNickeau    }
106*04fd306cSNickeau
107*04fd306cSNickeau    /**
108*04fd306cSNickeau     * Sets an experimental option which has not exposed officially.
109*04fd306cSNickeau     *
110*04fd306cSNickeau     * @param string $name
111*04fd306cSNickeau     * @param mixed $value
112*04fd306cSNickeau     * @return ChromeOptions
113*04fd306cSNickeau     */
114*04fd306cSNickeau    public function setExperimentalOption($name, $value)
115*04fd306cSNickeau    {
116*04fd306cSNickeau        $this->experimentalOptions[$name] = $value;
117*04fd306cSNickeau
118*04fd306cSNickeau        return $this;
119*04fd306cSNickeau    }
120*04fd306cSNickeau
121*04fd306cSNickeau    /**
122*04fd306cSNickeau     * @return DesiredCapabilities The DesiredCapabilities for Chrome with this options.
123*04fd306cSNickeau     */
124*04fd306cSNickeau    public function toCapabilities()
125*04fd306cSNickeau    {
126*04fd306cSNickeau        $capabilities = DesiredCapabilities::chrome();
127*04fd306cSNickeau        $capabilities->setCapability(self::CAPABILITY, $this);
128*04fd306cSNickeau
129*04fd306cSNickeau        return $capabilities;
130*04fd306cSNickeau    }
131*04fd306cSNickeau
132*04fd306cSNickeau    /**
133*04fd306cSNickeau     * @return \ArrayObject|array
134*04fd306cSNickeau     */
135*04fd306cSNickeau    public function toArray()
136*04fd306cSNickeau    {
137*04fd306cSNickeau        // The selenium server expects a 'dictionary' instead of a 'list' when
138*04fd306cSNickeau        // reading the chrome option. However, an empty array in PHP will be
139*04fd306cSNickeau        // converted to a 'list' instead of a 'dictionary'. To fix it, we work
140*04fd306cSNickeau        // with `ArrayObject`
141*04fd306cSNickeau        $options = new \ArrayObject($this->experimentalOptions);
142*04fd306cSNickeau
143*04fd306cSNickeau        if (!empty($this->binary)) {
144*04fd306cSNickeau            $options['binary'] = $this->binary;
145*04fd306cSNickeau        }
146*04fd306cSNickeau
147*04fd306cSNickeau        if (!empty($this->arguments)) {
148*04fd306cSNickeau            $options['args'] = $this->arguments;
149*04fd306cSNickeau        }
150*04fd306cSNickeau
151*04fd306cSNickeau        if (!empty($this->extensions)) {
152*04fd306cSNickeau            $options['extensions'] = $this->extensions;
153*04fd306cSNickeau        }
154*04fd306cSNickeau
155*04fd306cSNickeau        return $options;
156*04fd306cSNickeau    }
157*04fd306cSNickeau
158*04fd306cSNickeau    /**
159*04fd306cSNickeau     * Add a Chrome extension to install on browser startup. Each path should be a
160*04fd306cSNickeau     * packed Chrome extension.
161*04fd306cSNickeau     *
162*04fd306cSNickeau     * @param string $path
163*04fd306cSNickeau     * @return ChromeOptions
164*04fd306cSNickeau     */
165*04fd306cSNickeau    private function addExtension($path)
166*04fd306cSNickeau    {
167*04fd306cSNickeau        $this->addEncodedExtension(base64_encode(file_get_contents($path)));
168*04fd306cSNickeau
169*04fd306cSNickeau        return $this;
170*04fd306cSNickeau    }
171*04fd306cSNickeau
172*04fd306cSNickeau    /**
173*04fd306cSNickeau     * @param string $encoded_extension Base64 encoded of the extension.
174*04fd306cSNickeau     * @return ChromeOptions
175*04fd306cSNickeau     */
176*04fd306cSNickeau    private function addEncodedExtension($encoded_extension)
177*04fd306cSNickeau    {
178*04fd306cSNickeau        $this->extensions[] = $encoded_extension;
179*04fd306cSNickeau
180*04fd306cSNickeau        return $this;
181*04fd306cSNickeau    }
182*04fd306cSNickeau}
183