U
    /e:                     @  s  d Z ddlmZ ddlZeeZddlmZ edd ddl	Z	ddl
Z
ddlmZmZmZmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZ ddlmZ ed ZdZddddZd&dddddZdddddZddddZ ddd d!Z!G d"d# d#Z"e" Z#e	$d$d%  dS )'z

    )annotationsN   )import_requiredzselenium.webdriverzmTo use bokeh.io image export functions you need selenium ('conda install selenium' or 'pip install selenium'))devnulldirnameisfilejoin)which)ListSet)	webdriver)	WebDriver)Literal)firefoxchromium)webdriver_controlr   returnc                  C  s   t d} | d krtdt d}|d kr0tdtt| ddtt| ddddg}|D ]}t|rX|} qrqX| }dd	lm} ||}tjj	
 }|d
 tj|||tdS )Nr   z/firefox is not installed or not present on PATHgeckodriverz3geckodriver is not installed or not present on PATHZ
FirefoxAppZContentsZMacOSr   )FirefoxBinary
--headless)optionsZfirefox_binaryZexecutable_pathZservice_log_path)r	   RuntimeErrorr   r   _is_executableZ)selenium.webdriver.firefox.firefox_binaryr   r   r   r   Optionsadd_argumentZFirefoxr   )r   r   Zfirefox_pathsZfirefox_pathZbinary_pathr   binaryr    r   6/tmp/pip-unpacked-wheel-f5fndrjf/bokeh/io/webdriver.pycreate_firefox_webdriver?   s0    
r   zList[str] | None)extra_optionsr   c                 C  sX   t jj }|d |d |d |d | rL| D ]}|| q<t j|dS )Nr   z--hide-scrollbarsz--force-device-scale-factor=1z--force-color-profile=srgb)r   )r   Zchromer   r   r   ZChrome)r    r   opr   r   r   create_chromium_webdrivera   s    



r"   strbool)pathr   c                 C  s   t | ot| tjS N)r   osaccessX_OK)r%   r   r   r   r   p   s    r   WebDriver | Nonec                   C  s$   zt  W S  tk
r   Y d S X d S r&   )r   	Exceptionr   r   r   r   _try_create_firefox_webdrivers   s    r,   c                   C  s$   zt  W S  tk
r   Y d S X d S r&   )r"   r+   r   r   r   r   _try_create_chromium_webdrivery   s    r-   c                   @  s   e Zd ZU ded< ded< ded< ded< d	d
dddddddZdddddZddddZddddZd dddddZdddddZ	ddddZ
d	S )!_WebdriverStater$   reusezDriverKind | Nonekindr*   currentzSet[WebDriver]_driversNT)r0   r/   None)r0   r/   r   c                C  s   || _ || _d | _t | _d S r&   )r0   r/   r1   setr2   )selfr0   r/   r   r   r   __init__   s    z_WebdriverState.__init__r   )driverr   c                 C  s   | j | |  d S r&   )r2   removequitr5   r7   r   r   r   	terminate   s    z_WebdriverState.terminater   c                 C  s    | j d k	r| | j  d | _ d S r&   )r1   r;   r5   r   r   r   reset   s    
z_WebdriverState.resetc                 C  s(   | j r| jd kr"|   |  | _| jS r&   )r/   r1   r=   creater<   r   r   r   get   s    
z_WebdriverState.get)r0   r   c                 C  s   |  |}| j| |S r&   )_creater2   add)r5   r0   r7   r   r   r   r>      s    
z_WebdriverState.createc                 C  s|   |p| j }|d krLt }|d k	r*d| _ |S t }|d k	rBd| _ |S tdn,|dkrZt S |dkrht S td| dd S )Nr   r   zNeither firefox and geckodriver nor a variant of chromium browser and chromedriver are available on system PATH. You can install the former with 'conda install -c conda-forge firefox geckodriver'.'z$' is not a recognized webdriver kind)r0   r-   r,   r   r"   r   
ValueError)r5   r0   Zdriver_kindr7   r   r   r   r@      s     

z_WebdriverState._createc                 C  s&   |    t| jD ]}| | qd S r&   )r=   listr2   r;   r:   r   r   r   cleanup   s    z_WebdriverState.cleanup)N)__name__
__module____qualname____annotations__r6   r;   r=   r?   r>   r@   rE   r   r   r   r   r.      s   
r.   c                   C  s   t  S r&   )r   rE   r   r   r   r   <lambda>       rJ   )N)%__doc__
__future__r   logging	getLoggerrF   logZutil.dependenciesr   atexitr'   os.pathr   r   r   r   shutilr	   typingr
   r   Zseleniumr   Z#selenium.webdriver.remote.webdriverr   Ztyping_extensionsr   Z
DriverKind__all__r   r"   r   r,   r-   r.   r   registerr   r   r   r   <module>   s2   
"C