Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Embedder handling of prompts and alerts #20707

Merged
Merged
Changes from 1 commit
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

move top_level_browsing_context_id out of embedder msg

  • Loading branch information
gterzian committed May 23, 2018
commit 4234b1252af9b4da08d8cd372dd4c1db9c3f2662
@@ -382,7 +382,7 @@ impl BluetoothManager {
}

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));

This comment has been minimized.

@paulrouget

paulrouget May 19, 2018

Contributor

Can be done in a follow up. But we might want to include the context here as well.

This comment has been minimized.

@gterzian

gterzian May 19, 2018

Author Member

filed

self.embedder_proxy.send(msg);

match ipc_receiver.recv() {
@@ -1026,7 +1026,7 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>

match content {
FromScriptMsg::ForwardToEmbedder(embedder_msg) => {
self.embedder_proxy.send(embedder_msg);
self.embedder_proxy.send((Some(source_top_ctx_id), embedder_msg));
}
FromScriptMsg::PipelineExited => {
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);

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 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) {
self.embedder_proxy.send(EmbedderMsg::SetCursor(cursor))
self.embedder_proxy.send((None, EmbedderMsg::SetCursor(cursor)))

This comment has been minimized.

@paulrouget

paulrouget May 19, 2018

Contributor

Is there an easy way to get the context here?

This comment has been minimized.

@gterzian

gterzian May 19, 2018

Author Member

filed

}

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> {
// Allow the embedder to handle the url itself
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);
if let Ok(false) = port.recv() {
return None;
@@ -1812,7 +1812,7 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
pipeline_id: PipelineId) {
if self.pipelines.get(&pipeline_id).and_then(|p| p.parent_info).is_none() {
// 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 {
// Notify embedder and compositor top level document finished loading.
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);
@@ -2099,7 +2099,7 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
}
},
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);
}
}
@@ -2272,7 +2272,7 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
},
WebDriverCommandMsg::SetWindowSize(top_level_browsing_context_id, size, 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) => {
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()
.scan(current_load_data.clone(), &resolve_load_data_future));
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);
}

@@ -33,12 +33,12 @@ pub trait EventLoopWaker : 'static + Send {

