Update web-platform-tests to revision acdb8bf3e4714528b6b5f9ff038dc80ee4fb7dcf

This commit is contained in:
Ms2ger 2015-04-27 00:43:52 +02:00
parent 56a7981c9c
commit 93b883e1db
27 changed files with 1021 additions and 165 deletions

View file

@ -144,13 +144,6 @@
assert_equals(battery.onchargingchange, null, desc);
}, 'onchargingchange: treat array as null');
test(function() {
var desc = 'onchargingchange did not treat noncallable host object as null';
battery.onchargingchange = function() {};
battery.onchargingchange = Node;
assert_equals(battery.onchargingchange, null, desc);
}, 'onchargingchange: treat non-callable host object as null');
// attribute EventHandler onchargingtimechange;
test(function() {
@ -214,13 +207,6 @@
assert_equals(battery.onchargingtimechange, null, desc);
}, 'onchargingtimechange: treat array as null');
test(function() {
var desc = 'onchargingtimechange did not treat noncallable host object as null';
battery.onchargingtimechange = function() {};
battery.onchargingtimechange = Node;
assert_equals(battery.onchargingtimechange, null, desc);
}, 'onchargingtimechange: treat non-callable host object as null');
// attribute EventHandler ondischargingtimechange;
test(function() {
@ -284,13 +270,6 @@
assert_equals(battery.ondischargingtimechange, null, desc);
}, 'ondischargingtimechange: treat array as null');
test(function() {
var desc = 'ondischargingtimechange did not treat noncallable host object as null';
battery.ondischargingtimechange = function() {};
battery.ondischargingtimechange = Node;
assert_equals(battery.ondischargingtimechange, null, desc);
}, 'ondischargingtimechange: treat non-callable host object as null');
// attribute EventHandler onlevelchange;
test(function() {
@ -354,13 +333,6 @@
assert_equals(battery.onlevelchange, null, desc);
}, 'onlevelchange: treat array as null');
test(function() {
var desc = 'onlevelchange did not treat noncallable host object as null';
battery.onlevelchange = function() {};
battery.onlevelchange = Node;
assert_equals(battery.onlevelchange, null, desc);
}, 'onlevelchange: treat non-callable host object as null');
done();
}, function () {});

View file

@ -7,8 +7,8 @@
var invalidLabel = "invalid-invalidLabel"
test(function() {
assert_throws({name: 'RangeError'}, function() { new TextEncoder(invalidLabel); });
assert_throws({name: 'RangeError'}, function() { new TextDecoder(invalidLabel); });
assert_throws(new RangeError(), function() { new TextEncoder(invalidLabel); });
assert_throws(new RangeError(), function() { new TextDecoder(invalidLabel); });
}, 'Invalid label "' + invalidLabel + '" should be rejected by API.');
</script>

View file

