diff options
Diffstat (limited to 'components/servo')
-rw-r--r-- | components/servo/Cargo.toml | 1 | ||||
-rw-r--r-- | components/servo/lib.rs | 9 | ||||
-rw-r--r-- | components/servo/tests/webview.rs | 39 | ||||
-rw-r--r-- | components/servo/webview.rs | 5 |
4 files changed, 50 insertions, 4 deletions
diff --git a/components/servo/Cargo.toml b/components/servo/Cargo.toml index 687cdd6a5a2..5988dbdc4b9 100644 --- a/components/servo/Cargo.toml +++ b/components/servo/Cargo.toml @@ -72,7 +72,6 @@ bluetooth_traits = { workspace = true, optional = true } canvas = { path = "../canvas" } webgl = { path = "../webgl", default-features = false } canvas_traits = { workspace = true } -cfg-if = { workspace = true } compositing = { path = "../compositing" } compositing_traits = { workspace = true } constellation = { path = "../constellation" } diff --git a/components/servo/lib.rs b/components/servo/lib.rs index f2732eaddfe..a188678c024 100644 --- a/components/servo/lib.rs +++ b/components/servo/lib.rs @@ -92,6 +92,7 @@ use media::{GlApi, NativeDisplay, WindowGLContext}; use net::protocols::ProtocolRegistry; use net::resource_thread::new_resource_threads; use profile::{mem as profile_mem, time as profile_time}; +use profile_traits::mem::MemoryReportResult; use profile_traits::{mem, time}; use script::{JSEngineSetup, ServiceWorkerManager}; use servo_config::opts::Opts; @@ -417,7 +418,7 @@ impl Servo { // Create the WebXR main thread #[cfg(feature = "webxr")] let mut webxr_main_thread = - webxr::MainThreadRegistry::new(event_loop_waker, webxr_layer_grand_manager) + webxr::MainThreadRegistry::new(event_loop_waker.clone(), webxr_layer_grand_manager) .expect("Failed to create WebXR device registry"); #[cfg(feature = "webxr")] if pref!(dom_webxr_enabled) { @@ -489,6 +490,7 @@ impl Servo { #[cfg(feature = "webxr")] webxr_main_thread, shutdown_state: shutdown_state.clone(), + event_loop_waker, }, opts.debug.convert_mouse_to_touch, ); @@ -632,6 +634,11 @@ impl Servo { log::set_max_level(filter); } + pub fn create_memory_report(&self, snd: IpcSender<MemoryReportResult>) { + self.constellation_proxy + .send(EmbedderToConstellationMessage::CreateMemoryReport(snd)); + } + pub fn start_shutting_down(&self) { if self.shutdown_state.get() != ShutdownState::NotShuttingDown { warn!("Requested shutdown while already shutting down"); diff --git a/components/servo/tests/webview.rs b/components/servo/tests/webview.rs index 41900015b94..d7cb9a965e0 100644 --- a/components/servo/tests/webview.rs +++ b/components/servo/tests/webview.rs @@ -17,14 +17,21 @@ use std::rc::Rc; use anyhow::ensure; use common::{ServoTest, run_api_tests}; use servo::{ - JSValue, JavaScriptEvaluationError, LoadStatus, WebView, WebViewBuilder, WebViewDelegate, + JSValue, JavaScriptEvaluationError, LoadStatus, Theme, WebView, WebViewBuilder, WebViewDelegate, }; +use url::Url; #[derive(Default)] struct WebViewDelegateImpl { url_changed: Cell<bool>, } +impl WebViewDelegateImpl { + pub(crate) fn reset(&self) { + self.url_changed.set(false); + } +} + impl WebViewDelegate for WebViewDelegateImpl { fn notify_url_changed(&self, _webview: servo::WebView, _url: url::Url) { self.url_changed.set(true); @@ -128,10 +135,40 @@ fn test_create_webview_and_immediately_drop_webview_before_shutdown( Ok(()) } +fn test_theme_change(servo_test: &ServoTest) -> Result<(), anyhow::Error> { + let delegate = Rc::new(WebViewDelegateImpl::default()); + let webview = WebViewBuilder::new(servo_test.servo()) + .delegate(delegate.clone()) + .url(Url::parse("data:text/html,page one").unwrap()) + .build(); + + let is_dark_theme_script = "window.matchMedia('(prefers-color-scheme: dark)').matches"; + + // The default theme is "light". + let result = evaluate_javascript(servo_test, webview.clone(), is_dark_theme_script); + ensure!(result == Ok(JSValue::Boolean(false))); + + // Changing the theme updates the current page. + webview.notify_theme_change(Theme::Dark); + let result = evaluate_javascript(servo_test, webview.clone(), is_dark_theme_script); + ensure!(result == Ok(JSValue::Boolean(true))); + + delegate.reset(); + webview.load(Url::parse("data:text/html,page two").unwrap()); + servo_test.spin(move || Ok(!delegate.url_changed.get()))?; + + // The theme persists after a navigation. + let result = evaluate_javascript(servo_test, webview.clone(), is_dark_theme_script); + ensure!(result == Ok(JSValue::Boolean(true))); + + Ok(()) +} + fn main() { run_api_tests!( test_create_webview, test_evaluate_javascript_basic, + test_theme_change, // This test needs to be last, as it tests creating and dropping // a WebView right before shutdown. test_create_webview_and_immediately_drop_webview_before_shutdown diff --git a/components/servo/webview.rs b/components/servo/webview.rs index 10786ad8b69..426a9d86128 100644 --- a/components/servo/webview.rs +++ b/components/servo/webview.rs @@ -395,7 +395,10 @@ impl WebView { pub fn notify_theme_change(&self, theme: Theme) { self.inner() .constellation_proxy - .send(EmbedderToConstellationMessage::ThemeChange(theme)) + .send(EmbedderToConstellationMessage::ThemeChange( + self.id(), + theme, + )) } pub fn load(&self, url: Url) { |