o
    _cZ                     @   sH   d Z ddlmZ ddlmZ ddlmZ ddlmZ G dd de	Z
dS )	zTracing module.    )Path)Any)
CDPSession)
merge_dictc                   @   s^   e Zd ZdZdeddfddZddededdfd	d
Zde	fddZ
de	de	de	fddZdS )Tracingaq  Tracing class.

    You can use :meth:`start` and :meth:`stop` to create a trace file which can
    be opened in Chrome DevTools or
    `timeline viewer <https://chromedevtools.github.io/timeline-viewer/>`_.

    .. code::

        await page.tracing.start({'path': 'trace.json'})
        await page.goto('https://www.google.com')
        await page.tracing.stop()
    clientreturnNc                 C   s   || _ d| _d| _d S )NF )_client
_recording_path)selfr    r   </usr/local/lib/python3.10/dist-packages/pyppeteer/tracing.py__init__   s   
zTracing.__init__optionskwargsc                    sj   t ||}g d}|d|}d|v r|d |dd| _d| _| jdd	d
|dI dH  dS )ao  Start tracing.

        Only one trace can be active at a time per browser.

        This method accepts the following options:

        * ``path`` (str): A path to write the trace file to.
        * ``screenshots`` (bool): Capture screenshots in the trace.
        * ``categories`` (List[str]): Specify custom categories to use instead
          of default.
        )z-*zdevtools.timelinez
v8.executez%disabled-by-default-devtools.timelinez+disabled-by-default-devtools.timeline.frametoplevelzblink.consolezblink.user_timingZlatencyInfoz+disabled-by-default-devtools.timeline.stackz#disabled-by-default-v8.cpu_profilerz)disabled-by-default-v8.cpu_profiler.hires
categoriesZscreenshotsz'disabled-by-default-devtools.screenshotpathr	   TTracing.startZReturnAsStream,)ZtransferModer   N)r   getappendr   r   r
   sendjoin)r   r   r   ZdefaultCategoriesZcategoriesArrayr   r   r   start    s   
	
r   c                    sH   j j  j d fdd j dI dH  d_ I dH S )z>Stop tracing.

        :return: trace data as string.
        zTracing.tracingCompletec                    s,   j j| dj fddS )Nstreamc                    s     |  S N)
set_resultresult)fut)contentPromiser   r   <lambda>M   s    z0Tracing.stop.<locals>.<lambda>.<locals>.<lambda>)r
   _loopcreate_task_readStreamr   r   add_done_callback)eventr"   r   r   r   r#   J   s    
zTracing.stop.<locals>.<lambda>zTracing.endNF)r
   r$   create_futureoncer   r   )r   r   r)   r   stopB   s   
zTracing.stophandler   c           	         s   d}g }|s$| j dd|iI d H }|dd}||dd |r| j dd|iI d H  d|}|rXt|}|jdd	d
}|| W d    |S 1 sSw   Y  |S )NFzIO.readr-   eofdatar	   zIO.closewzutf-8)encoding)r
   r   r   r   r   r   openwrite)	r   r-   r   r.   Zbufsresponser    filefr   r   r   r&   T   s$   

zTracing._readStreamr   )__name__
__module____qualname____doc__r   r   dictr   r   strr,   r&   r   r   r   r   r      s    "r   N)r:   pathlibr   typingr   Zpyppeteer.connectionr   Zpyppeteer.utilr   objectr   r   r   r   r   <module>   s   