mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
move msg to embedder_traits, use in script, handle send error in embedder
This commit is contained in:
parent
a297e8f288
commit
d438240772
31 changed files with 362 additions and 337 deletions
|
@ -14,6 +14,7 @@ path = "lib.rs"
|
|||
default = []
|
||||
|
||||
[dependencies]
|
||||
embedder_traits = {path = "../embedder_traits"}
|
||||
euclid = "0.17"
|
||||
gfx_traits = {path = "../gfx_traits"}
|
||||
gleam = {version = "0.5", optional = true}
|
||||
|
@ -36,3 +37,6 @@ webrender_api = {git = "https://github.com/servo/webrender", features = ["ipc"]}
|
|||
|
||||
[build-dependencies]
|
||||
toml = "0.4.5"
|
||||
|
||||
[dev-dependencies]
|
||||
embedder_traits = { path = "../embedder_traits", features = ["tests"]}
|
||||
|
|
|
@ -6,68 +6,21 @@
|
|||
|
||||
use SendableFrameTree;
|
||||
use compositor::CompositingReason;
|
||||
use embedder_traits::EventLoopWaker;
|
||||
use gfx_traits::Epoch;
|
||||
use ipc_channel::ipc::IpcSender;
|
||||
use msg::constellation_msg::{InputMethodType, Key, KeyModifiers, KeyState, PipelineId, TopLevelBrowsingContextId};
|
||||
use net_traits::filemanager_thread::FilterPattern;
|
||||
use msg::constellation_msg::{PipelineId, TopLevelBrowsingContextId};
|
||||
use net_traits::image::base::Image;
|
||||
use profile_traits::mem;
|
||||
use profile_traits::time;
|
||||
use script_traits::{AnimationState, ConstellationMsg, EventResult, LoadData};
|
||||
use servo_url::ServoUrl;
|
||||
use script_traits::{AnimationState, ConstellationMsg, EventResult};
|
||||
use std::fmt::{Debug, Error, Formatter};
|
||||
use std::sync::mpsc::{Receiver, Sender};
|
||||
use style_traits::cursor::CursorKind;
|
||||
use style_traits::viewport::ViewportConstraints;
|
||||
use webrender;
|
||||
use webrender_api::{self, DeviceIntPoint, DeviceUintSize};
|
||||
|
||||
|
||||
/// Used to wake up the event loop, provided by the servo port/embedder.
|
||||
pub trait EventLoopWaker : 'static + Send {
|
||||
fn clone(&self) -> Box<EventLoopWaker + Send>;
|
||||
fn wake(&self);
|
||||
}
|
||||
|
||||
/// Sends messages to the embedder.
|
||||
pub struct EmbedderProxy {
|
||||
pub sender: Sender<EmbedderMsg>,
|
||||
pub event_loop_waker: Box<EventLoopWaker>,
|
||||
}
|
||||
|
||||
impl EmbedderProxy {
|
||||
pub fn send(&self, msg: EmbedderMsg) {
|
||||
// Send a message and kick the OS event loop awake.
|
||||
if let Err(err) = self.sender.send(msg) {
|
||||
warn!("Failed to send response ({}).", err);
|
||||
}
|
||||
self.event_loop_waker.wake();
|
||||
}
|
||||
}
|
||||
|
||||
impl Clone for EmbedderProxy {
|
||||
fn clone(&self) -> EmbedderProxy {
|
||||
EmbedderProxy {
|
||||
sender: self.sender.clone(),
|
||||
event_loop_waker: self.event_loop_waker.clone(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// The port that the embedder receives messages on.
|
||||
pub struct EmbedderReceiver {
|
||||
pub receiver: Receiver<EmbedderMsg>
|
||||
}
|
||||
|
||||
impl EmbedderReceiver {
|
||||
pub fn try_recv_embedder_msg(&mut self) -> Option<EmbedderMsg> {
|
||||
self.receiver.try_recv().ok()
|
||||
}
|
||||
pub fn recv_embedder_msg(&mut self) -> EmbedderMsg {
|
||||
self.receiver.recv().unwrap()
|
||||
}
|
||||
}
|
||||
|
||||
/// Sends messages to the compositor.
|
||||
pub struct CompositorProxy {
|
||||
pub sender: Sender<Msg>,
|
||||
|
@ -113,47 +66,6 @@ impl CompositorProxy {
|
|||
}
|
||||
}
|
||||
|
||||
pub enum EmbedderMsg {
|
||||
/// A status message to be displayed by the browser chrome.
|
||||
Status(TopLevelBrowsingContextId, Option<String>),
|
||||
/// Alerts the embedder that the current page has changed its title.
|
||||
ChangePageTitle(TopLevelBrowsingContextId, Option<String>),
|
||||
/// Move the window to a point
|
||||
MoveTo(TopLevelBrowsingContextId, DeviceIntPoint),
|
||||
/// Resize the window to size
|
||||
ResizeTo(TopLevelBrowsingContextId, DeviceUintSize),
|
||||
/// Wether or not to follow a link
|
||||
AllowNavigation(TopLevelBrowsingContextId, ServoUrl, IpcSender<bool>),
|
||||
/// Sends an unconsumed key event back to the embedder.
|
||||
KeyEvent(Option<TopLevelBrowsingContextId>, Option<char>, Key, KeyState, KeyModifiers),
|
||||
/// Changes the cursor.
|
||||
SetCursor(CursorKind),
|
||||
/// A favicon was detected
|
||||
NewFavicon(TopLevelBrowsingContextId, ServoUrl),
|
||||
/// <head> tag finished parsing
|
||||
HeadParsed(TopLevelBrowsingContextId),
|
||||
/// The history state has changed.
|
||||
HistoryChanged(TopLevelBrowsingContextId, Vec<LoadData>, usize),
|
||||
/// Enter or exit fullscreen
|
||||
SetFullscreenState(TopLevelBrowsingContextId, bool),
|
||||
/// The load of a page has begun
|
||||
LoadStart(TopLevelBrowsingContextId),
|
||||
/// The load of a page has completed
|
||||
LoadComplete(TopLevelBrowsingContextId),
|
||||
/// A pipeline panicked. First string is the reason, second one is the backtrace.
|
||||
Panic(TopLevelBrowsingContextId, String, Option<String>),
|
||||
/// Open dialog to select bluetooth device.
|
||||
GetSelectedBluetoothDevice(Vec<String>, IpcSender<Option<String>>),
|
||||
/// Open file dialog to select files. Set boolean flag to true allows to select multiple files.
|
||||
SelectFiles(Vec<FilterPattern>, bool, IpcSender<Option<Vec<String>>>),
|
||||
/// Request to present an IME to the user when an editable element is focused.
|
||||
ShowIME(TopLevelBrowsingContextId, InputMethodType),
|
||||
/// Request to hide the IME when the editable element is blurred.
|
||||
HideIME(TopLevelBrowsingContextId),
|
||||
/// Servo has shut down
|
||||
Shutdown,
|
||||
}
|
||||
|
||||
/// Messages from the painting thread and the constellation thread to the compositor thread.
|
||||
pub enum Msg {
|
||||
/// Requests that the compositor shut down.
|
||||
|
@ -233,32 +145,6 @@ impl Debug for Msg {
|
|||
}
|
||||
}
|
||||
|
||||
impl Debug for EmbedderMsg {
|
||||
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
|
||||
match *self {
|
||||
EmbedderMsg::Status(..) => write!(f, "Status"),
|
||||
EmbedderMsg::ChangePageTitle(..) => write!(f, "ChangePageTitle"),
|
||||
EmbedderMsg::MoveTo(..) => write!(f, "MoveTo"),
|
||||
EmbedderMsg::ResizeTo(..) => write!(f, "ResizeTo"),
|
||||
EmbedderMsg::AllowNavigation(..) => write!(f, "AllowNavigation"),
|
||||
EmbedderMsg::KeyEvent(..) => write!(f, "KeyEvent"),
|
||||
EmbedderMsg::SetCursor(..) => write!(f, "SetCursor"),
|
||||
EmbedderMsg::NewFavicon(..) => write!(f, "NewFavicon"),
|
||||
EmbedderMsg::HeadParsed(..) => write!(f, "HeadParsed"),
|
||||
EmbedderMsg::HistoryChanged(..) => write!(f, "HistoryChanged"),
|
||||
EmbedderMsg::SetFullscreenState(..) => write!(f, "SetFullscreenState"),
|
||||
EmbedderMsg::LoadStart(..) => write!(f, "LoadStart"),
|
||||
EmbedderMsg::LoadComplete(..) => write!(f, "LoadComplete"),
|
||||
EmbedderMsg::Panic(..) => write!(f, "Panic"),
|
||||
EmbedderMsg::GetSelectedBluetoothDevice(..) => write!(f, "GetSelectedBluetoothDevice"),
|
||||
EmbedderMsg::SelectFiles(..) => write!(f, "SelectFiles"),
|
||||
EmbedderMsg::ShowIME(..) => write!(f, "ShowIME"),
|
||||
EmbedderMsg::HideIME(..) => write!(f, "HideIME"),
|
||||
EmbedderMsg::Shutdown => write!(f, "Shutdown"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Data used to construct a compositor.
|
||||
pub struct InitialCompositorState {
|
||||
/// A channel to the compositor.
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
#![deny(unsafe_code)]
|
||||
|
||||
extern crate embedder_traits;
|
||||
extern crate euclid;
|
||||
extern crate gfx_traits;
|
||||
#[cfg(feature = "gleam")]
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
//! Abstract windowing methods. The concrete implementations of these can be found in `platform/`.
|
||||
|
||||
use compositor_thread::EventLoopWaker;
|
||||
use embedder_traits::EventLoopWaker;
|
||||
use euclid::TypedScale;
|
||||
#[cfg(feature = "gleam")]
|
||||
use gleam::gl;
|
||||
|
@ -78,6 +78,8 @@ pub enum WindowEvent {
|
|||
NewBrowser(ServoUrl, IpcSender<TopLevelBrowsingContextId>),
|
||||
/// Close a top level browsing context
|
||||
CloseBrowser(TopLevelBrowsingContextId),
|
||||
/// Panic a top level browsing context.
|
||||
SendError(Option<TopLevelBrowsingContextId>, String),
|
||||
/// Make a top level browsing context visible, hiding the previous
|
||||
/// visible one.
|
||||
SelectBrowser(TopLevelBrowsingContextId),
|
||||
|
@ -106,6 +108,7 @@ impl Debug for WindowEvent {
|
|||
WindowEvent::Quit => write!(f, "Quit"),
|
||||
WindowEvent::Reload(..) => write!(f, "Reload"),
|
||||
WindowEvent::NewBrowser(..) => write!(f, "NewBrowser"),
|
||||
WindowEvent::SendError(..) => write!(f, "SendError"),
|
||||
WindowEvent::CloseBrowser(..) => write!(f, "CloseBrowser"),
|
||||
WindowEvent::SelectBrowser(..) => write!(f, "SelectBrowser"),
|
||||
WindowEvent::ToggleWebRenderDebug(..) => write!(f, "ToggleWebRenderDebug"),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue