U
    ^»{j±,  ã                   @  s.  d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ ddlZe ¡ dkrlddlZddlmZ ddlmZmZ d	d
lmZ erÄddlZddl
mZmZmZmZ ddlmZ e	eƒ ¡ jd Z e	eƒ ¡ jd Z!e "e#¡Z$dddœdd„Z%e &d¡Z'G dd„ de(ƒZ)G dd„ dƒZ*dS )z=Provides a class proving tools for running chromium browsers.é    )ÚannotationsN)ÚPath)ÚTYPE_CHECKINGÚWindows)ÚPipe)ÚTmpDirectoryÚget_browser_pathé   )Úchromium_based_browsers)ÚAnyÚMappingÚMutableMappingÚSequence)ÚChannelInterfacez_unix_pipe_chromium_wrapper.pyZpackaged_chromium_libsz
str | PathÚbool)ÚpathÚreturnc                 C  s$   zt  | t j¡W S    Y dS X d S )NF)ÚosÚaccessÚX_OK)r   © r   ú^/var/www/html/bwave/python/venv/lib/python3.8/site-packages/choreographer/browsers/chromium.pyÚ_is_exe&   s    r   z\d*:\d*:\d*\/\d*\.\d*:c                   @  s   e Zd ZdZdS )ÚChromeNotFoundErrorz,Raise when browser path can't be determined.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   0   s   r   c                   @  sú   e Zd ZU dZded< ded< ded< ded< ded< d	ed
< eddœddddœdd„ƒZeddddœdd„ƒZddœdd„Zd2dddddœdd „Z	ddœd!d"„Z
ddœd#d$„Zd%dœd&d'„Zd(dœd)d*„Zd+dœd,d-„Zddœd.d/„Zddœd0d1„ZdS )3ÚChromiumz�
    Chromium represents an implementation of the chromium browser.

    It also includes chromium-like browsers (chrome, edge, and brave).
    zstr | Path | Noner   r   Úgpu_enabledÚheadlessÚsandbox_enabledÚ
skip_localr   Útmp_dirF)Úskip_typicalz
str | None)r"   r$   r   c                C  sj   t  ¡ D ]\\}}t d|› d�¡ t|j||jd�}|sX|sX|jD ]}t|ƒrB|} qXqB|r|  S qdS )zFind a chromium based browser.zLooking for a z	 browser.)Zexecutable_namesr"   Ú
ms_prog_idN)	r
   ÚitemsÚ_loggerÚdebugr   Z	exe_namesr%   Ztypical_pathsr   )Úclsr"   r$   ÚnameZbrowser_datar   Ú	candidater   r   r   Úfind_browserH   s    ý

