package Ġorg . h ild an . chrome . devtools . protocol Ċ Ċ import Ġio . ktor . client .* Ċ import Ġio . ktor . client . features .* Ċ import Ġio . ktor . client . features . json .* Ċ import Ġio . ktor . client . features . json . serializer .* Ċ import Ġio . ktor . client . request .* Ċ import Ġio . ktor . http .* Ċ import Ġkotlinx . serialization . Serial Name Ċ import Ġkotlinx . serialization . Serializable Ċ import Ġorg . h ild an . chrome . devtools . targets . Chrome Browser Session Ċ import Ġorg . h ild an . chrome . devtools . targets . Chrome Page Session Ċ import Ġorg . h ild an . chrome . devtools . targets . attach To Page Ċ import Ġorg . h ild an . k ross bow . websocket . WebSocket Client Ċ import Ġorg . h ild an . k ross bow . websocket . default Ċ import Ġkotlinx . serialization . json . Json Ġas ĠK x Json Ċ Ċ private Ġval ĠDEFAULT _ WEB SOCKET _ CLIENT Ġby Ġlazy Ġ{ ĠWebSocket Client . default () Ġ} Ċ Ċ private Ġval ĠDEFAULT _ HTTP _ CLIENT Ġby Ġlazy Ġ{ Ġcreate HttpClient ( override Host Header Ġ= Ġfalse ) Ġ} Ċ Ċ private Ġval ĠDEFAULT _ HTTP _ CLIENT _ WITH _ HOST _ OVERRIDE Ġby Ġlazy Ġ{ Ġcreate HttpClient ( override Host Header Ġ= Ġtrue ) Ġ} Ċ Ċ private Ġfun Ġcreate HttpClient ( override Host Header : ĠBoolean ) Ġ= ĠHttpClient Ġ{ ĊĠĠĠ Ġinstall ( Json Feature ) Ġ{ ĊĠĠĠĠĠĠĠ Ġserializer Ġ= ĠKotlin x Serializer ( Kx Json Ġ{ Ġignore Unknown Keys Ġ= Ġtrue Ġ}) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( override Host Header ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinstall ( Default Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheaders [" Host "] Ġ= Ġ" localhost " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA ĠChrome ĠDev tools ĠProtocol Ġclient . Ċ Ġ* Ċ Ġ* ĠIt Ġprovides Ġaccess Ġto Ġthe Ġbasic ĠHTTP Ġendpoints Ġexposed Ġby Ġthe ĠChrome Ġbrowser , Ġas Ġwell Ġas Ġweb Ġsocket Ġconnections Ġto Ċ Ġ* Ġthe Ġbrowser Ġand Ġits Ġtargets Ġto Ġmake Ġuse Ġof Ġthe Ġfull ĠChrome ĠDev tools ĠProtocol ĠAPI . Ċ Ġ* Ċ Ġ* Ġ** Note :** Ġif Ġyou Ġalready Ġknow Ġthe Ġbrowser Ġtarget 's Ġweb Ġsocket ĠURL , Ġyou Ġdon 't Ġneed Ġto Ġcreate Ġa Ġ` Chrome DP Client `. Ċ Ġ* ĠInstead , Ġuse Ġa Ġ[ WebSocket Client ] Ġand Ġ[ WebSocket Client . connect To Chrome ][ connect To Chrome ] Ġinstead . Ċ Ġ* ĠA Ġdefault Ġweb Ġsocket Ġclient Ġcan Ġbe Ġcreated Ġusing Ġ[ WebSocket Client . default () ][ WebSocket Client . Companion . default ]. Ċ Ġ* Ċ Ġ* Ġ## ĠHost Ġoverride Ċ Ġ* Ċ Ġ* ĠChrome Ġdoesn 't Ġaccept Ġa Ġ` Host ` Ġheader Ġthat Ġis Ġnot Ġan ĠIP Ġnor Ġ` localhost `, Ġbut Ġin Ġsome Ġenvironments Ġit Ġmight Ġbe Ġhard Ċ Ġ* Ġto Ġprovide Ġthis Ġ( e . g . Ġdocker Ġservices Ġin Ġa Ġdocker Ġsw arm , Ġcommunic ating Ġusing Ġservice Ġnames ). Ċ Ġ* Ċ Ġ* ĠTo Ġwork Ġaround Ġthis Ġproblem , Ġsimply Ġset Ġ[ override Host Header ] Ġto Ġtrue . Ċ Ġ* ĠThis Ġoverrides Ġthe Ġ` Host ` Ġheader Ġto Ġ" localhost " Ġin Ġthe ĠHTTP Ġrequests Ġto Ġthe ĠChrome Ġdebugger Ġto Ġmake Ġit Ġhappy , Ġand Ċ Ġ* Ġalso Ġreplaces Ġthe Ġhost Ġin Ġsubsequent Ġweb Ġsocket ĠURLs Ġ( returned Ġby ĠChrome ) Ġby Ġthe Ġinitial Ġhost Ġprovided Ġin Ċ Ġ* Ġ[ remote Debug Url ]. Ċ Ġ* ĠThis Ġis Ġnecessary Ġbecause ĠChrome Ġuses Ġthe Ġ` Host ` Ġheader Ġto Ġbuild Ġthese ĠURLs , Ġand Ġit Ġwould Ġbe Ġincorrect Ġto Ġkeep Ġthis . Ċ Ġ*/ Ċ class ĠChrome DP Client ( ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe ĠChrome Ġdebugger ĠHTTP ĠURL . ĠThis Ġwill Ġbe Ġused Ġto Ġaccess Ġmetadata Ġvia ĠHTTP , Ġin Ġorder Ġto Ġultimately Ġget Ġa Ġweb ĊĠĠĠĠ Ġ* Ġsocket ĠURL Ġand Ġconnect Ġvia Ġweb Ġsocket Ġfor Ġa Ġr icher ĠAPI . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġremote Debug Url : ĠString Ġ= Ġ" http :// localhost : 9 2 2 2 ", ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnables Ġoverride Ġof Ġthe Ġ` Host ` Ġheader Ġto Ġ` localhost ` Ġ( see Ġsection Ġabout ĠHost Ġoverride Ġin Ġ[ Chrome DP Client ] Ġdoc ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġoverride Host Header : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġparameter Ġshould Ġusually Ġbe Ġleft Ġto Ġits Ġdefault Ġvalue . ĊĠĠĠĠ Ġ* ĠOnly Ġuse Ġthis Ġto Ġwork Ġaround Ġan Ġissue Ġin Ġthe Ġclient 's Ġconfiguration / be haviour . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġweb Socket Client : ĠWebSocket Client Ġ= ĠDEFAULT _ WEB SOCKET _ CLIENT , ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġparameter Ġshould Ġusually Ġbe Ġleft Ġto Ġits Ġdefault Ġvalue . ĊĠĠĠĠ Ġ* ĠOnly Ġuse Ġthis Ġto Ġwork Ġaround Ġan Ġissue Ġin Ġthe Ġclient 's Ġconfiguration / be haviour . ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġthe Ġprovided Ġ[ HttpClient ] Ġhas Ġto Ġbe Ġconfigured Ġto Ġhandle ĠKotlin x ĠSerialization Ġ( JSON ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠhttpClient : ĠHttpClient Ġ= Ġif Ġ( override Host Header ) ĠDEFAULT _ HTTP _ CLIENT _ WITH _ HOST _ OVERRIDE Ġelse ĠDEFAULT _ HTTP _ CLIENT , Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĠBrowser Ġversion Ġmetadata . Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġversion (): ĠChrome Version Ġ= ĠhttpClient . get < Chrome Version >(" $ remote Debug Url / json / version "). fix Host () ĊĊĠĠĠ Ġ/** ĠThe Ġcurrent Ġdev tools Ġprotocol Ġdefinition , Ġas Ġa ĠJSON Ġstring . Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġprotocol Json (): ĠString Ġ= ĠhttpClient . get ("$ remote Debug Url / json / protocol ") ĊĊĠĠĠ Ġ/** ĠA Ġlist Ġof Ġall Ġavailable Ġwebsocket Ġtargets Ġ( e . g . Ġbrowser Ġtabs ). Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġtargets (): ĠList < Chrome DP Target > Ġ= ĊĠĠĠĠĠĠĠ ĠhttpClient . get < List < Chrome DP Target >> ("$ remote Debug Url / json / list "). map Ġ{ Ġit . fix Host () Ġ} ĊĊĠĠĠ Ġ/** ĠOpen s Ġa Ġnew Ġtab . ĠRes pon ds Ġwith Ġthe Ġwebsocket Ġtarget Ġdata Ġfor Ġthe Ġnew Ġtab . Ġ*/ ĊĠĠĠ Ġ@ Deprecated ( ĊĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Prefer Ġr icher ĠAPI Ġvia Ġweb Ġsocket ", ĊĠĠĠĠĠĠĠ Ġreplace With Ġ= ĠReplace With (" web Socket (). attach To New Page ( url )"), ĊĠĠĠ Ġ) ĊĠĠĠ Ġsuspend Ġfun Ġnew Tab ( url : ĠString Ġ= Ġ" about : blank "): ĠChrome DP Target Ġ= ĊĠĠĠĠĠĠĠ ĠhttpClient . get < Chrome DP Target >(" $ remote Debug Url / json / new ?$ url "). fix Host () ĊĊĠĠĠ Ġ/** ĠBr ings Ġa Ġpage Ġinto Ġthe Ġforeground Ġ( activ ates Ġa Ġtab ). Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġactivate Tab ( target Id : ĠString ): ĠString Ġ= ĠhttpClient . get ("$ remote Debug Url / json / activate /$ target Id ") ĊĊĠĠĠ Ġ/** ĠCloses Ġthe Ġtarget Ġpage Ġidentified Ġby Ġ[ target Id ]. Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġclose Tab ( target Id : ĠString ): ĠString Ġ= ĠhttpClient . get ("$ remote Debug Url / json / close /$ target Id ") ĊĊĠĠĠ Ġ/** ĠCloses Ġall Ġtargets . Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġclose All Targets () Ġ{ ĊĠĠĠĠĠĠĠ Ġtargets (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Tab ( it . id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOpen s Ġa Ġweb Ġsocket Ġconnection Ġto Ġinteract Ġwith Ġthe Ġbrowser Ġtarget Ġ( root Ġsession , Ġwithout Ġsession ĠID ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġreturned Ġ[ Chrome Browser Session ] Ġonly Ġprovides Ġa Ġlimited Ġsubset Ġof Ġthe Ġpossible Ġoperations , Ġbecause Ġit Ġis ĊĠĠĠĠ Ġ* Ġattached Ġto Ġthe Ġdefault Ġ* browser * Ġtarget , Ġnot Ġa Ġ* page * Ġtarget . ĊĠĠĠĠ Ġ* ĠTo Ġattach Ġto Ġa Ġspecific Ġtarget Ġusing Ġthe Ġsame Ġunderlying Ġweb Ġsocket Ġconnection , Ġcall ĊĠĠĠĠ Ġ* Ġ[ Chrome Browser Session . attach To Page ] Ġor ĊĠĠĠĠ Ġ* Ġ[ Chrome Browser Session . attach To New Page ][ org . h ild an . chrome . devtools . targets . attach To New Page ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġyou 're Ġresponsible Ġfor Ġclosing Ġthe Ġweb Ġsocket Ġby Ġcalling Ġ[ Chrome Browser Session . close ], Ġor Ġindirect ly ĊĠĠĠĠ Ġ* Ġby Ġcalling Ġ(` use ()` ). ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġcalling Ġ[ close () ][ Chrome Page Session . close ] Ġor Ġ` use ()` Ġon Ġa Ġderived Ġ[ Chrome Page Session ] Ġdoesn 't Ġclose ĊĠĠĠĠ Ġ* Ġthe Ġunderlying Ġweb Ġsocket Ġconnection . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġweb Socket (): ĠChrome Browser Session Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbrowser Debugger Url Ġ= Ġversion (). web Socket Debugger Url ĊĠĠĠĠĠĠĠ Ġreturn Ġweb Socket Client . connect To Chrome ( browser Debugger Url ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠChrome Version . fix Host () Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Host Header Ġ-> Ġcopy ( web Socket Debugger Url Ġ= Ġweb Socket Debugger Url . fix Host ()) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠChrome DP Target . fix Host () Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Host Header Ġ-> Ġcopy ( web Socket Debugger Url Ġ= Ġweb Socket Debugger Url . fix Host ()) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . fix Host (): ĠString Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Host Header Ġ-> ĠURL Builder ( this ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= ĠUrl ( remote Debug Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost Ġ= Ġurl . host ĊĠĠĠĠĠĠĠĠĠĠĠ Ġport Ġ= Ġurl . port ĊĠĠĠĠĠĠĠ Ġ}. build String () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠBrowser Ġversion Ġinformation Ġretrieved Ġvia Ġthe Ġdebugger ĠAPI . Ċ Ġ*/ Ċ @ Serializable Ċ data Ġclass ĠChrome Version ( ĊĠĠĠ Ġ@ Serial Name (" Browser ") Ġval Ġbrowser : ĠString , ĊĠĠĠ Ġ@ Serial Name (" Protocol - Version ") Ġval Ġprotocol Version : ĠString , ĊĠĠĠ Ġ@ Serial Name (" User - Agent ") Ġval Ġuser Agent : ĠString , ĊĠĠĠ Ġ@ Serial Name (" V 8 - Version ") Ġval Ġv 8 Version : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġ@ Serial Name (" WebKit - Version ") Ġval Ġweb Kit Version : ĠString , ĊĠĠĠ Ġ@ Serial Name (" web Socket Debugger Url ") Ġval Ġweb Socket Debugger Url : ĠString , Ċ ) Ċ Ċ /** Ċ Ġ* ĠTarget s Ġare Ġthe Ġparts Ġof Ġthe Ġbrowser Ġthat Ġthe ĠChrome ĠDev Tools ĠProtocol Ġcan Ġinteract Ġwith . Ċ Ġ* ĠThis Ġincludes Ġfor Ġinstance Ġpages , Ġserv ic ew ork ers Ġand Ġextensions Ġ( and Ġalso Ġthe Ġbrowser Ġitself ). Ċ Ġ* Ċ Ġ* ĠWhen Ġa Ġclient Ġwants Ġto Ġinteract Ġwith Ġa Ġtarget Ġusing ĠC DP , Ġit Ġhas Ġto Ġfirst Ġattach Ġto Ġthe Ġtarget Ġusing Ċ Ġ* Ġ[ Chrome DP Target . attach ]. ĠThis Ġwill Ġestablish Ġa Ġprotocol Ġsession Ġto Ġthe Ġgiven Ġtarget . Ċ Ġ* ĠThe Ġclient Ġcan Ġthen Ġinteract Ġwith Ġthe Ġtarget Ġusing Ġthe Ġ[ Chrome Page Session ]. Ċ Ġ*/ Ċ @ Serializable Ċ data Ġclass ĠChrome DP Target ( ĊĠĠĠ Ġval Ġid : ĠString , ĊĠĠĠ Ġval Ġtitle : ĠString , ĊĠĠĠ Ġval Ġtype : ĠString , ĊĠĠĠ Ġval Ġdescription : ĠString , ĊĠĠĠ Ġval Ġdev tools Frontend Url : ĠString , ĊĠĠĠ Ġval Ġweb Socket Debugger Url : ĠString , Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAtt aches Ġto Ġthis Ġtarget Ġvia Ġa Ġnew Ġweb Ġsocket Ġconnection Ġto Ġthis Ġtarget 's Ġdebugger ĠURL . ĊĠĠĠĠ Ġ* ĠThis Ġestab lishes Ġa Ġnew Ġprotocol Ġsession Ġto Ġthis Ġtarget . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Deprecated (" this Ġmethod Ġprovides Ġno Ġway Ġof Ġclosing Ġthe Ġcreated Ġwebsocket Ġconnection , Ġprefer Ġusing Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" Chrome DP Client . web Socket Ġand Ġusing Ġthe Ġr icher Ġwebsocket ĠAPI Ġto Ġinteract Ġwith Ġtargets Ġ( Chrome Browser Session . target )") ĊĠĠĠ Ġsuspend Ġfun Ġattach ( web Socket Client : ĠWebSocket Client Ġ= ĠDEFAULT _ WEB SOCKET _ CLIENT ): ĠChrome Page Session Ġ= ĊĠĠĠĠĠĠĠ Ġweb Socket Client . connect To Chrome ( web Socket Debugger Url ). attach To Page ( id ) Ċ } Ċ Ċ /** Ċ Ġ* ĠConnect s Ġto Ġthe ĠChrome Ġdebugger Ġat Ġthe Ġgiven Ġ[ web Socket Debugger Url ]. Ċ Ġ* Ċ Ġ* ĠThe Ġreturned Ġ[ Chrome Browser Session ] Ġonly Ġprovides Ġa Ġlimited Ġsubset Ġof Ġthe Ġpossible Ġoperations , Ġbecause Ġit Ġis Ċ Ġ* Ġattached Ġto Ġthe Ġdefault Ġ* browser * Ġtarget , Ġnot Ġa Ġ* page * Ġtarget . Ċ Ġ* ĠTo Ġattach Ġto Ġa Ġspecific Ġtarget Ġusing Ġthe Ġsame Ġunderlying Ġweb Ġsocket Ġconnection , Ġcall Ċ Ġ* Ġ[ Chrome Browser Session . attach To Page ] Ġor Ċ Ġ* Ġ[ Chrome Browser Session . attach To New Page ][ org . h ild an . chrome . devtools . targets . attach To New Page ]. Ċ Ġ*/ Ċ suspend Ġfun ĠWebSocket Client . connect To Chrome ( web Socket Debugger Url : ĠString ): ĠChrome Browser Session Ġ{ ĊĠĠĠ Ġval Ġconnection Ġ= Ġconnect ( web Socket Debugger Url ). chrome Dp () ĊĠĠĠ Ġreturn ĠChrome Browser Session ( Chrome DP Session ( connection , Ġnull )) Ċ } Ċ