diff options
author | bors-servo <metajack+bors@gmail.com> | 2015-09-30 22:49:41 -0600 |
---|---|---|
committer | bors-servo <metajack+bors@gmail.com> | 2015-09-30 22:49:41 -0600 |
commit | a7743052cad0387733c90940fa91733ede32772c (patch) | |
tree | a84bb75c3ac7df84f34b19adb51438f39fc0b816 /components/script | |
parent | 0860be4c28ebaee36a0df4de3510d917b0e08cb7 (diff) | |
parent | d0ace58452c704a3888b3a32a8242a5217b44274 (diff) | |
download | servo-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')
-rw-r--r-- | components/script/dom/htmlmetaelement.rs | 57 | ||||
-rw-r--r-- | components/script/dom/virtualmethods.rs | 5 | ||||
-rw-r--r-- | components/script/layout_interface.rs | 4 |
3 files changed, 63 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(); + } + } +} diff --git a/components/script/dom/virtualmethods.rs b/components/script/dom/virtualmethods.rs index 137843fb5ff..639b1ebd756 100644 --- a/components/script/dom/virtualmethods.rs +++ b/components/script/dom/virtualmethods.rs @@ -20,6 +20,7 @@ use dom::bindings::codegen::InheritTypes::HTMLIFrameElementCast; use dom::bindings::codegen::InheritTypes::HTMLImageElementCast; use dom::bindings::codegen::InheritTypes::HTMLInputElementCast; use dom::bindings::codegen::InheritTypes::HTMLLinkElementCast; +use dom::bindings::codegen::InheritTypes::HTMLMetaElementCast; use dom::bindings::codegen::InheritTypes::HTMLObjectElementCast; use dom::bindings::codegen::InheritTypes::HTMLOptGroupElementCast; use dom::bindings::codegen::InheritTypes::HTMLOptionElementCast; @@ -179,6 +180,10 @@ pub fn vtable_for<'a>(node: &'a Node) -> &'a (VirtualMethods + 'a) { let element = HTMLLinkElementCast::to_ref(node).unwrap(); element as &'a (VirtualMethods + 'a) } + NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLMetaElement)) => { + let element = HTMLMetaElementCast::to_ref(node).unwrap(); + element as &'a (VirtualMethods + 'a) + } NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLObjectElement)) => { let element = HTMLObjectElementCast::to_ref(node).unwrap(); element as &'a (VirtualMethods + 'a) diff --git a/components/script/layout_interface.rs b/components/script/layout_interface.rs index 230ebe79692..9647ddd4376 100644 --- a/components/script/layout_interface.rs +++ b/components/script/layout_interface.rs @@ -28,6 +28,7 @@ use string_cache::Atom; use style::animation::PropertyAnimation; use style::media_queries::MediaQueryList; use style::stylesheets::Stylesheet; +use style::viewport::ViewportRule; use url::Url; pub use dom::node::TrustedNodeAddress; @@ -39,6 +40,9 @@ pub enum Msg { /// Adds the given stylesheet to the document. LoadStylesheet(Url, MediaQueryList, PendingAsyncLoad, Box<StylesheetLoadResponder + Send>), + /// Adds a @viewport rule (translated from a <META name="viewport"> element) to the document. + AddMetaViewport(ViewportRule), + /// Puts a document into quirks mode, causing the quirks mode stylesheet to be loaded. SetQuirksMode, |