
    AHj$0                    >   d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ ddlmZ ddlmZmZ ddlmZmZmZmZmZ dd	l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% ddl&m'Z' ddl(m)Z) ejT                  dk(  Z+ G d de,      Z- G d de#      Z.y)z

The Remote driver uses the following packet structure.

1 byte for packet type. "D" for data, "M" for meta.
4 byte little endian integer for the size of the payload.
Arbitrary payload.


    )annotationsN)getincrementaldecoder)partial)Path)EventThread)AnyBinaryIOLiteralTextIOcast)eventslogmessages)dump)XTermParser)App)Driver)
ByteStream)InputReader)Sizewin32c                      e Zd ZdZy)
_ExitInputz/Internal exception to force exit of input loop.N)__name__
__module____qualname____doc__     R/root/tools/cai/cai_env/lib/python3.12/site-packages/textual/drivers/web_driver.pyr   r   %   s    9r    r   c                  2    e Zd ZdZdddd	 	 	 	 	 	 	 d fdZedd       ZddZd d	Zd!d
Z	d"dZ
d"dZd"dZd"dZd"dZd"dZd"dZd"dZd"dZd"dZd#dZd$dZd%d&dZddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d'dZdddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d'dZ xZS )(	WebDriverz+A headless driver that may be run remotely.FTNdebugmousesizec               @   |W	 t        t        j                  j                  dd            }t        t        j                  j                  dd            }||f}t
        |   ||||       t        j                  | _	        t        j                  j                         | _
        t        t        j                  | j                        | _        t               | _        t!        | j"                  d      | _        t'               | _        i | _        y # t        $ r Y w xY w)NCOLUMNSP   ROWS   r$   ztextual-input)targetname)intosenvironget
ValueErrorsuper__init__sys
__stdout__stdoutfilenor   write_writer   
exit_eventr   run_input_thread_key_threadr   _input_reader_deliveries)selfappr%   r&   r'   widthheight	__class__s          r!   r5   zWebDriver.__init__,   s     <%BJJNN9b9:RZZ^^FB78 f}ETBnnnn++-bhh4'#)(($
 )]9;	0  s   AD 	DDc                     y)NTr   rA   s    r!   is_webzWebDriver.is_webJ   s    r    c                    |j                  d      }| j                  dt        |      j                  dd      |fz         y)zWrite string data to the output device, which may be piped to
        the parent process (i.e. textual-web/textual-serve).

        Args:
            data: Raw data.
        utf-8s   D%s%s   bigN)encoder;   lento_bytes)rA   data
data_bytess      r!   r:   zWebDriver.writeN   s9     [[)
HJ 8 8E BJOOPr    c                    t        j                  |      j                  dd      }| j                  dt	        |      j                  dd      |fz         y)zWrite a dictionary containing some metadata to stdout, which
        may be piped to the parent process (i.e. textual-web/textual-serve).

        Args:
            data: Meta dict.
        rJ   ignore)errorss   M%s%srK   rL   N)jsondumpsrM   r;   rN   rO   )rA   rP   
meta_bytess      r!   
write_metazWebDriver.write_metaY   sI     ZZ%,,WX,F
HJ 8 8E BJOOPr    c                x    t        |      }| j                  dt        |      j                  dd      |fz         y)zBinary encode a data-structure and write to stdout.

        Args:
            data: The data to binary encode and write.
        s   P%s%srK   rL   N)binary_dumpr;   rN   rO   )rA   rP   packed_bytess      r!   write_binary_encodedzWebDriver.write_binary_encodedc   s6     #4(HL 1 : :1e DlSSTr    c                     y )Nr   rG   s    r!   flushzWebDriver.flushl   s    r    c                \    | j                   } |d        |d        |d        |d       y)z!Enable reporting of mouse events.z[?1000h[?1003hz[?1015hz[?1006hNr:   rA   r:   s     r!   _enable_mouse_supportzWebDriver._enable_mouse_supporto   +    

