
    tf5                         d Z ddlZddlmZ ddlmZ ddlmZ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 dd	lmZ dd
lmZ  ej.                  e      Z G d de      Z G d de      Zy)zBrowser module.    N)Popen)SimpleNamespace)Any	AwaitableCallableDictListOptional)EventEmitter)
Connection)BrowserError)Page)Targetc                       e Zd ZdZ edddd      Z	 	 d'ded	ee   d
e	de
e   de
e   deg ed   f   deddf fdZede
e   fd       Zd(dZd(dZeded   fd       ZdeddfdZe	 	 d'ded	ee   d
e	de
e   de
e   deg ed   f   dedd fd       ZdeddfdZdeddfdZdeddfdZedefd       ZdefdZde
e   defdZdee    fd Z!dee   fd!Z"defd"Z#defd#Z$d)d$Z%d)d%Z&defd&Z' xZ(S )*BrowserzBrowser class.

    A Browser object is created when pyppeteer connects to chrome, either
    through :func:`~pyppeteer.launcher.launch` or
    :func:`~pyppeteer.launcher.connect`.
    targetcreatedtargetdestroyedtargetchangeddisconnected)TargetCreatedTargetDestroyedTargetChangedDisconnectedN
connection
contextIdsignoreHTTPSErrorsdefaultViewportprocesscloseCallbackkwargsreturnc                 r   
 t                    | _        | _        | _        g  _        | _         j                  j                  
dt        d    f
fd}|r| _	        n| _	        t         d        _        t                _        |D ]  }	t         |	       j                  |	<    t                _         j                  j                   fd        j                  j!                  d
 fd        j                  j!                  d
 fd        j                  j!                  d
 fd	       y )
Nr!   c                  J    j                         } | j                  d        | S N)create_future
set_result)futloops    [/var/www/html/software/conda/envs/higlass/lib/python3.12/site-packages/pyppeteer/browser.py_dummy_callbackz)Browser.__init__.<locals>._dummy_callback1   s"    $$&CNN4 J    c                  V     j                  t        j                  j                        S r$   )emitr   Eventsr   selfs   r)   <lambda>z"Browser.__init__.<locals>.<lambda>B   s    DIIgnn99: r+   zTarget.targetCreatedc                 D    j                  j                  |             S r$   )create_task_targetCreatedeventr(   r0   s    r)   r1   z"Browser.__init__.<locals>.<lambda>F   s    $**4+>+>u+EF r+   zTarget.targetDestroyedc                 D    j                  j                  |             S r$   )r3   _targetDestroyedr5   s    r)   r1   z"Browser.__init__.<locals>.<lambda>J   s    $**4+@+@+GH r+   zTarget.targetInfoChangedc                 D    j                  j                  |             S r$   )r3   _targetInfoChangedr5   s    r)   r1   z"Browser.__init__.<locals>.<lambda>N   s    $**4+B+B5+IJ r+   )super__init___ignoreHTTPSErrors_defaultViewport_process_screenshotTaskQueue_connection_loopr   _closeCallbackBrowserContext_defaultContextdict	_contexts_targetssetClosedCallbackon)r0   r   r   r   r   r   r   r    r*   	contextIdr(   	__class__s   `         @r)   r<   zBrowser.__init__$   s!   
 	"3 /*,!%%%	4 	
 "/D"1D-dD948F# 	HI(6tY(GDNN9%	H ,06**:	
 	"F	
 	$H	
 	&J	
