@@ -15,7 +15,7 @@ use crate::overlay::{AddressBarState, OverlayState};
1515use crate :: tab:: { TabId , TabManager , TabState } ;
1616
1717pub enum UserEvent {
18- NavigationComplete ( TabId , Result < NavigationResult , NavigationError > ) ,
18+ NavigationComplete ( TabId , Result < NavigationResult , NavigationError > , u64 ) ,
1919}
2020
2121pub struct Browser {
@@ -31,6 +31,8 @@ pub struct Browser {
3131 _network_child : Option < ie_sandbox:: ChildHandle > ,
3232 modifiers : ModifiersState ,
3333 event_loop_proxy : EventLoopProxy < UserEvent > ,
34+ status_log : Vec < String > ,
35+ last_load_time_ms : Option < u64 > ,
3436}
3537
3638impl Browser {
@@ -81,6 +83,8 @@ impl Browser {
8183 _network_child : network_child,
8284 modifiers : ModifiersState :: empty ( ) ,
8385 event_loop_proxy : proxy,
86+ status_log : Vec :: new ( ) ,
87+ last_load_time_ms : None ,
8488 } ;
8589
8690 if let Some ( url) = url {
@@ -149,6 +153,14 @@ impl Browser {
149153 self . overlay = OverlayState :: Bookmarks ;
150154 tracing:: info!( "overlay: Bookmarks" ) ;
151155 }
156+ Action :: ShowHelp => {
157+ self . overlay = OverlayState :: Help ;
158+ tracing:: info!( "overlay: Help" ) ;
159+ }
160+ Action :: ShowStatusBar => {
161+ self . overlay = OverlayState :: StatusBar ;
162+ tracing:: info!( "overlay: StatusBar" ) ;
163+ }
152164 Action :: GoBack => {
153165 if self . tab_manager . go_back ( )
154166 && let Some ( tab) = self . tab_manager . active_tab ( )
@@ -239,11 +251,16 @@ impl Browser {
239251
240252 tracing:: info!( "navigate: tab={}, url={}" , tab_id. 0 , url) ;
241253
254+ self . status_log
255+ . push ( format ! ( "navigating: tab={}, url={}" , tab_id. 0 , url) ) ;
256+
242257 let proxy = self . event_loop_proxy . clone ( ) ;
243258 let navigator = Arc :: clone ( & self . navigator ) ;
244259 self . tokio_runtime . spawn ( async move {
260+ let start = std:: time:: Instant :: now ( ) ;
245261 let result = navigator. navigate ( & url) . await ;
246- let _ = proxy. send_event ( UserEvent :: NavigationComplete ( tab_id, result) ) ;
262+ let elapsed = start. elapsed ( ) . as_millis ( ) as u64 ;
263+ let _ = proxy. send_event ( UserEvent :: NavigationComplete ( tab_id, result, elapsed) ) ;
247264 } ) ;
248265 }
249266
@@ -254,11 +271,12 @@ impl Browser {
254271 ) {
255272 match result {
256273 Ok ( nav_result) => {
257- tracing :: info !(
274+ let msg = format ! (
258275 "navigation complete: tab={}, status={}" ,
259- tab_id. 0 ,
260- nav_result. status
276+ tab_id. 0 , nav_result. status
261277 ) ;
278+ tracing:: info!( "{msg}" ) ;
279+ self . status_log . push ( msg) ;
262280 let source = String :: from_utf8 ( nav_result. body ) . ok ( ) ;
263281 // Find the tab (it might have been closed while loading)
264282 if let Some ( tab) = self
@@ -278,7 +296,9 @@ impl Browser {
278296 }
279297 }
280298 Err ( e) => {
281- tracing:: error!( "navigation error: tab={}, error={}" , tab_id. 0 , e) ;
299+ let msg = format ! ( "navigation error: tab={}, error={}" , tab_id. 0 , e) ;
300+ tracing:: error!( "{msg}" ) ;
301+ self . status_log . push ( msg) ;
282302 if let Some ( tab) = self
283303 . tab_manager
284304 . tabs_mut ( )
@@ -325,6 +345,8 @@ impl Browser {
325345 } ) ,
326346 tab_list : None ,
327347 bookmarks : None ,
348+ help : false ,
349+ status_bar : None ,
328350 } ,
329351 OverlayState :: TabList => {
330352 let tabs = self
@@ -350,6 +372,8 @@ impl Browser {
350372 address_bar : None ,
351373 tab_list : Some ( ie_render:: TabListOverlay { tabs, active_index } ) ,
352374 bookmarks : None ,
375+ help : false ,
376+ status_bar : None ,
353377 }
354378 }
355379 OverlayState :: Bookmarks => {
@@ -366,6 +390,40 @@ impl Browser {
366390 address_bar : None ,
367391 tab_list : None ,
368392 bookmarks : Some ( ie_render:: BookmarkListOverlay { bookmarks } ) ,
393+ help : false ,
394+ status_bar : None ,
395+ }
396+ }
397+ OverlayState :: Help => ie_render:: ChromeOverlay {
398+ address_bar : None ,
399+ tab_list : None ,
400+ bookmarks : None ,
401+ help : true ,
402+ status_bar : None ,
403+ } ,
404+ OverlayState :: StatusBar => {
405+ let url = self
406+ . tab_manager
407+ . active_tab ( )
408+ . and_then ( |t| t. url . as_ref ( ) )
409+ . map ( |u| u. as_str ( ) . to_string ( ) )
410+ . unwrap_or_default ( ) ;
411+ let status = self
412+ . tab_manager
413+ . active_tab ( )
414+ . map ( |t| format ! ( "{:?}" , t. state) )
415+ . unwrap_or_else ( || "No tab" . to_string ( ) ) ;
416+ ie_render:: ChromeOverlay {
417+ address_bar : None ,
418+ tab_list : None ,
419+ bookmarks : None ,
420+ help : false ,
421+ status_bar : Some ( ie_render:: StatusBarOverlay {
422+ url,
423+ status,
424+ load_time_ms : self . last_load_time_ms ,
425+ log_entries : self . status_log . clone ( ) ,
426+ } ) ,
369427 }
370428 }
371429 }
@@ -468,7 +526,8 @@ impl ApplicationHandler<UserEvent> for Browser {
468526
469527 fn user_event ( & mut self , _event_loop : & ActiveEventLoop , event : UserEvent ) {
470528 match event {
471- UserEvent :: NavigationComplete ( tab_id, result) => {
529+ UserEvent :: NavigationComplete ( tab_id, result, elapsed_ms) => {
530+ self . last_load_time_ms = Some ( elapsed_ms) ;
472531 self . handle_navigation_complete ( tab_id, result) ;
473532 }
474533 }
0 commit comments