move top_level_browsing_context_id out of embedder msg

This commit is contained in:
Gregory Terzian 2018-05-18 10:59:41 +08:00
parent d438240772
commit 4234b1252a
11 changed files with 78 additions and 97 deletions

View file

@ -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));
self.embedder_proxy.send(msg);
match ipc_receiver.recv() {

View file

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

View file

@ -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,14 +58,14 @@ 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()
}
}
@ -73,43 +73,43 @@ impl EmbedderReceiver {
#[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"),
}
}

View file

@ -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() {

View file

@ -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() {
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

View file

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

View file

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

View file

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

View file

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

View file

@ -124,7 +124,7 @@ pub struct Servo<Window: WindowMethods + 'static> {
compositor: IOCompositor<Window>,
constellation_chan: Sender<ConstellationMsg>,
embedder_receiver: EmbedderReceiver,
embedder_events: Vec<EmbedderMsg>,
embedder_events: Vec<(Option<BrowserId>, EmbedderMsg)>,
}
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) {
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) {
(_, ShutdownState::FinishedShuttingDown) => {
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) => {},
(EmbedderMsg::KeyEvent(top_level_browsing_context, ch, key, state, modified),
(EmbedderMsg::KeyEvent(ch, key, state, modified),
ShutdownState::NotShuttingDown) => {
if state == KeyState::Pressed {
let msg = EmbedderMsg::KeyEvent(top_level_browsing_context, ch, key, state, modified);
self.embedder_events.push(msg);
let event = (top_level_browsing_context, EmbedderMsg::KeyEvent(ch, key, state, modified));
self.embedder_events.push(event);
}
},
(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())
}
@ -394,7 +394,7 @@ impl<Window> Servo<Window> where Window: WindowMethods + 'static {
if self.compositor.shutdown_state != ShutdownState::FinishedShuttingDown {
self.compositor.perform_updates();
} else {
self.embedder_events.push(EmbedderMsg::Shutdown);
self.embedder_events.push((None, EmbedderMsg::Shutdown));
}
}

View file

@ -232,13 +232,13 @@ impl Browser {
self.event_queue.push(event);
}
pub fn handle_servo_events(&mut self, events: Vec<EmbedderMsg>) {
for event in events {
match event {
EmbedderMsg::Status(_browser_id, status) => {
pub fn handle_servo_events(&mut self, events: Vec<(Option<BrowserId>, EmbedderMsg)>) {
for (browser_id, msg) in events {
match msg {
EmbedderMsg::Status(status) => {
self.status = status;
},
EmbedderMsg::ChangePageTitle(_browser_id, title) => {
EmbedderMsg::ChangePageTitle(title) => {
self.title = title;
let fallback_title: String = if let Some(ref current_url) = self.current_url {
@ -253,52 +253,52 @@ impl Browser {
let title = format!("{} - Servo", title);
self.window.set_title(&title);
}
EmbedderMsg::MoveTo(_browser_id, point) => {
EmbedderMsg::MoveTo(point) => {
self.window.set_position(point);
}
EmbedderMsg::ResizeTo(_browser_id, size) => {
EmbedderMsg::ResizeTo(size) => {
self.window.set_inner_size(size);
}
EmbedderMsg::Alert(browser_id, message, sender) => {
EmbedderMsg::Alert(message, sender) => {
display_alert_dialog(message.to_owned());
if let Err(e) = sender.send(()) {
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) {
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);
}
EmbedderMsg::SetCursor(cursor) => {
self.window.set_cursor(cursor);
}
EmbedderMsg::NewFavicon(_browser_id, url) => {
EmbedderMsg::NewFavicon(url) => {
self.favicon = Some(url);
}
EmbedderMsg::HeadParsed(_browser_id, ) => {
EmbedderMsg::HeadParsed => {
self.loading_state = Some(LoadingState::Loading);
}
EmbedderMsg::HistoryChanged(_browser_id, urls, current) => {
EmbedderMsg::HistoryChanged(urls, current) => {
self.current_url = Some(urls[current].clone());
}
EmbedderMsg::SetFullscreenState(_browser_id, state) => {
EmbedderMsg::SetFullscreenState(state) => {
self.window.set_fullscreen(state);
}
EmbedderMsg::LoadStart(_browser_id) => {
EmbedderMsg::LoadStart => {
self.loading_state = Some(LoadingState::Connecting);
}
EmbedderMsg::LoadComplete(_browser_id) => {
EmbedderMsg::LoadComplete => {
self.loading_state = Some(LoadingState::Loaded);
}
EmbedderMsg::Shutdown => {
self.shutdown_requested = true;
},
EmbedderMsg::Panic(_browser_id, _reason, _backtrace) => {
EmbedderMsg::Panic(_reason, _backtrace) => {
},
EmbedderMsg::GetSelectedBluetoothDevice(devices, sender) => {
let selected = platform_get_selected_devices(devices);
@ -318,10 +318,10 @@ impl Browser {
self.event_queue.push(WindowEvent::SendError(None, reason));
};
}
EmbedderMsg::ShowIME(_browser_id, _kind) => {
EmbedderMsg::ShowIME(_kind) => {
debug!("ShowIME received");
}
EmbedderMsg::HideIME(_browser_id) => {
EmbedderMsg::HideIME => {
debug!("HideIME received");
}
}