@ -6,8 +6,8 @@
<script>
test(function() {
assert_throws({name: 'RangeError'}, function() { new TextEncoder('replacement'); });
assert_throws({name: 'RangeError'}, function() { new TextDecoder('replacement'); });
assert_throws(new RangeError(), function() { new TextEncoder('replacement'); });
assert_throws(new RangeError(), function() { new TextDecoder('replacement'); });
}, 'The "replacement" label should not be a known encoding.');
encodings_table.forEach(function(section) {
@ -16,8 +16,8 @@ encodings_table.forEach(function(section) {
}).forEach(function(encoding) {
encoding.labels.forEach(function(label) {
test(function() {
assert_throws({name: 'RangeError'}, function() { new TextEncoder(label); });
assert_throws({name: 'RangeError'}, function() { new TextDecoder(label); });
assert_throws(new RangeError(), function() { new TextEncoder(label); });
assert_throws(new RangeError(), function() { new TextDecoder(label); });
}, 'Label for "replacement" should be rejected by API: ' + label);
});
});

View file

@ -4,22 +4,33 @@
<script src="/resources/testharnessreport.js"></script>
<script src="resources/encodings.js"></script>
<script>
encodings_table.forEach(function(section) {
var tests = [];
setup(function() {
var whitespace = [' ', '\t', '\n', '\f', '\r'];
encodings_table.forEach(function(section) {
section.encodings.filter(function(encoding) {
return encoding.name !== 'replacement';
return encoding.name !== 'replacement';
}).forEach(function(encoding) {
var name = encoding.name;
encoding.labels.forEach(function(label) {
test(function(){
assert_equals(new TextDecoder(label).encoding, encoding.name,
'label for encoding should match');
assert_equals(new TextDecoder(label.toUpperCase()).encoding,
encoding.name,
'label matching should be case-insensitive');
}, 'name=' + name + ' label=' + label);
var name = encoding.name;
encoding.labels.forEach(function(label) {
tests.push([label, encoding.name]);
whitespace.forEach(function(ws) {
tests.push([ws + label, encoding.name]);
tests.push([label + ws, encoding.name]);
tests.push([ws + label + ws, encoding.name]);
});
});
});
});
});
tests.forEach(function(t) {
var input = t[0], output = t[1];
test(function() {
assert_equals(new TextDecoder(input).encoding, output,
'label for encoding should match');
assert_equals(new TextDecoder(input.toUpperCase()).encoding, output,
'label matching should be case-insensitive');
}, format_value(input) + " => " + format_value(output));
});
</script>

View file

@ -17,7 +17,7 @@ encodings_table.forEach(function(section) {
} else {
test(function() {
assert_equals(new TextDecoder(encoding.name).encoding, encoding.name);
assert_throws({name: 'RangeError'}, function() { new TextEncoder(encoding.name); });
assert_throws(new RangeError(), function() { new TextEncoder(encoding.name); });
}, 'Non-UTF encodings supported only for decode, not encode: ' + encoding.name);
}
});

View file

@ -0,0 +1,60 @@
<!DOCTYPE html>
<link rel="help" href="https://html.spec.whatwg.org/multipage/#document.title">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script>
var SVG_NAMESPACE = "http://www.w3.org/2000/svg";
function newSVGDocument() {
return document.implementation.createDocument(SVG_NAMESPACE, "svg");
}
test(function() {
var doc = newSVGDocument();
assert_equals(doc.title, "");
var child = doc.createElementNS(SVG_NAMESPACE, "x-child");
doc.documentElement.appendChild(child);
doc.title = "foo";
var lastChild = doc.documentElement.lastChild;
assert_equals(lastChild.namespaceURI, SVG_NAMESPACE);
assert_equals(lastChild.localName, "title");
assert_equals(lastChild.textContent, "foo");
assert_equals(doc.title, "foo");
}, "No title element in SVG document");
test(function() {
var doc = newSVGDocument();
var title = doc.createElementNS(SVG_NAMESPACE, "title");
title.textContent = "foo";
doc.documentElement.appendChild(title)
assert_equals(doc.title, "foo");
doc.title += "bar";
assert_equals(title.textContent, "foobar");
assert_equals(title.childNodes.length, 1);
assert_true(title.childNodes[0] instanceof Text);
assert_equals(doc.title, "foobar");
doc.title = "";
assert_equals(title.textContent, "");
assert_equals(doc.title, "");
assert_equals(title.childNodes.length, 0);
}, "Title element in SVG document");
test(function() {
var doc = newSVGDocument();
var title = doc.createElementNS(SVG_NAMESPACE, "title");
title.textContent = "foo";
var child = doc.createElementNS(SVG_NAMESPACE, "x-child");
child.appendChild(title);
doc.documentElement.appendChild(child);
assert_equals(doc.title, "");
}, "Title element not child of SVG root");
test(function() {
var doc = newSVGDocument();
var title = doc.createElement("title");
title.textContent = "foo";
doc.documentElement.appendChild(title);
assert_equals(doc.title, "");
}, "Title element not in SVG namespace");
</script>

View file

@ -0,0 +1,5 @@
<!doctype html>
<meta charset=utf-8>
<title>Textarea cols</title>
<link rel=match href=textarea-ref.html>
<textarea cols=20></textarea>

View file

@ -0,0 +1,5 @@
<!doctype html>
<meta charset=utf-8>
<title>Textarea cols</title>
<link rel=match href=textarea-ref.html>
<textarea cols=0></textarea>

View file

@ -0,0 +1,5 @@
<!doctype html>
<meta charset=utf-8>
<title>Textarea rows</title>
<link rel=match href=textarea-ref.html>
<textarea rows=2></textarea>

View file

@ -0,0 +1,5 @@
<!doctype html>
<meta charset=utf-8>
<title>Textarea rows</title>
<link rel=match href=textarea-ref.html>
<textarea rows=0></textarea>

View file

@ -0,0 +1,4 @@
<!doctype html>
<meta charset=utf-8>
<title>Default textarea</title>
<textarea></textarea>

View file

@ -107,10 +107,9 @@ function t(desc, func, expect) {
var img = document.querySelector('[data-desc="' + desc + '"]');
img.onload = img.onerror = this.unreached_func('update the image data was run');
if (expect == 'timeout') {
setTimeout(this.step_func_done(), 250);
setTimeout(this.step_func_done(), 1000);
} else {
img['on' + expect] = this.step_func_done(function() {});
setTimeout(this.unreached_func('update the image data was not run'), 250)
}
func.call(this, img);
}, desc);

View file

@ -23,7 +23,20 @@ function run_test() {
}, "product");
test(function() {
assert_false(navigator.taintEnabled());
// See https://www.w3.org/Bugs/Public/show_bug.cgi?id=22555
if ("window" in self) {
// If you identify as WebKit, taintEnabled should not exist.
if (navigator.userAgent.indexOf("WebKit") != -1) {
assert_false("taintEnabled" in navigator);
}
// Otherwise it should exist and return false.
else {
assert_false(navigator.taintEnabled());
}
} else {
// taintEnabled should not exist in workers.
assert_false("taintEnabled" in navigator);
}
}, "taintEnabled");
test(function() {

View file

@ -553,6 +553,11 @@ function IdlInterface(obj, is_callback) {
/** An array of IdlInterfaceMembers. */
this.members = obj.members.map(function(m){return new IdlInterfaceMember(m); });
if (this.has_extended_attribute("Unforgeable")) {
this.members
.filter(function(m) { return !m["static"] && (m.type == "attribute" || m.type == "operation"); })
.forEach(function(m) { return m.isUnforgeable = true; });
}
/**
* The name (as a string) of the type we inherit from, or null if there is
@ -1003,7 +1008,26 @@ IdlInterface.prototype.test_member_attribute = function(member)
assert_false(member.name in self[this.name].prototype,
"The prototype object must not have a property " +
format_value(member.name));
do_interface_attribute_asserts(self, member);
// Try/catch around the get here, since it can legitimately throw.
// If it does, we obviously can't check for equality with direct
// invocation of the getter.
var gotValue;
var propVal;
try {
propVal = self[member.name];
gotValue = true;
} catch (e) {
gotValue = false;
}
if (gotValue) {
var getter = Object.getOwnPropertyDescriptor(self, member.name).get;
assert_equals(typeof(getter), "function",
format_value(member.name) + " must have a getter");
assert_equals(propVal, getter.call(undefined),
"Gets on a global should not require an explicit this");
}
this.do_interface_attribute_asserts(self, member);
} else {
assert_true(member.name in self[this.name].prototype,
"The prototype object must have a property " +
@ -1017,7 +1041,7 @@ IdlInterface.prototype.test_member_attribute = function(member)
assert_equals(self[this.name].prototype[member.name], undefined,
"getting property on prototype object must return undefined");
}
do_interface_attribute_asserts(self[this.name].prototype, member);
this.do_interface_attribute_asserts(self[this.name].prototype, member);
}
}.bind(this), this.name + " interface: attribute " + member.name);
};
@ -1055,7 +1079,7 @@ IdlInterface.prototype.test_member_operation = function(member)
var memberHolderObject;
if (member["static"]) {
assert_own_property(self[this.name], member.name,
"interface prototype object missing static operation");
"interface object missing static operation");
memberHolderObject = self[this.name];
} else if (this.is_global()) {
assert_own_property(self, member.name,
@ -1067,46 +1091,66 @@ IdlInterface.prototype.test_member_operation = function(member)
memberHolderObject = self[this.name].prototype;
}
var desc = Object.getOwnPropertyDescriptor(memberHolderObject, member.name);
// "The property has attributes { [[Writable]]: true,
// [[Enumerable]]: true, [[Configurable]]: true }."
assert_false("get" in desc, "property has getter");
assert_false("set" in desc, "property has setter");
assert_true(desc.writable, "property is not writable");
assert_true(desc.enumerable, "property is not enumerable");
assert_true(desc.configurable, "property is not configurable");
// "The value of the property is a Function object whose
// behavior is as follows . . ."
assert_equals(typeof memberHolderObject[member.name], "function",
"property must be a function");
// "The value of the Function objects “length” property is
// a Number determined as follows:
// ". . .
// "Return the length of the shortest argument list of the
// entries in S."
//
// TODO: Doesn't handle overloading or variadic arguments.
assert_equals(memberHolderObject[member.name].length,
member.arguments.filter(function(arg) {
return !arg.optional;
}).length,
"property has wrong .length");
this.do_member_operation_asserts(memberHolderObject, member);
}.bind(this), this.name + " interface: operation " + member.name +
"(" + member.arguments.map(function(m) { return m.idlType.idlType; }) +
")");
};
// Make some suitable arguments
var args = member.arguments.map(function(arg) {
return create_suitable_object(arg.idlType);
});
//@}
IdlInterface.prototype.do_member_operation_asserts = function(memberHolderObject, member)
//@{
{
var operationUnforgeable = member.isUnforgeable;
var desc = Object.getOwnPropertyDescriptor(memberHolderObject, member.name);
// "The property has attributes { [[Writable]]: B,
// [[Enumerable]]: true, [[Configurable]]: B }, where B is false if the
// operation is unforgeable on the interface, and true otherwise".
assert_false("get" in desc, "property has getter");
assert_false("set" in desc, "property has setter");
assert_equals(desc.writable, !operationUnforgeable,
"property should be writable if and only if not unforgeable");
assert_true(desc.enumerable, "property is not enumerable");
assert_equals(desc.configurable, !operationUnforgeable,
"property should be configurable if and only if not unforgeable");
// "The value of the property is a Function object whose
// behavior is as follows . . ."
assert_equals(typeof memberHolderObject[member.name], "function",
"property must be a function");
// "The value of the Function objects “length” property is
// a Number determined as follows:
// ". . .
// "Return the length of the shortest argument list of the
// entries in S."
//
// TODO: Doesn't handle overloading or variadic arguments.
assert_equals(memberHolderObject[member.name].length,
member.arguments.filter(function(arg) {
return !arg.optional;
}).length,
"property has wrong .length");
// "Let O be a value determined as follows:
// ". . .
// "Otherwise, throw a TypeError."
// This should be hit if the operation is not static, there is
// no [ImplicitThis] attribute, and the this value is null.
//
// TODO: We currently ignore the [ImplicitThis] case.
if (!member["static"]) {
// Make some suitable arguments
var args = member.arguments.map(function(arg) {
return create_suitable_object(arg.idlType);
});
// "Let O be a value determined as follows:
// ". . .
// "Otherwise, throw a TypeError."
// This should be hit if the operation is not static, there is
// no [ImplicitThis] attribute, and the this value is null.
//
// TODO: We currently ignore the [ImplicitThis] case. Except we manually
// check for globals, since otherwise we'll invoke window.close(). And we
// have to skip this test for anything that on the proto chain of "self",
// since that does in fact have implicit-this behavior.
if (!member["static"]) {
if (!this.is_global() &&
memberHolderObject[member.name] != self[member.name])
{
assert_throws(new TypeError(), function() {
self[this.name].prototype[member.name].apply(null, args);
memberHolderObject[member.name].apply(null, args);
}, "calling operation with this = null didn't throw TypeError");
}
@ -1116,12 +1160,10 @@ IdlInterface.prototype.test_member_operation = function(member)
// TODO: Test a platform object that implements some other
// interface. (Have to be sure to get inheritance right.)
assert_throws(new TypeError(), function() {
self[this.name].prototype[member.name].apply({}, args);
memberHolderObject[member.name].apply({}, args);
}, "calling operation with this = {} didn't throw TypeError");
}.bind(this), this.name + " interface: operation " + member.name +
"(" + member.arguments.map(function(m) { return m.idlType.idlType; }) +
")");
};
}
}
//@}
IdlInterface.prototype.test_member_stringifier = function(member)
@ -1150,15 +1192,18 @@ IdlInterface.prototype.test_member_stringifier = function(member)
assert_own_property(self[this.name].prototype, "toString",
"interface prototype object missing non-static operation");
var stringifierUnforgeable = member.isUnforgeable;
var desc = Object.getOwnPropertyDescriptor(interfacePrototypeObject, "toString");
// "The property has attributes { [[Writable]]: B,
// [[Enumerable]]: true, [[Configurable]]: B }, where B is false if the
// stringifier is unforgeable on the interface, and true otherwise."
assert_false("get" in desc, "property has getter");
assert_false("set" in desc, "property has setter");
assert_true(desc.writable, "property is not writable");
assert_equals(desc.writable, !stringifierUnforgeable,
"property should be writable if and only if not unforgeable");
assert_true(desc.enumerable, "property is not enumerable");
assert_true(desc.configurable, "property is not configurable");
assert_equals(desc.configurable, !stringifierUnforgeable,
"property should be configurable if and only if not unforgeable");
// "The value of the property is a Function object, which behaves as
// follows . . ."
assert_equals(typeof interfacePrototypeObject.toString, "function",
@ -1203,7 +1248,8 @@ IdlInterface.prototype.test_members = function()
case "attribute":
// For unforgeable attributes, we do the checks in
// test_interface_of instead.
if (!member.has_extended_attribute("Unforgeable")) {
if (!member.isUnforgeable)
{
this.test_member_attribute(member);
}
break;
@ -1211,8 +1257,13 @@ IdlInterface.prototype.test_members = function()
case "operation":
// TODO: Need to correctly handle multiple operations with the same
// identifier.
// For unforgeable operations, we do the checks in
// test_interface_of instead.
if (member.name) {
this.test_member_operation(member);
if (!member.isUnforgeable)
{
this.test_member_operation(member);
}
} else if (member.stringifier) {
this.test_member_stringifier(member);
}
@ -1321,13 +1372,26 @@ IdlInterface.prototype.test_interface_of = function(desc, obj, exception, expect
for (var i = 0; i < this.members.length; i++)
{
var member = this.members[i];
if (member.has_extended_attribute("Unforgeable"))
if (member.type == "attribute" && member.isUnforgeable)
{
test(function()
{
assert_equals(exception, null, "Unexpected exception when evaluating object");
assert_equals(typeof obj, expected_typeof, "wrong typeof object");
do_interface_attribute_asserts(obj, member);
this.do_interface_attribute_asserts(obj, member);
}.bind(this), this.name + " interface: " + desc + ' must have own property "' + member.name + '"');
}
else if (member.type == "operation" &&
member.name &&
member.isUnforgeable)
{
test(function()
{
assert_equals(exception, null, "Unexpected exception when evaluating object");
assert_equals(typeof obj, expected_typeof, "wrong typeof object");
assert_own_property(obj, member.name,
"Doesn't have the unforgeable operation property");
this.do_member_operation_asserts(obj, member);
}.bind(this), this.name + " interface: " + desc + ' must have own property "' + member.name + '"');
}
else if ((member.type == "const"
@ -1340,7 +1404,12 @@ IdlInterface.prototype.test_interface_of = function(desc, obj, exception, expect
assert_equals(exception, null, "Unexpected exception when evaluating object");
assert_equals(typeof obj, expected_typeof, "wrong typeof object");
if (!member["static"]) {
assert_inherits(obj, member.name);
if (!this.is_global()) {
assert_inherits(obj, member.name);
} else {
assert_own_property(obj, member.name);
}
if (member.type == "const")
{
assert_equals(obj[member.name], constValue(member.value));
@ -1381,7 +1450,11 @@ IdlInterface.prototype.test_interface_of = function(desc, obj, exception, expect
assert_equals(exception, null, "Unexpected exception when evaluating object");
assert_equals(typeof obj, expected_typeof, "wrong typeof object");
if (!member["static"]) {
assert_inherits(obj, member.name);
if (!this.is_global() && !member.isUnforgeable) {
assert_inherits(obj, member.name);
} else {
assert_own_property(obj, member.name);
}
}
else
{
@ -1423,7 +1496,7 @@ IdlInterface.prototype.has_stringifier = function()
};
//@}
function do_interface_attribute_asserts(obj, member)
IdlInterface.prototype.do_interface_attribute_asserts = function(obj, member)
//@{
{
// This function tests WebIDL as of 2015-01-27.
@ -1451,7 +1524,7 @@ function do_interface_attribute_asserts(obj, member)
assert_false("value" in desc, 'property descriptor has value but is supposed to be accessor');
assert_false("writable" in desc, 'property descriptor has "writable" field but is supposed to be accessor');
assert_true(desc.enumerable, "property is not enumerable");
if (member.has_extended_attribute("Unforgeable"))
if (member.isUnforgeable)
{
assert_false(desc.configurable, "[Unforgeable] property must not be configurable");
}
@ -1545,6 +1618,8 @@ function IdlInterfaceMember(obj)
{
this.extAttrs = [];
}
this.isUnforgeable = this.has_extended_attribute("Unforgeable");
}
//@}

View file

@ -71,13 +71,22 @@ policies and contribution forms [3].
WindowTestEnvironment.prototype._dispatch = function(selector, callback_args, message_arg) {
this._forEach_windows(
function(w, is_same_origin) {
if (is_same_origin && selector in w) {
function(w, same_origin) {
if (same_origin) {
try {
w[selector].apply(undefined, callback_args);
} catch (e) {
if (debug) {
throw e;
var has_selector = selector in w;
} catch(e) {
// If document.domain was set at some point same_origin can be
// wrong and the above will fail.
has_selector = false;
}
if (has_selector) {
try {
w[selector].apply(undefined, callback_args);
} catch (e) {
if (debug) {
throw e;
}
}
}
}
@ -1504,7 +1513,7 @@ policies and contribution forms [3].
status: {
status: tests.status.ERROR,
message: "Error in worker" + filename + ": " + message,
stack: e.stack
stack: error.stack
}
});
error.preventDefault();

View file

@ -76,7 +76,7 @@ def whitelist_errors(path, errors):
global _whitelist_fn
if _whitelist_fn is None:
_whitelist_fn = parse_whitelist_file(os.path.join(here, "lint.whitelist"))
_whitelist_fn = parse_whitelist_file(os.path.join(repo_root, "lint.whitelist"))
return _whitelist_fn(path, errors)
class Regexp(object):

View file

@ -96,7 +96,6 @@ interface NavigatorID {
readonly attribute DOMString appVersion;
readonly attribute DOMString platform;
readonly attribute DOMString product; // constant "Gecko"
boolean taintEnabled(); // constant false
readonly attribute DOMString userAgent;
};

View file

@ -9,7 +9,7 @@
<script>
async_test(function() {
var worker = new Worker('helper-redirect.py?fail');
worker.onmessage = this.step_func(function(e) {
worker.onmessage = this.step_func_done(function(e) {
assert_equals(e.data[0], location.href.replace(/\/[^\/]+$/, '/post-location-members.js?a'));
assert_equals(e.data[1], location.protocol);
assert_equals(e.data[2], location.host);