1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace Facebook\WebDriver\Firefox; 4*04fd306cSNickeau 5*04fd306cSNickeauuse ReturnTypeWillChange; 6*04fd306cSNickeau 7*04fd306cSNickeau/** 8*04fd306cSNickeau * Class to manage Firefox-specific capabilities 9*04fd306cSNickeau * 10*04fd306cSNickeau * @see https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/firefoxOptions 11*04fd306cSNickeau */ 12*04fd306cSNickeauclass FirefoxOptions implements \JsonSerializable 13*04fd306cSNickeau{ 14*04fd306cSNickeau /** @var string The key of FirefoxOptions in desired capabilities */ 15*04fd306cSNickeau const CAPABILITY = 'moz:firefoxOptions'; 16*04fd306cSNickeau /** @var string */ 17*04fd306cSNickeau const OPTION_ARGS = 'args'; 18*04fd306cSNickeau /** @var string */ 19*04fd306cSNickeau const OPTION_PREFS = 'prefs'; 20*04fd306cSNickeau 21*04fd306cSNickeau /** @var array */ 22*04fd306cSNickeau private $options = []; 23*04fd306cSNickeau /** @var array */ 24*04fd306cSNickeau private $arguments = []; 25*04fd306cSNickeau /** @var array */ 26*04fd306cSNickeau private $preferences = []; 27*04fd306cSNickeau 28*04fd306cSNickeau public function __construct() 29*04fd306cSNickeau { 30*04fd306cSNickeau // Set default preferences: 31*04fd306cSNickeau // disable the "Reader View" help tooltip, which can hide elements in the window.document 32*04fd306cSNickeau $this->setPreference(FirefoxPreferences::READER_PARSE_ON_LOAD_ENABLED, false); 33*04fd306cSNickeau // disable JSON viewer and let JSON be rendered as raw data 34*04fd306cSNickeau $this->setPreference(FirefoxPreferences::DEVTOOLS_JSONVIEW, false); 35*04fd306cSNickeau } 36*04fd306cSNickeau 37*04fd306cSNickeau /** 38*04fd306cSNickeau * Directly set firefoxOptions. 39*04fd306cSNickeau * Use `addArguments` to add command line arguments and `setPreference` to set Firefox about:config entry. 40*04fd306cSNickeau * 41*04fd306cSNickeau * @param string $name 42*04fd306cSNickeau * @param mixed $value 43*04fd306cSNickeau * @return self 44*04fd306cSNickeau */ 45*04fd306cSNickeau public function setOption($name, $value) 46*04fd306cSNickeau { 47*04fd306cSNickeau if ($name === self::OPTION_PREFS) { 48*04fd306cSNickeau throw new \InvalidArgumentException('Use setPreference() method to set Firefox preferences'); 49*04fd306cSNickeau } 50*04fd306cSNickeau if ($name === self::OPTION_ARGS) { 51*04fd306cSNickeau throw new \InvalidArgumentException('Use addArguments() method to add Firefox arguments'); 52*04fd306cSNickeau } 53*04fd306cSNickeau 54*04fd306cSNickeau $this->options[$name] = $value; 55*04fd306cSNickeau 56*04fd306cSNickeau return $this; 57*04fd306cSNickeau } 58*04fd306cSNickeau 59*04fd306cSNickeau /** 60*04fd306cSNickeau * Command line arguments to pass to the Firefox binary. 61*04fd306cSNickeau * These must include the leading dash (-) where required, e.g. ['-headless']. 62*04fd306cSNickeau * 63*04fd306cSNickeau * @see https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/firefoxOptions#args 64*04fd306cSNickeau * @param string[] $arguments 65*04fd306cSNickeau * @return self 66*04fd306cSNickeau */ 67*04fd306cSNickeau public function addArguments(array $arguments) 68*04fd306cSNickeau { 69*04fd306cSNickeau $this->arguments = array_merge($this->arguments, $arguments); 70*04fd306cSNickeau 71*04fd306cSNickeau return $this; 72*04fd306cSNickeau } 73*04fd306cSNickeau 74*04fd306cSNickeau /** 75*04fd306cSNickeau * Set Firefox preference (about:config entry). 76*04fd306cSNickeau * 77*04fd306cSNickeau * @see http://kb.mozillazine.org/About:config_entries 78*04fd306cSNickeau * @see https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/firefoxOptions#prefs 79*04fd306cSNickeau * @param string $name 80*04fd306cSNickeau * @param string|bool|int $value 81*04fd306cSNickeau * @return self 82*04fd306cSNickeau */ 83*04fd306cSNickeau public function setPreference($name, $value) 84*04fd306cSNickeau { 85*04fd306cSNickeau $this->preferences[$name] = $value; 86*04fd306cSNickeau 87*04fd306cSNickeau return $this; 88*04fd306cSNickeau } 89*04fd306cSNickeau 90*04fd306cSNickeau /** 91*04fd306cSNickeau * @return array 92*04fd306cSNickeau */ 93*04fd306cSNickeau public function toArray() 94*04fd306cSNickeau { 95*04fd306cSNickeau $array = $this->options; 96*04fd306cSNickeau if (!empty($this->arguments)) { 97*04fd306cSNickeau $array[self::OPTION_ARGS] = $this->arguments; 98*04fd306cSNickeau } 99*04fd306cSNickeau if (!empty($this->preferences)) { 100*04fd306cSNickeau $array[self::OPTION_PREFS] = $this->preferences; 101*04fd306cSNickeau } 102*04fd306cSNickeau 103*04fd306cSNickeau return $array; 104*04fd306cSNickeau } 105*04fd306cSNickeau 106*04fd306cSNickeau #[ReturnTypeWillChange] 107*04fd306cSNickeau public function jsonSerialize() 108*04fd306cSNickeau { 109*04fd306cSNickeau return new \ArrayObject($this->toArray()); 110*04fd306cSNickeau } 111*04fd306cSNickeau} 112