mmmmr    c                &    | j                  d       y)zEnable bracketed paste mode.z[?2004hNra   rG   s    r!   _enable_bracketed_pastez!WebDriver._enable_bracketed_pastew       

=!r    c                &    | j                  d       y)zDisable bracketed paste mode.z[?2004lNra   rG   s    r!   _disable_bracketed_pastez"WebDriver._disable_bracketed_paste{   rg   r    c                \    | j                   } |d        |d        |d        |d       y)z"Disable reporting of mouse events.z[?1000lz[?1003lz[?1015lz[?1006lNra   rb   s     r!   _disable_mouse_supportz WebDriver._disable_mouse_support   rd   r    c                &    | j                  d       y)zNWrites an escape sequence to query the terminal support for the sync protocol.z	[?2026$pNra   rG   s    r!   #_request_terminal_sync_mode_supportz-WebDriver._request_terminal_sync_mode_support   s    

>"r    c                X    t        j                         d
 fd}t        s7t        j                  t        j
                  fD ]  }j                  ||         j                  d        j                  d        j                           j                  d        j                  d        j                  t        dd      nt         j                   }t        j                  ||      }t        j                   j                  j!                  |      	        j#                           j%                           j'                           j(                  j+                           j                  j-                   j                  j.                  t        j0                                y)zStart application mode.c                     t        j                  j                  j                  t	        j
                                       y)zCallback to force exit.loopN)asynciorun_coroutine_threadsafe_app_post_messager   ExitApp)rq   rA   s   r!   do_exitz1WebDriver.start_application_mode.<locals>.do_exit   s.    ,,		''(8(8(:;$r    s   __GANGLION__
z[?1049hz[?25lr`   Nr*   r,   rp   returnNone)rr   get_running_loopWINDOWSsignalSIGINTSIGTERMadd_signal_handlerr;   r:   rc   _sizer   r   Resizers   rt   ru   rm   rf   r^   r>   start
call_laterpost_messageAppBlur)rA   rw   _signalr'   eventrq   s   `    @r!   start_application_modez WebDriver.start_application_mode   s4    '')	 "MM6>>: :''9: 	%&

=!""$

;

=!#zz1tB|tTZZ7HdD)((II##E*	

 	002$$&

 		TYY33V^^5EFr    c                     y)zDisable further input.Nr   rG   s    r!   disable_inputzWebDriver.disable_input   s    r    c                    | j                   j                          | j                  j                          | j	                  ddi       y)z%Stop application mode, restore state.typeexitN)r<   setr?   closerX   rG   s    r!   stop_application_modezWebDriver.stop_application_mode   s5      "()r    c                Z   | j                   }t        | j                        } t        d             j                  }|}t               }	 |D ]  }|r^|j                  |      D ]J  \  }}|dk(  r.|j                   ||            D ]  }	| j                  |	        9| j                  ||       L |j                         D ]  }	| j                  |	         	 |j                          y# t        $ r Y t        $ r ddlm}
 t         |
              Y <w xY w# |j                          w xY w)z#Wait for input and dispatch events.)r%   rJ   Dr   )
format_excN)r?   r   _debugr   decoder   feedprocess_message_on_metatickr   	Exception	tracebackr   r   r   )rA   input_readerparserutf8_decoderr   byte_streamrP   packet_typepayloadr   r   s              r!   r=   zWebDriver.run_input_thread   s$   ))4;;/5,W57>> !l	!$ 00;0@0@0F @,W&#-)/VG_)E < $ 4 4U ;< !MM+w?@ $[[] 0E((/00&    	 	,
	
  s7   
BC) D )	D2D 4DD DD D*c                    t        j                  |      }|j                  di       }t        |t              r| j                  ||       yt        j                  d|       y)zPrivate method to dispatch meta.

        Args:
            packet_type: Packet type (currently always "M")
            payload: Meta payload (JSON encoded as bytes).
        r   z;Protocol error: type field value is not a string. Value is N)rU   loadsr2   
isinstancestron_metar   error)rA   r   r   payload_map_types        r!   r   zWebDriver._on_meta   sP     *.G)<+eS!LL,IIMeYWr    c                   |dk(  rQ|d   |d   f| _         t        | j                    }| j                  j                  t	        j
                  ||             y|dk(  r.| j                  j                  t	        j                                y|dk(  r.| j                  j                  t	        j                                y|dk(  r.| j                  j                  t        j                                y|dk(  r
t               |dk(  rt        j                  d	|        	 t        t        |d
         }t        t        |d         }| j$                  }d}	 ||   }|j'                  dd      }	 t        j                  d| d|        |j)                  |      }t        j                  d|dt+        |              | j-                  d||f       |s@t        j.                  d|        |j1                          ||= | j3                  |d|       yyy# t         $ r t        j"                  d       Y yw xY w# t4        $ rz}	|j1                          ||= t        j"                  d|d       ddl}
t        j"                  t        |
j9                                      | j;                  ||	|       Y d}	~	yd}	~	ww xY w# t         $ r t        j"                  d|       Y yw xY w)zProcess a dictionary containing information received from the controlling process.

        Args:
            packet_type: The type of the packet.
            payload: meta dict.
        resizerC   rD   focusblurquitr   deliver_chunk_requestzDeliver chunk request: keyr'   z9Protocol error: deliver_chunk_request missing key or sizeNr.   zReading z bytes from zDelivering chunk z of len deliver_chunkzDelivery complete for )	save_pathr.   z$Error delivering file chunk for key z. Cancelling delivery.r   )	exceptionr.   z2Protocol error: deliver_chunk_request invalid key )r   r   rt   r   r   r   AppFocusr   r   rv   r   r   r%   r   r   r/   KeyErrorr   r@   r2   readrN   r\   infor   _delivery_completer   r   r   _delivery_failed)rA   r   r   requested_sizedelivery_key
deliveries	file_liker.   chunkr   r   s              r!   r   zWebDriver.on_meta   s    ("!'*GH,=>DJ!4::.NII""6==#PQG#II""6??#45F"II""6>>#34F"II""8#3#3#56F",33II/y9:#C8!%c76?!;
 ))J26I T&|4	 $+;;vt#<TII(8\NST%NN>:EII 1,1A#e*VW--e.TU #9,!HI!)&|4//SW/X	 !9 4  		UV6 ! TOO%"<0II>|>N O/ / %IIc)"6"6"89:)),%d)SST%  		HHXYs>   &H J= +B%H7 H43H47	J: A0J55J:=!K! K!c                .    | j                  d||d       y)zOpen a URL in the default web browser.

        Args:
            url: The URL to open.
            new_tab: Whether to open the URL in a new tab.
        open_url)r   urlnew_tabN)rX   )rA   r   r   s      r!   r   zWebDriver.open_url)  s     	CGLMr    download)open_methodencoding	mime_typer.   c          	     4    | j                  |||||||       y )N)r   r   r   r   r   r.   )_deliver_file)rA   binaryr   r   r   r   r   r.   s           r!   deliver_binaryzWebDriver.deliver_binary2  s,     	%# 	 	
r    )r   r   r.   c                   |j                  d       || j                  |<   d|t        |j                               ||xs d|xs d|d}| j	                  |       t        j                  d|d   d|       y)	z2Deliver a file to the end-user of the application.r   deliver_file_start )r   r   pathr   r   r   r.   zDelivering file r   z: N)seekr@   r   resolverX   r   r   )	rA   r   r   r   r   r   r   r.   metas	            r!   r   zWebDriver._deliver_fileG  s     	A)/& )	))+,& B"b#
 	#DL#32dX>?r    )rB   zApp[Any]r%   boolr&   r   r'   ztuple[int, int] | None)ry   r   )rP   r   ry   rz   )rP   dict[str, object]ry   rz   )rP   ztuple[str | bytes, ...]ry   rz   rx   )r   r   r   bytesry   rz   )r   r   r   r   ry   rz   )T)r   r   r   r   ry   rz   )r   zBinaryIO | TextIOr   r   r   r   r   zLiteral['browser', 'download']r   
str | Noner   r   r.   r   ry   rz   )r   r   r   r   r5   propertyrH   r:   rX   r\   r^   rc   rf   ri   rk   rm   r   r   r   r=   r   r   r   r   r   __classcell__)rE   s   @r!   r#   r#   )   sr   5 '+00 	0
 0 %0<  	QQU""#"GH%*!> @TDN 7A# $
!
 	

 
 4
 
 
 
 

8  $ $@!@ 	@
 @ 4@ @ @ @ 
@r    r#   )/r   
__future__r   rr   rU   r0   r}   r6   codecsr   	functoolsr   pathlibr   	threadingr   r   typingr	   r
   r   r   r   textualr   r   r   textual._binary_encoder   rZ   textual._xterm_parserr   textual.appr   textual.driverr   textual.drivers._byte_streamr   textual.drivers._input_readerr   textual.geometryr   platformr|   r   r   r#   r   r    r!   <module>r      su   	 #   	  
 (   # 7 7 ) ) 6 -  ! 3 5 !
,,'
!: :y@ y@r    