diff --git a/.gitignore b/.gitignore index 60d0f3dd2032..25a90bcb7505 100644 --- a/.gitignore +++ b/.gitignore @@ -53,7 +53,7 @@ support/hololens/ARM64/ support/hololens/ServoApp/x64/ support/hololens/ServoApp/ARM/ support/hololens/ServoApp/ARM64/ -support/hololens/ServoApp/Generated\ Files +support/hololens/ServoApp/Generated Files/ support/hololens/ServoApp/BundleArtifacts/ support/hololens/ServoApp/support/ support/hololens/ServoApp/Debug/ diff --git a/components/embedder_traits/lib.rs b/components/embedder_traits/lib.rs index 961cd5e53a46..7e76a3f24465 100644 --- a/components/embedder_traits/lib.rs +++ b/components/embedder_traits/lib.rs @@ -157,7 +157,7 @@ pub enum EmbedderMsg { /// Show dialog to user Prompt(PromptDefinition, PromptOrigin), /// Show a context menu to the user - ShowContextMenu(IpcSender, Vec), + ShowContextMenu(IpcSender, Option, Vec), /// Whether or not to allow a pipeline to load a url. AllowNavigationRequest(PipelineId, ServoUrl), /// Whether or not to allow script to open a new tab/browser diff --git a/ports/glutin/browser.rs b/ports/glutin/browser.rs index d92eb1bde9bf..c97a1fa504a6 100644 --- a/ports/glutin/browser.rs +++ b/ports/glutin/browser.rs @@ -521,7 +521,7 @@ where Err(()) => error!("Error running devtools server"), } }, - EmbedderMsg::ShowContextMenu(sender, _) => { + EmbedderMsg::ShowContextMenu(sender, ..) => { let _ = sender.send(ContextMenuResult::Ignored); } } diff --git a/ports/libsimpleservo/api/src/lib.rs b/ports/libsimpleservo/api/src/lib.rs index c876ffb9fc01..0c14dbf3851a 100644 --- a/ports/libsimpleservo/api/src/lib.rs +++ b/ports/libsimpleservo/api/src/lib.rs @@ -105,7 +105,7 @@ pub trait HostTrait { /// Ask for string fn prompt_input(&self, msg: String, default: String, trusted: bool) -> Option; /// Show context menu - fn show_context_menu(&self, items: Vec); + fn show_context_menu(&self, title: Option, items: Vec); /// Page starts loading. /// "Reload button" should be disabled. /// "Stop button" should be enabled. @@ -579,7 +579,7 @@ impl ServoGlue { EmbedderMsg::AllowUnload(sender) => { let _ = sender.send(true); }, - EmbedderMsg::ShowContextMenu(sender, items) => { + EmbedderMsg::ShowContextMenu(sender, title, items) => { if self.context_menu_sender.is_some() { warn!( "Trying to show a context menu when a context menu is already active" @@ -587,7 +587,9 @@ impl ServoGlue { let _ = sender.send(ContextMenuResult::Ignored); } else { self.context_menu_sender = Some(sender); - self.callbacks.host_callbacks.show_context_menu(items); + self.callbacks + .host_callbacks + .show_context_menu(title, items); } }, EmbedderMsg::Prompt(definition, origin) => { diff --git a/ports/libsimpleservo/capi/src/lib.rs b/ports/libsimpleservo/capi/src/lib.rs index d55d9f41175a..323f60575df7 100644 --- a/ports/libsimpleservo/capi/src/lib.rs +++ b/ports/libsimpleservo/capi/src/lib.rs @@ -230,7 +230,8 @@ pub struct CHostCallbacks { trusted: bool, ) -> *const c_char, pub on_devtools_started: extern "C" fn(result: CDevtoolsServerState, port: c_uint), - pub show_context_menu: extern "C" fn(items_list: *const *const c_char, items_size: u32), + pub show_context_menu: + extern "C" fn(title: *const c_char, items_list: *const *const c_char, items_size: u32), } /// Servo options @@ -903,15 +904,19 @@ impl HostTrait for HostCallbacks { } } - fn show_context_menu(&self, items: Vec) { + fn show_context_menu(&self, title: Option, items: Vec) { debug!("show_context_menu"); - let size = items.len() as u32; + let items_size = items.len() as u32; let cstrs: Vec = items .into_iter() .map(|i| CString::new(i).expect("Can't create string")) .collect(); - let ptrs: Vec<*const c_char> = cstrs.iter().map(|cstr| cstr.as_ptr()).collect(); - (self.0.show_context_menu)(ptrs.as_ptr(), size); - // let _ = cstrs; // Don't drop these too early + let items: Vec<*const c_char> = cstrs.iter().map(|cstr| cstr.as_ptr()).collect(); + let title = title.map(|s| CString::new(s).expect("Can't create string")); + let title_ptr = title + .as_ref() + .map(|cstr| cstr.as_ptr()) + .unwrap_or(std::ptr::null()); + (self.0.show_context_menu)(title_ptr, items.as_ptr(), items_size); } } diff --git a/support/hololens/ServoApp/ServoControl/Servo.cpp b/support/hololens/ServoApp/ServoControl/Servo.cpp index 96438300ac48..4d82649596ca 100644 --- a/support/hololens/ServoApp/ServoControl/Servo.cpp +++ b/support/hololens/ServoApp/ServoControl/Servo.cpp @@ -67,12 +67,17 @@ void prompt_alert(const char *message, bool trusted) { sServo->Delegate().OnServoPromptAlert(char2hstring(message), trusted); } -void show_context_menu(const char *const *items_list, uint32_t items_size) { +void show_context_menu(const char *title, const char *const *items_list, + uint32_t items_size) { + std::optional opt_title = {}; + if (title != nullptr) { + opt_title = char2hstring(title); + } std::vector items; for (uint32_t i = 0; i < items_size; i++) { items.push_back(char2hstring(items_list[i])); } - sServo->Delegate().OnServoShowContextMenu(items); + sServo->Delegate().OnServoShowContextMenu(opt_title, items); } void on_devtools_started(Servo::DevtoolsServerState result, diff --git a/support/hololens/ServoApp/ServoControl/Servo.h b/support/hololens/ServoApp/ServoControl/Servo.h index 2b396f6d09db..7b3b3b00ed36 100644 --- a/support/hololens/ServoApp/ServoControl/Servo.h +++ b/support/hololens/ServoApp/ServoControl/Servo.h @@ -105,7 +105,8 @@ class ServoDelegate { virtual void OnServoMediaSessionMetadata(hstring, hstring, hstring) = 0; virtual void OnServoMediaSessionPlaybackStateChange(int) = 0; virtual void OnServoPromptAlert(hstring, bool) = 0; - virtual void OnServoShowContextMenu(std::vector) = 0; + virtual void OnServoShowContextMenu(std::optional, + std::vector) = 0; virtual Servo::PromptResult OnServoPromptOkCancel(hstring, bool) = 0; virtual Servo::PromptResult OnServoPromptYesNo(hstring, bool) = 0; virtual std::optional OnServoPromptInput(hstring, hstring, bool) = 0; diff --git a/support/hololens/ServoApp/ServoControl/ServoControl.cpp b/support/hololens/ServoApp/ServoControl/ServoControl.cpp index 810efed02e1d..4d1349ee370c 100644 --- a/support/hololens/ServoApp/ServoControl/ServoControl.cpp +++ b/support/hololens/ServoApp/ServoControl/ServoControl.cpp @@ -564,9 +564,10 @@ void ServoControl::OnServoDevtoolsStarted(bool success, }); } -void ServoControl::OnServoShowContextMenu(std::vector items) { +void ServoControl::OnServoShowContextMenu(std::optional title, + std::vector items) { RunOnUIThread([=] { - MessageDialog msg{L"Menu"}; + MessageDialog msg{title.value_or(L"Menu")}; for (auto i = 0; i < items.size(); i++) { UICommand cmd{items[i], [=](auto) { RunOnGLThread([=] { diff --git a/support/hololens/ServoApp/ServoControl/ServoControl.h b/support/hololens/ServoApp/ServoControl/ServoControl.h index 889c3510bfbf..6eaf4459f4b7 100644 --- a/support/hololens/ServoApp/ServoControl/ServoControl.h +++ b/support/hololens/ServoApp/ServoControl/ServoControl.h @@ -117,7 +117,8 @@ struct ServoControl : ServoControlT, public servo::ServoDelegate { winrt::hstring); virtual void OnServoMediaSessionPlaybackStateChange(int); virtual void OnServoPromptAlert(winrt::hstring, bool); - virtual void OnServoShowContextMenu(std::vector); + virtual void OnServoShowContextMenu(std::optional, + std::vector); virtual servo::Servo::PromptResult OnServoPromptOkCancel(winrt::hstring, bool); virtual servo::Servo::PromptResult OnServoPromptYesNo(winrt::hstring, bool);