aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--components/script/dom/htmlelement.rs46
-rw-r--r--components/script/dom/webidls/HTMLElement.webidl5
-rw-r--r--resources/prefs.json1
-rw-r--r--tests/wpt/mozilla/meta/MANIFEST.json50
-rw-r--r--tests/wpt/mozilla/meta/mozilla/microdata/__dir__.ini1
-rw-r--r--tests/wpt/mozilla/tests/mozilla/microdata/dup_prop_type_test.html48
-rw-r--r--tests/wpt/mozilla/tests/mozilla/microdata/extra_space_test.html49
-rw-r--r--tests/wpt/mozilla/tests/mozilla/microdata/none_check.html48
-rw-r--r--tests/wpt/mozilla/tests/mozilla/microdata/regular_prop_type_test.html48
-rw-r--r--tests/wpt/mozilla/tests/mozilla/microdata/single_prop_type_test.html48
11 files changed, 345 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index f6cf0b30e19..1a75979e55a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,3 +36,4 @@ Servo.app
.vscode
/unminified-js
+
diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs
index 616b69ebb95..d29251cb597 100644
--- a/components/script/dom/htmlelement.rs
+++ b/components/script/dom/htmlelement.rs
@@ -31,6 +31,7 @@ use dom::virtualmethods::VirtualMethods;
use dom_struct::dom_struct;
use html5ever::{LocalName, Prefix};
use std::ascii::AsciiExt;
+use std::collections::HashSet;
use std::default::Default;
use std::rc::Rc;
use style::attr::AttrValue;
@@ -277,6 +278,38 @@ impl HTMLElementMethods for HTMLElement {
}
}
+ // https://html.spec.whatwg.org/multipage/#attr-itemtype
+ fn Itemtypes(&self) -> Option<Vec<DOMString>> {
+ let atoms = self.element.get_tokenlist_attribute(&local_name!("itemtype"), );
+
+ if atoms.is_empty() {
+ return None;
+ }
+
+ let mut item_attr_values = HashSet::new();
+ for attr_value in &atoms {
+ item_attr_values.insert(DOMString::from(String::from(attr_value.trim())));
+ }
+
+ Some(item_attr_values.into_iter().collect())
+ }
+
+ // https://html.spec.whatwg.org/multipage/#names:-the-itemprop-attribute
+ fn PropertyNames(&self) -> Option<Vec<DOMString>> {
+ let atoms = self.element.get_tokenlist_attribute(&local_name!("itemprop"), );
+
+ if atoms.is_empty() {
+ return None;
+ }
+
+ let mut item_attr_values = HashSet::new();
+ for attr_value in &atoms {
+ item_attr_values.insert(DOMString::from(String::from(attr_value.trim())));
+ }
+
+ Some(item_attr_values.into_iter().collect())
+ }
+
// https://html.spec.whatwg.org/multipage/#dom-click
fn Click(&self) {
if !self.upcast::<Element>().disabled_state() {
@@ -577,4 +610,17 @@ impl VirtualMethods for HTMLElement {
}
self.update_sequentially_focusable_status();
}
+
+ fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue {
+ match name {
+ &local_name!("itemprop") => AttrValue::from_serialized_tokenlist(value.into()),
+ &local_name!("itemtype") => AttrValue::from_serialized_tokenlist(value.into()),
+ _ => {
+ self.super_type().unwrap().parse_plain_attribute(
+ name,
+ value,
+ )
+ },
+ }
+ }
}
diff --git a/components/script/dom/webidls/HTMLElement.webidl b/components/script/dom/webidls/HTMLElement.webidl
index 845b4445f9c..7c1b0d62c21 100644
--- a/components/script/dom/webidls/HTMLElement.webidl
+++ b/components/script/dom/webidls/HTMLElement.webidl
@@ -18,9 +18,14 @@ interface HTMLElement : Element {
// microdata
// attribute boolean itemScope;
+
// attribute DOMString itemId;
//readonly attribute HTMLPropertiesCollection properties;
// attribute any itemValue; // acts as DOMString on setting
+ [Pref="dom.microdata.testing.enabled"]
+ sequence<DOMString>? propertyNames();
+ [Pref="dom.microdata.testing.enabled"]
+ sequence<DOMString>? itemtypes();
// user interaction
[CEReactions]
diff --git a/resources/prefs.json b/resources/prefs.json
index d430b9f4e4b..1c5a5c92943 100644
--- a/resources/prefs.json
+++ b/resources/prefs.json
@@ -6,6 +6,7 @@
"dom.customelements.enabled": true,
"dom.forcetouch.enabled": false,
"dom.gamepad.enabled": false,
+ "dom.microdata.testing.enabled": true,
"dom.mouseevent.which.enabled": false,
"dom.mozbrowser.enabled": false,
"dom.mutation_observer.enabled": false,
diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json
index b292757f89e..4b4030f0d53 100644
--- a/tests/wpt/mozilla/meta/MANIFEST.json
+++ b/tests/wpt/mozilla/meta/MANIFEST.json
@@ -33350,6 +33350,36 @@
{}
]
],
+ "mozilla/microdata/dup_prop_type_test.html": [
+ [
+ "/_mozilla/mozilla/microdata/dup_prop_type_test.html",
+ {}
+ ]
+ ],
+ "mozilla/microdata/extra_space_test.html": [
+ [
+ "/_mozilla/mozilla/microdata/extra_space_test.html",
+ {}
+ ]
+ ],
+ "mozilla/microdata/none_check.html": [
+ [
+ "/_mozilla/mozilla/microdata/none_check.html",
+ {}
+ ]
+ ],
+ "mozilla/microdata/regular_prop_type_test.html": [
+ [
+ "/_mozilla/mozilla/microdata/regular_prop_type_test.html",
+ {}
+ ]
+ ],
+ "mozilla/microdata/single_prop_type_test.html": [
+ [
+ "/_mozilla/mozilla/microdata/single_prop_type_test.html",
+ {}
+ ]
+ ],
"mozilla/mime_sniffing_font_context.html": [
[
"/_mozilla/mozilla/mime_sniffing_font_context.html",
@@ -66385,6 +66415,26 @@
"4e0b6d4c416e2e3f26de64e9364f0a8c7a6dc5cb",
"testharness"
],
+ "mozilla/microdata/dup_prop_type_test.html": [
+ "4837cf896419aba6d1df6e89c5849a786d4e4be0",
+ "testharness"
+ ],
+ "mozilla/microdata/extra_space_test.html": [
+ "0a941e2eb10013ab55049d4d6007d8301149f651",
+ "testharness"
+ ],
+ "mozilla/microdata/none_check.html": [
+ "5addb47e08bdb4ad8293f22dffe95e4760336e08",
+ "testharness"
+ ],
+ "mozilla/microdata/regular_prop_type_test.html": [
+ "8e67711c47afe50edaa9b6baaa1349862e639e2e",
+ "testharness"
+ ],
+ "mozilla/microdata/single_prop_type_test.html": [
+ "0d81eecf7e52feb0964e879ffe9450881141caa5",
+ "testharness"
+ ],
"mozilla/mime_sniffing_font_context.html": [
"1311e72e0a0dafa6fae594ca1ce2deca164acd36",
"testharness"
diff --git a/tests/wpt/mozilla/meta/mozilla/microdata/__dir__.ini b/tests/wpt/mozilla/meta/mozilla/microdata/__dir__.ini
new file mode 100644
index 00000000000..f199618497d
--- /dev/null
+++ b/tests/wpt/mozilla/meta/mozilla/microdata/__dir__.ini
@@ -0,0 +1 @@
+prefs: ["dom.microdata.testing.enabled:true"]
diff --git a/tests/wpt/mozilla/tests/mozilla/microdata/dup_prop_type_test.html b/tests/wpt/mozilla/tests/mozilla/microdata/dup_prop_type_test.html
new file mode 100644
index 00000000000..23afa74863c
--- /dev/null
+++ b/tests/wpt/mozilla/tests/mozilla/microdata/dup_prop_type_test.html
@@ -0,0 +1,48 @@
+<!doctype html>
+<meta charset="utf-8">
+<html>
+
+<head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <title>Duplicate ItemProperty and ItemType test</title>
+</head>
+
+<body id="body" itemprop="hello world world" itemtype="hello world world">
+
+ <h1 id="h1" itemprop="hello world world" itemtype="hello world world">Header H1</h1>
+ <h2 id="h2" itemprop="hello world world" itemtype="hello world world">Header H2</h2>
+
+ <p id="p" itemprop="hello world world" itemtype="hello world world">Paragraph</p>
+
+ <form id="form" itemprop="hello world world" itemtype="hello world world">
+ <input id="input" itemprop="hello world world" itemtype="hello world world">Input Field in form</input>
+ </form>
+
+ <ul id="ul" itemprop="hello world world" itemtype="hello world world">
+ <li id="li" itemprop="hello world world" itemtype="hello world world">Unordered List Item</li>
+ </ul>
+
+ <meta id="meta" itemprop="hello world world" itemtype="hello world world">Meta Tag</meta>
+
+ <table id="table" itemprop="hello world world" itemtype="hello world world">Table</table>
+
+ <div id="div" itemprop="hello world world" itemtype="hello world world">Hi</div>
+
+ <a id="anchor" itemprop="hello world world" itemtype="hello world world"></a>
+
+</body>
+
+<script>
+ test(function() {
+ // Test all elements
+ var ids = ["body", "h1", "h2", "p", "input", "form", "li", "ul", "meta", "table", "div", "anchor"];
+ for (let id of ids) {
+ var elem = document.getElementById(id);
+ assert_array_equals(elem.propertyNames().sort(), ["hello", "world"].sort(), "The method should return 'hello world' ");
+ assert_array_equals(elem.itemtypes().sort(), ["hello", "world"].sort(), "The method should return 'hello world' ");
+ }
+ });
+</script>
+
+</html>
diff --git a/tests/wpt/mozilla/tests/mozilla/microdata/extra_space_test.html b/tests/wpt/mozilla/tests/mozilla/microdata/extra_space_test.html
new file mode 100644
index 00000000000..8ca5ff58729
--- /dev/null
+++ b/tests/wpt/mozilla/tests/mozilla/microdata/extra_space_test.html
@@ -0,0 +1,49 @@
+<!doctype html>
+<meta charset="utf-8">
+<html>
+<head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <title>Extra Space ItemProperty and ItemType test</title>
+</head>
+
+<body id="body" itemprop=" hello world " itemtype=" hello world ">
+
+ <h1 id="h1" itemprop=" hello world " itemtype=" hello world ">Header H1</h1>
+ <h2 id="h2" itemprop=" hello world " itemtype=" hello world ">Header H2</h2>
+
+ <p id="p" itemprop=" hello world " itemtype=" hello world ">Paragraph</p>
+
+ <form id="form" itemprop=" hello world " itemtype=" hello world ">
+ <input id="input" itemprop=" hello world " itemtype=" hello world ">Input Field in form</input>
+ </form>
+
+ <ul id="ul" itemprop=" hello world " itemtype=" hello world ">
+ <li id="li" itemprop=" hello world " itemtype=" hello world ">Unordered List Item</li>
+ </ul>
+
+ <meta id="meta" itemprop=" hello world " itemtype=" hello world ">Meta Tag</meta>
+
+ <table id="table" itemprop=" hello world " itemtype=" hello world ">Table</table>
+
+ <div id="div" itemprop=" hello world " itemtype=" hello world ">Hi</div>
+
+ <a id="anchor" itemprop=" hello world " itemtype=" hello world "></a>
+
+</body>
+
+<script>
+ test(function() {
+ // Test all elements
+ var ids = ["body", "h1", "h2", "p", "input", "form", "li", "ul", "meta", "table", "div", "anchor"];
+ for (let id of ids) {
+ var elem = document.getElementById(id);
+ assert_array_equals(elem.propertyNames().sort(), ["hello", "world"].sort(), "The method should return 'hello world' ");
+ assert_array_equals(elem.itemtypes().sort(), ["hello", "world"].sort(), "The method should return 'hello world' ");
+ }
+
+
+ });
+</script>
+
+</html>
diff --git a/tests/wpt/mozilla/tests/mozilla/microdata/none_check.html b/tests/wpt/mozilla/tests/mozilla/microdata/none_check.html
new file mode 100644
index 00000000000..9cd9444a992
--- /dev/null
+++ b/tests/wpt/mozilla/tests/mozilla/microdata/none_check.html
@@ -0,0 +1,48 @@
+<!doctype html>
+<meta charset="utf-8">
+<html>
+
+<head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <title>None check test</title>
+</head>
+
+<body id="body">
+
+ <h1 id="h1">Header H1</h1>
+ <h2 id="h2">Header H2</h2>
+
+ <p id="p">Paragraph</p>
+
+ <form id="form">
+ <input id="input">Input Field in form</input>
+ </form>
+
+ <ul id="ul">
+ <li id="li">Unordered List Item</li>
+ </ul>
+
+ <meta id="meta">Meta Tag</meta>
+
+ <table id="table">Table</table>
+
+ <div id="div">Hi</div>
+
+ <a id="anchor"></a>
+
+</body>
+
+<script>
+ test(function() {
+ // Test all elements
+ var ids = ["body", "h1", "h2", "p", "input", "form", "li", "ul", "meta", "table", "div", "anchor"];
+ for (let id of ids) {
+ var elem = document.getElementById(id);
+ assert_equals(elem.propertyNames(), null, "The method should return null ");
+ assert_equals(elem.itemtypes(), null, "The method should return null ");
+ }
+ });
+</script>
+
+</html>
diff --git a/tests/wpt/mozilla/tests/mozilla/microdata/regular_prop_type_test.html b/tests/wpt/mozilla/tests/mozilla/microdata/regular_prop_type_test.html
new file mode 100644
index 00000000000..e7b55d96d99
--- /dev/null
+++ b/tests/wpt/mozilla/tests/mozilla/microdata/regular_prop_type_test.html
@@ -0,0 +1,48 @@
+<!doctype html>
+<meta charset="utf-8">
+<html>
+
+<head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <title>Regular ItemProperty and ItemType test</title>
+</head>
+
+<body id="body" itemprop="hello world" itemtype="hello world">
+
+ <h1 id="h1" itemprop="hello world" itemtype="hello world">Header H1</h1>
+ <h2 id="h2" itemprop="hello world" itemtype="hello world">Header H2</h2>
+
+ <p id="p" itemprop="hello world" itemtype="hello world">Paragraph</p>
+
+ <form id="form" itemprop="hello world" itemtype="hello world">
+ <input id="input" itemprop="hello world" itemtype="hello world">Input Field in form</input>
+ </form>
+
+ <ul id="ul" itemprop="hello world" itemtype="hello world">
+ <li id="li" itemprop="hello world" itemtype="hello world">Unordered List Item</li>
+ </ul>
+
+ <meta id="meta" itemprop="hello world" itemtype="hello world">Meta Tag</meta>
+
+ <table id="table" itemprop="hello world" itemtype="hello world">Table</table>
+
+ <div id="div" itemprop="hello world" itemtype="hello world">Hi</div>
+
+ <a id="anchor" itemprop="hello world" itemtype="hello world"></a>
+
+</body>
+
+<script>
+ test(function() {
+ // Test all elements
+ var ids = ["body", "h1", "h2", "p", "input", "form", "li", "ul", "meta", "table", "div", "anchor"];
+ for (let id of ids) {
+ var elem = document.getElementById(id);
+ assert_array_equals(elem.propertyNames().sort(), ["hello", "world"].sort(), "The method should return 'hello world' ");
+ assert_array_equals(elem.itemtypes().sort(), ["hello", "world"].sort(), "The method should return 'hello world' ");
+ }
+ });
+</script>
+
+</html>
diff --git a/tests/wpt/mozilla/tests/mozilla/microdata/single_prop_type_test.html b/tests/wpt/mozilla/tests/mozilla/microdata/single_prop_type_test.html
new file mode 100644
index 00000000000..15d6a413297
--- /dev/null
+++ b/tests/wpt/mozilla/tests/mozilla/microdata/single_prop_type_test.html
@@ -0,0 +1,48 @@
+<!doctype html>
+<meta charset="utf-8">
+<html>
+
+<head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <title>Single ItemProperty and ItemType test</title>
+</head>
+
+<body id="body" itemprop="Hello" itemtype="Hello">
+
+ <h1 id="h1" itemprop="Hello" itemtype="Hello">Header H1</h1>
+ <h2 id="h2" itemprop="Hello" itemtype="Hello">Header H2</h2>
+
+ <p id="p" itemprop="Hello" itemtype="Hello">Paragraph</p>
+
+ <form id="form" itemprop="Hello" itemtype="Hello">
+ <input id="input" itemprop="Hello" itemtype="Hello">Input Field in form</input>
+ </form>
+
+ <ul id="ul" itemprop="Hello" itemtype="Hello">
+ <li id="li" itemprop="Hello" itemtype="Hello">Unordered List Item</li>
+ </ul>
+
+ <meta id="meta" itemprop="Hello" itemtype="Hello">Meta Tag</meta>
+
+ <table id="table" itemprop="Hello" itemtype="Hello">Table</table>
+
+ <div id="div" itemprop="Hello" itemtype="Hello">Hi</div>
+
+ <a id="anchor" itemprop="Hello" itemtype="Hello"></a>
+
+</body>
+
+<script>
+ test(function() {
+ // Test all elements
+ var ids = ["body", "h1", "h2", "p", "input", "form", "li", "ul", "meta", "table", "div", "anchor"];
+ for (let id of ids) {
+ var elem = document.getElementById(id);
+ assert_array_equals(elem.propertyNames(), ["Hello"], "The method should return 'Hello' ");
+ assert_array_equals(elem.itemtypes(), ["Hello"], "The method should return 'Hello' ");
+ }
+ });
+</script>
+
+</html>