/// Sends messages to the embedder.
pub struct EmbedderProxy {
pub sender: Sender<EmbedderMsg>,
pub sender: Sender<(Option<TopLevelBrowsingContextId>, EmbedderMsg)>,
pub event_loop_waker: Box<EventLoopWaker>,
}

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.
if let Err(err) = self.sender.send(msg) {
warn!("Failed to send response ({}).", err);
@@ -58,58 +58,58 @@ impl Clone for EmbedderProxy {

/// The port that the embedder receives messages on.
pub struct EmbedderReceiver {
pub receiver: Receiver<EmbedderMsg>
pub receiver: Receiver<(Option<TopLevelBrowsingContextId>, EmbedderMsg)>
}

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()
}
pub fn recv_embedder_msg(&mut self) -> EmbedderMsg {
pub fn recv_embedder_msg(&mut self) -> (Option<TopLevelBrowsingContextId>, EmbedderMsg) {
self.receiver.recv().unwrap()
}
}

#[derive(Deserialize, Serialize)]
pub enum EmbedderMsg {
/// 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.
ChangePageTitle(TopLevelBrowsingContextId, Option<String>),
ChangePageTitle(Option<String>),
/// Move the window to a point
MoveTo(TopLevelBrowsingContextId, DeviceIntPoint),
MoveTo(DeviceIntPoint),
/// Resize the window to size
ResizeTo(TopLevelBrowsingContextId, DeviceUintSize),
ResizeTo(DeviceUintSize),
// Show an alert message.
Alert(TopLevelBrowsingContextId, String, IpcSender<()>),
Alert(String, IpcSender<()>),
/// 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.
KeyEvent(Option<TopLevelBrowsingContextId>, Option<char>, Key, KeyState, KeyModifiers),
KeyEvent(Option<char>, Key, KeyState, KeyModifiers),
/// Changes the cursor.
SetCursor(CursorKind),
/// A favicon was detected
NewFavicon(TopLevelBrowsingContextId, ServoUrl),
NewFavicon(ServoUrl),
/// <head> tag finished parsing
HeadParsed(TopLevelBrowsingContextId),
HeadParsed,
/// The history state has changed.
HistoryChanged(TopLevelBrowsingContextId, Vec<ServoUrl>, usize),
HistoryChanged(Vec<ServoUrl>, usize),
/// Enter or exit fullscreen
SetFullscreenState(TopLevelBrowsingContextId, bool),
SetFullscreenState(bool),
/// The load of a page has begun
LoadStart(TopLevelBrowsingContextId),
LoadStart,
/// The load of a page has completed
LoadComplete(TopLevelBrowsingContextId),
LoadComplete,
/// 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.
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),
ShowIME(InputMethodType),
/// Request to hide the IME when the editable element is blurred.
HideIME(TopLevelBrowsingContextId),
HideIME,
/// Servo has shut down
Shutdown,
}
@@ -126,16 +126,16 @@ impl Debug for EmbedderMsg {
EmbedderMsg::KeyEvent(..) => write!(f, "KeyEvent"),
EmbedderMsg::SetCursor(..) => write!(f, "SetCursor"),
EmbedderMsg::NewFavicon(..) => write!(f, "NewFavicon"),
EmbedderMsg::HeadParsed(..) => write!(f, "HeadParsed"),
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::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::HideIME => write!(f, "HideIME"),
EmbedderMsg::Shutdown => write!(f, "Shutdown"),
}
}
@@ -220,7 +220,7 @@ impl FileManagerStore {
multiple_files: bool,
embedder_proxy: EmbedderProxy) -> Option<Vec<String>> {
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);
match ipc_receiver.recv() {
@@ -856,8 +856,7 @@ impl Document {

// Notify the embedder to hide the input method.
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(top_level_browsing_context_id));
self.send_to_embedder(EmbedderMsg::HideIME);
}
}

@@ -876,8 +875,7 @@ impl Document {

// Notify the embedder to display an input method.
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(top_level_browsing_context_id, kind));
self.send_to_embedder(EmbedderMsg::ShowIME(kind));
}
}
}
@@ -894,8 +892,7 @@ impl Document {
let window = self.window();
if window.is_top_level() {

This comment has been minimized.

@paulrouget

paulrouget May 11, 2018

Contributor

I think this is right. There is no way for a window to be top level and not be the top level browsing context, right? (that was not always the case)

This comment has been minimized.

@gterzian

gterzian May 14, 2018

Author Member

yes I think that's right, yet window.is_top_level checks for 'top levelness', while window.top_level_browsing_context_id() will always return the top_level_browsing_context_id regardless of whether the window on which it is called is actuall top level or not...

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(top_level_browsing_context_id, title));
self.send_to_embedder(EmbedderMsg::ChangePageTitle(title));
}
}

@@ -1364,8 +1361,7 @@ impl Document {
}

