U
    ^»{j‰  ã                   @  s
  d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	Z	ddl
mZ ddlmZmZmZ dd	lmZmZ dd
lmZmZ ddlmZ erÜddl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	 $e%¡Z&G dd„ deƒZ'G dd„ deƒZ(dS )z0Provides the sync api: `BrowserSync`, `TabSync`.é    )ÚannotationsN)ÚLock)ÚTYPE_CHECKINGé   )Ú
BrokerSync)ÚBrowserClosedErrorÚBrowserFailedErrorÚChromium)ÚChannelClosedErrorÚPipe)ÚSessionSyncÚ
TargetSync)Úkill)ÚPath)ÚTracebackType)ÚAnyÚMutableMapping)ÚSelf)ÚBrowserImplInterface)ÚChannelInterfacec                   @  s   e Zd ZdZdS )ÚTabSynczHA wrapper for `TargetSync`, so user can use `TabSync`, not `TargetSync`.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   úY/var/www/html/bwave/python/venv/lib/python3.8/site-packages/choreographer/browser_sync.pyr      s   r   c                      s  e Zd ZU dZded< ded< ddœdd	„Zd
dœdd„Zd
dœdd„Zd:ee	dœddddddœdd„Z
ddœ‡ fdd„Zddœdd„Zd;dd
dœd d!„Zddœd"d#„Zddœd$d%„Zd&d'd(dd)œd*d+„Zd,dd-œd.d/„Zd0dd1œd2d3„Zd4dœd5d6„Zddd7œd8d9„Z‡  ZS )<ÚBrowserSyncz6`BrowserSync` is the sync implementation of `Browser`.zMutableMapping[str, TabSync]ÚtabszMutableMapping[str, TargetSync]ÚtargetsÚNone)Úreturnc                 C  s   t ƒ | _d S ©N)r   Ú
_open_lock©Úselfr   r   r   Ú
_make_lock/   s    zBrowserSync._make_lockÚboolc                 C  s   | j jdd� S )NF)Úblocking)r#   Úacquirer$   r   r   r   Ú_is_open2   s    zBrowserSync._is_openc                 C  s@   z$| j  ¡ r| j  ¡  W dS W dS W n tk
r:   Y dS X d S )NTF)r#   ÚlockedÚreleaseÚRuntimeErrorr$   r   r   r   Ú_release_lock5   s    


zBrowserSync._release_lockN)Úbrowser_clsÚchannel_clszstr | Path | Noneztype[BrowserImplInterface]ztype[ChannelInterface]r   )Úpathr/   r0   Úkwargsr!   c                K  st   t  d¡ |  ¡  i | _i | _|ƒ | _t| | jƒ| _|| j|f|Ž| _t	|dƒrX|j
}nd}tjd|d�\| _}dS )a”  
        Construct a new browser instance.

        Args:
            path: The path to the browser executable.
            browser_cls: The type of browser (default: `Chromium`).
            channel_cls: The type of channel to browser (default: `Pipe`).
            kwargs: The arguments that the browser_cls takes. For example,
                headless=True/False, enable_gpu=True/False, etc.

        zAttempting to open new browser.Úlogger_parserNZbrowser_proc)Úparser)Ú_loggerÚdebugr&   r   r   Ú_channelr   Ú_brokerÚ_browser_implÚhasattrr3   ÚlogistroZgetPipeLoggerÚ_logger_pipe)r%   r1   r/   r0   r2   r4   Ú_r   r   r   Ú__init__?   s    

