aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorJames Gilbertson <james.gilbertson@luniv.ca>2015-05-25 20:05:09 -0600
committerJamie Gilbertson <jamie.gilbertson@luniv.ca>2015-09-30 20:31:35 -0700
commitd0ace58452c704a3888b3a32a8242a5217b44274 (patch)
tree66e6f25cbe21b23363b6076629fcd63c951c77a7 /components
parent61f7a0a1ee667131ca8d4230c4dbea36044ee5cb (diff)
downloadservo-d0ace58452c704a3888b3a32a8242a5217b44274.tar.gz
servo-d0ace58452c704a3888b3a32a8242a5217b44274.zip
Handle <meta name=viewport> elements when added to document
Diffstat (limited to 'components')
-rw-r--r--components/layout/layout_task.rs20
-rw-r--r--components/script/dom/htmlmetaelement.rs57
-rw-r--r--components/script/dom/virtualmethods.rs5
-rw-r--r--components/script/layout_interface.rs4
4 files changed, 81 insertions, 5 deletions
diff --git a/components/layout/layout_task.rs b/components/layout/layout_task.rs
index 3535b8137df..ee77270e62b 100644
--- a/components/layout/layout_task.rs
+++ b/components/layout/layout_task.rs
@@ -78,8 +78,9 @@ use style::media_queries::{Device, MediaQueryList, MediaType};
use style::properties::longhands::{display, position};
use style::properties::style_structs;
use style::selector_matching::Stylist;
-use style::stylesheets::{CSSRuleIteratorExt, Origin, Stylesheet};
+use style::stylesheets::{CSSRule, CSSRuleIteratorExt, Origin, Stylesheet};
use style::values::AuExtensionMethods;
+use style::viewport::ViewportRule;
use url::Url;
use util::geometry::{MAX_RECT, ZERO_POINT};
use util::ipc::OptionalIpcSender;
@@ -618,6 +619,9 @@ impl LayoutTask {
possibly_locked_rw_data)
}
Msg::SetQuirksMode => self.handle_set_quirks_mode(possibly_locked_rw_data),
+ Msg::AddMetaViewport(translated_rule) => {
+ self.handle_add_meta_viewport(translated_rule, possibly_locked_rw_data)
+ }
Msg::GetRPC(response_chan) => {
response_chan.send(box LayoutRPCImpl(self.rw_data.clone()) as
Box<LayoutRPC + Send>).unwrap();
@@ -823,6 +827,19 @@ impl LayoutTask {
LayoutTask::return_rw_data(possibly_locked_rw_data, rw_data);
}
+ fn handle_add_meta_viewport<'a>(&'a self,
+ translated_rule: ViewportRule,
+ possibly_locked_rw_data:
+ &mut Option<MutexGuard<'a, LayoutTaskData>>)
+ {
+ let mut rw_data = self.lock_rw_data(possibly_locked_rw_data);
+ rw_data.stylist.add_stylesheet(Stylesheet {
+ rules: vec![CSSRule::Viewport(translated_rule)],
+ origin: Origin::Author
+ });
+ LayoutTask::return_rw_data(possibly_locked_rw_data, rw_data);
+ }
+
/// Sets quirks mode for the document, causing the quirks mode stylesheet to be loaded.
fn handle_set_quirks_mode<'a>(&'a self,
possibly_locked_rw_data:
@@ -1657,4 +1674,3 @@ fn get_root_flow_background_color(flow: &mut Flow) -> AzColor {
.resolve_color(kid_block_flow.fragment.style.get_background().background_color)
.to_gfx_color()
}
-
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,