grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026o ®û|jÚ`ã@sàdZddlZddlZddlZddlZddlZddlZgd¢ZGdd„deƒZ e  ¡Z iZ da dad=ddœdd „Zd=d d „Zd>d d„Zdd„Zdd„Zddœdd„ZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd „d eƒZGd!d"„d"eƒZGd#d$„d$eƒZeZGd%d&„d&eƒZGd'd(„d(eƒZ Gd)d*„d*eƒZ!Gd+d,„d,eƒZ"d-d.„Z#d/d0„Z$ej%dd1…d2krÌGd3d4„d4eƒZ&ej%d5kráGd6d7„d7eƒZ'Gd8d9„d9eƒZ(d:d;„Z)e*dr r r ršr?zBaseBrowser.open_new_tabcCs(|r| ¡ d¡rtd|›�ƒ‚dSdS)zCEnsures that the URL is safe to pass to subprocesses as a parameterú-z'Invalid URL (leading dash disallowed): N)ÚlstripÚ startswithÚ ValueErrorr+r r r Ú _check_url�sÿzBaseBrowser._check_urlN)r6©rT) rr r Ú__doc__Úargsr:rrrÚ staticmethodrDr r r r r5‹s  r5c@ó"eZdZdZdd„Zd dd„ZdS) r!zVClass for all browsers started with a command and without remote functionality.cCsFt|tƒr ||_dg|_n |d|_|dd…|_tj |j¡|_dS)Nrrr)Ú isinstanceÚstrrrGr0r1r2r8r r r r:¨s   zGenericBrowser.__init__rTcs€t dˆ¡| ˆ¡|jg‡fdd„|jDƒ}ztjdd…dkr)t |¡}ntj|dd�}| ¡ WSt y?YdSw) Núwebbrowser.opencóg|]}| dˆ¡‘qS©r©Úreplace©Ú.0Úargr+r r Ú µóÿz'GenericBrowser.open..éÚwinT)Ú close_fdsF) ÚsysÚauditrDrrGÚplatformÚ subprocessÚPopenÚwaitÚOSError©r9r&r'r(ÚcmdlineÚpr r+r r²s  ÿ   ÿzGenericBrowser.openNrE©rr r rFr:rr r r r r!¤s r!c@óeZdZdZddd„ZdS)r zHClass for all browsers which are to be started in the background.rTcs„|jg‡fdd„|jDƒ}t dˆ¡| ˆ¡ztjdd…dkr)t |¡}ntj|ddd�}| ¡duWSt yAYdSw) NcrMrNrOrQr+r r rTÆrUz*BackgroundBrowser.open..rLrVrWT)rXÚstart_new_sessionF) rrGrYrZrDr[r\r]Úpollr_r`r r+r rÅsÿ   ÿ ÿzBackgroundBrowser.openNrE©rr r rFrr r r r r Ásr c@sDeZdZdZdZdZdZddgZdZdZ dZ d dd„Z d d d „Z dS)Ú UnixBrowserz=Parent class for all Unix browsers with remote functionality.NFTú%actionrc CsÂg}|r|jrt|ƒ}|j|}|r|g}|jg||}|s"|jr&tj}nd}tj|d||jr2|p3d|dd�} |rOz |  d¡} | WStj yNYdSw|jr\|   ¡durZdSdS|  ¡ S)NT©rXÚstdinÚstdoutÚstderrreéF) Ú raise_optsÚintrÚ backgroundr\ÚDEVNULLr]Úredirect_stdoutr^ZTimeoutExpiredrf) r9rGZremoter(r&Z raise_optÚoptraZinoutrbÚrcr r r Ú_invokeæs2      þ ÿ  zUnixBrowser._invokercsÎt dˆ¡|dkr|j‰n!|dkr|j‰n|dkr'|jdur#|j‰n |j‰ntdd|ƒ‚| ˆ dˆ¡¡‡‡fdd „|jDƒ}d d „|Dƒ}|  |d |ˆ¡}|se‡fd d „|j Dƒ}|  |d d ¡Sd S)NrLrrr-zBad 'new' parameter to open(); zexpected 0, 1, or 2, got %srics g|] }| dˆ¡ dˆ¡‘qS)rirrOrQ©Úactionr&r r rTsÿz$UnixBrowser.open..cSsg|]}|r|‘qSr r rQr r r rTsTcrMrNrOrQr+r r rT sF) rYrZÚ remote_actionÚremote_action_newwinÚremote_action_newtabrrDrPÚ remote_argsrvrG)r9r&r'r(rGZsuccessr rwr r s,  ÿ ÿzUnixBrowser.openr7rE) rr r rFrorqrsr|ryrzr{rvrr r r r rhÕs #rhc@s(eZdZdZddgZdZdZdZdZdS) ÚMozillaz$Launcher class for Mozilla browsers.rirr6z -new-windowz-new-tabTN© rr r rFr|ryrzr{rqr r r r r}&ór}c@s0eZdZdZddgZddgZdZdZdZd Z d S) ÚNetscapez$Launcher class for Netscape browser.ú-noraisez-raiseú-remoteúopenURL(%s%action)r6ú ,new-windowú,new-tabTN) rr r rFror|ryrzr{rqr r r r r€0sr€c@s,eZdZdZddgZddgZdZdZdZd S) ÚGaleonz,Launcher class for Galeon/Epiphany browsers.r�r6rirú-nz-wTN) rr r rFror|ryrzrqr r r r r†;sr†c@ó(eZdZdZddgZdZdZdZdZdS)ÚChromez)Launcher class for Google Chrome browser.rirr6ú --new-windowTNr~r r r r r‰Err‰c@rˆ)ÚOperaz!Launcher class for Opera browser.rirr6rŠTNr~r r r r r‹Qrr‹c@s,eZdZdZddgZdZdZdZdZdZ dS) ÚElinksz#Launcher class for Elinks browsers.r‚rƒr6r„r…FN) rr r rFr|ryrzr{rqrsr r r r rŒ[srŒc@rd)Ú Konquerorz±Controller for the KDE File Manager (kfm, or Konqueror). See the output of ``kfmclient --commands`` for more information on the Konqueror remote-control interface. rTcCsòt d|¡| |¡|dkrd}nd}tj}ztjd||gd|||d�}Wn ty/Ynw| ¡dSztjdd |gd|||dd �}Wn tyOYn w| ¡durXdSztjd d |gd|||dd �}Wn tyrYd Sw| ¡duS)NrLr-ZnewTabZopenURLÚ kfmclientT)rXrkrlrmÚ konquerorz--silentrjÚkfmz-dF) rYrZrDr\rrr]r_r^rf)r9r&r'r(rxÚdevnullrbr r r rpsJ    þ þ  ý þ   ý ÿ zKonqueror.openNrErgr r r r r�isr�c@s&eZdZdd„Zdd„Zd dd„Zd S) ÚGrailc CsÚddl}ddl}ddl}ddl}tj | ¡d¡}| t  ¡¡d}tj |  |¡|  |¡d¡}| |¡}|s:dS| |j |j ¡} |D]&} z |   | ¡W| Styjzt | ¡Wn tygYnwYqDwdS)Nrz .grail-unixz-*)ÚglobÚpwdÚsocketÚtempfiler0r1ÚjoinZ gettempdirÚgetpwuidÚgetuidÚescapeZAF_UNIXZ SOCK_STREAMZconnectr_Úunlink) r9r“r”r•r–ZtempdirÚuserÚfilenameZmaybesÚsÚfnr r r Ú_find_grail_rc£s4 ÿ   ù ÿ€üüzGrail._find_grail_rccCs&| ¡}|sdS| |¡| ¡dS)Nrr)r ÚsendÚclose)r9rxržr r r Ú_remote½s  z Grail._remoterTcCs>t d|¡| |¡|r| d|¡}|S| d|¡}|S)NrLzLOADNEW zLOAD )rYrZrDr£)r9r&r'r(Úokr r r rÅs  ÿz Grail.openNrE)rr r r r£rr r r r r’Ÿsr’cCsÒt d¡r tddtdƒƒdtjvrt d¡rtddtdƒƒdtjvr1t d¡r1tddtdƒƒdtjvrCt d¡rCtdttdƒƒt d¡rPtddtdƒƒdD]}t |¡rat|dt|ƒƒqRd D]}t |¡rst|dt|ƒƒqdt d ¡r‚td ttd ƒƒn t d ¡r�td ttd ƒƒd D]}t |¡r t|dt |ƒƒq‘t d ¡r®td dtd ƒƒdD]}t |¡r¿t|dt |ƒƒq°t d¡rÍtddt dƒƒt d¡rÚtddtdƒƒt d¡rçtdt dƒdSdS)Nzxdg-openZGNOME_DESKTOP_SESSION_IDz gvfs-openz gnome-openZKDE_FULL_SESSIONrŽz x-www-browser)ÚfirefoxZ iceweaselZiceapeÚ seamonkey)zmozilla-firefoxzmozilla-firebirdÚfirebirdÚmozillaÚnetscaper�r�)ZgaleonZepiphanyZ skipstone)z google-chromeÚchromeZchromiumzchromium-browserÚoperaZmosaicZgrail) r.r/rr r0Úenvironr�r}r€r†r‰r‹r’)r$r r r Úregister_X_browsersÖsN   € €   €  €   ÿr­c Cs6gatjdkr'tddtdƒƒtddtdƒƒtddtdƒƒtddtdƒƒtjdkr4tddtdƒƒtjdd …d krhtd tƒtj  tj   d d ¡d¡}dddddd|fD]}t   |¡rft|dt|ƒƒqWn{tj   d¡sttj   d¡rœzd ¡}tj|tjd�}| ¡ ¡}Wnttjttfy–Ynw|atƒtj   d¡rãt   d¡r¯tddtdƒƒt   d¡r¼tddtdƒƒt   d¡rÉtddtdƒƒt   d¡rÖtddtdƒƒt   d¡rãtddtdƒƒdtj v�rtj d tj¡}| ¡|D] }|dk�rt|d d!�}|d"du�rt|dt|ƒd d!�qødSdS)#NÚdarwinÚMacOSXÚdefaultrªr¥ZsafariZ serenityosZBrowserrVrWzwindows-defaultZ PROGRAMFILESzC:\Program FileszInternet Explorer\IEXPLORE.EXEr§r¦r¨r©r«ZDISPLAYZWAYLAND_DISPLAYz$xdg-settings get default-web-browser)rmZTERMz www-browserZlinksZelinksZlynxZw3mZBROWSERr6Tr r)rrYr[rÚMacOSXOSAScriptr ÚWindowsDefaultr0r1r—r¬rr.r/rr\Z check_outputrrÚdecodeÚstripÚFileNotFoundErrorZCalledProcessErrorÚPermissionErrorÚNotADirectoryErrorrr­r!rŒÚpathsepÚreverser#)Ziexplorer$r4Z raw_resultÚresultZ userchoicesrar r r rsh   ÿÿ €ýÿ         €örrVrWc@seZdZddd„ZdS)r²rTcCs<t d|¡| |¡zt |¡WdStyYdSw)NrLFT)rYrZrDr0Z startfiler_r<r r r rhs    ûýzWindowsDefault.openNrE)rr r rr r r r r²gsr²r®c@rI) r¯a{Launcher class for Aqua browsers on Mac OS X Optionally specify a browser name on instantiation. Note that this will not work for Aqua browsers if the user has moved the application package after installation. If no browser is specified, the default browser, as specified in the Internet System Preferences panel, will be used. cCó ||_dSr7)rr8r r r r:„ó zMacOSX.__init__rTc Csºt d|¡| |¡d|vrd|}tt|ƒƒ}|jdkr'd| dd¡}n|jdkr/d }nd |d }d | dd¡}d |j||f}t dd¡}|durQdS|  |¡|  ¡}| S)NrLú:zfile:r°úopen location "%s"ú"ú%22ZOmniWebr6z toWindow %drz OpenURL "%s"z‰tell application "%s" activate %s %s end tellZ osascriptÚwF) rYrZrDrpÚboolrrPr0ÚpopenÚwriter¢) r9r&r'r(ÚscriptZtoWindowr4Úosapiperur r r r‡s(       ý  z MacOSX.openNrErcr r r r r¯zs r¯c@seZdZdd„Zddd„ZdS) r±cCr»r7)Ú_namer8r r r r:«r¼zMacOSXOSAScript.__init__rTcCsl| |¡|jdkrd| dd¡}n d|j| dd¡f}t dd¡}|dur*dS| |¡| ¡}| S) Nr°r¾r¿rÀzž tell application "%s" activate open location "%s" end z/usr/bin/osascriptrÁF)rDrÇrPr0rÃrÄr¢)r9r&r'r(rÅrÆrur r r r®s  û  zMacOSXOSAScript.openNrE)rr r r:rr r r r r±ªsr±c Csðddl}dtjd}z| tjdd…d¡\}}Wn&|jy@}zt|tjd�t|tjd�t d¡WYd}~nd}~wwd}|D]\}}|dkrPd}qE|dkrVd}qEt|ƒdkrit|tjd�t d¡|d}t||ƒtd ƒdS) NrzDUsage: %s [-n | -t] url -n: open new window -t: open new tabrZntd)Úfiler‡z-tr-ú) ÚgetoptrYÚargvÚerrorÚprintrmÚexitÚlenr) rÊZusageZoptsrGÚmsgZnew_winÚoÚar&r r r ÚmainÃs.þ€ý  €    rÓÚ__main__r7rE)+rFr0rr.rYr\Z threadingÚ__all__Ú ExceptionrÚRLockrrrrrrrrrr#Úobjectr5r!r rhr}r€r†r‰ZChromiumr‹rŒr�r’r­rr[r²r¯r±rÓrr r r r ÚsV  ""Q     67AO 0 ÿ