o
    _c6                     @   s   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eZG dd deZG dd deZdS )zBrowser module.    N)Popen)SimpleNamespace)Any	AwaitableCallableDictListOptional)EventEmitter)
Connection)BrowserError)Page)Targetc                       s  e Zd ZdZed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dZede
e fddZd<ddZd<ddZeded fddZdeddfd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dZd eddfd!d"Zd eddfd#d$Zd eddfd%d&Zedefd'd(Zdefd)d*Zde
e defd+d,Zdee  fd-d.Z!dee fd/d0Z"defd1d2Z#defd3d4Z$d=d5d6Z%d=d7d8Z&defd9d:Z'  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           
         s   t    |_|_|_g _|_jj dtd  f fdd}|r)|_	n|_	t
d _t _|D ]
}	t
|	j|	< q8t _jfdd jd fdd jd fd	d jd
 fdd d S )Nr   c                     s      } | d  | S N)create_future
set_result)fut)loop </usr/local/lib/python3.10/dist-packages/pyppeteer/browser.py_dummy_callback1   s   
z)Browser.__init__.<locals>._dummy_callbackc                      s     tjjS r    )emitr   Eventsr   r%   selfr%   r&   <lambda>B   s    z"Browser.__init__.<locals>.<lambda>zTarget.targetCreatedc                         | S r    )create_task_targetCreatedeventr$   r+   r%   r&   r,   F       zTarget.targetDestroyedc                    r-   r    )r.   _targetDestroyedr0   r2   r%   r&   r,   J   r3   zTarget.targetInfoChangedc                    r-   r    )r.   _targetInfoChangedr0   r2   r%   r&   r,   N   r3   )super__init___ignoreHTTPSErrors_defaultViewport_process_screenshotTaskQueue_connection_loopr   _closeCallbackBrowserContext_defaultContextdict	_contexts_targetsZsetClosedCallbackon)
r+   r   r   r   r   r   r   r   r'   	contextId	__class__r2   r&   r7   $   s>   

zBrowser.__init__c                 C      | j S )zReturn process of this browser.

        If browser instance is created by :func:`pyppeteer.launcher.connect`,
        return ``None``.
        )r:   r*   r%   r%   r&   r   Q   s   zBrowser.processr?   c                    s   t d |  I dH S )zm[Deprecated] Miss spelled method.

        Use :meth:`createIncognitoBrowserContext` method instead.
        zWcreateIncogniteBrowserContext is deprecated. Use createIncognitoBrowserContext instead.N)loggerwarningcreateIncognitoBrowserContextr*   r%   r%   r&   createIncogniteBrowserContextZ   s
   z%Browser.createIncogniteBrowserContextc                    s4   | j dI dH }|d }t| |}|| j|< |S )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)r<   sendr?   rB   )r+   objrM   contextr%   r%   r&   rK   e   s   

z%Browser.createIncognitoBrowserContextc                 C   s   | j gdd | j D  S )zReturn a list of all open browser contexts.

        In a newly created browser, this will return a single instance of
        ``[BrowserContext]``
        c                 S   s   g | ]}|qS r%   r%   ).0rP   r%   r%   r&   
<listcomp>   r3   z+Browser.browserContexts.<locals>.<listcomp>)r@   rB   valuesr*   r%   r%   r&   browserContexts{   s   zBrowser.browserContextsrE   c                    s,   | j dd|iI d H  | j|d  d S )NzTarget.disposeBrowserContextrM   )r<   rN   rB   pop)r+   rE   r%   r%   r&   _disposeContext   s
   zBrowser._disposeContextc                    s.   t | |||||}| dddiI dH  |S )zCreate browser object.zTarget.setDiscoverTargetsdiscoverTN)r   rN   )r   r   r   r   r   r   r   browserr%   r%   r&   create   s   zBrowser.creater1   c                    s   |d  d}|r| jv r j| }n j}t| fdd j j j jj}d  j	v r9t
d| j	d < |jI d H rX tjj| |tjj| d S d S )N
targetInforM   c                      s    j S r    )r<   ZcreateSessionr%   r+   rZ   r%   r&   r,      s    z(Browser._targetCreated.<locals>.<lambda>targetIdz&target should not exist before create.)getrB   r@   r   r8   r9   r;   r<   r=   rC   r   _initializedPromiser(   r   r)   r   r?   )r+   r1   rM   rP   targetr%   r[   r&   r/      s,   
	zBrowser._targetCreatedc                    s`   | j |d  }| j |d = |  |jI d H r)| tjj| |jtjj| |	d d S )Nr\   F)
rC   Z_closedCallbackr^   r(   r   r)   r   browserContextr?   _initializedCallback)r+   r1   r_   r%   r%   r&   r4      s   zBrowser._targetDestroyedc                    sx   | j |d d }|std|j}|j}||d  |r8||jkr:| tjj	| |j
tjj	| d S d S d S )NrZ   r\   z,target should exist before targetInfoChanged)rC   r]   r   url_isInitializedr5   r(   r   r)   r   r`   r?   )r+   r1   r_   ZpreviousURLZwasInitializedr%   r%   r&   r5      s   zBrowser._targetInfoChangedc                 C   s   | j jS )zReturn websocket end point url.)r<   rb   r*   r%   r%   r&   
wsEndpoint   s   zBrowser.wsEndpointc                    s   | j  I dH S )z4Make new page on this browser and return its object.N)r@   newPager*   r%   r%   r&   re      s   zBrowser.newPagec                    s   ddi}|r||d< | j d|I d H d}| j|}|d u r&td|jI d H s0td| I d H }|d u r?td|S )Nrb   zabout:blankrM   zTarget.createTargetr\   z!Failed to create target for page.zFailed to create page.)r<   rN   r]   rC   r   r^   page)r+   rE   optionsr\   r_   rf   r%   r%   r&   _createPageInContext   s$   zBrowser._createPageInContextc                 C   s   dd | j  D S )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.
        c                 S   s   g | ]}|j r|qS r%   )rc   )rQ   r_   r%   r%   r&   rR      s    
z#Browser.targets.<locals>.<listcomp>)rC   rS   r*   r%   r%   r&   targets   s   zBrowser.targetsc                    s,   t  }| jD ]}|| I dH  q|S )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)listrT   extendpages)r+   rl   rP   r%   r%   r&   rl      s
   

zBrowser.pagesc                    s   |   I dH }|d S )zGet version of the browser.Nproduct)_getVersionr+   versionr%   r%   r&   rp      s   zBrowser.versionc                    s   |   I dH }|ddS )zReturn browser's original user agent.

        .. note::
            Pages can override browser user agent with
            :meth:`pyppeteer.page.Page.setUserAgent`.
        N	userAgent )rn   r]   ro   r%   r%   r&   rq      s   zBrowser.userAgentc                    s   |   I dH  dS )z0Close connections and terminate browser process.N)r>   r*   r%   r%   r&   close  s   zBrowser.closec                    s6   | j  I dH  | j D ]
}|js|d qdS )zDisconnect browser.NF)r<   ZdisposerC   rS   rc   ra   )r+   r_   r%   r%   r&   
disconnect  s   
zBrowser.disconnectc                 C   s   | j dS )NzBrowser.getVersion)r<   rN   r*   r%   r%   r&   rn     s   zBrowser._getVersion)NN)r   r?   r   N))__name__
__module____qualname____doc__r   r)   r   r   strboolr	   r   r   r   r   r   r7   propertyr   rL   rK   rT   rV   staticmethodrY   r/   r4   r5   rd   r   re   rh   r   ri   rl   rp   rq   rs   rt   rn   __classcell__r%   r%   rF   r&   r      sx    	-

		


r   c                       s   e Zd ZdZeddddZdedee dd	f fd
dZ	de
e fddZde
e fddZdefddZdefddZdefddZedefddZdddZ  ZS )r?   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   rX   rE   r   Nc                    s   t    || _|| _d S r    )r6   r7   _browser_id)r+   rX   rE   rF   r%   r&   r7   3  s   

zBrowserContext.__init__c                 C   s,   g }| j  D ]}|j| kr|| q|S )z?Return a list of all active targets inside the browser context.)r   ri   r`   append)r+   ri   r_   r%   r%   r&   ri   8  s   

zBrowserContext.targetsc                    s>   g }|   D ]}|jdkr| I dH }|r|| q|S )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`.
        rf   N)ri   typerf   r   )r+   rl   r_   rf   r%   r%   r&   rl   @  s   

zBrowserContext.pagesc                 C   s   t d |  S )z[[Deprecated] Miss spelled method.

        Use :meth:`isIncognito` method instead.
        z3isIncognite is deprecated. Use isIncognito instead.)rI   rJ   isIncognitor*   r%   r%   r&   isIncogniteO  s   zBrowserContext.isIncognitec                 C   s
   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*   r%   r%   r&   r   Z  s   
zBrowserContext.isIncognitoc                    s   | j | jI dH S )z)Create a new page in the browser context.N)r   rh   r   r*   r%   r%   r&   re   d  s   zBrowserContext.newPagec                 C   rH   )z3Return the browser this browser context belongs to.)r   r*   r%   r%   r&   rX   h  s   zBrowserContext.browserc                    s,   | j du r
td| j| j I dH  dS )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   rV   r*   r%   r%   r&   rs   m  s   
zBrowserContext.closeru   )rv   rw   rx   ry   r   r)   r   r	   rz   r7   r   r   ri   r   rl   r{   r   r   re   r|   rX   rs   r~   r%   r%   rF   r&   r?     s     
r?   )ry   logging
subprocessr   typesr   typingr   r   r   r   r   r	   Zpyeer
   Zpyppeteer.connectionr   Zpyppeteer.errorsr   Zpyppeteer.pager   Zpyppeteer.targetr   	getLoggerrv   rI   r   r?   r%   r%   r%   r&   <module>   s    
 