aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmlmetaelement.rs
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2015-09-30 22:49:41 -0600
committerbors-servo <metajack+bors@gmail.com>2015-09-30 22:49:41 -0600
commita7743052cad0387733c90940fa91733ede32772c (patch)
treea84bb75c3ac7df84f34b19adb51438f39fc0b816 /components/script/dom/htmlmetaelement.rs
parent0860be4c28ebaee36a0df4de3510d917b0e08cb7 (diff)
parentd0ace58452c704a3888b3a32a8242a5217b44274 (diff)
downloadservo-a7743052cad0387733c90940fa91733ede32772c.tar.gz
servo-a7743052cad0387733c90940fa91733ede32772c.zip
Auto merge of #6185 - luniv:viewport-meta, r=mbrubeck
Implement <meta name=viewport> handling Translate <meta name=viewport> as according to [CSS Device Adaption § 9](http://dev.w3.org/csswg/css-device-adapt/#viewport-meta) Note: as the PR currently stands, handling `<meta name=viewport>` elements always occurs. This is probably not desired for some contexts (e.g. desktop), but I'm unsure of how to conditionally handle elements based on that. <!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/6185) <!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/htmlmetaelement.rs')
-rw-r--r--components/script/dom/htmlmetaelement.rs57
1 files changed, 54 insertions, 3 deletions
diff --git a/components/script/dom/htmlmetaelement.rs b/components/script/dom/htmlmetaelement.rs
index 1bf78c66c8e..d7f4328bbfc 100644
--- a/components/script/dom/htmlmetaelement.rs
+++ b/components/script/dom/htmlmetaelement.rs
@@ -5,13 +5,18 @@
use dom::bindings::codegen::Bindings::HTMLMetaElementBinding;
use dom::bindings::codegen::Bindings::HTMLMetaElementBinding::HTMLMetaElementMethods;
use dom::bindings::codegen::InheritTypes::HTMLMetaElementDerived;
-use dom::bindings::js::Root;
+use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLElementCast, NodeCast};
+use dom::bindings::js::{Root, RootedReference};
use dom::document::Document;
use dom::element::ElementTypeId;
use dom::eventtarget::{EventTarget, EventTargetTypeId};
use dom::htmlelement::{HTMLElement, HTMLElementTypeId};
-use dom::node::{Node, NodeTypeId};
-use util::str::DOMString;
+use dom::node::{Node, NodeTypeId, window_from_node};
+use dom::virtualmethods::VirtualMethods;
+use layout_interface::{LayoutChan, Msg};
+use std::ascii::AsciiExt;
+use style::viewport::ViewportRule;
+use util::str::{DOMString, HTML_SPACE_CHARACTERS};
#[dom_struct]
pub struct HTMLMetaElement {
@@ -42,6 +47,35 @@ impl HTMLMetaElement {
let element = HTMLMetaElement::new_inherited(localName, prefix, document);
Node::reflect_node(box element, document, HTMLMetaElementBinding::Wrap)
}
+
+ fn process_attributes(&self) {
+ let element = ElementCast::from_ref(self);
+ if let Some(name) = element.get_attribute(&ns!(""), &atom!("name")).r() {
+ let name = name.value().to_ascii_lowercase();
+ let name = name.trim_matches(HTML_SPACE_CHARACTERS);
+
+ match name {
+ "viewport" => self.translate_viewport(),
+ _ => {}
+ }
+ }
+ }
+
+ fn translate_viewport(&self) {
+ let element = ElementCast::from_ref(self);
+ if let Some(content) = element.get_attribute(&ns!(""), &atom!("content")).r() {
+ let content = content.value();
+ if !content.is_empty() {
+ if let Some(translated_rule) = ViewportRule::from_meta(&**content) {
+ let node = NodeCast::from_ref(self);
+ let win = window_from_node(node);
+ let LayoutChan(ref layout_chan) = win.r().layout_chan();
+
+ layout_chan.send(Msg::AddMetaViewport(translated_rule)).unwrap();
+ }
+ }
+ }
+ }
}
impl HTMLMetaElementMethods for HTMLMetaElement {
@@ -57,3 +91,20 @@ impl HTMLMetaElementMethods for HTMLMetaElement {
// https://html.spec.whatwg.org/multipage/#dom-meta-content
make_setter!(SetContent, "content");
}
+
+impl VirtualMethods for HTMLMetaElement {
+ fn super_type<'b>(&'b self) -> Option<&'b VirtualMethods> {
+ let htmlelement: &HTMLElement = HTMLElementCast::from_ref(self);
+ Some(htmlelement as &VirtualMethods)
+ }
+
+ fn bind_to_tree(&self, tree_in_doc: bool) {
+ if let Some(ref s) = self.super_type() {
+ s.bind_to_tree(tree_in_doc);
+ }
+
+ if tree_in_doc {
+ self.process_attributes();
+ }
+ }
+}