r+   c                     | j                   S )zReturn process of this browser.

        If browser instance is created by :func:`pyppeteer.launcher.connect`,
        return ``None``.
        )r?   r/   s    r)   r   zBrowser.processQ   s     }}r+   rD   c                 h   K   t         j                  d       | j                          d{   S 7 w)zm[Deprecated] Miss spelled method.

        Use :meth:`createIncognitoBrowserContext` method instead.
        zWcreateIncogniteBrowserContext is deprecated. Use createIncognitoBrowserContext instead.N)loggerwarningcreateIncognitoBrowserContextr/   s    r)   createIncogniteBrowserContextz%Browser.createIncogniteBrowserContextZ   s0     
 	9	
 779999   )202c                    K   | j                   j                  d       d{   }|d   }t        | |      }|| j                  |<   |S 7 &w)a  Create a new incognito browser context.

        This won't share cookies/cache with other browser contexts.

        .. code::

            browser = await launch()
            # Create a new incognito browser context.
            context = await browser.createIncognitoBrowserContext()
            # Create a new page in a pristine context.
            page = await context.newPage()
            # Do stuff
            await page.goto('https://example.com')
            ...
        zTarget.createBrowserContextNbrowserContextId)rA   sendrD   rG   )r0   objrU   contexts       r)   rQ   z%Browser.createIncognitoBrowserContexte   sU       $$))*GHH12 '78+2'(	 Is   A
A'A
c                 x    | j                   g| j                  j                         D cg c]  }| c}z   S c c}w )zReturn a list of all open browser contexts.

        In a newly created browser, this will return a single instance of
        ``[BrowserContext]``
        )rE   rG   values)r0   rX   s     r)   browserContextszBrowser.browserContexts{   s3     $$%@U@U@W(XW(XXX(Xs   	7rK   c                    K   | j                   j                  dd|i       d {    | j                  j                  |d        y 7 !w)NzTarget.disposeBrowserContextrU   )rA   rV   rG   pop)r0   rK   s     r)   _disposeContextzBrowser._disposeContext   sM     ##$B	E
  	 	 	9d+	s   "AA"Ac                 j   K   t        | |||||      }| j                  dddi       d{    |S 7 w)zCreate browser object.zTarget.setDiscoverTargetsdiscoverTN)r   rV   )r   r   r   r   r   r   r    browsers           r)   createzBrowser.create   sF      *j2C)7MCoo9J;MNNN 	Os   (313r6   c           	      T   K   |d   j                  d      }|r| j                  v r j                  |   }n j                  }t        | fd j                   j
                   j                   j                  j                        }d    j                  v rt        d      | j                  d   <   |j                   d {   rU j                  t        j                  j                  |       |j                  t         j                  j                  |       y y 7 Zw)N
