aboutsummaryrefslogtreecommitdiffstats
path: root/ports
diff options
context:
space:
mode:
Diffstat (limited to 'ports')
-rw-r--r--ports/libsimpleservo/api/src/lib.rs82
-rw-r--r--ports/servoshell/app.rs45
-rw-r--r--ports/servoshell/main.rs2
-rw-r--r--ports/servoshell/minibrowser.rs16
-rw-r--r--ports/servoshell/webview.rs (renamed from ports/servoshell/browser.rs)120
5 files changed, 138 insertions, 127 deletions
diff --git a/ports/libsimpleservo/api/src/lib.rs b/ports/libsimpleservo/api/src/lib.rs
index 5a3d1e4cd74..069e5745ae5 100644
--- a/ports/libsimpleservo/api/src/lib.rs
+++ b/ports/libsimpleservo/api/src/lib.rs
@@ -31,7 +31,7 @@ use servo::embedder_traits::{
use servo::euclid::{Point2D, Rect, Scale, Size2D, Vector2D};
use servo::keyboard_types::{Key, KeyState, KeyboardEvent};
pub use servo::msg::constellation_msg::InputMethodType;
-use servo::msg::constellation_msg::TraversalDirection;
+use servo::msg::constellation_msg::{TraversalDirection, WebViewId};
pub use servo::script_traits::{MediaSessionActionType, MouseButton};
use servo::script_traits::{TouchEventType, TouchId};
use servo::servo_config::{opts, pref};
@@ -168,19 +168,25 @@ pub struct ServoGlue {
servo: Servo<ServoWindowCallbacks>,
batch_mode: bool,
callbacks: Rc<ServoWindowCallbacks>,
- /// id of the top level browsing context. It is unique as tabs
- /// are not supported yet. None until created.
- 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>,
events: Vec<EmbedderEvent>,
-
context_menu_sender: Option<IpcSender<ContextMenuResult>>,
+
+ /// List of top-level browsing contexts.
+ /// Modified by EmbedderMsg::WebViewOpened and EmbedderMsg::WebViewClosed,
+ /// and we exit if it ever becomes empty.
+ webviews: HashMap<WebViewId, WebView>,
+
+ /// The order in which the webviews were created.
+ creation_order: Vec<WebViewId>,
+
+ /// The webview that is currently focused.
+ /// Modified by EmbedderMsg::WebViewFocused and EmbedderMsg::WebViewBlurred.
+ focused_webview_id: Option<WebViewId>,
}
+#[derive(Debug)]
+pub struct WebView {}
+
pub fn servo_version() -> String {
format!(
"Servo {}-{}",
@@ -312,12 +318,13 @@ pub fn init(
servo: servo.servo,
batch_mode: false,
callbacks: window_callbacks,
- browser_id: None,
- browsers: vec![],
events: vec![],
context_menu_sender: None,
+ webviews: HashMap::default(),
+ creation_order: vec![],
+ focused_webview_id: None,
};
- let _ = servo_glue.process_event(EmbedderEvent::NewBrowser(url, servo.browser_id));
+ let _ = servo_glue.process_event(EmbedderEvent::NewWebView(url, servo.browser_id));
*s.borrow_mut() = Some(servo_glue);
});
@@ -330,11 +337,11 @@ pub fn deinit() {
impl ServoGlue {
fn get_browser_id(&self) -> Result<BrowserId, &'static str> {
- let browser_id = match self.browser_id {
+ let webview_id = match self.focused_webview_id {
Some(id) => id,
- None => return Err("No BrowserId set yet."),
+ None => return Err("No focused WebViewId yet."),
};
- Ok(browser_id)
+ Ok(webview_id)
}
/// Request shutdown. Will call on_shutdown_complete.
@@ -604,7 +611,7 @@ impl ServoGlue {
pub fn change_visibility(&mut self, visible: bool) -> Result<(), &'static str> {
info!("change_visibility");
if let Ok(id) = self.get_browser_id() {
- let event = EmbedderEvent::ChangeBrowserVisibility(id, visible);
+ let event = EmbedderEvent::WebViewVisibilityChanged(id, visible);
self.process_event(event)
} else {
// Ignore visibility change if no browser has been created yet.
@@ -714,21 +721,35 @@ impl ServoGlue {
.push(EmbedderEvent::SendError(browser_id, reason));
}
},
- EmbedderMsg::AllowOpeningBrowser(response_chan) => {
+ EmbedderMsg::AllowOpeningWebView(response_chan) => {
// Note: would be a place to handle pop-ups config.
// see Step 7 of #the-rules-for-choosing-a-browsing-context-given-a-browsing-context-name
if let Err(e) = response_chan.send(true) {
warn!("Failed to send AllowOpeningBrowser response: {}", e);
};
},
- EmbedderMsg::BrowserCreated(new_browser_id) => {
- // TODO: properly handle a new "tab"
- self.browsers.push(new_browser_id);
- if self.browser_id.is_none() {
- self.browser_id = Some(new_browser_id);
- }
+ EmbedderMsg::WebViewOpened(new_webview_id) => {
+ self.webviews.insert(new_webview_id, WebView {});
+ self.creation_order.push(new_webview_id);
self.events
- .push(EmbedderEvent::SelectBrowser(new_browser_id));
+ .push(EmbedderEvent::FocusWebView(new_webview_id));
+ },
+ EmbedderMsg::WebViewClosed(webview_id) => {
+ self.webviews.retain(|&id, _| id != webview_id);
+ self.creation_order.retain(|&id| id != webview_id);
+ self.focused_webview_id = None;
+ if let Some(&newest_webview_id) = self.creation_order.last() {
+ self.events
+ .push(EmbedderEvent::FocusWebView(newest_webview_id));
+ } else {
+ self.events.push(EmbedderEvent::Quit);
+ }
+ },
+ EmbedderMsg::WebViewFocused(webview_id) => {
+ self.focused_webview_id = Some(webview_id);
+ },
+ EmbedderMsg::WebViewBlurred => {
+ self.focused_webview_id = None;
},
EmbedderMsg::GetClipboardContents(sender) => {
let contents = self.callbacks.host_callbacks.get_clipboard_contents();
@@ -737,17 +758,6 @@ impl ServoGlue {
EmbedderMsg::SetClipboardContents(text) => {
self.callbacks.host_callbacks.set_clipboard_contents(text);
},
- EmbedderMsg::CloseBrowser => {
- // TODO: close the appropriate "tab".
- let _ = self.browsers.pop();
- if let Some(prev_browser_id) = self.browsers.last() {
- self.browser_id = Some(*prev_browser_id);
- self.events
- .push(EmbedderEvent::SelectBrowser(*prev_browser_id));
- } else {
- self.events.push(EmbedderEvent::Quit);
- }
- },
EmbedderMsg::Shutdown => {
self.callbacks.host_callbacks.on_shutdown_complete();
},
diff --git a/ports/servoshell/app.rs b/ports/servoshell/app.rs
index b7e8b86b5b2..59b7709769f 100644
--- a/ports/servoshell/app.rs
+++ b/ports/servoshell/app.rs
@@ -23,17 +23,17 @@ use winit::event::WindowEvent;
use winit::event_loop::EventLoopWindowTarget;
use winit::window::WindowId;
-use crate::browser::Browser;
use crate::embedder::EmbedderCallbacks;
use crate::events_loop::{EventsLoop, WakerEvent};
use crate::minibrowser::Minibrowser;
use crate::parser::get_default_url;
+use crate::webview::WebViewManager;
use crate::window_trait::WindowPortsMethods;
use crate::{headed_window, headless_window};
pub struct App {
servo: Option<Servo<dyn WindowPortsMethods>>,
- browser: RefCell<Browser<dyn WindowPortsMethods>>,
+ webviews: RefCell<WebViewManager<dyn WindowPortsMethods>>,
event_queue: RefCell<Vec<EmbedderEvent>>,
suspended: Cell<bool>,
windows: HashMap<WindowId, Rc<dyn WindowPortsMethods>>,
@@ -81,7 +81,7 @@ impl App {
};
// Handle browser state.
- let browser = Browser::new(window.clone());
+ let webviews = WebViewManager::new(window.clone());
let initial_url = get_default_url(
url.as_ref().map(String::as_str),
env::current_dir().unwrap(),
@@ -90,7 +90,7 @@ impl App {
let mut app = App {
event_queue: RefCell::new(vec![]),
- browser: RefCell::new(browser),
+ webviews: RefCell::new(webviews),
servo: None,
suspended: Cell::new(false),
windows: HashMap::new(),
@@ -200,7 +200,7 @@ impl App {
);
let mut servo = servo_data.servo;
- servo.handle_events(vec![EmbedderEvent::NewBrowser(
+ servo.handle_events(vec![EmbedderEvent::NewWebView(
initial_url.to_owned(),
servo_data.browser_id,
)]);
@@ -297,9 +297,9 @@ impl App {
// Consume and handle any events from the Minibrowser.
if let Some(minibrowser) = app.minibrowser() {
- let browser = &mut app.browser.borrow_mut();
+ let webviews = &mut app.webviews.borrow_mut();
let app_event_queue = &mut app.event_queue.borrow_mut();
- minibrowser.queue_embedder_events_for_minibrowser_events(browser, app_event_queue);
+ minibrowser.queue_embedder_events_for_minibrowser_events(webviews, app_event_queue);
}
match app.handle_events() {
@@ -316,8 +316,8 @@ impl App {
} => {
if history_changed {
if let Some(mut minibrowser) = app.minibrowser() {
- let browser = &mut app.browser.borrow_mut();
- if minibrowser.update_location_in_toolbar(browser) {
+ let webviews = &mut app.webviews.borrow_mut();
+ if minibrowser.update_location_in_toolbar(webviews) {
// Update the minibrowser immediately. While we could update by requesting a
// redraw, doing so would delay the location update by two frames.
minibrowser.update(
@@ -422,18 +422,11 @@ impl App {
/// towards Servo and embedder messages flow away from Servo, and also runs the compositor.
///
/// As the embedder, we push embedder events through our event queues, from the App queue and
- /// Window queues to the Browser queue, and from the Browser queue to Servo. We receive and
- /// collect embedder messages from the various Servo components, then take them out of the
- /// Servo interface so that the Browser can handle them.
+ /// Window queues to the WebViewManager queue, and from the WebViewManager queue to Servo. We
+ /// receive and collect embedder messages from the various Servo components, then take them out
+ /// of the Servo interface so that the WebViewManager can handle them.
fn handle_events(&mut self) -> PumpResult {
- let mut browser = self.browser.borrow_mut();
-
- // FIXME:
- // As of now, we support only one browser (self.browser)
- // but have multiple windows (dom.webxr.glwindow). We forward
- // the events of all the windows combined to that single
- // browser instance. Pressing the "a" key on the glwindow
- // will send a key event to the servo window.
+ let mut webviews = self.webviews.borrow_mut();
// Take any outstanding embedder events from the App and its Windows.
let mut embedder_events = self.get_events();
@@ -441,8 +434,8 @@ impl App {
embedder_events.extend(window.get_events());
}
- // Catch some keyboard events, and push the rest onto the Browser event queue.
- browser.handle_window_events(embedder_events);
+ // Catch some keyboard events, and push the rest onto the WebViewManager event queue.
+ webviews.handle_window_events(embedder_events);
// Take any new embedder messages from Servo itself.
let mut embedder_messages = self.servo.as_mut().unwrap().get_events();
@@ -451,19 +444,19 @@ impl App {
let mut history_changed = false;
loop {
// Consume and handle those embedder messages.
- let servo_event_response = browser.handle_servo_events(embedder_messages);
+ let servo_event_response = webviews.handle_servo_events(embedder_messages);
need_present |= servo_event_response.need_present;
history_changed |= servo_event_response.history_changed;
- // Route embedder events from the Browser to the relevant Servo components,
+ // Route embedder events from the WebViewManager to the relevant Servo components,
// receives and collects embedder messages from various Servo components,
// and runs the compositor.
need_resize |= self
.servo
.as_mut()
.unwrap()
- .handle_events(browser.get_events());
- if browser.shutdown_requested() {
+ .handle_events(webviews.get_events());
+ if webviews.shutdown_requested() {
return PumpResult::Shutdown;
}
diff --git a/ports/servoshell/main.rs b/ports/servoshell/main.rs
index fd56fcdc61b..a215089bfea 100644
--- a/ports/servoshell/main.rs
+++ b/ports/servoshell/main.rs
@@ -31,7 +31,6 @@ cfg_if::cfg_if! {
mod app;
mod backtrace;
- mod browser;
mod crash_handler;
mod egui_glue;
mod embedder;
@@ -45,6 +44,7 @@ cfg_if::cfg_if! {
mod parser;
mod prefs;
mod resources;
+ mod webview;
mod window_trait;
pub mod platform {
diff --git a/ports/servoshell/minibrowser.rs b/ports/servoshell/minibrowser.rs
index 42659ec1964..b7bbabafdb5 100644
--- a/ports/servoshell/minibrowser.rs
+++ b/ports/servoshell/minibrowser.rs
@@ -20,11 +20,11 @@ use servo::servo_geometry::DeviceIndependentPixel;
use servo::servo_url::ServoUrl;
use servo::webrender_surfman::WebrenderSurfman;
-use crate::browser::Browser;
use crate::egui_glue::EguiGlow;
use crate::events_loop::EventsLoop;
use crate::geometry::winit_position_to_euclid_point;
use crate::parser::location_bar_input_to_url;
+use crate::webview::WebViewManager;
use crate::window_trait::WindowPortsMethods;
pub struct Minibrowser {
@@ -260,13 +260,13 @@ impl Minibrowser {
/// routing those to the App event queue.
pub fn queue_embedder_events_for_minibrowser_events(
&self,
- browser: &Browser<dyn WindowPortsMethods>,
+ browser: &WebViewManager<dyn WindowPortsMethods>,
app_event_queue: &mut Vec<EmbedderEvent>,
) {
for event in self.event_queue.borrow_mut().drain(..) {
match event {
MinibrowserEvent::Go => {
- let browser_id = browser.browser_id().unwrap();
+ let browser_id = browser.webview_id().unwrap();
let location = self.location.borrow();
if let Some(url) = location_bar_input_to_url(&location.clone()) {
app_event_queue.push(EmbedderEvent::LoadUrl(browser_id, url));
@@ -276,14 +276,14 @@ impl Minibrowser {
}
},
MinibrowserEvent::Back => {
- let browser_id = browser.browser_id().unwrap();
+ let browser_id = browser.webview_id().unwrap();
app_event_queue.push(EmbedderEvent::Navigation(
browser_id,
TraversalDirection::Back(1),
));
},
MinibrowserEvent::Forward => {
- let browser_id = browser.browser_id().unwrap();
+ let browser_id = browser.webview_id().unwrap();
app_event_queue.push(EmbedderEvent::Navigation(
browser_id,
TraversalDirection::Forward(1),
@@ -293,11 +293,11 @@ impl Minibrowser {
}
}
- /// Updates the location field from the given [Browser], unless the user has started editing it
- /// without clicking Go, returning true iff the location has changed (needing an egui update).
+ /// Updates the location field from the given [BrowserManager], unless the user has started
+ /// editing it without clicking Go, returning true iff it has changed (needing an egui update).
pub fn update_location_in_toolbar(
&mut self,
- browser: &mut Browser<dyn WindowPortsMethods>,
+ browser: &mut WebViewManager<dyn WindowPortsMethods>,
) -> bool {
// User edited without clicking Go?
if self.location_dirty.get() {
diff --git a/ports/servoshell/browser.rs b/ports/servoshell/webview.rs
index 92e31f18c4e..cf0400faff7 100644
--- a/ports/servoshell/browser.rs
+++ b/ports/servoshell/webview.rs
@@ -2,6 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+use std::collections::HashMap;
use std::fs::File;
use std::io::Write;
use std::rc::Rc;
@@ -17,7 +18,7 @@ use servo::embedder_traits::{
CompositorEventVariant, ContextMenuResult, EmbedderMsg, FilterPattern, PermissionPrompt,
PermissionRequest, PromptDefinition, PromptOrigin, PromptResult,
};
-use servo::msg::constellation_msg::{TopLevelBrowsingContextId as BrowserId, TraversalDirection};
+use servo::msg::constellation_msg::{TopLevelBrowsingContextId as WebViewId, TraversalDirection};
use servo::script_traits::TouchEventType;
use servo::servo_config::opts;
use servo::servo_url::ServoUrl;
@@ -28,19 +29,21 @@ use crate::keyutils::{CMD_OR_ALT, CMD_OR_CONTROL};
use crate::parser::location_bar_input_to_url;
use crate::window_trait::{WindowPortsMethods, LINE_HEIGHT};
-pub struct Browser<Window: WindowPortsMethods + ?Sized> {
+pub struct WebViewManager<Window: WindowPortsMethods + ?Sized> {
current_url: Option<ServoUrl>,
current_url_string: Option<String>,
- /// id of the top level browsing context. It is unique as tabs
- /// are not supported yet. None until created.
- browser_id: Option<BrowserId>,
+ /// List of top-level browsing contexts.
+ /// Modified by EmbedderMsg::WebViewOpened and EmbedderMsg::WebViewClosed,
+ /// and we exit if it ever becomes empty.
+ webviews: HashMap<WebViewId, WebView>,
- // 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>,
+ /// The order in which the webviews were created.
+ creation_order: Vec<WebViewId>,
+
+ /// The webview that is currently focused.
+ /// Modified by EmbedderMsg::WebViewFocused and EmbedderMsg::WebViewBlurred.
+ focused_webview_id: Option<WebViewId>,
title: Option<String>,
@@ -50,22 +53,26 @@ pub struct Browser<Window: WindowPortsMethods + ?Sized> {
shutdown_requested: bool,
}
+#[derive(Debug)]
+pub struct WebView {}
+
pub struct ServoEventResponse {
pub need_present: bool,
pub history_changed: bool,
}
-impl<Window> Browser<Window>
+impl<Window> WebViewManager<Window>
where
Window: WindowPortsMethods + ?Sized,
{
- pub fn new(window: Rc<Window>) -> Browser<Window> {
- Browser {
+ pub fn new(window: Rc<Window>) -> WebViewManager<Window> {
+ WebViewManager {
title: None,
current_url: None,
current_url_string: None,
- browser_id: None,
- browsers: Vec::new(),
+ webviews: HashMap::default(),
+ creation_order: vec![],
+ focused_webview_id: None,
window,
clipboard: match Clipboard::new() {
Ok(c) => Some(c),
@@ -79,8 +86,8 @@ where
}
}
- pub fn browser_id(&self) -> Option<BrowserId> {
- self.browser_id
+ pub fn webview_id(&self) -> Option<WebViewId> {
+ self.focused_webview_id
}
pub fn current_url_string(&self) -> Option<&str> {
@@ -113,7 +120,7 @@ where
fn handle_key_from_window(&mut self, key_event: KeyboardEvent) {
ShortcutMatcher::from_event(key_event.clone())
.shortcut(CMD_OR_CONTROL, 'R', || {
- if let Some(id) = self.browser_id {
+ if let Some(id) = self.focused_webview_id {
self.event_queue.push(EmbedderEvent::Reload(id));
}
})
@@ -128,7 +135,7 @@ where
let input = tinyfiledialogs::input_box(title, title, &tiny_dialog_escape(&url));
if let Some(input) = input {
if let Some(url) = location_bar_input_to_url(&input) {
- if let Some(id) = self.browser_id {
+ if let Some(id) = self.focused_webview_id {
self.event_queue.push(EmbedderEvent::LoadUrl(id, url));
}
}
@@ -171,13 +178,13 @@ where
));
})
.shortcut(CMD_OR_ALT, Key::ArrowRight, || {
- if let Some(id) = self.browser_id {
+ if let Some(id) = self.focused_webview_id {
let event = EmbedderEvent::Navigation(id, TraversalDirection::Forward(1));
self.event_queue.push(event);
}
})
.shortcut(CMD_OR_ALT, Key::ArrowLeft, || {
- if let Some(id) = self.browser_id {
+ if let Some(id) = self.focused_webview_id {
let event = EmbedderEvent::Navigation(id, TraversalDirection::Back(1));
self.event_queue.push(event);
}
@@ -185,7 +192,7 @@ where
.shortcut(Modifiers::empty(), Key::Escape, || {
let state = self.window.get_fullscreen();
if state {
- if let Some(id) = self.browser_id {
+ if let Some(id) = self.focused_webview_id {
let event = EmbedderEvent::ExitFullScreen(id);
self.event_queue.push(event);
}
@@ -198,7 +205,7 @@ where
#[cfg(not(target_os = "win"))]
fn platform_handle_key(&mut self, key_event: KeyboardEvent) {
- if let Some(id) = self.browser_id {
+ if let Some(id) = self.focused_webview_id {
if let Some(event) = ShortcutMatcher::from_event(key_event.clone())
.shortcut(CMD_OR_CONTROL, '[', || {
EmbedderEvent::Navigation(id, TraversalDirection::Back(1))
@@ -217,7 +224,7 @@ where
fn platform_handle_key(&mut self, _key_event: KeyboardEvent) {}
/// Handle key events after they have been handled by Servo.
- fn handle_key_from_servo(&mut self, _: Option<BrowserId>, event: KeyboardEvent) {
+ fn handle_key_from_servo(&mut self, _: Option<WebViewId>, event: KeyboardEvent) {
ShortcutMatcher::from_event(event)
.shortcut(CMD_OR_CONTROL, '=', || {
self.event_queue.push(EmbedderEvent::Zoom(1.1))
@@ -285,14 +292,14 @@ where
/// Returns true if the caller needs to manually present a new frame.
pub fn handle_servo_events(
&mut self,
- events: Vec<(Option<BrowserId>, EmbedderMsg)>,
+ events: Vec<(Option<WebViewId>, EmbedderMsg)>,
) -> ServoEventResponse {
let mut need_present = false;
let mut history_changed = false;
- for (browser_id, msg) in events {
+ for (webview_id, msg) in events {
trace!(
"embedder <- servo EmbedderMsg ({:?}, {:?})",
- browser_id.map(|x| format!("{}", x)),
+ webview_id.map(|x| format!("{}", x)),
msg
);
match msg {
@@ -395,7 +402,7 @@ where
if let Err(e) = res {
let reason = format!("Failed to send Prompt response: {}", e);
self.event_queue
- .push(EmbedderEvent::SendError(browser_id, reason));
+ .push(EmbedderEvent::SendError(webview_id, reason));
}
},
EmbedderMsg::AllowUnload(sender) => {
@@ -403,35 +410,47 @@ where
if let Err(e) = sender.send(true) {
let reason = format!("Failed to send AllowUnload response: {}", e);
self.event_queue
- .push(EmbedderEvent::SendError(browser_id, reason));
+ .push(EmbedderEvent::SendError(webview_id, reason));
}
},
EmbedderMsg::AllowNavigationRequest(pipeline_id, _url) => {
- if let Some(_browser_id) = browser_id {
+ if let Some(_webview_id) = webview_id {
self.event_queue
.push(EmbedderEvent::AllowNavigationResponse(pipeline_id, true));
}
},
- EmbedderMsg::AllowOpeningBrowser(response_chan) => {
+ EmbedderMsg::AllowOpeningWebView(response_chan) => {
// Note: would be a place to handle pop-ups config.
// see Step 7 of #the-rules-for-choosing-a-browsing-context-given-a-browsing-context-name
if let Err(e) = response_chan.send(true) {
- warn!("Failed to send AllowOpeningBrowser response: {}", e);
+ warn!("Failed to send AllowOpeningWebView response: {}", e);
};
},
- EmbedderMsg::BrowserCreated(new_browser_id) => {
- // TODO: properly handle a new "tab"
- self.browsers.push(new_browser_id);
- if self.browser_id.is_none() {
- self.browser_id = Some(new_browser_id);
+ EmbedderMsg::WebViewOpened(new_webview_id) => {
+ self.webviews.insert(new_webview_id, WebView {});
+ self.creation_order.push(new_webview_id);
+ self.event_queue
+ .push(EmbedderEvent::FocusWebView(new_webview_id));
+ },
+ EmbedderMsg::WebViewClosed(webview_id) => {
+ self.webviews.retain(|&id, _| id != webview_id);
+ self.creation_order.retain(|&id| id != webview_id);
+ self.focused_webview_id = None;
+ if let Some(&newest_webview_id) = self.creation_order.last() {
+ self.event_queue
+ .push(EmbedderEvent::FocusWebView(newest_webview_id));
} else {
- error!("Multiple top level browsing contexts not supported yet.");
+ self.event_queue.push(EmbedderEvent::Quit);
}
- self.event_queue
- .push(EmbedderEvent::SelectBrowser(new_browser_id));
+ },
+ EmbedderMsg::WebViewFocused(webview_id) => {
+ self.focused_webview_id = Some(webview_id);
+ },
+ EmbedderMsg::WebViewBlurred => {
+ self.focused_webview_id = None;
},
EmbedderMsg::Keyboard(key_event) => {
- self.handle_key_from_servo(browser_id, key_event);
+ self.handle_key_from_servo(webview_id, key_event);
},
EmbedderMsg::GetClipboardContents(sender) => {
let contents = self
@@ -476,17 +495,6 @@ where
EmbedderMsg::LoadComplete => {
// FIXME: surface the loading state in the UI somehow
},
- EmbedderMsg::CloseBrowser => {
- // TODO: close the appropriate "tab".
- let _ = self.browsers.pop();
- if let Some(prev_browser_id) = self.browsers.last() {
- self.browser_id = Some(*prev_browser_id);
- self.event_queue
- .push(EmbedderEvent::SelectBrowser(*prev_browser_id));
- } else {
- self.event_queue.push(EmbedderEvent::Quit);
- }
- },
EmbedderMsg::Shutdown => {
self.shutdown_requested = true;
},
@@ -545,10 +553,10 @@ where
EmbedderMsg::ReadyToPresent => {
need_present = true;
},
- EmbedderMsg::EventDelivered(event) => match (browser_id, event) {
- (Some(browser_id), CompositorEventVariant::MouseButtonEvent) => {
- // TODO Focus browser and/or raise to top if needed.
- trace!("{}: Got a mouse button event", browser_id);
+ EmbedderMsg::EventDelivered(event) => match (webview_id, event) {
+ (Some(webview_id), CompositorEventVariant::MouseButtonEvent) => {
+ // TODO Focus webview and/or raise to top if needed.
+ trace!("{}: Got a mouse button event", webview_id);
},
(_, _) => {},
},