rudimentary handling of tabs

This commit is contained in:
Gregory Terzian 2018-06-05 10:42:09 +08:00
parent fee5428316
commit 96f75465cf

View file

@ -26,6 +26,12 @@ pub struct Browser {
/// are not supported yet. None until created. /// are not supported yet. None until created.
browser_id: Option<BrowserId>, browser_id: Option<BrowserId>,
// A rudimentary stack of "tabs".
// EmbedderMsg::BrowserCreated will push onto it.
// EmbedderMsg::CloseBrowser will pop from it,
// and exit if it is empty afterwards.
browsers: Vec<BrowserId>,
title: Option<String>, title: Option<String>,
status: Option<String>, status: Option<String>,
favicon: Option<ServoUrl>, favicon: Option<ServoUrl>,
@ -47,6 +53,7 @@ impl Browser {
title: None, title: None,
current_url: None, current_url: None,
browser_id: None, browser_id: None,
browsers: Vec::new(),
status: None, status: None,
favicon: None, favicon: None,
loading_state: None, loading_state: None,
@ -62,6 +69,7 @@ impl Browser {
pub fn set_browser_id(&mut self, browser_id: BrowserId) { pub fn set_browser_id(&mut self, browser_id: BrowserId) {
self.browser_id = Some(browser_id); self.browser_id = Some(browser_id);
self.browsers.push(browser_id);
} }
pub fn handle_window_events(&mut self, events: Vec<WindowEvent>) { pub fn handle_window_events(&mut self, events: Vec<WindowEvent>) {
@ -293,7 +301,7 @@ impl Browser {
} }
EmbedderMsg::BrowserCreated(new_browser_id) => { EmbedderMsg::BrowserCreated(new_browser_id) => {
// TODO: properly handle a new "tab" // TODO: properly handle a new "tab"
self.browser_id = Some(new_browser_id); self.browsers.push(new_browser_id);
self.event_queue.push(WindowEvent::SelectBrowser(new_browser_id)); self.event_queue.push(WindowEvent::SelectBrowser(new_browser_id));
} }
EmbedderMsg::KeyEvent(ch, key, state, modified) => { EmbedderMsg::KeyEvent(ch, key, state, modified) => {
@ -321,10 +329,13 @@ impl Browser {
self.loading_state = Some(LoadingState::Loaded); self.loading_state = Some(LoadingState::Loaded);
} }
EmbedderMsg::CloseBrowser => { EmbedderMsg::CloseBrowser => {
self.browser_id = None; // TODO: close the appropriate "tab".
// Nothing left to do for now, let _ = self.browsers.pop();
// but could hide a tab, and show another one, instead of quitting. if let Some(prev_browser_id) = self.browsers.last() {
self.event_queue.push(WindowEvent::Quit); self.event_queue.push(WindowEvent::SelectBrowser(*prev_browser_id));
} else {
self.event_queue.push(WindowEvent::Quit);
}
}, },
EmbedderMsg::Shutdown => { EmbedderMsg::Shutdown => {
self.shutdown_requested = true; self.shutdown_requested = true;