if cancel_state == EventDefault::Allowed {
let top_level_browsing_context_id = self.window().top_level_browsing_context_id();
let msg = EmbedderMsg::KeyEvent(Some(top_level_browsing_context_id), ch, key, state, modifiers);
let msg = EmbedderMsg::KeyEvent(ch, key, state, modifiers);
self.send_to_embedder(msg);

// This behavior is unspecced
@@ -2795,8 +2791,7 @@ impl Document {
let window = self.window();
// Step 6
if !error {
let top_level_browsing_context_id = self.window().top_level_browsing_context_id();
let event = EmbedderMsg::SetFullscreenState(top_level_browsing_context_id, true);
let event = EmbedderMsg::SetFullscreenState(true);
self.send_to_embedder(event);
}

@@ -2831,8 +2826,7 @@ impl Document {

let window = self.window();
// Step 8
let top_level_browsing_context_id = self.window().top_level_browsing_context_id();
let event = EmbedderMsg::SetFullscreenState(top_level_browsing_context_id, true);
let event = EmbedderMsg::SetFullscreenState(true);
self.send_to_embedder(event);

// Step 9
@@ -151,8 +151,7 @@ impl VirtualMethods for HTMLBodyElement {
let document = window.Document();
document.set_reflow_timeout(time::precise_time_ns() + INITIAL_REFLOW_DELAY);
if window.is_top_level() {
let top_level_browsing_context_id = window.top_level_browsing_context_id();
let msg = EmbedderMsg::HeadParsed(top_level_browsing_context_id);
let msg = EmbedderMsg::HeadParsed;
window.send_to_embedder(msg);
}
}
@@ -307,8 +307,7 @@ impl HTMLLinkElement {
Ok(url) => {
let window = document.window();
if window.is_top_level() {
let top_level_browsing_context_id = window.top_level_browsing_context_id();
let msg = EmbedderMsg::NewFavicon(top_level_browsing_context_id, url.clone());
let msg = EmbedderMsg::NewFavicon(url.clone());
window.send_to_embedder(msg);
}

@@ -59,7 +59,7 @@ use js::jsval::UndefinedValue;
use js::rust::HandleValue;
use layout_image::fetch_image_for_layout;
use microtask::MicrotaskQueue;
use msg::constellation_msg::{PipelineId, TopLevelBrowsingContextId};
use msg::constellation_msg::PipelineId;
use net_traits::{ResourceThreads, ReferrerPolicy};
use net_traits::image_cache::{ImageCache, ImageResponder, ImageResponse};
use net_traits::image_cache::{PendingImageId, PendingImageResponse};
@@ -355,11 +355,6 @@ impl Window {
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>) {
let (tx, rx) = channel();
(Box::new(SendableMainThreadScriptChan(tx)), Box::new(rx))
@@ -534,9 +529,7 @@ impl WindowMethods for Window {
stderr.flush().unwrap();
}
let (sender, receiver) = ProfiledIpc::channel(self.global().time_profiler_chan().clone()).unwrap();
let window_proxy = self.window_proxy.get().unwrap();
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);
let msg = EmbedderMsg::Alert(s.to_string(), sender);
self.send_to_embedder(msg);
receiver.recv().unwrap();
}
@@ -927,8 +920,7 @@ impl WindowMethods for Window {
//TODO determine if this operation is allowed
let dpr = self.device_pixel_ratio();
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(top_level_browsing_context_id, size.to_u32()));
self.send_to_embedder(EmbedderMsg::ResizeTo(size.to_u32()));
}

// https://drafts.csswg.org/cssom-view/#dom-window-resizeby
@@ -944,9 +936,7 @@ impl WindowMethods for Window {
//TODO determine if this operation is allowed
let dpr = self.device_pixel_ratio();
let point = TypedPoint2D::new(x, y).to_f32() * dpr;
let window_proxy = self.window_proxy.get().unwrap();
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());
let msg = EmbedderMsg::MoveTo(point.to_i32());
self.send_to_embedder(msg);
}

@@ -2284,7 +2284,6 @@ impl ScriptThread {
None => return warn!("Message sent to closed pipeline {}.", pipeline_id),
};
let window = document.window();
let top_level_browsing_context_id = window.top_level_browsing_context_id();

// Get the previous target temporarily
let prev_mouse_over_target = self.topmost_mouse_over_target.get();
@@ -2313,7 +2312,7 @@ impl ScriptThread {
let url = document.url();
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);

state_already_changed = true;
@@ -2327,7 +2326,7 @@ impl ScriptThread {
.inclusive_ancestors()
.filter_map(DomRoot::downcast::<HTMLAnchorElement>)
.next() {
let event = EmbedderMsg::Status(top_level_browsing_context_id, None);
let event = EmbedderMsg::Status(None);
window.send_to_embedder(event);
}
}
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.