Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added implementation for itemprop and itemtype along with test files #19038

Merged
merged 1 commit into from
Nov 6, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,4 @@ Servo.app
.vscode

/unminified-js

46 changes: 46 additions & 0 deletions components/script/dom/htmlelement.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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() {
Expand Down Expand Up @@ -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,
)
},
}
}
}
5 changes: 5 additions & 0 deletions components/script/dom/webidls/HTMLElement.webidl
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
1 change: 1 addition & 0 deletions resources/prefs.json
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
50 changes: 50 additions & 0 deletions tests/wpt/mozilla/meta/MANIFEST.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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"
Expand Down
1 change: 1 addition & 0 deletions tests/wpt/mozilla/meta/mozilla/microdata/__dir__.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
prefs: ["dom.microdata.testing.enabled:true"]
48 changes: 48 additions & 0 deletions tests/wpt/mozilla/tests/mozilla/microdata/dup_prop_type_test.html
Original file line number Diff line number Diff line change
@@ -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>
49 changes: 49 additions & 0 deletions tests/wpt/mozilla/tests/mozilla/microdata/extra_space_test.html
Original file line number Diff line number Diff line change
@@ -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>
48 changes: 48 additions & 0 deletions tests/wpt/mozilla/tests/mozilla/microdata/none_check.html
Original file line number Diff line number Diff line change
@@ -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>
Original file line number Diff line number Diff line change
@@ -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>