@@ -23,8 +23,9 @@ use constellation_traits::{EmbedderToConstellationMessage, TraversalDirection};
23
23
use cookie:: { CookieBuilder , Expiration } ;
24
24
use crossbeam_channel:: { Receiver , Sender , after, select, unbounded} ;
25
25
use embedder_traits:: {
26
- WebDriverCommandMsg , WebDriverCookieError , WebDriverFrameId , WebDriverJSError ,
27
- WebDriverJSResult , WebDriverJSValue , WebDriverLoadStatus , WebDriverScriptCommand ,
26
+ EmbedderMsg , EmbedderProxy , EventLoopWaker , WebDriverCommandMsg , WebDriverCookieError ,
27
+ WebDriverFrameId , WebDriverJSError , WebDriverJSResult , WebDriverJSValue , WebDriverLoadStatus ,
28
+ WebDriverScriptCommand ,
28
29
} ;
29
30
use euclid:: { Rect , Size2D } ;
30
31
use http:: method:: Method ;
@@ -57,8 +58,8 @@ use webdriver::common::{Cookie, Date, LocatorStrategy, Parameters, WebElement};
57
58
use webdriver:: error:: { ErrorStatus , WebDriverError , WebDriverResult } ;
58
59
use webdriver:: httpapi:: WebDriverExtensionRoute ;
59
60
use webdriver:: response:: {
60
- CloseWindowResponse , CookieResponse , CookiesResponse , ElementRectResponse , NewSessionResponse ,
61
- NewWindowResponse , TimeoutsResponse , ValueResponse , WebDriverResponse , WindowRectResponse ,
61
+ CookieResponse , CookiesResponse , ElementRectResponse , NewSessionResponse , NewWindowResponse ,
62
+ TimeoutsResponse , ValueResponse , WebDriverResponse , WindowRectResponse ,
62
63
} ;
63
64
use webdriver:: server:: { self , Session , SessionTeardownKind , WebDriverHandler } ;
64
65
@@ -100,8 +101,12 @@ fn cookie_msg_to_cookie(cookie: cookie::Cookie) -> Cookie {
100
101
}
101
102
}
102
103
103
- pub fn start_server ( port : u16 , constellation_chan : Sender < EmbedderToConstellationMessage > ) {
104
- let h
9B9E
andler = Handler :: new ( constellation_chan) ;
104
+ pub fn start_server (
105
+ port : u16 ,
106
+ constellation_chan : Sender < EmbedderToConstellationMessage > ,
107
+ embedder_proxy : EmbedderProxy ,
108
+ ) {
109
+ let handler = Handler :: new ( constellation_chan, embedder_proxy) ;
105
110
thread:: Builder :: new ( )
106
111
. name ( "WebDriverHttpServer" . to_owned ( ) )
107
112
. spawn ( move || {
@@ -120,6 +125,19 @@ pub fn start_server(port: u16, constellation_chan: Sender<EmbedderToConstellatio
120
125
. expect ( "Thread spawning failed" ) ;
121
126
}
122
127
128
+ pub fn create_embedder_channel (
129
+ event_loop_waker : Box < dyn EventLoopWaker > ,
130
+ ) -> ( EmbedderProxy , Receiver < EmbedderMsg > ) {
131
+ let ( sender, receiver) = unbounded ( ) ;
132
+ (
133
+ EmbedderProxy {
134
+ sender,
135
+ event_loop_waker,
136
+ } ,
137
+ receiver,
138
+ )
139
+ }
140
+
123
141
/// Represents the current WebDriver session and holds relevant session state.
124
142
pub struct WebDriverSession {
125
143
id : Uuid ,
@@ -189,6 +207,7 @@ struct Handler {
189
207
load_status_sender : IpcSender < WebDriverLoadStatus > ,
190
208
session : Option < WebDriverSession > ,
191
209
constellation_chan : Sender < EmbedderToConstellationMessage > ,
210
+ embedder_proxy : EmbedderProxy ,
192
211
resize_timeout : u32 ,
193
212
}
194
213
@@ -400,7 +419,10 @@ impl<'de> Visitor<'de> for TupleVecMapVisitor {
400
419
}
401
420
402
421
impl Handler {
403
- pub fn new ( constellation_chan : Sender < EmbedderToConstellationMessage > ) -> Handler {
422
+ pub fn new (
423
+ constellation_chan : Sender < EmbedderToConstellationMessage > ,
424
+ embedder_proxy : EmbedderProxy ,
425
+ ) -> Handler {
404
426
// Create a pair of both an IPC and a threaded channel,
405
427
// keep the IPC sender to clone and pass to the constellation for each load,
406
428
// and keep a threaded receiver to block on an incoming load-status.
@@ -414,6 +436,7 @@ impl Handler {
414
436
load_status_receiver,
415
437
session : None ,
416
438
constellation_chan,
439
+ embedder_proxy,
417
440
resize_timeout : 500 ,
418
441
}
419
442
}
@@ -623,10 +646,9 @@ impl Handler {
623
646
cmd_msg : WebDriverScriptCommand ,
624
647
) -> WebDriverResult < ( ) > {
625
648
let browsing_context_id = self . session ( ) ?. browsing_context_id ;
626
- let msg = EmbedderToConstellationMessage :: WebDriverCommand (
649
+ self . embedder_proxy . send ( EmbedderMsg :: WebDriverToEmbedder (
627
650
WebDriverCommandMsg :: ScriptCommand ( browsing_context_id, cmd_msg) ,
628
- ) ;
629
- self . constellation_chan . send ( msg) . unwrap ( ) ;
651
+ ) ) ;
630
652
Ok ( ( ) )
631
653
}
632
654
@@ -895,14 +917,7 @@ impl Handler {
895
917
. unwrap ( ) ;
896
918
}
897
919
898
- Ok ( WebDriverResponse :: CloseWindow ( CloseWindowResponse (
899
- self . session ( )
900
- . unwrap ( )
901
- . window_handles
902
- . values ( )
903
- . cloned ( )
904
- . collect ( ) ,
905
- ) ) )
920
+ self . handle_window_handles ( )
906
921
}
907
922
908
923
fn handle_new_window (
0 commit comments