aboutsummaryrefslogtreecommitdiffstats
path: root/components/servo
diff options
context:
space:
mode:
Diffstat (limited to 'components/servo')
-rw-r--r--components/servo/Cargo.toml1
-rw-r--r--components/servo/lib.rs9
-rw-r--r--components/servo/tests/webview.rs39
-rw-r--r--components/servo/webview.rs5
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) {