Auto merge of #19038 - CJ8664:master, r=jdm

Added implementation for itemprop and itemtype along with test files

<!-- Please describe your changes on the following line: -->

---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: -->
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors

<!-- Either: -->
- [x] There are tests for these changes OR

<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/19038)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2017-11-06 14:17:11 -06:00 committed by GitHub
commit 5227df260c
11 changed files with 345 additions and 0 deletions

1
.gitignore vendored
View file

@ -36,3 +36,4 @@ Servo.app
.vscode
/unminified-js

View file

@ -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,
)
},
}
}
}

View file

@ -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]

View file

@ -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,

View file

@ -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"

View file

@ -0,0 +1 @@
prefs: ["dom.microdata.testing.enabled:true"]

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>