aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorShubham Gupta <32428749+shubhamg13@users.noreply.github.com>2025-06-06 23:13:51 +0800
committerGitHub <noreply@github.com>2025-06-06 15:13:51 +0000
commitaff2a8537216fb2f8a18f2c6e2cf47b34d455f48 (patch)
tree2274bf367de4dd417077290df4a7af0fc7094c07 /components/script
parentc7a215faba8ed2ebfa1624b020d82303130f0c9e (diff)
downloadservo-aff2a8537216fb2f8a18f2c6e2cf47b34d455f48.tar.gz
servo-aff2a8537216fb2f8a18f2c6e2cf47b34d455f48.zip
Add support for parsing and applying `viewport` `<meta>` (#35901)
This patch comprises following steps: 1. Parses the `viewport` Attribute from `<meta>`. 2. Creates a `ViewportDescription` struct. 3. Populate values into Viewport struct. 4. Pass & Stash Viewport Description to Webview. 5. Process parsed values of `viewport <meta>` Testing: Tested locally. Fixes: #36159 --------- Signed-off-by: Shubham Gupta <shubham13297@gmail.com> Signed-off-by: Xiaocheng Hu <xiaochengh.work@gmail.com> Co-authored-by: Xiaocheng Hu <xiaochengh.work@gmail.com>
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/htmlmetaelement.rs30
1 files changed, 30 insertions, 0 deletions
diff --git a/components/script/dom/htmlmetaelement.rs b/components/script/dom/htmlmetaelement.rs
index e94a5e1ff33..4ec6db7212c 100644
--- a/components/script/dom/htmlmetaelement.rs
+++ b/components/script/dom/htmlmetaelement.rs
@@ -2,6 +2,10 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+use std::str::FromStr;
+
+use compositing_traits::CompositorMsg;
+use compositing_traits::viewport_description::ViewportDescription;
use dom_struct::dom_struct;
use html5ever::{LocalName, Prefix, local_name, ns};
use js::rust::HandleObject;
@@ -61,6 +65,9 @@ impl HTMLMetaElement {
if name == "referrer" {
self.apply_referrer();
}
+ if name == "viewport" {
+ self.parse_and_send_viewport_if_necessary();
+ }
// https://html.spec.whatwg.org/multipage/#attr-meta-http-equiv
} else if !self.HttpEquiv().is_empty() {
// TODO: Implement additional http-equiv candidates
@@ -115,6 +122,29 @@ impl HTMLMetaElement {
}
}
+ /// <https://drafts.csswg.org/css-viewport/#parsing-algorithm>
+ fn parse_and_send_viewport_if_necessary(&self) {
+ // Skip processing if this isn't the top level frame
+ if !self.owner_window().is_top_level() {
+ return;
+ }
+ let element = self.upcast::<Element>();
+ let Some(content) = element.get_attribute(&ns!(), &local_name!("content")) else {
+ return;
+ };
+
+ if let Ok(viewport) = ViewportDescription::from_str(&content.value()) {
+ self.owner_window()
+ .compositor_api()
+ .sender()
+ .send(CompositorMsg::Viewport(
+ self.owner_window().webview_id(),
+ viewport,
+ ))
+ .unwrap();
+ }
+ }
+
/// <https://html.spec.whatwg.org/multipage/#attr-meta-http-equiv-content-security-policy>
fn apply_csp_list(&self) {
if let Some(parent) = self.upcast::<Node>().GetParentElement() {