targetInforU   c                  :     j                   j                        S r$   )rA   createSession)r0   rd   s   r)   r1   z(Browser._targetCreated.<locals>.<lambda>   s    D$$22:> r+   targetIdz&target should not exist before create.)getrG   rE   r   r=   r>   r@   rA   rB   rH   r   _initializedPromiser-   r   r.   r   rD   )r0   r6   rU   rX   targetrd   s   `    @r)   r4   zBrowser._targetCreated   s     <(
%>>*<= 0DNN Bnn%56G**G>##!!%%""
 j!T]]2GHH06j,-++++IIgnn22F;LL..<<fE ,s   CD(D&AD(c                 z  K   | j                   |d      }| j                   |d   = |j                          |j                   d {   r^| j                  t        j
                  j                  |       |j                  j                  t        j
                  j                  |       |j                  d       y 7 tw)Nrg   F)
rH   _closedCallbackri   r-   r   r.   r   browserContextrD   _initializedCallback)r0   r6   rj   s      r)   r8   zBrowser._targetDestroyed   s     uZ01MM%
+, ++++IIgnn44f=!!&&~'<'<'L'LfU##E* ,s   AB;B9A5B;c                   K   | j                   j                  |d   d         }|st        d      |j                  }|j                  }|j                  |d          |ro||j                  k7  r_| j                  t        j                  j                  |       |j                  j                  t        j                  j                  |       y y y w)Nrd   rg   z,target should exist before targetInfoChanged)rH   rh   r   url_isInitializedr:   r-   r   r.   r   rm   rD   )r0   r6   rj   previousURLwasInitializeds        r)   r:   zBrowser._targetInfoChanged   s     ""5#6z#BCMNNjj..!!%"56kVZZ7IIgnn22F;!!&&~'<'<'J'JFS 8>s   CCc                 .    | j                   j                  S )zReturn websocket end point url.)rA   rp   r/   s    r)   
wsEndpointzBrowser.wsEndpoint   s     ###r+   c                 R   K   | j                   j                          d{   S 7 w)z4Make new page on this browser and return its object.N)rE   newPager/   s    r)   rw   zBrowser.newPage   s!     ))113333s   '%'c                 n  K   ddi}|r||d<   | j                   j                  d|       d {   j                  d      }| j                  j                  |      }|t	        d      |j
                   d {   st	        d      |j                          d {   }|t	        d      |S 7 7 87 w)Nrp   zabout:blankrU   zTarget.createTargetrg   z!Failed to create target for page.zFailed to create page.)rA   rV   rh   rH   r   ri   page)r0   rK   optionsrg   rj   ry   s         r)   _createPageInContextzBrowser._createPageInContext   s     -(*3G&'**//!7, ,-0S_ 	""8,>BCC////BCC[[]"<788,
 0"s4   +B5B/A
B58B19"B5B3B51B53B5c                 t    | j                   j                         D cg c]  }|j                  r| c}S c c}w )zGet a list of all active targets inside the browser.

        In case of multiple browser contexts, the method will return a list
        with all the targets in all browser contexts.
        )rH   rZ   rq   r0   rj   s     r)   targetszBrowser.targets   s9     &*]]%9%9%; *6((  * 	* *s   5c                    K   t               }| j                  D ])  }|j                  |j                          d{          + |S 7 w)aC  Get all pages of this browser.

        Non visible pages, such as ``"background_page"``, will not be listed
        here. You can find then using :meth:`pyppeteer.target.Target.page`.

        In case of multiple browser contexts, this method will return a list
        with all the pages in all browser contexts.
        N)listr[   extendpages)r0   r   rX   s      r)   r   zBrowser.pages   sC      !F++ 	0GLLw}}./	0 /s   8A	A
A	c                 H   K   | j                          d{   }|d   S 7 	w)zGet version of the browser.Nproduct)_getVersionr0   versions     r)   r   zBrowser.version   s'     ((**y!! +s   " 
"c                 b   K   | j                          d{   }|j                  dd      S 7 w)zReturn browser's original user agent.

        .. note::
            Pages can override browser user agent with
            :meth:`pyppeteer.page.Page.setUserAgent`.
        N	userAgent )r   rh   r   s     r)   r   zBrowser.userAgent   s/      ((**{{;++ +s   /-/c                 @   K   | j                          d{    y7 w)z0Close connections and terminate browser process.N)rC   r/   s    r)   closezBrowser.close  s     !!###s   c                    K   | j                   j                          d{    | j                  j                         D ]   }|j                  r|j                  d       " y7 Bw)zDisconnect browser.NF)rA   disposerH   rZ   rq   rn   r}   s     r)   
disconnectzBrowser.disconnect  sV     &&(((mm**, 	3F((++E2	3 	)s   A%A#-A%A%c                 8    | j                   j                  d      S )NzBrowser.getVersion)rA   rV   r/   s    r)   r   zBrowser._getVersion  s    $$%9::r+   )NN)r!   rD   r!   N))__name__
__module____qualname____doc__r   r.   r   r	   strboolr
   r   r   r   r   r   r<   propertyr   rR   rQ   r[   r^   staticmethodrb   r4   r8   r:   ru   r   rw   r{   r   r~   r   r   r   r   r   r   __classcell__rL   s   @r)   r   r      s1    %)%#	F -1@D+
: +
49 +
$(+
;CD>+
"5/+
 !)Yt_)< =+
 	+
 $(	+
Z %  	:, Y&6!7 Y Y,s ,t ,  15DH	 	c 	(,	?G~	&uo	 %-R4-@$A	  #		 (1		 	F$ F4 F2+D +T +	Td 	Tt 	T $C $ $4t 4HSM d "*f *T$Z "s "
, ,$3;Y ;r+   r   c                        e Zd ZdZ eddd      Zdedee   dd	f fd
Z	de
e   fdZde
e   fdZdefdZdefdZdefdZedefd       ZddZ xZS )rD   a  BrowserContext provides multiple independent browser sessions.

    When a browser is launched, it has a single BrowserContext used by default.
    The method `browser.newPage()` creates a page in the default browser
    context.

    If a page opens another page, e.g. with a ``window.open`` call, the popup
    will belong to the parent page's browser context.

    Pyppeteer allows creation of "incognito" browser context with
    ``browser.createIncognitoBrowserContext()`` method.
    "incognito" browser contexts don't write any browser data to disk.

    .. code::

        # Create new incognito browser context
        context = await browser.createIncognitoBrowserContext()
        # Create a new page inside context
        page = await context.newPage()
        # ... do stuff with page ...
        await page.goto('https://example.com')
        # Dispose context once it's no longer needed
        await context.close()
    r   r   r   )r   r   r   ra   rK   r!   Nc                 >    t         |           || _        || _        y r$   )r;   r<   _browser_id)r0   ra   rK   rL   s      r)   r<   zBrowserContext.__init__3  s    r+   c                     g }| j                   j                         D ]#  }|j                  | k(  s|j                  |       % |S )z?Return a list of all active targets inside the browser context.)r   r~   rm   append)r0   r~   rj   s      r)   r~   zBrowserContext.targets8  sD    mm++- 	'F$$,v&	' r+   c                    K   g }| j                         D ]>  }|j                  dk(  s|j                          d{   }|s.|j                  |       @ |S 7 w)zReturn list of all open pages.

        Non-visible pages, such as ``"background_page"``, will not be listed
        here. You can find them using :meth:`pyppeteer.target.Target.page`.
        ry   N)r~   typery   r   )r0   r   rj   ry   s       r)   r   zBrowserContext.pages@  sW      lln 	'F{{f$#[[]*LL&		'
  +s   %AAAAAc                 L    t         j                  d       | j                         S )z[[Deprecated] Miss spelled method.

        Use :meth:`isIncognito` method instead.
        z3isIncognite is deprecated. Use isIncognito instead.)rO   rP   isIncognitor/   s    r)   isIncognitezBrowserContext.isIncogniteO  s&    
 	'	
 !!r+   c                 ,    t        | j                        S )zReturn whether BrowserContext is incognito.

        The default browser context is the only non-incognito browser context.

        .. note::
            The default browser context cannot be closed.
        )r   r   r/   s    r)   r   zBrowserContext.isIncognitoZ  s     DHH~r+   c                 h   K   | j                   j                  | j                         d{   S 7 w)z)Create a new page in the browser context.N)r   r{   r   r/   s    r)   rw   zBrowserContext.newPaged  s%     ]]77AAAArS   c                     | j                   S )z3Return the browser this browser context belongs to.)r   r/   s    r)   ra   zBrowserContext.browserh  s     }}r+   c                    K   | j                   t        d      | j                  j                  | j                          d{    y7 w)zClose the browser context.

        All the targets that belongs to the browser context will be closed.

        .. note::
            Only incognito browser context can be closed.
        Nz&Non-incognito profile cannot be closed)r   r   r   r^   r/   s    r)   r   zBrowserContext.closem  s:      88GHHmm++DHH555s   A A
AA
r   )r   r   r   r   r   r.   r   r
   r   r<   r	   r   r~   r   r   r   r   r   rw   r   ra   r   r   r   s   @r)   rD   rD     s    2 %)%F HSM d 
f T$Z 	"T 	"T Bt B   
6r+   rD   )r   logging
subprocessr   typesr   typingr   r   r   r   r	   r
   pyeer   pyppeteer.connectionr   pyppeteer.errorsr   pyppeteer.pager   pyppeteer.targetr   	getLoggerr   rO   r   rD    r+   r)   <module>r      sW       ! A A  + )  #			8	${;l {;|d6\ d6r+   