þzBrowserSync.__init__c                   sn   |   ¡ rtdƒ‚tj| j ¡ f| j| j ¡ dœ| j ¡ —Ž| _t	ƒ  
d| j¡ |  td| jƒ¡ | j ¡  dS )zOpen the browser.zCan't re-open the browser)ÚstderrÚenvÚ0Ú N)r*   r-   Ú
subprocessÚPopenr9   Zget_clir<   Zget_envZget_popen_argsÚsuperr>   r8   Z_add_sessionr   r7   Úopenr$   ©Ú	__class__r   r   rF   d   s    ÿýüzBrowserSync.openr   c                 C  s   |   ¡  | S )z=Open browser as context to launch on entry and close on exit.)rF   r$   r   r   r   Ú	__enter__r   s    zBrowserSync.__enter__r   z
int | None)Úwaitr!   c                 C  sD   |dkr| j  ¡ d kS z| j  |¡ W n t jk
r>   Y dS X dS )Nr   FT)rC   ÚpollrJ   ÚTimeoutExpired)r%   rJ   r   r   r   Ú
_is_closedw   s    zBrowserSync._is_closedc              	   C  sœ   |   ¡ rd S z|  d¡ W n@ ttfk
r>   t d¡ Y d S  tk
rZ   t d¡ Y nX | j ¡  | j dd�rvd S t	| j
ƒ | j dd�r�d S tdƒ‚d S )NzBrowser.closez.Browser is closed trying to send Browser.closez'Can send browser.close on close channelé   )rJ   é   z)Couldn't close or kill browser subprocess)rM   Zsend_commandr   r   r5   r6   r
   r7   Úcloser   rC   r-   r$   r   r   r   Ú_close�   s     


zBrowserSync._closec                 C  sž   | j  ¡  t d¡ |  ¡ s dS z t d¡ |  ¡  t d¡ W n tk
rT   Y nX | jrht 	| j¡ t d¡ | j
 	¡  t d¡ | j ¡  t d¡ dS )úClose the browser.zBroker cleaned up.NzTrying to close browser.z%browser._close() called successfully.zLogging pipe closed.zBrowser channel closed.z"Browser implementation cleaned up.)r8   Úcleanr5   r6   r.   rQ   ÚProcessLookupErrorr<   ÚosrP   r7   r9   r$   r   r   r   rP   ™   s"    






zBrowserSync.closeztype[BaseException] | NonezBaseException | NonezTracebackType | None)Útype_ÚvalueÚ	tracebackr!   c                 C  s   |   ¡  dS )rR   N)rP   )r%   rV   rW   rX   r   r   r   Ú__exit__­   s    zBrowserSync.__exit__r   )Útabr!   c                 C  s"   t |tƒstdƒ‚|| j|j< d S )Nz tab must be an object of TabSync)Ú
isinstancer   Ú	TypeErrorr   Ú	target_id)r%   rZ   r   r   r   Ú_add_tab¶   s    
zBrowserSync._add_tabÚstr)r]   r!   c                 C  s   t |tƒr|j}| j|= d S r"   )r[   r   r]   r   )r%   r]   r   r   r   Ú_remove_tab»   s    
zBrowserSync._remove_tabzTabSync | Nonec                 C  s    | j  ¡ rtt| j  ¡ ƒƒS dS )z;Get the first tab if there is one. Useful for default tabs.N)r   ÚvaluesÚnextÚiterr$   r   r   r   Úget_tabÀ   s    
zBrowserSync.get_tab)r2   r!   c                 K  s   | j jf |Ž dS )z•
        Start a separate thread that dumps all messages received to stdout.

        Args:
            kwargs: passed directly to print().

        N)r8   Zrun_output_thread)r%   r2   r   r   r   Ústart_output_threadÇ   s    zBrowserSync.start_output_thread)N)r   )r   r   r   r   Ú__annotations__r&   r*   r.   r	   r   r>   rF   rI   rM   rQ   rP   rY   r^   r`   rd   re   Ú__classcell__r   r   rG   r   r   #   s*   
 þû%
	r   ))r   Ú
__future__r   rU   rC   Ú	threadingr   Útypingr   r;   Z_brokersr   Zbrowsersr   r   r	   Zchannelsr
   r   Zprotocol.devtools_syncr   r   Zutils._killr   Úpathlibr   Útypesr   r   r   Útyping_extensionsr   Zbrowsers._interface_typer   Zchannels._interface_typer   Ú	getLoggerr   r5   r   r   r   r   r   r   Ú<module>   s*   