zChromium.find_browserzlogging.LogRecordzMutableMapping[str, Any])ÚrecordÚ_oldr   c                 C  s   t  d|j¡|_dS )a^  
        Remove chromium timestamp from chromium's logs.

        This method will be used as the `filter()` method on the `logging.Filter()`
        attached to all incoming logs from the browser process.

        Args:
            record: the `logging.LogRecord` object to read/modify
            _old: data that was already stripped out.

        Ú T)Ú_logs_parser_regexÚsubÚmsg)r)   r-   r.   r   r   r   Úlogger_parser`   s    zChromium.logger_parser)r   c              
   C  s  | j rt d¡ dS t d¡ t ¡ dkr8t d¡ dS d}z2t d| j› �¡ tjdt| jƒgdd	dd
�}W n^ t	k
rÌ } z@d}|r˜|j
r˜|j
 ¡ nd}t |d|› d|› � ¡ W Y ¢dS d}~X Y nX d|jkrúd}t |d|j ¡ › � ¡ dS t d¡ dS )zReturn true if libs ok.zIf we HAVE to skip local.TzChecking for libs needed.ÚLinuxz)We're not in linux, so no need for check.NzTrying ldd Zlddé   )Úcapture_outputÚtimeoutÚcheckzldd failed.z e: z
, stderr: Fs	   not foundzFound deps missing in chromeú z#No problems found with dependencies)r"   r'   r(   ÚplatformÚsystemr   Ú
subprocessÚrunÚstrÚ	ExceptionÚstderrÚdecodeÚinfoÚstdoutZdebug2)ÚselfÚpÚer2   r@   r   r   r   Ú_libs_okv   sF    ÿ

þù
	ÿÿ

zChromium._libs_okNr   zPath | str | Noner   ÚNone)Úchannelr   Úkwargsr   c                 K  sü   t  d|› �¡ || _| dd¡| _| dd¡| _| dd¡| _| dd¡| _|rdtd	| 	¡ › �ƒ‚t
d
t ¡  ¡ koz| jƒ| _| jr�t  d¡ | js¦tj| jd�| _| js¾td| j› d�ƒ‚t  d| j› �¡ || _t|tƒsètdƒ‚dt| jƒk| _dS )aû  
        Construct a chromium browser implementation.

        Args:
            channel: the `choreographer.Channel` we'll be using (WebSockets? Pipe?)
            path: path to the browser
            kwargs:
                gpu_enabled (default False): Turn on GPU? Doesn't work in all envs.
                headless (default True): Actually launch a browser?
                sandbox_enabled (default False): Enable sandbox-
                    a persnickety thing depending on environment, OS, user, etc
                tmp_dir (default None): Manually set the temporary directory

        Raises:
            RuntimeError: Too many kwargs, or browser not found.
            NotImplementedError: Pipe is the only channel type it'll accept right now.

        zChromium init'ed with kwargs Z
enable_gpuFr    TZenable_sandboxr#   Nz*Chromium.get_cli() received invalid args: Zubuntuz?Forced skipping local. Ubuntu sandbox requires package manager.)r"   zzBrowser not found. You can use get_chrome() or choreo_get_chrome from bash. please see documentation. Local copy ignored: Ú.zFound chromium path: z-Websocket style channels not implemented yet.Zsnap)r'   rB   r   Úpopr   r    r!   Ú_tmp_dir_pathÚRuntimeErrorÚkeysr   r:   ÚversionÚlowerr"   Úwarningr   r,   r   Ú_channelÚ
isinstancer   ÚNotImplementedErrorr>   Ú_is_isolated)rD   rI   r   rJ   r   r   r   Ú__init__ž   s8    ÿÿÿÿ
zChromium.__init__c                 C  s6   t | j| jd�| _|  ¡  | _t d| jj› �¡ dS )zPrepare browser for opening.)r   ZsneakzTemporary directory at: N)	r   rM   rV   r#   rG   Zmissing_libsr'   rB   r   ©rD   r   r   r   Úpre_openÙ   s    þzChromium.pre_openc                 C  s   | j S )z�
        Return if /tmp directory is isolated by OS.

        Returns:
            bool indicating if /tmp is isolated.

        )rV   rX   r   r   r   Úis_isolatedâ   s    zChromium.is_isolatedzMapping[str, Any]c                 C  sd   i }t  ¡ dkr$tj|d< d|d< n,d|d< t| jtƒrP| jj|d< | jj|d< t	 
d|› �¡ |S )	zBReturn the args needed to runc chromium with `subprocess.Popen()`.r   ÚcreationflagsFÚ	close_fdsTÚstdinrC   zReturning args: )r:   r;   r<   ZCREATE_NEW_PROCESS_GROUPrT   rS   r   Úfrom_choreo_to_externalÚfrom_external_to_choreor'   r(   )rD   Úargsr   r   r   Úget_popen_argsì   s    

zChromium.get_popen_argszSequence[str]c                 C  s0  t  ¡ dkr(ttjƒttƒt| jƒg}nt| jƒg}| jsD| d¡ | j	rT| d¡ | j
sd| d¡ | dddd| jj› �d	d
ddddddddddddddddddg¡ t| jtƒ�r| d¡ t  ¡ dk�rt | jj¡}t | jj¡}d}t ||¡ t ||¡ |d|›d |›�g7 }t d!|› �¡ |S )"z$Return the CLI command for chromium.r   z--disable-gpuz
--headlessz--no-sandboxz--disable-breakpadz--allow-file-access-from-filesz--enable-logging=stderrz--user-data-dir=z--no-first-runz--enable-unsafe-swiftshaderz--disable-dev-shm-usagez"--disable-background-media-suspendz--disable-lazy-loadingz%--disable-background-timer-throttlingz(--disable-backgrounding-occluded-windowsz --disable-renderer-backgroundingz--disable-component-updatez--disable-hang-monitorz--disable-popup-blockingz--disable-prompt-on-repostz!--disable-ipc-flooding-protectionz--disable-syncz--metrics-recording-onlyz--password-store=basicz--use-mock-keychainz--no-default-browser-checkz--no-process-per-sitez--disable-web-securityz--remote-debugging-pipeTz--remote-debugging-io-pipes=ú,zReturning cli: )r:   r;   r>   ÚsysÚ
executableÚ_chromium_wrapper_pathr   r   Úappendr    r!   Úextendr#   rT   rS   r   ÚmsvcrtZget_osfhandler^   r_   r   Zset_handle_inheritabler'   r(   )rD   ÚcliZr_handleZw_handleZ_inheritabler   r   r   Úget_cliû   sj    ýÿ


èÿ
ÿzChromium.get_clizMutableMapping[str, str]c                 C  s   t j ¡ }|S )z#Return the env needed for chromium.)r   ÚenvironÚcopy)rD   Úenvr   r   r   Úget_env;  s    
zChromium.get_envc                 C  s   t | dƒr| j ¡  dS )z4Clean up any leftovers form browser, like tmp files.r#   N)Úhasattrr#   ÚcleanrX   r   r   r   rp   @  s    
zChromium.cleanc                 C  s   |   ¡  dS )z,Delete the temporary file and run `clean()`.N)rp   rX   r   r   r   Ú__del__E  s    zChromium.__del__)N)r   r   r   r   Ú__annotations__Úclassmethodr,   r3   rG   rW   rY   rZ   ra   rj   rn   rp   rq   r   r   r   r   r   4   s,   
ü+ ý;	
@r   )+r   Ú
__future__r   r   r:   Úrer<   rc   Úpathlibr   Útypingr   Zlogistror;   rh   Zchoreographer.channelsr   Zchoreographer.utilsr   r   Z_chrome_constantsr
   Úloggingr   r   r   r   Z&choreographer.channels._interface_typer   Ú__file__ÚresolveÚparentre   Z_packaged_chromium_libsÚ	getLoggerr   r'   r   Úcompiler0   rN   r   r   r   r   r   r   Ú<module>   s4   ÿ

