o
    _c                     @   s   d Z ddlZddlZddlmZmZmZmZm	Z	 ddl
mZ ddlmZ ddlmZmZ ddlmZ G dd	 d	Zd
dddddZdS )zNavigator Watcher module.    N)Any	AwaitableDictListUnion)helper)TimeoutError)FrameManagerFrame)
merge_dictc                   @   s   e Zd ZdZ	ddedededededdfd	d
Z	deddfddZ
ded fddZdefddZddeddfddZddeddfddZdedee defddZdddZdddZdS )NavigatorWatcherzNavigatorWatcher class.NframeManagerframetimeoutoptionskwargsreturnc                    s   t ||} | | _| _|j _| _d _t	 jt
jj jt	 jt
jj jt	 jt
jj jg _ jjj _ j  _ jtj j  gtjjd _ j fdd dS )zMake new navigator watcher.F)return_whenc                    s      S N_cleanup)futself F/usr/local/lib/python3.10/dist-packages/pyppeteer/navigator_watcher.py<lambda>6   s    z+NavigatorWatcher.__init__.<locals>.<lambda>N)r   _validate_optionsZ_frameManager_frame	_loaderId_initialLoaderId_timeout_hasSameDocumentNavigationr   ZaddEventListenerr	   ZEventsZLifecycleEvent_checkLifecycleCompleteZFrameNavigatedWithinDocument_navigatedWithinDocumentZFrameDetached_eventListenersZ_client_loopcreate_future_lifecycleCompletePromisecreate_taskasynciowait_createTimeoutPromise
concurrentfuturesFIRST_COMPLETED_navigationPromiseadd_done_callback)r   r   r   r   r   r   r   r   r   __init__   sD   




zNavigatorWatcher.__init__c                 C   s   d|v rt dd|v rt d|ddkrt d|ddkr.d	d l}|td
 |dd}t|tr<|}nt|trE|g}n	t	dt
| g | _|D ]}t|}|d u ret d| | j| qSd S )NZnetworkIdleTimeoutz3`networkIdleTimeout` option is no longer supported.ZnetworkIdleInflightz4`networkIdleInflight` option is no longer supported.	waitUntilZnetworkidlezH`networkidle` option is no logner supported. Use `networkidle2` instead.documentloadedr   zO`documentloaded` option is no longer supported. Use `domcontentloaded` instead.loadz>`waitUntil` option should be str or list of str, but got type z%Unknown value for options.waitUntil: )
ValueErrorgetlogging	getLogger__name__warning
isinstanceliststr	TypeErrortype_expectedLifecyclepyppeteerToProtocolLifecycleappend)r   r   r8   Z
_waitUntilr3   valueZprotocolEventr   r   r   r   8   sH   



z"NavigatorWatcher._validate_optionsc                    sX   j  _jr#dj d d fdd}j | _jS j  _jS )NzNavigation Timeout Exceeded: z ms exceeded.r   c                      s,   t jd I d H  jt  d S )Ni  )r*   sleepr!   _maximumTimerset_exceptionr   r   ZerrorMessager   r   r   _timeout_func_   s   z=NavigatorWatcher._createTimeoutPromise.<locals>._timeout_funcr   N)r&   r'   rF   r!   r)   _timeout_timer)r   rI   r   rH   r   r,   Z   s   z&NavigatorWatcher._createTimeoutPromisec                 C   s   | j S )zReturn navigation promise.)r0   r   r   r   r   navigationPromiseh   s   z"NavigatorWatcher.navigationPromisec                 C   s    || j krd S d| _|   d S )NT)r   r"   r#   r   r   r   r   r   r$   l   s   
z)NavigatorWatcher._navigatedWithinDocumentc                 C   sJ   | j j| jkr| jsd S | | j | jsd S | j s#| jd  d S d S r   )	r   r   r    r"   _checkLifecyclerA   r(   done
set_resultrM   r   r   r   r#   r   s   
z(NavigatorWatcher._checkLifecycleCompleteexpectedLifecyclec                 C   s<   |D ]
}||j vr dS q|jD ]}| ||s dS qdS )NFT)Z_lifecycleEventsZchildFramesrN   )r   r   rQ   eventchildr   r   r   rN   |   s   

z NavigatorWatcher._checkLifecyclec                 C   s   |    dS )zCancel navigation.Nr   r   r   r   r   cancel   s   zNavigatorWatcher.cancelc                 C   s.   t | j | j  | j  | j  d S r   )r   ZremoveEventListenersr%   r(   rT   rF   rK   r   r   r   r   r      s   

zNavigatorWatcher._cleanupr   rJ   )r:   
__module____qualname____doc__r	   r
   intr   r   r2   r   r   r,   rL   r$   r#   r   r>   boolrN   rT   r   r   r   r   r   r      s(    
%"



r   r5   ZDOMContentLoadedZnetworkIdleZnetworkAlmostIdle)r5   Zdomcontentloadedr4   Znetworkidle0Znetworkidle2)rW   r*   concurrent.futuresr-   typingr   r   r   r   r   Z	pyppeteerr   Zpyppeteer.errorsr   Zpyppeteer.frame_managerr	   r
   Zpyppeteer.utilr   r   rB   r   r   r   r   <module>   s     
