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
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

@@ -36,3 +36,4 @@ Servo.app
.vscode

/unminified-js

@@ -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,
)
},
}
}
}
@@ -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]
@@ -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,
{}
]
],
"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",
"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"
@@ -0,0 +1 @@
prefs: ["dom.microdata.testing.enabled:true"]
@@ -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>
@@ -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>
@@ -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>
@@ -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>
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.