/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġorg . jetbrains . project or . int Test . headless Ċ Ċ import Ġcom . code bor ne . se len ide . Condition . appear Ċ import Ġcom . code bor ne . se len ide . Condition . text Ċ import Ġcom . code bor ne . se len ide . Sel en ide .* Ċ import Ġcom . code bor ne . se len ide . WebDriver Runner Ċ import Ġio . ktor . http . c io . websocket . close Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . jetbrains . project or . common . protocol . data . Common Rectangle Ċ import Ġorg . jetbrains . project or . common . protocol . to Client . Server Window Set Changed Event Ċ import Ġorg . jetbrains . project or . common . protocol . to Client . Window Data Ċ import Ġorg . jetbrains . project or . common . protocol . to Client . Window Type Ċ import Ġorg . jetbrains . project or . int Test . Connection Util . client Url Ċ import Ġorg . jetbrains . project or . int Test . Connection Util . start Server And Do Handshake Ċ import Ġorg . openqa . selenium . TimeoutException Ċ import Ġorg . openqa . selenium . support . ui . Expected Conditions Ċ import Ġorg . openqa . selenium . support . ui . WebDriver Wait Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertFalse Ċ import Ġkotlin . test . assertTrue Ċ Ċ class ĠClose Blocking Test Ġ{ ĊĊĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĊĠĠĠ Ġprivate Ġfun Ġopen Client And Activate Page () Ġ{ ĊĠĠĠĠĠ Ġopen ( client Url ) ĊĠĠĠĠĠ Ġelement (" body "). click ( 5 , Ġ 5 ) Ġ Ġ// Ġenable Ġon before unload Ġlistener , Ġcan 't Ġclick Ġwithout Ġarguments Ġbecause Ġof Ġan Ġexception ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Alert Present (): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwait Ġ= ĠWebDriver Wait ( WebDriver Runner . get WebDriver (), Ġ 5 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwait . until ( Expected Conditions . alert Is Present ()) Ġ!= Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcatch Ġ( e : ĠTimeout Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun ĠshouldBe Ab le To Close Before () Ġ{ ĊĠĠĠ Ġopen Client And Activate Page () ĊĠĠĠ Ġelement (" body "). should Have ( text (" reconnect ")) ĊĠĠĠ Ġrefresh () ĊĠĠĠ ĠassertFalse ( is Alert Present ()) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun ĠshouldBe Unable To Close When Connected () Ġ{ ĊĠĠĠ Ġval Ġclient Load Notifier Ġ= ĠChannel < Unit >() ĊĊĠĠĠ Ġval Ġserver Ġ= Ġstart Server And Do Handshake Ġ{ Ġ( sender , Ġ_) Ġ-> ĊĠĠĠĠĠ Ġval Ġwindow Ġ= ĠWindow Data ( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġis Showing Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġz Order Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġbounds Ġ= ĠCommon Rectangle ( 1 0 . 0 , Ġ 1 0 . 0 , Ġ 1 0 0 . 0 , Ġ 1 0 0 . 0 ), ĊĠĠĠĠĠĠĠ Ġres izable Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġmodal Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġun decor ated Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġwindow Type Ġ= ĠWindow Type . IDE A _ WINDOW ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠ Ġsender ( listOf ( Server Window Set Changed Event ( listOf ( window )))) ĊĊĠĠĠĠĠ Ġclient Load Notifier . send ( Unit ) ĊĊĠĠĠĠĠ Ġfor Ġ( frame Ġin Ġincoming ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġmaintaining Ġconnection ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġserver . start () ĊĊĠĠĠ Ġopen Client And Activate Page () ĊĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠ Ġclient Load Notifier . receive () ĊĠĠĠ Ġ} ĊĠĠĠ Ġelement (" canvas . window "). should ( appear ) ĊĊĠĠĠ Ġrefresh () ĊĠĠĠ ĠassertTrue ( is Alert Present ()) ĊĠĠĠ Ġconfirm () ĊĊĠĠĠ Ġserver . stop ( 5 0 0 , Ġ 1 0 0 0 ) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun ĠshouldBe Ab le To Close After Connection End s () Ġ{ ĊĠĠĠ Ġval Ġconnection Ended Notifier Ġ= ĠChannel < Unit >() ĊĊĠĠĠ Ġval Ġserver Ġ= Ġstart Server And Do Handshake Ġ{ ĊĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠ Ġconnection Ended Notifier . send ( Unit ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġserver . start () ĊĊĠĠĠ Ġopen Client And Activate Page () ĊĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠ Ġconnection Ended Notifier . receive () ĊĠĠĠ Ġ} ĊĠĠĠ Ġelement (" body "). should Have ( text (" ended ")) ĊĊĠĠĠ Ġrefresh () ĊĠĠĠ ĠassertFalse ( is Alert Present ()) ĊĊĠĠĠ Ġserver . stop ( 5 0 0 , Ġ 1 0 0 0 ) ĊĠ Ġ} Ċ } Ċ