mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
move top_level_browsing_context_id out of embedder msg
This commit is contained in:
parent
d438240772
commit
4234b1252a
11 changed files with 78 additions and 97 deletions
|
@ -382,7 +382,7 @@ impl BluetoothManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
let (ipc_sender, ipc_receiver) = ipc::channel().expect("Failed to create IPC channel!");
|
let (ipc_sender, ipc_receiver) = ipc::channel().expect("Failed to create IPC channel!");
|
||||||
let msg = EmbedderMsg::GetSelectedBluetoothDevice(dialog_rows, ipc_sender);
|
let msg = (None, EmbedderMsg::GetSelectedBluetoothDevice(dialog_rows, ipc_sender));
|
||||||
self.embedder_proxy.send(msg);
|
self.embedder_proxy.send(msg);
|
||||||
|
|
||||||
match ipc_receiver.recv() {
|
match ipc_receiver.recv() {
|
||||||
|
|
|
@ -1026,7 +1026,7 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
|
||||||
|
|
||||||
match content {
|
match content {
|
||||||
FromScriptMsg::ForwardToEmbedder(embedder_msg) => {
|
FromScriptMsg::ForwardToEmbedder(embedder_msg) => {
|
||||||
self.embedder_proxy.send(embedder_msg);
|
self.embedder_proxy.send((Some(source_top_ctx_id), embedder_msg));
|
||||||
}
|
}
|
||||||
FromScriptMsg::PipelineExited => {
|
FromScriptMsg::PipelineExited => {
|
||||||
self.handle_pipeline_exited(source_pipeline_id);
|
self.handle_pipeline_exited(source_pipeline_id);
|
||||||
|
@ -1381,7 +1381,7 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
|
||||||
|
|
||||||
let browsing_context_id = BrowsingContextId::from(top_level_browsing_context_id);
|
let browsing_context_id = BrowsingContextId::from(top_level_browsing_context_id);
|
||||||
|
|
||||||
self.embedder_proxy.send(EmbedderMsg::Panic(top_level_browsing_context_id, reason, backtrace));
|
self.embedder_proxy.send((Some(top_level_browsing_context_id), EmbedderMsg::Panic(reason, backtrace)));
|
||||||
|
|
||||||
let (window_size, pipeline_id) = {
|
let (window_size, pipeline_id) = {
|
||||||
let browsing_context = self.browsing_contexts.get(&browsing_context_id);
|
let browsing_context = self.browsing_contexts.get(&browsing_context_id);
|
||||||
|
@ -1663,7 +1663,7 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_set_cursor_msg(&mut self, cursor: CursorKind) {
|
fn handle_set_cursor_msg(&mut self, cursor: CursorKind) {
|
||||||
self.embedder_proxy.send(EmbedderMsg::SetCursor(cursor))
|
self.embedder_proxy.send((None, EmbedderMsg::SetCursor(cursor)))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_change_running_animations_state(&mut self,
|
fn handle_change_running_animations_state(&mut self,
|
||||||
|
@ -1704,7 +1704,7 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
|
||||||
load_data: LoadData, replace: bool) -> Option<PipelineId> {
|
load_data: LoadData, replace: bool) -> Option<PipelineId> {
|
||||||
// Allow the embedder to handle the url itself
|
// Allow the embedder to handle the url itself
|
||||||
let (chan, port) = ipc::channel().expect("Failed to create IPC channel!");
|
let (chan, port) = ipc::channel().expect("Failed to create IPC channel!");
|
||||||
let msg = EmbedderMsg::AllowNavigation(top_level_browsing_context_id, load_data.url.clone(), chan);
|
let msg = (Some(top_level_browsing_context_id), EmbedderMsg::AllowNavigation(load_data.url.clone(), chan));
|
||||||
self.embedder_proxy.send(msg);
|
self.embedder_proxy.send(msg);
|
||||||
if let Ok(false) = port.recv() {
|
if let Ok(false) = port.recv() {
|
||||||
return None;
|
return None;
|
||||||
|
@ -1812,7 +1812,7 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
|
||||||
pipeline_id: PipelineId) {
|
pipeline_id: PipelineId) {
|
||||||
if self.pipelines.get(&pipeline_id).and_then(|p| p.parent_info).is_none() {
|
if self.pipelines.get(&pipeline_id).and_then(|p| p.parent_info).is_none() {
|
||||||
// Notify embedder top level document started loading.
|
// Notify embedder top level document started loading.
|
||||||
self.embedder_proxy.send(EmbedderMsg::LoadStart(top_level_browsing_context_id));
|
self.embedder_proxy.send((Some(top_level_browsing_context_id), EmbedderMsg::LoadStart));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1846,7 +1846,7 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
|
||||||
if !current_top_level_pipeline_will_be_replaced {
|
if !current_top_level_pipeline_will_be_replaced {
|
||||||
// Notify embedder and compositor top level document finished loading.
|
// Notify embedder and compositor top level document finished loading.
|
||||||
self.compositor_proxy.send(ToCompositorMsg::LoadComplete(top_level_browsing_context_id));
|
self.compositor_proxy.send(ToCompositorMsg::LoadComplete(top_level_browsing_context_id));
|
||||||
self.embedder_proxy.send(EmbedderMsg::LoadComplete(top_level_browsing_context_id));
|
self.embedder_proxy.send((Some(top_level_browsing_context_id), EmbedderMsg::LoadComplete));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.handle_subframe_loaded(pipeline_id);
|
self.handle_subframe_loaded(pipeline_id);
|
||||||
|
@ -2099,7 +2099,7 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
None => {
|
None => {
|
||||||
let event = EmbedderMsg::KeyEvent(None, ch, key, state, mods);
|
let event = (None, EmbedderMsg::KeyEvent(ch, key, state, mods));
|
||||||
self.embedder_proxy.clone().send(event);
|
self.embedder_proxy.clone().send(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2272,7 +2272,7 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
|
||||||
},
|
},
|
||||||
WebDriverCommandMsg::SetWindowSize(top_level_browsing_context_id, size, reply) => {
|
WebDriverCommandMsg::SetWindowSize(top_level_browsing_context_id, size, reply) => {
|
||||||
self.webdriver.resize_channel = Some(reply);
|
self.webdriver.resize_channel = Some(reply);
|
||||||
self.embedder_proxy.send(EmbedderMsg::ResizeTo(top_level_browsing_context_id, size));
|
self.embedder_proxy.send((Some(top_level_browsing_context_id), EmbedderMsg::ResizeTo(size)));
|
||||||
},
|
},
|
||||||
WebDriverCommandMsg::LoadUrl(top_level_browsing_context_id, load_data, reply) => {
|
WebDriverCommandMsg::LoadUrl(top_level_browsing_context_id, load_data, reply) => {
|
||||||
self.load_url_for_webdriver(top_level_browsing_context_id, load_data, reply, false);
|
self.load_url_for_webdriver(top_level_browsing_context_id, load_data, reply, false);
|
||||||
|
@ -2403,7 +2403,7 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
|
||||||
entries.extend(session_history.future.iter().rev()
|
entries.extend(session_history.future.iter().rev()
|
||||||
.scan(current_load_data.clone(), &resolve_load_data_future));
|
.scan(current_load_data.clone(), &resolve_load_data_future));
|
||||||
let urls = entries.iter().map(|entry| entry.url.clone()).collect();
|
let urls = entries.iter().map(|entry| entry.url.clone()).collect();
|
||||||
let msg = EmbedderMsg::HistoryChanged(top_level_browsing_context_id, urls, current_index);
|
let msg = (Some(top_level_browsing_context_id), EmbedderMsg::HistoryChanged(urls, current_index));
|
||||||
self.embedder_proxy.send(msg);
|
self.embedder_proxy.send(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,12 +33,12 @@ pub trait EventLoopWaker : 'static + Send {
|
||||||
|
|
||||||
/// Sends messages to the embedder.
|
/// Sends messages to the embedder.
|
||||||
pub struct EmbedderProxy {
|
pub struct EmbedderProxy {
|
||||||
pub sender: Sender<EmbedderMsg>,
|
pub sender: Sender<(Option<TopLevelBrowsingContextId>, EmbedderMsg)>,
|
||||||
pub event_loop_waker: Box<EventLoopWaker>,
|
pub event_loop_waker: Box<EventLoopWaker>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EmbedderProxy {
|
impl EmbedderProxy {
|
||||||
pub fn send(&self, msg: EmbedderMsg) {
|
pub fn send(&self, msg: (Option<TopLevelBrowsingContextId>, EmbedderMsg)) {
|
||||||
// Send a message and kick the OS event loop awake.
|
// Send a message and kick the OS event loop awake.
|
||||||
if let Err(err) = self.sender.send(msg) {
|
if let Err(err) = self.sender.send(msg) {
|
||||||
warn!("Failed to send response ({}).", err);
|
warn!("Failed to send response ({}).", err);
|
||||||
|
@ -58,14 +58,14 @@ impl Clone for EmbedderProxy {
|
||||||
|
|
||||||
/// The port that the embedder receives messages on.
|
/// The port that the embedder receives messages on.
|
||||||
pub struct EmbedderReceiver {
|
pub struct EmbedderReceiver {
|
||||||
pub receiver: Receiver<EmbedderMsg>
|
pub receiver: Receiver<(Option<TopLevelBrowsingContextId>, EmbedderMsg)>
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EmbedderReceiver {
|
impl EmbedderReceiver {
|
||||||
pub fn try_recv_embedder_msg(&mut self) -> Option<EmbedderMsg> {
|
pub fn try_recv_embedder_msg(&mut self) -> Option<(Option<TopLevelBrowsingContextId>, EmbedderMsg)> {
|
||||||
self.receiver.try_recv().ok()
|
self.receiver.try_recv().ok()
|
||||||
}
|
}
|
||||||
pub fn recv_embedder_msg(&mut self) -> EmbedderMsg {
|
pub fn recv_embedder_msg(&mut self) -> (Option<TopLevelBrowsingContextId>, EmbedderMsg) {
|
||||||
self.receiver.recv().unwrap()
|
self.receiver.recv().unwrap()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,43 +73,43 @@ impl EmbedderReceiver {
|
||||||
#[derive(Deserialize, Serialize)]
|
#[derive(Deserialize, Serialize)]
|
||||||
pub enum EmbedderMsg {
|
pub enum EmbedderMsg {
|
||||||
/// A status message to be displayed by the browser chrome.
|
/// A status message to be displayed by the browser chrome.
|
||||||
Status(TopLevelBrowsingContextId, Option<String>),
|
Status(Option<String>),
|
||||||
/// Alerts the embedder that the current page has changed its title.
|
/// Alerts the embedder that the current page has changed its title.
|
||||||
ChangePageTitle(TopLevelBrowsingContextId, Option<String>),
|
ChangePageTitle(Option<String>),
|
||||||
/// Move the window to a point
|
/// Move the window to a point
|
||||||
MoveTo(TopLevelBrowsingContextId, DeviceIntPoint),
|
MoveTo(DeviceIntPoint),
|
||||||
/// Resize the window to size
|
/// Resize the window to size
|
||||||
ResizeTo(TopLevelBrowsingContextId, DeviceUintSize),
|
ResizeTo(DeviceUintSize),
|
||||||
// Show an alert message.
|
// Show an alert message.
|
||||||
Alert(TopLevelBrowsingContextId, String, IpcSender<()>),
|
Alert(String, IpcSender<()>),
|
||||||
/// Wether or not to follow a link
|
/// Wether or not to follow a link
|
||||||
AllowNavigation(TopLevelBrowsingContextId, ServoUrl, IpcSender<bool>),
|
AllowNavigation(ServoUrl, IpcSender<bool>),
|
||||||
/// Sends an unconsumed key event back to the embedder.
|
/// Sends an unconsumed key event back to the embedder.
|
||||||
KeyEvent(Option<TopLevelBrowsingContextId>, Option<char>, Key, KeyState, KeyModifiers),
|
KeyEvent(Option<char>, Key, KeyState, KeyModifiers),
|
||||||
/// Changes the cursor.
|
/// Changes the cursor.
|
||||||
SetCursor(CursorKind),
|
SetCursor(CursorKind),
|
||||||
/// A favicon was detected
|
/// A favicon was detected
|
||||||
NewFavicon(TopLevelBrowsingContextId, ServoUrl),
|
NewFavicon(ServoUrl),
|
||||||
/// <head> tag finished parsing
|
/// <head> tag finished parsing
|
||||||
HeadParsed(TopLevelBrowsingContextId),
|
HeadParsed,
|
||||||
/// The history state has changed.
|
/// The history state has changed.
|
||||||
HistoryChanged(TopLevelBrowsingContextId, Vec<ServoUrl>, usize),
|
HistoryChanged(Vec<ServoUrl>, usize),
|
||||||
/// Enter or exit fullscreen
|
/// Enter or exit fullscreen
|
||||||
SetFullscreenState(TopLevelBrowsingContextId, bool),
|
SetFullscreenState(bool),
|
||||||
/// The load of a page has begun
|
/// The load of a page has begun
|
||||||
LoadStart(TopLevelBrowsingContextId),
|
LoadStart,
|
||||||
/// The load of a page has completed
|
/// The load of a page has completed
|
||||||
LoadComplete(TopLevelBrowsingContextId),
|
LoadComplete,
|
||||||
/// A pipeline panicked. First string is the reason, second one is the backtrace.
|
/// A pipeline panicked. First string is the reason, second one is the backtrace.
|
||||||
Panic(TopLevelBrowsingContextId, String, Option<String>),
|
Panic(String, Option<String>),
|
||||||
/// Open dialog to select bluetooth device.
|
/// Open dialog to select bluetooth device.
|
||||||
GetSelectedBluetoothDevice(Vec<String>, IpcSender<Option<String>>),
|
GetSelectedBluetoothDevice(Vec<String>, IpcSender<Option<String>>),
|
||||||
/// Open file dialog to select files. Set boolean flag to true allows to select multiple files.
|
/// Open file dialog to select files. Set boolean flag to true allows to select multiple files.
|
||||||
SelectFiles(Vec<FilterPattern>, bool, IpcSender<Option<Vec<String>>>),
|
SelectFiles(Vec<FilterPattern>, bool, IpcSender<Option<Vec<String>>>),
|
||||||
/// Request to present an IME to the user when an editable element is focused.
|
/// Request to present an IME to the user when an editable element is focused.
|
||||||
ShowIME(TopLevelBrowsingContextId, InputMethodType),
|
ShowIME(InputMethodType),
|
||||||
/// Request to hide the IME when the editable element is blurred.
|
/// Request to hide the IME when the editable element is blurred.
|
||||||
HideIME(TopLevelBrowsingContextId),
|
HideIME,
|
||||||
/// Servo has shut down
|
/// Servo has shut down
|
||||||
Shutdown,
|
Shutdown,
|
||||||
}
|
}
|
||||||
|
@ -126,16 +126,16 @@ impl Debug for EmbedderMsg {
|
||||||
EmbedderMsg::KeyEvent(..) => write!(f, "KeyEvent"),
|
EmbedderMsg::KeyEvent(..) => write!(f, "KeyEvent"),
|
||||||
EmbedderMsg::SetCursor(..) => write!(f, "SetCursor"),
|
EmbedderMsg::SetCursor(..) => write!(f, "SetCursor"),
|
||||||
EmbedderMsg::NewFavicon(..) => write!(f, "NewFavicon"),
|
EmbedderMsg::NewFavicon(..) => write!(f, "NewFavicon"),
|
||||||
EmbedderMsg::HeadParsed(..) => write!(f, "HeadParsed"),
|
EmbedderMsg::HeadParsed => write!(f, "HeadParsed"),
|
||||||
EmbedderMsg::HistoryChanged(..) => write!(f, "HistoryChanged"),
|
EmbedderMsg::HistoryChanged(..) => write!(f, "HistoryChanged"),
|
||||||
EmbedderMsg::SetFullscreenState(..) => write!(f, "SetFullscreenState"),
|
EmbedderMsg::SetFullscreenState(..) => write!(f, "SetFullscreenState"),
|
||||||
EmbedderMsg::LoadStart(..) => write!(f, "LoadStart"),
|
EmbedderMsg::LoadStart => write!(f, "LoadStart"),
|
||||||
EmbedderMsg::LoadComplete(..) => write!(f, "LoadComplete"),
|
EmbedderMsg::LoadComplete => write!(f, "LoadComplete"),
|
||||||
EmbedderMsg::Panic(..) => write!(f, "Panic"),
|
EmbedderMsg::Panic(..) => write!(f, "Panic"),
|
||||||
EmbedderMsg::GetSelectedBluetoothDevice(..) => write!(f, "GetSelectedBluetoothDevice"),
|
EmbedderMsg::GetSelectedBluetoothDevice(..) => write!(f, "GetSelectedBluetoothDevice"),
|
||||||
EmbedderMsg::SelectFiles(..) => write!(f, "SelectFiles"),
|
EmbedderMsg::SelectFiles(..) => write!(f, "SelectFiles"),
|
||||||
EmbedderMsg::ShowIME(..) => write!(f, "ShowIME"),
|
EmbedderMsg::ShowIME(..) => write!(f, "ShowIME"),
|
||||||
EmbedderMsg::HideIME(..) => write!(f, "HideIME"),
|
EmbedderMsg::HideIME => write!(f, "HideIME"),
|
||||||
EmbedderMsg::Shutdown => write!(f, "Shutdown"),
|
EmbedderMsg::Shutdown => write!(f, "Shutdown"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -220,7 +220,7 @@ impl FileManagerStore {
|
||||||
multiple_files: bool,
|
multiple_files: bool,
|
||||||
embedder_proxy: EmbedderProxy) -> Option<Vec<String>> {
|
embedder_proxy: EmbedderProxy) -> Option<Vec<String>> {
|
||||||
let (ipc_sender, ipc_receiver) = ipc::channel().expect("Failed to create IPC channel!");
|
let (ipc_sender, ipc_receiver) = ipc::channel().expect("Failed to create IPC channel!");
|
||||||
let msg = EmbedderMsg::SelectFiles(patterns, multiple_files, ipc_sender);
|
let msg = (None, EmbedderMsg::SelectFiles(patterns, multiple_files, ipc_sender));
|
||||||
|
|
||||||
embedder_proxy.send(msg);
|
embedder_proxy.send(msg);
|
||||||
match ipc_receiver.recv() {
|
match ipc_receiver.recv() {
|
||||||
|
|
|
@ -856,8 +856,7 @@ impl Document {
|
||||||
|
|
||||||
// Notify the embedder to hide the input method.
|
// Notify the embedder to hide the input method.
|
||||||
if elem.input_method_type().is_some() {
|
if elem.input_method_type().is_some() {
|
||||||
let top_level_browsing_context_id = self.window().top_level_browsing_context_id();
|
self.send_to_embedder(EmbedderMsg::HideIME);
|
||||||
self.send_to_embedder(EmbedderMsg::HideIME(top_level_browsing_context_id));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -876,8 +875,7 @@ impl Document {
|
||||||
|
|
||||||
// Notify the embedder to display an input method.
|
// Notify the embedder to display an input method.
|
||||||
if let Some(kind) = elem.input_method_type() {
|
if let Some(kind) = elem.input_method_type() {
|
||||||
let top_level_browsing_context_id = self.window().top_level_browsing_context_id();
|
self.send_to_embedder(EmbedderMsg::ShowIME(kind));
|
||||||
self.send_to_embedder(EmbedderMsg::ShowIME(top_level_browsing_context_id, kind));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -894,8 +892,7 @@ impl Document {
|
||||||
let window = self.window();
|
let window = self.window();
|
||||||
if window.is_top_level() {
|
if window.is_top_level() {
|
||||||
let title = Some(String::from(self.Title()));
|
let title = Some(String::from(self.Title()));
|
||||||
let top_level_browsing_context_id = window.top_level_browsing_context_id();
|
self.send_to_embedder(EmbedderMsg::ChangePageTitle(title));
|
||||||
self.send_to_embedder(EmbedderMsg::ChangePageTitle(top_level_browsing_context_id, title));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1364,8 +1361,7 @@ impl Document {
|
||||||
}
|
}
|
||||||
|
|
||||||
if cancel_state == EventDefault::Allowed {
|
if cancel_state == EventDefault::Allowed {
|
||||||
let top_level_browsing_context_id = self.window().top_level_browsing_context_id();
|
let msg = EmbedderMsg::KeyEvent(ch, key, state, modifiers);
|
||||||
let msg = EmbedderMsg::KeyEvent(Some(top_level_browsing_context_id), ch, key, state, modifiers);
|
|
||||||
self.send_to_embedder(msg);
|
self.send_to_embedder(msg);
|
||||||
|
|
||||||
// This behavior is unspecced
|
// This behavior is unspecced
|
||||||
|
@ -2795,8 +2791,7 @@ impl Document {
|
||||||
let window = self.window();
|
let window = self.window();
|
||||||
// Step 6
|
// Step 6
|
||||||
if !error {
|
if !error {
|
||||||
let top_level_browsing_context_id = self.window().top_level_browsing_context_id();
|
let event = EmbedderMsg::SetFullscreenState(true);
|
||||||
let event = EmbedderMsg::SetFullscreenState(top_level_browsing_context_id, true);
|
|
||||||
self.send_to_embedder(event);
|
self.send_to_embedder(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2831,8 +2826,7 @@ impl Document {
|
||||||
|
|
||||||
let window = self.window();
|
let window = self.window();
|
||||||
// Step 8
|
// Step 8
|
||||||
let top_level_browsing_context_id = self.window().top_level_browsing_context_id();
|
let event = EmbedderMsg::SetFullscreenState(true);
|
||||||
let event = EmbedderMsg::SetFullscreenState(top_level_browsing_context_id, true);
|
|
||||||
self.send_to_embedder(event);
|
self.send_to_embedder(event);
|
||||||
|
|
||||||
// Step 9
|
// Step 9
|
||||||
|
|
|
@ -151,8 +151,7 @@ impl VirtualMethods for HTMLBodyElement {
|
||||||
let document = window.Document();
|
let document = window.Document();
|
||||||
document.set_reflow_timeout(time::precise_time_ns() + INITIAL_REFLOW_DELAY);
|
document.set_reflow_timeout(time::precise_time_ns() + INITIAL_REFLOW_DELAY);
|
||||||
if window.is_top_level() {
|
if window.is_top_level() {
|
||||||
let top_level_browsing_context_id = window.top_level_browsing_context_id();
|
let msg = EmbedderMsg::HeadParsed;
|
||||||
let msg = EmbedderMsg::HeadParsed(top_level_browsing_context_id);
|
|
||||||
window.send_to_embedder(msg);
|
window.send_to_embedder(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -307,8 +307,7 @@ impl HTMLLinkElement {
|
||||||
Ok(url) => {
|
Ok(url) => {
|
||||||
let window = document.window();
|
let window = document.window();
|
||||||
if window.is_top_level() {
|
if window.is_top_level() {
|
||||||
let top_level_browsing_context_id = window.top_level_browsing_context_id();
|
let msg = EmbedderMsg::NewFavicon(url.clone());
|
||||||
let msg = EmbedderMsg::NewFavicon(top_level_browsing_context_id, url.clone());
|
|
||||||
window.send_to_embedder(msg);
|
window.send_to_embedder(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,7 @@ use js::jsval::UndefinedValue;
|
||||||
use js::rust::HandleValue;
|
use js::rust::HandleValue;
|
||||||
use layout_image::fetch_image_for_layout;
|
use layout_image::fetch_image_for_layout;
|
||||||
use microtask::MicrotaskQueue;
|
use microtask::MicrotaskQueue;
|
||||||
use msg::constellation_msg::{PipelineId, TopLevelBrowsingContextId};
|
use msg::constellation_msg::PipelineId;
|
||||||
use net_traits::{ResourceThreads, ReferrerPolicy};
|
use net_traits::{ResourceThreads, ReferrerPolicy};
|
||||||
use net_traits::image_cache::{ImageCache, ImageResponder, ImageResponse};
|
use net_traits::image_cache::{ImageCache, ImageResponder, ImageResponse};
|
||||||
use net_traits::image_cache::{PendingImageId, PendingImageResponse};
|
use net_traits::image_cache::{PendingImageId, PendingImageResponse};
|
||||||
|
@ -355,11 +355,6 @@ impl Window {
|
||||||
self.parent_info
|
self.parent_info
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn top_level_browsing_context_id(&self) -> TopLevelBrowsingContextId {
|
|
||||||
let window_proxy = self.window_proxy.get().unwrap();
|
|
||||||
window_proxy.top_level_browsing_context_id()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_script_pair(&self) -> (Box<ScriptChan + Send>, Box<ScriptPort + Send>) {
|
pub fn new_script_pair(&self) -> (Box<ScriptChan + Send>, Box<ScriptPort + Send>) {
|
||||||
let (tx, rx) = channel();
|
let (tx, rx) = channel();
|
||||||
(Box::new(SendableMainThreadScriptChan(tx)), Box::new(rx))
|
(Box::new(SendableMainThreadScriptChan(tx)), Box::new(rx))
|
||||||
|
@ -534,9 +529,7 @@ impl WindowMethods for Window {
|
||||||
stderr.flush().unwrap();
|
stderr.flush().unwrap();
|
||||||
}
|
}
|
||||||
let (sender, receiver) = ProfiledIpc::channel(self.global().time_profiler_chan().clone()).unwrap();
|
let (sender, receiver) = ProfiledIpc::channel(self.global().time_profiler_chan().clone()).unwrap();
|
||||||
let window_proxy = self.window_proxy.get().unwrap();
|
let msg = EmbedderMsg::Alert(s.to_string(), sender);
|
||||||
let top_level_browsing_context_id = window_proxy.top_level_browsing_context_id();
|
|
||||||
let msg = EmbedderMsg::Alert(top_level_browsing_context_id, s.to_string(), sender);
|
|
||||||
self.send_to_embedder(msg);
|
self.send_to_embedder(msg);
|
||||||
receiver.recv().unwrap();
|
receiver.recv().unwrap();
|
||||||
}
|
}
|
||||||
|
@ -927,8 +920,7 @@ impl WindowMethods for Window {
|
||||||
//TODO determine if this operation is allowed
|
//TODO determine if this operation is allowed
|
||||||
let dpr = self.device_pixel_ratio();
|
let dpr = self.device_pixel_ratio();
|
||||||
let size = TypedSize2D::new(width, height).to_f32() * dpr;
|
let size = TypedSize2D::new(width, height).to_f32() * dpr;
|
||||||
let top_level_browsing_context_id = self.top_level_browsing_context_id();
|
self.send_to_embedder(EmbedderMsg::ResizeTo(size.to_u32()));
|
||||||
self.send_to_embedder(EmbedderMsg::ResizeTo(top_level_browsing_context_id, size.to_u32()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://drafts.csswg.org/cssom-view/#dom-window-resizeby
|
// https://drafts.csswg.org/cssom-view/#dom-window-resizeby
|
||||||
|
@ -944,9 +936,7 @@ impl WindowMethods for Window {
|
||||||
//TODO determine if this operation is allowed
|
//TODO determine if this operation is allowed
|
||||||
let dpr = self.device_pixel_ratio();
|
let dpr = self.device_pixel_ratio();
|
||||||
let point = TypedPoint2D::new(x, y).to_f32() * dpr;
|
let point = TypedPoint2D::new(x, y).to_f32() * dpr;
|
||||||
let window_proxy = self.window_proxy.get().unwrap();
|
let msg = EmbedderMsg::MoveTo(point.to_i32());
|
||||||
let top_level_browsing_context_id = window_proxy.top_level_browsing_context_id();
|
|
||||||
let msg = EmbedderMsg::MoveTo(top_level_browsing_context_id, point.to_i32());
|
|
||||||
self.send_to_embedder(msg);
|
self.send_to_embedder(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2284,7 +2284,6 @@ impl ScriptThread {
|
||||||
None => return warn!("Message sent to closed pipeline {}.", pipeline_id),
|
None => return warn!("Message sent to closed pipeline {}.", pipeline_id),
|
||||||
};
|
};
|
||||||
let window = document.window();
|
let window = document.window();
|
||||||
let top_level_browsing_context_id = window.top_level_browsing_context_id();
|
|
||||||
|
|
||||||
// Get the previous target temporarily
|
// Get the previous target temporarily
|
||||||
let prev_mouse_over_target = self.topmost_mouse_over_target.get();
|
let prev_mouse_over_target = self.topmost_mouse_over_target.get();
|
||||||
|
@ -2313,7 +2312,7 @@ impl ScriptThread {
|
||||||
let url = document.url();
|
let url = document.url();
|
||||||
url.join(&value).map(|url| url.to_string()).ok()
|
url.join(&value).map(|url| url.to_string()).ok()
|
||||||
});
|
});
|
||||||
let event = EmbedderMsg::Status(top_level_browsing_context_id, status);
|
let event = EmbedderMsg::Status(status);
|
||||||
window.send_to_embedder(event);
|
window.send_to_embedder(event);
|
||||||
|
|
||||||
state_already_changed = true;
|
state_already_changed = true;
|
||||||
|
@ -2327,7 +2326,7 @@ impl ScriptThread {
|
||||||
.inclusive_ancestors()
|
.inclusive_ancestors()
|
||||||
.filter_map(DomRoot::downcast::<HTMLAnchorElement>)
|
.filter_map(DomRoot::downcast::<HTMLAnchorElement>)
|
||||||
.next() {
|
.next() {
|
||||||
let event = EmbedderMsg::Status(top_level_browsing_context_id, None);
|
let event = EmbedderMsg::Status(None);
|
||||||
window.send_to_embedder(event);
|
window.send_to_embedder(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -124,7 +124,7 @@ pub struct Servo<Window: WindowMethods + 'static> {
|
||||||
compositor: IOCompositor<Window>,
|
compositor: IOCompositor<Window>,
|
||||||
constellation_chan: Sender<ConstellationMsg>,
|
constellation_chan: Sender<ConstellationMsg>,
|
||||||
embedder_receiver: EmbedderReceiver,
|
embedder_receiver: EmbedderReceiver,
|
||||||
embedder_events: Vec<EmbedderMsg>,
|
embedder_events: Vec<(Option<BrowserId>, EmbedderMsg)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Window> Servo<Window> where Window: WindowMethods + 'static {
|
impl<Window> Servo<Window> where Window: WindowMethods + 'static {
|
||||||
|
@ -357,7 +357,7 @@ impl<Window> Servo<Window> where Window: WindowMethods + 'static {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn receive_messages(&mut self) {
|
fn receive_messages(&mut self) {
|
||||||
while let Some(msg) = self.embedder_receiver.try_recv_embedder_msg() {
|
while let Some((top_level_browsing_context, msg)) = self.embedder_receiver.try_recv_embedder_msg() {
|
||||||
match (msg, self.compositor.shutdown_state) {
|
match (msg, self.compositor.shutdown_state) {
|
||||||
(_, ShutdownState::FinishedShuttingDown) => {
|
(_, ShutdownState::FinishedShuttingDown) => {
|
||||||
error!("embedder shouldn't be handling messages after compositor has shut down");
|
error!("embedder shouldn't be handling messages after compositor has shut down");
|
||||||
|
@ -365,22 +365,22 @@ impl<Window> Servo<Window> where Window: WindowMethods + 'static {
|
||||||
|
|
||||||
(_, ShutdownState::ShuttingDown) => {},
|
(_, ShutdownState::ShuttingDown) => {},
|
||||||
|
|
||||||
(EmbedderMsg::KeyEvent(top_level_browsing_context, ch, key, state, modified),
|
(EmbedderMsg::KeyEvent(ch, key, state, modified),
|
||||||
ShutdownState::NotShuttingDown) => {
|
ShutdownState::NotShuttingDown) => {
|
||||||
if state == KeyState::Pressed {
|
if state == KeyState::Pressed {
|
||||||
let msg = EmbedderMsg::KeyEvent(top_level_browsing_context, ch, key, state, modified);
|
let event = (top_level_browsing_context, EmbedderMsg::KeyEvent(ch, key, state, modified));
|
||||||
self.embedder_events.push(msg);
|
self.embedder_events.push(event);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
(msg, ShutdownState::NotShuttingDown) => {
|
(msg, ShutdownState::NotShuttingDown) => {
|
||||||
self.embedder_events.push(msg);
|
self.embedder_events.push((top_level_browsing_context, msg));
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_events(&mut self) -> Vec<EmbedderMsg> {
|
pub fn get_events(&mut self) -> Vec<(Option<BrowserId>, EmbedderMsg)> {
|
||||||
::std::mem::replace(&mut self.embedder_events, Vec::new())
|
::std::mem::replace(&mut self.embedder_events, Vec::new())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -394,7 +394,7 @@ impl<Window> Servo<Window> where Window: WindowMethods + 'static {
|
||||||
if self.compositor.shutdown_state != ShutdownState::FinishedShuttingDown {
|
if self.compositor.shutdown_state != ShutdownState::FinishedShuttingDown {
|
||||||
self.compositor.perform_updates();
|
self.compositor.perform_updates();
|
||||||
} else {
|
} else {
|
||||||
self.embedder_events.push(EmbedderMsg::Shutdown);
|
self.embedder_events.push((None, EmbedderMsg::Shutdown));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -232,13 +232,13 @@ impl Browser {
|
||||||
self.event_queue.push(event);
|
self.event_queue.push(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn handle_servo_events(&mut self, events: Vec<EmbedderMsg>) {
|
pub fn handle_servo_events(&mut self, events: Vec<(Option<BrowserId>, EmbedderMsg)>) {
|
||||||
for event in events {
|
for (browser_id, msg) in events {
|
||||||
match event {
|
match msg {
|
||||||
EmbedderMsg::Status(_browser_id, status) => {
|
EmbedderMsg::Status(status) => {
|
||||||
self.status = status;
|
self.status = status;
|
||||||
},
|
},
|
||||||
EmbedderMsg::ChangePageTitle(_browser_id, title) => {
|
EmbedderMsg::ChangePageTitle(title) => {
|
||||||
self.title = title;
|
self.title = title;
|
||||||
|
|
||||||
let fallback_title: String = if let Some(ref current_url) = self.current_url {
|
let fallback_title: String = if let Some(ref current_url) = self.current_url {
|
||||||
|
@ -253,52 +253,52 @@ impl Browser {
|
||||||
let title = format!("{} - Servo", title);
|
let title = format!("{} - Servo", title);
|
||||||
self.window.set_title(&title);
|
self.window.set_title(&title);
|
||||||
}
|
}
|
||||||
EmbedderMsg::MoveTo(_browser_id, point) => {
|
EmbedderMsg::MoveTo(point) => {
|
||||||
self.window.set_position(point);
|
self.window.set_position(point);
|
||||||
}
|
}
|
||||||
EmbedderMsg::ResizeTo(_browser_id, size) => {
|
EmbedderMsg::ResizeTo(size) => {
|
||||||
self.window.set_inner_size(size);
|
self.window.set_inner_size(size);
|
||||||
}
|
}
|
||||||
EmbedderMsg::Alert(browser_id, message, sender) => {
|
EmbedderMsg::Alert(message, sender) => {
|
||||||
display_alert_dialog(message.to_owned());
|
display_alert_dialog(message.to_owned());
|
||||||
if let Err(e) = sender.send(()) {
|
if let Err(e) = sender.send(()) {
|
||||||
let reason = format!("Failed to send Alert response: {}", e);
|
let reason = format!("Failed to send Alert response: {}", e);
|
||||||
self.event_queue.push(WindowEvent::SendError(Some(browser_id), reason));
|
self.event_queue.push(WindowEvent::SendError(browser_id, reason));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EmbedderMsg::AllowNavigation(_browser_id, _url, response_chan) => {
|
EmbedderMsg::AllowNavigation(_url, response_chan) => {
|
||||||
if let Err(e) = response_chan.send(true) {
|
if let Err(e) = response_chan.send(true) {
|
||||||
warn!("Failed to send allow_navigation() response: {}", e);
|
warn!("Failed to send allow_navigation() response: {}", e);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
EmbedderMsg::KeyEvent(browser_id, ch, key, state, modified) => {
|
EmbedderMsg::KeyEvent(ch, key, state, modified) => {
|
||||||
self.handle_key_from_servo(browser_id, ch, key, state, modified);
|
self.handle_key_from_servo(browser_id, ch, key, state, modified);
|
||||||
}
|
}
|
||||||
EmbedderMsg::SetCursor(cursor) => {
|
EmbedderMsg::SetCursor(cursor) => {
|
||||||
self.window.set_cursor(cursor);
|
self.window.set_cursor(cursor);
|
||||||
}
|
}
|
||||||
EmbedderMsg::NewFavicon(_browser_id, url) => {
|
EmbedderMsg::NewFavicon(url) => {
|
||||||
self.favicon = Some(url);
|
self.favicon = Some(url);
|
||||||
}
|
}
|
||||||
EmbedderMsg::HeadParsed(_browser_id, ) => {
|
EmbedderMsg::HeadParsed => {
|
||||||
self.loading_state = Some(LoadingState::Loading);
|
self.loading_state = Some(LoadingState::Loading);
|
||||||
}
|
}
|
||||||
EmbedderMsg::HistoryChanged(_browser_id, urls, current) => {
|
EmbedderMsg::HistoryChanged(urls, current) => {
|
||||||
self.current_url = Some(urls[current].clone());
|
self.current_url = Some(urls[current].clone());
|
||||||
}
|
}
|
||||||
EmbedderMsg::SetFullscreenState(_browser_id, state) => {
|
EmbedderMsg::SetFullscreenState(state) => {
|
||||||
self.window.set_fullscreen(state);
|
self.window.set_fullscreen(state);
|
||||||
}
|
}
|
||||||
EmbedderMsg::LoadStart(_browser_id) => {
|
EmbedderMsg::LoadStart => {
|
||||||
self.loading_state = Some(LoadingState::Connecting);
|
self.loading_state = Some(LoadingState::Connecting);
|
||||||
}
|
}
|
||||||
EmbedderMsg::LoadComplete(_browser_id) => {
|
EmbedderMsg::LoadComplete => {
|
||||||
self.loading_state = Some(LoadingState::Loaded);
|
self.loading_state = Some(LoadingState::Loaded);
|
||||||
}
|
}
|
||||||
EmbedderMsg::Shutdown => {
|
EmbedderMsg::Shutdown => {
|
||||||
self.shutdown_requested = true;
|
self.shutdown_requested = true;
|
||||||
},
|
},
|
||||||
EmbedderMsg::Panic(_browser_id, _reason, _backtrace) => {
|
EmbedderMsg::Panic(_reason, _backtrace) => {
|
||||||
},
|
},
|
||||||
EmbedderMsg::GetSelectedBluetoothDevice(devices, sender) => {
|
EmbedderMsg::GetSelectedBluetoothDevice(devices, sender) => {
|
||||||
let selected = platform_get_selected_devices(devices);
|
let selected = platform_get_selected_devices(devices);
|
||||||
|
@ -318,10 +318,10 @@ impl Browser {
|
||||||
self.event_queue.push(WindowEvent::SendError(None, reason));
|
self.event_queue.push(WindowEvent::SendError(None, reason));
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
EmbedderMsg::ShowIME(_browser_id, _kind) => {
|
EmbedderMsg::ShowIME(_kind) => {
|
||||||
debug!("ShowIME received");
|
debug!("ShowIME received");
|
||||||
}
|
}
|
||||||
EmbedderMsg::HideIME(_browser_id) => {
|
EmbedderMsg::HideIME => {
|
||||||
debug!("HideIME received");
|
debug!("HideIME received");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue