diff --git a/2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.maxWidth.NaN.html b/2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.maxWidth.NaN.html new file mode 100644 index 00000000000000..28647ac55aabd2 --- /dev/null +++ b/2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.maxWidth.NaN.html @@ -0,0 +1,32 @@ + + +Canvas test: 2d.text.draw.fill.maxWidth.NaN + + + + + + +

2d.text.draw.fill.maxWidth.NaN

+

fillText handles maxWidth correctly

+ + +

Actual output:

+

FAIL (fallback content)

+

Expected output:

+

+ + diff --git a/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.colouralpha.html b/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.colouralpha.html index 3e20e6faa3f3b8..ad18881da38b61 100644 --- a/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.colouralpha.html +++ b/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.colouralpha.html @@ -24,9 +24,9 @@

2d.gradient.interpolate.colouralpha

g.addColorStop(1, 'rgba(0,0,255, 1)'); ctx.fillStyle = g; ctx.fillRect(0, 0, 100, 50); -_assertPixelApprox(canvas, 25,25, 191,191,63,63, "25,25", "191,191,63,63", 3); -_assertPixelApprox(canvas, 50,25, 127,127,127,127, "50,25", "127,127,127,127", 3); -_assertPixelApprox(canvas, 75,25, 63,63,191,191, "75,25", "63,63,191,191", 3); +_assertPixelApprox(canvas, 25,25, 190,190,65,65, "25,25", "190,190,65,65", 3); +_assertPixelApprox(canvas, 50,25, 126,126,128,128, "50,25", "126,126,128,128", 3); +_assertPixelApprox(canvas, 75,25, 62,62,192,192, "75,25", "62,62,192,192", 3); }); diff --git a/2dcontext/image-smoothing/imagesmoothing.html b/2dcontext/image-smoothing/imagesmoothing.html index ccc3110e8e8098..1a86a8f2015aba 100644 --- a/2dcontext/image-smoothing/imagesmoothing.html +++ b/2dcontext/image-smoothing/imagesmoothing.html @@ -1,45 +1,119 @@ - - - CanvasRenderingContext2D imageSmoothingEnabled test - - - - - - -
- - - - - - - + +CanvasRenderingContext2D imageSmoothingEnabled test + + + + diff --git a/2dcontext/the-canvas-state/2d.state.saverestore.imageSmoothingEnabled.html b/2dcontext/the-canvas-state/2d.state.saverestore.imageSmoothingEnabled.html new file mode 100644 index 00000000000000..e99be83d5ff281 --- /dev/null +++ b/2dcontext/the-canvas-state/2d.state.saverestore.imageSmoothingEnabled.html @@ -0,0 +1,47 @@ + + +CanvasRenderingContext2D imageSmoothingEnabled save/restore test + + + + diff --git a/2dcontext/tools/gentest.py b/2dcontext/tools/gentest.py index 500cb4d8bceb60..d1e151f17e0815 100644 --- a/2dcontext/tools/gentest.py +++ b/2dcontext/tools/gentest.py @@ -128,18 +128,18 @@ def f(c, start, depth): doctest.testmod() sys.exit() -templates = yaml.load(open('templates.yaml').read()) -name_mapping = yaml.load(open('name2dir.yaml').read()) +templates = yaml.load(open('templates.yaml', "r").read()) +name_mapping = yaml.load(open('name2dir.yaml', "r").read()) spec_assertions = [] -for s in yaml.load(open('spec.yaml').read())['assertions']: +for s in yaml.load(open('spec.yaml', "r").read())['assertions']: if 'meta' in s: eval(compile(s['meta'], '', 'exec'), {}, {'assertions':spec_assertions}) else: spec_assertions.append(s) tests = [] -for t in sum([ yaml.load(open(f).read()) for f in ['tests.yaml', 'tests2d.yaml', 'tests2dtext.yaml']], []): +for t in sum([ yaml.load(open(f, "r").read()) for f in ['tests.yaml', 'tests2d.yaml', 'tests2dtext.yaml']], []): if 'DISABLED' in t: continue if 'meta' in t: @@ -543,7 +543,7 @@ def write_results(): if not os.path.exists('results.yaml'): print "Can't find results.yaml" else: - for resultset in yaml.load(open('results.yaml').read()): + for resultset in yaml.load(open('results.yaml', "r").read()): #title = "%s (%s)" % (resultset['ua'], resultset['time']) title = resultset['name'] #assert title not in uas # don't allow repetitions diff --git a/2dcontext/tools/specextract.py b/2dcontext/tools/specextract.py index 679bf10e28545b..042c0bd84044fb 100644 --- a/2dcontext/tools/specextract.py +++ b/2dcontext/tools/specextract.py @@ -9,7 +9,7 @@ def extract(): parser = html5lib.html5parser.HTMLParser(tree=html5lib.treebuilders.dom.TreeBuilder) - doc = parser.parse(open('current-work'), encoding='utf-8') + doc = parser.parse(open('current-work', "r"), encoding='utf-8') head = doc.getElementsByTagName('head')[0] for n in head.childNodes: diff --git a/2dcontext/tools/tests2d.yaml b/2dcontext/tools/tests2d.yaml index 4694e98d9af540..546e994fbe978a 100644 --- a/2dcontext/tools/tests2d.yaml +++ b/2dcontext/tools/tests2d.yaml @@ -1668,9 +1668,9 @@ g.addColorStop(1, 'rgba(0,0,255, 1)'); ctx.fillStyle = g; ctx.fillRect(0, 0, 100, 50); - @assert pixel 25,25 ==~ 191,191,63,63 +/- 3; - @assert pixel 50,25 ==~ 127,127,127,127 +/- 3; - @assert pixel 75,25 ==~ 63,63,191,191 +/- 3; + @assert pixel 25,25 ==~ 190,190,65,65 +/- 3; + @assert pixel 50,25 ==~ 126,126,128,128 +/- 3; + @assert pixel 75,25 ==~ 62,62,192,192 +/- 3; expected: | size 100 50 g = cairo.LinearGradient(0, 0, 100, 0) diff --git a/2dcontext/tools/tests2dtext.yaml b/2dcontext/tools/tests2dtext.yaml index e2358494eede61..96c65265c8d7d9 100644 --- a/2dcontext/tools/tests2dtext.yaml +++ b/2dcontext/tools/tests2dtext.yaml @@ -320,6 +320,19 @@ _assertGreen(ctx, 100, 50); expected: green +- name: 2d.text.draw.fill.maxWidth.NaN + desc: fillText handles maxWidth correctly + testing: + - 2d.text.draw.maxwidth + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.font = '35px Arial, sans-serif'; + ctx.fillText('fail fail fail fail fail', 5, 35, NaN); + _assertGreen(ctx, 100, 50); + expected: green + - name: 2d.text.draw.stroke.basic desc: strokeText draws stroked text manual: diff --git a/FileAPI/historical.html b/FileAPI/historical.html index 3ff56a30164b33..a9ae674d457e13 100644 --- a/FileAPI/historical.html +++ b/FileAPI/historical.html @@ -36,13 +36,6 @@ assert_false(prefixes[i]+'BlobBuilder' in window, prefixes[i]+'BlobBuilder'); } }, 'BlobBuilder should not be supported.'); - - test(function() { - var reader = new FileReader(); - assert_false('readAsBinaryString' in reader, 'should not be in reader'); - assert_equals(reader.readAsBinaryString, undefined, - 'should be undefined on getting') - }, 'FileReader should not support readAsBinaryString'); diff --git a/FileAPI/idlharness.idl b/FileAPI/idlharness.idl index 62e6c5d9f21950..d8f31b43a80dee 100644 --- a/FileAPI/idlharness.idl +++ b/FileAPI/idlharness.idl @@ -1,5 +1,7 @@ -[Constructor, - Constructor(sequence<(ArrayBuffer or ArrayBufferView or Blob or DOMString)> blobParts, optional BlobPropertyBag options), Exposed=Window,Worker] +// https://w3c.github.io/FileAPI/#idl-index + +[Constructor(optional sequence blobParts, optional BlobPropertyBag options), +Exposed=(Window,Worker)] interface Blob { readonly attribute unsigned long long size; @@ -9,8 +11,8 @@ interface Blob { //slice Blob into byte-ranged chunks Blob slice([Clamp] optional long long start, - [Clamp] optional long long end, - optional DOMString contentType); + [Clamp] optional long long end, + optional DOMString contentType); void close(); }; @@ -19,32 +21,33 @@ dictionary BlobPropertyBag { DOMString type = ""; }; -[Constructor(sequence<(Blob or DOMString or ArrayBufferView or ArrayBuffer)> fileBits, -[EnsureUTF16] DOMString fileName, optional FilePropertyBag options), Exposed=Window,Worker] -interface File : Blob { +typedef (BufferSource or Blob or USVString) BlobPart; +[Constructor(sequence fileBits, + [EnsureUTF16] DOMString fileName, + optional FilePropertyBag options), +Exposed=(Window,Worker)] +interface File : Blob { readonly attribute DOMString name; readonly attribute long long lastModified; - }; -dictionary FilePropertyBag { - - DOMString type = ""; +dictionary FilePropertyBag : BlobPropertyBag { long long lastModified; - }; -[Exposed=Window,Worker] interface FileList { +[Exposed=(Window,Worker)] +interface FileList { getter File? item(unsigned long index); readonly attribute unsigned long length; }; -[Constructor, Exposed=Window,Worker] +[Constructor, Exposed=(Window,Worker)] interface FileReader: EventTarget { // async read methods void readAsArrayBuffer(Blob blob); + void readAsBinaryString(Blob blob); void readAsText(Blob blob, optional DOMString label); void readAsDataURL(Blob blob); @@ -55,6 +58,7 @@ interface FileReader: EventTarget { const unsigned short LOADING = 1; const unsigned short DONE = 2; + readonly attribute unsigned short readyState; // File or Blob data @@ -62,7 +66,7 @@ interface FileReader: EventTarget { readonly attribute DOMError? error; - // event handler attributes + // event handler content attributes attribute EventHandler onloadstart; attribute EventHandler onprogress; attribute EventHandler onload; @@ -72,20 +76,19 @@ interface FileReader: EventTarget { }; -partial interface URL { - - static DOMString createObjectURL(Blob blob); - static DOMString createFor(Blob blob); - static void revokeObjectURL(DOMString url); - -}; - [Constructor, Exposed=Worker] interface FileReaderSync { - // Synchronously return strings ArrayBuffer readAsArrayBuffer(Blob blob); + DOMString readAsBinaryString(Blob blob); DOMString readAsText(Blob blob, optional DOMString label); DOMString readAsDataURL(Blob blob); }; + +[Exposed=(Window,DedicatedWorker,SharedWorker)] +partial interface URL { + static DOMString createObjectURL(Blob blob); + static DOMString createFor(Blob blob); + static void revokeObjectURL(DOMString url); +}; diff --git a/IndexedDB/idb_binary_key_conversion.htm b/IndexedDB/idb_binary_key_conversion.htm new file mode 100644 index 00000000000000..b55e6324b34998 --- /dev/null +++ b/IndexedDB/idb_binary_key_conversion.htm @@ -0,0 +1,79 @@ + + +Verify the coversion of various types of BufferSource + + + + + + + +
diff --git a/IndexedDB/idbfactory_cmp3.htm b/IndexedDB/idbfactory_cmp3.htm new file mode 100644 index 00000000000000..749fd7b8614913 --- /dev/null +++ b/IndexedDB/idbfactory_cmp3.htm @@ -0,0 +1,27 @@ + + +IDBFactory.cmp() - compared keys in different types + + + + + + + +
diff --git a/IndexedDB/idbfactory_cmp4.htm b/IndexedDB/idbfactory_cmp4.htm new file mode 100644 index 00000000000000..757e7c239730c3 --- /dev/null +++ b/IndexedDB/idbfactory_cmp4.htm @@ -0,0 +1,40 @@ + + +IDBFactory.cmp() - comparison of binary keys + + + + + + + +
diff --git a/IndexedDB/interfaces.idl b/IndexedDB/interfaces.idl index 6eee5f47a35bd2..353864de2598db 100644 --- a/IndexedDB/interfaces.idl +++ b/IndexedDB/interfaces.idl @@ -83,6 +83,7 @@ interface IDBDatabase : EventTarget { IDBTransaction transaction ((DOMString or sequence) storeNames, optional IDBTransactionMode mode = "readonly"); void close (); attribute EventHandler onabort; + attribute EventHandler onclose; attribute EventHandler onerror; attribute EventHandler onversionchange; }; diff --git a/WebCryptoAPI/sign_verify/ecdsa.js b/WebCryptoAPI/sign_verify/ecdsa.js new file mode 100644 index 00000000000000..869fb796517561 --- /dev/null +++ b/WebCryptoAPI/sign_verify/ecdsa.js @@ -0,0 +1,479 @@ + +function run_test() { + var subtle = self.crypto.subtle; // Change to test prefixed implementations + + // When are all these tests really done? When all the promises they use have resolved. + var all_promises = []; + + // Source file [algorithm_name]_vectors.js provides the getTestVectors method + // for the algorithm that drives these tests. + var testVectors = getTestVectors(); + + // Test verification first, because signing tests rely on that working + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + var algorithm = {name: vector.algorithmName, hash: vector.hashName}; + promise_test(function(test) { + var operation = subtle.verify(algorithm, vector.publicKey, vector.signature, vector.plaintext) + .then(function(is_verified) { + assert_true(is_verified, "Signature verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + }); + + return operation; + }, vector.name + " verification"); + + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested verification. + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification"); + }); + + all_promises.push(promise); + }); + + // Test verification with an altered buffer after call + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + var algorithm = {name: vector.algorithmName, hash: vector.hashName}; + promise_test(function(test) { + var signature = copyBuffer(vector.signature); + var operation = subtle.verify(algorithm, vector.publicKey, signature, vector.plaintext) + .then(function(is_verified) { + assert_true(is_verified, "Signature verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + }); + + signature[0] = 255 - signature[0]; + return operation; + }, vector.name + " verification with altered signature after call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification with altered signature after call"); + }); + + all_promises.push(promise); + }); + + // Check for successful verification even if plaintext is altered after call. + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + var algorithm = {name: vector.algorithmName, hash: vector.hashName}; + promise_test(function(test) { + var plaintext = copyBuffer(vector.plaintext); + var operation = subtle.verify(algorithm, vector.publicKey, vector.signature, plaintext) + .then(function(is_verified) { + assert_true(is_verified, "Signature verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + }); + + plaintext[0] = 255 - plaintext[0]; + return operation; + }, vector.name + " with altered plaintext after call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " with altered plaintext after call"); + }); + + all_promises.push(promise); + }); + + // Check for failures due to using privateKey to verify. + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + var algorithm = {name: vector.algorithmName, hash: vector.hashName}; + promise_test(function(test) { + return subtle.verify(algorithm, vector.privateKey, vector.signature, vector.plaintext) + .then(function(plaintext) { + assert_unreached("Should have thrown error for using privateKey to verify in " + vector.name + ": " + err.message + "'"); + }, function(err) { + assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of '" + err.message + "'"); + }); + }, vector.name + " using privateKey to verify"); + + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " using privateKey to verify"); + }); + + all_promises.push(promise); + }); + + // Check for failures due to using publicKey to sign. + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + var algorithm = {name: vector.algorithmName, hash: vector.hashName}; + promise_test(function(test) { + return subtle.sign(algorithm, vector.publicKey, vector.plaintext) + .then(function(signature) { + assert_unreached("Should have thrown error for using publicKey to sign in " + vector.name + ": " + err.message + "'"); + }, function(err) { + assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of '" + err.message + "'"); + }); + }, vector.name + " using publicKey to sign"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " using publicKey to sign"); + }); + + all_promises.push(promise); + }); + + // Check for failures due to no "verify" usage. + testVectors.forEach(function(originalVector) { + var vector = Object.assign({}, originalVector); + + var promise = importVectorKeys(vector, [], ["sign"]) + .then(function(vectors) { + var algorithm = {name: vector.algorithmName, hash: vector.hashName}; + promise_test(function(test) { + return subtle.verify(algorithm, vector.publicKey, vector.signature, vector.plaintext) + .then(function(plaintext) { + assert_unreached("Should have thrown error for no verify usage in " + vector.name + ": " + err.message + "'"); + }, function(err) { + assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of '" + err.message + "'"); + }); + }, vector.name + " no verify usage"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " no verify usage"); + }); + + all_promises.push(promise); + }); + + // Check for successful signing and verification. + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + var algorithm = {name: vector.algorithmName, hash: vector.hashName}; + promise_test(function(test) { + return subtle.sign(algorithm, vector.privateKey, vector.plaintext) + .then(function(signature) { + // Can we verify the signature? + return subtle.verify(algorithm, vector.publicKey, signature, vector.plaintext) + .then(function(is_verified) { + assert_true(is_verified, "Round trip verification works"); + return signature; + }, function(err) { + assert_unreached("verify error for test " + vector.name + ": " + err.message + "'"); + }); + }, function(err) { + assert_unreached("sign error for test " + vector.name + ": '" + err.message + "'"); + }); + }, vector.name + " round trip"); + + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested signing or verifying + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " round trip"); + }); + + all_promises.push(promise); + }); + + // Test signing with the wrong algorithm + testVectors.forEach(function(vector) { + // Want to get the key for the wrong algorithm + var promise = subtle.generateKey({name: "HMAC", hash: "SHA-1"}, false, ["sign", "verify"]) + .then(function(wrongKey) { + var algorithm = {name: vector.algorithmName, hash: vector.hashName}; + return importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + promise_test(function(test) { + var operation = subtle.sign(algorithm, wrongKey, vector.plaintext) + .then(function(signature) { + assert_unreached("Signing should not have succeeded for " + vector.name); + }, function(err) { + assert_equals(err.name, "InvalidAccessError", "Should have thrown InvalidAccessError instead of '" + err.message + "'"); + }); + + return operation; + }, vector.name + " signing with wrong algorithm name"); + + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested verification. + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " signing with wrong algorithm name"); + }); + }, function(err) { + promise_test(function(test) { + assert_unreached("Generate wrong key for test " + vector.name + " failed: '" + err.message + "'"); + }, "generate wrong key step: " + vector.name + " signing with wrong algorithm name"); + }); + + all_promises.push(promise); + }); + + // Test verification with the wrong algorithm + testVectors.forEach(function(vector) { + // Want to get the key for the wrong algorithm + var promise = subtle.generateKey({name: "HMAC", hash: "SHA-1"}, false, ["sign", "verify"]) + .then(function(wrongKey) { + return importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + var algorithm = {name: vector.algorithmName, hash: vector.hashName}; + promise_test(function(test) { + var operation = subtle.verify(algorithm, wrongKey, vector.signature, vector.plaintext) + .then(function(signature) { + assert_unreached("Verifying should not have succeeded for " + vector.name); + }, function(err) { + assert_equals(err.name, "InvalidAccessError", "Should have thrown InvalidAccessError instead of '" + err.message + "'"); + }); + + return operation; + }, vector.name + " verifying with wrong algorithm name"); + + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested verification. + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verifying with wrong algorithm name"); + }); + }, function(err) { + promise_test(function(test) { + assert_unreached("Generate wrong key for test " + vector.name + " failed: '" + err.message + "'"); + }, "generate wrong key step: " + vector.name + " verifying with wrong algorithm name"); + }); + + all_promises.push(promise); + }); + + // Test verification fails with wrong signature + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + var algorithm = {name: vector.algorithmName, hash: vector.hashName}; + var signature = copyBuffer(vector.signature); + signature[0] = 255 - signature[0]; + promise_test(function(test) { + var operation = subtle.verify(algorithm, vector.publicKey, signature, vector.plaintext) + .then(function(is_verified) { + assert_false(is_verified, "Signature NOT verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + }); + + return operation; + }, vector.name + " verification failure due to altered signature"); + + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested verification. + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification failure due to altered signature"); + }); + + all_promises.push(promise); + }); + + // Test verification fails with wrong hash + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + var hashName = "SHA-1"; + if (vector.hashName === "SHA-1") { + hashName = "SHA-256" + } + var algorithm = {name: vector.algorithmName, hash: hashName}; + promise_test(function(test) { + var operation = subtle.verify(algorithm, vector.publicKey, vector.signature, vector.plaintext) + .then(function(is_verified) { + assert_false(is_verified, "Signature NOT verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + }); + + return operation; + }, vector.name + " verification failure due to wrong hash"); + + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested verification. + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification failure due to wrong hash"); + }); + + all_promises.push(promise); + }); + + // Test verification fails with bad hash name + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + // use the wrong name for the hash + var hashName = vector.hashName.substring(0, 3) + vector.hashName.substring(4); + var algorithm = {name: vector.algorithmName, hash: hashName}; + promise_test(function(test) { + var operation = subtle.verify(algorithm, vector.publicKey, vector.signature, vector.plaintext) + .then(function(is_verified) { + assert_unreached("Verification should throw an error"); + }, function(err) { + assert_equals(err.name, "NotSupportedError", "Correctly throws NotSupportedError for illegal hash name") + }); + + return operation; + }, vector.name + " verification failure due to bad hash name"); + + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested verification. + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification failure due to bad hash name"); + }); + + all_promises.push(promise); + }); + + // Test verification fails with short (odd length) signature + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + var algorithm = {name: vector.algorithmName, hash: vector.hashName}; + var signature = vector.signature.slice(1); // Skip the first byte + promise_test(function(test) { + var operation = subtle.verify(algorithm, vector.publicKey, signature, vector.plaintext) + .then(function(is_verified) { + assert_false(is_verified, "Signature NOT verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + }); + + return operation; + }, vector.name + " verification failure due to shortened signature"); + + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested verification. + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification failure due to shortened signature"); + }); + + all_promises.push(promise); + }); + + // Test verification fails with wrong plaintext + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + var algorithm = {name: vector.algorithmName, hash: vector.hashName}; + var plaintext = copyBuffer(vector.plaintext); + plaintext[0] = 255 - plaintext[0]; + promise_test(function(test) { + var operation = subtle.verify(algorithm, vector.publicKey, vector.signature, plaintext) + .then(function(is_verified) { + assert_false(is_verified, "Signature NOT verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + }); + + return operation; + }, vector.name + " verification failure due to altered plaintext"); + + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested verification. + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification failure due to altered plaintext"); + }); + + all_promises.push(promise); + }); + + + Promise.all(all_promises) + .then(function() {done();}) + .catch(function() {done();}) + return; + + // A test vector has all needed fields for signing and verifying, EXCEPT that the + // key field may be null. This function replaces that null with the Correct + // CryptoKey object. + // + // Returns a Promise that yields an updated vector on success. + function importVectorKeys(vector, publicKeyUsages, privateKeyUsages) { + var publicPromise, privatePromise; + + if (vector.publicKey !== null) { + publicPromise = new Promise(function(resolve, reject) { + resolve(vector); + }); + } else { + publicPromise = subtle.importKey(vector.publicKeyFormat, vector.publicKeyBuffer, {name: vector.algorithmName, namedCurve: vector.namedCurve}, false, publicKeyUsages) + .then(function(key) { + vector.publicKey = key; + return vector; + }); // Returns a copy of the sourceBuffer it is sent. + } + + if (vector.privateKey !== null) { + privatePromise = new Promise(function(resolve, reject) { + resolve(vector); + }); + } else { + privatePromise = subtle.importKey(vector.privateKeyFormat, vector.privateKeyBuffer, {name: vector.algorithmName, namedCurve: vector.namedCurve}, false, privateKeyUsages) + .then(function(key) { + vector.privateKey = key; + return vector; + }); + } + + return Promise.all([publicPromise, privatePromise]); + } + + // Returns a copy of the sourceBuffer it is sent. + function copyBuffer(sourceBuffer) { + var source = new Uint8Array(sourceBuffer); + var copy = new Uint8Array(sourceBuffer.byteLength) + + for (var i=0; i 0) { + assert_false(equalBuffers(priorSignature, signature), "Two signings with a salt give different signatures") + } else { + assert_true(equalBuffers(priorSignature, signature), "Two signings with empty salt give same signature") + } + }, function(err) { + assert_unreached("second time verify error for test " + vector.name + ": '" + err.message + "'"); + }); + }, function(err) { + assert_unreached("sign error for test " + vector.name + ": '" + err.message + "'"); + }); + }, vector.name + " round trip"); + + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested signing or verifying + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " round trip"); + }); + + all_promises.push(promise); + }); + + + // Test signing with the wrong algorithm + testVectors.forEach(function(vector) { + // Want to get the key for the wrong algorithm + var alteredVector = Object.assign({}, vector); + alteredVector.algorithm = Object.assign({}, vector.algorithm); + if (vector.algorithm.name === "RSA-PSS") { + alteredVector.algorithm.name = "RSASSA-PKCS1-v1_5"; + } else { + alteredVector.algorithm.name = "RSA-PSS"; + } + + var promise = importVectorKeys(alteredVector, ["verify"], ["sign"]) + .then(function(vectors) { + promise_test(function(test) { + var operation = subtle.sign(vector.algorithm, alteredVector.privateKey, vector.plaintext) + .then(function(signature) { + assert_unreached("Signing should not have succeeded for " + vector.name); + }, function(err) { + assert_equals(err.name, "InvalidAccessError", "Should have thrown InvalidAccessError instead of '" + err.message + "'"); + }); + + return operation; + }, vector.name + " signing with wrong algorithm name"); + + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested verification. + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " signing with wrong algorithm name"); + }); + + all_promises.push(promise); + }); + + // Test verification with the wrong algorithm + testVectors.forEach(function(vector) { + // Want to get the key for the wrong algorithm + var alteredVector = Object.assign({}, vector); + alteredVector.algorithm = Object.assign({}, vector.algorithm); + if (vector.algorithm.name === "RSA-PSS") { + alteredVector.algorithm.name = "RSASSA-PKCS1-v1_5"; + } else { + alteredVector.algorithm.name = "RSA-PSS"; + } + + var promise = importVectorKeys(alteredVector, ["verify"], ["sign"]) + .then(function(vectors) { + // Some tests are sign only + if (!("signature" in vector)) { + return; + } + promise_test(function(test) { + var operation = subtle.verify(vector.algorithm, alteredVector.publicKey, vector.signature, vector.plaintext) + .then(function(is_verified) { + assert_unreached("Verification should not have succeeded for " + vector.name); + }, function(err) { + assert_equals(err.name, "InvalidAccessError", "Should have thrown InvalidAccessError instead of '" + err.message + "'"); + }); + + return operation; + }, vector.name + " verification with wrong algorithm name"); + + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested verification. + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification with wrong algorithm name"); + }); + + all_promises.push(promise); + }); + + // Verification should fail with wrong signature + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + promise_test(function(test) { + var signature = copyBuffer(vector.signature); + signature[0] = 255 - signature[0]; + var operation = subtle.verify(vector.algorithm, vector.publicKey, signature, vector.plaintext) + .then(function(is_verified) { + assert_false(is_verified, "Signature NOT verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + }); + + return operation; + }, vector.name + " verification failure with altered signature"); + + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested verification. + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification failure with altered signature"); + }); + + all_promises.push(promise); + }); + + // Verification should fail with wrong plaintext + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + promise_test(function(test) { + var plaintext = copyBuffer(vector.plaintext); + plaintext[0] = 255 - plaintext[0]; + var operation = subtle.verify(vector.algorithm, vector.publicKey, vector.signature, plaintext) + .then(function(is_verified) { + assert_false(is_verified, "Signature NOT verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + }); + + return operation; + }, vector.name + " verification failure with altered plaintext"); + + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested verification. + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification failure with altered plaintext"); + }); + + all_promises.push(promise); + }); + + + Promise.all(all_promises) + .then(function() {done();}) + .catch(function() {done();}) + + // A test vector has all needed fields for signing and verifying, EXCEPT that the + // key field may be null. This function replaces that null with the Correct + // CryptoKey object. + // + // Returns a Promise that yields an updated vector on success. + function importVectorKeys(vector, publicKeyUsages, privateKeyUsages) { + var publicPromise, privatePromise; + + if (vector.publicKey !== null) { + publicPromise = new Promise(function(resolve, reject) { + resolve(vector); + }); + } else { + publicPromise = subtle.importKey(vector.publicKeyFormat, vector.publicKeyBuffer, {name: vector.algorithm.name, hash: vector.hash}, false, publicKeyUsages) + .then(function(key) { + vector.publicKey = key; + return vector; + }); // Returns a copy of the sourceBuffer it is sent. + } + + if (vector.privateKey !== null) { + privatePromise = new Promise(function(resolve, reject) { + resolve(vector); + }); + } else { + privatePromise = subtle.importKey(vector.privateKeyFormat, vector.privateKeyBuffer, {name: vector.algorithm.name, hash: vector.hash}, false, privateKeyUsages) + .then(function(key) { + vector.privateKey = key; + return vector; + }); + } + + return Promise.all([publicPromise, privatePromise]); + } + + // Returns a copy of the sourceBuffer it is sent. + function copyBuffer(sourceBuffer) { + var source = new Uint8Array(sourceBuffer); + var copy = new Uint8Array(sourceBuffer.byteLength) + + for (var i=0; i + + +WebCryptoAPI: sign() and verify() Using ECDSA + + + + + + + + + +

sign and verify Tests for ECDSA

+ +
+ diff --git a/WebCryptoAPI/sign_verify/test_hmac.html b/WebCryptoAPI/sign_verify/test_hmac.html new file mode 100644 index 00000000000000..6d5ff926f38f13 --- /dev/null +++ b/WebCryptoAPI/sign_verify/test_hmac.html @@ -0,0 +1,19 @@ + + + +WebCryptoAPI: sign() and verify() Using HMAC + + + + + + + + + +

sign and verify Tests for HMAC

+ +
+ diff --git a/WebCryptoAPI/sign_verify/test_rsa_pkcs.html b/WebCryptoAPI/sign_verify/test_rsa_pkcs.html new file mode 100644 index 00000000000000..de428c0fc7ea6f --- /dev/null +++ b/WebCryptoAPI/sign_verify/test_rsa_pkcs.html @@ -0,0 +1,19 @@ + + + +WebCryptoAPI: sign() and verify() Using RSASSA-PKCS1-v1_5 + + + + + + + + + +

sign and verify Tests for RSASSA-PKCS1-v1_5

+ +
+ diff --git a/WebCryptoAPI/sign_verify/test_rsa_pss.html b/WebCryptoAPI/sign_verify/test_rsa_pss.html new file mode 100644 index 00000000000000..3a2034feb4ac75 --- /dev/null +++ b/WebCryptoAPI/sign_verify/test_rsa_pss.html @@ -0,0 +1,19 @@ + + + +WebCryptoAPI: sign() and verify() Using RSA-PSS + + + + + + + + + +

sign and verify Tests for RSA-PSS

+ +
+ diff --git a/XMLHttpRequest/FormData-append.html b/XMLHttpRequest/FormData-append.html index 0b81acc082502a..bf6c66d0f665df 100644 --- a/XMLHttpRequest/FormData-append.html +++ b/XMLHttpRequest/FormData-append.html @@ -80,8 +80,13 @@ assert_equals(fd.get('key'), "null"); }, 'testFormDataAppendToFormNull2'); test(function() { - assert_object_equals(create_formdata(['key', new Blob(), 'blank.txt']).get('key'), - new File(new Blob(), 'blank.txt')); + var before = new Date(new Date().getTime() - 2000); // two seconds ago, in case there's clock drift + var fd = create_formdata(['key', new Blob(), 'blank.txt']).get('key'); + assert_equals(fd.name, "blank.txt"); + assert_equals(fd.type, ""); + assert_equals(fd.size, 0); + assert_greater_than_equal(fd.lastModified, before); + assert_less_than_equal(fd.lastModified, new Date()); }, 'testFormDataAppendEmptyBlob'); function create_formdata() { diff --git a/XMLHttpRequest/XMLHttpRequest-withCredentials.any.js b/XMLHttpRequest/XMLHttpRequest-withCredentials.any.js new file mode 100644 index 00000000000000..96e95c90faf064 --- /dev/null +++ b/XMLHttpRequest/XMLHttpRequest-withCredentials.any.js @@ -0,0 +1,40 @@ +test(function() { + var client = new XMLHttpRequest() + assert_false(client.withCredentials, "withCredentials defaults to false") + client.withCredentials = true + assert_true(client.withCredentials, "is true after setting") +}, "default value is false, set value is true") + +test(function() { + var client = new XMLHttpRequest() + client.open("GET", "resources/delay.py?ms=1000", true) + client.withCredentials = true + assert_true(client.withCredentials, "set in OPEN state") +}, "can also be set in OPEN state") + +test(function() { + var client = new XMLHttpRequest() + client.open("GET", "resources/delay.py?ms=1000", false) + client.withCredentials = true + assert_true(client.withCredentials, "set in OPEN state") +}, "setting on synchronous XHR") + +async_test(function() { + var client = new XMLHttpRequest() + client.open("GET", "resources/delay.py?ms=1000") + client.send() + assert_throws("InvalidStateError", function() { client.withCredentials = true }) + client.onreadystatechange = this.step_func(function() { + assert_throws("InvalidStateError", function() { client.withCredentials = true }) + if (client.readyState === 4) { + this.done() + } + }) +}, "setting withCredentials when not in UNSENT, OPENED state (asynchronous)") + +test(function() { + var client = new XMLHttpRequest() + client.open("GET", "resources/delay.py?ms=1000", false) + client.send(); + assert_throws("InvalidStateError", function() { client.withCredentials = true }) +}, "setting withCredentials when in DONE state (synchronous)") diff --git a/XMLHttpRequest/XMLHttpRequest-withCredentials.html b/XMLHttpRequest/XMLHttpRequest-withCredentials.html deleted file mode 100644 index cafbbb61a0be9f..00000000000000 --- a/XMLHttpRequest/XMLHttpRequest-withCredentials.html +++ /dev/null @@ -1,13 +0,0 @@ - - -XMLHttpRequest#withCredentials - - - - -
- diff --git a/XMLHttpRequest/XMLHttpRequest-withCredentials.js b/XMLHttpRequest/XMLHttpRequest-withCredentials.js deleted file mode 100644 index ea945e8ab8f99c..00000000000000 --- a/XMLHttpRequest/XMLHttpRequest-withCredentials.js +++ /dev/null @@ -1,42 +0,0 @@ -function test_withCredentials(worker) { - test(function() { - var client = new XMLHttpRequest() - assert_false(client.withCredentials, "withCredentials defaults to false") - client.withCredentials = true - assert_true(client.withCredentials, "is true after setting") - }, "default value is false, set value is true") - - test(function() { - var client = new XMLHttpRequest() - client.open("GET", "resources/delay.py?ms=1000", true) - client.withCredentials = true - assert_true(client.withCredentials, "set in OPEN state") - }, "can also be set in OPEN state") - - test(function() { - var client = new XMLHttpRequest() - client.open("GET", "resources/delay.py?ms=1000", false) - client.withCredentials = true - assert_true(client.withCredentials, "set in OPEN state") - }, "setting on synchronous XHR") - - async_test(function() { - var client = new XMLHttpRequest() - client.open("GET", "resources/delay.py?ms=1000") - client.send() - assert_throws("InvalidStateError", function() { client.withCredentials = true }) - client.onreadystatechange = this.step_func(function() { - assert_throws("InvalidStateError", function() { client.withCredentials = true }) - if (client.readyState === 4) { - this.done() - } - }) - }, "setting withCredentials when not in UNSENT, OPENED state (asynchronous)") - - test(function() { - var client = new XMLHttpRequest() - client.open("GET", "resources/delay.py?ms=1000", false) - client.send(); - assert_throws("InvalidStateError", function() { client.withCredentials = true }) - }, "setting withCredentials when in DONE state (synchronous)") -} diff --git a/XMLHttpRequest/XMLHttpRequest-withCredentials.worker.js b/XMLHttpRequest/XMLHttpRequest-withCredentials.worker.js deleted file mode 100644 index 6e89fec5a0152d..00000000000000 --- a/XMLHttpRequest/XMLHttpRequest-withCredentials.worker.js +++ /dev/null @@ -1,4 +0,0 @@ -importScripts("/resources/testharness.js") -importScripts("XMLHttpRequest-withCredentials.js") -test_withCredentials(true); -done() diff --git a/XMLHttpRequest/abort-during-upload.htm b/XMLHttpRequest/abort-during-upload.htm index afb28284645cd8..766dcc4693d8df 100644 --- a/XMLHttpRequest/abort-during-upload.htm +++ b/XMLHttpRequest/abort-during-upload.htm @@ -4,6 +4,7 @@ XMLHttpRequest: abort() while sending data + @@ -11,29 +12,16 @@
+ XMLHttpRequest: The abort() method: abort and loadend events @@ -16,18 +17,9 @@ test.step(function() { var xhr = new XMLHttpRequest(); - var expect = [1, 4, "upload.abort", "upload.loadend", "abort", "loadend"]; - var actual = []; + prepare_xhr_for_event_order_test(xhr); - xhr.onreadystatechange = function() - { - test.step(function() - { - actual.push(xhr.readyState); - }); - }; - xhr.onloadstart = function() - { + xhr.addEventListener("loadstart", function() { test.step(function() { var readyState = xhr.readyState; @@ -35,23 +27,18 @@ { xhr.abort(); VerifyResult(); - }else{ + } else { assert_unreached('Loadstart event should not fire in readyState '+readyState); } }); - }; - - xhr.onloadend = function(e){ actual.push(e.type); }; - xhr.onabort = function(e){ actual.push(e.type); }; - - xhr.upload.onloadend = function(e){ actual.push("upload." + e.type); }; - xhr.upload.onabort = function(e){ actual.push("upload." + e.type); }; + }); function VerifyResult() { test.step(function() { - assert_array_equals(actual, expect); + assert_xhr_event_order_matches([1, "loadstart(0,0,false)", 4, "upload.progress(0,0,false)", "upload.abort(0,0,false)", "upload.loadend(0,0,false)", "progress(0,0,false)", "abort(0,0,false)", "loadend(0,0,false)"]); + assert_equals(xhr.readyState, 0, 'state should be UNSENT'); test.done(); }); diff --git a/XMLHttpRequest/event-error-order.sub.html b/XMLHttpRequest/event-error-order.sub.html new file mode 100644 index 00000000000000..9be8b4a1b29364 --- /dev/null +++ b/XMLHttpRequest/event-error-order.sub.html @@ -0,0 +1,35 @@ + + + + + + + + XMLHttpRequest: event - error (order of events) + + + +
+ + + + diff --git a/XMLHttpRequest/event-error.html b/XMLHttpRequest/event-error.html index 3f95bf58d56830..3171c49d7a8d98 100644 --- a/XMLHttpRequest/event-error.html +++ b/XMLHttpRequest/event-error.html @@ -18,7 +18,7 @@ t.done(); }); - client.open("GET", "http://example.nonexist"); + client.open("GET", "http://nonexistent-origin.{{host}}:{{ports[http][0]}}"); client.send("null"); }, document.title); diff --git a/XMLHttpRequest/event-error.sub.html b/XMLHttpRequest/event-error.sub.html new file mode 100644 index 00000000000000..3171c49d7a8d98 --- /dev/null +++ b/XMLHttpRequest/event-error.sub.html @@ -0,0 +1,25 @@ + + +XMLHttpRequest Test: event - error + + + + + +
+ + diff --git a/XMLHttpRequest/event-progress.htm b/XMLHttpRequest/event-progress.htm index 31b35b77217c44..f2f40b85bc75af 100644 --- a/XMLHttpRequest/event-progress.htm +++ b/XMLHttpRequest/event-progress.htm @@ -23,7 +23,7 @@ if (client.readyState === 4) assert_unreached("onprogress not called."); }); - client.open("GET", "resources/trickle.py"); + client.open("GET", "resources/trickle.py?count=4&delay=150"); client.send(null); }); diff --git a/XMLHttpRequest/event-timeout-order.htm b/XMLHttpRequest/event-timeout-order.htm new file mode 100644 index 00000000000000..1d9ba31d6e06d2 --- /dev/null +++ b/XMLHttpRequest/event-timeout-order.htm @@ -0,0 +1,37 @@ + + + + + + + + XMLHttpRequest: event - timeout (order of events) + + + +
+ + + + diff --git a/XMLHttpRequest/event-upload-progress-crossorigin.sub.htm b/XMLHttpRequest/event-upload-progress-crossorigin.sub.htm index 6130bba50a2ef0..66461689c52f60 100644 --- a/XMLHttpRequest/event-upload-progress-crossorigin.sub.htm +++ b/XMLHttpRequest/event-upload-progress-crossorigin.sub.htm @@ -10,6 +10,7 @@
+ diff --git a/XMLHttpRequest/headers-normalize-response.htm b/XMLHttpRequest/headers-normalize-response.htm new file mode 100644 index 00000000000000..466b0d977cc6cd --- /dev/null +++ b/XMLHttpRequest/headers-normalize-response.htm @@ -0,0 +1,42 @@ + + +Whitespace and null in header values + + + + +

Whitespace and null in response header values

+ +
+ + diff --git a/XMLHttpRequest/open-url-multi-window.htm b/XMLHttpRequest/open-url-multi-window.htm index b84aaa57fedec6..347f4b7e59ca55 100644 --- a/XMLHttpRequest/open-url-multi-window.htm +++ b/XMLHttpRequest/open-url-multi-window.htm @@ -15,9 +15,10 @@ var client = new self[0].XMLHttpRequest() client.onreadystatechange = function() { test.step(function() { - if(client.readyState == 4) + if(client.readyState == 4) { assert_equals(client.responseText, "bottom\n") test.done() + } }) } client.open("GET", "folder.txt") diff --git a/XMLHttpRequest/resources/last-modified.py b/XMLHttpRequest/resources/last-modified.py index 4f3a14c7341f42..ef05a6343c16a5 100644 --- a/XMLHttpRequest/resources/last-modified.py +++ b/XMLHttpRequest/resources/last-modified.py @@ -4,4 +4,4 @@ def main(request, response): srcmoddt = datetime.datetime.fromtimestamp(os.path.getmtime(srcpath)) response.headers.set("Last-Modified", srcmoddt.strftime("%a, %d %b %Y %H:%M:%S GMT")) response.headers.set("Content-Type", "application/xml") - return open(srcpath).read() + return open(srcpath, "r").read() diff --git a/XMLHttpRequest/resources/parse-headers.py b/XMLHttpRequest/resources/parse-headers.py new file mode 100644 index 00000000000000..fdc626539e842f --- /dev/null +++ b/XMLHttpRequest/resources/parse-headers.py @@ -0,0 +1,10 @@ +import json + +def main(request, response): + + content = "" + if "my-custom-header" in request.GET: + val = request.GET.first("my-custom-header") + response.headers.set("My-Custom-Header", val) + + return content diff --git a/XMLHttpRequest/resources/trickle.py b/XMLHttpRequest/resources/trickle.py index 0e709445c598c1..5a46c5e82e6a47 100644 --- a/XMLHttpRequest/resources/trickle.py +++ b/XMLHttpRequest/resources/trickle.py @@ -1,12 +1,15 @@ import time def main(request, response): + chunk = "TEST_TRICKLE\n" delay = float(request.GET.first("ms", 500)) / 1E3 count = int(request.GET.first("count", 50)) + if "specifylength" in request.GET: + response.headers.set("Content-Length", count * len(chunk)) time.sleep(delay) response.headers.set("Content-type", "text/plain") response.write_status_headers() time.sleep(delay); for i in xrange(count): - response.writer.write_content("TEST_TRICKLE\n") + response.writer.write_content(chunk) time.sleep(delay) diff --git a/XMLHttpRequest/resources/xmlhttprequest-event-order.js b/XMLHttpRequest/resources/xmlhttprequest-event-order.js new file mode 100644 index 00000000000000..820f9ee22143c9 --- /dev/null +++ b/XMLHttpRequest/resources/xmlhttprequest-event-order.js @@ -0,0 +1,33 @@ +(function(global) { + var recorded_xhr_events = []; + + function record_xhr_event(e) { + var prefix = e.target instanceof XMLHttpRequestUpload ? "upload." : ""; + recorded_xhr_events.push((prefix || "") + e.type + "(" + e.loaded + "," + e.total + "," + e.lengthComputable + ")"); + } + + global.prepare_xhr_for_event_order_test = function(xhr) { + xhr.addEventListener("readystatechange", function(e) { + recorded_xhr_events.push(xhr.readyState); + }); + var events = ["loadstart", "progress", "abort", "timeout", "error", "load", "loadend"]; + for(var i=0; i -var test = async_test(); - -test.step(function() { +function doTest(test, expectedLengthComputable, expectedTotal, url) { var client = new XMLHttpRequest(); var lastSize = 0; - client.onprogress = test.step_func(function() { + client.onprogress = test.step_func(function(e) { + assert_equals(e.total, expectedTotal); + assert_equals(e.lengthComputable, expectedLengthComputable); + var currentSize = client.responseText.length; if (lastSize > 0 && currentSize > lastSize) { // growth from a positive size to bigger! - test.done(); } @@ -39,7 +39,13 @@ } }); - client.open("GET", "resources/trickle.py?count=1000"); + client.open("GET", url); client.send(null); -}); + return client; +} + +async_test(function () { doTest(this, false, 0, "resources/trickle.py?count=6&delay=150"); }, + document.title + ', unknown content-length'); +async_test(function () { doTest(this, true, 78, "resources/trickle.py?count=6&delay=150&specifylength=1"); }, + document.title + ', known content-length'); diff --git a/XMLHttpRequest/responsexml-document-properties.htm b/XMLHttpRequest/responsexml-document-properties.htm index 1c23cf4c29d016..c12f21b260b69b 100644 --- a/XMLHttpRequest/responsexml-document-properties.htm +++ b/XMLHttpRequest/responsexml-document-properties.htm @@ -45,7 +45,7 @@ test(function() { var lastModified = Math.floor(new Date(client.responseXML.lastModified).getTime() / 1000); - var now = Math.floor(new Date().getTime() / 1000); + var now = Math.floor(new Date().getTime(new Date().getTime() + 2000) / 1000); // two seconds from now, in case there's clock drift assert_greater_than_equal(lastModified, timePreXHR); assert_less_than_equal(lastModified, now); }, 'lastModified set to time of response if no HTTP header provided') diff --git a/XMLHttpRequest/security-consideration.sub.html b/XMLHttpRequest/security-consideration.sub.html index 7d42e947f205e6..5eb7110d41a874 100644 --- a/XMLHttpRequest/security-consideration.sub.html +++ b/XMLHttpRequest/security-consideration.sub.html @@ -21,7 +21,13 @@ assert_false(pe.lengthComputable, "lengthComputable is false."); assert_equals(pe.total, 0, "total is zero."); }); - xhr.onloadend = this.step_func_done(); + xhr.onloadend = this.step_func(function(pe) { + assert_equals(pe.type, "loadend"); + assert_equals(pe.loaded, 0, "loaded is zero."); + assert_false(pe.lengthComputable, "lengthComputable is false."); + assert_equals(pe.total, 0, "total is zero."); + this.done(); + }); xhr.open("GET", "http://{{host}}:{{ports[http][1]}}/XMLHttpRequest/resources/img.jpg", true); xhr.send(null); }) diff --git a/XMLHttpRequest/send-entity-body-empty.htm b/XMLHttpRequest/send-entity-body-empty.htm index ab074c77287d18..f307e778091edf 100644 --- a/XMLHttpRequest/send-entity-body-empty.htm +++ b/XMLHttpRequest/send-entity-body-empty.htm @@ -10,13 +10,17 @@
diff --git a/XMLHttpRequest/send-entity-body-get-head-async.htm b/XMLHttpRequest/send-entity-body-get-head-async.htm index f8a5a59c16b680..ff4c4b4cac0276 100644 --- a/XMLHttpRequest/send-entity-body-get-head-async.htm +++ b/XMLHttpRequest/send-entity-body-get-head-async.htm @@ -23,13 +23,7 @@ client.upload.addEventListener('loadstart', logEvt) client.addEventListener('loadend', function(){ test.step(function(){ - if (method === "HEAD") { - // Fetch 4.4.3 --- Set Content-Length to 0 if method is HEAD and - // request's body is null. - assert_equals(client.getResponseHeader("x-request-content-length"), "0") - } else { - assert_equals(client.getResponseHeader("x-request-content-length"), "NO") - } + assert_equals(client.getResponseHeader("x-request-content-length"), "NO") assert_equals(client.getResponseHeader("x-request-method"), method) assert_equals(client.responseText, "") assert_array_equals(events, []) diff --git a/XMLHttpRequest/send-entity-body-get-head.htm b/XMLHttpRequest/send-entity-body-get-head.htm index bc17cd61a41b93..f3b8cef3555a44 100644 --- a/XMLHttpRequest/send-entity-body-get-head.htm +++ b/XMLHttpRequest/send-entity-body-get-head.htm @@ -23,13 +23,7 @@ client.upload.addEventListener('loadend', logEvt) client.upload.addEventListener('loadstart', logEvt) - if (method === "HEAD") { - // Fetch 4.4.3 --- Set Content-Length to 0 if method is HEAD and - // request's body is null. - assert_equals(client.getResponseHeader("x-request-content-length"), "0") - } else { - assert_equals(client.getResponseHeader("x-request-content-length"), "NO") - } + assert_equals(client.getResponseHeader("x-request-content-length"), "NO") assert_equals(client.getResponseHeader("x-request-method"), method) assert_equals(client.responseText, "") assert_array_equals(events, []) diff --git a/XMLHttpRequest/send-entity-body-none.htm b/XMLHttpRequest/send-entity-body-none.htm index 11ac824f4dd688..d757cb30a9fa36 100644 --- a/XMLHttpRequest/send-entity-body-none.htm +++ b/XMLHttpRequest/send-entity-body-none.htm @@ -9,24 +9,32 @@
diff --git a/XMLHttpRequest/send-no-response-event-order.htm b/XMLHttpRequest/send-no-response-event-order.htm index aabef30f0a43ed..44c1d779786a5f 100644 --- a/XMLHttpRequest/send-no-response-event-order.htm +++ b/XMLHttpRequest/send-no-response-event-order.htm @@ -11,6 +11,7 @@ + XMLHttpRequest: The send() method: event order when there is no response entity body @@ -23,35 +24,18 @@ test.step(function() { var xhr = new XMLHttpRequest(); - var expect = ["loadstart", 4, "load", "loadend"]; - var actual = []; + prepare_xhr_for_event_order_test(xhr); - xhr.onreadystatechange = test.step_func(function() - { - test.step(function() - { - if (xhr.readyState == 3) - { - assert_equals(xhr.response, ""); - } - else if (xhr.readyState == 4) - { - actual.push(xhr.readyState); - } - }); - }); + xhr.addEventListener("readystatechange", test.step_func(function() { + if (xhr.readyState == 3) { + assert_equals(xhr.response, ""); + } + })); - xhr.onloadstart = test.step_func(function(e){ actual.push(e.type); }); - xhr.onload = test.step_func(function(e){ actual.push(e.type); }); - xhr.onloadend = test.step_func(function(e){ - actual.push(e.type); - assert_array_equals(actual, expect); + xhr.addEventListener("loadend", test.step_func(function(e) { + assert_xhr_event_order_matches([1, "loadstart(0,0,false)", 2, "progress(0,0,false)", 4,"load(0,0,false)", "loadend(0,0,false)"]); test.done(); - }); - - xhr.upload.onloadstart = test.step_func(function(e){ assert_unreached('upload.'+e.type); }); - xhr.upload.onload = test.step_func(function(e){ assert_unreached('upload.'+e.type); }); - xhr.upload.onloadend = test.step_func(function(e){ assert_unreached('upload.'+e.type); }); + })); xhr.open("POST", "./resources/content.py", true); xhr.send(); diff --git a/XMLHttpRequest/send-non-same-origin.sub.htm b/XMLHttpRequest/send-non-same-origin.sub.htm index bfa9023c1107ed..91c3845617fbd2 100644 --- a/XMLHttpRequest/send-non-same-origin.sub.htm +++ b/XMLHttpRequest/send-non-same-origin.sub.htm @@ -4,13 +4,18 @@ XMLHttpRequest: send() - non same-origin - +
+ diff --git a/XMLHttpRequest/send-sync-response-event-order.htm b/XMLHttpRequest/send-sync-response-event-order.htm index b574edb4c0e3e7..f7e4b0b216ed83 100644 --- a/XMLHttpRequest/send-sync-response-event-order.htm +++ b/XMLHttpRequest/send-sync-response-event-order.htm @@ -3,6 +3,7 @@ + XMLHttpRequest: The send() method: event order when synchronous flag is set @@ -21,30 +22,13 @@ diff --git a/XMLHttpRequest/setrequestheader-content-type.htm b/XMLHttpRequest/setrequestheader-content-type.htm index a648efa64ca67a..64a72927a6dd31 100644 --- a/XMLHttpRequest/setrequestheader-content-type.htm +++ b/XMLHttpRequest/setrequestheader-content-type.htm @@ -9,19 +9,229 @@
diff --git a/annotation-model/CONTRIBUTING.md b/annotation-model/CONTRIBUTING.md index c6180d49f3b256..b71eaa5a9d9380 100644 --- a/annotation-model/CONTRIBUTING.md +++ b/annotation-model/CONTRIBUTING.md @@ -54,6 +54,7 @@ Context](JSONtest-v1.jsonld). That context defines the following terms: |ref | URI | An optional reference to the portion of the specification to which the test relates |testType | `automated`, `manual`, `ref` | The type of test - this informs [WPT](https://github.com/w3c/web-platform-tests) how the test should be controlled and presented |assertions | list of URI, List @@@ATRISK@@@, or AssertionObject | The ordered collection of tests the input should be run against. See [JSON Schema Usage](#jsonSchema) for the structure of the objects. URI is relative to the top level folder of the test collection if it has a slash; relative to the current directory if it does not. @@@@ATRISK@@@@ Lists can be nested to define groups of sub-tests. Assertions / groups can be conditionally skipped. See [Assertion Lists](#assertionLists) for more details. +|content | URI or object | An object containing content to be checked against the referenced assertions, or a URI from which to retrieve that content Each test case has a suffix of `.test` and a shape like: @@ -101,6 +102,14 @@ External references are used when the "assertion" is a common one that needs to be checked on many different test cases (e.g., that there is an @context in the supplied annotation). +NOTE: The title property of an assertionObject can contain markdown. This can +help improve readability of the rendered assertions and debugging output. + +NOTE: The content property does not yet have a defined use. One potential use would +be to act as a pointer to a URI that can supply annotations from an implementation. +In that case the URI would take a parameter with the test name as a way of telling +the end point what test is running so it can deliver the right content. + ### Assertion Lists ### The `assertion` list is an ordered list of assertions that will be evaluated diff --git a/annotation-model/TODO b/annotation-model/TODO index ffebab2381c3a8..d2855cc9f4dd37 100644 --- a/annotation-model/TODO +++ b/annotation-model/TODO @@ -8,11 +8,6 @@ files Websocket communication to runner tests with a corresponding listener that an implementation could use to auto-submit jsonld into the "manual" tests -Change JSONtest logic so that it loads all of the required external files during -initialization so that it can populate the list of assertions for the HTML in a -manual test. Use Promises and Promise.all() to achieve this. - Add a Skip option to tools/runner Add a tuple mode for evaluating RDF declaratively as well. - diff --git a/annotation-model/annotations/.gitignore b/annotation-model/annotations/.gitignore new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/annotation-model/annotations/3.1-annotationContextValidated.json b/annotation-model/annotations/3.1-annotationContextValidated.json new file mode 100644 index 00000000000000..f7d79f2f747459 --- /dev/null +++ b/annotation-model/annotations/3.1-annotationContextValidated.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.1-annotationContextValidated.json", + "assertionType": "must", + "expectedResult": "valid", + "onUnexpectedResult" : "failAndContinue", + "errorMessage": "ERROR: Annotation is missing @context key or 'http://www.w3.org/ns/anno.jsonld' is not a value of @context.", + "title": "Annotation has **_@context_ key** and '**http://www.w3.org/ns/anno.jsonld**' is **a value of _@context_** - [model 3.1](https://www.w3.org/TR/annotation-model/#annotations)", + "description": "True when the Annotation has @context key and 'http://www.w3.org/ns/anno.jsonld' is an @context value (Section 3.1)", + "type": "object", + "required": [ "@context" ], + "properties": { + "@context": { + "oneOf": [ + { "$ref": "annotations.json#/definitions/contextValueFound" }, + { "$ref": "annotations.json#/definitions/contextValueInArrayFound" } + ] + } + } +} diff --git a/annotation-model/annotations/3.1-annotationIdValidated.json b/annotation-model/annotations/3.1-annotationIdValidated.json new file mode 100644 index 00000000000000..2fca8a4f3f1729 --- /dev/null +++ b/annotation-model/annotations/3.1-annotationIdValidated.json @@ -0,0 +1,11 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.1-annotationIdValidated.json", + "assertionType": "must", + "expectedResult": "valid", + "onUnexpectedResult" : "failAndContinue", + "errorMessage": "ERROR: Annotation is missing id key or its value is not a single string of format uri.", + "title": "Annotation has **_id_ key** which has a **single value** that is a **string of format uri** - [model 3.1](https://www.w3.org/TR/annotation-model/#annotations)", + "description": "True when the Annotation has a single id that is a string of format uri (Section 3.1)", + "$ref": "id.json#/definitions/idValueFound" +} diff --git a/annotation-model/annotations/3.1-annotationTypeValidated.json b/annotation-model/annotations/3.1-annotationTypeValidated.json new file mode 100644 index 00000000000000..b2c20d5e529921 --- /dev/null +++ b/annotation-model/annotations/3.1-annotationTypeValidated.json @@ -0,0 +1,12 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.1-annotationTypeValidated.json", + "assertionType": "must", + "expectedResult": "valid", + "onUnexpectedResult" : "failAndContinue", + "errorMessage": "ERROR: Annotation is missing type key or 'Annotation' is not a value of type.", + "title": "Annotation has **_type_ key** and '**Annotation**' is **a value of _type_** - [model 3.1](https://www.w3.org/TR/annotation-model/#annotations)", + "allOf": [ + { "$ref": "annotations.json#/definitions/annotationTypeValueFound"} + ] +} diff --git a/annotation-model/annotations/3.1-bodyKeyFound.json b/annotation-model/annotations/3.1-bodyKeyFound.json new file mode 100644 index 00000000000000..8c9ba13f8a9afb --- /dev/null +++ b/annotation-model/annotations/3.1-bodyKeyFound.json @@ -0,0 +1,12 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.1-bodyKeyFound.json", + "assertionType": "should", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Annotation Should have a body.", + "title": "Implements **_body_ key** - [model 3.1](https://www.w3.org/TR/annotation-model/#annotations)", + "description": "True when the Annotation has a body key (Section 3.1)", + "type": "object", + "required": ["body" ] +} diff --git a/annotation-model/annotations/3.1-targetKeyFound.json b/annotation-model/annotations/3.1-targetKeyFound.json new file mode 100644 index 00000000000000..be6ca25048fa51 --- /dev/null +++ b/annotation-model/annotations/3.1-targetKeyFound.json @@ -0,0 +1,12 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.1-targetKeyFound.json", + "assertionType": "must", + "expectedResult": "valid", + "onUnexpectedResult" : "failAndContinue", + "errorMessage": "Error: Annotation is missing target key.", + "title": "Annotation has a **_target_ key** - [model 3.1](https://www.w3.org/TR/annotation-model/#annotations)", + "description": "True when the Annotation has a target key (Section 3.1)", + "type": "object", + "required": ["target" ] +} diff --git a/annotation-model/annotations/3.2-bodyObjectsRecognized.json b/annotation-model/annotations/3.2-bodyObjectsRecognized.json new file mode 100644 index 00000000000000..27e79105b506a1 --- /dev/null +++ b/annotation-model/annotations/3.2-bodyObjectsRecognized.json @@ -0,0 +1,22 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.2-bodyObjectsRecognized.json", + "assertionType": "must", + "expectedResult": "valid", + "onUnexpectedResult" : "failAndContinue", + "errorMessage": "ERROR: One or more Bodies of the Annotation is not one of a string of format uri, an External Web Resource, a Choice or Set, a Specific Resource.", + "title": "If present, each **_body_** is one of a **string of format uri**, an **External Web Resource**, an **Embedded Textual Body**, a **Choice** or **Set**, or a **Specific Resource** - [model 3.2](https://www.w3.org/TR/annotation-model/#bodies-and-targets), [model 4](https://www.w3.org/TR/annotation-model/#specific-resources)", + "description": "True when all Body(ies) are one of a string of format uri, an External Web Resource, a Choice or Set, a Specific Resource (Sections 3.2, Section 4)", + "type": "object", + "properties": + { + "body": + {"oneOf": [ + { "$ref": "bodyTarget.json#/definitions/bodyResourcesFound" }, + { "type" : ["array"], + "items": { "$ref": "bodyTarget.json#/definitions/bodyResourcesFound" } + } + ] + } + } +} diff --git a/annotation-model/annotations/3.2-targetObjectsRecognized.json b/annotation-model/annotations/3.2-targetObjectsRecognized.json new file mode 100644 index 00000000000000..f6dd20ebe5591e --- /dev/null +++ b/annotation-model/annotations/3.2-targetObjectsRecognized.json @@ -0,0 +1,22 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.2-targetObjectsRecognized.json", + "assertionType": "must", + "expectedResult": "valid", + "onUnexpectedResult" : "failAndContinue", + "errorMessage": "ERROR: One or more Targets of the Annotation is not one of a string of format uri, an External Web Resource, a Choice or Set, a Specific Resource.", + "title": "Each **_target_** is one of a **string of format uri**, an **External Web Resource**, a **Choice** or **Set**, or a **Specific Resource** - [model 3.2](https://www.w3.org/TR/annotation-model/#bodies-and-targets), [model 4](https://www.w3.org/TR/annotation-model/#specific-resources)", + "description": "True when all Target(s) are one of a string of format uri, an External Web Resource, a Choice or Set, a Specific Resource (Sections 3.2, Section 4)", + "type": "object", + "properties": + { + "target": + {"oneOf": [ + { "$ref": "bodyTarget.json#/definitions/targetResourcesFound" }, + { "type" : ["array"], + "items": { "$ref": "bodyTarget.json#/definitions/targetResourcesFound" } + } + ] + } + } +} diff --git a/annotation-model/annotations/3.2.5-bodyValueImplemented.json b/annotation-model/annotations/3.2.5-bodyValueImplemented.json new file mode 100644 index 00000000000000..bce28da0b57985 --- /dev/null +++ b/annotation-model/annotations/3.2.5-bodyValueImplemented.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.1-bodyValueImplemented.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "bodyValue key not found. Annotation May have exactly one bodyValue (if no body also included).", + "title": "Implements **_bodyValue_ key** which has a **single value** that is a **string** [model 3.2.5](https://www.w3.org/TR/annotation-model/#string-body)", + "description": "True when the Annotation implements a bodyValue key (Section 3.2.5)", + "allOf": + [ + { "$ref": "annotations.json#/definitions/bodyValueFound"} + ] +} diff --git a/annotation-model/annotations/3.2.5-bodyValueValidated.json b/annotation-model/annotations/3.2.5-bodyValueValidated.json new file mode 100644 index 00000000000000..d36ee8c60a70a6 --- /dev/null +++ b/annotation-model/annotations/3.2.5-bodyValueValidated.json @@ -0,0 +1,13 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.2.5-bodyValueValidated.json", + "assertionType": "must", + "expectedResult": "valid", + "onUnexpectedResult" : "failAndContinue", + "errorMessage": "ERROR: Annotation has multiple bodyValue key values or a single bodyValue key value that is not of type string.", + "title": "If present the **_bodyValue_ key** has a **single value** that is a **string** - [model 3.2.5](https://www.w3.org/TR/annotation-model/#string-body)", + "description": "True when no Annotation bodyValue or the Annotation bodyValue key value is a single string (Section 3.2.5)", + "allOf": [ + { "$ref": "annotations.json#/definitions/bodyValueValidIfPresent" } + ] +} diff --git a/annotation-model/annotations/3.2.5-notBodyBodyValue.json b/annotation-model/annotations/3.2.5-notBodyBodyValue.json new file mode 100644 index 00000000000000..f47d6f5754c7c6 --- /dev/null +++ b/annotation-model/annotations/3.2.5-notBodyBodyValue.json @@ -0,0 +1,13 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.2.5-notBodyBodyValue.json", + "assertionType": "must", + "expectedResult": "valid", + "onUnexpectedResult" : "failAndContinue", + "errorMessage": "ERROR: body and bodyValue are exclusive keys; a single annotation cannot have both.", + "title": "Annotation has a **_body_ key**, or a **_bodyValue_ key**, or **neither**, but **NEVER both** - [model 3.2.5](https://www.w3.org/TR/annotation-model/#string-body)", + "description": "True when the Annotation does not have both body key and bodyValue key (Section 3.2.5)", + "type": "object", + "not": + { "required": [ "body", "bodyValue"] } +} diff --git a/annotation-model/annotations/3.3.1-annotationCreatedImplemented.json b/annotation-model/annotations/3.3.1-annotationCreatedImplemented.json new file mode 100644 index 00000000000000..d27fa374b5ff86 --- /dev/null +++ b/annotation-model/annotations/3.3.1-annotationCreatedImplemented.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.1-annotationCreatedImplemented.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Valid Annotation-level created key not found. Annotation may have zero or exactly one created key value.", + "title": "Implements Annotation-level **_created_ key** which has a **single value** that is a **string of format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)", + "description": "True when the Annotation implements exactly one created key value (Section 3.3.1)", + "allOf": + [ + { "$ref": "otherProperties.json#/definitions/createdPropertyFound"} + ] +} diff --git a/annotation-model/annotations/3.3.1-annotationCreatedValidated.json b/annotation-model/annotations/3.3.1-annotationCreatedValidated.json new file mode 100644 index 00000000000000..5b7435d4d3af37 --- /dev/null +++ b/annotation-model/annotations/3.3.1-annotationCreatedValidated.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.1-annotationCreatedValidated.json", + "assertionType": "must", + "expectedResult": "valid", + "onUnexpectedResult" : "failAndContinue", + "errorMessage": "ERROR: Annotation has multiple created key values or a single created key value that is not of format date-time.", + "title": "If present the Annotation-level **_created_ key** has a **single value** that is of **format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)", + "description": "True when no Annotation created key present or when created key has a single value that is of format date-time (Section 3.3.1)", + "type": "object", + "allOf": [ + { "$ref": "otherProperties.json#/definitions/createdValidIfPresent" } + ] +} diff --git a/annotation-model/annotations/3.3.1-annotationCreatorImplemented.json b/annotation-model/annotations/3.3.1-annotationCreatorImplemented.json new file mode 100644 index 00000000000000..ffe70598defe7c --- /dev/null +++ b/annotation-model/annotations/3.3.1-annotationCreatorImplemented.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.1-annotationCreatorImplemented.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "creator key not found. Annotation may have zero or more creators.", + "title": "Implements **_creator_ key** which has one or more values, each of which is a **string of format uri** or an **object** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)", + "description": "True when the Annotation implements creator key (Section 3.3.1)", + "allOf": + [ + { "$ref": "otherProperties.json#/definitions/creatorPropertyFound"} + ] +} diff --git a/annotation-model/annotations/3.3.1-annotationGeneratedImplemented.json b/annotation-model/annotations/3.3.1-annotationGeneratedImplemented.json new file mode 100644 index 00000000000000..0820ae4b335c60 --- /dev/null +++ b/annotation-model/annotations/3.3.1-annotationGeneratedImplemented.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.1-annotationGeneratedImplemented.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Valid Annotation-level generated key not found. Annotation may have zero or exactly one generated key value.", + "title": "Implements Annotation-level **_generated_ key** which has a **single value** that is a **string of format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)", + "description": "True when the Annotation implements exactly one generated key value (Section 3.3.1)", + "allOf": + [ + { "$ref": "otherProperties.json#/definitions/generatedPropertyFound"} + ] +} diff --git a/annotation-model/annotations/3.3.1-annotationGeneratedValidated.json b/annotation-model/annotations/3.3.1-annotationGeneratedValidated.json new file mode 100644 index 00000000000000..29a51a7f13183c --- /dev/null +++ b/annotation-model/annotations/3.3.1-annotationGeneratedValidated.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.1-annotationGeneratedValidated.json", + "assertionType": "must", + "expectedResult": "valid", + "onUnexpectedResult" : "failAndContinue", + "errorMessage": "ERROR: Annotation has multiple generated key values or a single generated key value that is not of format date-time.", + "title": "If present the Annotation-level **_generated_ key** has a **single value** that is of **format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)", + "description": "True when no Annotation generated key present or when generated key has a single value that is of format date-time (Section 3.3.1)", + "type": "object", + "allOf": [ + { "$ref": "otherProperties.json#/definitions/generatedValidIfPresent" } + ] +} diff --git a/annotation-model/annotations/3.3.1-annotationGeneratorImplemented.json b/annotation-model/annotations/3.3.1-annotationGeneratorImplemented.json new file mode 100644 index 00000000000000..adc1dd58f533d1 --- /dev/null +++ b/annotation-model/annotations/3.3.1-annotationGeneratorImplemented.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.1-annotationGeneratorImplemented.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "generator key not found. Annotation may have zero or more generators.", + "title": "Implements **_generator_ key** which has one or more values, each of which is a **string of format uri** or an **object** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information).", + "description": "True when the Annotation implements generator key (Section 3.3.1)", + "allOf": + [ + { "$ref": "otherProperties.json#/definitions/generatorPropertyFound"} + ] +} diff --git a/annotation-model/annotations/3.3.1-annotationModifiedImplemented.json b/annotation-model/annotations/3.3.1-annotationModifiedImplemented.json new file mode 100644 index 00000000000000..3bd8d4cef89e5c --- /dev/null +++ b/annotation-model/annotations/3.3.1-annotationModifiedImplemented.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.1-annotationModifiedImplemented.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Valid Annotation-level modified key not found. Annotation may have zero or exactly one modified key value.", + "title": "Implements Annotation-level **_modified_ key** which has a **single value** that is a **string of format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)", + "description": "True when the Annotation implements exactly one modified key value (Section 3.3.1)", + "allOf": + [ + { "$ref": "otherProperties.json#/definitions/modifiedPropertyFound"} + ] +} diff --git a/annotation-model/annotations/3.3.1-annotationModifiedValidated.json b/annotation-model/annotations/3.3.1-annotationModifiedValidated.json new file mode 100644 index 00000000000000..cc7980afaf4998 --- /dev/null +++ b/annotation-model/annotations/3.3.1-annotationModifiedValidated.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.1-annotationModifiedValidated.json", + "assertionType": "must", + "expectedResult": "valid", + "onUnexpectedResult" : "failAndContinue", + "errorMessage": "ERROR: Annotation has multiple modified key values or a single modified key value that is not of format date-time.", + "title": "If present the Annotation-level **_modified_ key** has a **single value** that is of **format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)", + "description": "True when no Annotation modified key present or when modified key has a single value that is of format date-time (Section 3.3.1)", + "type": "object", + "allOf": [ + { "$ref": "otherProperties.json#/definitions/modifiedValidIfPresent" } + ] +} diff --git a/annotation-model/annotations/3.3.1-annotationSingleCreatorImplemented.json b/annotation-model/annotations/3.3.1-annotationSingleCreatorImplemented.json new file mode 100644 index 00000000000000..b0bd901d9fd592 --- /dev/null +++ b/annotation-model/annotations/3.3.1-annotationSingleCreatorImplemented.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.1-annotationSingleCreatorImplemented.json", + "assertionType": "should", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Annotation SHOULD have a creator key with a single value.", + "title": "Implements Annotation-level **_creator_ key** with a **single value** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)", + "description": " (Section 3.3.1)", + "type": "object", + "allOf": [ + { "$ref": "otherProperties.json#/definitions/singleCreatorPropertyFound" } + ] +} diff --git a/annotation-model/annotations/3.3.1-singleAnnotationCreatorImplemented.json b/annotation-model/annotations/3.3.1-singleAnnotationCreatorImplemented.json new file mode 100644 index 00000000000000..b7da822a697adf --- /dev/null +++ b/annotation-model/annotations/3.3.1-singleAnnotationCreatorImplemented.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.1-singleAnnotationCreatorImplemented.json", + "assertionType": "should", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": " Annotation should have exactly one creator.", + "title": "Annotation implements creator key with single value.", + "description": "True when the Annotation implements creator key with single value (Section 3.3.1)", + "allOf": + [ + { "$ref": "otherProperties.json#/definitions/singleCreatorPropertyFound"} + ] +} diff --git a/annotation-model/annotations/3.3.2-annotationCreatorAgentEmailImplemented.json b/annotation-model/annotations/3.3.2-annotationCreatorAgentEmailImplemented.json new file mode 100644 index 00000000000000..6d41632ec2d242 --- /dev/null +++ b/annotation-model/annotations/3.3.2-annotationCreatorAgentEmailImplemented.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.2-annotationCreatorAgentEmailImplemented.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Email for Annotation Creator (Agent) not found. Agents may have one or more email values.", + "title": "Implements Annotation-level creator (Agent) **_email_ key** with one or more values, each of which is a **mailto: uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when one or more email values for Annotation Creator (Agent) is implemented (Section 3.3.2)", + "properties": + { "creator": + { "oneOf": + [ + { "$ref": "otherProperties.json#/definitions/agentEmailFound" }, + { "type": "array", + "minItems": 1, + "not": + { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentEmailFound" } } } + } + ] + } + }, + "required": ["creator"] +} diff --git a/annotation-model/annotations/3.3.2-annotationCreatorAgentEmail_sha1Implemented.json b/annotation-model/annotations/3.3.2-annotationCreatorAgentEmail_sha1Implemented.json new file mode 100644 index 00000000000000..78aa363a525d59 --- /dev/null +++ b/annotation-model/annotations/3.3.2-annotationCreatorAgentEmail_sha1Implemented.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.2-annotationCreatorAgentEmail_sha1Implemented.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Email_sha1 for Annotation Creator (Agent) not found. Agents may have one or more email_sha1 values.", + "title": "Implements Annotation-level creator (Agent) **email_sha1 key** with one or more values - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when one or more email_sha1 values for Annotation Creator (Agent) is implemented (Section 3.3.2)", + "properties": + { "creator": + { "oneOf": + [ + { "$ref": "otherProperties.json#/definitions/agentEmail_sha1Found" }, + { "type": "array", + "minItems": 1, + "not": + { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentEmail_sha1Found" } } } + } + ] + } + }, + "required": ["creator"] +} diff --git a/annotation-model/annotations/3.3.2-annotationCreatorAgentHomepageImplemented.json b/annotation-model/annotations/3.3.2-annotationCreatorAgentHomepageImplemented.json new file mode 100644 index 00000000000000..ff000a8261819f --- /dev/null +++ b/annotation-model/annotations/3.3.2-annotationCreatorAgentHomepageImplemented.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.2-annotationCreatorAgentHomepageImplemented.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Homepage for Annotation Creator (Agent) not found. Agents may have one or more homepage values.", + "title": "Implements Annotation-level creator (Agent) **_homepage_ key** with one or more values, each of which is a **string of format uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when one or more homepage values for Annotation Creator (Agent) is implemented (Section 3.3.2)", + "properties": + { "creator": + { "oneOf": + [ + { "$ref": "otherProperties.json#/definitions/agentHomepageFound" }, + { "type": "array", + "minItems": 1, + "not": + { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentHomepageFound" } } } + } + ] + } + }, + "required": ["creator"] +} diff --git a/annotation-model/annotations/3.3.2-annotationCreatorAgentIdImplemented.json b/annotation-model/annotations/3.3.2-annotationCreatorAgentIdImplemented.json new file mode 100644 index 00000000000000..0a2ee9c9aeab78 --- /dev/null +++ b/annotation-model/annotations/3.3.2-annotationCreatorAgentIdImplemented.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.2-annotationCreatorAgentIdImplemented.json", + "assertionType": "should", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Id for Annotation Creator (Agent) not found or more than 1 found. Agents should have exactly one id of format uri.", + "title": "Implements Annotation-level creator (Agent) **_id_ key** with **single value** that is a **string of format uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when type for Annotation Creator (Agent) has exactly one id (Section 3.3.2)", + "properties": + { "creator": + { "oneOf": + [ + { "$ref": "id.json#/definitions/idValueFound" }, + { "type": "array", + "minItems": 1, + "not": + { "items": { "not": { "$ref": "id.json#/definitions/idValueFound" } } } + } + ] + } + }, + "required": ["creator"] +} diff --git a/annotation-model/annotations/3.3.2-annotationCreatorAgentNameImplemented.json b/annotation-model/annotations/3.3.2-annotationCreatorAgentNameImplemented.json new file mode 100644 index 00000000000000..d30cd043d18be7 --- /dev/null +++ b/annotation-model/annotations/3.3.2-annotationCreatorAgentNameImplemented.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.2-annotationCreatorAgentNameImplemented.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Name for Annotation Creator (Agent) not found. Agents may have one or more name values.", + "title": "Implements Annotation-level creator (Agent) **_name_ key** with one or more values - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when one or more name values for Annotation Creator (Agent) is implemented (Section 3.3.2)", + "properties": + { "creator": + { "oneOf": + [ + { "$ref": "otherProperties.json#/definitions/agentNameFound" }, + { "type": "array", + "minItems": 1, + "not": + { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentNameFound" } } } + } + ] + } + }, + "required": ["creator"] +} diff --git a/annotation-model/annotations/3.3.2-annotationCreatorAgentNicknameImplemented.json b/annotation-model/annotations/3.3.2-annotationCreatorAgentNicknameImplemented.json new file mode 100644 index 00000000000000..782d3a66c21a21 --- /dev/null +++ b/annotation-model/annotations/3.3.2-annotationCreatorAgentNicknameImplemented.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.2-annotationCreatorAgentNicknameImplemented.json", + "assertionType": "should", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Nickname for Annotation Creator (Agent) not found. Agents should have exactly one nickname value.", + "title": "Implements Annotation-level creator (Agent) **_nickname_ key** with a **single value** that is a string - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when exactly one nickname for Annotation Creator (Agent) is implemented (Section 3.3.2)", + "properties": + { "creator": + { "oneOf": + [ + { "$ref": "otherProperties.json#/definitions/agentSingularNicknameFound" }, + { "type": "array", + "minItems": 1, + "not": + { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentSingularNicknameFound" } } } + } + ] + } + }, + "required": ["creator"] +} diff --git a/annotation-model/annotations/3.3.2-annotationCreatorAgentSingleNameImplemented.json b/annotation-model/annotations/3.3.2-annotationCreatorAgentSingleNameImplemented.json new file mode 100644 index 00000000000000..6d52e8983231dd --- /dev/null +++ b/annotation-model/annotations/3.3.2-annotationCreatorAgentSingleNameImplemented.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.2-annotationCreatorAgentSingleNameImplemented.json", + "assertionType": "should", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Single name for Annotation Creator (Agent) not found. Agents should have exactly one name value.", + "title": "Implements Annotation-level creator (Agent) **_name_ key** with a **single value** that is a string - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when exactly one name for Annotation Creator (Agent) is implemented (Section 3.3.2)", + "properties": + { "creator": + { "oneOf": + [ + { "$ref": "otherProperties.json#/definitions/agentSingularNameFound" }, + { "type": "array", + "minItems": 1, + "not": + { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentSingularNameFound" } } } + } + ] + } + }, + "required": ["creator"] +} diff --git a/annotation-model/annotations/3.3.2-annotationCreatorAgentTypeImplemented.json b/annotation-model/annotations/3.3.2-annotationCreatorAgentTypeImplemented.json new file mode 100644 index 00000000000000..5c8bb762312dad --- /dev/null +++ b/annotation-model/annotations/3.3.2-annotationCreatorAgentTypeImplemented.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.2-annotationCreatorAgentTypeImplemented.json", + "assertionType": "should", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Type (Person, Organization, Software) for Annotation Creator (Agent) not found. Agents should have one or more type values.", + "title": "Implements Annotation-level creator (Agent) **_type_ key** with one or more values from **model-recommended list (Person, Organization, Software)** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when type for Annotation Creator (Agent) is implemented (Section 3.3.2)", + "properties": + { "creator": + { "oneOf": + [ + { "$ref": "otherProperties.json#/definitions/agentTypeFound" }, + { "type": "array", + "minItems": 1, + "not": + { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentTypeFound" } } } + } + ] + } + }, + "required": ["creator"] +} diff --git a/annotation-model/annotations/3.3.2-annotationGeneratorAgentEmailImplemented.json b/annotation-model/annotations/3.3.2-annotationGeneratorAgentEmailImplemented.json new file mode 100644 index 00000000000000..1f619843562956 --- /dev/null +++ b/annotation-model/annotations/3.3.2-annotationGeneratorAgentEmailImplemented.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.2-annotationGeneratorAgentEmailImplemented.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Email for Annotation Generator (Agent) not found. Agents may have one or more email values.", + "title": "Implements Annotation-level generator (Agent) **_email_ key** with one or more values, each of which is a **mailto: uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when one or more email values for Annotation Generator (Agent) is implemented (Section 3.3.2)", + "properties": + { "generator": + { "oneOf": + [ + { "$ref": "otherProperties.json#/definitions/agentEmailFound" }, + { "type": "array", + "minItems": 1, + "not": + { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentEmailFound" } } } + } + ] + } + }, + "required": ["generator"] +} diff --git a/annotation-model/annotations/3.3.2-annotationGeneratorAgentEmail_sha1Implemented.json b/annotation-model/annotations/3.3.2-annotationGeneratorAgentEmail_sha1Implemented.json new file mode 100644 index 00000000000000..f864f24ae7bb7f --- /dev/null +++ b/annotation-model/annotations/3.3.2-annotationGeneratorAgentEmail_sha1Implemented.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.2-annotationGeneratorAgentEmail_sha1Implemented.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Email_sha1 for Annotation Generator (Agent) not found. Agents may have one or more email_sha1 values.", + "title": "Implements Annotation-level generator (Agent) **email_sha1 key** with one or more values - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when one or more email_sha1 values for Annotation Generator (Agent) is implemented (Section 3.3.2)", + "properties": + { "generator": + { "oneOf": + [ + { "$ref": "otherProperties.json#/definitions/agentEmail_sha1Found" }, + { "type": "array", + "minItems": 1, + "not": + { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentEmail_sha1Found" } } } + } + ] + } + }, + "required": ["generator"] +} diff --git a/annotation-model/annotations/3.3.2-annotationGeneratorAgentHomepageImplemented.json b/annotation-model/annotations/3.3.2-annotationGeneratorAgentHomepageImplemented.json new file mode 100644 index 00000000000000..664f5a5cf12e59 --- /dev/null +++ b/annotation-model/annotations/3.3.2-annotationGeneratorAgentHomepageImplemented.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.2-annotationGeneratorAgentHomepageImplemented.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Homepage for Annotation Generator (Agent) not found. Agents may have one or more homepage values.", + "title": "Implements Annotation-level generator (Agent) **_homepage_ key** with one or more values, each of which is a **string of format uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when one or more homepage values for Annotation Generator (Agent) is implemented (Section 3.3.2)", + "properties": + { "generator": + { "oneOf": + [ + { "$ref": "otherProperties.json#/definitions/agentHomepageFound" }, + { "type": "array", + "minItems": 1, + "not": + { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentHomepageFound" } } } + } + ] + } + }, + "required": ["generator"] +} diff --git a/annotation-model/annotations/3.3.2-annotationGeneratorAgentIdImplemented.json b/annotation-model/annotations/3.3.2-annotationGeneratorAgentIdImplemented.json new file mode 100644 index 00000000000000..59a70dbb47e34f --- /dev/null +++ b/annotation-model/annotations/3.3.2-annotationGeneratorAgentIdImplemented.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.2-annotationGeneratorAgentIdImplemented.json", + "assertionType": "should", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Id for Annotation Generator (Agent) not found or more than 1 found. Agents should have exactly one id of format uri.", + "title": "Implements Annotation-level generator (Agent) **_id_ key** with **single value** that is a **string of format uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when type for Annotation Generator (Agent) has exactly one id (Section 3.3.2)", + "properties": + { "generator": + { "oneOf": + [ + { "$ref": "id.json#/definitions/idValueFound" }, + { "type": "array", + "minItems": 1, + "not": + { "items": { "not": { "$ref": "id.json#/definitions/idValueFound" } } } + } + ] + } + }, + "required": ["generator"] +} diff --git a/annotation-model/annotations/3.3.2-annotationGeneratorAgentNameImplemented.json b/annotation-model/annotations/3.3.2-annotationGeneratorAgentNameImplemented.json new file mode 100644 index 00000000000000..eeb8722b36ea45 --- /dev/null +++ b/annotation-model/annotations/3.3.2-annotationGeneratorAgentNameImplemented.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.2-annotationGeneratorAgentNameImplemented.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Name for Annotation Generator (Agent) not found. Agents may have one or more name values.", + "title": "Implements Annotation-level generator (Agent) **_name_ key** with one or more values. [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when one or more name values for Annotation Generator (Agent) is implemented (Section 3.3.2)", + "properties": + { "generator": + { "oneOf": + [ + { "$ref": "otherProperties.json#/definitions/agentNameFound" }, + { "type": "array", + "minItems": 1, + "not": + { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentNameFound" } } } + } + ] + } + }, + "required": ["generator"] +} diff --git a/annotation-model/annotations/3.3.2-annotationGeneratorAgentNicknameImplemented.json b/annotation-model/annotations/3.3.2-annotationGeneratorAgentNicknameImplemented.json new file mode 100644 index 00000000000000..ae8e235dea9112 --- /dev/null +++ b/annotation-model/annotations/3.3.2-annotationGeneratorAgentNicknameImplemented.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.2-annotationGeneratorAgentNicknameImplemented.json", + "assertionType": "should", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Nickname for Annotation Generator (Agent) not found. Agents should have exactly one nickname value.", + "title": "Implements Annotation-level generator (Agent) **_nickname_ key** with a **single value** that is a string - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when exactly one nickname for Annotation Generator (Agent) is implemented (Section 3.3.2)", + "properties": + { "generator": + { "oneOf": + [ + { "$ref": "otherProperties.json#/definitions/agentSingularNicknameFound" }, + { "type": "array", + "minItems": 1, + "not": + { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentSingularNicknameFound" } } } + } + ] + } + }, + "required": ["generator"] +} diff --git a/annotation-model/annotations/3.3.2-annotationGeneratorAgentSingleNameImplemented.json b/annotation-model/annotations/3.3.2-annotationGeneratorAgentSingleNameImplemented.json new file mode 100644 index 00000000000000..a657e5cac1a8ca --- /dev/null +++ b/annotation-model/annotations/3.3.2-annotationGeneratorAgentSingleNameImplemented.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.2-annotationGeneratorAgentSingleNameImplemented.json", + "assertionType": "should", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Single name for Annotation Generator (Agent) not found. Agents should have exactly one name value.", + "title": "Implements Annotation-level generator (Agent) **_name_ key** with a **single value** that is a string - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when exactly one name for Annotation Generator (Agent) is implemented (Section 3.3.2)", + "properties": + { "generator": + { "oneOf": + [ + { "$ref": "otherProperties.json#/definitions/agentSingularNameFound" }, + { "type": "array", + "minItems": 1, + "not": + { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentSingularNameFound" } } } + } + ] + } + }, + "required": ["generator"] +} diff --git a/annotation-model/annotations/3.3.2-annotationGeneratorAgentTypeImplemented.json b/annotation-model/annotations/3.3.2-annotationGeneratorAgentTypeImplemented.json new file mode 100644 index 00000000000000..4d12fbd07e9959 --- /dev/null +++ b/annotation-model/annotations/3.3.2-annotationGeneratorAgentTypeImplemented.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.2-annotationGeneratorAgentTypeImplemented.json", + "assertionType": "should", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Type (Person, Organization, Software) for Annotation Generator (Agent) not found. Agents should have one or more type values.", + "title": "Implements Annotation-level generator (Agent) **_type_ key** with one or more values from **model-recommended list (Person, Organization, Software)** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when type for Annotation Generator (Agent) is implemented (Section 3.3.2)", + "properties": + { "generator": + { "oneOf": + [ + { "$ref": "otherProperties.json#/definitions/agentTypeFound" }, + { "type": "array", + "minItems": 1, + "not": + { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentTypeFound" } } } + } + ] + } + }, + "required": ["generator"] +} diff --git a/annotation-model/annotations/3.3.3-annotationAudienceImplemented.json b/annotation-model/annotations/3.3.3-annotationAudienceImplemented.json new file mode 100644 index 00000000000000..164a45d99910e8 --- /dev/null +++ b/annotation-model/annotations/3.3.3-annotationAudienceImplemented.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.3-annotationAudienceImplemented.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "audience key not found. An Annotation may have one or more audience values.", + "title": "Implements **_audience_ key** which has one or more values with each audience instance described using **[schema.org/Audience](http://schema.org/Audience) classes and properties** - [model 3.3.3](https://www.w3.org/TR/annotation-model/#intended-audience)", + "description": "True when the Annotation has an audience key (Section 3.3.3)", + "allOf": + [ + {"$ref": "otherProperties.json#/definitions/audiencePropertyFound"} + ] +} diff --git a/annotation-model/annotations/3.3.5-annotationMotivationImplemented.json b/annotation-model/annotations/3.3.5-annotationMotivationImplemented.json new file mode 100644 index 00000000000000..3933df5bb621f8 --- /dev/null +++ b/annotation-model/annotations/3.3.5-annotationMotivationImplemented.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.5-annotationMotivationImplemented.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "motivation key with value from model motivation list not found. Annotation may have zero or more motivations with values drawn from model ontology.", + "title": "Implements **_motivation_ key** which has one or more values, each of which is from the **model's list of Motivations** - [model 3.3.5](https://www.w3.org/TR/annotation-model/#motivation-and-purpose)", + "description": "True when the Annotation implements motivation key with value(s) drawn from model motivation ontology (Section 3.3.5)", + "allOf": + [ + { "$ref": "annotations.json#/definitions/motivationPropertyFound"} + ] +} diff --git a/annotation-model/annotations/3.3.5-annotationSingleMotivationImplemented.json b/annotation-model/annotations/3.3.5-annotationSingleMotivationImplemented.json new file mode 100644 index 00000000000000..1f6358a0834547 --- /dev/null +++ b/annotation-model/annotations/3.3.5-annotationSingleMotivationImplemented.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.5-annotationSingleMotivationImplemented.json", + "assertionType": "should", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": " Annotation SHOULD have a motivation key with a single value from model motivation ontology.", + "title": "Implements **_motivation_ key** with a **single value** that is from the **model's list of Motivations** - [model 3.3.5](https://www.w3.org/TR/annotation-model/#motivation-and-purpose)", + "description": "True when the Annotation has motivation key with a single value from model motivation ontology (Section 3.3.5)", + "type": "object", + "allOf": [ + { "$ref": "annotations.json#/definitions/singleMotivationPropertyFound" } + ] +} diff --git a/annotation-model/annotations/3.3.6-annotationRightsImplemented.json b/annotation-model/annotations/3.3.6-annotationRightsImplemented.json new file mode 100644 index 00000000000000..a2e2a993700581 --- /dev/null +++ b/annotation-model/annotations/3.3.6-annotationRightsImplemented.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.6-annotationRightsImplemented.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Annotatoin-level rights key having string value(s) of format uri not found. Annotation may have zero or more rights key values.", + "title": "Implements Annotation-level **_rights_** key which has one or more values, each of which is a **string of format uri** - [model 3.3.6](https://www.w3.org/TR/annotation-model/#rights-information)", + "description": "True when the Annotation implements rights key with with string(s) of format uri value(s) (Section 3.3.6)", + "allOf": + [ + { "$ref": "otherProperties.json#/definitions/rightsPropertyFound"} + ] +} diff --git a/annotation-model/annotations/3.3.6-annotationRightsValidated.json b/annotation-model/annotations/3.3.6-annotationRightsValidated.json new file mode 100644 index 00000000000000..40c025f689f302 --- /dev/null +++ b/annotation-model/annotations/3.3.6-annotationRightsValidated.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.6-annotationRightsValidated.json", + "assertionType": "must", + "expectedResult": "valid", + "onUnexpectedResult" : "failAndContinue", + "errorMessage": "ERROR: Annotation has one or more values for the rights key are not strings of format uri.", + "title": "If present the Annotation-level **_rights_ key** has values that are all **strings of format uri** - [model 3.3.6](https://www.w3.org/TR/annotation-model/#rights-information)", + "description": "True when no Annotation rights key present or when all values of rights key are strings of format uri (Section 3.3.6)", + "type": "object", + "allOf": [ + { "$ref": "otherProperties.json#/definitions/rightsValidIfPresent" } + ] +} diff --git a/annotation-model/annotations/3.3.7-annotationCanonicalImplemented.json b/annotation-model/annotations/3.3.7-annotationCanonicalImplemented.json new file mode 100644 index 00000000000000..1f58d84b0af3e1 --- /dev/null +++ b/annotation-model/annotations/3.3.7-annotationCanonicalImplemented.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.7-annotationCanonicalImplemented.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "canonical key having a single string value of format uri not found. Annotation may have canonical key with exactly one value.", + "title": "Implements Annotation-level **_canonical_ key** which has a single value that is a **string of format uri** - [model 3.3.7](https://www.w3.org/TR/annotation-model/#other-identities)", + "description": "True when the Annotation implements canonical key with with single string of format uri value (Section 3.3.7)", + "allOf": + [ + { "$ref": "otherProperties.json#/definitions/canonicalPropertyFound"} + ] +} diff --git a/annotation-model/annotations/3.3.7-annotationCanonicalValidated.json b/annotation-model/annotations/3.3.7-annotationCanonicalValidated.json new file mode 100644 index 00000000000000..db1a9c27f00168 --- /dev/null +++ b/annotation-model/annotations/3.3.7-annotationCanonicalValidated.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.7-annotationCanonicalValidated.json", + "assertionType": "must", + "expectedResult": "valid", + "onUnexpectedResult" : "failAndContinue", + "errorMessage": "ERROR: Annotation has more than one value for canonical key or value for canonical key is not of format uri.", + "title": "If present the Annotation-level **_canonical_ key** has a **single value** that is a **string of format uri** - [model 3.3.7](https://www.w3.org/TR/annotation-model/#other-identities)", + "description": "True when no Annotation canonical key present or when value of canonical key is singular and of format uri (Section 3.3.7)", + "type": "object", + "allOf": [ + { "$ref": "otherProperties.json#/definitions/canonicalValidIfPresent" } + ] +} diff --git a/annotation-model/annotations/3.3.7-annotationViaImplemented.json b/annotation-model/annotations/3.3.7-annotationViaImplemented.json new file mode 100644 index 00000000000000..f25cfb0270404a --- /dev/null +++ b/annotation-model/annotations/3.3.7-annotationViaImplemented.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.7-annotationViaImplemented.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "Annotation-level via key with string(s) of format uri as value(s) not found. Annotation may have via key with one or more values.", + "title": "Implements Annotation-level **_via_ key** which has one or more values, each of which is a **string of format uri** - [model 3.3.7](https://www.w3.org/TR/annotation-model/#other-identities)", + "description": "True when the Annotation implements via key with with string(s) of format uri as value(s) (Section 3.3.7)", + "allOf": + [ + { "$ref": "otherProperties.json#/definitions/viaPropertyFound"} + ] +} diff --git a/annotation-model/annotations/3.3.7-annotationViaValidated.json b/annotation-model/annotations/3.3.7-annotationViaValidated.json new file mode 100644 index 00000000000000..2592ed800dfcdf --- /dev/null +++ b/annotation-model/annotations/3.3.7-annotationViaValidated.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.7-annotationviaValidated.json", + "assertionType": "must", + "expectedResult": "valid", + "onUnexpectedResult" : "failAndContinue", + "errorMessage": "ERROR: Annotation values for via key are not of format uri.", + "title": "If present the Annotation-level **_via_ key** has values that are all **strings of format uri** - [model 3.3.7](https://www.w3.org/TR/annotation-model/#other-identities)", + "description": "True when no Annotation via key present or when all values of via key are strings of format uri (Section 3.3.7)", + "type": "object", + "allOf": [ + { "$ref": "otherProperties.json#/definitions/viaValidIfPresent" } + ] +} diff --git a/annotation-model/annotations/4.4-annotationStylesheetImplemented.json b/annotation-model/annotations/4.4-annotationStylesheetImplemented.json new file mode 100644 index 00000000000000..d5a264732d4550 --- /dev/null +++ b/annotation-model/annotations/4.4-annotationStylesheetImplemented.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "4.4-annotationStylesheetImplemented.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "stylesheet key with exactly one value not found. Annotation may have stylesheet key with exactly one value.", + "title": "Implements **_stylesheet_ key** which has a **single value** that is an **object or string of format uri**. [model 4.4](https://www.w3.org/TR/annotation-model/#styles)", + "description": "True when the Annotation implements stylesheet key with exactly one value (object or string of format uri)(Section 4.4)", + "allOf": + [ + { "$ref": "annotations.json#/definitions/stylesheetDetected"} + ] +} diff --git a/annotation-model/annotations/annotationAgentOptionals-manual.html b/annotation-model/annotations/annotationAgentOptionals-manual.html new file mode 100644 index 00000000000000..1fe354375689c0 --- /dev/null +++ b/annotation-model/annotations/annotationAgentOptionals-manual.html @@ -0,0 +1,61 @@ + + + +Annotation implements optional keys and meets optional key value constraints for Creator and Generator Agents + + + + + + + + +

Fill the textarea below with JSON output from your annotation client +implementation that supports the following criteria:

+
+

Specifically, the following assertions will be evaluated:

+
+
+ +

+

+
+ + diff --git a/annotation-model/annotations/annotationAgentOptionals.test b/annotation-model/annotations/annotationAgentOptionals.test new file mode 100644 index 00000000000000..ee61869e49b56b --- /dev/null +++ b/annotation-model/annotations/annotationAgentOptionals.test @@ -0,0 +1,25 @@ +{ + "@context": "https://www.w3.org/ns/JSONtest-v1.jsonld", + "name": "Annotation implements optional keys and meets optional key value constraints for Creator and Generator Agents", + "description": "Agents (Creators, Generators) involved in an Annotation:
  • Should include certain properties (keys)
  • May include additional keys
  • should have Agent key values that conform to model recommended constraints
Note: failing an assertion indicates that a recommended or optional feature has not been implemented or has not been implemented correctly.", + "testType": "manual", + "ref": "https://www.w3.org/TR/annotation-model/#other-properties", + "assertions": [ + "annotations/3.3.2-annotationCreatorAgentIdImplemented.json", + "annotations/3.3.2-annotationGeneratorAgentIdImplemented.json", + "annotations/3.3.2-annotationCreatorAgentTypeImplemented.json", + "annotations/3.3.2-annotationGeneratorAgentTypeImplemented.json", + "annotations/3.3.2-annotationCreatorAgentNicknameImplemented.json", + "annotations/3.3.2-annotationGeneratorAgentNicknameImplemented.json", + "annotations/3.3.2-annotationCreatorAgentSingleNameImplemented.json", + "annotations/3.3.2-annotationGeneratorAgentSingleNameImplemented.json", + "annotations/3.3.2-annotationCreatorAgentNameImplemented.json", + "annotations/3.3.2-annotationGeneratorAgentNameImplemented.json", + "annotations/3.3.2-annotationCreatorAgentEmailImplemented.json", + "annotations/3.3.2-annotationGeneratorAgentEmailImplemented.json", + "annotations/3.3.2-annotationCreatorAgentEmail_sha1Implemented.json", + "annotations/3.3.2-annotationGeneratorAgentEmail_sha1Implemented.json", + "annotations/3.3.2-annotationCreatorAgentHomepageImplemented.json", + "annotations/3.3.2-annotationGeneratorAgentHomepageImplemented.json" + ] +} diff --git a/annotation-model/annotations/annotationMusts-manual.html b/annotation-model/annotations/annotationMusts-manual.html new file mode 100644 index 00000000000000..1caa167c73e6d4 --- /dev/null +++ b/annotation-model/annotations/annotationMusts-manual.html @@ -0,0 +1,61 @@ + + + +Annotation has all required keys and all annotation keys used meet required value constraints + + + + + + + + +

Fill the textarea below with JSON output from your annotation client +implementation that supports the following criteria:

+
+

Specifically, the following assertions will be evaluated:

+
+
+ +

+

+
+ + diff --git a/annotation-model/annotations/annotationMusts.test b/annotation-model/annotations/annotationMusts.test new file mode 100644 index 00000000000000..e32bd482e43ad5 --- /dev/null +++ b/annotation-model/annotations/annotationMusts.test @@ -0,0 +1,23 @@ +{ + "@context": "https://www.w3.org/ns/JSONtest-v1.jsonld", + "name": "Annotation has all required keys and all annotation keys used meet required value constraints", + "description": "Web Annotations:
  • MUST include certain properties (keys)
  • MUST NOT have both body and bodyValue keys simultaneously
  • MUST satisfy model constraints on values of required and any optional Annotation keys used
Note: Optional Annotation keys, optional constraints on key values, and optional and required details of body(ies) and target(s) checked by other tests.", + "testType": "manual", + "ref": "https://www.w3.org/TR/annotation-model/#annotations", + "assertions": [ + "annotations/3.1-annotationContextValidated.json", + "annotations/3.1-annotationIdValidated.json", + "annotations/3.1-annotationTypeValidated.json", + "annotations/3.1-targetKeyFound.json", + "annotations/3.2-targetObjectsRecognized.json", + "annotations/3.2.5-notBodyBodyValue.json", + "annotations/3.2-bodyObjectsRecognized.json", + "annotations/3.2.5-bodyValueValidated.json", + "annotations/3.3.1-annotationCreatedValidated.json", + "annotations/3.3.1-annotationModifiedValidated.json", + "annotations/3.3.1-annotationGeneratedValidated.json", + "annotations/3.3.6-annotationRightsValidated.json", + "annotations/3.3.7-annotationCanonicalValidated.json", + "annotations/3.3.7-annotationViaValidated.json" + ] +} diff --git a/annotation-model/annotations/annotationOptionals-manual.html b/annotation-model/annotations/annotationOptionals-manual.html new file mode 100644 index 00000000000000..acdefff4e27bc2 --- /dev/null +++ b/annotation-model/annotations/annotationOptionals-manual.html @@ -0,0 +1,61 @@ + + + +Annotation implements optional keys and meets optional key value constraints + + + + + + + + +

Fill the textarea below with JSON output from your annotation client +implementation that supports the following criteria:

+
+

Specifically, the following assertions will be evaluated:

+
+
+ +

+

+
+ + diff --git a/annotation-model/annotations/annotationOptionals.test b/annotation-model/annotations/annotationOptionals.test new file mode 100644 index 00000000000000..8fd1da41ce9f94 --- /dev/null +++ b/annotation-model/annotations/annotationOptionals.test @@ -0,0 +1,25 @@ +{ + "@context": "https://www.w3.org/ns/JSONtest-v1.jsonld", + "name": "Annotation implements optional keys and meets optional key value constraints", + "description": "Web Annotations:
  • Should include certain properties (keys)
  • May include additional keys
  • should have Annotation key values that conform to model recommended constraints
Note: failing an assertion indicates that a recommended or optional feature has not been implemented or has not been implemented correctly.", + "testType": "manual", + "ref": "https://www.w3.org/TR/annotation-model/#other-properties", + "assertions": [ + "annotations/3.1-bodyKeyFound.json", + "annotations/3.3.1-annotationSingleCreatorImplemented.json", + "annotations/3.3.1-annotationCreatedImplemented.json", + "annotations/3.3.5-annotationSingleMotivationImplemented.json", + "annotations/3.2.5-bodyValueImplemented.json", + "annotations/3.3.1-annotationCreatorImplemented.json", + "annotations/3.3.1-annotationGeneratorImplemented.json", + "annotations/3.3.1-annotationGeneratedImplemented.json", + "annotations/3.3.1-annotationModifiedImplemented.json", + "annotations/3.3.3-annotationAudienceImplemented.json", + "annotations/3.3.5-annotationMotivationImplemented.json", + "annotations/3.3.6-annotationRightsImplemented.json", + "annotations/3.3.7-annotationCanonicalImplemented.json", + "annotations/3.3.7-annotationViaImplemented.json", + "annotations/4.4-annotationStylesheetImplemented.json" + + ] +} diff --git a/annotation-model/annotations/bodyResource.json b/annotation-model/annotations/bodyResource.json new file mode 100644 index 00000000000000..4d65cb8f62d6a1 --- /dev/null +++ b/annotation-model/annotations/bodyResource.json @@ -0,0 +1,32 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Check that class of body(ies) is(are) valid", + "description": "A body must be either a string/uri, a TextualBody, a Choice/Set, a SpecificResource, or an External Web Resource (Sections 3.1, 3.2.4, 3.2.7, 3.2.8 4, 3.2.1)", + "assertionType": "must", + "expectedResult": "valid", + "errorMessage": "Error; an invalid string or class of object is used as a body of the Annotation.", + "type": "object", + "properties": { + "body": + {"oneOf": [ + { "type" : ["string", "object"], + "anyOf": [ + {"$ref": "stringUri.json#"}, + {"$ref": "textualBody.json#" }, + {"$ref": "choiceSet.json#" }, + {"$ref": "specificResource.json#" }, + {"$ref": "externalWebResource.json#" } + ] + }, + { "type" : ["array"], + "items": {"anyOf": [ + {"$ref": "stringUri.json#" }, + {"$ref": "textualBody.json#" }, + {"$ref": "choiceSet.json#" }, + {"$ref": "specificResource.json#" }, + {"$ref": "externalWebResource.json#" } + ] } } + ] + } + } +} diff --git a/annotation-model/annotations/targetResource.json b/annotation-model/annotations/targetResource.json new file mode 100644 index 00000000000000..6c4b51f866c487 --- /dev/null +++ b/annotation-model/annotations/targetResource.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Check that class of target(s) is(are) valid", + "description": "A target must be either a string/uri, a Choice/Set, a SpecificResource, or an External Web Resource (Sections 3.1, 3.2.7, 3.2.8 4, 3.2.1)", + "assertionType": "must", + "expectedResult": "valid", + "errorMessage": "Error; an invalid string or class of object is used as a target of the Annotation.", + "type": "object", + "properties": + { + "target": + {"oneOf": [ + { "type" : ["string", "object"], + "anyOf": [ + {"$ref": "stringUri.json#" }, + {"$ref": "choiceSet.json#" }, + {"$ref": "specificResource.json#" }, + {"$ref": "externalWebResource.json#" } + ] + }, + { "type" : ["array"], + "items": {"anyOf": [ + {"$ref": "stringUri.json#" }, + {"$ref": "choiceSet.json#" }, + {"$ref": "specificResource.json#" }, + {"$ref": "externalWebResource.json#" } + ] } } + ] + } + } +} diff --git a/annotation-model/collections/.gitignore b/annotation-model/collections/.gitignore new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/annotation-model/definitions/annotations.json b/annotation-model/definitions/annotations.json new file mode 100644 index 00000000000000..df1f73613ab1b5 --- /dev/null +++ b/annotation-model/definitions/annotations.json @@ -0,0 +1,212 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "annotations.json", + "title": "Definitions: Annotations.", + "description": "Schemas in #/definitions detect or validate keys/objects (direct children) uniquely used to describe Annotations (Section 3.1 and 3.3.5).", + "definitions": { + + "contextValueFound": { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Valid @context string", + "description": "True when the string has value http://www.w3.org/ns/anno.jsonld (Section 3.1)", + "type": "string", + "enum": [ "http://www.w3.org/ns/anno.jsonld" ] + }, + + "contextValueInArrayFound": { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Valid @context string found in array", + "description": "True when the array contains a string item having value http://www.w3.org/ns/anno.jsonld (Section 3.1)", + "type": "array", + "not": + { "items": + { "not": + { "$ref": "#/definitions/contextValueFound" } + } + } + }, + + "annotationTypeValueRecognized": { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Valid annotation type value string", + "description": "True when the string has value 'Annotation' (Section 3.1)", + "type": "string", + "enum": [ "Annotation" ] + }, + + "annotationTypeValueInArrayRecognized": { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Valid annotation type array", + "description": "True when the array contains a string item having value 'Annotation' (Section 3.1)", + "type": "array", + "not": + { "items": + { "not": + { "$ref": "#/definitions/annotationTypeValueRecognized" } + } + } + }, + + "annotationTypeValueFound": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Implementation: Annotation type", + "description": "True when the Annotation has type key and 'Annotation' is a value of type (Section 3.1)", + "type": "object", + "required": [ "type" ], + "properties": { + "type": { + "oneOf": [ + { "$ref": "annotations.json#/definitions/annotationTypeValueRecognized" }, + { "$ref": "annotations.json#/definitions/annotationTypeValueInArrayRecognized" } + ] + } + } + }, + + "motivationList": + { "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definitions: list of motivation and purposes", + "description": "List of motivations and purposes as defined in the model (Section 3.3.5).", + "type": "string", + "enum": ["assessing", "bookmarking", "classifying", "commenting", "describing", "editing", "highlighting", "identifying", "linking", "moderating", "questioning", "replying", "tagging" ] + }, + + "motivationRecognizedIfPresent": + { "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Validation: motivation value", + "description": "True when the annotation has 0 or more motivation property values (Section 3.3.5)", + "type": "object", + "properties": {"motivation": + { "oneOf": [ + { "$ref": "#/definitions/motivationList" }, + { "type": "array", + "minItems": 1, + "items": { "$ref": "#/definitions/motivationList" } } + ] + } + } + }, + + "motivationSingularIfPresent": + { "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Validation: singular motivation value", + "description": "True when the annotation has 0 or exactly one motivation property value (Section 3.3.5)", + "type": "object", + "properties": {"motivation": + { "oneOf": [ + { "$ref": "#/definitions/motivationList" }, + { "type": "array", + "minItems": 1, + "maxItems": 1, + "items": { "$ref": "#/definitions/motivationList" } } + ] + } + } + }, + + "motivationPropertyFound": + { "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: via motivation with qualifying annotation class", + "description": "Supports implementation check of via (if/when) used on Annotation (Sections 3.3.5)", + "oneOf": [ + {"$ref": "#/definitions/annotationTypeValueFound"} + ], + "allOf": [ + {"required": ["motivation"]}, + {"$ref": "#/definitions/motivationRecognizedIfPresent"} + ] + }, + + "singleMotivationPropertyFound": + { "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: via motivation with qualifying annotation class", + "description": "Supports implementation check of via (if/when) used on Annotation (Sections 3.3.5)", + "oneOf": [ + {"$ref": "#/definitions/annotationTypeValueFound"} + ], + "allOf": [ + {"required": ["motivation"]}, + {"$ref": "#/definitions/motivationSingularIfPresent"} + ] + }, + + "stylesheetValueDefinition": + { + "title": "Definition: stylesheet value", + "description": "True when Annotation has no stylesheet, references an external stylesheet, or has embedded stylesheet of type CssStylesheet (Section 4.4)", + "type": "object", + "properties": + { + "stylesheet": + { + "oneOf": + [ + { "$ref": "id.json#/definitions/arraySingleStringUri"}, + { "type": "object", + "properties": + { + "type": { "type": "string", + "enum": [ "CssStylesheet" ]}, + "id": { "$ref": "id.json#/definitions/stringUri" }, + "value": { "type": "string" } + }, + "not": { "required": [ "id", "value"] }, + "oneOf": [ + { "required": [ "id"] }, + { "required": [ "value"] } + ] + } + ] + } + } + }, + + "stylesheetDetected": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Check for implementation of Annotation stylesheet", + "description": "True when the Annotation has a valid stylesheet property (Section 4.4)", + "allOf": [ + {"required": ["stylesheet"]}, + {"$ref": "#/definitions/stylesheetValueDefinition"} + ] + }, + + "bodyValueValidIfPresent": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Validation: bodyValue", + "description": "True when the Annotation has no bodyValue key or has a bodyValue key with valid value (Section 3.2.5)", + "type": "object", + "properties": + { + "bodyValue": + { + "oneOf": + [ + { "type": "string" }, + { "type": "array", + "minItems": 1, + "maxItems": 1, + "items": { "type": "string" } + } + ] + } + } + }, + + "bodyValueFound": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": " Implementation: bodyValue", + "description": "True when the Annotation has a valid bodyValue (Section 3.2.5)", + "allOf": + [ + { "$ref": "#/definitions/bodyValueValidIfPresent" }, + { "required": [ "bodyValue" ] } + ] + } + + } +} diff --git a/annotation-model/definitions/bodyTarget.json b/annotation-model/definitions/bodyTarget.json new file mode 100644 index 00000000000000..a01d41337c0e92 --- /dev/null +++ b/annotation-model/definitions/bodyTarget.json @@ -0,0 +1,521 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "bodyTarget.json", + "title": "Definitions: Bodies and Targets.", + "description": "Schemas in #/definitions detect or validate keys, objects or constraints variously applicable to Bodies and/or Targets (Section 3.2.1 - 3.2.6). Excludes Choice, Set and Specific Resources.", + "definitions": + { + "externalWebResourceDetected": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: External Web Resource", + "description": "True when the object is an External Web Resource, i.e., includes an id that is of format uri but does not contain value (Textual Body) or source (Specific Resource) keys (Sections 3.2.1, 3.2.4, 4).", + "type": "object", + "allOf": [ {"$ref": "id.json#/definitions/idValueFound"} ], + "not": + { "anyOf": + [ + { "required": ["value"] }, + { "required": ["source"] }, + { "required": ["target"] } + ] + } + }, + + "textualBodyFound" : + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Embedded Textual Body", + "description": "True when the object is an Embedded Textual Body, i.e., includes the value key (Section 3.2.4).", + "type" : "object", + "properties" : + { + "value": + { + "type": "string" + } + }, + "required": [ "value" ] + } , + + "targetResourcesFound" : + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Resources that can be used as Target", + "description": "True when the string is format uri or the object is recognized as a valid target resource (Sections 3.2 and 4).", + "type" : ["string", "object"], + "oneOf": [ + {"$ref": "id.json#/definitions/stringUri"}, + {"$ref": "choiceSet.json#/definitions/choiceDetected" }, + {"$ref": "choiceSet.json#/definitions/compositeDetected" }, + {"$ref": "choiceSet.json#/definitions/independentsDetected" }, + {"$ref": "choiceSet.json#/definitions/listDetected" }, + {"$ref": "specificResource.json#/definitions/specificeResourceDetected" }, + {"$ref": "#/definitions/externalWebResourceDetected" } + ] + }, + + "bodyResourcesFound" : + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Resources that can be used as Body", + "description": "True when the string is format uri or the object is recognized as a valid body resource (Sections 3.2 and 4).", + "type" : ["string", "object"], + "oneOf": [ + {"$ref": "id.json#/definitions/stringUri"}, + {"$ref": "choiceSet.json#/definitions/choiceDetected" }, + {"$ref": "choiceSet.json#/definitions/compositeDetected" }, + {"$ref": "choiceSet.json#/definitions/independentsDetected" }, + {"$ref": "choiceSet.json#/definitions/listDetected" }, + {"$ref": "specificResource.json#/definitions/specificeResourceDetected" }, + {"$ref": "#/definitions/externalWebResourceDetected" }, + {"$ref": "#/definitions/textualBodyFound" } + ] + }, + + "optionalBodyPropertiesShould" : + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: Optional Body Keys Should Validations", + "description": "Supports validity checks of optional keys (if/when) used on External Web Resources, Specific Resources, Textual Body Resources (Sections 3.2.1-6, 3.3)", + "oneOf": + [ + {"$ref": "specificResource.json#/definitions/specificeResourceDetected" }, + {"$ref": "#/definitions/externalWebResourceDetected" }, + {"$ref": "#/definitions/textualBodyFound" } + ], + "allOf" : + [ + { "$ref": "#/definitions/resourceTypeShouldIfPresent" }, + { "$ref": "#/definitions/formatValidIfPresent" }, + { "$ref": "#/definitions/languageValidIfPresent" }, + { "$ref": "#/definitions/processingLanguageValidIfPresent" }, + { "$ref": "otherProperties.json#/definitions/creatorValidIfPresent" }, + { "$ref": "otherProperties.json#/definitions/generatorValidIfPresent" }, + { "$ref": "otherProperties.json#/definitions/audienceValidIfPresent" }, + { "$ref": "otherProperties.json#/definitions/accessibilityValidIfPresent" } + ] + }, + + "optionalBodyPropertiesMust" : + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: Optional Body Keys Must Validations", + "description": "Supports validity checks of optional keys (if/when) used on External Web Resources, Specific Resources, Textual Body Resources (Sections 3.2.1-6, 3.3)", + "oneOf": + [ + {"$ref": "specificResource.json#/definitions/specificeResourceDetected" }, + {"$ref": "#/definitions/externalWebResourceDetected" }, + {"$ref": "#/definitions/textualBodyFound" } + ], + "allOf" : + [ + { "$ref": "#/definitions/textDirectionValidIfPresent" }, + { "$ref": "otherProperties.json#/definitions/createdValidIfPresent" }, + { "$ref": "otherProperties.json#/definitions/generatedValidIfPresent" }, + { "$ref": "otherProperties.json#/definitions/modifiedValidIfPresent" }, + { "$ref": "otherProperties.json#/definitions/rightsValidIfPresent" }, + { "$ref": "otherProperties.json#/definitions/canonicalValidIfPresent" }, + { "$ref": "otherProperties.json#/definitions/viaValidIfPresent" } + ] + }, + + "optionalBodyPurposePropertyShould" : + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: Optional Purpose Key", + "description": "Supports validity checks of optional purpose key (if/when) used on Specific Resources or Textual Body Resources (Sections 3.3.5)", + "oneOf": + [ + {"$ref": "specificResource.json#/definitions/specificeResourceDetected" }, + {"$ref": "#/definitions/textualBodyFound" } + ], + "allOf" : + [ + { "$ref": "otherProperties.json#/definitions/purposeRecognizedIfPresent" } + ] + }, + + "optionalTargetPropertiesShould" : + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: Optional Target Keys Should validation", + "description": "Supports validity check of optional keys (if/when) used on External Web Resources, Specific Resources (Sections 3.2.1-6, 3.3)", + "oneOf": + [ + {"$ref": "specificResource.json#/definitions/specificeResourceDetected" }, + {"$ref": "#/definitions/externalWebResourceDetected" } + ], + "allOf" : + [ + { "$ref": "#/definitions/resourceTypeShouldIfPresent" }, + { "$ref": "#/definitions/formatValidIfPresent" }, + { "$ref": "#/definitions/languageValidIfPresent" }, + { "$ref": "#/definitions/processingLanguageValidIfPresent" }, + { "$ref": "otherProperties.json#/definitions/creatorValidIfPresent" }, + { "$ref": "otherProperties.json#/definitions/generatorValidIfPresent" }, + { "$ref": "otherProperties.json#/definitions/audienceValidIfPresent" }, + { "$ref": "otherProperties.json#/definitions/accessibilityValidIfPresent" } + ] + }, + + "optionalTargetPropertiesMust" : + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: Optional Target Keys Must validation", + "description": "Supports validity check of optional keys (if/when) used on External Web Resources, Specific Resources (Sections 3.2.1-6, 3.3)", + "oneOf": + [ + {"$ref": "specificResource.json#/definitions/specificeResourceDetected" }, + {"$ref": "#/definitions/externalWebResourceDetected" } + ], + "allOf" : + [ + { "$ref": "#/definitions/textDirectionValidIfPresent" }, + { "$ref": "otherProperties.json#/definitions/createdValidIfPresent" }, + { "$ref": "otherProperties.json#/definitions/generatedValidIfPresent" }, + { "$ref": "otherProperties.json#/definitions/modifiedValidIfPresent" }, + { "$ref": "otherProperties.json#/definitions/rightsValidIfPresent" }, + { "$ref": "otherProperties.json#/definitions/canonicalValidIfPresent" }, + { "$ref": "otherProperties.json#/definitions/viaValidIfPresent" } + ] + }, + + "resourceTypeRecognizedIfPresent": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definitions: body / target classes", + "description": "True when type value for body / target is or includes item from recommended list of classes (Section 3.2.2)", + "type": "object", + "properties": + { + "type": + { "oneOf": + [ + { "type": "string", + "enum": [ "Dataset", "Image", "Video", "Sound", "Text" ] }, + { "type": "array", + "minItems": 1, + "not": + { "items": + { "not": + { "type": "string", + "enum": [ "Dataset", "Image", "Video", "Sound", "Text" ] } + } + } + } + ] + } + } + }, + + "resourceTypeShouldIfPresent": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Validation: body / target classes all from 3.2.2", + "description": "True when type absent or all type value(s) for body / target are from recommended list of classes (Section 3.2.2), or TextualBody", + "type": "object", + "properties": + { + "type": + { "oneOf": + [ + { "type": "string", + "enum": [ "Dataset", "Image", "Video", "Sound", "Text", "TextualBody" ] }, + { "type": "array", + "minItems": 1, + "items": + { "type": "string", + "enum": [ "Dataset", "Image", "Video", "Sound", "Text", "TextualBody" ] } + } + ] + } + } + }, + + "recognizedTypeFound": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: type key with recognized classes", + "description": "Supports implementation check of type (if/when) used on External Web Resources, Specific Resources, Textual Body Resources (Sections 3.2.2)", + "oneOf": + [ + {"$ref": "specificResource.json#/definitions/specificeResourceDetected" }, + {"$ref": "#/definitions/externalWebResourceDetected" }, + {"$ref": "#/definitions/textualBodyFound" } + ], + "allOf" : + [ + { "required": ["type" ] }, + { "$ref": "#/definitions/resourceTypeRecognizedIfPresent" } + ] + + }, + + "formatValueCheck": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definitions: format value regex", + "description": "True when string value starts with a registered top-level Media type, including trailing slash (Section 3.2.1)", + "type": "string", + "pattern": "^(application/|audio/|example/|image/|multipart/|text/|video/)" + }, + + "formatValidIfPresent": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Validation: format validity", + "description": "True when the body or target has no format or has a valid format value - single string or array of strings (Section 3.2.1)", + "type": "object", + "properties": + { + "format": + { + "oneOf": + [ + {"$ref": "#/definitions/formatValueCheck"}, + {"type": "array", + "minItems": 1, + "items" : {"$ref": "#/definitions/formatValueCheck"} + } + ] + } + } + }, + + "formatSingularIfPresent": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definitions: format", + "description": "True when the body or target format value, if present, is singular and valid (Section 3.2.1)", + "type": "object", + "properties": + { + "format": + { + "oneOf": + [ + {"$ref": "#/definitions/formatValueCheck"}, + {"type": "array", + "minItems": 1, + "maxItems": 1, + "items" : {"$ref": "#/definitions/formatValueCheck"} } + ] + } + } + }, + + "formatPropertyFound": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: format key with qualifying body/target classes", + "description": "Supports implementation check of format (if/when) used on External Web Resources, Specific Resources, Textual Body Resources (Sections 3.2.1-6, 3.3)", + "oneOf": + [ + {"$ref": "specificResource.json#/definitions/specificeResourceDetected" }, + {"$ref": "#/definitions/externalWebResourceDetected" }, + {"$ref": "#/definitions/textualBodyFound" } + ], + "allOf" : + [ + { "required": ["format" ] }, + { "$ref": "#/definitions/formatValidIfPresent" } + ] + }, + + "singleFormatPropertyFound": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: format key with qualifying body/target classes", + "description": "Supports implementation check of format being singular (if/when) used on External Web Resources, Specific Resources, Textual Body Resources (Sections 3.2.1-6, 3.3)", + "oneOf": + [ + {"$ref": "specificResource.json#/definitions/specificeResourceDetected" }, + {"$ref": "#/definitions/externalWebResourceDetected" }, + {"$ref": "#/definitions/textualBodyFound" } + ], + "allOf" : + [ + { "required": ["format"] }, + { "$ref": "#/definitions/formatSingularIfPresent" } + ] + }, + + "languageValueCheck" : + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definitions: language value regex", + "description": "True when string value starts with a two or three lc characters and a hyphen or end of string (Section 3.2.1)", + "type": "string", + "oneOf" : + [ + {"pattern": "^([a-z]){2,3}$"}, + {"pattern": "^([a-z]){2,3}-"} + ] + + }, + + "languageValidIfPresent": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Validation: language value", + "description": "True when the body or target has no language or has a valid language value - single string or array of strings (Section 3.2.1)", + "type": "object", + "properties": + { + "language": + { + "oneOf": + [ + {"$ref": "#/definitions/languageValueCheck"}, + {"type": "array", + "minItems": 1, + "items" : {"$ref": "#/definitions/languageValueCheck"} + } + ] + } + } + }, + + "languageSingularIfPresent": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definitions: single language valid", + "description": "True when the body or target has no language or has exactly one language property - single string (Section 3.2.1)", + "type": "object", + "properties": + { + "language": + { + "oneOf": + [ + {"$ref": "#/definitions/languageValueCheck"}, + {"type": "array", + "minItems": 1, + "maxItems": 1, + "items" : {"$ref": "#/definitions/languageValueCheck"} } + ] + } + } + }, + + "languagePropertyFound": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: language key with qualifying body/target classes", + "description": "Supports implementation check of language (if/when) used on External Web Resources, Specific Resources, Textual Body Resources (Sections 3.2.1-6, 3.3)", + "oneOf": + [ + {"$ref": "specificResource.json#/definitions/specificeResourceDetected" }, + {"$ref": "#/definitions/externalWebResourceDetected" }, + {"$ref": "#/definitions/textualBodyFound" } + ], + "allOf" : + [ + { "required": ["language" ] }, + { "$ref": "#/definitions/languageValidIfPresent" } + ] + }, + + "singleLanguagePropertyFound": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: language key with qualifying body/target classes", + "description": "Supports implementation check of language being singular (if/when) used on External Web Resources, Specific Resources, Textual Body Resources (Sections 3.2.1-6, 3.3)", + "oneOf": + [ + {"$ref": "specificResource.json#/definitions/specificeResourceDetected" }, + {"$ref": "#/definitions/externalWebResourceDetected" }, + {"$ref": "#/definitions/textualBodyFound" } + ], + "allOf" : + [ + { "required": ["language"] }, + { "$ref": "#/definitions/languageSingularIfPresent" } + ] + }, + + "processingLanguageValidIfPresent": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Validation: processingLanguage", + "description": "True when the Body or Target has no processingLanguage or exactly one processingLanguage property (Section 3.2.1)", + "type": "object", + "properties": + { + "processingLanguage": + { + "oneOf": + [ + {"$ref": "#/definitions/languageValueCheck"}, + {"type": "array", + "minItems": 1, + "maxItems": 1, + "items" : {"$ref": "#/definitions/languageValueCheck"} } + ] + } + } + }, + + "processingLanguagePropertyFound" : + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: processingLanguage Key with qualifying body/target classes", + "description": "Supports implementation check of processingLanguage (if/when) used on External Web Resources, Specific Resources, Textual Body Resources (Sections 3.2.1-6, 3.3)", + "oneOf": + [ + {"$ref": "specificResource.json#/definitions/specificeResourceDetected" }, + {"$ref": "#/definitions/externalWebResourceDetected" }, + {"$ref": "#/definitions/textualBodyFound" } + ], + "allOf" : + [ + { "required": ["processingLanguage" ] }, + { "$ref": "#/definitions/processingLanguageValidIfPresent" } + ] + }, + + "textDirectionValidIfPresent": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Validation: textDirection", + "description": "True when the body or target has no textDirection or exactly one valid textDirection (Section 3.2.1)", + "type": "object", + "properties": + { + "textDirection": + { + "oneOf": + [ + {"type": "string", + "enum": ["ltr", "rtl", "auto"] }, + {"type": "array", + "minItems": 1, + "maxItems": 1, + "items" : {"type": "string", + "enum": ["ltr", "rtl", "auto"] } } + ] + } + } + }, + + "textDirectionPropertyFound" : + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: textDirection Key with qualifying body/target classes", + "description": "Supports implementation check of textDirection (if/when) used on External Web Resources, Specific Resources, Textual Body Resources (Sections 3.2.1-6, 3.3)", + "oneOf": + [ + {"$ref": "specificResource.json#/definitions/specificeResourceDetected" }, + {"$ref": "#/definitions/externalWebResourceDetected" }, + {"$ref": "#/definitions/textualBodyFound" } + ], + "allOf" : + [ + { "required": ["textDirection" ] }, + { "$ref": "#/definitions/textDirectionValidIfPresent" } + ] + } + + } +} diff --git a/annotation-model/definitions/choiceDetected.json b/annotation-model/definitions/choiceDetected.json new file mode 100644 index 00000000000000..b1a429b78140a1 --- /dev/null +++ b/annotation-model/definitions/choiceDetected.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "choiceDetected.json", + "title": "Definition: Choice Object", + "description": "True when the object's type is 'Choice' and the object has at valid items (Section 3.2.7).", + "type": "object", + "properties": + { + "type": + { + "type": "string", + "enum": ["Choice"] + }, + "items": + { + "$ref": "itemsDetected.json" + } + }, + "required": [ "type", "items" ] +} diff --git a/annotation-model/definitions/choiceSet.json b/annotation-model/definitions/choiceSet.json index a1ce251b03a8a1..b9e75dba2c283b 100644 --- a/annotation-model/definitions/choiceSet.json +++ b/annotation-model/definitions/choiceSet.json @@ -1,18 +1,159 @@ { "$schema": "http://json-schema.org/draft-04/schema#", - "id" : "choiceSet.json", - "type": "object", - "properties": - { - "type": + "id": "choiceSet.json", + "title": "Definitions: Choice, Composite, List, Independents.", + "description": "Schemas in #/definitions detect or validate keys/objects used in describing Choice, Composite, List, Independents (Sections 3.2.7 and 3.2.8).", + "definitions": { + + "itemsDetected" : { - "type": "string", - "enum": ["Choice", "Composite", "List", "Independents"] + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: items", + "description": "True when the object includes items key and value of items is an array containing at least 1 item, which can be a specificResource, an externalWebResource, a uri, a textualBody or another choice/set (Sections 3.2.7 and 3.2.8).", + "type": "object", + "properties" : + { + "items" : + { + "type" : "array", + "minItems": 1, + "items": { + "oneOf": + [ + {"$ref": "specificResource.json#/definitions/specificeResourceDetected" }, + {"$ref": "bodyTarget.json#/definitions/externalWebResourceDetected" }, + {"$ref": "bodyTarget.json#/definitions/textualBodyFound" }, + {"$ref": "id.json#/definitions/stringUri" }, + {"$ref" : "#/definitions/itemsDetected", + "oneOf": [ + { "$ref": "#/definitions/choiceTypeDefinition" }, + { "$ref": "#/definitions/compositeTypeDefinition" }, + { "$ref": "#/definitions/listTypeDefinition" }, + { "$ref": "#/definitions/independentsTypeDefinition" } + ] + } + ] + } + } + }, + "required": [ "items" ] }, - "items" : + + "choiceTypeDefinition": { - "type" : "array" + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Choice type", + "description": "True when object has type key and object's type is 'Choice' (Section 3.2.7)", + "type": "object", + "properties": + { + "type": + { + "type": "string", + "enum": ["Choice"] + } + }, + "required": [ "type" ] + }, + + "compositeTypeDefinition": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Choice type", + "description": "True when object has type key and object's type is 'Composite' (Section 3.2.7)", + "type": "object", + "properties": + { + "type": + { + "type": "string", + "enum": ["Composite"] + } + }, + "required": [ "type" ] + }, + + "listTypeDefinition": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Choice type", + "description": "True when object has type key and object's type is 'List' (Section 3.2.7)", + "type": "object", + "properties": + { + "type": + { + "type": "string", + "enum": ["List"] + } + }, + "required": [ "type" ] + }, + + "independentsTypeDefinition": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Choice type", + "description": "True when object has type key and object's type is 'Independents' (Section 3.2.7)", + "type": "object", + "properties": + { + "type": + { + "type": "string", + "enum": ["Independents"] + } + }, + "required": [ "type" ] + }, + + "choiceDetected": { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Choice", + "description": "True when object's type is 'Choice' and the object has an items array (Section 3.2.7)", + "type": "object", + "allOf": + [ + { "$ref": "#/definitions/choiceTypeDefinition" }, + { "$ref": "#/definitions/itemsDetected" } + ] + }, + + "compositeDetected": { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Composite", + "description": "True when object's type is 'Composite' and the object has at items array (Section 3.2.8)", + "type": "object", + "allOf": + [ + { "$ref": "#/definitions/compositeTypeDefinition" }, + { "$ref": "#/definitions/itemsDetected" } + ] + }, + + "listDetected": { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: List", + "description": "True when object's type is 'List' and the object has at items array (Section 3.2.7)", + "type": "object", + "allOf": + [ + { "$ref": "#/definitions/listTypeDefinition" }, + { "$ref": "#/definitions/itemsDetected" } + ] + }, + + "independentsDetected": { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Independents", + "description": "True when object's type is 'Independents' and the object has at items array (Section 3.2.7)", + "type": "object", + "allOf": + [ + { "$ref": "#/definitions/independentsTypeDefinition" }, + { "$ref": "#/definitions/itemsDetected" } + ] } - }, - "required": [ "type", "items" ] + + } } diff --git a/annotation-model/definitions/compositeDetected.json b/annotation-model/definitions/compositeDetected.json new file mode 100644 index 00000000000000..158661ce885efa --- /dev/null +++ b/annotation-model/definitions/compositeDetected.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "compositeDetected.json", + "title": "Definition: Composite Object", + "description": "True when the object's type is 'Composite' and the object has at least one valid item (Section 3.2.8).", + "type": "object", + "properties": + { + "type": + { + "type": "string", + "enum": ["Composite"] + }, + "items": + { + "$ref": "itemsDetected.json" + } + }, + "required": [ "type", "items" ] +} diff --git a/annotation-model/definitions/externalWebResourceDetected.json b/annotation-model/definitions/externalWebResourceDetected.json new file mode 100644 index 00000000000000..905673659601de --- /dev/null +++ b/annotation-model/definitions/externalWebResourceDetected.json @@ -0,0 +1,19 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id" : "externalWebResourceDetected.json", + "title" : "Definition: External Web Resource object", + "description" : "True when the object is a description of an external web resource (Section 3.2.1)", + "type": "object", + "properties": + { + "id": + { + "$ref": "stringUri.json#" + } + }, + "not": + { + "required" : ["value"] + }, + "required": [ "id" ] +} diff --git a/annotation-model/definitions/formatDetected.json b/annotation-model/definitions/formatDetected.json new file mode 100644 index 00000000000000..543a444605d974 --- /dev/null +++ b/annotation-model/definitions/formatDetected.json @@ -0,0 +1,27 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "formatDetected.json", + "title": "Definition: format property", + "description": "True when the object has a valid format property (Section 3.2.1)", + "type": "object", + "properties": + { + "format": + { "oneOf": + [ + { + "type": "string" + }, + { + "type": "array", + "minItems": 1, + "items": + { + "type": "string" + } + } + ] + } + }, + "required": [ "format" ] +} diff --git a/annotation-model/definitions/id.json b/annotation-model/definitions/id.json new file mode 100644 index 00000000000000..b037e87c94fc9e --- /dev/null +++ b/annotation-model/definitions/id.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id" : "id.json", + "title": "Definitions: id key", + "description": "Schemas in #/definitions used to detect valid id (string of format uri or array containing 1 item of string, format uri).", + "definitions": + { + "stringUri" : + { + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "string", + "format": "uri" + }, + + "arraySingleStringUri": + { + "oneOf": + [ + { "$ref": "#/definitions/stringUri" }, + { "type": "array", + "minItems": 1, + "maxItems": 1, + "items": { "$ref": "#/definitions/stringUri" } + } + ] + }, + + "idValueFound": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "required": [ "id" ], + "properties": { + "id" : { "$ref": "#/definitions/arraySingleStringUri" } + } + } + } +} diff --git a/annotation-model/definitions/independentsDetected.json b/annotation-model/definitions/independentsDetected.json new file mode 100644 index 00000000000000..f71671b7c711fd --- /dev/null +++ b/annotation-model/definitions/independentsDetected.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "independentsDetected.json", + "title": "Definition: Independents Object", + "description": "True when the object's type is 'Independents' and the object has at least one valid item (Section 3.2.8).", + "type": "object", + "properties": + { + "type": + { + "type": "string", + "enum": [ "Independents" ] + }, + "items": + { + "$ref": "itemsDetected.json" + } + }, + "required": [ "type", "items" ] +} diff --git a/annotation-model/definitions/itemsDetected.json b/annotation-model/definitions/itemsDetected.json new file mode 100644 index 00000000000000..7b2d3e1d899bca --- /dev/null +++ b/annotation-model/definitions/itemsDetected.json @@ -0,0 +1,8 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "itemsDetected.json", + "title": "Definition: Items", + "description": "True when the object is an array of objects (Sections 3.2.7 and 3.2.8).", + "type": "array", + "minItems": 1 +} diff --git a/annotation-model/definitions/languageDetected.json b/annotation-model/definitions/languageDetected.json new file mode 100644 index 00000000000000..0a4ac5b9619f3a --- /dev/null +++ b/annotation-model/definitions/languageDetected.json @@ -0,0 +1,27 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "languageDetected.json", + "title": "Definition: language property", + "description": "True when the object has a valid language property (Section 3.2.1)", + "type": "object", + "properties": + { + "language": + { "oneOf": + [ + { + "type": "string" + }, + { + "type": "array", + "minItems": 1, + "items": + { + "type": "string" + } + } + ] + } + }, + "required": [ "language" ] +} diff --git a/annotation-model/definitions/listDetected.json b/annotation-model/definitions/listDetected.json new file mode 100644 index 00000000000000..dd48fcf3c691f6 --- /dev/null +++ b/annotation-model/definitions/listDetected.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "listDetected.json", + "title": "Definition: List Object", + "description": "True when the object's type is 'List' and the object has at least one valid item (Section 3.2.8).", + "type": "object", + "properties": + { + "type": + { + "type": "string", + "enum": [ "List" ] + }, + "items": + { + "$ref": "itemsDetected.json" + } + }, + "required": [ "type", "items" ] +} diff --git a/annotation-model/definitions/otherProperties.json b/annotation-model/definitions/otherProperties.json new file mode 100644 index 00000000000000..3af109b3259817 --- /dev/null +++ b/annotation-model/definitions/otherProperties.json @@ -0,0 +1,720 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "otherProperties.json", + "title": "Definitions: Other Properties.", + "description": "Schemas in #/definitions detect or validate keys, objects or constraints variously applicable to Annotations, Bodies, Targets, Specific Resources, Textual Bodies, Items, and/or Sources (Section 3.3).", + "definitions": { + + "createdValidIfPresent": { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Validation: created value", + "description": "True when the object being tested (annotation, body, target...) has no created or has a single created of format date-time (Section 3.3.1)", + "type": "object", + "properties": {"created": {"oneOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "array", + "minItems": 1, + "maxItems": 1, + "items": { + "type": "string", + "format": "date-time" + } + } + ]}} + }, + + "createdPropertyFound": { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: created key with qualifying body/target classes", + "description": "Supports implementation check of created (if/when) used on External Web Resources, Specific Resources, Textual Body Resources (Sections 3.2.1-6, 3.3)", + "oneOf": [ + {"$ref": "annotations.json#/definitions/annotationTypeValueFound"}, + {"$ref": "specificResource.json#/definitions/specificeResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/externalWebResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/textualBodyFound"} + ], + "allOf": [ + {"$ref": "#/definitions/createdValidIfPresent"}, + {"required": ["created"]} + ] + }, + + "generatedValidIfPresent": { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Validation: generated value", + "description": "True when the annotation, body or target has no generated or has a single generated of format date-time (Section 3.3.1)", + "type": "object", + "properties": {"generated": {"oneOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "array", + "minItems": 1, + "maxItems": 1, + "items": { + "type": "string", + "format": "date-time" + } + } + ]}} + }, + + "generatedPropertyFound": { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: generated key with qualifying body/target classes", + "description": "Supports implementation check of generated (if/when) used on External Web Resources, Specific Resources, Textual Body Resources (Sections 3.2.1-6, 3.3)", + "oneOf": [ + {"$ref": "annotations.json#/definitions/annotationTypeValueFound"}, + {"$ref": "specificResource.json#/definitions/specificeResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/externalWebResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/textualBodyFound"} + ], + "allOf": [ + {"$ref": "#/definitions/generatedValidIfPresent"}, + {"required": ["generated"]} + ] + }, + + "modifiedValidIfPresent": { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Validation: modified value", + "description": "True when the annotation, body or target has no modified or has a single modified of format date-time (Section 3.3.1)", + "type": "object", + "properties": {"modified": {"oneOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "array", + "minItems": 1, + "maxItems": 1, + "items": { + "type": "string", + "format": "date-time" + } + } + ]}} + }, + + "modifiedPropertyFound": { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: modified key with qualifying body/target classes", + "description": "Supports implementation check of modified (if/when) used on External Web Resources, Specific Resources, Textual Body Resources (Sections 3.2.1-6, 3.3)", + "oneOf": [ + {"$ref": "annotations.json#/definitions/annotationTypeValueFound"}, + {"$ref": "specificResource.json#/definitions/specificeResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/externalWebResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/textualBodyFound"} + ], + "allOf": [ + {"$ref": "#/definitions/modifiedValidIfPresent"}, + {"required": ["modified"]} + ] + }, + + "creatorValidIfPresent": { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Validation: creator value", + "description": "True when the annotation, body or target has one or more creators (Section 3.3.1)", + "type": "object", + "properties": {"creator": + {"oneOf": [ + { "$ref": "id.json#/definitions/stringUri" }, + { "type": "object" }, + { + "type": "array", + "minItems": 1, + "items": + { "oneOf": [ + { "$ref": "id.json#/definitions/stringUri" }, + { "type": "object" } + ] + } + } + ] + } + } + }, + + "creatorSingularIfPresent": { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Validation: creator value", + "description": "True when the annotation, body or target has exactly 1 creator (Section 3.3.1)", + "type": "object", + "properties": {"creator": + {"oneOf": [ + { "$ref": "id.json#/definitions/stringUri" }, + { "type": "object" }, + { + "type": "array", + "minItems": 1, + "maxItems": 1, + "items": + { "oneOf": [ + { "$ref": "id.json#/definitions/stringUri" }, + { "type": "object" } + ] + } + } + ] + } + } + }, + + "creatorPropertyFound": { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: creator key with qualifying body/target classes", + "description": "Supports implementation check of creator (if/when) used on External Web Resources, Specific Resources, Textual Body Resources (Section 3.3.1)", + "oneOf": [ + {"$ref": "annotations.json#/definitions/annotationTypeValueFound"}, + {"$ref": "specificResource.json#/definitions/specificeResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/externalWebResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/textualBodyFound"} + ], + "allOf": [ + {"required": ["creator"]}, + {"$ref": "#/definitions/creatorValidIfPresent"} + ] + }, + + "singleCreatorPropertyFound": { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: creator key with qualifying body/target classes", + "description": "Supports implementation check of creator being singular (if/when) used on External Web Resources, Specific Resources, Textual Body Resources (Section 3.3.1)", + "oneOf": [ + {"$ref": "annotations.json#/definitions/annotationTypeValueFound"}, + {"$ref": "specificResource.json#/definitions/specificeResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/externalWebResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/textualBodyFound"} + ], + "allOf": [ + {"required": ["creator"]}, + {"$ref": "#/definitions/creatorSingularIfPresent"} + ] + }, + + "generatorValidIfPresent": { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Validation: generator value", + "description": "True when the annotation, body or target has a single generator (Section 3.3.1)", + "type": "object", + "properties": {"generator": + {"oneOf": [ + { "$ref": "id.json#/definitions/stringUri" }, + { "type": "object" }, + { + "type": "array", + "minItems": 1, + "items": + { "oneOf": [ + { "$ref": "id.json#/definitions/stringUri" }, + { "type": "object" } + ] + } + } + ] + } + } + }, + + "generatorPropertyFound": { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: generator key with qualifying body/target classes", + "description": "Supports implementation check of generator (if/when) used on External Web Resources, Specific Resources, Textual Body Resources (Section 3.3.1)", + "oneOf": [ + {"$ref": "annotations.json#/definitions/annotationTypeValueFound"}, + {"$ref": "specificResource.json#/definitions/specificeResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/externalWebResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/textualBodyFound"} + ], + "allOf": [ + {"required": ["generator"]}, + {"$ref": "#/definitions/generatorValidIfPresent"} + ] + }, + + "audienceDefinition": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: audience object", + "description": "True when object meets our requirements for audience value (Section 3.3.3)", + "type": "object", + "properties": { + "id": {"$ref": "id.json#/definitions/arraySingleStringUri"} , + "type": { + "oneOf": [ + { "type": "string", + "pattern": "^(schema:)"}, + { "type": "array", + "minItems": 1, + "items": { + "type": "string", + "pattern": "^(schema:)" + } + } + ] + } + }, + "patternProperties": { + "^(schema:)": { "type": ["string", "object", "array"] } + }, + "additionalProperties": false + }, + + "audienceValidIfPresent": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Validation: audience value", + "description": "True when no audience or audience property of the annotation, body, target, ... is valid (Section 3.3.3)", + "type": "object", + "properties": { + "audience": + { "oneOf": + [ + { "$ref": "id.json#/definitions/stringUri" }, + { "$ref": "#/definitions/audienceDefinition" }, + { + "type": "array", + "minItems": 1, + "items": { + "oneOf": [ + { "$ref": "id.json#/definitions/stringUri" }, + { "$ref": "#/definitions/audienceDefinition" } + ] + } + } + ] + } + } + }, + + "audiencePropertyFound": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: audience key with qualifying body/target classes", + "description": "Supports implementation check of audience (if/when) used on Annotation, External Web Resources, Specific Resources, Textual Body Resources (Section 3.3.3)", + "oneOf": [ + {"$ref": "annotations.json#/definitions/annotationTypeValueFound"}, + {"$ref": "specificResource.json#/definitions/specificeResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/externalWebResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/textualBodyFound"} + ], + "allOf": [ + {"required": ["audience"]}, + {"$ref": "#/definitions/audienceValidIfPresent"} + ] + }, + + "accessibilityValidIfPresent": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Validation: accessibility value", + "description": "True when no accessibility or accessibility property of the body, target, ... is valid (Section 3.3.4)", + "type": "object", + "properties": { + "accessibility" : { + "oneOf": [ + { "type": "string" }, + { "type": "array" , + "minItems": 1, + "items": { + "type": "string" + } + } + ] + } + } + }, + + "accessibilityPropertyFound": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: accessibility key with qualifying body/target classes", + "description": "Supports implementation check of accessibility (if/when) used on External Web Resources, Specific Resources, Textual Body Resources (Section 3.3.4)", + "oneOf": [ + {"$ref": "specificResource.json#/definitions/specificeResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/externalWebResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/textualBodyFound"} + ], + "allOf": [ + {"required": ["accessibility"]}, + {"$ref": "#/definitions/accessibilityValidIfPresent"} + ] + }, + + "rightsValidIfPresent": + { "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Validation: rights value", + "description": "True when the annotation, body or target has 0 or more rights properties that are strings of format uri (Section 3.3.6)", + "type": "object", + "properties": {"rights": + { "oneOf": [ + { "$ref": "id.json#/definitions/stringUri" }, + { "type": "array", + "minItems": 1, + "items": { "$ref": "id.json#/definitions/stringUri" } } + ] + } + } + }, + + "rightsPropertyFound": + { "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: rights key with qualifying annotation/body/target classes", + "description": "Supports implementation check of rights (if/when) used on Annotation, External Web Resources, Specific Resources, Textual Body Resources (Sections 3.3.6)", + "oneOf": [ + {"$ref": "annotations.json#/definitions/annotationTypeValueFound"}, + {"$ref": "specificResource.json#/definitions/specificeResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/externalWebResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/textualBodyFound"} + ], + "allOf": [ + {"required": ["rights"]}, + {"$ref": "#/definitions/rightsValidIfPresent"} + ] + }, + + "canonicalValidIfPresent": + { "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Validation: canonical value", + "description": "True when the annotation, body or target has 0 or 1 canonical properties that are strings of format uri (Section 3.3.7)", + "type": "object", + "properties": { + "canonical": { "$ref": "id.json#/definitions/arraySingleStringUri" } + } + }, + + "canonicalPropertyFound": + { "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: canonical key with qualifying annotation/body/target classes", + "description": "Supports implementation check of canonical (if/when) used on Annotation, External Web Resources, Specific Resources, Textual Body Resources (Sections 3.3.7)", + "oneOf": [ + {"$ref": "annotations.json#/definitions/annotationTypeValueFound"}, + {"$ref": "specificResource.json#/definitions/specificeResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/externalWebResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/textualBodyFound"} + ], + "allOf": [ + {"required": ["canonical"]}, + {"$ref": "#/definitions/canonicalValidIfPresent"} + ] + }, + + "viaValidIfPresent": + { "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Validation: via value", + "description": "True when the annotation, body or target has 0 or more via properties that are strings of format uri (Section 3.3.7)", + "type": "object", + "properties": {"via": + { "oneOf": [ + { "$ref": "id.json#/definitions/stringUri" }, + { "type": "array", + "minItems": 1, + "items": { "$ref": "id.json#/definitions/stringUri" } } + ] + } + } + }, + + "viaPropertyFound": + { "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: via key with qualifying annotation/body/target classes", + "description": "Supports implementation check of via (if/when) used on Annotation, External Web Resources, Specific Resources, Textual Body Resources (Sections 3.3.7)", + "oneOf": [ + {"$ref": "annotations.json#/definitions/annotationTypeValueFound"}, + {"$ref": "specificResource.json#/definitions/specificeResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/externalWebResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/textualBodyFound"} + ], + "allOf": [ + {"required": ["via"]}, + {"$ref": "#/definitions/viaValidIfPresent"} + ] + }, + + "purposeRecognizedIfPresent": + { "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Validation: purpose value", + "description": "True when the body has 0 or more purpose property values (Section 3.3.5)", + "type": "object", + "properties": {"purpose": + { "oneOf": [ + { "$ref": "annotations.json#/definitions/motivationList" }, + { "type": "array", + "minItems": 1, + "items": { "$ref": "annotations.json#/definitions/motivationList" } } + ] + } + } + }, + + "purposePropertyFound": + { "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: purpose key with qualifying body classes", + "description": "Supports implementation check of purpose (if/when) used on Specific Resource Body or Textual Body (Sections 3.3.5)", + "oneOf": [ + {"$ref": "specificResource.json#/definitions/specificeResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/textualBodyFound"} + ], + "allOf": [ + {"required": ["purpose"]}, + {"$ref": "#/definitions/purposeRecognizedIfPresent"} + ] + }, + + "agentTypeDefinition": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Agent type value", + "description": "True when the object (creator or generator agent) has no type or has at least one recognized Agent type value (Section 3.3.2)", + "type": "object", + "properties": + { + "type": + { + "oneOf": + [ + {"type": "string", + "enum": ["Person", "Organization", "Software"] }, + {"type": "array", + "minItems": 1, + "not": + { + "items" : + { "not": + { "type": "string", + "enum": ["Person", "Organization", "Software"] } + } + } + } + ] + } + } + }, + + "agentTypeFound": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Check for implementation of Agent type value", + "description": "True when the object (creator or generator agent) has at least one recognized Agent type value (Section 3.3.2)", + "allOf": [ + {"required": ["type"]}, + {"$ref": "#/definitions/agentTypeDefinition"} + ] + }, + + "agentNameDefinition": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Agent name value", + "description": "True when the object (creator or generator agent) has no name or has Agent name(s) of type string (Section 3.3.2)", + "type": "object", + "properties": + { + "name": + { + "oneOf": + [ + {"type": "string" }, + {"type": "array", + "minItems": 1, + "items": {"type": "string"} + } + ] + } + } + }, + + "agentSingularNameDefinition": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Agent name value", + "description": "True when the object (creator or generator agent) has no name or has exactly one Agent name that is a string (Section 3.3.2)", + "type": "object", + "properties": + { + "name": + { + "oneOf": + [ + {"type": "string" }, + {"type": "array", + "minItems": 1, + "maxItems": 1, + "items": {"type": "string"} + } + ] + } + } + }, + + "agentNameFound": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Check for implementation of Agent name value", + "description": "True when the object (creator or generator agent) has Agent name value(s) (Section 3.3.2)", + "allOf": [ + {"required": ["name"]}, + {"$ref": "#/definitions/agentNameDefinition"} + ] + }, + + "agentSingularNameFound": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Check for implementation of Agent name value", + "description": "True when the object (creator or generator agent) has exactly one Agent name value (Section 3.3.2)", + "allOf": [ + {"required": ["name"]}, + {"$ref": "#/definitions/agentSingularNameDefinition"} + ] + }, + + "agentSingularNicknameDefinition": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Agent nickname value", + "description": "True when the object (creator or generator agent) has no nickname or has exacly one Agent nickname that is a string (Section 3.3.2)", + "type": "object", + "properties": + { + "nickname": + { + "oneOf": + [ + {"type": "string" }, + {"type": "array", + "minItems": 1, + "maxItems": 1, + "items": {"type": "string"} + } + ] + } + } + }, + + "agentSingularNicknameFound": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Check for implementation of Agent nickname value", + "description": "True when the object (creator or generator agent) has an Agent nickname value (Section 3.3.2)", + "allOf": [ + {"required": ["nickname"]}, + {"$ref": "#/definitions/agentSingularNicknameDefinition"} + ] + }, + + "agentEmailDefinition": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Agent email value", + "description": "True when the object (creator or generator agent) has no email or has Agent one or more email addresses that start(s) mailto: and is format uri (Section 3.3.2)", + "type": "object", + "properties": + { + "email": + { + "oneOf": + [ + { "type": "string", + "pattern": "^(mailto)", + "format": "uri" }, + {"type": "array", + "minItems": 1, + "items": {"type": "string", + "pattern": "^(mailto)", + "format": "uri" } + } + ] + } + } + }, + + "agentEmailFound": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Check for implementation of Agent email value", + "description": "True when the object (creator or generator agent) has Agent email value(s) (Section 3.3.2)", + "allOf": [ + {"required": ["email"]}, + {"$ref": "#/definitions/agentEmailDefinition"} + ] + }, + + "agentEmail_sha1Definition": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Agent email_sha1 value", + "description": "True when the object (creator or generator agent) has no email_sha1 or has one or more email_sha1 that is/are a string (Section 3.3.2)", + "type": "object", + "properties": + { + "email_sha1": + { + "oneOf": + [ + {"type": "string" }, + {"type": "array", + "minItems": 1, + "items": {"type": "string"} + } + ] + } + } + }, + + "agentEmail_sha1Found": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Check for implementation of Agent email_sha1 value", + "description": "True when the object (creator or generator agent) has has one or more email_sha1 that is/are a string (Section 3.3.2)", + "allOf": [ + {"required": ["email_sha1"]}, + {"$ref": "#/definitions/agentEmail_sha1Definition"} + ] + }, + + "agentHomepageDefinition": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: Agent homepage value", + "description": "True when the object (creator or generator agent) has no homempage or has one or more agent homepage addresses of format uri (Section 3.3.2)", + "type": "object", + "properties": + { + "email": + { + "oneOf": + [ + { "type": "string", + "format": "uri" }, + {"type": "array", + "minItems": 1, + "items": {"type": "string", + "format": "uri" } + } + ] + } + } + }, + + "agentHomepageFound": + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Check for implementation of Agent homepage value", + "description": "True when the object (creator or generator agent) has Agent homepage value(s) (Section 3.3.2)", + "allOf": [ + {"required": ["homepage"]}, + {"$ref": "#/definitions/agentHomepageDefinition"} + ] + } + + } +} diff --git a/annotation-model/definitions/processingLanguageDetected.json b/annotation-model/definitions/processingLanguageDetected.json new file mode 100644 index 00000000000000..595e9f4c602827 --- /dev/null +++ b/annotation-model/definitions/processingLanguageDetected.json @@ -0,0 +1,15 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "processingLanguageDetected.json", + "title": "Definition: processingLanguage property", + "description": "True when the object has a valid processingLanguage property (Section 3.2.1)", + "type": "object", + "properties": + { + "processingLanguage": + { + "type": "string" + } + }, + "required": [ "processingLanguage" ] +} diff --git a/annotation-model/definitions/specificResource.json b/annotation-model/definitions/specificResource.json index 75bd46ba3d825c..829e38c2c87b45 100644 --- a/annotation-model/definitions/specificResource.json +++ b/annotation-model/definitions/specificResource.json @@ -1,17 +1,456 @@ { "$schema": "http://json-schema.org/draft-04/schema#", "id" : "specificResource.json", - "type": "object", - "properties": - { - "source": + "title": "Definitions: Specific Resources.", + "description": "Schemas in #/definitions detect or validate keys/objects used in describing Specific Resources (Section 4).", + "definitions": { + + "specificeResourceDetected": { - "type": ["string", "object" ], + "title": "Detection: Specific Resource", + "description": "True when object has exactly 1 source value and at least one of purpose, selector, state, styleClass, renderedVia, scope (Section 4)", + "type": "object", + "properties": + { + "source": + { + "type": ["string", "object" ], + "oneOf": [ + { "$ref": "id.json#/definitions/stringUri" }, + { "$ref": "bodyTarget.json#/definitions/externalWebResourceDetected"} + ] + } + }, + "required": ["source"], + "anyOf": [ + { "$ref": "otherProperties.json#/definitions/purposeRecognizedIfPresent", + "required": ["purpose"]}, + { "$ref": "#/definitions/selectorDetected" }, + { "$ref": "#/definitions/stateDetected"} + + + + + + ] + }, + + "selectorDetected": + { + "title": "Definition: selector", + "description": "True when object tested has selector with value matching one or more of the selectors described in the model (Section 4.2)", + "type": "object", + "properties": + { + "selector": + { + "oneOf": [ + { "$ref": "id.json#/definitions/stringUri" }, + { "type": "object", + "anyOf": [ + {"$ref": "#/definitions/fragmentSelectorDetected"}, + {"$ref": "#/definitions/cssSelectorDetected"}, + {"$ref": "#/definitions/xpathSelectorDetected"}, + {"$ref": "#/definitions/textQuoteSelectorDetected"}, + {"$ref": "#/definitions/textPositionSelectorDetected"}, + {"$ref": "#/definitions/dataPositionSelectorDetected"}, + {"$ref": "#/definitions/rangeSelectorDetected"}, + {"$ref": "#/definitions/svgSelectorDetected"} + ] + }, + { + "type": "array", + "minItems": 1, + "items": + { "oneOf": [ + { "$ref": "id.json#/definitions/stringUri" }, + { "type": "object", + "anyOf": [ + {"$ref": "#/definitions/fragmentSelectorDetected"}, + {"$ref": "#/definitions/cssSelectorDetected"}, + {"$ref": "#/definitions/xpathSelectorDetected"}, + {"$ref": "#/definitions/textQuoteSelectorDetected"}, + {"$ref": "#/definitions/textPositionSelectorDetected"}, + {"$ref": "#/definitions/dataPositionSelectorDetected"}, + {"$ref": "#/definitions/rangeSelectorDetected"}, + {"$ref": "#/definitions/svgSelectorDetected"} + ] + } + ] + } + } + ] + } + }, + "required": ["selector"] + }, + + "fragmentSelectorDetected": + { + "title": "Definition: fragment selector", + "description": "True when object is a fragment selelctor (Section 4.2.1)", + "type": "object", + "properties": + { + "type": { "type": "string", + "enum": ["FragmentSelector"] }, + "value": { "type": "string" }, + "conformsTo": { "type": "string", + "format": "uri"}, + "refinedBy" : { "$ref": "#/definitions/refinedByDetected"} + }, + "required": ["value", "type"] + }, + + "cssSelectorDetected": + { + "title": "Definition: CssSelector selector", + "description": "True when object is a CssSelector selelctor (Section 4.2.2)", + "type": "object", + "properties": + { + "type": { "type": "string", + "enum": ["CssSelector"] }, + "value": { "type": "string" }, + "id": { "$ref": "id.json#/definitions/arraySingleStringUri" }, + "refinedBy" : { "$ref": "#/definitions/refinedByDetected"} + }, + "required": [ "type"], + "oneOf": [ + {"required": ["value"] }, + {"required": ["id"] } + ] + }, + + "xpathSelectorDetected": + { + "title": "Definition: XPath selector", + "description": "True when object is a XPath selelctor (Section 4.2.3)", + "type": "object", + "properties": + { + "type": { "type": "string", + "enum": ["XPathSelector"] }, + "value": { "type": "string" }, + "id": { "$ref": "id.json#/definitions/arraySingleStringUri" }, + "refinedBy" : { "$ref": "#/definitions/refinedByDetected"} + }, + "required": ["type"], + "oneOf": [ + {"required": ["value"] }, + {"required": ["id"] } + ] + }, + + "textQuoteSelectorDetected": + { + "title": "Definition: text quote selector", + "description": "True when object is a text quote selelctor (Section 4.2.4)", + "type": "object", + "properties": + { + "type": { "type": "string", + "enum": ["TextQuoteSelector"] }, + "exact": { "type": "string" }, + "prefix": { "type": "string"}, + "suffix": { "type": "string"}, + "refinedBy" : { "$ref": "#/definitions/refinedByDetected"} + }, + "required": ["exact", "type"] + }, + + "textPositionSelectorDetected": + { + "title": "Definition: text position selector", + "description": "True when object is a text position selelctor (Section 4.2.5)", + "type": "object", + "properties": + { + "type": { "type": "string", + "enum": ["TextPositionSelector"] }, + "start": { "type": "integer", + "minimum": 0 }, + "end": { "type": "integer", + "minimum": 0 }, + "refinedBy" : { "$ref": "#/definitions/refinedByDetected"} + }, + "required": ["start", "end", "type"] + }, + + "dataPositionSelectorDetected": + { + "title": "Definition: data position selector", + "description": "True when object is a data position selelctor (Section 4.2.6)", + "type": "object", + "properties": + { + "type": { "type": "string", + "enum": ["DataPositionSelector"] }, + "start": { "type": "integer", + "minimum": 0 }, + "end": { "type": "integer", + "minimum": 0 }, + "refinedBy" : { "$ref": "#/definitions/refinedByDetected"} + }, + "required": ["start", "end", "type"] + }, + + "svgSelectorDetected": + { + "title": "Definition: svg selector", + "description": "True when object is a svg selelctor (Section 4.2.7)", + "type": "object", + "properties": + { + "type": { "type": "string", + "enum": ["SvgSelector"] }, + "value": { "type": "string" }, + "id": { "$ref": "id.json#/definitions/arraySingleStringUri" }, + "refinedBy" : { "$ref": "#/definitions/refinedByDetected"} + }, + "required": ["type"], + "oneOf": [ + {"required": ["value"] }, + {"required": ["id"] } + ] + }, + + "rangeSelectorDetected": + { + "title": "Definition: range selector", + "description": "True when object is a range selelctor (Section 4.2.9)", + "type": "object", + "properties": + { + "type": { "type": "string", + "enum": ["RangeSelector"] }, + "refinedBy" : { "$ref": "#/definitions/refinedByDetected"} + }, + "patternProperties": + { + "^(startSelector|endSelector)$": + { "type": "object", + "oneOf": [ + {"$ref": "#/definitions/fragmentSelectorDetected"}, + {"$ref": "#/definitions/cssSelectorDetected"}, + {"$ref": "#/definitions/xpathSelectorDetected"}, + {"$ref": "#/definitions/textQuoteSelectorDetected"}, + {"$ref": "#/definitions/textPositionSelectorDetected"}, + {"$ref": "#/definitions/dataPositionSelectorDetected"}, + {"$ref": "#/definitions/svgSelectorDetected"} + ] + } + }, + "required": ["type", "startSelector", "endSelector"] + }, + + "refinedByDetected": + { + "title": "Definition: refinedBy selector or state", + "description": "True when object is a refinedBy selelctor or state (Section 4.2.8)", + "type": "object", + "oneOf": [ + {"$ref": "#/definitions/fragmentSelectorDetected"}, + {"$ref": "#/definitions/cssSelectorDetected"}, + {"$ref": "#/definitions/xpathSelectorDetected"}, + {"$ref": "#/definitions/textQuoteSelectorDetected"}, + {"$ref": "#/definitions/textPositionSelectorDetected"}, + {"$ref": "#/definitions/dataPositionSelectorDetected"}, + {"$ref": "#/definitions/rangeSelectorDetected"}, + {"$ref": "#/definitions/svgSelectorDetected"}, + {"$ref": "#/definitions/timeStateDetected"}, + {"$ref": "#/definitions/requestHeaderStateDetected"} + ] + }, + + "stateDetected" : + { + "title": "Definition: state", + "description": "True when object tested has state with value matching one or more of the state classes described in the model (Section 4.3)", + "type": "object", + "properties": + { + "state": + { + "oneOf": [ + { "$ref": "id.json#/definitions/stringUri" }, + { "type": "object", + "anyOf": [ + {"$ref": "id.json#/definitions/idValueFound"}, + {"$ref": "#/definitions/timeStateDetected"}, + {"$ref": "#/definitions/requestHeaderStateDetected"} + ] + }, + { + "type": "array", + "minItems": 1, + "items": + { "oneOf": [ + { "$ref": "id.json#/definitions/stringUri" }, + { "type": "object", + "anyOf": [ + {"$ref": "id.json#/definitions/idValueFound"}, + {"$ref": "#/definitions/timeStateDetected"}, + {"$ref": "#/definitions/requestHeaderStateDetected"} + ] + } + ] + } + } + ] + } + } + }, + + "timeStateDetected": + { + "title": "Definition: time state", + "description": "True when object is a time state (Section 4.3.1)", + "type": "object", + "properties": + { + "type": { "type": "string", + "enum": ["TimeState"] }, + "sourceDate": { "oneOf": [ + {"type": "string", + "format": "date-time"}, + { "type": "array", + "minItems": 1, + "items": + {"type": "string", + "format": "date-time"} + } + ] + }, + "sourceDateStart": { "type": "string", + "format": "date-time"}, + "sourceDateEnd": { "type": "string", + "format": "date-time"}, + "cached": { "type": "string", + "format": "uri"} + }, + "required": ["type"], + "dependencies" : + { + "sourceDateStart" : ["sourceDateEnd"], + "sourceDateEnd": ["sourceDateStart"] + }, + "not": + { "required": [ "sourceDate", "sourceDateStart", "sourceDateEnd" ] } + }, + + "requestHeaderStateDetected": + { + "title": "Definition: request header state", + "description": "True when object is a request header state (Section 4.3.2)", + "type": "object", + "properties": + { + "type": { "type": "string", + "enum": ["HttpRequestState"] }, + "value": { "type": "string"} + }, + "required": ["type", "value"] + }, + + "styleClassDefinition": + { "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: styleClass property value", + "description": "True when the body/target has no styleClass property or has a styleClass property that is a string values (Section 4.4)", + "type": "object", + "properties": { + "styleClass": { "type": "string" } + } + }, + + "styleClassDetected": + { "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: styleClass key with qualifying body/target classes", + "description": "Supports implementation check of styleClass (if/when) used on Specific Resource Body or Textual Body (Sections 4.4)", + "oneOf": [ + {"$ref": "specificResource.json#/definitions/specificeResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/textualBodyFound"} + ], + "allOf": [ + {"required": ["styleClass"]}, + {"$ref": "#/definitions/styleClassDefinition"} + ] + }, + + "renderedViaDefinition": + { "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: renderedVia property value", + "description": "True when the body/target has no renderedVia property or has a valid renderedVia property (Section 4.5)", + "type": "object", + "properties": { + "renderedVia": + { + "oneOf": + [ + { "$ref": "id.json#/definitions/arraySingleStringUri"}, + { "$ref": "id.json#/definitions/idValueFound"}, + { "type": "array", + "minItems": 1, + "items": + { + "oneOf": + [ + { "$ref": "id.json#/definitions/arraySingleStringUri"}, + { "$ref": "id.json#/definitions/idValueFound"} + ] + } + } + ] + } + } + }, + + "renderedViaDetected": + { "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: renderedVia key with qualifying body/target classes", + "description": "Supports implementation check of renderedVia (if/when) used on Specific Resource Body or Textual Body (Sections 4.4)", + "oneOf": [ + {"$ref": "specificResource.json#/definitions/specificeResourceDetected"}, + {"$ref": "bodyTarget.json#/definitions/textualBodyFound"} + ], + "allOf": [ + {"required": ["renderedVia"]}, + {"$ref": "#/definitions/renderedViaDefinition"} + ] + }, + + "scopeDefinition": + { "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Definition: scope property value", + "description": "True when the body/target has no scope property or has a valid scope property (Section 4.6)", + "type": "object", + "properties": { + "scope": + { + "oneOf": + [ + { "$ref": "id.json#/definitions/stringUri"}, + { "type": "array", + "minItems": 1, + "items": { "$ref": "id.json#/definitions/stringUri"} + } + ] + } + } + }, + + "scopeDetected": + { "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Collate: scope key with qualifying body/target classes", + "description": "Supports implementation check of scope (if/when) used on Specific Resource Body (Sections 4.6)", "oneOf": [ - { "$ref": "stringUri.json#" }, - { "$ref": "externalWebResource.json#"} + {"$ref": "specificResource.json#/definitions/specificeResourceDetected"} + ], + "allOf": [ + {"required": ["scope"]}, + {"$ref": "#/definitions/scopeDefinition"} ] } - }, - "required": ["source"] + + } } diff --git a/annotation-model/definitions/specificResourceDetected.json b/annotation-model/definitions/specificResourceDetected.json new file mode 100644 index 00000000000000..52ec5a7588f4b6 --- /dev/null +++ b/annotation-model/definitions/specificResourceDetected.json @@ -0,0 +1,19 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id" : "specificResourceDetected.json", + "title" : "Definition: SpecificResource object", + "description" : "True when the object has a valid source (Section 4)", + "type": "object", + "properties": + { + "source": + { + "type": ["string", "object" ], + "oneOf": [ + { "$ref": "stringUri.json#" }, + { "$ref": "externalWebResource.json#"} + ] + } + }, + "required": ["source"] +} diff --git a/annotation-model/definitions/stringUri.json b/annotation-model/definitions/stringUri.json index 74485e081251a6..c398a191c3964d 100644 --- a/annotation-model/definitions/stringUri.json +++ b/annotation-model/definitions/stringUri.json @@ -1,6 +1,8 @@ { "$schema": "http://json-schema.org/draft-04/schema#", "id" : "stringUri.json", + "title" : "Definition: URI", + "description" : "True when the string is a URI", "type": "string", "format": "uri" } diff --git a/annotation-model/definitions/textDirectionDetected.json b/annotation-model/definitions/textDirectionDetected.json new file mode 100644 index 00000000000000..31cc9ca6b36849 --- /dev/null +++ b/annotation-model/definitions/textDirectionDetected.json @@ -0,0 +1,16 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "textDirectionDetected.json", + "title": "Definition: textDirection property", + "description": "True when the object has a valid textDirection property (Section 3.2.1)", + "type": "object", + "properties": + { + "textDirection": + { + "type": "string", + "enum": [ "ltr", "rtl", "auto" ] + } + }, + "required": [ "textDirection" ] +} diff --git a/annotation-model/examples/example1-manual.html b/annotation-model/examples/example1-manual.html deleted file mode 100644 index 4554567c9f40f2..00000000000000 --- a/annotation-model/examples/example1-manual.html +++ /dev/null @@ -1,46 +0,0 @@ - - - -Verify annotation conforms to the model - - - - - - - -

Fill the textarea below with JSON output from your annotation client -implementation that supports the following criteria:

-
-

Specifically, the following assertions will be evaluated:

-
-
- -

-

-
- - diff --git a/annotation-model/examples/example2-manual.html b/annotation-model/examples/example2-manual.html deleted file mode 100644 index 811ffd22e891ca..00000000000000 --- a/annotation-model/examples/example2-manual.html +++ /dev/null @@ -1,46 +0,0 @@ - - - -A test that has an 'or' clause - - - - - - - -

Fill the textarea below with JSON output from your annotation client -implementation that supports the following criteria:

-
-

Specifically, the following assertions will be evaluated:

-
-
- -

-

-
- - diff --git a/annotation-model/examples/example3.test b/annotation-model/examples/example3.test new file mode 100644 index 00000000000000..38263cd1850593 --- /dev/null +++ b/annotation-model/examples/example3.test @@ -0,0 +1,8 @@ +{ + "@context": "https://www.w3.org/ns/JSONtest-v1.jsonld", + "name": "Automated example test", + "description": "A test that runs with no user intervention", + "testType": "automated", + "assertions": [ "common/requiredProperties.json" ], + "content": "common/sampleContent2.jsonld" +} diff --git a/annotation-model/scripts/JSONtest.js b/annotation-model/scripts/JSONtest.js index 7f3e07cb40c2d4..825522e9f422dc 100644 --- a/annotation-model/scripts/JSONtest.js +++ b/annotation-model/scripts/JSONtest.js @@ -1,4 +1,4 @@ -/* globals add_completion_callback, Promise, done, assert_true, Ajv, on_event */ +/* globals add_completion_callback, Promise, showdown, done, assert_true, Ajv, on_event */ /** * Creates a JSONtest object. If the parameters are supplied @@ -24,16 +24,34 @@ function JSONtest(params) { this.Assertions = []; // object that will contain the assertions to process this.AssertionText = ""; // string that holds the titles of all the assertions in use this.DescriptionText = ""; - this.Base = null; // URI "base" for the tests being run + this.Base = null; // URI "base" for the test suite being run + this.TestDir = null; // URI "base" for the test case being run this.Params = null; // paramaters passed in + this.Promise = null; // master Promise that resolves when intialization is complete this.Properties = null; // testharness_properties from the opening window this.Test = null; // test being run this.AssertionCounter = 0;// keeps track of which assertion is being processed - this._assertionText = []; // Array of text or nested arrays of assertions this._assertionCache = [];// Array to put loaded assertions into + this._assertionText = []; // Array of text or nested arrays of assertions this._loading = true; + showdown.extension('strip', function() { + return [ + { type: 'output', + regex: /

/, + replace: '' + }, + { type: 'output', + regex: /<\/p>$/, + replace: '' + } + ]; + }); + + + this.markdown = new showdown.Converter({ extensions: [ 'strip' ] }) ; + var pending = [] ; // set up in case DOM finishes loading early @@ -52,6 +70,7 @@ function JSONtest(params) { var l = document.location; var p = l.pathname; + this.TestDir = p.substr(0, 1+p.lastIndexOf('/')); this.Base = p.substr(0, 1+p.indexOf('/', 1)); // if we are under runner, then there are props in the parent window @@ -103,6 +122,28 @@ function JSONtest(params) { this.DescriptionText = test.description; } + if (test.content) { + // we have content + if (typeof test.content === "string") { + // the test content is a string - meaning it is a reference to a file of content + var cPromise = new Promise(function(resolve, reject) { + this.loadDefinition(test.content) + .then(function(content) { + if (typeof content === 'string') { + content = JSON.parse(content) ; + } + test.content = content; + resolve(true); + }.bind(this)) + .catch(function(err) { + reject("Loading " + test.content + ": " + JSON.stringify(err)); + }); + + }.bind(this)); + pending.push(cPromise); + } + } + return new Promise(function(resolve, reject) { if (test.assertions && typeof test.assertions === "object") { @@ -119,6 +160,12 @@ function JSONtest(params) { .then(function (assertContents) { // assertContents has assertions in document order + var typeMap = { + 'must' : "[MANDATORY] ", + 'may' : "[OPTIONAL] ", + 'should' : "[RECOMMENDED] " + }; + var assertIdx = 0; // populate the display of assertions that are being exercised @@ -132,14 +179,22 @@ function JSONtest(params) { // accumulate the assertions - but only when level is 0 var list = [] ; + var type = ""; if (assertions) { if (typeof assertions === "object" && assertions.hasOwnProperty('assertions')) { // this is a conditionObject if (level === 0) { list.push(assertContents[assertIdx]); } + type = assertContents[assertIdx].hasOwnProperty('assertionType') ? + assertContents[assertIdx].assertionType : "must" ; - this.AssertionText += "

  • " + assertContents[assertIdx++].title; + // ensure type defaults to must + if (!typeMap.hasOwnProperty(type)) { + type = "must"; + } + + this.AssertionText += "
  • " + typeMap[type] + this.markdown.makeHtml(assertContents[assertIdx++].title); this.AssertionText += "
      "; buildList(assertions.assertions, level+1) ; this.AssertionText += "
  • \n"; @@ -151,12 +206,22 @@ function JSONtest(params) { // it is a nested list - recurse buildList(assert, level+1) ; this.AssertionText += "\n"; - } else if (typeof assert === "object" && !Array.isArray(assert) && assert.hasOwnProperty('assertions')) { + } else if (typeof assert === "object" && + !Array.isArray(assert) && + assert.hasOwnProperty('assertions')) { if (level === 0) { list.push(assertContents[assertIdx]); } + type = assertContents[assertIdx].hasOwnProperty('assertionType') ? + assertContents[assertIdx].assertionType : "must" ; + + // ensure type defaults to must + if (!typeMap.hasOwnProperty(type)) { + type = "must"; + } + // there is a condition object in the array - this.AssertionText += "
  • " + assertContents[assertIdx++].title; + this.AssertionText += "
  • " + typeMap[type] + this.markdown.makeHtml(assertContents[assertIdx++].title); this.AssertionText += "
      "; buildList(assert, level+1) ; // capture the children too this.AssertionText += "
  • \n"; @@ -164,7 +229,15 @@ function JSONtest(params) { if (level === 0) { list.push(assertContents[assertIdx]); } - this.AssertionText += "
  • " + assertContents[assertIdx++].title + "
  • \n"; + type = assertContents[assertIdx].hasOwnProperty('assertionType') ? + assertContents[assertIdx].assertionType : "must" ; + + // ensure type defaults to must + if (!typeMap.hasOwnProperty(type)) { + type = "must"; + } + + this.AssertionText += "
  • " + typeMap[type] + this.markdown.makeHtml(assertContents[assertIdx++].title) + "
  • \n"; } }.bind(this)); } @@ -189,19 +262,23 @@ function JSONtest(params) { }.bind(this)); }.bind(this))); - // once the DOM and the test / assertions are loaded... set us up - Promise.all(pending) - .then(function() { - this.loading = false; - this.init(); - }.bind(this)) - .catch(function(err) { - // loading the components failed somehow - report the errors and mark the test failed - test( function() { - assert_true(false, "Loading of test components failed: " +JSON.stringify(err)) ; - }, "Loading test components"); - done() ; - return ; + this.Promise = new Promise(function(resolve, reject) { + // once the DOM and the test / assertions are loaded... set us up + Promise.all(pending) + .then(function() { + this.loading = false; + this.init(); + resolve(this); + }.bind(this)) + .catch(function(err) { + // loading the components failed somehow - report the errors and mark the test failed + test( function() { + assert_true(false, "Loading of test components failed: " +JSON.stringify(err)) ; + }, "Loading test components"); + done() ; + reject("Loading of test components failed: "+JSON.stringify(err)); + return ; + }.bind(this)); }.bind(this)); return this; @@ -222,8 +299,10 @@ JSONtest.prototype = { var desc = document.getElementById("testDescription") ; if (!this.loading) { - runButton.disabled = false; - runButton.value = "Check JSON"; + if (runButton) { + runButton.disabled = false; + runButton.value = "Check JSON"; + } if (desc) { desc.innerHTML = this.DescriptionText; } @@ -249,32 +328,34 @@ JSONtest.prototype = { }.bind(this)); } - on_event(runButton, "click", function() { - // user clicked - var content = testInput.value; - runButton.disabled = true; - - // make sure content is an object - if (typeof content === "string") { - try { - content = JSON.parse(content) ; - } catch(err) { - // if the parsing failed, create a special test and mark it failed - test( function() { - assert_true(false, "Parse of JSON failed: " + err) ; - }, "Parsing submitted input"); - // and just give up - done(); - return ; + if (runButton) { + on_event(runButton, "click", function() { + // user clicked + var content = testInput.value; + runButton.disabled = true; + + // make sure content is an object + if (typeof content === "string") { + try { + content = JSON.parse(content) ; + } catch(err) { + // if the parsing failed, create a special test and mark it failed + test( function() { + assert_true(false, "Parse of JSON failed: " + err) ; + }, "Parsing submitted input"); + // and just give up + done(); + return ; + } } - } - // iterate over all of the tests for this instance - this.runTests(this.Assertions, content); + // iterate over all of the tests for this instance + this.runTests(this.Assertions, content); - // explicitly tell the test framework we are done - done(); - }.bind(this)); + // explicitly tell the test framework we are done + done(); + }.bind(this)); + } }, // runTests - process tests @@ -304,6 +385,13 @@ JSONtest.prototype = { compareWith = 'and'; } + var typeMap = { + 'must' : "", + 'may' : "INFORMATIONAL: ", + 'should' : "WARNING: " + }; + + // for each assertion (in order) load the external json schema if // one is referenced, or use the inline schema if supplied // validate content against the referenced schema @@ -314,8 +402,15 @@ JSONtest.prototype = { assertions.forEach( function(assert, num) { - var expected = assert.hasOwnProperty('expectedResult') ? assert.expectedResult : 'valid' ; - var message = assert.hasOwnProperty('message') ? assert.message : "Result was not " + expected; + var expected = assert.hasOwnProperty('expectedResult') ? + assert.expectedResult : 'valid' ; + var message = assert.hasOwnProperty('errorMessage') ? + assert.errorMessage : "Result was not " + expected; + var type = assert.hasOwnProperty('assertionType') ? + assert.assertionType : "must" ; + if (!typeMap.hasOwnProperty(type)) { + type = "must"; + } // first - what is the type of the assert if (typeof assert === "object" && !Array.isArray(assert)) { @@ -365,7 +460,7 @@ JSONtest.prototype = { } else { assert_true(result, err) ; } - }.bind(this), assert.title); + }.bind(this), "" + level + ":" + (num+1) + " " + assert.title); // we are going to return out of this return; } @@ -384,6 +479,18 @@ JSONtest.prototype = { var schemaName = "inline " + level + ":" + (num+1); + if (typeof assert === "string") { + // the assertion passed in is a file name; find it in the cache + if (this._assertionCache[assert]) { + assert = this._assertionCache[assert]; + } else { + test( function() { + assert_true(false, "Reference to assertion " + assert + " at level " + level + ":" + (num+1) + " unresolved") ; + }, "Processing " + assert); + return ; + } + } + if (assert.assertionFile) { schemaName = "external file " + assert.assertionFile + " " + level + ":" + (num+1); } @@ -428,11 +535,11 @@ JSONtest.prototype = { } if (result === false) { // test result was unexpected; use message - assert_true(result, message + err); + assert_true(result, typeMap[type] + message + err); } else { assert_true(result, err) ; } - }.bind(this), assert.title); + }.bind(this), "" + level + ":" + (num+1) + " " + assert.title); } }.bind(this)); } @@ -497,6 +604,7 @@ JSONtest.prototype = { this._loadFile("GET", theFile, true) .then(function(data) { data.assertionFile = afile; + this._assertionCache[afile] = data; resolve(data); }.bind(this)) .catch(function(err) { @@ -581,7 +689,7 @@ JSONtest.prototype = { if (theURI.indexOf('/') === -1) { // no slash - it's relative to where we are // so just use it - return theURI; + return this.TestDir + theURI; } else if (theURI.indexOf('/') === 0 || theURI.indexOf('http:') === 0 || theURI.indexOf('https:') === 0) { // it is an absolute URI so just use it return theURI; @@ -619,7 +727,8 @@ JSONtest.prototype = { } else if (typeof assert === "object") { ret.push(assert) ; if (assert.hasOwnProperty("assertions")) { - ret.push(this._assertionRefs(assert.assertions)); + // there are embedded assertions; get those too + ret.concat(this._assertionRefs(assert.assertions)); } } else { // it is a file name diff --git a/annotation-model/scripts/showdown.min.js b/annotation-model/scripts/showdown.min.js new file mode 100644 index 00000000000000..b0676c7bc34811 --- /dev/null +++ b/annotation-model/scripts/showdown.min.js @@ -0,0 +1,4 @@ +/*! showdown 20-07-2016 */ + +(function(){function a(a){"use strict";var b={omitExtraWLInCodeBlocks:{defaultValue:!1,describe:"Omit the default extra whiteline added to code blocks",type:"boolean"},noHeaderId:{defaultValue:!1,describe:"Turn on/off generated header id",type:"boolean"},prefixHeaderId:{defaultValue:!1,describe:"Specify a prefix to generated header ids",type:"string"},headerLevelStart:{defaultValue:!1,describe:"The header blocks level start",type:"integer"},parseImgDimensions:{defaultValue:!1,describe:"Turn on/off image dimension parsing",type:"boolean"},simplifiedAutoLink:{defaultValue:!1,describe:"Turn on/off GFM autolink style",type:"boolean"},literalMidWordUnderscores:{defaultValue:!1,describe:"Parse midword underscores as literal underscores",type:"boolean"},strikethrough:{defaultValue:!1,describe:"Turn on/off strikethrough support",type:"boolean"},tables:{defaultValue:!1,describe:"Turn on/off tables support",type:"boolean"},tablesHeaderId:{defaultValue:!1,describe:"Add an id to table headers",type:"boolean"},ghCodeBlocks:{defaultValue:!0,describe:"Turn on/off GFM fenced code blocks support",type:"boolean"},tasklists:{defaultValue:!1,describe:"Turn on/off GFM tasklist support",type:"boolean"},smoothLivePreview:{defaultValue:!1,describe:"Prevents weird effects in live previews due to incomplete input",type:"boolean"},smartIndentationFix:{defaultValue:!1,description:"Tries to smartly fix identation in es6 strings",type:"boolean"}};if(a===!1)return JSON.parse(JSON.stringify(b));var c={};for(var d in b)b.hasOwnProperty(d)&&(c[d]=b[d].defaultValue);return c}function b(a,b){"use strict";var c=b?"Error in "+b+" extension->":"Error in unnamed extension",e={valid:!0,error:""};d.helper.isArray(a)||(a=[a]);for(var f=0;f-1,l=new RegExp(b+"|"+c,"g"+j.replace(/g/g,"")),m=new RegExp(b,j.replace(/g/g,"")),n=[];do for(e=0;g=l.exec(a);)if(m.test(g[0]))e++||(f=l.lastIndex,h=f-g[0].length);else if(e&&!--e){i=g.index+g[0].length;var o={left:{start:h,end:f},match:{start:f,end:g.index},right:{start:g.index,end:i},wholeMatch:{start:h,end:i}};if(n.push(o),!k)return n}while(e&&(l.lastIndex=f));return n};d.helper.matchRecursiveRegExp=function(a,b,c,d){"use strict";for(var e=i(a,b,c,d),f=[],g=0;g0){var l=[];0!==h[0].wholeMatch.start&&l.push(a.slice(0,h[0].wholeMatch.start));for(var m=0;k>m;++m)l.push(b(a.slice(h[m].wholeMatch.start,h[m].wholeMatch.end),a.slice(h[m].match.start,h[m].match.end),a.slice(h[m].left.start,h[m].left.end),a.slice(h[m].right.start,h[m].right.end))),k-1>m&&l.push(a.slice(h[m].wholeMatch.end,h[m+1].wholeMatch.start));h[k-1].wholeMatch.end-1))return a;m=""}else m=c.gUrls[l],d.helper.isUndefined(c.gTitles[l])||(n=c.gTitles[l]);m=d.helper.escapeCharacters(m,"*_",!1);var o='"};return a=a.replace(/(\[((?:\[[^\]]*]|[^\[\]])*)][ ]?(?:\n[ ]*)?\[(.*?)])()()()()/g,e),a=a.replace(/(\[((?:\[[^\]]*]|[^\[\]])*)]\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,e),a=a.replace(/(\[([^\[\]]+)])()()()()()/g,e),a=c.converter._dispatch("anchors.after",a,b,c)}),d.subParser("autoLinks",function(a,b,c){"use strict";function e(a,b){var c=d.subParser("unescapeSpecialChars")(b);return d.subParser("encodeEmailAddress")(c)}a=c.converter._dispatch("autoLinks.before",a,b,c);var f=/\b(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+)(?=\s|$)(?!["<>])/gi,g=/<(((https?|ftp|dict):\/\/|www\.)[^'">\s]+)>/gi,h=/(?:^|[ \n\t])([A-Za-z0-9!#$%&'*+-\/=?^_`\{|}~\.]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)(?:$|[ \n\t])/gi,i=/<(?:mailto:)?([-.\w]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi;return a=a.replace(g,'$1'),a=a.replace(i,e),b.simplifiedAutoLink&&(a=a.replace(f,'$1'),a=a.replace(h,e)),a=c.converter._dispatch("autoLinks.after",a,b,c)}),d.subParser("blockGamut",function(a,b,c){"use strict";a=c.converter._dispatch("blockGamut.before",a,b,c),a=d.subParser("blockQuotes")(a,b,c),a=d.subParser("headers")(a,b,c);var e=d.subParser("hashBlock")("
    ",b,c);return a=a.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm,e),a=a.replace(/^[ ]{0,2}([ ]?\-[ ]?){3,}[ \t]*$/gm,e),a=a.replace(/^[ ]{0,2}([ ]?_[ ]?){3,}[ \t]*$/gm,e),a=d.subParser("lists")(a,b,c),a=d.subParser("codeBlocks")(a,b,c),a=d.subParser("tables")(a,b,c),a=d.subParser("hashHTMLBlocks")(a,b,c),a=d.subParser("paragraphs")(a,b,c),a=c.converter._dispatch("blockGamut.after",a,b,c)}),d.subParser("blockQuotes",function(a,b,c){"use strict";return a=c.converter._dispatch("blockQuotes.before",a,b,c),a=a.replace(/((^[ \t]{0,3}>[ \t]?.+\n(.+\n)*\n*)+)/gm,function(a,e){var f=e;return f=f.replace(/^[ \t]*>[ \t]?/gm,"~0"),f=f.replace(/~0/g,""),f=f.replace(/^[ \t]+$/gm,""),f=d.subParser("githubCodeBlocks")(f,b,c),f=d.subParser("blockGamut")(f,b,c),f=f.replace(/(^|\n)/g,"$1 "),f=f.replace(/(\s*
    [^\r]+?<\/pre>)/gm,function(a,b){var c=b;return c=c.replace(/^  /gm,"~0"),c=c.replace(/~0/g,"")}),d.subParser("hashBlock")("
    \n"+f+"\n
    ",b,c)}),a=c.converter._dispatch("blockQuotes.after",a,b,c)}),d.subParser("codeBlocks",function(a,b,c){"use strict";a=c.converter._dispatch("codeBlocks.before",a,b,c),a+="~0";var e=/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g;return a=a.replace(e,function(a,e,f){var g=e,h=f,i="\n";return g=d.subParser("outdent")(g),g=d.subParser("encodeCode")(g),g=d.subParser("detab")(g),g=g.replace(/^\n+/g,""),g=g.replace(/\n+$/g,""),b.omitExtraWLInCodeBlocks&&(i=""),g="
    "+g+i+"
    ",d.subParser("hashBlock")(g,b,c)+h}),a=a.replace(/~0/,""),a=c.converter._dispatch("codeBlocks.after",a,b,c)}),d.subParser("codeSpans",function(a,b,c){"use strict";return a=c.converter._dispatch("codeSpans.before",a,b,c),"undefined"==typeof a&&(a=""),a=a.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,function(a,b,c,e){var f=e;return f=f.replace(/^([ \t]*)/g,""),f=f.replace(/[ \t]*$/g,""),f=d.subParser("encodeCode")(f),b+""+f+""}),a=c.converter._dispatch("codeSpans.after",a,b,c)}),d.subParser("detab",function(a){"use strict";return a=a.replace(/\t(?=\t)/g," "),a=a.replace(/\t/g,"~A~B"),a=a.replace(/~B(.+?)~A/g,function(a,b){for(var c=b,d=4-c.length%4,e=0;d>e;e++)c+=" ";return c}),a=a.replace(/~A/g," "),a=a.replace(/~B/g,"")}),d.subParser("encodeAmpsAndAngles",function(a){"use strict";return a=a.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g,"&"),a=a.replace(/<(?![a-z\/?\$!])/gi,"<")}),d.subParser("encodeBackslashEscapes",function(a){"use strict";return a=a.replace(/\\(\\)/g,d.helper.escapeCharactersCallback),a=a.replace(/\\([`*_{}\[\]()>#+-.!])/g,d.helper.escapeCharactersCallback)}),d.subParser("encodeCode",function(a){"use strict";return a=a.replace(/&/g,"&"),a=a.replace(//g,">"),a=d.helper.escapeCharacters(a,"*_{}[]\\",!1)}),d.subParser("encodeEmailAddress",function(a){"use strict";var b=[function(a){return"&#"+a.charCodeAt(0)+";"},function(a){return"&#x"+a.charCodeAt(0).toString(16)+";"},function(a){return a}];return a="mailto:"+a,a=a.replace(/./g,function(a){if("@"===a)a=b[Math.floor(2*Math.random())](a);else if(":"!==a){var c=Math.random();a=c>.9?b[2](a):c>.45?b[1](a):b[0](a)}return a}),a=''+a+"",a=a.replace(/">.+:/g,'">')}),d.subParser("escapeSpecialCharsWithinTagAttributes",function(a){"use strict";var b=/(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|)/gi;return a=a.replace(b,function(a){var b=a.replace(/(.)<\/?code>(?=.)/g,"$1`");return b=d.helper.escapeCharacters(b,"\\`*_",!1)})}),d.subParser("githubCodeBlocks",function(a,b,c){"use strict";return b.ghCodeBlocks?(a=c.converter._dispatch("githubCodeBlocks.before",a,b,c),a+="~0",a=a.replace(/(?:^|\n)```(.*)\n([\s\S]*?)\n```/g,function(a,e,f){var g=b.omitExtraWLInCodeBlocks?"":"\n";return f=d.subParser("encodeCode")(f),f=d.subParser("detab")(f),f=f.replace(/^\n+/g,""),f=f.replace(/\n+$/g,""),f="
    "+f+g+"
    ",f=d.subParser("hashBlock")(f,b,c),"\n\n~G"+(c.ghCodeBlocks.push({text:a,codeblock:f})-1)+"G\n\n"}),a=a.replace(/~0/,""),c.converter._dispatch("githubCodeBlocks.after",a,b,c)):a}),d.subParser("hashBlock",function(a,b,c){"use strict";return a=a.replace(/(^\n+|\n+$)/g,""),"\n\n~K"+(c.gHtmlBlocks.push(a)-1)+"K\n\n"}),d.subParser("hashElement",function(a,b,c){"use strict";return function(a,b){var d=b;return d=d.replace(/\n\n/g,"\n"),d=d.replace(/^\n/,""),d=d.replace(/\n+$/g,""),d="\n\n~K"+(c.gHtmlBlocks.push(d)-1)+"K\n\n"}}),d.subParser("hashHTMLBlocks",function(a,b,c){"use strict";for(var e=["pre","div","h1","h2","h3","h4","h5","h6","blockquote","table","dl","ol","ul","script","noscript","form","fieldset","iframe","math","style","section","header","footer","nav","article","aside","address","audio","canvas","figure","hgroup","output","video","p"],f=function(a,b,d,e){var f=a;return-1!==d.search(/\bmarkdown\b/)&&(f=d+c.converter.makeHtml(b)+e),"\n\n~K"+(c.gHtmlBlocks.push(f)-1)+"K\n\n"},g=0;g]*>","","gim");return a=a.replace(/(\n[ ]{0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,d.subParser("hashElement")(a,b,c)),a=a.replace(/()/g,d.subParser("hashElement")(a,b,c)),a=a.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,d.subParser("hashElement")(a,b,c))}),d.subParser("hashHTMLSpans",function(a,b,c){"use strict";for(var e=d.helper.matchRecursiveRegExp(a,"]*>","","gi"),f=0;f]*>\\s*]*>","^(?: |\\t){0,3}\\s*
    ","gim")}),d.subParser("headers",function(a,b,c){"use strict";function e(a){var b,e=a.replace(/[^\w]/g,"").toLowerCase();return c.hashLinkCounts[e]?b=e+"-"+c.hashLinkCounts[e]++:(b=e,c.hashLinkCounts[e]=1),f===!0&&(f="section"),d.helper.isString(f)?f+b:b}a=c.converter._dispatch("headers.before",a,b,c);var f=b.prefixHeaderId,g=isNaN(parseInt(b.headerLevelStart))?1:parseInt(b.headerLevelStart),h=b.smoothLivePreview?/^(.+)[ \t]*\n={2,}[ \t]*\n+/gm:/^(.+)[ \t]*\n=+[ \t]*\n+/gm,i=b.smoothLivePreview?/^(.+)[ \t]*\n-{2,}[ \t]*\n+/gm:/^(.+)[ \t]*\n-+[ \t]*\n+/gm;return a=a.replace(h,function(a,f){var h=d.subParser("spanGamut")(f,b,c),i=b.noHeaderId?"":' id="'+e(f)+'"',j=g,k=""+h+"";return d.subParser("hashBlock")(k,b,c)}),a=a.replace(i,function(a,f){var h=d.subParser("spanGamut")(f,b,c),i=b.noHeaderId?"":' id="'+e(f)+'"',j=g+1,k=""+h+"";return d.subParser("hashBlock")(k,b,c)}),a=a.replace(/^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm,function(a,f,h){var i=d.subParser("spanGamut")(h,b,c),j=b.noHeaderId?"":' id="'+e(h)+'"',k=g-1+f.length,l=""+i+"";return d.subParser("hashBlock")(l,b,c)}),a=c.converter._dispatch("headers.after",a,b,c)}),d.subParser("images",function(a,b,c){"use strict";function e(a,b,e,f,g,h,i,j){var k=c.gUrls,l=c.gTitles,m=c.gDimensions;if(e=e.toLowerCase(),j||(j=""),""===f||null===f){if((""===e||null===e)&&(e=b.toLowerCase().replace(/ ?\n/g," ")),f="#"+e,d.helper.isUndefined(k[e]))return a;f=k[e],d.helper.isUndefined(l[e])||(j=l[e]),d.helper.isUndefined(m[e])||(g=m[e].width,h=m[e].height)}b=b.replace(/"/g,"""),b=d.helper.escapeCharacters(b,"*_",!1),f=d.helper.escapeCharacters(f,"*_",!1);var n=''+b+'?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(['"])(.*?)\6[ \t]*)?\)/g,g=/!\[([^\]]*?)] ?(?:\n *)?\[(.*?)]()()()()()/g;return a=a.replace(g,e),a=a.replace(f,e),a=c.converter._dispatch("images.after",a,b,c)}),d.subParser("italicsAndBold",function(a,b,c){"use strict";return a=c.converter._dispatch("italicsAndBold.before",a,b,c),b.literalMidWordUnderscores?(a=a.replace(/(^|\s|>|\b)__(?=\S)([\s\S]+?)__(?=\b|<|\s|$)/gm,"$1$2"),a=a.replace(/(^|\s|>|\b)_(?=\S)([\s\S]+?)_(?=\b|<|\s|$)/gm,"$1$2"),a=a.replace(/(\*\*)(?=\S)([^\r]*?\S[*]*)\1/g,"$2"),a=a.replace(/(\*)(?=\S)([^\r]*?\S)\1/g,"$2")):(a=a.replace(/(\*\*|__)(?=\S)([^\r]*?\S[*_]*)\1/g,"$2"),a=a.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g,"$2")),a=c.converter._dispatch("italicsAndBold.after",a,b,c)}),d.subParser("lists",function(a,b,c){"use strict";function e(a,e){c.gListLevel++,a=a.replace(/\n{2,}$/,"\n"),a+="~0";var f=/(\n)?(^[ \t]*)([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(~0|\2([*+-]|\d+[.])[ \t]+))/gm,g=/\n[ \t]*\n(?!~0)/.test(a);return a=a.replace(f,function(a,e,f,h,i,j,k){k=k&&""!==k.trim();var l=d.subParser("outdent")(i,b,c),m="";return j&&b.tasklists&&(m=' class="task-list-item" style="list-style-type: none;"',l=l.replace(/^[ \t]*\[(x|X| )?]/m,function(){var a='-1?(l=d.subParser("githubCodeBlocks")(l,b,c),l=d.subParser("blockGamut")(l,b,c)):(l=d.subParser("lists")(l,b,c),l=l.replace(/\n$/,""),l=g?d.subParser("paragraphs")(l,b,c):d.subParser("spanGamut")(l,b,c)),l="\n"+l+"\n"}),a=a.replace(/~0/g,""),c.gListLevel--,e&&(a=a.replace(/\s+$/,"")),a}function f(a,b,c){var d="ul"===b?/^ {0,2}\d+\.[ \t]/gm:/^ {0,2}[*+-][ \t]/gm,f=[],g="";if(-1!==a.search(d)){!function i(a){var f=a.search(d);-1!==f?(g+="\n\n<"+b+">"+e(a.slice(0,f),!!c)+"\n\n",b="ul"===b?"ol":"ul",d="ul"===b?/^ {0,2}\d+\.[ \t]/gm:/^ {0,2}[*+-][ \t]/gm,i(a.slice(f))):g+="\n\n<"+b+">"+e(a,!!c)+"\n\n"}(a);for(var h=0;h"+e(a,!!c)+"\n\n";return g}a=c.converter._dispatch("lists.before",a,b,c),a+="~0";var g=/^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm;return c.gListLevel?a=a.replace(g,function(a,b,c){var d=c.search(/[*+-]/g)>-1?"ul":"ol";return f(b,d,!0)}):(g=/(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm,a=a.replace(g,function(a,b,c,d){var e=d.search(/[*+-]/g)>-1?"ul":"ol";return f(c,e)})),a=a.replace(/~0/,""),a=c.converter._dispatch("lists.after",a,b,c)}),d.subParser("outdent",function(a){"use strict";return a=a.replace(/^(\t|[ ]{1,4})/gm,"~0"),a=a.replace(/~0/g,"")}),d.subParser("paragraphs",function(a,b,c){"use strict";a=c.converter._dispatch("paragraphs.before",a,b,c),a=a.replace(/^\n+/g,""),a=a.replace(/\n+$/g,"");for(var e=a.split(/\n{2,}/g),f=[],g=e.length,h=0;g>h;h++){var i=e[h];i.search(/~(K|G)(\d+)\1/g)>=0?f.push(i):(i=d.subParser("spanGamut")(i,b,c),i=i.replace(/^([ \t]*)/g,"

    "),i+="

    ",f.push(i))}for(g=f.length,h=0;g>h;h++){for(var j="",k=f[h],l=!1;k.search(/~(K|G)(\d+)\1/)>=0;){var m=RegExp.$1,n=RegExp.$2;j="K"===m?c.gHtmlBlocks[n]:l?d.subParser("encodeCode")(c.ghCodeBlocks[n].text):c.ghCodeBlocks[n].codeblock,j=j.replace(/\$/g,"$$$$"),k=k.replace(/(\n\n)?~(K|G)\d+\2(\n\n)?/,j),/^]*>\s*]*>/.test(k)&&(l=!0)}f[h]=k}return a=f.join("\n\n"),a=a.replace(/^\n+/g,""),a=a.replace(/\n+$/g,""),c.converter._dispatch("paragraphs.after",a,b,c)}),d.subParser("runExtension",function(a,b,c,d){"use strict";if(a.filter)b=a.filter(b,d.converter,c);else if(a.regex){var e=a.regex;!e instanceof RegExp&&(e=new RegExp(e,"g")),b=b.replace(e,a.replace)}return b}),d.subParser("spanGamut",function(a,b,c){"use strict";return a=c.converter._dispatch("spanGamut.before",a,b,c),a=d.subParser("codeSpans")(a,b,c),a=d.subParser("escapeSpecialCharsWithinTagAttributes")(a,b,c),a=d.subParser("encodeBackslashEscapes")(a,b,c),a=d.subParser("images")(a,b,c),a=d.subParser("anchors")(a,b,c),a=d.subParser("autoLinks")(a,b,c),a=d.subParser("encodeAmpsAndAngles")(a,b,c),a=d.subParser("italicsAndBold")(a,b,c),a=d.subParser("strikethrough")(a,b,c),a=a.replace(/ +\n/g,"
    \n"),a=c.converter._dispatch("spanGamut.after",a,b,c)}),d.subParser("strikethrough",function(a,b,c){"use strict";return b.strikethrough&&(a=c.converter._dispatch("strikethrough.before",a,b,c),a=a.replace(/(?:~T){2}([\s\S]+?)(?:~T){2}/g,"$1"),a=c.converter._dispatch("strikethrough.after",a,b,c)),a}),d.subParser("stripBlankLines",function(a){"use strict";return a.replace(/^[ \t]+$/gm,"")}),d.subParser("stripLinkDefinitions",function(a,b,c){"use strict";var e=/^ {0,3}\[(.+)]:[ \t]*\n?[ \t]*?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n+|(?=~0))/gm;return a+="~0",a=a.replace(e,function(a,e,f,g,h,i,j){return e=e.toLowerCase(),c.gUrls[e]=d.subParser("encodeAmpsAndAngles")(f),i?i+j:(j&&(c.gTitles[e]=j.replace(/"|'/g,""")),b.parseImgDimensions&&g&&h&&(c.gDimensions[e]={width:g,height:h}),"")}),a=a.replace(/~0/,"")}),d.subParser("tables",function(a,b,c){"use strict";function e(a){return/^:[ \t]*--*$/.test(a)?' style="text-align:left;"':/^--*[ \t]*:[ \t]*$/.test(a)?' style="text-align:right;"':/^:[ \t]*--*[ \t]*:$/.test(a)?' style="text-align:center;"':""}function f(a,e){var f="";return a=a.trim(),b.tableHeaderId&&(f=' id="'+a.replace(/ /g,"_").toLowerCase()+'"'),a=d.subParser("spanGamut")(a,b,c),""+a+"\n"}function g(a,e){var f=d.subParser("spanGamut")(a,b,c);return""+f+"\n"}function h(a,b){for(var c="\n\n\n",d=a.length,e=0;d>e;++e)c+=a[e];for(c+="\n\n\n",e=0;e\n";for(var f=0;d>f;++f)c+=b[e][f];c+="\n"}return c+="\n
    \n"}if(!b.tables)return a;var i=/^[ \t]{0,3}\|?.+\|.+\n[ \t]{0,3}\|?[ \t]*:?[ \t]*(?:-|=){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:-|=){2,}[\s\S]+?(?:\n\n|~0)/gm;return a=c.converter._dispatch("tables.before",a,b,c),a=a.replace(i,function(a){var b,c=a.split("\n");for(b=0;bj'adore !

    ", + "format" : "text/html", + "language" : "fr" + }, + "target": "http://example.org/photo1" +} \ No newline at end of file diff --git a/annotation-model/tools/samples/example6.json b/annotation-model/tools/samples/example6.json new file mode 100644 index 00000000000000..9ae0d88eaeeb8f --- /dev/null +++ b/annotation-model/tools/samples/example6.json @@ -0,0 +1,7 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno6", + "type":"Annotation", + "bodyValue": "Comment text", + "target": "http://example.org/target1" +} \ No newline at end of file diff --git a/annotation-model/tools/samples/example7.json b/annotation-model/tools/samples/example7.json new file mode 100644 index 00000000000000..9f821d22fb2bf7 --- /dev/null +++ b/annotation-model/tools/samples/example7.json @@ -0,0 +1,11 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno7", + "type":"Annotation", + "body": { + "type": "TextualBody", + "value": "Comment text", + "format": "text/plain" + }, + "target": "http://example.org/target1" +} \ No newline at end of file diff --git a/annotation-model/tools/samples/example8.json b/annotation-model/tools/samples/example8.json new file mode 100644 index 00000000000000..3187af65746afb --- /dev/null +++ b/annotation-model/tools/samples/example8.json @@ -0,0 +1,6 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno8", + "type": "Annotation", + "target": "http://example.org/ebook1" +} \ No newline at end of file diff --git a/annotation-model/tools/samples/example9.json b/annotation-model/tools/samples/example9.json new file mode 100644 index 00000000000000..8d72da3563f46f --- /dev/null +++ b/annotation-model/tools/samples/example9.json @@ -0,0 +1,16 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno9", + "type": "Annotation", + "body": [ + "http://example.org/description1", + { + "type": "TextualBody", + "value": "tag1" + } + ], + "target": [ + "http://example.org/image1", + "http://example.org/image2" + ] +} \ No newline at end of file diff --git a/annotation-model/tools/template b/annotation-model/tools/template deleted file mode 100644 index 9806475b025c63..00000000000000 --- a/annotation-model/tools/template +++ /dev/null @@ -1,42 +0,0 @@ - - - -{{TESTTITLE}} - - - - - - - -

    Fill the textarea below with JSON output from your annotation client -implementation that supports the following criteria:

    -
    -

    Specifically, the following assertions will be evaluated:

    -
    -
    - -

    -

    -
    - - diff --git a/annotation-model/tools/template_js b/annotation-model/tools/template_js new file mode 100644 index 00000000000000..29b76b323f1c40 --- /dev/null +++ b/annotation-model/tools/template_js @@ -0,0 +1,36 @@ + + + +{{TESTTITLE}} + + + + + + + +
    +

    The following assertions are being evaluated:

    +
    + + diff --git a/annotation-model/tools/template_manual b/annotation-model/tools/template_manual new file mode 100644 index 00000000000000..01bac92a824f65 --- /dev/null +++ b/annotation-model/tools/template_manual @@ -0,0 +1,42 @@ + + + +{{TESTTITLE}} + + + + + + + + +

    Fill the textarea below with JSON output from your annotation client +implementation that supports the following criteria:

    +
    +

    Specifically, the following assertions will be evaluated:

    +
    +
    + +

    +

    +
    + + diff --git a/app-uri/appURI_test.html b/app-uri/appURI_test.html index feb35d57e8295b..722c210b54538c 100644 --- a/app-uri/appURI_test.html +++ b/app-uri/appURI_test.html @@ -2,8 +2,8 @@ app:URI compliance tests - - + + + + I'm an HTML <title>! + + + + diff --git a/conformance-checkers/html-svg/animate-dom-01-f-novalid.html b/conformance-checkers/html-svg/animate-dom-01-f-novalid.html new file mode 100644 index 00000000000000..a8b0dc56ac9b3d --- /dev/null +++ b/conformance-checkers/html-svg/animate-dom-01-f-novalid.html @@ -0,0 +1,176 @@ + + + + animate-dom-01-f-manual.svg + + + +

    Source SVG: animate-dom-01-f-manual.svg

    + + + + + + + + + + $RCSfile: animate-dom-01-f.svg,v $ + + + + + + + + + + Testing SVGAnimationElement.getStartTime() + + Test running... + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Called before a lone interval starts + Called on an animation with no intervals + Called during an interval + Called after a lone interval ends, fill="remove" + Called after a lone interval ends, fill="freeze" + Called with multiple begin values + Called with multiple begin values including "indefinite" + Called with syncbase begin value + + + + + $Revision: 1.11 $ + + + + + + diff --git a/conformance-checkers/html-svg/animate-dom-02-f-novalid.html b/conformance-checkers/html-svg/animate-dom-02-f-novalid.html new file mode 100644 index 00000000000000..024044443a7049 --- /dev/null +++ b/conformance-checkers/html-svg/animate-dom-02-f-novalid.html @@ -0,0 +1,66 @@ + + + + animate-dom-02-f-manual.svg + + + +

    Source SVG: animate-dom-02-f-manual.svg

    + + + + + + + + + + $RCSfile: animate-dom-02-f.svg,v $ + + + + + + + + + + Testing ElementTimeControl method return values + + + + + + + + + $Revision: 1.7 $ + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-02-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-02-t-isvalid.html new file mode 100644 index 00000000000000..2fa739b965325e --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-02-t-isvalid.html @@ -0,0 +1,82 @@ + + + + animate-elem-02-t-manual.svg + + + +

    Source SVG: animate-elem-02-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-02-t.svg,v $ + + + + + + + + + + + + + + + + + anim.5 + + + + + + + + + anim.6 + + + + + + + + + anim.7 + + + + + + + + + anim.8 + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-03-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-03-t-isvalid.html new file mode 100644 index 00000000000000..42a8cba62551dc --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-03-t-isvalid.html @@ -0,0 +1,70 @@ + + + + animate-elem-03-t-manual.svg + + + +

    Source SVG: animate-elem-03-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-03-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + Sample 123 + Sample 123 + Sample 123 + + + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-04-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-04-t-isvalid.html new file mode 100644 index 00000000000000..74a11744efa55c --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-04-t-isvalid.html @@ -0,0 +1,56 @@ + + + + animate-elem-04-t-manual.svg + + + +

    Source SVG: animate-elem-04-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-04-t.svg,v $ + + + + + + + + + + Test a motion path + 'from'/'to' attribute. + + + 0 sec. + + 3+ sec. + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-05-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-05-t-isvalid.html new file mode 100644 index 00000000000000..424d9cdff85ef3 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-05-t-isvalid.html @@ -0,0 +1,58 @@ + + + + animate-elem-05-t-manual.svg + + + +

    Source SVG: animate-elem-05-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-05-t.svg,v $ + + + + + + + + + + Test a motion path + 'values' attribute. + + + 0 sec. + + 3+ + + 6+ + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-06-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-06-t-isvalid.html new file mode 100644 index 00000000000000..1b6c7becd763c5 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-06-t-isvalid.html @@ -0,0 +1,56 @@ + + + + animate-elem-06-t-manual.svg + + + +

    Source SVG: animate-elem-06-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-06-t.svg,v $ + + + + + + + + + + Test a motion path + 'path' attribute. + + + 0 sec. + + 6+ sec. + + + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-07-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-07-t-isvalid.html new file mode 100644 index 00000000000000..df308255793284 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-07-t-isvalid.html @@ -0,0 +1,58 @@ + + + + animate-elem-07-t-manual.svg + + + +

    Source SVG: animate-elem-07-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-07-t.svg,v $ + + + + + + + + + + Test a motion path + 'mpath' element. + + + 0 sec. + + 6+ sec. + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-08-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-08-t-isvalid.html new file mode 100644 index 00000000000000..7e2891dc8e274c --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-08-t-isvalid.html @@ -0,0 +1,65 @@ + + + + animate-elem-08-t-manual.svg + + + +

    Source SVG: animate-elem-08-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-08-t.svg,v $ + + + + + + + + + Test rotate='auto' and rotate='auto-reverse' + + + + 0 sec. + + 6+ sec. + + + + rotate='auto' + + + 0 sec. + + 6+ sec. + + + + rotate='auto-reverse' + + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-09-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-09-t-isvalid.html new file mode 100644 index 00000000000000..fcdb741ff69476 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-09-t-isvalid.html @@ -0,0 +1,77 @@ + + + + animate-elem-09-t-manual.svg + + + +

    Source SVG: animate-elem-09-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-09-t.svg,v $ + + + + + + + + + + + 0-2 sec. + 2-4 sec. + 4-6 sec. + 6+ sec. + + + + + + + + + + + + + 0-2 sec. + 2-4 sec. + 4-6 sec. + 6+ sec. + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-10-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-10-t-isvalid.html new file mode 100644 index 00000000000000..ebcbcb510a1cf9 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-10-t-isvalid.html @@ -0,0 +1,78 @@ + + + + animate-elem-10-t-manual.svg + + + +

    Source SVG: animate-elem-10-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-10-t.svg,v $ + + + + + + + + + + + at 0 sec. + at 3 sec. + at 6 sec. + 9+ sec. + + + + + + + + + + + + + + at 0 sec. + at 3 sec. + at 6 sec. + 9+ sec. + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-11-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-11-t-isvalid.html new file mode 100644 index 00000000000000..e357d45e19f964 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-11-t-isvalid.html @@ -0,0 +1,77 @@ + + + + animate-elem-11-t-manual.svg + + + +

    Source SVG: animate-elem-11-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-11-t.svg,v $ + + + + + + + + + + + at 0 sec. + at 3 sec. + at 6 sec. + 9+ sec. + + + + + + + + + + + + + at 0 sec. + at 3 sec. + at 6 sec. + 9+ sec. + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-12-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-12-t-isvalid.html new file mode 100644 index 00000000000000..f5f459a761258d --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-12-t-isvalid.html @@ -0,0 +1,77 @@ + + + + animate-elem-12-t-manual.svg + + + +

    Source SVG: animate-elem-12-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-12-t.svg,v $ + + + + + + + + + + + at 0 sec. + at 3 sec. + at 6 sec. + 9+ sec. + + + + + + + + + + + + + at 0 sec. + at 3 sec. + at 6 sec. + 9+ sec. + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-13-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-13-t-isvalid.html new file mode 100644 index 00000000000000..22891068bfc1ed --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-13-t-isvalid.html @@ -0,0 +1,86 @@ + + + + animate-elem-13-t-manual.svg + + + +

    Source SVG: animate-elem-13-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-13-t.svg,v $ + + + + + + + + + + + + 0-2 sec. + 5+ sec. + + + + + from to + + + + + + from by + + + + + + by + + + + + + to + + + + + + values + + + + + + values + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-14-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-14-t-isvalid.html new file mode 100644 index 00000000000000..da196799e35467 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-14-t-isvalid.html @@ -0,0 +1,62 @@ + + + + animate-elem-14-t-manual.svg + + + +

    Source SVG: animate-elem-14-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-14-t.svg,v $ + + + + + + + + + calcMode="discrete" + keyTimes="0;.2;.4;.6" + + + Time (s): + 0 + + 2 + + 4 + + 6 + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-15-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-15-t-isvalid.html new file mode 100644 index 00000000000000..047abbefa04032 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-15-t-isvalid.html @@ -0,0 +1,62 @@ + + + + animate-elem-15-t-manual.svg + + + +

    Source SVG: animate-elem-15-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-15-t.svg,v $ + + + + + + + + + calcMode="paced" + keyTimes="0;.25;.5;1" + + + Time (s): + 0 + + 1.5 + + 4 + + 9 + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-17-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-17-t-isvalid.html new file mode 100644 index 00000000000000..5148a5cfb68819 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-17-t-isvalid.html @@ -0,0 +1,62 @@ + + + + animate-elem-17-t-manual.svg + + + +

    Source SVG: animate-elem-17-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-17-t.svg,v $ + + + + + + + + + calcMode="spline" + keyTimes="0;.25;.5;1" + + + Time (s): + 0 + + 2 + + 4 + + 8 + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-19-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-19-t-isvalid.html new file mode 100644 index 00000000000000..75f05ae329456c --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-19-t-isvalid.html @@ -0,0 +1,62 @@ + + + + animate-elem-19-t-manual.svg + + + +

    Source SVG: animate-elem-19-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-19-t.svg,v $ + + + + + + + + + calcMode="linear" + keyTimes="0;.5;.75;1" + + + Time (s): + 0 + + 4 + + 6 + + 8 + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-20-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-20-t-isvalid.html new file mode 100644 index 00000000000000..950c3568c618d8 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-20-t-isvalid.html @@ -0,0 +1,59 @@ + + + + animate-elem-20-t-manual.svg + + + +

    Source SVG: animate-elem-20-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-20-t.svg,v $ + + + + + + + + + + + + + + + + + Fade in + + + + Fade out + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-21-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-21-t-isvalid.html new file mode 100644 index 00000000000000..c4b1f5a5dfbb3b --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-21-t-isvalid.html @@ -0,0 +1,67 @@ + + + + animate-elem-21-t-manual.svg + + + +

    Source SVG: animate-elem-21-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-21-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + Fade in + + + + Fade out + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-22-b-isvalid.html b/conformance-checkers/html-svg/animate-elem-22-b-isvalid.html new file mode 100644 index 00000000000000..dfea322d405896 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-22-b-isvalid.html @@ -0,0 +1,63 @@ + + + + animate-elem-22-b-manual.svg + + + +

    Source SVG: animate-elem-22-b-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-22-b.svg,v $ + + + + + + + + + + + Yellow rect at time 0s + + Yellow rect at time 3s + + Yellow rect at time 9s + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-23-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-23-t-isvalid.html new file mode 100644 index 00000000000000..a39fe76890093a --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-23-t-isvalid.html @@ -0,0 +1,64 @@ + + + + animate-elem-23-t-manual.svg + + + +

    Source SVG: animate-elem-23-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-23-t.svg,v $ + + + + + + + + + + + Color at 3s + + + Color at 6s + + + Color at 9s + + + + + + + + + + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-24-t-novalid.html b/conformance-checkers/html-svg/animate-elem-24-t-novalid.html new file mode 100644 index 00000000000000..922125adb9b920 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-24-t-novalid.html @@ -0,0 +1,105 @@ + + + + animate-elem-24-t-manual.svg + + + +

    Source SVG: animate-elem-24-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-24-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Text from 0s to 3s + Text at 6s + Text at 9s + + + + It's alive! + It's alive! + It's alive! + + + + + + It's alive! + + + + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-25-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-25-t-isvalid.html new file mode 100644 index 00000000000000..ffa132331db61e --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-25-t-isvalid.html @@ -0,0 +1,61 @@ + + + + animate-elem-25-t-manual.svg + + + +

    Source SVG: animate-elem-25-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-25-t.svg,v $ + + + + + + + + + Test animation options for specifying the target attribute/property. + + 0-3 sec. + + at 6 sec. + + + + + 0-6 sec. + + at 9 sec. + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-26-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-26-t-isvalid.html new file mode 100644 index 00000000000000..b5474f8912877d --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-26-t-isvalid.html @@ -0,0 +1,62 @@ + + + + animate-elem-26-t-manual.svg + + + +

    Source SVG: animate-elem-26-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-26-t.svg,v $ + + + + + + + + + + + + + + + + anim. 1 + + + + + + + + + anim. 2 + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-27-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-27-t-isvalid.html new file mode 100644 index 00000000000000..2cd182740dd4a6 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-27-t-isvalid.html @@ -0,0 +1,60 @@ + + + + animate-elem-27-t-manual.svg + + + +

    Source SVG: animate-elem-27-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-27-t.svg,v $ + + + + + + + + + Test animation options for specifying the target element. + + 0 to 3 sec. + + at 6 sec. + + + + 0 to 6 sec. + + at 9 sec. + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-28-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-28-t-isvalid.html new file mode 100644 index 00000000000000..0dd94c7d199ddb --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-28-t-isvalid.html @@ -0,0 +1,54 @@ + + + + animate-elem-28-t-manual.svg + + + +

    Source SVG: animate-elem-28-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-28-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-29-b-isvalid.html b/conformance-checkers/html-svg/animate-elem-29-b-isvalid.html new file mode 100644 index 00000000000000..761f538b25b35c --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-29-b-isvalid.html @@ -0,0 +1,60 @@ + + + + animate-elem-29-b-manual.svg + + + +

    Source SVG: animate-elem-29-b-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-29-b.svg,v $ + + + + + + + + + + + + + + + + + + Fade in + + + + Fade out + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-30-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-30-t-isvalid.html new file mode 100644 index 00000000000000..554946432feb43 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-30-t-isvalid.html @@ -0,0 +1,146 @@ + + + + animate-elem-30-t-manual.svg + + + +

    Source SVG: animate-elem-30-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-30-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-31-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-31-t-isvalid.html new file mode 100644 index 00000000000000..37f3d463e6ef49 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-31-t-isvalid.html @@ -0,0 +1,118 @@ + + + + animate-elem-31-t-manual.svg + + + +

    Source SVG: animate-elem-31-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-31-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + display + visibility + Test of display attribute animation. + Circles with same color should be visible at same time. + + Test running... + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-32-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-32-t-isvalid.html new file mode 100644 index 00000000000000..bcd4ca00e60e84 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-32-t-isvalid.html @@ -0,0 +1,139 @@ + + + + animate-elem-32-t-manual.svg + + + +

    Source SVG: animate-elem-32-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-32-t.svg,v $ + + + + + + + + + + + + + Stroked + Unstroked + Zero width rect + Zero height rect + Zero radius circle + Zero x radius ellipse + Zero y radius ellipse + Zero length line + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-33-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-33-t-isvalid.html new file mode 100644 index 00000000000000..b9a460041cdc86 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-33-t-isvalid.html @@ -0,0 +1,131 @@ + + + + animate-elem-33-t-manual.svg + + + +

    Source SVG: animate-elem-33-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-33-t.svg,v $ + + + + + + + + + + + 0 + 0.8-3.2 + 4 + + + + + + + + + + + + + + + 0 + 2 + 2 + 4 + + + + + + + + + + + + + + + + + + 3 + 2.6 + 0 + 1 + 4 + 1.4 + + + + + + + + + + + + + + + + 3 + 2.6 + 0 + 1 + 4 + 1.4 + + + + + + + + + + + + + + Test of keyPoints and keyTimes. + Number indicates the circle's passing time in seconds. + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-34-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-34-t-isvalid.html new file mode 100644 index 00000000000000..dccc5a38c7189d --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-34-t-isvalid.html @@ -0,0 +1,92 @@ + + + + animate-elem-34-t-manual.svg + + + +

    Source SVG: animate-elem-34-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-34-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Animation on: 'points' and 'fill-rule'. + Digit should match outline at indicated time. + Filled square should follow morphing digit discretely. + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-35-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-35-t-isvalid.html new file mode 100644 index 00000000000000..39ef7d68983b85 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-35-t-isvalid.html @@ -0,0 +1,120 @@ + + + + animate-elem-35-t-manual.svg + + + +

    Source SVG: animate-elem-35-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-35-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Animation on: 'stroke-dasharray', 'stroke-dashoffset', + 'stroke-miterlimit', 'stroke-linecap' and 'stroke-linejoin'. + + + $Revision: 1.8 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/animate-elem-36-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-36-t-isvalid.html new file mode 100644 index 00000000000000..0073cff7ae6beb --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-36-t-isvalid.html @@ -0,0 +1,134 @@ + + + + animate-elem-36-t-manual.svg + + + +

    Source SVG: animate-elem-36-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-36-t.svg,v $ + + + + + + + + + <animateTransform> on structure, + hyperlinking and text elements + + + + + + + + + + + + + + + <g> + + + + + + + + + + + <use> + + + + + + + <image> + + + + + + + + + + + + + + + + + + <switch> + + + + + + + + + + + + + + + + <a> + + + + + + + + + + + + + + 123 + + + + <text> + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-37-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-37-t-isvalid.html new file mode 100644 index 00000000000000..1f720042bc7a40 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-37-t-isvalid.html @@ -0,0 +1,88 @@ + + + + animate-elem-37-t-manual.svg + + + +

    Source SVG: animate-elem-37-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-37-t.svg,v $ + + + + + + + + + <animateTransform> shape elements + + + + + <path> + + + + + + <rect> + + + + + + <circle> + + + + + + <ellipse> + + + + + + <line> + + + + + + <polyline> + + + + + + <polygon> + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-38-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-38-t-isvalid.html new file mode 100644 index 00000000000000..9e9c151298db59 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-38-t-isvalid.html @@ -0,0 +1,80 @@ + + + + animate-elem-38-t-manual.svg + + + +

    Source SVG: animate-elem-38-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-38-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Animation on: 'viewBox'. Flashing frame should + only appear at the edges of the SVG element. + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-39-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-39-t-isvalid.html new file mode 100644 index 00000000000000..44cc438c7e8765 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-39-t-isvalid.html @@ -0,0 +1,114 @@ + + + + animate-elem-39-t-manual.svg + + + +

    Source SVG: animate-elem-39-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-39-t.svg,v $ + + + + + + + + + <animate> on xlink:href + + + <set> + + + + + + 38 + 02 + + + + + <a> + + + + + + + <image> + + + + + Use A + Use B + Use C + + + + + + + <use> + + + + <animate> + + + + + + 09 + 03 + + + + + <a> + + + + + + + <image> + + + + + + + + <use> + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-40-t-novalid.html b/conformance-checkers/html-svg/animate-elem-40-t-novalid.html new file mode 100644 index 00000000000000..0e8682825a70bb --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-40-t-novalid.html @@ -0,0 +1,200 @@ + + + + animate-elem-40-t-manual.svg + + + +

    Source SVG: animate-elem-40-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-40-t.svg,v $ + + + + + + + + + <animate> of x/y/width/height + + + + + + + + + + + + + + + + + + + + + + + + + + + + x/y on <use> + + + + + + + + + + + x/y on <image> + + + + + + + + + + + x/y on <rect> + + + + + + + + + + + + x/y on <rect> + + + + + + + + + + + + + + 123 + + + + + + + x/y on <text> + + + + + + + + + + + + + + + + + + 12 + + + + + + + x/y on <text>(2) + + + + + + + + + + + + + + + + + + + + + width/height + on <image> + + + + + + + + + + + + + + + + + + + + + + width/height + on <rect> + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-41-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-41-t-isvalid.html new file mode 100644 index 00000000000000..ff2a8c3f759025 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-41-t-isvalid.html @@ -0,0 +1,393 @@ + + + + animate-elem-41-t-manual.svg + + + +

    Source SVG: animate-elem-41-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-41-t.svg,v $ + + + + + + + + + graphics + + + fill + fill-rule + stroke + stroke-width + stroke-linecap + stroke-linejoin + stroke-miterlimit + stroke-dashoffset + display + visibility + color + + + + element + <g> + <a> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-44-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-44-t-isvalid.html new file mode 100644 index 00000000000000..6a58cc71f8d937 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-44-t-isvalid.html @@ -0,0 +1,72 @@ + + + + animate-elem-44-t-manual.svg + + + +

    Source SVG: animate-elem-44-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-44-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Animation on the 'd' + attribute of path. + + Digit should match outline at indicated time. + Filled circle should follow morphing digit discretely. + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-46-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-46-t-isvalid.html new file mode 100644 index 00000000000000..86d81826c64b95 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-46-t-isvalid.html @@ -0,0 +1,239 @@ + + + + animate-elem-46-t-manual.svg + + + +

    Source SVG: animate-elem-46-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-46-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text-anchor + font-size + font-family + font-style + font-weight + + + + <text> + <g> + <a> + + + + + + + A + + A + + A + + + + + + + + + + + + A + + + + + + + + A + + + + + + A + + + + + + + A + A + A + + + + + + + + A + + + + + + + A + + + + + + A + + + + + + + A + A + A + + + + + + + A + + + + + + + A + + + + + + A + + + + + + + A + A + A + + + + + + + A + + + + + + + A + + + + + + A + + + + + + + + A + A + A + + + + + + + + A + + + + + + + A + + + + + + A + + + + + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-52-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-52-t-isvalid.html new file mode 100644 index 00000000000000..83430f9f9d355c --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-52-t-isvalid.html @@ -0,0 +1,78 @@ + + + + animate-elem-52-t-manual.svg + + + +

    Source SVG: animate-elem-52-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-52-t.svg,v $ + + + + + + + + + A + B + C + D + + + + + click A + + + + + click B+2 + + + + + click C+4 + + + + + never + + + + + + + Test of Eventbase targets. + Note that clicking rect D should give no result. + Clicking a rectangle should change its color at the + time for the click + delay as indicated in each rect. + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-53-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-53-t-isvalid.html new file mode 100644 index 00000000000000..1b1bebc7a8bee8 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-53-t-isvalid.html @@ -0,0 +1,88 @@ + + + + animate-elem-53-t-manual.svg + + + +

    Source SVG: animate-elem-53-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-53-t.svg,v $ + + + + + + + + + + + + + + 0s + + 3s + + 6s + + 9s + + + + + + + + + + + + + 0s + + 2.22s + + 6.66s + + 8s + + + + + + + + + + + Animation on: 'points' with 'calc-mode'. + Coloblue and black squares should match at indicated time. + Same coloblue squares (green and blue) should match at all times + + + $Revision: 1.7 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/animate-elem-60-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-60-t-isvalid.html new file mode 100644 index 00000000000000..057df82b79cb0c --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-60-t-isvalid.html @@ -0,0 +1,157 @@ + + + + animate-elem-60-t-manual.svg + + + +

    Source SVG: animate-elem-60-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-60-t.svg,v $ + + + + + + + + + begin + + + unspecified + offset + event base + sync base + indefinite + repeat() + accessKey() + wallclock() + + + + 0s + 1s + 2s + 3s + 4s + 5s + 6s + 7s + 8s + 0s + 1s + 2s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-61-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-61-t-isvalid.html new file mode 100644 index 00000000000000..c1abfb35e28861 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-61-t-isvalid.html @@ -0,0 +1,115 @@ + + + + animate-elem-61-t-manual.svg + + + +

    Source SVG: animate-elem-61-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-61-t.svg,v $ + + + + + + + + + multiple begin + + + 2 offsets + 2 sync bases + 2 repeat + 2 event base + 2 accessKeys + misc + + + + 0-1s + 2s-4s + > 5s + + 1-2s + 4-5s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-62-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-62-t-isvalid.html new file mode 100644 index 00000000000000..9154bf0ea95f1a --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-62-t-isvalid.html @@ -0,0 +1,157 @@ + + + + animate-elem-62-t-manual.svg + + + +

    Source SVG: animate-elem-62-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-62-t.svg,v $ + + + + + + + + + end + + + unspecified + offset + event base + sync base + indefinite + repeat() + accessKey() + wallclock() + + + + 0s + 1s + 2s + 3s + 4s + 5s + 6s + 7s + 8s + 0s + 1s + 2s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-63-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-63-t-isvalid.html new file mode 100644 index 00000000000000..287450592b6ecd --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-63-t-isvalid.html @@ -0,0 +1,122 @@ + + + + animate-elem-63-t-manual.svg + + + +

    Source SVG: animate-elem-63-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-63-t.svg,v $ + + + + + + + + + multiple end + + + 2 offsets + 2 sync bases + 2 repeat + 2 event base + 2 accessKeys + misc + + + + 0-1s + 2s-4s + > 5s + + 1-2s + 4-5s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-64-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-64-t-isvalid.html new file mode 100644 index 00000000000000..4a6871f47eb5d7 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-64-t-isvalid.html @@ -0,0 +1,100 @@ + + + + animate-elem-64-t-manual.svg + + + +

    Source SVG: animate-elem-64-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-64-t.svg,v $ + + + + + + + + + dur + + + clock value + indefinite + media + + + + > 2s + 0s-2s + + + never + > 0s + + + + never + > 0s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-65-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-65-t-isvalid.html new file mode 100644 index 00000000000000..ae4d9d1ab154c8 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-65-t-isvalid.html @@ -0,0 +1,146 @@ + + + + animate-elem-65-t-manual.svg + + + +

    Source SVG: animate-elem-65-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-65-t.svg,v $ + + + + + + + + + min + + + + + no min / media + invalid min + min < active dur + min > active dur + min < repeat dur + min > repeat dur, remove + min > repeat dur, freeze + + + + > 5s + 0s-5s + + + never + > 0s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-66-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-66-t-isvalid.html new file mode 100644 index 00000000000000..35674a7ef22af1 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-66-t-isvalid.html @@ -0,0 +1,139 @@ + + + + animate-elem-66-t-manual.svg + + + +

    Source SVG: animate-elem-66-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-66-t.svg,v $ + + + + + + + + + max + min & max + + + no max / media + invalid max values + max < active dur + max > active dur + min < max + min = max + min > max (both ignored) + + + > 5s + 0s-5s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-67-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-67-t-isvalid.html new file mode 100644 index 00000000000000..1975b64f51f625 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-67-t-isvalid.html @@ -0,0 +1,123 @@ + + + + animate-elem-67-t-manual.svg + + + +

    Source SVG: animate-elem-67-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-67-t.svg,v $ + + + + + + + + + restart + + + + + no restart (defaults to always) + restart="always" + restart="whenNotActive" + restart="never" + reference + + + + > 5s + 0s-5s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-68-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-68-t-isvalid.html new file mode 100644 index 00000000000000..927dfe08eea7d5 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-68-t-isvalid.html @@ -0,0 +1,102 @@ + + + + animate-elem-68-t-manual.svg + + + +

    Source SVG: animate-elem-68-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-68-t.svg,v $ + + + + + + + + + repeatCount + + + dur=5s repeatCount unspecified + dur=1s repeatCount=5 + dur=10s repeatCount=0.5 + dur=1s repeatCount=indefinite + end=5s + + + + > 5s + 0s-5s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-69-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-69-t-isvalid.html new file mode 100644 index 00000000000000..7b28226b382418 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-69-t-isvalid.html @@ -0,0 +1,113 @@ + + + + animate-elem-69-t-manual.svg + + + +

    Source SVG: animate-elem-69-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-69-t.svg,v $ + + + + + + + + + repeatDur + + + dur=5s repeatDur unspecified + dur=1s repeatDur=5s + dur=0.5s repeatDur=5s + dur=1s repeatDur=indefinite + end=5s + dur=0.7s repeatDur=5s + + + + > 5s + 0s-5s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-70-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-70-t-isvalid.html new file mode 100644 index 00000000000000..5754fdf378681b --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-70-t-isvalid.html @@ -0,0 +1,105 @@ + + + + animate-elem-70-t-manual.svg + + + +

    Source SVG: animate-elem-70-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-70-t.svg,v $ + + + + + + + + + fill + + + fill unspecified (remove) + fill=remove + fill=freeze (with restart) + fill=freeze (no restart) + + + + never + here + always + here + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-77-t-novalid.html b/conformance-checkers/html-svg/animate-elem-77-t-novalid.html new file mode 100644 index 00000000000000..8cfc4cbd8295aa --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-77-t-novalid.html @@ -0,0 +1,287 @@ + + + + animate-elem-77-t-manual.svg + + + +

    Source SVG: animate-elem-77-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-77-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + + + transform + text-anchor + font-size + font-family + font-style + font-weight + + + + <text> + <g> + <a> + + + + A + + + + + A + A + + + + + + + + + A + + + + + + A + + + + + A + + + + + + + A + A + + + + + + + + + A + + + + + + + + A + + + + + + + + A + + + + + + + + + A + A + + + + + + + + A + + + + + + + + A + + + + + + + + A + + + + + + + + + A + A + + + + + + + + A + + + + + + + + A + + + + + + + + A + + + + + + + + + + A + A + + + + + + + + + A + + + + + + + + A + + + + + + + + A + + + + + + + + + A + A + + + + + + + + + A + + + + + + + + A + + + + + + + + A + + + + + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-78-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-78-t-isvalid.html new file mode 100644 index 00000000000000..675d0c74a6cc1e --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-78-t-isvalid.html @@ -0,0 +1,423 @@ + + + + animate-elem-78-t-manual.svg + + + +

    Source SVG: animate-elem-78-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-78-t.svg,v $ + + + + + + + + + graphics + + + fill + fill-rule + stroke + stroke-width + stroke-linecap + stroke-linejoin + stroke-miterlimit + stroke-dashoffset + display + visibility + color + + + + 'Basic Shape' + <g> + <a> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-80-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-80-t-isvalid.html new file mode 100644 index 00000000000000..f72ab64f5a0bcd --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-80-t-isvalid.html @@ -0,0 +1,252 @@ + + + + animate-elem-80-t-manual.svg + + + +

    Source SVG: animate-elem-80-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-80-t.svg,v $ + + + + + + + + + <animateTransform> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + type=rotate + + + + + + + + + + + + + + + + + + + type=skewX + + + + + + + + + + + + + + + + + + + + + + type=skewY + + + + + + + + + + + + + + + + + + + + + + + type=scale + (sx and sy) + + + + + + + + + + + + + + + + + + + + + + + + + + + type=rotate + (with cx/cy) + + + + + + + + + + + + + + + + + + + + + + + + + + + type=translate + (tx only) + + + + + + + + + + + + + + + + + + + + + + + + + + + type=translate + (tx and ty) + + + + + + + + + + + + + + + + + + + + + + + type=scale + (sx only) + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-81-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-81-t-isvalid.html new file mode 100644 index 00000000000000..0198df2524b058 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-81-t-isvalid.html @@ -0,0 +1,107 @@ + + + + animate-elem-81-t-manual.svg + + + +

    Source SVG: animate-elem-81-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-81-t.svg,v $ + + + + + + + + + <animateTransform> + + + + + + + + + + + + + + + additive=replace + + + + + + + + + additive=sum + + + + + + + + accumulate=none + additive=replace + + + + + + + + accumulate=sum + additive=replace + + + + + + + + accumulate=none + additive=sum + + + + + + + + accumulate=sum + additive=sum + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-82-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-82-t-isvalid.html new file mode 100644 index 00000000000000..bdbff9d35e68dc --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-82-t-isvalid.html @@ -0,0 +1,213 @@ + + + + animate-elem-82-t-manual.svg + + + +

    Source SVG: animate-elem-82-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-82-t.svg,v $ + + + + + + + + + <animateTransform> + + + + + + + + + + + + + + + + + + + + + + + + + + same rotation + center + + + + + + + + + + + + + + + + + + + different rotation + centers + + + + + + + + + + + + + + + + + + + paced translation + + + + + + + + + + + + + + + + + + + linear translation + + + + + + + + + + + + + + + + + + + + + paced scale + + + + + + + + + + + + + + + + + + + + linear scale + + + + + + + + + + + + + + + + + + + paced rotation + + + + + + + + + + + + + + + + + + + linear rotation + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-83-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-83-t-isvalid.html new file mode 100644 index 00000000000000..ed0bf103cafee2 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-83-t-isvalid.html @@ -0,0 +1,161 @@ + + + + animate-elem-83-t-manual.svg + + + +

    Source SVG: animate-elem-83-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-83-t.svg,v $ + + + + + + + + + <animate> on <path>'s d attribute + + + + + + + + + + + + + + + + + + + + + + + + #1: from-to animation + + + + + + + + + + + + + + + + #2: to animation + + + + + + + + + + + + + + + + + + + + #3: values animation + + + + + + + + + + + + + + + + #4: from-to animation + compatible H/h, V/v, + L/l segments + + + + + + + + + + + + + + + + #5: from-to animation + compatible C/c + s/S segments + + + + + + + + + + + + + + + + #6: from-to animation + compatible Q/q, T/t + segments + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-84-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-84-t-isvalid.html new file mode 100644 index 00000000000000..f451aa14fb7656 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-84-t-isvalid.html @@ -0,0 +1,70 @@ + + + + animate-elem-84-t-manual.svg + + + +

    Source SVG: animate-elem-84-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-84-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + currentColor + green + inherit + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-85-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-85-t-isvalid.html new file mode 100644 index 00000000000000..ccb5a36088d6ca --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-85-t-isvalid.html @@ -0,0 +1,83 @@ + + + + animate-elem-85-t-manual.svg + + + +

    Source SVG: animate-elem-85-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-85-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.8 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/animate-elem-86-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-86-t-isvalid.html new file mode 100644 index 00000000000000..605adfd8900d04 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-86-t-isvalid.html @@ -0,0 +1,71 @@ + + + + animate-elem-86-t-manual.svg + + + +

    Source SVG: animate-elem-86-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-86-t.svg,v $ + + + + + + + + + fill="freeze" with discrete calcMode + + + + discrete + + + + > 2s + 0s-2s + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/animate-elem-87-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-87-t-isvalid.html new file mode 100644 index 00000000000000..6be01ce816c3de --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-87-t-isvalid.html @@ -0,0 +1,63 @@ + + + + animate-elem-87-t-manual.svg + + + +

    Source SVG: animate-elem-87-t-manual.svg

    + + + + + + + + + + $RCSfile: animate-elem-87-t.svg,v $ + + + + + + + + + + Test zero value of a scale transform animation + + + + + + + Reference + + + + + + + <animateTransform type='scale' by='1'/> + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/animate-elem-88-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-88-t-isvalid.html new file mode 100644 index 00000000000000..83965435e79bed --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-88-t-isvalid.html @@ -0,0 +1,52 @@ + + + + animate-elem-88-t-manual.svg + + + +

    Source SVG: animate-elem-88-t-manual.svg

    + + + + + + + + + + $RCSfile: animate-elem-88-t.svg,v $ + + + + + + + + + + Test values attribute list syntax + + + + + + + + $Revision: 1.6 $ + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-89-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-89-t-isvalid.html new file mode 100644 index 00000000000000..07885c3a8c81d3 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-89-t-isvalid.html @@ -0,0 +1,94 @@ + + + + animate-elem-89-t-manual.svg + + + +

    Source SVG: animate-elem-89-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-89-t.svg,v $ + + + + + + + + + + + + + 0 sec. + 3 sec. + 6 sec. + 9+ sec. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-90-b-isvalid.html b/conformance-checkers/html-svg/animate-elem-90-b-isvalid.html new file mode 100644 index 00000000000000..6141e62c9caf46 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-90-b-isvalid.html @@ -0,0 +1,71 @@ + + + + animate-elem-90-b-manual.svg + + + +

    Source SVG: animate-elem-90-b-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-90-b.svg,v $ + + + + + + + + + + + + Color at start + + + Color at 3s + + + Color at 5s + + + + + + + + + + + + CSS not supported + + + $Revision: 1.3 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-elem-91-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-91-t-isvalid.html new file mode 100644 index 00000000000000..fe95c822e0a681 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-91-t-isvalid.html @@ -0,0 +1,186 @@ + + + + animate-elem-91-t-manual.svg + + + +

    Source SVG: animate-elem-91-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-91-t.svg,v $ + + + + + + + + + + Testing <animate to=""> with non-interpolable attributes + + + + 0s-2s + > 2s + + + + (reference) + + + + + + + + + + + + class + + + + + + + + + + + clipPathUnits + + + + + + + + + + + + + in + + + + + + + + + + + + + + + + + + + + + + + preserveAspectRatio + + + + + + + + + + + + + + + + + + + spreadMethod + + + + + + + + + + + + + + + + + + + + + + + xlink:href + + + + + + + + + + + + + + + display + + + + + + + + + + + + + + + $Revision: 1.1 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/animate-elem-92-t-isvalid.html b/conformance-checkers/html-svg/animate-elem-92-t-isvalid.html new file mode 100644 index 00000000000000..c785fccd8e4957 --- /dev/null +++ b/conformance-checkers/html-svg/animate-elem-92-t-isvalid.html @@ -0,0 +1,103 @@ + + + + animate-elem-92-t-manual.svg + + + +

    Source SVG: animate-elem-92-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-elem-92-t.svg,v $ + + + + + + + + + discrete to-animation + + + without freezing + with freezing + with keyTimes + + + + 0s-2s + > 4s + 2s-4s + + + 0s-2s + > 2s + + + + 0s-2s + > 2s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-interact-events-01-t-isvalid.html b/conformance-checkers/html-svg/animate-interact-events-01-t-isvalid.html new file mode 100644 index 00000000000000..879aa5221364fa --- /dev/null +++ b/conformance-checkers/html-svg/animate-interact-events-01-t-isvalid.html @@ -0,0 +1,94 @@ + + + + animate-interact-events-01-t-manual.svg + + + +

    Source SVG: animate-interact-events-01-t-manual.svg

    + + + + + + + + + + $RCSfile: animate-interact-events-01-t.svg,v $ + + + + + + + + + + + + + + + + + Shadow tree event listener chain + + + + Case 1: on mouseover all squares must turn blue + + + + + + + + + Case 2: on mouseover all squares must turn blue + and a black stroke must appear on reference square + + + + + + + + + + + + Case 3: on mouseover all squares must turn blue + and a black stroke must appear on reference square + + + + + + + + + + Case 4: on mouseover all squares must turn blue + and on mousedown a black stroke must appear on reference square + + + + + $Revision: 1.2 $ + + + + + + diff --git a/conformance-checkers/html-svg/animate-interact-pevents-01-t-isvalid.html b/conformance-checkers/html-svg/animate-interact-pevents-01-t-isvalid.html new file mode 100644 index 00000000000000..0bcb3122237a0c --- /dev/null +++ b/conformance-checkers/html-svg/animate-interact-pevents-01-t-isvalid.html @@ -0,0 +1,265 @@ + + + + animate-interact-pevents-01-t-manual.svg + + + +

    Source SVG: animate-interact-pevents-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-interact-pevents-01-t.svg,v $ + + + + + + + + + + Test pointer-events on text + + + + O + + + + O + + + + O + + + + O + + + + O + + + + O + + + + O + + + + O + + + + O + + + + O + + + + + + + + + + + + + O + + + + O + + + + O + + + + O + + + + O + + + + O + + + + O + + + + O + + + + O + + + + O + + + + + + + + + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + + + + + + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-interact-pevents-02-t-isvalid.html b/conformance-checkers/html-svg/animate-interact-pevents-02-t-isvalid.html new file mode 100644 index 00000000000000..d0790a299a1f60 --- /dev/null +++ b/conformance-checkers/html-svg/animate-interact-pevents-02-t-isvalid.html @@ -0,0 +1,109 @@ + + + + animate-interact-pevents-02-t-manual.svg + + + +

    Source SVG: animate-interact-pevents-02-t-manual.svg

    + + + + + + + + + + $RCSfile: animate-interact-pevents-02-t.svg,v $ + + + + + + + + + + + + Testing pointer-events and rendering order + Rectangles should turn RED on mouseover + Ovals should turn RED if Pointer-Events are set to "ALL" + + + + Change "Pointer-Events" of + ovals from "ALL" to "NONE" + + + + + Purple ovals have "Pointer-Events" set to "ALL". + Purple ovals have Pointer-Events set to "NONE". + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/animate-interact-pevents-03-t-isvalid.html b/conformance-checkers/html-svg/animate-interact-pevents-03-t-isvalid.html new file mode 100644 index 00000000000000..2ed0f2e7b218fe --- /dev/null +++ b/conformance-checkers/html-svg/animate-interact-pevents-03-t-isvalid.html @@ -0,0 +1,189 @@ + + + + animate-interact-pevents-03-t-manual.svg + + + +

    Source SVG: animate-interact-pevents-03-t-manual.svg

    + + + + + + + + + + $RCSfile: animate-interact-pevents-03-t.svg,v $ + + + + + + + + + + + Testing pointer-events - pale RED rect should appear on mouseover. + + + 2nd and 3rd columns represent respectively rects with no fill/stroke and transparent fill/stroke + + + + + + + + + + + + + + + + + + + + + + + + + default : + fill and stroke of rects 1 and 3 must trigger + + + + + + + + + + + + + + + + + + + + + + + + visiblePainted : + fill and stroke of rects 1 and 3 must trigger + + + + + + + + + + + + + + + + + + + + + + + + + + + visibleFill : + only fill of rects 1, 2 and 3 must trigger + + + + + + + + + + + + + + + + + + + + + + + + + + + visibleStroke : + only stroke of rects 1, 2 and 3 must trigger + + + + + + + + + + + + + + + + + + + + + + + + + + + visible : + fill and stroke of rects 1, 2 and 3 must trigger + + + + + + $Revision: 1.2 $ + + + + + + diff --git a/conformance-checkers/html-svg/animate-interact-pevents-04-t-isvalid.html b/conformance-checkers/html-svg/animate-interact-pevents-04-t-isvalid.html new file mode 100644 index 00000000000000..64f956ea2e0b3e --- /dev/null +++ b/conformance-checkers/html-svg/animate-interact-pevents-04-t-isvalid.html @@ -0,0 +1,180 @@ + + + + animate-interact-pevents-04-t-manual.svg + + + +

    Source SVG: animate-interact-pevents-04-t-manual.svg

    + + + + + + + + + + $RCSfile: animate-interact-pevents-04-t.svg,v $ + + + + + + + + + + + Testing pointer-events - pale RED rect should appear on mouseover. + + + 2nd and 3rd columns represent respectively rects with no fill/stroke and transparent fill/stroke + + + + + + + + + + + + + + + + + + + + + + + + + painted : + fill and stroke of rects 1, 3 and 4 must trigger + + + + + + + + + + + + + + + + + + + + + + + + fill : + fill of rects 1 to 4 must trigger + + + + + + + + + + + + + + + + + + + + + + + + stroke : + stroke of rects 1 to 4 must trigger + + + + + + + + + + + + + + + + + + + + + + + + all : + stroke and fill of rects 1 to 4 must trigger + + + + + + + + + + + + + + + + + + + + + + + + none : + nothing is to trigger + + + + + + $Revision: 1.2 $ + + + + + + diff --git a/conformance-checkers/html-svg/animate-pservers-grad-01-b-novalid.html b/conformance-checkers/html-svg/animate-pservers-grad-01-b-novalid.html new file mode 100644 index 00000000000000..acdb407362d144 --- /dev/null +++ b/conformance-checkers/html-svg/animate-pservers-grad-01-b-novalid.html @@ -0,0 +1,88 @@ + + + + animate-pservers-grad-01-b-manual.svg + + + +

    Source SVG: animate-pservers-grad-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: animate-pservers-grad-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + + diff --git a/conformance-checkers/html-svg/animate-script-elem-01-b-novalid.html b/conformance-checkers/html-svg/animate-script-elem-01-b-novalid.html new file mode 100644 index 00000000000000..b01dd54759496e --- /dev/null +++ b/conformance-checkers/html-svg/animate-script-elem-01-b-novalid.html @@ -0,0 +1,70 @@ + + + + animate-script-elem-01-b-manual.svg + + + +

    Source SVG: animate-script-elem-01-b-manual.svg

    + + + + + + + + + + $RCSfile: animate-script-elem-01-b.svg,v $ + + + + + + + + + + Test that <script xlink:href=""> is not animatable + + + + + + Test script.href.animVal does not change + Test animating xlink:href="" does not load a script + + + + + + + + + + + $Revision: 1.1 $ + + + + + + diff --git a/conformance-checkers/html-svg/animate-struct-dom-01-b-novalid.html b/conformance-checkers/html-svg/animate-struct-dom-01-b-novalid.html new file mode 100644 index 00000000000000..3ca95a754dfc9b --- /dev/null +++ b/conformance-checkers/html-svg/animate-struct-dom-01-b-novalid.html @@ -0,0 +1,74 @@ + + + + animate-struct-dom-01-b-manual.svg + + + +

    Source SVG: animate-struct-dom-01-b-manual.svg

    + + + + + + + + + + $RCSfile: animate-struct-dom-01-b.svg,v $ + + + + + + + + + + Test getCurrentTime() and setCurrentTime() before timeline begin + + + + + + + + getCurrentTime + setCurrentTime + + + + + + $Revision: 1.2 $ + + + + + + + diff --git a/conformance-checkers/html-svg/color-prof-01-f-isvalid.html b/conformance-checkers/html-svg/color-prof-01-f-isvalid.html new file mode 100644 index 00000000000000..9fbae2730183c8 --- /dev/null +++ b/conformance-checkers/html-svg/color-prof-01-f-isvalid.html @@ -0,0 +1,56 @@ + + + + color-prof-01-f-manual.svg + + + +

    Source SVG: color-prof-01-f-manual.svg

    + + + + + + + + + + + + $RCSfile: color-prof-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + Basic test of ICC profile with an image. + + + + $Revision: 1.9 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/color-prop-01-b-isvalid.html b/conformance-checkers/html-svg/color-prop-01-b-isvalid.html new file mode 100644 index 00000000000000..a9c4accc828a45 --- /dev/null +++ b/conformance-checkers/html-svg/color-prop-01-b-isvalid.html @@ -0,0 +1,69 @@ + + + + color-prop-01-b-manual.svg + + + +

    Source SVG: color-prop-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: color-prop-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + fill + stroke + stop-color + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/color-prop-02-f-isvalid.html b/conformance-checkers/html-svg/color-prop-02-f-isvalid.html new file mode 100644 index 00000000000000..42754474770b9a --- /dev/null +++ b/conformance-checkers/html-svg/color-prop-02-f-isvalid.html @@ -0,0 +1,99 @@ + + + + color-prop-02-f-manual.svg + + + +

    Source SVG: color-prop-02-f-manual.svg

    + + + + + + + + + + + + $RCSfile: color-prop-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/color-prop-03-t-isvalid.html b/conformance-checkers/html-svg/color-prop-03-t-isvalid.html new file mode 100644 index 00000000000000..84c7b282957a16 --- /dev/null +++ b/conformance-checkers/html-svg/color-prop-03-t-isvalid.html @@ -0,0 +1,88 @@ + + + + color-prop-03-t-manual.svg + + + +

    Source SVG: color-prop-03-t-manual.svg

    + + + + + + + + + + + + $RCSfile: color-prop-03-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/color-prop-04-t-isvalid.html b/conformance-checkers/html-svg/color-prop-04-t-isvalid.html new file mode 100644 index 00000000000000..68e9644de014ba --- /dev/null +++ b/conformance-checkers/html-svg/color-prop-04-t-isvalid.html @@ -0,0 +1,84 @@ + + + + color-prop-04-t-manual.svg + + + +

    Source SVG: color-prop-04-t-manual.svg

    + + + + + + + + + + + + $RCSfile: color-prop-04-t.svg,v $ + + + + + + + + + + + + + + + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + Vestibulum pulvinar. Duis laoreet, nunc vitae facilisis + tristique, pede sem iaculis mi, non consectetuer lorem + libero et est. Donec imperdiet purus sed odio. Duis + venenatis tortor eu lectus. Suspendisse sed metus at + metus viverra ultricies. Mauris porttitor, justo a vulputate + + + + + Load + + Save + + + + + + + + File + Edit + + + + Lorem + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/color-prop-05-t-isvalid.html b/conformance-checkers/html-svg/color-prop-05-t-isvalid.html new file mode 100644 index 00000000000000..ce0752f553ee46 --- /dev/null +++ b/conformance-checkers/html-svg/color-prop-05-t-isvalid.html @@ -0,0 +1,47 @@ + + + + color-prop-05-t-manual.svg + + + +

    Source SVG: color-prop-05-t-manual.svg

    + + + + + + + + + + + + $RCSfile: color-prop-05-t.svg,v $ + + + + + + + + + + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/conform-viewers-02-f-novalid.html b/conformance-checkers/html-svg/conform-viewers-02-f-novalid.html new file mode 100644 index 00000000000000..ebde81958d4975 --- /dev/null +++ b/conformance-checkers/html-svg/conform-viewers-02-f-novalid.html @@ -0,0 +1,64 @@ + + + + conform-viewers-02-f-manual.svg + + + +

    Source SVG: conform-viewers-02-f-manual.svg

    + + + + + + + + + + $RCSfile: conform-viewers-02-f.svg,v $ + + + + + + + + + Test data uri with svgz content + + FAILED + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/conform-viewers-03-f-novalid.html b/conformance-checkers/html-svg/conform-viewers-03-f-novalid.html new file mode 100644 index 00000000000000..0e7115ff9d39f2 --- /dev/null +++ b/conformance-checkers/html-svg/conform-viewers-03-f-novalid.html @@ -0,0 +1,102 @@ + + + + conform-viewers-03-f-manual.svg + + + +

    Source SVG: conform-viewers-03-f-manual.svg

    + + + + + + + + + + $RCSfile: conform-viewers-03-f.svg,v $ + + + + + + + + + + + + + Generated prefix 1: ... + + + Status: No exceptions. + + + + + + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/coords-coord-01-t-isvalid.html b/conformance-checkers/html-svg/coords-coord-01-t-isvalid.html new file mode 100644 index 00000000000000..806bfe74182a23 --- /dev/null +++ b/conformance-checkers/html-svg/coords-coord-01-t-isvalid.html @@ -0,0 +1,69 @@ + + + + coords-coord-01-t-manual.svg + + + +

    Source SVG: coords-coord-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: coords-coord-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/coords-coord-02-t-isvalid.html b/conformance-checkers/html-svg/coords-coord-02-t-isvalid.html new file mode 100644 index 00000000000000..68562378907334 --- /dev/null +++ b/conformance-checkers/html-svg/coords-coord-02-t-isvalid.html @@ -0,0 +1,69 @@ + + + + coords-coord-02-t-manual.svg + + + +

    Source SVG: coords-coord-02-t-manual.svg

    + + + + + + + + + + + + $RCSfile: coords-coord-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/coords-dom-01-f-novalid.html b/conformance-checkers/html-svg/coords-dom-01-f-novalid.html new file mode 100644 index 00000000000000..d00af6e2fec2e3 --- /dev/null +++ b/conformance-checkers/html-svg/coords-dom-01-f-novalid.html @@ -0,0 +1,103 @@ + + + + coords-dom-01-f-manual.svg + + + +

    Source SVG: coords-dom-01-f-manual.svg

    + + + + + + + + + + $RCSfile: coords-dom-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.8 $ + + + + + + diff --git a/conformance-checkers/html-svg/coords-dom-02-f-novalid.html b/conformance-checkers/html-svg/coords-dom-02-f-novalid.html new file mode 100644 index 00000000000000..af8616b368e23e --- /dev/null +++ b/conformance-checkers/html-svg/coords-dom-02-f-novalid.html @@ -0,0 +1,84 @@ + + + + coords-dom-02-f-manual.svg + + + +

    Source SVG: coords-dom-02-f-manual.svg

    + + + + + + + + + + $RCSfile: coords-dom-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.9 $ + + + + + + diff --git a/conformance-checkers/html-svg/coords-dom-03-f-novalid.html b/conformance-checkers/html-svg/coords-dom-03-f-novalid.html new file mode 100644 index 00000000000000..15d373e1e5a901 --- /dev/null +++ b/conformance-checkers/html-svg/coords-dom-03-f-novalid.html @@ -0,0 +1,99 @@ + + + + coords-dom-03-f-manual.svg + + + +

    Source SVG: coords-dom-03-f-manual.svg

    + + + + + + + + + + $RCSfile: coords-dom-03-f.svg,v $ + + + + + + + + + + Test that some methods taking an SVGMatrix take a copy of it + + + + + + SVGTransformList.createSVGTransformFromMatrix() + SVGSVGElement.createSVGTransformFromMatrix() + SVGTransform.setMatrix() + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/coords-dom-04-f-isvalid.html b/conformance-checkers/html-svg/coords-dom-04-f-isvalid.html new file mode 100644 index 00000000000000..4a722f8f84ddc1 --- /dev/null +++ b/conformance-checkers/html-svg/coords-dom-04-f-isvalid.html @@ -0,0 +1,155 @@ + + + + coords-dom-04-f-manual.svg + + + +

    Source SVG: coords-dom-04-f-manual.svg

    + + + + + + + + + + $RCSfile: coords-dom-04-f.svg,v $ + + + + + + + + + + + + + + + + + Scripting disabled + + + + + + + $Revision: 1.5 $ + + + + + + diff --git a/conformance-checkers/html-svg/coords-trans-01-b-isvalid.html b/conformance-checkers/html-svg/coords-trans-01-b-isvalid.html new file mode 100644 index 00000000000000..ca656c65d243b1 --- /dev/null +++ b/conformance-checkers/html-svg/coords-trans-01-b-isvalid.html @@ -0,0 +1,226 @@ + + + + coords-trans-01-b-manual.svg + + + +

    Source SVG: coords-trans-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: coords-trans-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + translate (50, 50) + + + + + rotate(-90) + + + + + skew x (45) + + + + + skew y (45) + + + + + scale (2) + + + + + + + + + + + + + + + + + + + + + + + + + + + scale(25, 95) and translate(2, 2) + + + + + scale(25, 95) then translate(2, 2) + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/coords-trans-02-t-isvalid.html b/conformance-checkers/html-svg/coords-trans-02-t-isvalid.html new file mode 100644 index 00000000000000..fd4bdad836d555 --- /dev/null +++ b/conformance-checkers/html-svg/coords-trans-02-t-isvalid.html @@ -0,0 +1,163 @@ + + + + coords-trans-02-t-manual.svg + + + +

    Source SVG: coords-trans-02-t-manual.svg

    + + + + + + + + + + + + $RCSfile: coords-trans-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + translate (50, 50) + + + + + rotate(-90) + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/coords-trans-03-t-isvalid.html b/conformance-checkers/html-svg/coords-trans-03-t-isvalid.html new file mode 100644 index 00000000000000..2d27a14c7f835d --- /dev/null +++ b/conformance-checkers/html-svg/coords-trans-03-t-isvalid.html @@ -0,0 +1,86 @@ + + + + coords-trans-03-t-manual.svg + + + +

    Source SVG: coords-trans-03-t-manual.svg

    + + + + + + + + + + + + $RCSfile: coords-trans-03-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + skew x (45) + + + + + skew y (45) + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/coords-trans-04-t-isvalid.html b/conformance-checkers/html-svg/coords-trans-04-t-isvalid.html new file mode 100644 index 00000000000000..e3ba8cdd745ebb --- /dev/null +++ b/conformance-checkers/html-svg/coords-trans-04-t-isvalid.html @@ -0,0 +1,75 @@ + + + + coords-trans-04-t-manual.svg + + + +

    Source SVG: coords-trans-04-t-manual.svg

    + + + + + + + + + + + + $RCSfile: coords-trans-04-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + scale (2) + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/coords-trans-05-t-isvalid.html b/conformance-checkers/html-svg/coords-trans-05-t-isvalid.html new file mode 100644 index 00000000000000..3404a4122211ba --- /dev/null +++ b/conformance-checkers/html-svg/coords-trans-05-t-isvalid.html @@ -0,0 +1,75 @@ + + + + coords-trans-05-t-manual.svg + + + +

    Source SVG: coords-trans-05-t-manual.svg

    + + + + + + + + + + + + $RCSfile: coords-trans-05-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + scale(25, 95) - translate(2, 2) + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/coords-trans-06-t-isvalid.html b/conformance-checkers/html-svg/coords-trans-06-t-isvalid.html new file mode 100644 index 00000000000000..5b784d7531c8f3 --- /dev/null +++ b/conformance-checkers/html-svg/coords-trans-06-t-isvalid.html @@ -0,0 +1,69 @@ + + + + coords-trans-06-t-manual.svg + + + +

    Source SVG: coords-trans-06-t-manual.svg

    + + + + + + + + + + + + $RCSfile: coords-trans-06-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + scale(25, 95) then translate(2, 2) + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/coords-trans-07-t-isvalid.html b/conformance-checkers/html-svg/coords-trans-07-t-isvalid.html new file mode 100644 index 00000000000000..183b8c7eb07d3f --- /dev/null +++ b/conformance-checkers/html-svg/coords-trans-07-t-isvalid.html @@ -0,0 +1,57 @@ + + + + coords-trans-07-t-manual.svg + + + +

    Source SVG: coords-trans-07-t-manual.svg

    + + + + + + + + + + + + $RCSfile: coords-trans-07-t.svg,v $ + + + + + + + + + + + + + + rotate+translate + + + + + + translate+rotate + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/coords-trans-08-t-isvalid.html b/conformance-checkers/html-svg/coords-trans-08-t-isvalid.html new file mode 100644 index 00000000000000..5cdbd2c2e721c1 --- /dev/null +++ b/conformance-checkers/html-svg/coords-trans-08-t-isvalid.html @@ -0,0 +1,63 @@ + + + + coords-trans-08-t-manual.svg + + + +

    Source SVG: coords-trans-08-t-manual.svg

    + + + + + + + + + + + + $RCSfile: coords-trans-08-t.svg,v $ + + + + + + + + + + + + + + + + + skewX(45)+skewY(45) + + + + + + + + + skewY(45)+skewX(45) + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/coords-trans-09-t-isvalid.html b/conformance-checkers/html-svg/coords-trans-09-t-isvalid.html new file mode 100644 index 00000000000000..8a38754d8ff52e --- /dev/null +++ b/conformance-checkers/html-svg/coords-trans-09-t-isvalid.html @@ -0,0 +1,89 @@ + + + + coords-trans-09-t-manual.svg + + + +

    Source SVG: coords-trans-09-t-manual.svg

    + + + + + + + + + + + + $RCSfile: coords-trans-09-t.svg,v $ + + + + + + + + + + + + + + + matrix(0 0 0 0 0 0) + + + + + + matrix(1 0 0 1 100 100) + + + + + + matrix(1.5 0 0 1.5 70 60) + + + + + + matrix(1 0 0.5 1 30 170) + + + + + + matrix(1 0.5 0 1 100 200) + + + + + + matrix(0 1 -1 0 450 0) + + + + + + matrix(1 0.8 0.8 1 300 220) + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/coords-trans-10-f-isvalid.html b/conformance-checkers/html-svg/coords-trans-10-f-isvalid.html new file mode 100644 index 00000000000000..1762d21fd10aa3 --- /dev/null +++ b/conformance-checkers/html-svg/coords-trans-10-f-isvalid.html @@ -0,0 +1,77 @@ + + + + coords-trans-10-f-manual.svg + + + +

    Source SVG: coords-trans-10-f-manual.svg

    + + + + + + + + + + $RCSfile: coords-trans-10-f.svg,v $ + + + + + + + + + + + + + Filler Text + + + + + + + Filler Text + + + + + + + + Filler Text + + + + + + + Filler Text + + + + + + + + $Revision: 1.9 $ + + + + + + diff --git a/conformance-checkers/html-svg/coords-trans-11-f-isvalid.html b/conformance-checkers/html-svg/coords-trans-11-f-isvalid.html new file mode 100644 index 00000000000000..6b95f8b9698695 --- /dev/null +++ b/conformance-checkers/html-svg/coords-trans-11-f-isvalid.html @@ -0,0 +1,77 @@ + + + + coords-trans-11-f-manual.svg + + + +

    Source SVG: coords-trans-11-f-manual.svg

    + + + + + + + + + + $RCSfile: coords-trans-11-f.svg,v $ + + + + + + + + + + + + + Filler Text + + + + + + + Filler Text + + + + + + + + Filler Text + + + + + + + Filler Text + + + + + + + + $Revision: 1.8 $ + + + + + + diff --git a/conformance-checkers/html-svg/coords-trans-12-f-isvalid.html b/conformance-checkers/html-svg/coords-trans-12-f-isvalid.html new file mode 100644 index 00000000000000..ce8f5e4474b709 --- /dev/null +++ b/conformance-checkers/html-svg/coords-trans-12-f-isvalid.html @@ -0,0 +1,79 @@ + + + + coords-trans-12-f-manual.svg + + + +

    Source SVG: coords-trans-12-f-manual.svg

    + + + + + + + + + + $RCSfile: coords-trans-12-f.svg,v $ + + + + + + + + + + + + + + Filler Text + + + + + + + Filler Text + + + + + + + + + Filler Text + + + + + + + Filler Text + + + + + + + + $Revision: 1.6 $ + + + + + + diff --git a/conformance-checkers/html-svg/coords-trans-13-f-isvalid.html b/conformance-checkers/html-svg/coords-trans-13-f-isvalid.html new file mode 100644 index 00000000000000..25b9a0fdf154f9 --- /dev/null +++ b/conformance-checkers/html-svg/coords-trans-13-f-isvalid.html @@ -0,0 +1,77 @@ + + + + coords-trans-13-f-manual.svg + + + +

    Source SVG: coords-trans-13-f-manual.svg

    + + + + + + + + + + $RCSfile: coords-trans-13-f.svg,v $ + + + + + + + + + + + + + Filler Text + + + + + + + Filler Text + + + + + + + + Filler Text + + + + + + + Filler Text + + + + + + + + $Revision: 1.6 $ + + + + + + diff --git a/conformance-checkers/html-svg/coords-trans-14-f-isvalid.html b/conformance-checkers/html-svg/coords-trans-14-f-isvalid.html new file mode 100644 index 00000000000000..9b663d023709c8 --- /dev/null +++ b/conformance-checkers/html-svg/coords-trans-14-f-isvalid.html @@ -0,0 +1,79 @@ + + + + coords-trans-14-f-manual.svg + + + +

    Source SVG: coords-trans-14-f-manual.svg

    + + + + + + + + + + $RCSfile: coords-trans-14-f.svg,v $ + + + + + + + + + + + + + + Filler Text + + + + + + + Filler Text + + + + + + + + Filler Text + + + + + + + Filler Text + + + + + + + + + $Revision: 1.6 $ + + + + + + diff --git a/conformance-checkers/html-svg/coords-transformattr-01-f-novalid.html b/conformance-checkers/html-svg/coords-transformattr-01-f-novalid.html new file mode 100644 index 00000000000000..aabfb9961914c4 --- /dev/null +++ b/conformance-checkers/html-svg/coords-transformattr-01-f-novalid.html @@ -0,0 +1,83 @@ + + + + coords-transformattr-01-f-manual.svg + + + +

    Source SVG: coords-transformattr-01-f-manual.svg

    + + + + + + + + + + $RCSfile: coords-transformattr-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + diff --git a/conformance-checkers/html-svg/coords-transformattr-02-f-isvalid.html b/conformance-checkers/html-svg/coords-transformattr-02-f-isvalid.html new file mode 100644 index 00000000000000..1c2c8f10d3d2bb --- /dev/null +++ b/conformance-checkers/html-svg/coords-transformattr-02-f-isvalid.html @@ -0,0 +1,83 @@ + + + + coords-transformattr-02-f-manual.svg + + + +

    Source SVG: coords-transformattr-02-f-manual.svg

    + + + + + + + + + + $RCSfile: coords-transformattr-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + diff --git a/conformance-checkers/html-svg/coords-transformattr-03-f-isvalid.html b/conformance-checkers/html-svg/coords-transformattr-03-f-isvalid.html new file mode 100644 index 00000000000000..7e41124a62369f --- /dev/null +++ b/conformance-checkers/html-svg/coords-transformattr-03-f-isvalid.html @@ -0,0 +1,52 @@ + + + + coords-transformattr-03-f-manual.svg + + + +

    Source SVG: coords-transformattr-03-f-manual.svg

    + + + + + + + + + + + + $RCSfile: coords-transformattr-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + diff --git a/conformance-checkers/html-svg/coords-transformattr-04-f-isvalid.html b/conformance-checkers/html-svg/coords-transformattr-04-f-isvalid.html new file mode 100644 index 00000000000000..70f5e399509f53 --- /dev/null +++ b/conformance-checkers/html-svg/coords-transformattr-04-f-isvalid.html @@ -0,0 +1,50 @@ + + + + coords-transformattr-04-f-manual.svg + + + +

    Source SVG: coords-transformattr-04-f-manual.svg

    + + + + + + + + + + $RCSfile: coords-transformattr-04-f.svg,v $ + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + diff --git a/conformance-checkers/html-svg/coords-transformattr-05-f-isvalid.html b/conformance-checkers/html-svg/coords-transformattr-05-f-isvalid.html new file mode 100644 index 00000000000000..8f41cb385e75a4 --- /dev/null +++ b/conformance-checkers/html-svg/coords-transformattr-05-f-isvalid.html @@ -0,0 +1,60 @@ + + + + coords-transformattr-05-f-manual.svg + + + +

    Source SVG: coords-transformattr-05-f-manual.svg

    + + + + + + + + + + + + $RCSfile: coords-transformattr-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + diff --git a/conformance-checkers/html-svg/coords-units-01-b-isvalid.html b/conformance-checkers/html-svg/coords-units-01-b-isvalid.html new file mode 100644 index 00000000000000..f8a492610b4b45 --- /dev/null +++ b/conformance-checkers/html-svg/coords-units-01-b-isvalid.html @@ -0,0 +1,150 @@ + + + + coords-units-01-b-manual.svg + + + +

    Source SVG: coords-units-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: coords-units-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Bounding box relative coordinates (percentage and fraction) + + + + + + + Percentage + Fraction + User Space + + + + + + + + + + + + + + + + + + + + + + + + + + Bounding box relative length (percentage and fraction) + + + + + Percent. + Fraction + User Space + + + + + + + + + + + + + + + + + + + + + + + + + + Bounding box relative width/height (percentage and fraction) + + + + + Percentage + Fraction + User Space + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/coords-units-02-b-isvalid.html b/conformance-checkers/html-svg/coords-units-02-b-isvalid.html new file mode 100644 index 00000000000000..7981e2cd043283 --- /dev/null +++ b/conformance-checkers/html-svg/coords-units-02-b-isvalid.html @@ -0,0 +1,115 @@ + + + + coords-units-02-b-manual.svg + + + +

    Source SVG: coords-units-02-b-manual.svg

    + + + + + + + + + + + + $RCSfile: coords-units-02-b.svg,v $ + + + + + + + + + + + + + + + + CSS pixel coordinate to user space conversion + + + + + + + + + + + Percentage coordinates to user space conversion + + + + + + + + + + + + + + CSS width/height to user space conversion + + + + + + + + + + + Percentage width/height to user space conversion + + + + + + + + + + + + + + CSS and percentage length conversion + + + + + + + + + + + + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/coords-units-03-b-isvalid.html b/conformance-checkers/html-svg/coords-units-03-b-isvalid.html new file mode 100644 index 00000000000000..4a855b4fff4b7b --- /dev/null +++ b/conformance-checkers/html-svg/coords-units-03-b-isvalid.html @@ -0,0 +1,125 @@ + + + + coords-units-03-b-manual.svg + + + +

    Source SVG: coords-units-03-b-manual.svg

    + + + + + + + + + + + + $RCSfile: coords-units-03-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + Initial viewport and CSS units test + + + + + + 200 + User space units (no specifier) + + + + + + + + 200 px + Pixels (px) + + + + 20 em = 200 px (font-size=10px) + Relative to font size (em) + + + + + + 40 ex + Relative to font x-height (ex) + + + + + + + + 41.67% = 200 px + Percentage (%) + + + + + + 1 in + Inches (in) + + + + 2.54 cm = 1 in + Centimeters (cm) + + + + 25.4 mm = 1 in + Millimeters (mm) + + + + 72pt = 1 in + Points (pt) + + + + 6pc = 1 in + Picas (pc) + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/coords-viewattr-03-b-isvalid.html b/conformance-checkers/html-svg/coords-viewattr-03-b-isvalid.html new file mode 100644 index 00000000000000..84555cacb61aba --- /dev/null +++ b/conformance-checkers/html-svg/coords-viewattr-03-b-isvalid.html @@ -0,0 +1,85 @@ + + + + coords-viewattr-03-b-manual.svg + + + +

    Source SVG: coords-viewattr-03-b-manual.svg

    + + + + + + + + + + + + $RCSfile: coords-viewattr-03-b.svg,v $ + + + + + + + + + <svg> 'viewBox' attribute + + + + + + + viewBox="0 0 200 200" + overflow="visible" + + + + + viewBox="0 0 200 200" + overflow="hidden" + + + + + viewBox="0,0,200,200" + overflow="visible" + + + + + viewBox="0,0,200,200" + overflow="hidden" + + + + + viewBox="0,0, 200, 200" + overflow="visible" + + + + + viewBox="0,0, 200, 200" + overflow="hidden" + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/extend-namespace-01-f-novalid.html b/conformance-checkers/html-svg/extend-namespace-01-f-novalid.html new file mode 100644 index 00000000000000..3f879566e6deac --- /dev/null +++ b/conformance-checkers/html-svg/extend-namespace-01-f-novalid.html @@ -0,0 +1,162 @@ + + + + extend-namespace-01-f-manual.svg + + + +

    Source SVG: extend-namespace-01-f-manual.svg

    + + + + + + + + + + + + $RCSfile: extend-namespace-01-f.svg,v $ + + + + + + + + + + + + + + + East + 3 + + + North + 4 + + + West + 5 + + + Central + 3.2 + + + South + 6 + + + + Pie chart built from data in a different namespace. + + + + Pie chart is built within this 'g' element + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-background-01-f-isvalid.html b/conformance-checkers/html-svg/filters-background-01-f-isvalid.html new file mode 100644 index 00000000000000..09a735da49d8da --- /dev/null +++ b/conformance-checkers/html-svg/filters-background-01-f-isvalid.html @@ -0,0 +1,114 @@ + + + + filters-background-01-f-manual.svg + + + +

    Source SVG: filters-background-01-f-manual.svg

    + + + + + + + + + + $RCSfile: filters-background-01-f.svg,v $ + + + + + + + + + + + + This filter discards the SourceGraphic, if any, and just produces + a result consisting of the BackgroundImage shifted down 125 units + and then blurred. + + + + + + + This filter takes the BackgroundImage, shifts it down 125 units, blurs it, + and then renders the SourceGraphic on top of the shifted/blurred background. + + + + + + + + + + + + + The second adds an empty 'g' element which invokes ShiftBGAndBlur. + + + + + + + + + + + The third invokes ShiftBGAndBlur on the inner group. + + + + + + + + + + The fourth invokes ShiftBGAndBlur on the triangle. + + + + + + + + + + The fifth invokes ShiftBGAndBlur_WithSourceGraphic on the triangle. + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/filters-blend-01-b-isvalid.html b/conformance-checkers/html-svg/filters-blend-01-b-isvalid.html new file mode 100644 index 00000000000000..3ed26e28583aa2 --- /dev/null +++ b/conformance-checkers/html-svg/filters-blend-01-b-isvalid.html @@ -0,0 +1,88 @@ + + + + filters-blend-01-b-manual.svg + + + +

    Source SVG: filters-blend-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-blend-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Normal + Multiply + Multiply + Multiply + Screen + Darken + Lighten + + + + + $Revision: 1.9 $ + + + + + + diff --git a/conformance-checkers/html-svg/filters-color-01-b-isvalid.html b/conformance-checkers/html-svg/filters-color-01-b-isvalid.html new file mode 100644 index 00000000000000..47c5fcc1580f4b --- /dev/null +++ b/conformance-checkers/html-svg/filters-color-01-b-isvalid.html @@ -0,0 +1,82 @@ + + + + filters-color-01-b-manual.svg + + + +

    Source SVG: filters-color-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-color-01-b.svg,v $ + + + + + + + + + + Example feColorMatrix - Examples of feColorMatrix operations + Five rectangles filled with a gradient showing the effects of feColorMatrix: an unfiltered rectangle acting as a reference, use of the feColorMatrix matrix option to convert to grayscale, use of the feColorMatrix saturate option, use of the feColorMatrix hueRotate option, and use of the feColorMatrix luminanceToAlpha option. + + + + + + + + + + + + + + + + + + + + + + + + + Unfiltered + + type="matrix" (grayscale matrix) + + type="saturate" values=".4" + + type="hueRotate" values="90" + + type="luminanceToAlpha" + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-color-02-b-novalid.html b/conformance-checkers/html-svg/filters-color-02-b-novalid.html new file mode 100644 index 00000000000000..758ebd3615955f --- /dev/null +++ b/conformance-checkers/html-svg/filters-color-02-b-novalid.html @@ -0,0 +1,80 @@ + + + + filters-color-02-b-manual.svg + + + +

    Source SVG: filters-color-02-b-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-color-02-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Reference + Default + + + + $Revision: 1.7 $ + + + + + + diff --git a/conformance-checkers/html-svg/filters-composite-02-b-isvalid.html b/conformance-checkers/html-svg/filters-composite-02-b-isvalid.html new file mode 100644 index 00000000000000..4740a521da2962 --- /dev/null +++ b/conformance-checkers/html-svg/filters-composite-02-b-isvalid.html @@ -0,0 +1,181 @@ + + + + filters-composite-02-b-manual.svg + + + +

    Source SVG: filters-composite-02-b-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-composite-02-b.svg,v $ + + + + + + + + + + Example feComposite - Examples of feComposite operations + Six pairs of overlapping triangles depicting the six different feComposite operators. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + on first Row : opacity 1.0 + on second row opacity 0.5 + + + + over + + + + + + + + + in + + + + + + + + + out + + + + + + + + atop + + + + + + + + xor + + + + + + + arith- + metic + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-composite-03-f-isvalid.html b/conformance-checkers/html-svg/filters-composite-03-f-isvalid.html new file mode 100644 index 00000000000000..bdc45335c94de1 --- /dev/null +++ b/conformance-checkers/html-svg/filters-composite-03-f-isvalid.html @@ -0,0 +1,78 @@ + + + + filters-composite-03-f-manual.svg + + + +

    Source SVG: filters-composite-03-f-manual.svg

    + + + + + + + + + + $RCSfile: filters-composite-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-composite-04-f-isvalid.html b/conformance-checkers/html-svg/filters-composite-04-f-isvalid.html new file mode 100644 index 00000000000000..1309abdc1fc233 --- /dev/null +++ b/conformance-checkers/html-svg/filters-composite-04-f-isvalid.html @@ -0,0 +1,68 @@ + + + + filters-composite-04-f-manual.svg + + + +

    Source SVG: filters-composite-04-f-manual.svg

    + + + + + + + + + + $RCSfile: filters-composite-04-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.1 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/filters-composite-05-f-isvalid.html b/conformance-checkers/html-svg/filters-composite-05-f-isvalid.html new file mode 100644 index 00000000000000..14c9993f70bb3c --- /dev/null +++ b/conformance-checkers/html-svg/filters-composite-05-f-isvalid.html @@ -0,0 +1,56 @@ + + + + filters-composite-05-f-manual.svg + + + +

    Source SVG: filters-composite-05-f-manual.svg

    + + + + + + + + + + $RCSfile: filters-composite-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.1 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/filters-comptran-01-b-isvalid.html b/conformance-checkers/html-svg/filters-comptran-01-b-isvalid.html new file mode 100644 index 00000000000000..683bb6a8fc8d1a --- /dev/null +++ b/conformance-checkers/html-svg/filters-comptran-01-b-isvalid.html @@ -0,0 +1,97 @@ + + + + filters-comptran-01-b-manual.svg + + + +

    Source SVG: filters-comptran-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-comptran-01-b.svg,v $ + + + + + + + + + + Example feComponentTransfer - Examples of feComponentTransfer operations + Four rectangles filled with a gradient showing the effects of feComponentTransfer: an identity function acting as a reference, use of the feComponentTransfer table option, use of the feComponentTransfer linear option, and use of the feComponentTransfer gamma option. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + type: identity + + type: table + + type:linear slope:.5 intercepts:.25/0/.5 + + type: gamma ampl:2 exponents:5/3/1 + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-conv-01-f-isvalid.html b/conformance-checkers/html-svg/filters-conv-01-f-isvalid.html new file mode 100644 index 00000000000000..dc327abb143c5c --- /dev/null +++ b/conformance-checkers/html-svg/filters-conv-01-f-isvalid.html @@ -0,0 +1,93 @@ + + + + filters-conv-01-f-manual.svg + + + +

    Source SVG: filters-conv-01-f-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-conv-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Blur (3x3) + + + + Edge Detection (3x3) + + + + Sharpening (3x3) + + + + Embossing (3x3) + + + + Horizontal blur (3x1) + + + + Vertical blur (1x3) + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-conv-02-f-novalid.html b/conformance-checkers/html-svg/filters-conv-02-f-novalid.html new file mode 100644 index 00000000000000..1f3b835825ac9a --- /dev/null +++ b/conformance-checkers/html-svg/filters-conv-02-f-novalid.html @@ -0,0 +1,67 @@ + + + + filters-conv-02-f-manual.svg + + + +

    Source SVG: filters-conv-02-f-manual.svg

    + + + + + + + + + + $RCSfile: filters-conv-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + feConvolveMatrix 'order' attribute + + + without order + + + order="3" + + + order="3 3" + + + $Revision: 1.9 $ + + + + + + diff --git a/conformance-checkers/html-svg/filters-conv-03-f-isvalid.html b/conformance-checkers/html-svg/filters-conv-03-f-isvalid.html new file mode 100644 index 00000000000000..65dd9b4cd28559 --- /dev/null +++ b/conformance-checkers/html-svg/filters-conv-03-f-isvalid.html @@ -0,0 +1,84 @@ + + + + filters-conv-03-f-manual.svg + + + +

    Source SVG: filters-conv-03-f-manual.svg

    + + + + + + + + + + $RCSfile: filters-conv-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + PASS + + + + + feConvolveMatrix 'in1' DOM + + + + + + + Original image + Animated filter + Scripted filter + + + $Revision: 1.8 $ + + + + + + diff --git a/conformance-checkers/html-svg/filters-conv-04-f-novalid.html b/conformance-checkers/html-svg/filters-conv-04-f-novalid.html new file mode 100644 index 00000000000000..2998b7c5060f51 --- /dev/null +++ b/conformance-checkers/html-svg/filters-conv-04-f-novalid.html @@ -0,0 +1,85 @@ + + + + filters-conv-04-f-manual.svg + + + +

    Source SVG: filters-conv-04-f-manual.svg

    + + + + + + + + + + $RCSfile: filters-conv-04-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/filters-conv-05-f-novalid.html b/conformance-checkers/html-svg/filters-conv-05-f-novalid.html new file mode 100644 index 00000000000000..c4bf1c9505581a --- /dev/null +++ b/conformance-checkers/html-svg/filters-conv-05-f-novalid.html @@ -0,0 +1,74 @@ + + + + filters-conv-05-f-manual.svg + + + +

    Source SVG: filters-conv-05-f-manual.svg

    + + + + + + + + + + $RCSfile: filters-conv-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + feConvolveMatrix 'edgeMode' + + + none + + + wrap + + + duplicate + + + $Revision: 1.2 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/filters-diffuse-01-f-isvalid.html b/conformance-checkers/html-svg/filters-diffuse-01-f-isvalid.html new file mode 100644 index 00000000000000..40ca7c3089c171 --- /dev/null +++ b/conformance-checkers/html-svg/filters-diffuse-01-f-isvalid.html @@ -0,0 +1,134 @@ + + + + filters-diffuse-01-f-manual.svg + + + +

    Source SVG: filters-diffuse-01-f-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-diffuse-01-f.svg,v $ + + + + + + + + + + Filters: feDiffuseLighting + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Various values for surfaceScale: 1, 10 and -10 + + + + + + + Various values for diffuseConstants: 0, 1 and 2 + + + + + + + Various values for lighting color: red, yellow and blue + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-displace-01-f-isvalid.html b/conformance-checkers/html-svg/filters-displace-01-f-isvalid.html new file mode 100644 index 00000000000000..e7bbcbe61bc634 --- /dev/null +++ b/conformance-checkers/html-svg/filters-displace-01-f-isvalid.html @@ -0,0 +1,105 @@ + + + + filters-displace-01-f-manual.svg + + + +

    Source SVG: filters-displace-01-f-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-displace-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Checkerboard Image + + + + + Displacement Map + (20 deg. rotation) + + + + + + + + Result + (overlayed with 20 deg. + rotated blue rectangle) + + + + + + Checkerboard Image + + + + + + Displacement Map + (spherical distortion) + + + + + Result + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-displace-02-f-isvalid.html b/conformance-checkers/html-svg/filters-displace-02-f-isvalid.html new file mode 100644 index 00000000000000..983cfed06a6dab --- /dev/null +++ b/conformance-checkers/html-svg/filters-displace-02-f-isvalid.html @@ -0,0 +1,67 @@ + + + + filters-displace-02-f-manual.svg + + + +

    Source SVG: filters-displace-02-f-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-displace-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-example-01-b-isvalid.html b/conformance-checkers/html-svg/filters-example-01-b-isvalid.html new file mode 100644 index 00000000000000..68df18f44afd70 --- /dev/null +++ b/conformance-checkers/html-svg/filters-example-01-b-isvalid.html @@ -0,0 +1,66 @@ + + + + filters-example-01-b-manual.svg + + + +

    Source SVG: filters-example-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-example-01-b.svg,v $ + + + + + + + + + + + Example filters01.svg - introducing filter effects + An example which combines multiple filter primitives to produce a 3D lighting effect on a graphic consisting of the string "SVG" sitting on top of oval filled in green and surrounded by an oval outlined in green. + + + + + + + + + + + + + + SVG + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-felem-01-b-isvalid.html b/conformance-checkers/html-svg/filters-felem-01-b-isvalid.html new file mode 100644 index 00000000000000..f88e6ee4413172 --- /dev/null +++ b/conformance-checkers/html-svg/filters-felem-01-b-isvalid.html @@ -0,0 +1,68 @@ + + + + filters-felem-01-b-manual.svg + + + +

    Source SVG: filters-felem-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-felem-01-b.svg,v $ + + + + + + + + + + + + + + + + No filter + + + + + Null filter + + + + + Non-existent filter + + + + + Null with small region filter + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-felem-02-f-isvalid.html b/conformance-checkers/html-svg/filters-felem-02-f-isvalid.html new file mode 100644 index 00000000000000..d72286a8563ebc --- /dev/null +++ b/conformance-checkers/html-svg/filters-felem-02-f-isvalid.html @@ -0,0 +1,113 @@ + + + + filters-felem-02-f-manual.svg + + + +

    Source SVG: filters-felem-02-f-manual.svg

    + + + + + + + + + + $RCSfile: filters-felem-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-gauss-01-b-isvalid.html b/conformance-checkers/html-svg/filters-gauss-01-b-isvalid.html new file mode 100644 index 00000000000000..97a4aa975cb4a7 --- /dev/null +++ b/conformance-checkers/html-svg/filters-gauss-01-b-isvalid.html @@ -0,0 +1,69 @@ + + + + filters-gauss-01-b-manual.svg + + + +

    Source SVG: filters-gauss-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-gauss-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-gauss-02-f-isvalid.html b/conformance-checkers/html-svg/filters-gauss-02-f-isvalid.html new file mode 100644 index 00000000000000..b674067c865274 --- /dev/null +++ b/conformance-checkers/html-svg/filters-gauss-02-f-isvalid.html @@ -0,0 +1,71 @@ + + + + filters-gauss-02-f-manual.svg + + + +

    Source SVG: filters-gauss-02-f-manual.svg

    + + + + + + + + + + $RCSfile: filters-gauss-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-gauss-03-f-isvalid.html b/conformance-checkers/html-svg/filters-gauss-03-f-isvalid.html new file mode 100644 index 00000000000000..383a29e06aa4f8 --- /dev/null +++ b/conformance-checkers/html-svg/filters-gauss-03-f-isvalid.html @@ -0,0 +1,57 @@ + + + + filters-gauss-03-f-manual.svg + + + +

    Source SVG: filters-gauss-03-f-manual.svg

    + + + + + + + + + + $RCSfile: filters-gauss-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-image-01-b-isvalid.html b/conformance-checkers/html-svg/filters-image-01-b-isvalid.html new file mode 100644 index 00000000000000..dbce70d71d0dff --- /dev/null +++ b/conformance-checkers/html-svg/filters-image-01-b-isvalid.html @@ -0,0 +1,51 @@ + + + + filters-image-01-b-manual.svg + + + +

    Source SVG: filters-image-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-image-01-b.svg,v $ + + + + + + + + + + + + + + Basic test of feImage filter support. + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-image-02-b-isvalid.html b/conformance-checkers/html-svg/filters-image-02-b-isvalid.html new file mode 100644 index 00000000000000..a8936c781070e6 --- /dev/null +++ b/conformance-checkers/html-svg/filters-image-02-b-isvalid.html @@ -0,0 +1,64 @@ + + + + filters-image-02-b-manual.svg + + + +

    Source SVG: filters-image-02-b-manual.svg

    + + + + + + + + + + $RCSfile: filters-image-02-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + Animation in filters + 'feImage' + 'image' + + + + $Revision: 1.9 $ + + + + + + diff --git a/conformance-checkers/html-svg/filters-image-03-f-isvalid.html b/conformance-checkers/html-svg/filters-image-03-f-isvalid.html new file mode 100644 index 00000000000000..17894f5d0eda46 --- /dev/null +++ b/conformance-checkers/html-svg/filters-image-03-f-isvalid.html @@ -0,0 +1,164 @@ + + + + filters-image-03-f-manual.svg + + + +

    Source SVG: filters-image-03-f-manual.svg

    + + + + + + + + + + $RCSfile: filters-image-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-image-04-f-isvalid.html b/conformance-checkers/html-svg/filters-image-04-f-isvalid.html new file mode 100644 index 00000000000000..47e238d578b87b --- /dev/null +++ b/conformance-checkers/html-svg/filters-image-04-f-isvalid.html @@ -0,0 +1,104 @@ + + + + filters-image-04-f-manual.svg + + + +

    Source SVG: filters-image-04-f-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-image-04-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + primitiveUnits = "objectBoundingBox" + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/filters-image-05-f-isvalid.html b/conformance-checkers/html-svg/filters-image-05-f-isvalid.html new file mode 100644 index 00000000000000..d20325754eec5e --- /dev/null +++ b/conformance-checkers/html-svg/filters-image-05-f-isvalid.html @@ -0,0 +1,184 @@ + + + + filters-image-05-f-manual.svg + + + +

    Source SVG: filters-image-05-f-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-image-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Example PreserveAspectRatio - demonstrate available options + Test preserveAspectRatio on an feImage element. + Raster to fit + + + + Viewport 1 + + Viewport 2 + + + ---------- meet -------------------- + + xMin* + + + + + xMid* + + + + + xMax* + + + + + + ---------- meet ------------------------ + + *YMin + + + + *YMid + + + + *YMax + + + + + ---------- slice ------------------------- + + xMin* + + + + xMid* + + + + xMax* + + + + + ---------- slice --------------------- + + *YMin + + + + + *YMid + + + + + *YMax + + + + + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/filters-light-01-f-isvalid.html b/conformance-checkers/html-svg/filters-light-01-f-isvalid.html new file mode 100644 index 00000000000000..b490f3e1558581 --- /dev/null +++ b/conformance-checkers/html-svg/filters-light-01-f-isvalid.html @@ -0,0 +1,170 @@ + + + + filters-light-01-f-manual.svg + + + +

    Source SVG: filters-light-01-f-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-light-01-f.svg,v $ + + + + + + + + + + Filters: feDistantLight, fePointLight, feSpotLight + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Various values for feDistantLight azimuth and elevation + (0, 0) + (45, 0) + (0, 45) + (45, 45) + + + + + + + + Various values for fePointLight's x, y and z + (0, 0, 10) + (50, 0, 10) + (0, 30, 10) + (50, 30, 10) + + + + + + + + + + Various values for feSpotLight's x, y, z, pointsAtX, pointsAtY, pointsAtZ + (25, 0, 25) + (25, 30, 0) + (25, 30, 25) + (25, 0, 0) + np=1 + limitingConeAngle=30 + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-light-02-f-isvalid.html b/conformance-checkers/html-svg/filters-light-02-f-isvalid.html new file mode 100644 index 00000000000000..5ac432761d09a8 --- /dev/null +++ b/conformance-checkers/html-svg/filters-light-02-f-isvalid.html @@ -0,0 +1,86 @@ + + + + filters-light-02-f-manual.svg + + + +

    Source SVG: filters-light-02-f-manual.svg

    + + + + + + + + + + $RCSfile: filters-light-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 'feDistantLight' azimuth + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + diff --git a/conformance-checkers/html-svg/filters-light-03-f-isvalid.html b/conformance-checkers/html-svg/filters-light-03-f-isvalid.html new file mode 100644 index 00000000000000..a6a9c2b3adc479 --- /dev/null +++ b/conformance-checkers/html-svg/filters-light-03-f-isvalid.html @@ -0,0 +1,106 @@ + + + + filters-light-03-f-manual.svg + + + +

    Source SVG: filters-light-03-f-manual.svg

    + + + + + + + + + + $RCSfile: filters-light-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + primitiveUnits="objectBoundingBox" + + + + + + + + + primitiveUnits="userSpaceOnUse" + + + + + + + + + primitiveUnits unspecified + + + + + + $Revision: 1.10 $ + + + + + + + + diff --git a/conformance-checkers/html-svg/filters-light-04-f-isvalid.html b/conformance-checkers/html-svg/filters-light-04-f-isvalid.html new file mode 100644 index 00000000000000..16c15798ee2abf --- /dev/null +++ b/conformance-checkers/html-svg/filters-light-04-f-isvalid.html @@ -0,0 +1,123 @@ + + + + filters-light-04-f-manual.svg + + + +

    Source SVG: filters-light-04-f-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-light-04-f.svg,v $ + + + + + + + + + + feSpotLight's limitingConeAngle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + 20 + Animated (0..50) + 5 + + -30 + -20 + Animated (0..-50) + -5 + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-light-05-f-novalid.html b/conformance-checkers/html-svg/filters-light-05-f-novalid.html new file mode 100644 index 00000000000000..9d2701034ae67c --- /dev/null +++ b/conformance-checkers/html-svg/filters-light-05-f-novalid.html @@ -0,0 +1,207 @@ + + + + filters-light-05-f-manual.svg + + + +

    Source SVG: filters-light-05-f-manual.svg

    + + + + + + + + + + $RCSfile: filters-light-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feDiffuseLight using feDistantLight source + + + + + + + 90 deg + 270 deg + 180 deg + 0 deg + + feSpecularLight using feDistantLight source + + + + + + + 90 deg + 270 deg + 180 deg + 0 deg + + feDiffuseLight and feSpecularLight using feDistantLight + + + + + + + 90 deg + 270 deg + 180 deg + 0 deg + + + + + + + + 90 deg + 270 deg + 180 deg + 0 deg + + + + + + + + 90 deg + 270 deg + 180 deg + 0 deg + + + + + + + + 90 deg + 270 deg + 180 deg + 0 deg + + + + $Revision: 1.3 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/filters-morph-01-f-isvalid.html b/conformance-checkers/html-svg/filters-morph-01-f-isvalid.html new file mode 100644 index 00000000000000..2f3a162d6695b5 --- /dev/null +++ b/conformance-checkers/html-svg/filters-morph-01-f-isvalid.html @@ -0,0 +1,89 @@ + + + + filters-morph-01-f-manual.svg + + + +

    Source SVG: filters-morph-01-f-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-morph-01-f.svg,v $ + + + + + + + + + Filter Effect: feMorphology + + + + + + + + + + + + + + + + + + + + + + + + + + + + + type=erode radius=1 + + + + type=erode radius=2 + + + + type=dilate radius=1 + + + + type=dilate radius=3 + + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-offset-01-b-isvalid.html b/conformance-checkers/html-svg/filters-offset-01-b-isvalid.html new file mode 100644 index 00000000000000..d1129afd2424db --- /dev/null +++ b/conformance-checkers/html-svg/filters-offset-01-b-isvalid.html @@ -0,0 +1,85 @@ + + + + filters-offset-01-b-manual.svg + + + +

    Source SVG: filters-offset-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-offset-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-offset-02-b-isvalid.html b/conformance-checkers/html-svg/filters-offset-02-b-isvalid.html new file mode 100644 index 00000000000000..951b0c5dd55e0e --- /dev/null +++ b/conformance-checkers/html-svg/filters-offset-02-b-isvalid.html @@ -0,0 +1,71 @@ + + + + filters-offset-02-b-manual.svg + + + +

    Source SVG: filters-offset-02-b-manual.svg

    + + + + + + + + + + $RCSfile: filters-offset-02-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + DRAFT + + + diff --git a/conformance-checkers/html-svg/filters-overview-01-b-isvalid.html b/conformance-checkers/html-svg/filters-overview-01-b-isvalid.html new file mode 100644 index 00000000000000..69726a9e9eb60d --- /dev/null +++ b/conformance-checkers/html-svg/filters-overview-01-b-isvalid.html @@ -0,0 +1,151 @@ + + + + filters-overview-01-b-manual.svg + + + +

    Source SVG: filters-overview-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-overview-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SourceAlpha + + =========================================================================================== + + + + + + + + SourceGraphic + + =========================================================================================== + + + + + + + + BackgroundAlpha + + =========================================================================================== + + + + + + + + BackgroundImage + + =========================================================================================== + + + + + + + + FillPaint + + =========================================================================================== + + + + + + + + StrokePaint + + + + Filter input test + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-overview-02-b-isvalid.html b/conformance-checkers/html-svg/filters-overview-02-b-isvalid.html new file mode 100644 index 00000000000000..b91fc64207a542 --- /dev/null +++ b/conformance-checkers/html-svg/filters-overview-02-b-isvalid.html @@ -0,0 +1,160 @@ + + + + filters-overview-02-b-manual.svg + + + +

    Source SVG: filters-overview-02-b-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-overview-02-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SourceAlpha + + =========================================================================================== + + + + + + + + SourceGraphic + + =========================================================================================== + + + + + + + + BackgroundAlpha + + =========================================================================================== + + + + + + + + BackgroundImage + + =========================================================================================== + + + + + + + + + FillPaint + + =========================================================================================== + + + + + + + + + StrokePaint + + + + Filter input test + + + + $Revision: 1.1 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/filters-overview-03-b-isvalid.html b/conformance-checkers/html-svg/filters-overview-03-b-isvalid.html new file mode 100644 index 00000000000000..6ecdc69fe4a572 --- /dev/null +++ b/conformance-checkers/html-svg/filters-overview-03-b-isvalid.html @@ -0,0 +1,151 @@ + + + + filters-overview-03-b-manual.svg + + + +

    Source SVG: filters-overview-03-b-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-overview-03-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SourceAlpha + + =========================================================================================== + + + + + + + + SourceGraphic + + =========================================================================================== + + + + + + + + BackgroundAlpha + + =========================================================================================== + + + + + + + + BackgroundImage + + =========================================================================================== + + + + + + + + FillPaint + + =========================================================================================== + + + + + + + + StrokePaint + + + + Filter input test + + + + $Revision: 1.2 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/filters-specular-01-f-isvalid.html b/conformance-checkers/html-svg/filters-specular-01-f-isvalid.html new file mode 100644 index 00000000000000..03da4c31b3ddb9 --- /dev/null +++ b/conformance-checkers/html-svg/filters-specular-01-f-isvalid.html @@ -0,0 +1,179 @@ + + + + filters-specular-01-f-manual.svg + + + +

    Source SVG: filters-specular-01-f-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-specular-01-f.svg,v $ + + + + + + + + + + Filters: feSpecularLighting + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Various values for surfaceScale: 1, 10 and -10 + + + + + + + + + + + + Various values for specularConstants: 0, 1 and 2 + + + + + + + + + + + + Various values for specularExponents: 1, 2 and 4 + + + + + + + + + + + + Various values for lighting color: red, yellow and blue + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-tile-01-b-isvalid.html b/conformance-checkers/html-svg/filters-tile-01-b-isvalid.html new file mode 100644 index 00000000000000..8f0402a7da715b --- /dev/null +++ b/conformance-checkers/html-svg/filters-tile-01-b-isvalid.html @@ -0,0 +1,63 @@ + + + + filters-tile-01-b-manual.svg + + + +

    Source SVG: filters-tile-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-tile-01-b.svg,v $ + + + + + + + + + feTile filter test: a tiled pattern + + + + + + + + + + + + + + + + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-turb-01-f-isvalid.html b/conformance-checkers/html-svg/filters-turb-01-f-isvalid.html new file mode 100644 index 00000000000000..780459e8756db6 --- /dev/null +++ b/conformance-checkers/html-svg/filters-turb-01-f-isvalid.html @@ -0,0 +1,91 @@ + + + + filters-turb-01-f-manual.svg + + + +

    Source SVG: filters-turb-01-f-manual.svg

    + + + + + + + + + + + + $RCSfile: filters-turb-01-f.svg,v $ + + + + + + + + + Six rectangular areas showing the effects of various parameter settings for feTurbulence. + + + + + + + + + + + + + + + + + + + + + + + type=turbulence + baseFrequency=0.05 + numOctaves=2 + + type=turbulence + baseFrequency=0.1 + numOctaves=2 + + type=turbulence + baseFrequency=0.05 + numOctaves=8 + + type=fractalNoise + baseFrequency=0.1 + numOctaves=4 + + type=fractalNoise + baseFrequency=0.4 + numOctaves=4 + + type=fractalNoise + baseFrequency=0.1 + numOctaves=1 + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/filters-turb-02-f-isvalid.html b/conformance-checkers/html-svg/filters-turb-02-f-isvalid.html new file mode 100644 index 00000000000000..203f6a79e99976 --- /dev/null +++ b/conformance-checkers/html-svg/filters-turb-02-f-isvalid.html @@ -0,0 +1,125 @@ + + + + filters-turb-02-f-manual.svg + + + +

    Source SVG: filters-turb-02-f-manual.svg

    + + + + + + + + + + $RCSfile: filters-turb-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feTurbulence seed + + + + -0.8 + + -0.5 + + -0.2 + + 0 + + 0.2 + + 0.5 + + 1.5 + + + + -1 + + -1.5 + + + + -2 + + -2.6 + + + + + $Revision: 1.7 $ + + + + + + diff --git a/conformance-checkers/html-svg/fonts-desc-01-t-isvalid.html b/conformance-checkers/html-svg/fonts-desc-01-t-isvalid.html new file mode 100644 index 00000000000000..38fd4973631bfc --- /dev/null +++ b/conformance-checkers/html-svg/fonts-desc-01-t-isvalid.html @@ -0,0 +1,91 @@ + + + + fonts-desc-01-t-manual.svg + + + +

    Source SVG: fonts-desc-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: fonts-desc-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + a + + + + $Revision: 1.6 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/fonts-desc-02-t-isvalid.html b/conformance-checkers/html-svg/fonts-desc-02-t-isvalid.html new file mode 100644 index 00000000000000..7fd43f5c7437fa --- /dev/null +++ b/conformance-checkers/html-svg/fonts-desc-02-t-isvalid.html @@ -0,0 +1,115 @@ + + + + fonts-desc-02-t-manual.svg + + + +

    Source SVG: fonts-desc-02-t-manual.svg

    + + + + + + + + + + + + $RCSfile: fonts-desc-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + a + + + a + a + + + a + a + a + a + + + a + a + a + a + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/fonts-desc-03-t-isvalid.html b/conformance-checkers/html-svg/fonts-desc-03-t-isvalid.html new file mode 100644 index 00000000000000..7a847714a8290e --- /dev/null +++ b/conformance-checkers/html-svg/fonts-desc-03-t-isvalid.html @@ -0,0 +1,102 @@ + + + + fonts-desc-03-t-manual.svg + + + +

    Source SVG: fonts-desc-03-t-manual.svg

    + + + + + + + + + + + + $RCSfile: fonts-desc-03-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + a + + a + a + + a + a + + + + + $Revision: 1.6 $ + + + + + + diff --git a/conformance-checkers/html-svg/fonts-desc-04-t-isvalid.html b/conformance-checkers/html-svg/fonts-desc-04-t-isvalid.html new file mode 100644 index 00000000000000..1420e16a2c691a --- /dev/null +++ b/conformance-checkers/html-svg/fonts-desc-04-t-isvalid.html @@ -0,0 +1,120 @@ + + + + fonts-desc-04-t-manual.svg + + + +

    Source SVG: fonts-desc-04-t-manual.svg

    + + + + + + + + + + + + $RCSfile: fonts-desc-04-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + a + + + a + a + + + a + a + a + + + + $Revision: 1.7 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/fonts-desc-05-t-isvalid.html b/conformance-checkers/html-svg/fonts-desc-05-t-isvalid.html new file mode 100644 index 00000000000000..7799438c3e6aee --- /dev/null +++ b/conformance-checkers/html-svg/fonts-desc-05-t-isvalid.html @@ -0,0 +1,107 @@ + + + + fonts-desc-05-t-manual.svg + + + +

    Source SVG: fonts-desc-05-t-manual.svg

    + + + + + + + + + + + + $RCSfile: fonts-desc-05-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + a + a + a + + + a + a + a + + + + $Revision: 1.7 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/fonts-elem-01-t-isvalid.html b/conformance-checkers/html-svg/fonts-elem-01-t-isvalid.html new file mode 100644 index 00000000000000..6788ac071e3aba --- /dev/null +++ b/conformance-checkers/html-svg/fonts-elem-01-t-isvalid.html @@ -0,0 +1,97 @@ + + + + fonts-elem-01-t-manual.svg + + + +

    Source SVG: fonts-elem-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: fonts-elem-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + Basic SVG font element + + + + + Placed Glyphs + + + + + + + + + + + + + + + + + + + + + + + + + + SVG Font + + + AyÖ@ç + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/fonts-elem-02-t-isvalid.html b/conformance-checkers/html-svg/fonts-elem-02-t-isvalid.html new file mode 100644 index 00000000000000..191196b0cb997d --- /dev/null +++ b/conformance-checkers/html-svg/fonts-elem-02-t-isvalid.html @@ -0,0 +1,105 @@ + + + + fonts-elem-02-t-manual.svg + + + +

    Source SVG: fonts-elem-02-t-manual.svg

    + + + + + + + + + + + + $RCSfile: fonts-elem-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + SVG font element accuracy + + SVG over Glyphs + + + + + + + + + + + + + + + + + + + AyÖ@ç + + Glyphs over SVG + + AyÖ@ç + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/fonts-elem-03-b-isvalid.html b/conformance-checkers/html-svg/fonts-elem-03-b-isvalid.html new file mode 100644 index 00000000000000..e8e47d4d238c68 --- /dev/null +++ b/conformance-checkers/html-svg/fonts-elem-03-b-isvalid.html @@ -0,0 +1,97 @@ + + + + fonts-elem-03-b-manual.svg + + + +

    Source SVG: fonts-elem-03-b-manual.svg

    + + + + + + + + + + + + $RCSfile: fonts-elem-03-b.svg,v $ + + + + + + + + + + + + + + + + + External SVG font element (xml) + + + + + Placed Glyphs + + + + + + + + + + + + + + + + + + + + + + + + + + SVG Font + + + AyÖ@ç + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/fonts-elem-04-b-isvalid.html b/conformance-checkers/html-svg/fonts-elem-04-b-isvalid.html new file mode 100644 index 00000000000000..543abe3c9832be --- /dev/null +++ b/conformance-checkers/html-svg/fonts-elem-04-b-isvalid.html @@ -0,0 +1,97 @@ + + + + fonts-elem-04-b-manual.svg + + + +

    Source SVG: fonts-elem-04-b-manual.svg

    + + + + + + + + + + + + $RCSfile: fonts-elem-04-b.svg,v $ + + + + + + + + + + + + + External SVG font element (css) + + + + + Placed Glyphs + + + + + + + + + + + + + + + + + + + + + + + + + + SVG Font + + + AyÖ@ç + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/fonts-elem-05-t-isvalid.html b/conformance-checkers/html-svg/fonts-elem-05-t-isvalid.html new file mode 100644 index 00000000000000..5eaa8a62e18f43 --- /dev/null +++ b/conformance-checkers/html-svg/fonts-elem-05-t-isvalid.html @@ -0,0 +1,125 @@ + + + + fonts-elem-05-t-manual.svg + + + +

    Source SVG: fonts-elem-05-t-manual.svg

    + + + + + + + + + + + + $RCSfile: fonts-elem-05-t.svg,v $ + + + + + + + + + <font> horiz-origin-x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + horiz-origin-x unspecified (0) + + + + + 1234 + + + + horiz-origin-x=500 + + + + + 1234 + + + + + horiz-adv-x=1000 but ignored + + + + + 1234 + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/fonts-elem-06-t-isvalid.html b/conformance-checkers/html-svg/fonts-elem-06-t-isvalid.html new file mode 100644 index 00000000000000..54c42c57db7755 --- /dev/null +++ b/conformance-checkers/html-svg/fonts-elem-06-t-isvalid.html @@ -0,0 +1,98 @@ + + + + fonts-elem-06-t-manual.svg + + + +

    Source SVG: fonts-elem-06-t-manual.svg

    + + + + + + + + + + + + $RCSfile: fonts-elem-06-t.svg,v $ + + + + + + + + + <font> horiz-adv-x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + horiz-adv-x=1000 + + + 12 + + + + horiz-adv-x=2000 + + + 12 + + + + + horiz-adv-x=1000 but ignored + + + 12 + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/fonts-elem-07-b-isvalid.html b/conformance-checkers/html-svg/fonts-elem-07-b-isvalid.html new file mode 100644 index 00000000000000..8bb396fe6a1dae --- /dev/null +++ b/conformance-checkers/html-svg/fonts-elem-07-b-isvalid.html @@ -0,0 +1,108 @@ + + + + fonts-elem-07-b-manual.svg + + + +

    Source SVG: fonts-elem-07-b-manual.svg

    + + + + + + + + + + + + $RCSfile: fonts-elem-07-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Basic SVG font element + + + + + Placed Glyphs + + + + + + + + + + + + + + + + + + + + + + + + + + SVG Font + + + AyÖ@ç + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/fonts-glyph-02-t-isvalid.html b/conformance-checkers/html-svg/fonts-glyph-02-t-isvalid.html new file mode 100644 index 00000000000000..26fe17a3f3ea55 --- /dev/null +++ b/conformance-checkers/html-svg/fonts-glyph-02-t-isvalid.html @@ -0,0 +1,72 @@ + + + + fonts-glyph-02-t-manual.svg + + + +

    Source SVG: fonts-glyph-02-t-manual.svg

    + + + + + + + + + + + + $RCSfile: fonts-glyph-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ښ ښښښ + + + + خ خخخ + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/fonts-glyph-03-t-isvalid.html b/conformance-checkers/html-svg/fonts-glyph-03-t-isvalid.html new file mode 100644 index 00000000000000..912da902bdfbbc --- /dev/null +++ b/conformance-checkers/html-svg/fonts-glyph-03-t-isvalid.html @@ -0,0 +1,63 @@ + + + + fonts-glyph-03-t-manual.svg + + + +

    Source SVG: fonts-glyph-03-t-manual.svg

    + + + + + + + + + + + + $RCSfile: fonts-glyph-03-t.svg,v $ + + + + + + + + + + + + + + + + + + + + a + + a + + a + + a + + + + $Revision: 1.6 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/fonts-glyph-04-t-novalid.html b/conformance-checkers/html-svg/fonts-glyph-04-t-novalid.html new file mode 100644 index 00000000000000..d8c09495be3869 --- /dev/null +++ b/conformance-checkers/html-svg/fonts-glyph-04-t-novalid.html @@ -0,0 +1,58 @@ + + + + fonts-glyph-04-t-manual.svg + + + +

    Source SVG: fonts-glyph-04-t-manual.svg

    + + + + + + + + + + + + $RCSfile: fonts-glyph-04-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + ffl + ffl + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/fonts-kern-01-t-isvalid.html b/conformance-checkers/html-svg/fonts-kern-01-t-isvalid.html new file mode 100644 index 00000000000000..f23ccc5b106402 --- /dev/null +++ b/conformance-checkers/html-svg/fonts-kern-01-t-isvalid.html @@ -0,0 +1,253 @@ + + + + fonts-kern-01-t-manual.svg + + + +

    Source SVG: fonts-kern-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: fonts-kern-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <hkern> + + + + + font A + + + u1="1" u2="2" + + + + + + + + + 12 + + + + + + + font B + + + g1="gl_1" g2="gl_2" + + + + 12 + + + + + + + font C + + + u1="1" u2="2" g1="gl_3" g2="gl_4" + + + + + + + + 1234 + + + + + + + font D + + + u1="1,3" u2="2,4" + + + + + + 1234 + + + + + + + font E + + + g1="gl_1,gl_3" g2="gl_2,gl_4" + + + + + + 1234 + + + + + + + font F + + + u1="U+003?" u2="U+0031-34" + + + + + + + + + 1234 + + + + + + + font G + + + u1="1" g2="gl_2" + + + + + + + + + 12 + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/fonts-overview-201-t-novalid.html b/conformance-checkers/html-svg/fonts-overview-201-t-novalid.html new file mode 100644 index 00000000000000..8cc1f54b5253cd --- /dev/null +++ b/conformance-checkers/html-svg/fonts-overview-201-t-novalid.html @@ -0,0 +1,107 @@ + + + + fonts-overview-201-t-manual.svg + + + +

    Source SVG: fonts-overview-201-t-manual.svg

    + + + + + + + + + + + $RCSfile: fonts-overview-201-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + β + β + β + + 1,000 + 10 + 10,000 + varying units-per-em values + + + $Revision: 1.2 $ + + + + + diff --git a/conformance-checkers/html-svg/imp-path-01-f-isvalid.html b/conformance-checkers/html-svg/imp-path-01-f-isvalid.html new file mode 100644 index 00000000000000..905bcb3194c0b4 --- /dev/null +++ b/conformance-checkers/html-svg/imp-path-01-f-isvalid.html @@ -0,0 +1,50 @@ + + + + imp-path-01-f-manual.svg + + + +

    Source SVG: imp-path-01-f-manual.svg

    + + + + + + + + + + $RCSfile: imp-path-01-f.svg,v $ + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/interact-cursor-01-f-isvalid.html b/conformance-checkers/html-svg/interact-cursor-01-f-isvalid.html new file mode 100644 index 00000000000000..2fa936410e51c5 --- /dev/null +++ b/conformance-checkers/html-svg/interact-cursor-01-f-isvalid.html @@ -0,0 +1,113 @@ + + + + interact-cursor-01-f-manual.svg + + + +

    Source SVG: interact-cursor-01-f-manual.svg

    + + + + + + + + + + + + $RCSfile: interact-cursor-01-f.svg,v $ + + + + + + + + + + + + + Text Cursor + Pointer Cursor + + + + + + + + + + crosshair + + + + default + + + + pointer + + + + move + + + + text + + + + wait + + + + help + + + + <url> + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/interact-dom-01-b-isvalid.html b/conformance-checkers/html-svg/interact-dom-01-b-isvalid.html new file mode 100644 index 00000000000000..101082a941fec5 --- /dev/null +++ b/conformance-checkers/html-svg/interact-dom-01-b-isvalid.html @@ -0,0 +1,108 @@ + + + + interact-dom-01-b-manual.svg + + + +

    Source SVG: interact-dom-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: interact-dom-01-b.svg,v $ + + + + + + + + + + + + + + + + + Start Test + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/interact-events-01-b-isvalid.html b/conformance-checkers/html-svg/interact-events-01-b-isvalid.html new file mode 100644 index 00000000000000..64041cfd8b5efd --- /dev/null +++ b/conformance-checkers/html-svg/interact-events-01-b-isvalid.html @@ -0,0 +1,94 @@ + + + + interact-events-01-b-manual.svg + + + +

    Source SVG: interact-events-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: interact-events-01-b.svg,v $ + + + + + + + + + + + + + 'onload' event attribute. + + + + + 1: No + + + + 2: Yes + + + + + + 3: Yes + + + + + + 4: Yes + + + + + + 5: No + + + + 6: Yes + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/interact-events-02-b-novalid.html b/conformance-checkers/html-svg/interact-events-02-b-novalid.html new file mode 100644 index 00000000000000..e85bd93e7ac86f --- /dev/null +++ b/conformance-checkers/html-svg/interact-events-02-b-novalid.html @@ -0,0 +1,61 @@ + + + + interact-events-02-b-manual.svg + + + +

    Source SVG: interact-events-02-b-manual.svg

    + + + + + + + + + + $RCSfile: interact-events-02-b.svg,v $ + + + + + + + + + + Testing that SVGLoad does not bubble + + + + + On root <svg> + On an <image> + + + + + + + + $Revision: 1.7 $ + + + + + + diff --git a/conformance-checkers/html-svg/interact-events-202-f-isvalid.html b/conformance-checkers/html-svg/interact-events-202-f-isvalid.html new file mode 100644 index 00000000000000..378177a13b2a6d --- /dev/null +++ b/conformance-checkers/html-svg/interact-events-202-f-isvalid.html @@ -0,0 +1,72 @@ + + + + interact-events-202-f-manual.svg + + + +

    Source SVG: interact-events-202-f-manual.svg

    + + + + + + + + + + $RCSfile: interact-events-202-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + diff --git a/conformance-checkers/html-svg/interact-events-203-t-isvalid.html b/conformance-checkers/html-svg/interact-events-203-t-isvalid.html new file mode 100644 index 00000000000000..6aa4683b04fcde --- /dev/null +++ b/conformance-checkers/html-svg/interact-events-203-t-isvalid.html @@ -0,0 +1,87 @@ + + + + interact-events-203-t-manual.svg + + + +

    Source SVG: interact-events-203-t-manual.svg

    + + + + + + + + + + $RCSfile: interact-events-203-t.svg,v $ + + + + + + + + + + + + + + + Shadow tree event listener chain + + + + Case 1: on mouseover all squares must turn blue + + + + + + + + Case 2: on mouseover all squares must turn blue + and a black stroke must appear on reference square + + + + + + + + + + Case 3: on mouseover all squares must turn blue + and a black stroke must appear on reference square + + + + + + + + Case 4: on mouseover all squares must turn blue + and on mousedown a black stroke must appear on reference square + + + + + $Revision: 1.4 $ + + + + + + diff --git a/conformance-checkers/html-svg/interact-order-01-b-isvalid.html b/conformance-checkers/html-svg/interact-order-01-b-isvalid.html new file mode 100644 index 00000000000000..02d48a0d86ec81 --- /dev/null +++ b/conformance-checkers/html-svg/interact-order-01-b-isvalid.html @@ -0,0 +1,89 @@ + + + + interact-order-01-b-manual.svg + + + +

    Source SVG: interact-order-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: interact-order-01-b.svg,v $ + + + + + + + + + + + + Event bubbling - a + + + + + + + + + + + + Pointer in circle, + + + circle turns pink + + + Pointer in circle, + + + circle turns blue + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/interact-order-02-b-isvalid.html b/conformance-checkers/html-svg/interact-order-02-b-isvalid.html new file mode 100644 index 00000000000000..39eb27681c1ebd --- /dev/null +++ b/conformance-checkers/html-svg/interact-order-02-b-isvalid.html @@ -0,0 +1,87 @@ + + + + interact-order-02-b-manual.svg + + + +

    Source SVG: interact-order-02-b-manual.svg

    + + + + + + + + + + + + $RCSfile: interact-order-02-b.svg,v $ + + + + + + + + + + + + Event bubbling - b + + + + + + + + + + + + + Click on circle, + + + circle turns red + + + Click on circle, + + + hyperlink + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/interact-order-03-b-isvalid.html b/conformance-checkers/html-svg/interact-order-03-b-isvalid.html new file mode 100644 index 00000000000000..85f2b717db51ae --- /dev/null +++ b/conformance-checkers/html-svg/interact-order-03-b-isvalid.html @@ -0,0 +1,86 @@ + + + + interact-order-03-b-manual.svg + + + +

    Source SVG: interact-order-03-b-manual.svg

    + + + + + + + + + + + + $RCSfile: interact-order-03-b.svg,v $ + + + + + + + + + + + + Event bubbling - c + + + + + + + + String turns red on click + + + + String hyperlinks to + + + interact-order-03b-targ.svg + + + + All strings are selectable. + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/interact-pevents-01-b-novalid.html b/conformance-checkers/html-svg/interact-pevents-01-b-novalid.html new file mode 100644 index 00000000000000..851efb65288269 --- /dev/null +++ b/conformance-checkers/html-svg/interact-pevents-01-b-novalid.html @@ -0,0 +1,173 @@ + + + + interact-pevents-01-b-manual.svg + + + +

    Source SVG: interact-pevents-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: interact-pevents-01-b.svg,v $ + + + + + + + + + + + + Test pointer-events on text + + + O + O + O + O + O + O + O + O + O + O + + + + + + + + + + O + O + O + O + O + O + O + O + O + O + + + + + + + + + + O + O + O + O + O + O + O + O + O + O + + + + + + + + + + O + O + + O + O + O + + O + + O + O + O + + O + + + + + + + + + + + + Toggle freeze + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/interact-pevents-03-b-novalid.html b/conformance-checkers/html-svg/interact-pevents-03-b-novalid.html new file mode 100644 index 00000000000000..7e28b1e9d30173 --- /dev/null +++ b/conformance-checkers/html-svg/interact-pevents-03-b-novalid.html @@ -0,0 +1,114 @@ + + + + interact-pevents-03-b-manual.svg + + + +

    Source SVG: interact-pevents-03-b-manual.svg

    + + + + + + + + + + + + $RCSfile: interact-pevents-03-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test pointer-events on text + + + + + @ A y Ö ç + + + + @ A y Ö ç + + + + @AyÖç + + + + + + @ A y Ö ç + + + + @AyÖç + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/interact-pevents-04-t-isvalid.html b/conformance-checkers/html-svg/interact-pevents-04-t-isvalid.html new file mode 100644 index 00000000000000..10f0395387ce48 --- /dev/null +++ b/conformance-checkers/html-svg/interact-pevents-04-t-isvalid.html @@ -0,0 +1,109 @@ + + + + interact-pevents-04-t-manual.svg + + + +

    Source SVG: interact-pevents-04-t-manual.svg

    + + + + + + + + + + + + $RCSfile: interact-pevents-04-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test pointer-events on text + + + + + @ A y Ö ç + + + + @ A y Ö ç + + + + @AyÖç + + + + + + @ A y Ö ç + + + + @AyÖç + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/interact-pevents-05-b-novalid.html b/conformance-checkers/html-svg/interact-pevents-05-b-novalid.html new file mode 100644 index 00000000000000..69d39b6492c3bf --- /dev/null +++ b/conformance-checkers/html-svg/interact-pevents-05-b-novalid.html @@ -0,0 +1,102 @@ + + + + interact-pevents-05-b-manual.svg + + + +

    Source SVG: interact-pevents-05-b-manual.svg

    + + + + + + + + + + + + $RCSfile: interact-pevents-05-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test pointer-events on text + + @AyÖç + @AyÖç + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/interact-pevents-07-t-novalid.html b/conformance-checkers/html-svg/interact-pevents-07-t-novalid.html new file mode 100644 index 00000000000000..0ee3f03d94167b --- /dev/null +++ b/conformance-checkers/html-svg/interact-pevents-07-t-novalid.html @@ -0,0 +1,107 @@ + + + + interact-pevents-07-t-manual.svg + + + +

    Source SVG: interact-pevents-07-t-manual.svg

    + + + + + + + + + + $RCSfile: interact-pevents-07-t.svg,v $ + + + + + + + + + + + + Testing pointer-events and rendering order + Rectangles should turn RED on mouseover + Ovals should turn RED if Pointer-Events are set to "ALL" + + + + Change "Pointer-Events" of + ovals from "ALL" to "NONE" + + + + + Purple ovals have "Pointer-Events" set to "ALL". + Purple ovals have Pointer-Events set to "NONE". + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/interact-pevents-08-f-novalid.html b/conformance-checkers/html-svg/interact-pevents-08-f-novalid.html new file mode 100644 index 00000000000000..42126ad1fd7c86 --- /dev/null +++ b/conformance-checkers/html-svg/interact-pevents-08-f-novalid.html @@ -0,0 +1,155 @@ + + + + interact-pevents-08-f-manual.svg + + + +

    Source SVG: interact-pevents-08-f-manual.svg

    + + + + + + + + + + $RCSfile: interact-pevents-08-f.svg,v $ + + + + + + + + + + + + Testing pointer-events - pale RED rect should appear on mouseover. + + + 2nd and 3rd columns represent respectively rects with no fill/stroke and transparent fill/stroke + + + + + + + + + + + + + + + + default : + fill and stroke of rects 1 and 3 must trigger + + + + + + + + + + + + + + + visiblePainted : + fill and stroke of rects 1 and 3 must trigger + + + + + + + + + + + + + + + + + + visibleFill : + only fill of rects 1, 2 and 3 must trigger + + + + + + + + + + + + + + + + + + visibleStroke : + only stroke of rects 1, 2 and 3 must trigger + + + + + + + + + + + + + + + + + + visible : + fill and stroke of rects 1, 2 and 3 must trigger + + + + + + $Revision: 1.3 $ + + + + + + + diff --git a/conformance-checkers/html-svg/interact-pevents-09-f-novalid.html b/conformance-checkers/html-svg/interact-pevents-09-f-novalid.html new file mode 100644 index 00000000000000..fb8d9a82ba3c9a --- /dev/null +++ b/conformance-checkers/html-svg/interact-pevents-09-f-novalid.html @@ -0,0 +1,146 @@ + + + + interact-pevents-09-f-manual.svg + + + +

    Source SVG: interact-pevents-09-f-manual.svg

    + + + + + + + + + + $RCSfile: interact-pevents-09-f.svg,v $ + + + + + + + + + + + + Testing pointer-events - pale RED rect should appear on mouseover. + + + 2nd and 3rd columns represent respectively rects with no fill/stroke and transparent fill/stroke + + + + + + + + + + + + + + + + painted : + fill and stroke of rects 1, 3 and 4 must trigger + + + + + + + + + + + + + + + fill : + fill of rects 1 to 4 must trigger + + + + + + + + + + + + + + + stroke : + stroke of rects 1 to 4 must trigger + + + + + + + + + + + + + + + all : + stroke and fill of rects 1 to 4 must trigger + + + + + + + + + + + + + + + none : + nothing is to trigger + + + + + + $Revision: 1.3 $ + + + + + + + diff --git a/conformance-checkers/html-svg/interact-pevents-10-f-isvalid.html b/conformance-checkers/html-svg/interact-pevents-10-f-isvalid.html new file mode 100644 index 00000000000000..9aec374030bbde --- /dev/null +++ b/conformance-checkers/html-svg/interact-pevents-10-f-isvalid.html @@ -0,0 +1,68 @@ + + + + interact-pevents-10-f-manual.svg + + + +

    Source SVG: interact-pevents-10-f-manual.svg

    + + + + + + + + + + $RCSfile: interact-pevents-10-f.svg,v $ + + + + + + + + + + + + + + + FAIL + + + + $Revision: 1.4 $ + + + + + + + diff --git a/conformance-checkers/html-svg/interact-pointer-01-t-novalid.html b/conformance-checkers/html-svg/interact-pointer-01-t-novalid.html new file mode 100644 index 00000000000000..5b2da1f4c72fd4 --- /dev/null +++ b/conformance-checkers/html-svg/interact-pointer-01-t-novalid.html @@ -0,0 +1,64 @@ + + + + interact-pointer-01-t-manual.svg + + + +

    Source SVG: interact-pointer-01-t-manual.svg

    + + + + + + + + + + $RCSfile: interact-pointer-01-t.svg,v $ + + + + + + + + + + Test pointer events with zero opacity mask pixels + + + + + + + Move the pointing device over the rectangle. + If it is red, you've already failed. + + + + + + $Revision: 1.4 $ + + + + + + diff --git a/conformance-checkers/html-svg/interact-pointer-02-t-novalid.html b/conformance-checkers/html-svg/interact-pointer-02-t-novalid.html new file mode 100644 index 00000000000000..2a2724caf16c8c --- /dev/null +++ b/conformance-checkers/html-svg/interact-pointer-02-t-novalid.html @@ -0,0 +1,64 @@ + + + + interact-pointer-02-t-manual.svg + + + +

    Source SVG: interact-pointer-02-t-manual.svg

    + + + + + + + + + + $RCSfile: interact-pointer-02-t.svg,v $ + + + + + + + + + + Test pointer events with shapes that have clip paths + + + + + + + Move the pointing device over the rectangle. + If it is red, you've already failed. + + + + + + $Revision: 1.4 $ + + + + + + diff --git a/conformance-checkers/html-svg/interact-pointer-03-t-novalid.html b/conformance-checkers/html-svg/interact-pointer-03-t-novalid.html new file mode 100644 index 00000000000000..36e1e46d54f8fd --- /dev/null +++ b/conformance-checkers/html-svg/interact-pointer-03-t-novalid.html @@ -0,0 +1,62 @@ + + + + interact-pointer-03-t-manual.svg + + + +

    Source SVG: interact-pointer-03-t-manual.svg

    + + + + + + + + + + $RCSfile: interact-pointer-03-t.svg,v $ + + + + + + + + + + Test pointer-events="painted" with paint server fallback + + + + + + Move the pointing device over the rectangle. + + + + + + $Revision: 1.4 $ + + + + + + diff --git a/conformance-checkers/html-svg/interact-pointer-04-f-isvalid.html b/conformance-checkers/html-svg/interact-pointer-04-f-isvalid.html new file mode 100644 index 00000000000000..499797d2176132 --- /dev/null +++ b/conformance-checkers/html-svg/interact-pointer-04-f-isvalid.html @@ -0,0 +1,71 @@ + + + + interact-pointer-04-f-manual.svg + + + +

    Source SVG: interact-pointer-04-f-manual.svg

    + + + + + + + + + + $RCSfile: interact-pointer-04-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/interact-zoom-01-t-isvalid.html b/conformance-checkers/html-svg/interact-zoom-01-t-isvalid.html new file mode 100644 index 00000000000000..a4cf8b4f61447d --- /dev/null +++ b/conformance-checkers/html-svg/interact-zoom-01-t-isvalid.html @@ -0,0 +1,56 @@ + + + + interact-zoom-01-t-manual.svg + + + +

    Source SVG: interact-zoom-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: interact-zoom-01-t.svg,v $ + + + + + + + + + + Test default value of + zoomAndPan attribute. + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/interact-zoom-02-t-isvalid.html b/conformance-checkers/html-svg/interact-zoom-02-t-isvalid.html new file mode 100644 index 00000000000000..29d3fdfd971b18 --- /dev/null +++ b/conformance-checkers/html-svg/interact-zoom-02-t-isvalid.html @@ -0,0 +1,56 @@ + + + + interact-zoom-02-t-manual.svg + + + +

    Source SVG: interact-zoom-02-t-manual.svg

    + + + + + + + + + + + + $RCSfile: interact-zoom-02-t.svg,v $ + + + + + + + + + + Test "magnify" value of + zoomAndPan attribute. + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/interact-zoom-03-t-isvalid.html b/conformance-checkers/html-svg/interact-zoom-03-t-isvalid.html new file mode 100644 index 00000000000000..46f531a32103b9 --- /dev/null +++ b/conformance-checkers/html-svg/interact-zoom-03-t-isvalid.html @@ -0,0 +1,56 @@ + + + + interact-zoom-03-t-manual.svg + + + +

    Source SVG: interact-zoom-03-t-manual.svg

    + + + + + + + + + + + + $RCSfile: interact-zoom-03-t.svg,v $ + + + + + + + + + + + Test "disable" value of + zoomAndPan attribute. + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/linking-a-01-b-isvalid.html b/conformance-checkers/html-svg/linking-a-01-b-isvalid.html new file mode 100644 index 00000000000000..af8c35bea17de8 --- /dev/null +++ b/conformance-checkers/html-svg/linking-a-01-b-isvalid.html @@ -0,0 +1,54 @@ + + + + linking-a-01-b-manual.svg + + + +

    Source SVG: linking-a-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: linking-a-01-b.svg,v $ + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/linking-a-03-b-isvalid.html b/conformance-checkers/html-svg/linking-a-03-b-isvalid.html new file mode 100644 index 00000000000000..c548dd67caae11 --- /dev/null +++ b/conformance-checkers/html-svg/linking-a-03-b-isvalid.html @@ -0,0 +1,54 @@ + + + + linking-a-03-b-manual.svg + + + +

    Source SVG: linking-a-03-b-manual.svg

    + + + + + + + + + + + + $RCSfile: linking-a-03-b.svg,v $ + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/linking-a-04-t-isvalid.html b/conformance-checkers/html-svg/linking-a-04-t-isvalid.html new file mode 100644 index 00000000000000..04352e6cd94c31 --- /dev/null +++ b/conformance-checkers/html-svg/linking-a-04-t-isvalid.html @@ -0,0 +1,65 @@ + + + + linking-a-04-t-manual.svg + + + +

    Source SVG: linking-a-04-t-manual.svg

    + + + + + + + + + + + + $RCSfile: linking-a-04-t.svg,v $ + + + + + + + + + Basic out-bound links and the 'a' element. + + + + + + + + + + + + + + + + + + + + id="internal-circle" + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/linking-a-05-t-isvalid.html b/conformance-checkers/html-svg/linking-a-05-t-isvalid.html new file mode 100644 index 00000000000000..3c0461e5a02f18 --- /dev/null +++ b/conformance-checkers/html-svg/linking-a-05-t-isvalid.html @@ -0,0 +1,71 @@ + + + + linking-a-05-t-manual.svg + + + +

    Source SVG: linking-a-05-t-manual.svg

    + + + + + + + + + + + + $RCSfile: linking-a-05-t.svg,v $ + + + + + + + + + Verify transform attributes in the 'a' element. + + + + + + transform="rotate(20,225,65) + + + + + + + transform="skewX(-30) + + + + + + + + + transform="translate(-10,-20) + + + + id="internal-circle" + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/linking-a-07-t-isvalid.html b/conformance-checkers/html-svg/linking-a-07-t-isvalid.html new file mode 100644 index 00000000000000..8b0288e6957911 --- /dev/null +++ b/conformance-checkers/html-svg/linking-a-07-t-isvalid.html @@ -0,0 +1,75 @@ + + + + linking-a-07-t-manual.svg + + + +

    Source SVG: linking-a-07-t-manual.svg

    + + + + + + + + + + + + $RCSfile: linking-a-07-t.svg,v $ + + + + + + + + + xlink 'show' attribute on 'a' element. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/linking-a-08-t-isvalid.html b/conformance-checkers/html-svg/linking-a-08-t-isvalid.html new file mode 100644 index 00000000000000..a44ee88567ecff --- /dev/null +++ b/conformance-checkers/html-svg/linking-a-08-t-isvalid.html @@ -0,0 +1,52 @@ + + + + linking-a-08-t-manual.svg + + + +

    Source SVG: linking-a-08-t-manual.svg

    + + + + + + + + + + + + $RCSfile: linking-a-08-t.svg,v $ + + + + + + + + + + + Link inside text + + + Link around text + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/linking-a-09-b-novalid.html b/conformance-checkers/html-svg/linking-a-09-b-novalid.html new file mode 100644 index 00000000000000..703f79623c6ee9 --- /dev/null +++ b/conformance-checkers/html-svg/linking-a-09-b-novalid.html @@ -0,0 +1,62 @@ + + + + linking-a-09-b-manual.svg + + + +

    Source SVG: linking-a-09-b-manual.svg

    + + + + + + + + + + + + $RCSfile: linking-a-09-b.svg,v $ + + + + + + + + + + + A + + link + inside tspan + for testing + + + + A + + link + around tspan + + for testing + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/linking-a-10-f-novalid.html b/conformance-checkers/html-svg/linking-a-10-f-novalid.html new file mode 100644 index 00000000000000..17a3a07ef2e7b2 --- /dev/null +++ b/conformance-checkers/html-svg/linking-a-10-f-novalid.html @@ -0,0 +1,77 @@ + + + + linking-a-10-f-manual.svg + + + +

    Source SVG: linking-a-10-f-manual.svg

    + + + + + + + + + + $RCSfile: linking-a-10-f.svg,v $ + + + + + + + + + + + + + + + X + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + diff --git a/conformance-checkers/html-svg/linking-frag-01-f-isvalid.html b/conformance-checkers/html-svg/linking-frag-01-f-isvalid.html new file mode 100644 index 00000000000000..f56810732f8334 --- /dev/null +++ b/conformance-checkers/html-svg/linking-frag-01-f-isvalid.html @@ -0,0 +1,57 @@ + + + + linking-frag-01-f-manual.svg + + + +

    Source SVG: linking-frag-01-f-manual.svg

    + + + + + + + + + + + + $RCSfile: linking-frag-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/linking-uri-01-b-isvalid.html b/conformance-checkers/html-svg/linking-uri-01-b-isvalid.html new file mode 100644 index 00000000000000..0873b286d594e5 --- /dev/null +++ b/conformance-checkers/html-svg/linking-uri-01-b-isvalid.html @@ -0,0 +1,91 @@ + + + + linking-uri-01-b-manual.svg + + + +

    Source SVG: linking-uri-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: linking-uri-01-b.svg,v $ + + + + + + + + + Link test of the 'view' element and its attributes, 1 of 2, internal. + + + + + Go to Rectangle + + + Go to Ellipse + + + Go to Circle + + + Go to Polygon + + Click element's line + to link to its view + + + + + + Rectangle + + No view attributes except id. + + + + Ellipse + + viewBox, should fill frame. + + + + Circle + + viewBox & non-uniform + preserveAspectRatio + + + + Polygon + + viewTarget, no + changes to viewport + + + + $Revision: 1.12 $ + + + + + + + diff --git a/conformance-checkers/html-svg/linking-uri-02-b-isvalid.html b/conformance-checkers/html-svg/linking-uri-02-b-isvalid.html new file mode 100644 index 00000000000000..88f9962ec20334 --- /dev/null +++ b/conformance-checkers/html-svg/linking-uri-02-b-isvalid.html @@ -0,0 +1,96 @@ + + + + linking-uri-02-b-manual.svg + + + +

    Source SVG: linking-uri-02-b-manual.svg

    + + + + + + + + + + + + $RCSfile: linking-uri-02-b.svg,v $ + + + + + + + + + Link test of the 'view' element and its attributes, 2 of 2, external. + + + + + Go to Rectangle + + + Go to Ellipse + + + Go to Circle + + + Go to Polygon + + Click element's line + to link to its view in + linking-uri-01-b. + + + + + + + Rectangle + + No view attributes except id. + + + + + Ellipse + + viewBox, should fill frame. + + + + + Circle + + viewBox & non-uniform + preserveAspectRatio + + + + + Polygon + + viewTarget, no + changes to viewport + + + + $Revision: 1.10 $ + + + + + + + diff --git a/conformance-checkers/html-svg/linking-uri-03-t-isvalid.html b/conformance-checkers/html-svg/linking-uri-03-t-isvalid.html new file mode 100644 index 00000000000000..778fa719d3f4da --- /dev/null +++ b/conformance-checkers/html-svg/linking-uri-03-t-isvalid.html @@ -0,0 +1,59 @@ + + + + linking-uri-03-t-manual.svg + + + +

    Source SVG: linking-uri-03-t-manual.svg

    + + + + + + + + + + + + $RCSfile: linking-uri-03-t.svg,v $ + + + + + + + + + Simple exercise of xlink attributes on the 'a' element. + + + + Click for TOC + Link to local file + linkingToc-t.svg. + + xlink:type="simple" + xlink:show="replace" + xlink:actuate="onRequest" + xlink:href="linkingToc-t.svg" + xlink:role="figure-out-a-role" + xlink:title="TOC of Linking BE tests." + target="_self" + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/masking-filter-01-f-novalid.html b/conformance-checkers/html-svg/masking-filter-01-f-novalid.html new file mode 100644 index 00000000000000..1c143f955fa6ef --- /dev/null +++ b/conformance-checkers/html-svg/masking-filter-01-f-novalid.html @@ -0,0 +1,64 @@ + + + + masking-filter-01-f-manual.svg + + + +

    Source SVG: masking-filter-01-f-manual.svg

    + + + + + + + + + + + + $RCSfile: masking-filter-01-f.svg,v $ + + + + + + + + + + Testing 'filter' applied to 'mask' + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/masking-intro-01-f-novalid.html b/conformance-checkers/html-svg/masking-intro-01-f-novalid.html new file mode 100644 index 00000000000000..51834cd161f4f5 --- /dev/null +++ b/conformance-checkers/html-svg/masking-intro-01-f-novalid.html @@ -0,0 +1,69 @@ + + + + masking-intro-01-f-manual.svg + + + +

    Source SVG: masking-intro-01-f-manual.svg

    + + + + + + + + + + + + $RCSfile: masking-intro-01-f.svg,v $ + + + + + + + + + + masking-mask-04-f.svg + Tests the impact of strokes within clipPath and mask + Testing stroke inclusion for 'clip-path' and 'mask' + + + + + + + + + + With a 'clip-path': + + + + + + + + + + With a 'mask': + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/masking-mask-01-b-isvalid.html b/conformance-checkers/html-svg/masking-mask-01-b-isvalid.html new file mode 100644 index 00000000000000..23590f257b530d --- /dev/null +++ b/conformance-checkers/html-svg/masking-mask-01-b-isvalid.html @@ -0,0 +1,98 @@ + + + + masking-mask-01-b-manual.svg + + + +

    Source SVG: masking-mask-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: masking-mask-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + Test for mask support + + + + + + + + + + + + + + Mask with linear gradient from + opacity=1 to opactity=0.5 + + + + + + Mask with uniform opacity of 0.5 + + + Rectangle with uniform opacity of 0.5 + + + + + + + + SVG + Text with mask containing rectangles + of various opacities + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/masking-mask-02-f-isvalid.html b/conformance-checkers/html-svg/masking-mask-02-f-isvalid.html new file mode 100644 index 00000000000000..930e9a91526402 --- /dev/null +++ b/conformance-checkers/html-svg/masking-mask-02-f-isvalid.html @@ -0,0 +1,45 @@ + + + + masking-mask-02-f-manual.svg + + + +

    Source SVG: masking-mask-02-f-manual.svg

    + + + + + + + + + + $RCSfile: masking-mask-02-f.svg,v $ + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + diff --git a/conformance-checkers/html-svg/masking-opacity-01-b-isvalid.html b/conformance-checkers/html-svg/masking-opacity-01-b-isvalid.html new file mode 100644 index 00000000000000..be156f600e57aa --- /dev/null +++ b/conformance-checkers/html-svg/masking-opacity-01-b-isvalid.html @@ -0,0 +1,74 @@ + + + + masking-opacity-01-b-manual.svg + + + +

    Source SVG: masking-opacity-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: masking-opacity-01-b.svg,v $ + + + + + + + + + Test for opacity property on a group. + + + + + + Group opacity: 1 + Blue rectangle opacity: 1 + Green rectangle opacity: 1 + + + + + Group opacity: 0.5 + Blue rectangle opacity: 1 + Green rectangle opacity: 1 + + + + + Group opacity: 1 + Blue rectangle opacity: 0.5 + Green rectangle opacity: 0.5 + + + + + Group opacity: 0.5 + Blue rectangle opacity: 0.5 + Green rectangle opacity: 0.5 + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/masking-path-01-b-isvalid.html b/conformance-checkers/html-svg/masking-path-01-b-isvalid.html new file mode 100644 index 00000000000000..c8a675c9f415f6 --- /dev/null +++ b/conformance-checkers/html-svg/masking-path-01-b-isvalid.html @@ -0,0 +1,69 @@ + + + + masking-path-01-b-manual.svg + + + +

    Source SVG: masking-path-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: masking-path-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + Rectangle being clipped + + + + Line of text to be clipped + + Group being clipped + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/masking-path-02-b-isvalid.html b/conformance-checkers/html-svg/masking-path-02-b-isvalid.html new file mode 100644 index 00000000000000..9110dacef2db6a --- /dev/null +++ b/conformance-checkers/html-svg/masking-path-02-b-isvalid.html @@ -0,0 +1,58 @@ + + + + masking-path-02-b-manual.svg + + + +

    Source SVG: masking-path-02-b-manual.svg

    + + + + + + + + + + + + $RCSfile: masking-path-02-b.svg,v $ + + + + + + + + + + + + + + + clipPathUnits=objectBoundingBox + + + + + + clipPathUnits=userSpaceOnUse + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/masking-path-03-b-isvalid.html b/conformance-checkers/html-svg/masking-path-03-b-isvalid.html new file mode 100644 index 00000000000000..55033509f75636 --- /dev/null +++ b/conformance-checkers/html-svg/masking-path-03-b-isvalid.html @@ -0,0 +1,91 @@ + + + + masking-path-03-b-manual.svg + + + +

    Source SVG: masking-path-03-b-manual.svg

    + + + + + + + + + + + + $RCSfile: masking-path-03-b.svg,v $ + + + + + + + + + + + Test 'overflow'/'clip' on outermost and inner 'svg' elements + + + + + Outer Clip + + + + Outer Clip + + + + Outer Clip + + + + Outer Clip + + + + + + + + + Inner Clip + + + + Inner Clip + + + + Inner Clip + + + + Inner Clip + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/masking-path-04-b-isvalid.html b/conformance-checkers/html-svg/masking-path-04-b-isvalid.html new file mode 100644 index 00000000000000..ed4bd15a70b540 --- /dev/null +++ b/conformance-checkers/html-svg/masking-path-04-b-isvalid.html @@ -0,0 +1,59 @@ + + + + masking-path-04-b-manual.svg + + + +

    Source SVG: masking-path-04-b-manual.svg

    + + + + + + + + + + + + $RCSfile: masking-path-04-b.svg,v $ + + + + + + + + + + + + Clip Test + + + + + + Clip Test + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/masking-path-05-f-isvalid.html b/conformance-checkers/html-svg/masking-path-05-f-isvalid.html new file mode 100644 index 00000000000000..f792a39f036053 --- /dev/null +++ b/conformance-checkers/html-svg/masking-path-05-f-isvalid.html @@ -0,0 +1,57 @@ + + + + masking-path-05-f-manual.svg + + + +

    Source SVG: masking-path-05-f-manual.svg

    + + + + + + + + + + + + $RCSfile: masking-path-05-f.svg,v $ + + + + + + + + + + Test for clip-rule property. + + + + + clip-rule=evenodd + + + + + cliprule=nonzero + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/masking-path-06-b-isvalid.html b/conformance-checkers/html-svg/masking-path-06-b-isvalid.html new file mode 100644 index 00000000000000..d71f8d54235ccc --- /dev/null +++ b/conformance-checkers/html-svg/masking-path-06-b-isvalid.html @@ -0,0 +1,57 @@ + + + + masking-path-06-b-manual.svg + + + +

    Source SVG: masking-path-06-b-manual.svg

    + + + + + + + + + + + + $RCSfile: masking-path-06-b.svg,v $ + + + + + + + + + + 'clip' property on images + + + + + <-- raster image + + + + + SVG image --> + + + + $Revision: 1.8 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/masking-path-07-b-isvalid.html b/conformance-checkers/html-svg/masking-path-07-b-isvalid.html new file mode 100644 index 00000000000000..0412497f072b1f --- /dev/null +++ b/conformance-checkers/html-svg/masking-path-07-b-isvalid.html @@ -0,0 +1,117 @@ + + + + masking-path-07-b-manual.svg + + + +

    Source SVG: masking-path-07-b-manual.svg

    + + + + + + + + + + + + $RCSfile: masking-path-07-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test clip unions and intersections + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.11 $ + + + + + + diff --git a/conformance-checkers/html-svg/masking-path-08-b-isvalid.html b/conformance-checkers/html-svg/masking-path-08-b-isvalid.html new file mode 100644 index 00000000000000..05816c0d3715a5 --- /dev/null +++ b/conformance-checkers/html-svg/masking-path-08-b-isvalid.html @@ -0,0 +1,125 @@ + + + + masking-path-08-b-manual.svg + + + +

    Source SVG: masking-path-08-b-manual.svg

    + + + + + + + + + + $RCSfile: masking-path-08-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Establishing a new clipping path + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + diff --git a/conformance-checkers/html-svg/masking-path-09-b-novalid.html b/conformance-checkers/html-svg/masking-path-09-b-novalid.html new file mode 100644 index 00000000000000..d6f44374479e3b --- /dev/null +++ b/conformance-checkers/html-svg/masking-path-09-b-novalid.html @@ -0,0 +1,63 @@ + + + + masking-path-09-b-manual.svg + + + +

    Source SVG: masking-path-09-b-manual.svg

    + + + + + + + + + + $RCSfile: masking-path-09-b.svg,v $ + + + + + + + + + + Test bounding box calculations with clip paths + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + diff --git a/conformance-checkers/html-svg/masking-path-10-b-isvalid.html b/conformance-checkers/html-svg/masking-path-10-b-isvalid.html new file mode 100644 index 00000000000000..085bf66b3d5d97 --- /dev/null +++ b/conformance-checkers/html-svg/masking-path-10-b-isvalid.html @@ -0,0 +1,123 @@ + + + + masking-path-10-b-manual.svg + + + +

    Source SVG: masking-path-10-b-manual.svg

    + + + + + + + + + + $RCSfile: masking-path-10-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Establishing a new masking path + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + + diff --git a/conformance-checkers/html-svg/masking-path-11-b-isvalid.html b/conformance-checkers/html-svg/masking-path-11-b-isvalid.html new file mode 100644 index 00000000000000..40effffb20f144 --- /dev/null +++ b/conformance-checkers/html-svg/masking-path-11-b-isvalid.html @@ -0,0 +1,56 @@ + + + + masking-path-11-b-manual.svg + + + +

    Source SVG: masking-path-11-b-manual.svg

    + + + + + + + + + + $RCSfile: masking-path-11-b.svg,v $ + + + + + + + + + + + + + ABC + + + + + + + + + $Revision: 1.4 $ + + + + + + diff --git a/conformance-checkers/html-svg/masking-path-12-f-isvalid.html b/conformance-checkers/html-svg/masking-path-12-f-isvalid.html new file mode 100644 index 00000000000000..6cf14af1c2e645 --- /dev/null +++ b/conformance-checkers/html-svg/masking-path-12-f-isvalid.html @@ -0,0 +1,73 @@ + + + + masking-path-12-f-manual.svg + + + +

    Source SVG: masking-path-12-f-manual.svg

    + + + + + + + + + + + + $RCSfile: masking-path-12-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + diff --git a/conformance-checkers/html-svg/masking-path-13-f-isvalid.html b/conformance-checkers/html-svg/masking-path-13-f-isvalid.html new file mode 100644 index 00000000000000..42955237929f81 --- /dev/null +++ b/conformance-checkers/html-svg/masking-path-13-f-isvalid.html @@ -0,0 +1,50 @@ + + + + masking-path-13-f-manual.svg + + + +

    Source SVG: masking-path-13-f-manual.svg

    + + + + + + + + + + + + $RCSfile: masking-path-13-f.svg,v $ + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + diff --git a/conformance-checkers/html-svg/masking-path-14-f-isvalid.html b/conformance-checkers/html-svg/masking-path-14-f-isvalid.html new file mode 100644 index 00000000000000..aeac28c46bc733 --- /dev/null +++ b/conformance-checkers/html-svg/masking-path-14-f-isvalid.html @@ -0,0 +1,62 @@ + + + + masking-path-14-f-manual.svg + + + +

    Source SVG: masking-path-14-f-manual.svg

    + + + + + + + + + + + + $RCSfile: masking-path-14-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + diff --git a/conformance-checkers/html-svg/metadata-example-01-t-novalid.html b/conformance-checkers/html-svg/metadata-example-01-t-novalid.html new file mode 100644 index 00000000000000..6339d524d94496 --- /dev/null +++ b/conformance-checkers/html-svg/metadata-example-01-t-novalid.html @@ -0,0 +1,147 @@ + + + + metadata-example-01-t-manual.svg + + + +

    Source SVG: metadata-example-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: metadata-example-01-t.svg,v $ + + + + + + + + + + + + + Line drawing of woman in antique attire, + which looks legal or perhaps mystical. + image/svg+xml + Sibyll Trelawney + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + http://prismstandard.org/vocabularies/1.0/resourcetype.xml#birdsEye + http://prismstandard.org/vocabularies/1.0/resourcetype.xml#illustration + image/svg+xml + Line drawing of woman in antique attire, ... + online: + Sibyll Trelawney + + + http://purl.org/dc/elements/1.1/type + http://purl.org/dc/elements/1.1/format + http://purl.org/dc/elements/1.1/subject + http://purl.org/dc/elements/1.1/type + http://purl.org/dc/elements/1.1/description + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-control-01-f-isvalid.html b/conformance-checkers/html-svg/painting-control-01-f-isvalid.html new file mode 100644 index 00000000000000..b3c1240bfbe5cb --- /dev/null +++ b/conformance-checkers/html-svg/painting-control-01-f-isvalid.html @@ -0,0 +1,94 @@ + + + + painting-control-01-f-manual.svg + + + +

    Source SVG: painting-control-01-f-manual.svg

    + + + + + + + + + + $RCSfile: painting-control-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + diff --git a/conformance-checkers/html-svg/painting-control-02-f-isvalid.html b/conformance-checkers/html-svg/painting-control-02-f-isvalid.html new file mode 100644 index 00000000000000..a44dfd189cf3c1 --- /dev/null +++ b/conformance-checkers/html-svg/painting-control-02-f-isvalid.html @@ -0,0 +1,52 @@ + + + + painting-control-02-f-manual.svg + + + +

    Source SVG: painting-control-02-f-manual.svg

    + + + + + + + + + + $RCSfile: painting-control-02-f.svg,v $ + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/painting-control-03-f-isvalid.html b/conformance-checkers/html-svg/painting-control-03-f-isvalid.html new file mode 100644 index 00000000000000..9cd40e1238daf0 --- /dev/null +++ b/conformance-checkers/html-svg/painting-control-03-f-isvalid.html @@ -0,0 +1,52 @@ + + + + painting-control-03-f-manual.svg + + + +

    Source SVG: painting-control-03-f-manual.svg

    + + + + + + + + + + $RCSfile: painting-control-03-f.svg,v $ + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + diff --git a/conformance-checkers/html-svg/painting-control-04-f-isvalid.html b/conformance-checkers/html-svg/painting-control-04-f-isvalid.html new file mode 100644 index 00000000000000..f4d3faa9c2084a --- /dev/null +++ b/conformance-checkers/html-svg/painting-control-04-f-isvalid.html @@ -0,0 +1,50 @@ + + + + painting-control-04-f-manual.svg + + + +

    Source SVG: painting-control-04-f-manual.svg

    + + + + + + + + + + $RCSfile: painting-control-04-f.svg,v $ + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + diff --git a/conformance-checkers/html-svg/painting-control-05-f-isvalid.html b/conformance-checkers/html-svg/painting-control-05-f-isvalid.html new file mode 100644 index 00000000000000..78e538fd333237 --- /dev/null +++ b/conformance-checkers/html-svg/painting-control-05-f-isvalid.html @@ -0,0 +1,107 @@ + + + + painting-control-05-f-manual.svg + + + +

    Source SVG: painting-control-05-f-manual.svg

    + + + + + + + + + + $RCSfile: painting-control-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-control-06-f-isvalid.html b/conformance-checkers/html-svg/painting-control-06-f-isvalid.html new file mode 100644 index 00000000000000..1b2a2eaaf015ca --- /dev/null +++ b/conformance-checkers/html-svg/painting-control-06-f-isvalid.html @@ -0,0 +1,52 @@ + + + + painting-control-06-f-manual.svg + + + +

    Source SVG: painting-control-06-f-manual.svg

    + + + + + + + + + + $RCSfile: painting-control-06-f.svg,v $ + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-fill-01-t-isvalid.html b/conformance-checkers/html-svg/painting-fill-01-t-isvalid.html new file mode 100644 index 00000000000000..eb75daaf03e1be --- /dev/null +++ b/conformance-checkers/html-svg/painting-fill-01-t-isvalid.html @@ -0,0 +1,56 @@ + + + + painting-fill-01-t-manual.svg + + + +

    Source SVG: painting-fill-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-fill-01-t.svg,v $ + + + + + + + + + Basic paint: fill properties. + + + + + + + + + + fill="none" + fill="green" + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-fill-02-t-isvalid.html b/conformance-checkers/html-svg/painting-fill-02-t-isvalid.html new file mode 100644 index 00000000000000..f5221bb921e347 --- /dev/null +++ b/conformance-checkers/html-svg/painting-fill-02-t-isvalid.html @@ -0,0 +1,60 @@ + + + + painting-fill-02-t-manual.svg + + + +

    Source SVG: painting-fill-02-t-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-fill-02-t.svg,v $ + + + + + + + + + + + Basic paint: fill properties. + fill="currentColor" + + + + + + + + + green + blue + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-fill-03-t-isvalid.html b/conformance-checkers/html-svg/painting-fill-03-t-isvalid.html new file mode 100644 index 00000000000000..efba8a992b9b9d --- /dev/null +++ b/conformance-checkers/html-svg/painting-fill-03-t-isvalid.html @@ -0,0 +1,54 @@ + + + + painting-fill-03-t-manual.svg + + + +

    Source SVG: painting-fill-03-t-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-fill-03-t.svg,v $ + + + + + + + + + Basic paint: fill properties. + + + + + + + + fill-rule="evenodd" + fill-rule="nonzero" + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-fill-04-t-isvalid.html b/conformance-checkers/html-svg/painting-fill-04-t-isvalid.html new file mode 100644 index 00000000000000..54974d263f4bf3 --- /dev/null +++ b/conformance-checkers/html-svg/painting-fill-04-t-isvalid.html @@ -0,0 +1,54 @@ + + + + painting-fill-04-t-manual.svg + + + +

    Source SVG: painting-fill-04-t-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-fill-04-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-fill-05-b-isvalid.html b/conformance-checkers/html-svg/painting-fill-05-b-isvalid.html new file mode 100644 index 00000000000000..e81b09aa95508e --- /dev/null +++ b/conformance-checkers/html-svg/painting-fill-05-b-isvalid.html @@ -0,0 +1,60 @@ + + + + painting-fill-05-b-manual.svg + + + +

    Source SVG: painting-fill-05-b-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-fill-05-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-marker-01-f-isvalid.html b/conformance-checkers/html-svg/painting-marker-01-f-isvalid.html new file mode 100644 index 00000000000000..9ae06cc9fe80f8 --- /dev/null +++ b/conformance-checkers/html-svg/painting-marker-01-f-isvalid.html @@ -0,0 +1,124 @@ + + + + painting-marker-01-f-manual.svg + + + +

    Source SVG: painting-marker-01-f-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-marker-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Basic Markers + + + + + + + + + + + + + + + + + + + + Start, Middle and End + + + + + + + + + + + + + + + + + + + + Automatic Orientation + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-marker-02-f-isvalid.html b/conformance-checkers/html-svg/painting-marker-02-f-isvalid.html new file mode 100644 index 00000000000000..2aee5884741cbf --- /dev/null +++ b/conformance-checkers/html-svg/painting-marker-02-f-isvalid.html @@ -0,0 +1,212 @@ + + + + painting-marker-02-f-manual.svg + + + +

    Source SVG: painting-marker-02-f-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-marker-02-f.svg,v $ + + + + + + + + + + + + + + + + + + Marker Rendering Properties + + + + + + + + Fill Property + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Stroke Property + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mixed Properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mixed Properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-marker-03-f-isvalid.html b/conformance-checkers/html-svg/painting-marker-03-f-isvalid.html new file mode 100644 index 00000000000000..0c73e6d0e9756a --- /dev/null +++ b/conformance-checkers/html-svg/painting-marker-03-f-isvalid.html @@ -0,0 +1,75 @@ + + + + painting-marker-03-f-manual.svg + + + +

    Source SVG: painting-marker-03-f-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-marker-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + 'marker' property test + + 'marker' property + + + + + + + + + 'marker-start', 'marker-mid' & 'marker-end' attribute + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-marker-04-f-novalid.html b/conformance-checkers/html-svg/painting-marker-04-f-novalid.html new file mode 100644 index 00000000000000..c250a36dd7066a --- /dev/null +++ b/conformance-checkers/html-svg/painting-marker-04-f-novalid.html @@ -0,0 +1,72 @@ + + + + painting-marker-04-f-manual.svg + + + +

    Source SVG: painting-marker-04-f-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-marker-04-f.svg,v $ + + + + + + + + + + + + + + + + + + 'marker' attribute test + + 'marker' attribute + + + + + + + + + 'marker-start', 'marker-mid' & 'marker-end' attributes + + + + + + + + + + $Revision: 1.7 $ + + + + + + diff --git a/conformance-checkers/html-svg/painting-marker-05-f-isvalid.html b/conformance-checkers/html-svg/painting-marker-05-f-isvalid.html new file mode 100644 index 00000000000000..0180187137c8fa --- /dev/null +++ b/conformance-checkers/html-svg/painting-marker-05-f-isvalid.html @@ -0,0 +1,221 @@ + + + + painting-marker-05-f-manual.svg + + + +

    Source SVG: painting-marker-05-f-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-marker-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test marker overflow + + + default + 'visible' + 'auto' + 'scroll' + 'hidden' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-marker-06-f-isvalid.html b/conformance-checkers/html-svg/painting-marker-06-f-isvalid.html new file mode 100644 index 00000000000000..8f273c05c28bac --- /dev/null +++ b/conformance-checkers/html-svg/painting-marker-06-f-isvalid.html @@ -0,0 +1,125 @@ + + + + painting-marker-06-f-manual.svg + + + +

    Source SVG: painting-marker-06-f-manual.svg

    + + + + + + + + + + $RCSfile: painting-marker-06-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Basic Markers + + + + + + + + + + + + + + + + + + + + Start, Middle and End + + + + + + + + + + + + + + + + + + + + Automatic Orientation + + + + + + + + + + + + + + + + + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-marker-07-f-isvalid.html b/conformance-checkers/html-svg/painting-marker-07-f-isvalid.html new file mode 100644 index 00000000000000..c389e9b332a189 --- /dev/null +++ b/conformance-checkers/html-svg/painting-marker-07-f-isvalid.html @@ -0,0 +1,58 @@ + + + + painting-marker-07-f-manual.svg + + + +

    Source SVG: painting-marker-07-f-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-marker-07-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/painting-marker-properties-01-f-isvalid.html b/conformance-checkers/html-svg/painting-marker-properties-01-f-isvalid.html new file mode 100644 index 00000000000000..6781359b25f6f7 --- /dev/null +++ b/conformance-checkers/html-svg/painting-marker-properties-01-f-isvalid.html @@ -0,0 +1,80 @@ + + + + painting-marker-properties-01-f-manual.svg + + + +

    Source SVG: painting-marker-properties-01-f-manual.svg

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/painting-render-01-b-isvalid.html b/conformance-checkers/html-svg/painting-render-01-b-isvalid.html new file mode 100644 index 00000000000000..1b336f26106b3b --- /dev/null +++ b/conformance-checkers/html-svg/painting-render-01-b-isvalid.html @@ -0,0 +1,128 @@ + + + + painting-render-01-b-manual.svg + + + +

    Source SVG: painting-render-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-render-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Basic test of color-interpolation property. + + + + + + + + + + + + + + + + + + + + default (sRGB) + + + + + + + + + + + + + + + + + + + + + sRGB + + + + + + + + + + + + + + + + + + + + + linearRGB + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-render-02-b-isvalid.html b/conformance-checkers/html-svg/painting-render-02-b-isvalid.html new file mode 100644 index 00000000000000..7c38d72e6f8ccf --- /dev/null +++ b/conformance-checkers/html-svg/painting-render-02-b-isvalid.html @@ -0,0 +1,72 @@ + + + + painting-render-02-b-manual.svg + + + +

    Source SVG: painting-render-02-b-manual.svg

    + + + + + + + + + + $RCSfile: painting-render-02-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + dark + light + dark + light + dark + dark or light + light + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-stroke-01-t-isvalid.html b/conformance-checkers/html-svg/painting-stroke-01-t-isvalid.html new file mode 100644 index 00000000000000..b117fc494cbeb6 --- /dev/null +++ b/conformance-checkers/html-svg/painting-stroke-01-t-isvalid.html @@ -0,0 +1,52 @@ + + + + painting-stroke-01-t-manual.svg + + + +

    Source SVG: painting-stroke-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-stroke-01-t.svg,v $ + + + + + + + + + + + + Basic paint: stroke properties. + + + stroke="none" + stroke="green" + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-stroke-02-t-isvalid.html b/conformance-checkers/html-svg/painting-stroke-02-t-isvalid.html new file mode 100644 index 00000000000000..823669d1a9911b --- /dev/null +++ b/conformance-checkers/html-svg/painting-stroke-02-t-isvalid.html @@ -0,0 +1,52 @@ + + + + painting-stroke-02-t-manual.svg + + + +

    Source SVG: painting-stroke-02-t-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-stroke-02-t.svg,v $ + + + + + + + + + + + + Basic paint: stroke properties. + + + stroke-width="20" + stroke-linejoin="round" + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-stroke-03-t-isvalid.html b/conformance-checkers/html-svg/painting-stroke-03-t-isvalid.html new file mode 100644 index 00000000000000..39a2f363064638 --- /dev/null +++ b/conformance-checkers/html-svg/painting-stroke-03-t-isvalid.html @@ -0,0 +1,52 @@ + + + + painting-stroke-03-t-manual.svg + + + +

    Source SVG: painting-stroke-03-t-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-stroke-03-t.svg,v $ + + + + + + + + + + + + Basic paint: stroke properties. + + + stroke-linecap="round" + stroke-miterlimit="1" + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-stroke-04-t-isvalid.html b/conformance-checkers/html-svg/painting-stroke-04-t-isvalid.html new file mode 100644 index 00000000000000..cf9b06fbc9bc67 --- /dev/null +++ b/conformance-checkers/html-svg/painting-stroke-04-t-isvalid.html @@ -0,0 +1,52 @@ + + + + painting-stroke-04-t-manual.svg + + + +

    Source SVG: painting-stroke-04-t-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-stroke-04-t.svg,v $ + + + + + + + + + + + + Basic paint: stroke properties. + + + stroke-dasharray="10, 10" + stroke-dashoffset="10" + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-stroke-05-t-isvalid.html b/conformance-checkers/html-svg/painting-stroke-05-t-isvalid.html new file mode 100644 index 00000000000000..78ff685cf82d3f --- /dev/null +++ b/conformance-checkers/html-svg/painting-stroke-05-t-isvalid.html @@ -0,0 +1,73 @@ + + + + painting-stroke-05-t-manual.svg + + + +

    Source SVG: painting-stroke-05-t-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-stroke-05-t.svg,v $ + + + + + + + + + Rendering thin strokes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-stroke-06-t-isvalid.html b/conformance-checkers/html-svg/painting-stroke-06-t-isvalid.html new file mode 100644 index 00000000000000..6c59096b2ac223 --- /dev/null +++ b/conformance-checkers/html-svg/painting-stroke-06-t-isvalid.html @@ -0,0 +1,60 @@ + + + + painting-stroke-06-t-manual.svg + + + +

    Source SVG: painting-stroke-06-t-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-stroke-06-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-stroke-07-t-isvalid.html b/conformance-checkers/html-svg/painting-stroke-07-t-isvalid.html new file mode 100644 index 00000000000000..8eecdec1b3e511 --- /dev/null +++ b/conformance-checkers/html-svg/painting-stroke-07-t-isvalid.html @@ -0,0 +1,54 @@ + + + + painting-stroke-07-t-manual.svg + + + +

    Source SVG: painting-stroke-07-t-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-stroke-07-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/painting-stroke-08-t-isvalid.html b/conformance-checkers/html-svg/painting-stroke-08-t-isvalid.html new file mode 100644 index 00000000000000..01cbd305152f5d --- /dev/null +++ b/conformance-checkers/html-svg/painting-stroke-08-t-isvalid.html @@ -0,0 +1,68 @@ + + + + painting-stroke-08-t-manual.svg + + + +

    Source SVG: painting-stroke-08-t-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-stroke-08-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + diff --git a/conformance-checkers/html-svg/painting-stroke-09-t-isvalid.html b/conformance-checkers/html-svg/painting-stroke-09-t-isvalid.html new file mode 100644 index 00000000000000..7f623f8ea6e548 --- /dev/null +++ b/conformance-checkers/html-svg/painting-stroke-09-t-isvalid.html @@ -0,0 +1,48 @@ + + + + painting-stroke-09-t-manual.svg + + + +

    Source SVG: painting-stroke-09-t-manual.svg

    + + + + + + + + + + + + $RCSfile: painting-stroke-09-t.svg,v $ + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + diff --git a/conformance-checkers/html-svg/painting-stroke-10-t-isvalid.html b/conformance-checkers/html-svg/painting-stroke-10-t-isvalid.html new file mode 100644 index 00000000000000..3900e4f2944472 --- /dev/null +++ b/conformance-checkers/html-svg/painting-stroke-10-t-isvalid.html @@ -0,0 +1,63 @@ + + + + painting-stroke-10-t-manual.svg + + + +

    Source SVG: painting-stroke-10-t-manual.svg

    + + + + + + + + + + $RCSfile: painting-stroke-10-t.svg,v $ + + + + + + + + + + Test stroking of zero length subpaths + + + + + + + + + + + + + Using an 'L' command: + Using a 'c' command: + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/paths-data-01-t-isvalid.html b/conformance-checkers/html-svg/paths-data-01-t-isvalid.html new file mode 100644 index 00000000000000..6c7c7dcfddc62a --- /dev/null +++ b/conformance-checkers/html-svg/paths-data-01-t-isvalid.html @@ -0,0 +1,135 @@ + + + + paths-data-01-t-manual.svg + + + +

    Source SVG: paths-data-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: paths-data-01-t.svg,v $ + + + + + + + + + + + + Cubic bezier curves drawn with commands: + + + + + + + + + + + M, C, S, m, c, s + + + + + + + + + + + + M, c, c, c, C, z + + + + + + + + + + M, C, Z + + + + + + + + + + + M, C, c, Z + + + + + + + + + + + m, c, s + + + + + + + + + + M, C + + + + + + + + + + + + M, c, s, s, s, z + + + + + + + + + + m, c, z + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/paths-data-02-t-isvalid.html b/conformance-checkers/html-svg/paths-data-02-t-isvalid.html new file mode 100644 index 00000000000000..447cc441e7fc47 --- /dev/null +++ b/conformance-checkers/html-svg/paths-data-02-t-isvalid.html @@ -0,0 +1,108 @@ + + + + paths-data-02-t-manual.svg + + + +

    Source SVG: paths-data-02-t-manual.svg

    + + + + + + + + + + + + $RCSfile: paths-data-02-t.svg,v $ + + + + + + + + + Quadric bezier curves drawn with commands: + + + + + M, Q, M, q, z + + + + + + + + + m, q, z, m, q, z + + + + + + + + + M, Q, Z + + + + + + + M, Q, T, Q, z + + + + + + + + + M, Q, Q, z + + + + + + + + M, q, t, t, t, t, z + + + + + + + + + + + M, q, Q, q, Q, z + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/paths-data-03-f-isvalid.html b/conformance-checkers/html-svg/paths-data-03-f-isvalid.html new file mode 100644 index 00000000000000..e3fe48031c4ddf --- /dev/null +++ b/conformance-checkers/html-svg/paths-data-03-f-isvalid.html @@ -0,0 +1,97 @@ + + + + paths-data-03-f-manual.svg + + + +

    Source SVG: paths-data-03-f-manual.svg

    + + + + + + + + + + + + $RCSfile: paths-data-03-f.svg,v $ + + + + + + + + + Elliptical arc curves drawn with commands: + + + + + M, A, Z + + + + + + + m, a, z + + + + + + + M, a + + + + + + + M, A, a, a, z + + + + + + + + + M, a, Z, m, A, Z, m, a, z + + + + + + + + + + + M, A, A, A, A + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/paths-data-04-t-isvalid.html b/conformance-checkers/html-svg/paths-data-04-t-isvalid.html new file mode 100644 index 00000000000000..5ffd91862ef8cd --- /dev/null +++ b/conformance-checkers/html-svg/paths-data-04-t-isvalid.html @@ -0,0 +1,69 @@ + + + + paths-data-04-t-manual.svg + + + +

    Source SVG: paths-data-04-t-manual.svg

    + + + + + + + + + + + + $RCSfile: paths-data-04-t.svg,v $ + + + + + + + + + + + + + + M, L, L, L, Z, + subpath + M, L, L, L, Z + + + + + + + + stroked + + + + + + + + filled + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/paths-data-05-t-isvalid.html b/conformance-checkers/html-svg/paths-data-05-t-isvalid.html new file mode 100644 index 00000000000000..239171011f423b --- /dev/null +++ b/conformance-checkers/html-svg/paths-data-05-t-isvalid.html @@ -0,0 +1,66 @@ + + + + paths-data-05-t-manual.svg + + + +

    Source SVG: paths-data-05-t-manual.svg

    + + + + + + + + + + + + $RCSfile: paths-data-05-t.svg,v $ + + + + + + + + + + + + + m, l, l, l, z, + subpath + m, l, l, l, z + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/paths-data-06-t-isvalid.html b/conformance-checkers/html-svg/paths-data-06-t-isvalid.html new file mode 100644 index 00000000000000..ee909bb871db6c --- /dev/null +++ b/conformance-checkers/html-svg/paths-data-06-t-isvalid.html @@ -0,0 +1,71 @@ + + + + paths-data-06-t-manual.svg + + + +

    Source SVG: paths-data-06-t-manual.svg

    + + + + + + + + + + + + $RCSfile: paths-data-06-t.svg,v $ + + + + + + + + + + + + + M, H, V, H, + V. H, V, H, + V, Z + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/paths-data-07-t-isvalid.html b/conformance-checkers/html-svg/paths-data-07-t-isvalid.html new file mode 100644 index 00000000000000..8a4ca054dca73a --- /dev/null +++ b/conformance-checkers/html-svg/paths-data-07-t-isvalid.html @@ -0,0 +1,70 @@ + + + + paths-data-07-t-manual.svg + + + +

    Source SVG: paths-data-07-t-manual.svg

    + + + + + + + + + + + + $RCSfile: paths-data-07-t.svg,v $ + + + + + + + + + + + + + m, h, v, h + v, h, v, h + v, z + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/paths-data-08-t-isvalid.html b/conformance-checkers/html-svg/paths-data-08-t-isvalid.html new file mode 100644 index 00000000000000..5d2e719802d689 --- /dev/null +++ b/conformance-checkers/html-svg/paths-data-08-t-isvalid.html @@ -0,0 +1,68 @@ + + + + paths-data-08-t-manual.svg + + + +

    Source SVG: paths-data-08-t-manual.svg

    + + + + + + + + + + + + $RCSfile: paths-data-08-t.svg,v $ + + + + + + + + + + + + Lines drawn with commands: + M and Z + + + + + + + + + + stroked + + + + + + + + filled + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/paths-data-09-t-isvalid.html b/conformance-checkers/html-svg/paths-data-09-t-isvalid.html new file mode 100644 index 00000000000000..f3fc4d153921b3 --- /dev/null +++ b/conformance-checkers/html-svg/paths-data-09-t-isvalid.html @@ -0,0 +1,65 @@ + + + + paths-data-09-t-manual.svg + + + +

    Source SVG: paths-data-09-t-manual.svg

    + + + + + + + + + + + + $RCSfile: paths-data-09-t.svg,v $ + + + + + + + + + + + + Lines drawn with commands: + m and z + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/paths-data-10-t-isvalid.html b/conformance-checkers/html-svg/paths-data-10-t-isvalid.html new file mode 100644 index 00000000000000..b64ddcd940ead0 --- /dev/null +++ b/conformance-checkers/html-svg/paths-data-10-t-isvalid.html @@ -0,0 +1,98 @@ + + + + paths-data-10-t-manual.svg + + + +

    Source SVG: paths-data-10-t-manual.svg

    + + + + + + + + + + + + $RCSfile: paths-data-10-t.svg,v $ + + + + + + + + + + open + join=round + cap=butt + M, L + + + + + + open + join=bevel + cap=round + m, l + + + + + + open + join=miter + cap=square + M, L + + + + + + closed + join=round + cap=butt + M, L, Z + + + + + + closed + join=bevel + cap=round + m, l, z + + + + + + closed + join=miter + cap=square + M, L, Z + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/paths-data-12-t-isvalid.html b/conformance-checkers/html-svg/paths-data-12-t-isvalid.html new file mode 100644 index 00000000000000..20d8f0b96f7344 --- /dev/null +++ b/conformance-checkers/html-svg/paths-data-12-t-isvalid.html @@ -0,0 +1,57 @@ + + + + paths-data-12-t-manual.svg + + + +

    Source SVG: paths-data-12-t-manual.svg

    + + + + + + + + + + + + $RCSfile: paths-data-12-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/paths-data-13-t-isvalid.html b/conformance-checkers/html-svg/paths-data-13-t-isvalid.html new file mode 100644 index 00000000000000..9c45348244970f --- /dev/null +++ b/conformance-checkers/html-svg/paths-data-13-t-isvalid.html @@ -0,0 +1,49 @@ + + + + paths-data-13-t-manual.svg + + + +

    Source SVG: paths-data-13-t-manual.svg

    + + + + + + + + + + + + $RCSfile: paths-data-13-t.svg,v $ + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/paths-data-14-t-isvalid.html b/conformance-checkers/html-svg/paths-data-14-t-isvalid.html new file mode 100644 index 00000000000000..56fa8f97946083 --- /dev/null +++ b/conformance-checkers/html-svg/paths-data-14-t-isvalid.html @@ -0,0 +1,50 @@ + + + + paths-data-14-t-manual.svg + + + +

    Source SVG: paths-data-14-t-manual.svg

    + + + + + + + + + + + + $RCSfile: paths-data-14-t.svg,v $ + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/paths-data-15-t-isvalid.html b/conformance-checkers/html-svg/paths-data-15-t-isvalid.html new file mode 100644 index 00000000000000..2fa718653ae019 --- /dev/null +++ b/conformance-checkers/html-svg/paths-data-15-t-isvalid.html @@ -0,0 +1,53 @@ + + + + paths-data-15-t-manual.svg + + + +

    Source SVG: paths-data-15-t-manual.svg

    + + + + + + + + + + + + $RCSfile: paths-data-15-t.svg,v $ + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/paths-data-16-t-isvalid.html b/conformance-checkers/html-svg/paths-data-16-t-isvalid.html new file mode 100644 index 00000000000000..6e43196a37cb69 --- /dev/null +++ b/conformance-checkers/html-svg/paths-data-16-t-isvalid.html @@ -0,0 +1,56 @@ + + + + paths-data-16-t-manual.svg + + + +

    Source SVG: paths-data-16-t-manual.svg

    + + + + + + + + + + $RCSfile: paths-data-16-t.svg,v $ + + + + + + + + + + Test relative-ness of implicit lineto path commands + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + + diff --git a/conformance-checkers/html-svg/paths-data-17-f-isvalid.html b/conformance-checkers/html-svg/paths-data-17-f-isvalid.html new file mode 100644 index 00000000000000..2b83f839bac946 --- /dev/null +++ b/conformance-checkers/html-svg/paths-data-17-f-isvalid.html @@ -0,0 +1,51 @@ + + + + paths-data-17-f-manual.svg + + + +

    Source SVG: paths-data-17-f-manual.svg

    + + + + + + + + + + $RCSfile: paths-data-17-f.svg,v $ + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + diff --git a/conformance-checkers/html-svg/paths-data-18-f-novalid.html b/conformance-checkers/html-svg/paths-data-18-f-novalid.html new file mode 100644 index 00000000000000..cbf6cf30b1e6b4 --- /dev/null +++ b/conformance-checkers/html-svg/paths-data-18-f-novalid.html @@ -0,0 +1,86 @@ + + + + paths-data-18-f-manual.svg + + + +

    Source SVG: paths-data-18-f-manual.svg

    + + + + + + + + + + $RCSfile: paths-data-18-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + diff --git a/conformance-checkers/html-svg/paths-data-19-f-isvalid.html b/conformance-checkers/html-svg/paths-data-19-f-isvalid.html new file mode 100644 index 00000000000000..1359839da459c7 --- /dev/null +++ b/conformance-checkers/html-svg/paths-data-19-f-isvalid.html @@ -0,0 +1,94 @@ + + + + paths-data-19-f-manual.svg + + + +

    Source SVG: paths-data-19-f-manual.svg

    + + + + + + + + + + $RCSfile: paths-data-19-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/paths-data-20-f-novalid.html b/conformance-checkers/html-svg/paths-data-20-f-novalid.html new file mode 100644 index 00000000000000..654b484e22e0b5 --- /dev/null +++ b/conformance-checkers/html-svg/paths-data-20-f-novalid.html @@ -0,0 +1,77 @@ + + + + paths-data-20-f-manual.svg + + + +

    Source SVG: paths-data-20-f-manual.svg

    + + + + + + + + + + $RCSfile: paths-data-20-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/paths-dom-01-f-novalid.html b/conformance-checkers/html-svg/paths-dom-01-f-novalid.html new file mode 100644 index 00000000000000..8d071607439cd5 --- /dev/null +++ b/conformance-checkers/html-svg/paths-dom-01-f-novalid.html @@ -0,0 +1,123 @@ + + + + paths-dom-01-f-manual.svg + + + +

    Source SVG: paths-dom-01-f-manual.svg

    + + + + + + + + + + + + $RCSfile: paths-dom-01-f.svg,v $ + + + + + + + + + + + + + + + Using startOffset="50": + + + + + The text goes around the rect. + + + + Using startOffset="50" and + pathLength="100": + + + + The text goes around the rect. + + + + + getTotalLength: + -1 + -1 + + getPointAtLength(0): + -1 + -1 + + getPathSegAtLength(0): + + -1n/a + + + -1n/a + + + + + + $Revision: 1.6 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/paths-dom-02-f-novalid.html b/conformance-checkers/html-svg/paths-dom-02-f-novalid.html new file mode 100644 index 00000000000000..87b11d6a81ff36 --- /dev/null +++ b/conformance-checkers/html-svg/paths-dom-02-f-novalid.html @@ -0,0 +1,259 @@ + + + + paths-dom-02-f-manual.svg + + + +

    Source SVG: paths-dom-02-f-manual.svg

    + + + + + + + + + + + + $RCSfile: paths-dom-02-f.svg,v $ + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-01-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-01-b-isvalid.html new file mode 100644 index 00000000000000..b5781089de87c7 --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-01-b-isvalid.html @@ -0,0 +1,56 @@ + + + + pservers-grad-01-b-manual.svg + + + +

    Source SVG: pservers-grad-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: pservers-grad-01-b.svg,v $ + + + + + + + + + + + + + + + + + + Linear gradient. + + Referencing gradient below. + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-02-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-02-b-isvalid.html new file mode 100644 index 00000000000000..61707995637c35 --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-02-b-isvalid.html @@ -0,0 +1,56 @@ + + + + pservers-grad-02-b-manual.svg + + + +

    Source SVG: pservers-grad-02-b-manual.svg

    + + + + + + + + + + + + $RCSfile: pservers-grad-02-b.svg,v $ + + + + + + + + + + + + + + + + + + Radial gradient. + + Referencing gradient below. + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-03-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-03-b-isvalid.html new file mode 100644 index 00000000000000..88a2a176f5488b --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-03-b-isvalid.html @@ -0,0 +1,58 @@ + + + + pservers-grad-03-b-manual.svg + + + +

    Source SVG: pservers-grad-03-b-manual.svg

    + + + + + + + + + + + + $RCSfile: pservers-grad-03-b.svg,v $ + + + + + + + + + + + + + + + + + + + + Pattern fill. + + Referencing pattern fill below. + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-04-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-04-b-isvalid.html new file mode 100644 index 00000000000000..97d94f289556dc --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-04-b-isvalid.html @@ -0,0 +1,67 @@ + + + + pservers-grad-04-b-manual.svg + + + +

    Source SVG: pservers-grad-04-b-manual.svg

    + + + + + + + + + + + + $RCSfile: pservers-grad-04-b.svg,v $ + + + + + + + + + + + + + + + + + + Multi-color linear gradient. + + + + + + + + + + + + + Multi-color radial gradient. + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-05-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-05-b-isvalid.html new file mode 100644 index 00000000000000..1c573bcf358dce --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-05-b-isvalid.html @@ -0,0 +1,65 @@ + + + + pservers-grad-05-b-manual.svg + + + +

    Source SVG: pservers-grad-05-b-manual.svg

    + + + + + + + + + + + + $RCSfile: pservers-grad-05-b.svg,v $ + + + + + + + + + Background + + + + + + + + + + + Background + + + + + + + + + + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-06-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-06-b-isvalid.html new file mode 100644 index 00000000000000..b4680b4fc4e992 --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-06-b-isvalid.html @@ -0,0 +1,74 @@ + + + + pservers-grad-06-b-manual.svg + + + +

    Source SVG: pservers-grad-06-b-manual.svg

    + + + + + + + + + + + + $RCSfile: pservers-grad-06-b.svg,v $ + + + + + + + + + + + + + + + + + + scale(0.5) on gradient + + + + + + + + + skewX(45) on gradient + + + + + + + + + + + scale(2), skewX(45) on pattern + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-07-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-07-b-isvalid.html new file mode 100644 index 00000000000000..2e55d8d7c223c3 --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-07-b-isvalid.html @@ -0,0 +1,63 @@ + + + + pservers-grad-07-b-manual.svg + + + +

    Source SVG: pservers-grad-07-b-manual.svg

    + + + + + + + + + + + + $RCSfile: pservers-grad-07-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + Linear gradient filled rectangle + + + + + Linear gradient on stroke of rectangle + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-08-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-08-b-isvalid.html new file mode 100644 index 00000000000000..561f444ee1fb03 --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-08-b-isvalid.html @@ -0,0 +1,79 @@ + + + + pservers-grad-08-b-manual.svg + + + +

    Source SVG: pservers-grad-08-b-manual.svg

    + + + + + + + + + + + + $RCSfile: pservers-grad-08-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gradient on fill + + + + Gradient on stroke + + + + Linear gradient on filled text + Linear gradient on stroke of text + + + + $Revision: 1.13 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-09-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-09-b-isvalid.html new file mode 100644 index 00000000000000..b9d5bffeda633d --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-09-b-isvalid.html @@ -0,0 +1,76 @@ + + + + pservers-grad-09-b-manual.svg + + + +

    Source SVG: pservers-grad-09-b-manual.svg

    + + + + + + + + + + + + $RCSfile: pservers-grad-09-b.svg,v $ + + + + + + + + + Testing gradientUnits attribute + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-10-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-10-b-isvalid.html new file mode 100644 index 00000000000000..39f919e74ead9e --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-10-b-isvalid.html @@ -0,0 +1,72 @@ + + + + pservers-grad-10-b-manual.svg + + + +

    Source SVG: pservers-grad-10-b-manual.svg

    + + + + + + + + + + + + $RCSfile: pservers-grad-10-b.svg,v $ + + + + + + + + + Testing spreadMethod attribute + + + + + + + + + spreadMethod=pad + + + + + + + + + spreadMethod=reflect + + + + + + + + + spreadMethod=repeat + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-11-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-11-b-isvalid.html new file mode 100644 index 00000000000000..5056c94b8a746f --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-11-b-isvalid.html @@ -0,0 +1,80 @@ + + + + pservers-grad-11-b-manual.svg + + + +

    Source SVG: pservers-grad-11-b-manual.svg

    + + + + + + + + + + + + $RCSfile: pservers-grad-11-b.svg,v $ + + + + + + + + + + + + + + + + + Radial gradient on fill of rectangle + + + + + + + + + Radial gradient on stroke of rectangle + + + + + + + + Gradient on text fill + Radial gradient on text, black to yellow + + + + + + + + Gradient on text stroke + Radial gradient on stroke of text, black to red + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-12-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-12-b-isvalid.html new file mode 100644 index 00000000000000..733082c3f9e835 --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-12-b-isvalid.html @@ -0,0 +1,75 @@ + + + + pservers-grad-12-b-manual.svg + + + +

    Source SVG: pservers-grad-12-b-manual.svg

    + + + + + + + + + + + + $RCSfile: pservers-grad-12-b.svg,v $ + + + + + + + + + Testing gradientUnits attribute + + + + + + + + + Radial gradient with default attributes (from blue to yellow) + Gradient is blue at the object center and lime at the object edges + + + + + + + + + gradientUnits=objectBoundingBox + cx=.2, cy=.2, r=.5, fx=.2 fy=.2 + + + + + + + + + gradientUnits=userSpaceOnUse + Gradient is yellow to blue radial gradient from center to horizontal bounds + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-13-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-13-b-isvalid.html new file mode 100644 index 00000000000000..b527b45410e98c --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-13-b-isvalid.html @@ -0,0 +1,166 @@ + + + + pservers-grad-13-b-manual.svg + + + +

    Source SVG: pservers-grad-13-b-manual.svg

    + + + + + + + + + + + + $RCSfile: pservers-grad-13-b.svg,v $ + + + + + + + + + Radial gradient focal point + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-14-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-14-b-isvalid.html new file mode 100644 index 00000000000000..3a446a1c7b2ed7 --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-14-b-isvalid.html @@ -0,0 +1,112 @@ + + + + pservers-grad-14-b-manual.svg + + + +

    Source SVG: pservers-grad-14-b-manual.svg

    + + + + + + + + + + + + $RCSfile: pservers-grad-14-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gradient 'spreadMethod' values + + + spreadMethod="pad" + + + spreadMethod="reflect" + + + spreadMethod="repeat" + + + spreadMethod="default" + + + + spreadMethod="pad" + + + spreadMethod="reflect" + + + spreadMethod="repeat" + + + spreadMethod="default" + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-15-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-15-b-isvalid.html new file mode 100644 index 00000000000000..e8bc4b10dd1651 --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-15-b-isvalid.html @@ -0,0 +1,57 @@ + + + + pservers-grad-15-b-manual.svg + + + +

    Source SVG: pservers-grad-15-b-manual.svg

    + + + + + + + + + + + + $RCSfile: pservers-grad-15-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-16-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-16-b-isvalid.html new file mode 100644 index 00000000000000..23222e9e5c066c --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-16-b-isvalid.html @@ -0,0 +1,63 @@ + + + + pservers-grad-16-b-manual.svg + + + +

    Source SVG: pservers-grad-16-b-manual.svg

    + + + + + + + + + + + + $RCSfile: pservers-grad-16-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-17-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-17-b-isvalid.html new file mode 100644 index 00000000000000..313a956e67ce36 --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-17-b-isvalid.html @@ -0,0 +1,70 @@ + + + + pservers-grad-17-b-manual.svg + + + +

    Source SVG: pservers-grad-17-b-manual.svg

    + + + + + + + + + + + + $RCSfile: pservers-grad-17-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + With fallback + + + + + + + + + + Without fallback + + + $Revision: 1.4 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-18-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-18-b-isvalid.html new file mode 100644 index 00000000000000..8681f1fe5527ee --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-18-b-isvalid.html @@ -0,0 +1,74 @@ + + + + pservers-grad-18-b-manual.svg + + + +

    Source SVG: pservers-grad-18-b-manual.svg

    + + + + + + + + + + + + $RCSfile: pservers-grad-18-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-20-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-20-b-isvalid.html new file mode 100644 index 00000000000000..6ebc6ff7f5a117 --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-20-b-isvalid.html @@ -0,0 +1,71 @@ + + + + pservers-grad-20-b-manual.svg + + + +

    Source SVG: pservers-grad-20-b-manual.svg

    + + + + + + + + + + $RCSfile: pservers-grad-20-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + With fallback + + + + + + + + + + Without fallback + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-21-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-21-b-isvalid.html new file mode 100644 index 00000000000000..d9a3f015d40d45 --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-21-b-isvalid.html @@ -0,0 +1,133 @@ + + + + pservers-grad-21-b-manual.svg + + + +

    Source SVG: pservers-grad-21-b-manual.svg

    + + + + + + + + + + $RCSfile: pservers-grad-21-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Reference + + + + + $Revision: 1.4 $ + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-22-b-isvalid.html b/conformance-checkers/html-svg/pservers-grad-22-b-isvalid.html new file mode 100644 index 00000000000000..48ee6b367c3976 --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-22-b-isvalid.html @@ -0,0 +1,88 @@ + + + + pservers-grad-22-b-manual.svg + + + +

    Source SVG: pservers-grad-22-b-manual.svg

    + + + + + + + + + + $RCSfile: pservers-grad-22-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-23-f-novalid.html b/conformance-checkers/html-svg/pservers-grad-23-f-novalid.html new file mode 100644 index 00000000000000..9c1f75b822deb1 --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-23-f-novalid.html @@ -0,0 +1,57 @@ + + + + pservers-grad-23-f-manual.svg + + + +

    Source SVG: pservers-grad-23-f-manual.svg

    + + + + + + + + + + + + $RCSfile: pservers-grad-23-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + + diff --git a/conformance-checkers/html-svg/pservers-grad-24-f-isvalid.html b/conformance-checkers/html-svg/pservers-grad-24-f-isvalid.html new file mode 100644 index 00000000000000..62dee44c98b1b4 --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-24-f-isvalid.html @@ -0,0 +1,60 @@ + + + + pservers-grad-24-f-manual.svg + + + +

    Source SVG: pservers-grad-24-f-manual.svg

    + + + + + + + + + + $RCSfile: pservers-grad-24-f.svg,v $ + + + + + + + + + + + + + + + + + There should be no red. + + + + + + + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/pservers-grad-stops-01-f-isvalid.html b/conformance-checkers/html-svg/pservers-grad-stops-01-f-isvalid.html new file mode 100644 index 00000000000000..c475e31853f479 --- /dev/null +++ b/conformance-checkers/html-svg/pservers-grad-stops-01-f-isvalid.html @@ -0,0 +1,61 @@ + + + + pservers-grad-stops-01-f-manual.svg + + + +

    Source SVG: pservers-grad-stops-01-f-manual.svg

    + + + + + + + + + + $RCSfile: pservers-grad-stops-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/pservers-pattern-01-b-isvalid.html b/conformance-checkers/html-svg/pservers-pattern-01-b-isvalid.html new file mode 100644 index 00000000000000..c8f3e75caf0272 --- /dev/null +++ b/conformance-checkers/html-svg/pservers-pattern-01-b-isvalid.html @@ -0,0 +1,82 @@ + + + + pservers-pattern-01-b-manual.svg + + + +

    Source SVG: pservers-pattern-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: pservers-pattern-01-b.svg,v $ + + + + + + + + + + + + + + + + + Pattern created using yellow and green rectangles applied to fill of rectangle + + + + + + + + + + + Pattern of 4 rectangles applied to a stroke of a rectangle. + + + + + + + + Pattern on fill + Pattern consists of orange and green rows + + + + + + + + Pattern on stroke + Pattern consists of maroon and blue columns + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-pattern-02-f-isvalid.html b/conformance-checkers/html-svg/pservers-pattern-02-f-isvalid.html new file mode 100644 index 00000000000000..34f0a395db7288 --- /dev/null +++ b/conformance-checkers/html-svg/pservers-pattern-02-f-isvalid.html @@ -0,0 +1,52 @@ + + + + pservers-pattern-02-f-manual.svg + + + +

    Source SVG: pservers-pattern-02-f-manual.svg

    + + + + + + + + + + $RCSfile: pservers-pattern-02-f.svg,v $ + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/pservers-pattern-03-f-isvalid.html b/conformance-checkers/html-svg/pservers-pattern-03-f-isvalid.html new file mode 100644 index 00000000000000..1e8830c897793f --- /dev/null +++ b/conformance-checkers/html-svg/pservers-pattern-03-f-isvalid.html @@ -0,0 +1,83 @@ + + + + pservers-pattern-03-f-manual.svg + + + +

    Source SVG: pservers-pattern-03-f-manual.svg

    + + + + + + + + + + $RCSfile: pservers-pattern-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.1 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/pservers-pattern-04-f-isvalid.html b/conformance-checkers/html-svg/pservers-pattern-04-f-isvalid.html new file mode 100644 index 00000000000000..266e93dd9aa26d --- /dev/null +++ b/conformance-checkers/html-svg/pservers-pattern-04-f-isvalid.html @@ -0,0 +1,57 @@ + + + + pservers-pattern-04-f-manual.svg + + + +

    Source SVG: pservers-pattern-04-f-manual.svg

    + + + + + + + + + + $RCSfile: pservers-pattern-04-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + + diff --git a/conformance-checkers/html-svg/pservers-pattern-05-f-isvalid.html b/conformance-checkers/html-svg/pservers-pattern-05-f-isvalid.html new file mode 100644 index 00000000000000..b394cf07abcd3b --- /dev/null +++ b/conformance-checkers/html-svg/pservers-pattern-05-f-isvalid.html @@ -0,0 +1,52 @@ + + + + pservers-pattern-05-f-manual.svg + + + +

    Source SVG: pservers-pattern-05-f-manual.svg

    + + + + + + + + + + $RCSfile: pservers-pattern-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/pservers-pattern-06-f-isvalid.html b/conformance-checkers/html-svg/pservers-pattern-06-f-isvalid.html new file mode 100644 index 00000000000000..0fbb2002872cff --- /dev/null +++ b/conformance-checkers/html-svg/pservers-pattern-06-f-isvalid.html @@ -0,0 +1,52 @@ + + + + pservers-pattern-06-f-manual.svg + + + +

    Source SVG: pservers-pattern-06-f-manual.svg

    + + + + + + + + + + $RCSfile: pservers-pattern-06-f.svg,v $ + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/pservers-pattern-07-f-isvalid.html b/conformance-checkers/html-svg/pservers-pattern-07-f-isvalid.html new file mode 100644 index 00000000000000..5b710e35f8f2bc --- /dev/null +++ b/conformance-checkers/html-svg/pservers-pattern-07-f-isvalid.html @@ -0,0 +1,55 @@ + + + + pservers-pattern-07-f-manual.svg + + + +

    Source SVG: pservers-pattern-07-f-manual.svg

    + + + + + + + + + + $RCSfile: pservers-pattern-07-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/pservers-pattern-08-f-isvalid.html b/conformance-checkers/html-svg/pservers-pattern-08-f-isvalid.html new file mode 100644 index 00000000000000..448a0154324618 --- /dev/null +++ b/conformance-checkers/html-svg/pservers-pattern-08-f-isvalid.html @@ -0,0 +1,55 @@ + + + + pservers-pattern-08-f-manual.svg + + + +

    Source SVG: pservers-pattern-08-f-manual.svg

    + + + + + + + + + + $RCSfile: pservers-pattern-08-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/pservers-pattern-09-f-isvalid.html b/conformance-checkers/html-svg/pservers-pattern-09-f-isvalid.html new file mode 100644 index 00000000000000..6fad2330993814 --- /dev/null +++ b/conformance-checkers/html-svg/pservers-pattern-09-f-isvalid.html @@ -0,0 +1,59 @@ + + + + pservers-pattern-09-f-manual.svg + + + +

    Source SVG: pservers-pattern-09-f-manual.svg

    + + + + + + + + + + $RCSfile: pservers-pattern-09-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.1 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/render-elems-01-t-isvalid.html b/conformance-checkers/html-svg/render-elems-01-t-isvalid.html new file mode 100644 index 00000000000000..50bd46bcbd32ef --- /dev/null +++ b/conformance-checkers/html-svg/render-elems-01-t-isvalid.html @@ -0,0 +1,56 @@ + + + + render-elems-01-t-manual.svg + + + +

    Source SVG: render-elems-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: render-elems-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + Shape fill + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/render-elems-02-t-isvalid.html b/conformance-checkers/html-svg/render-elems-02-t-isvalid.html new file mode 100644 index 00000000000000..8172ed326749ba --- /dev/null +++ b/conformance-checkers/html-svg/render-elems-02-t-isvalid.html @@ -0,0 +1,56 @@ + + + + render-elems-02-t-manual.svg + + + +

    Source SVG: render-elems-02-t-manual.svg

    + + + + + + + + + + + + $RCSfile: render-elems-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + Shape stroke + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/render-elems-06-t-isvalid.html b/conformance-checkers/html-svg/render-elems-06-t-isvalid.html new file mode 100644 index 00000000000000..fcbebe48d7c896 --- /dev/null +++ b/conformance-checkers/html-svg/render-elems-06-t-isvalid.html @@ -0,0 +1,64 @@ + + + + render-elems-06-t-manual.svg + + + +

    Source SVG: render-elems-06-t-manual.svg

    + + + + + + + + + + + + $RCSfile: render-elems-06-t.svg,v $ + + + + + + + + + + + + + + + + + + + + Text fill + + G + G + + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/render-elems-07-t-isvalid.html b/conformance-checkers/html-svg/render-elems-07-t-isvalid.html new file mode 100644 index 00000000000000..a4a0cf575cf4e5 --- /dev/null +++ b/conformance-checkers/html-svg/render-elems-07-t-isvalid.html @@ -0,0 +1,62 @@ + + + + render-elems-07-t-manual.svg + + + +

    Source SVG: render-elems-07-t-manual.svg

    + + + + + + + + + + + + $RCSfile: render-elems-07-t.svg,v $ + + + + + + + + + + + + + + + + + + + + Text stroke + + G + G + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/render-elems-08-t-isvalid.html b/conformance-checkers/html-svg/render-elems-08-t-isvalid.html new file mode 100644 index 00000000000000..46f409cd5ad363 --- /dev/null +++ b/conformance-checkers/html-svg/render-elems-08-t-isvalid.html @@ -0,0 +1,64 @@ + + + + render-elems-08-t-manual.svg + + + +

    Source SVG: render-elems-08-t-manual.svg

    + + + + + + + + + + + + $RCSfile: render-elems-08-t.svg,v $ + + + + + + + + + + + + + + + + + + + + Text fill and stroke + + G + G + + + + $Revision: 1.10 $ + + + + + + + diff --git a/conformance-checkers/html-svg/render-groups-01-b-isvalid.html b/conformance-checkers/html-svg/render-groups-01-b-isvalid.html new file mode 100644 index 00000000000000..a81e5c59fad77e --- /dev/null +++ b/conformance-checkers/html-svg/render-groups-01-b-isvalid.html @@ -0,0 +1,90 @@ + + + + render-groups-01-b-manual.svg + + + +

    Source SVG: render-groups-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: render-groups-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SVG + + + + + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/render-groups-03-t-isvalid.html b/conformance-checkers/html-svg/render-groups-03-t-isvalid.html new file mode 100644 index 00000000000000..937a76c867ef82 --- /dev/null +++ b/conformance-checkers/html-svg/render-groups-03-t-isvalid.html @@ -0,0 +1,84 @@ + + + + render-groups-03-t-manual.svg + + + +

    Source SVG: render-groups-03-t-manual.svg

    + + + + + + + + + + + + $RCSfile: render-groups-03-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SVG + + + + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/script-handle-01-b-isvalid.html b/conformance-checkers/html-svg/script-handle-01-b-isvalid.html new file mode 100644 index 00000000000000..aff8a2468639a4 --- /dev/null +++ b/conformance-checkers/html-svg/script-handle-01-b-isvalid.html @@ -0,0 +1,81 @@ + + + + script-handle-01-b-manual.svg + + + +

    Source SVG: script-handle-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: script-handle-01-b.svg,v $ + + + + + + + + + + + Event and DOM Access Test + + + + + + + + Click on the blue square + + + + Scripting Test Passed! + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/script-handle-02-b-isvalid.html b/conformance-checkers/html-svg/script-handle-02-b-isvalid.html new file mode 100644 index 00000000000000..7adcbb895959db --- /dev/null +++ b/conformance-checkers/html-svg/script-handle-02-b-isvalid.html @@ -0,0 +1,106 @@ + + + + script-handle-02-b-manual.svg + + + +

    Source SVG: script-handle-02-b-manual.svg

    + + + + + + + + + + + + $RCSfile: script-handle-02-b.svg,v $ + + + + + + + + + + + + Mouse event handlers test. + + + + + + + + Target + Use the target to trigger events + + + + + + + + + + + + + + + onfocusin + onfocusout + onactivate + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.9 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/script-handle-03-b-isvalid.html b/conformance-checkers/html-svg/script-handle-03-b-isvalid.html new file mode 100644 index 00000000000000..9a15d2e59f7780 --- /dev/null +++ b/conformance-checkers/html-svg/script-handle-03-b-isvalid.html @@ -0,0 +1,106 @@ + + + + script-handle-03-b-manual.svg + + + +

    Source SVG: script-handle-03-b-manual.svg

    + + + + + + + + + + + + $RCSfile: script-handle-03-b.svg,v $ + + + + + + + + + + + + Mouse event handlers test. + + + + + + + + Target + Use the target to trigger events + + + + + + + + + + + + + + + onmousedown + onmouseup + onclick + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/script-handle-04-b-isvalid.html b/conformance-checkers/html-svg/script-handle-04-b-isvalid.html new file mode 100644 index 00000000000000..7faa657bd90ed6 --- /dev/null +++ b/conformance-checkers/html-svg/script-handle-04-b-isvalid.html @@ -0,0 +1,106 @@ + + + + script-handle-04-b-manual.svg + + + +

    Source SVG: script-handle-04-b-manual.svg

    + + + + + + + + + + + + $RCSfile: script-handle-04-b.svg,v $ + + + + + + + + + + + + Mouse event handlers test. + + + + + + + + Target + Use the target to trigger events + + + + + + + + + + + + + + + onmouseover + onmousemove + onmouseout + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/script-specify-01-f-novalid.html b/conformance-checkers/html-svg/script-specify-01-f-novalid.html new file mode 100644 index 00000000000000..14aa6f6179f816 --- /dev/null +++ b/conformance-checkers/html-svg/script-specify-01-f-novalid.html @@ -0,0 +1,59 @@ + + + + script-specify-01-f-manual.svg + + + +

    Source SVG: script-specify-01-f-manual.svg

    + + + + + + + + + + $RCSfile: script-specify-01-f.svg,v $ + + + + + + + + + + + contentScriptType Test + + + + + Good, script didn't run. + No! This is not ECMAScript! + + + + $Revision: 1.6 $ + + + + + + DRAFT + + + + + diff --git a/conformance-checkers/html-svg/script-specify-02-f-isvalid.html b/conformance-checkers/html-svg/script-specify-02-f-isvalid.html new file mode 100644 index 00000000000000..9688f54247da5b --- /dev/null +++ b/conformance-checkers/html-svg/script-specify-02-f-isvalid.html @@ -0,0 +1,61 @@ + + + + script-specify-02-f-manual.svg + + + +

    Source SVG: script-specify-02-f-manual.svg

    + + + + + + + + + + $RCSfile: script-specify-02-f.svg,v $ + + + + + + + + + + + Test unknown type attribute value on script element + + + + Good, script didn't run. + No! This is not ECMAScript! + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/shapes-circle-01-t-isvalid.html b/conformance-checkers/html-svg/shapes-circle-01-t-isvalid.html new file mode 100644 index 00000000000000..ae7ff60659bdeb --- /dev/null +++ b/conformance-checkers/html-svg/shapes-circle-01-t-isvalid.html @@ -0,0 +1,50 @@ + + + + shapes-circle-01-t-manual.svg + + + +

    Source SVG: shapes-circle-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: shapes-circle-01-t.svg,v $ + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/shapes-circle-02-t-isvalid.html b/conformance-checkers/html-svg/shapes-circle-02-t-isvalid.html new file mode 100644 index 00000000000000..f4f70d3553d28a --- /dev/null +++ b/conformance-checkers/html-svg/shapes-circle-02-t-isvalid.html @@ -0,0 +1,60 @@ + + + + shapes-circle-02-t-manual.svg + + + +

    Source SVG: shapes-circle-02-t-manual.svg

    + + + + + + + + + + + + $RCSfile: shapes-circle-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/shapes-ellipse-01-t-isvalid.html b/conformance-checkers/html-svg/shapes-ellipse-01-t-isvalid.html new file mode 100644 index 00000000000000..e470800920f760 --- /dev/null +++ b/conformance-checkers/html-svg/shapes-ellipse-01-t-isvalid.html @@ -0,0 +1,63 @@ + + + + shapes-ellipse-01-t-manual.svg + + + +

    Source SVG: shapes-ellipse-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: shapes-ellipse-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/shapes-ellipse-02-t-isvalid.html b/conformance-checkers/html-svg/shapes-ellipse-02-t-isvalid.html new file mode 100644 index 00000000000000..ed45b7a46af3ea --- /dev/null +++ b/conformance-checkers/html-svg/shapes-ellipse-02-t-isvalid.html @@ -0,0 +1,57 @@ + + + + shapes-ellipse-02-t-manual.svg + + + +

    Source SVG: shapes-ellipse-02-t-manual.svg

    + + + + + + + + + + + + $RCSfile: shapes-ellipse-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/shapes-ellipse-03-f-isvalid.html b/conformance-checkers/html-svg/shapes-ellipse-03-f-isvalid.html new file mode 100644 index 00000000000000..96e4e3de980778 --- /dev/null +++ b/conformance-checkers/html-svg/shapes-ellipse-03-f-isvalid.html @@ -0,0 +1,58 @@ + + + + shapes-ellipse-03-f-manual.svg + + + +

    Source SVG: shapes-ellipse-03-f-manual.svg

    + + + + + + + + + + $RCSfile: shapes-ellipse-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + diff --git a/conformance-checkers/html-svg/shapes-grammar-01-f-isvalid.html b/conformance-checkers/html-svg/shapes-grammar-01-f-isvalid.html new file mode 100644 index 00000000000000..c6aa3cfbd10a89 --- /dev/null +++ b/conformance-checkers/html-svg/shapes-grammar-01-f-isvalid.html @@ -0,0 +1,63 @@ + + + + shapes-grammar-01-f-manual.svg + + + +

    Source SVG: shapes-grammar-01-f-manual.svg

    + + + + + + + + + + $RCSfile: shapes-grammar-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + diff --git a/conformance-checkers/html-svg/shapes-intro-01-t-isvalid.html b/conformance-checkers/html-svg/shapes-intro-01-t-isvalid.html new file mode 100644 index 00000000000000..1d7fc22cf462c7 --- /dev/null +++ b/conformance-checkers/html-svg/shapes-intro-01-t-isvalid.html @@ -0,0 +1,103 @@ + + + + shapes-intro-01-t-manual.svg + + + +

    Source SVG: shapes-intro-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: shapes-intro-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Stroked + Unstroked + Zero width rect + Zero height rect + Zero radius circle + Zero x radius ellipse + Zero y radius ellipse + Zero length line + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/shapes-intro-02-f-isvalid.html b/conformance-checkers/html-svg/shapes-intro-02-f-isvalid.html new file mode 100644 index 00000000000000..3d9765dd94d6f6 --- /dev/null +++ b/conformance-checkers/html-svg/shapes-intro-02-f-isvalid.html @@ -0,0 +1,76 @@ + + + + shapes-intro-02-f-manual.svg + + + +

    Source SVG: shapes-intro-02-f-manual.svg

    + + + + + + + + + + $RCSfile: shapes-intro-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/shapes-line-01-t-isvalid.html b/conformance-checkers/html-svg/shapes-line-01-t-isvalid.html new file mode 100644 index 00000000000000..d5707729a3db66 --- /dev/null +++ b/conformance-checkers/html-svg/shapes-line-01-t-isvalid.html @@ -0,0 +1,72 @@ + + + + shapes-line-01-t-manual.svg + + + +

    Source SVG: shapes-line-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: shapes-line-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/shapes-line-02-f-isvalid.html b/conformance-checkers/html-svg/shapes-line-02-f-isvalid.html new file mode 100644 index 00000000000000..cf6374cf0ee2a4 --- /dev/null +++ b/conformance-checkers/html-svg/shapes-line-02-f-isvalid.html @@ -0,0 +1,48 @@ + + + + shapes-line-02-f-manual.svg + + + +

    Source SVG: shapes-line-02-f-manual.svg

    + + + + + + + + + + $RCSfile: shapes-line-02-f.svg,v $ + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + diff --git a/conformance-checkers/html-svg/shapes-polygon-01-t-isvalid.html b/conformance-checkers/html-svg/shapes-polygon-01-t-isvalid.html new file mode 100644 index 00000000000000..2de242bedecd18 --- /dev/null +++ b/conformance-checkers/html-svg/shapes-polygon-01-t-isvalid.html @@ -0,0 +1,68 @@ + + + + shapes-polygon-01-t-manual.svg + + + +

    Source SVG: shapes-polygon-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: shapes-polygon-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/shapes-polygon-02-t-isvalid.html b/conformance-checkers/html-svg/shapes-polygon-02-t-isvalid.html new file mode 100644 index 00000000000000..d627e415cbbe81 --- /dev/null +++ b/conformance-checkers/html-svg/shapes-polygon-02-t-isvalid.html @@ -0,0 +1,73 @@ + + + + shapes-polygon-02-t-manual.svg + + + +

    Source SVG: shapes-polygon-02-t-manual.svg

    + + + + + + + + + + + + $RCSfile: shapes-polygon-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + + diff --git a/conformance-checkers/html-svg/shapes-polygon-03-t-isvalid.html b/conformance-checkers/html-svg/shapes-polygon-03-t-isvalid.html new file mode 100644 index 00000000000000..b64ae5eff0e3aa --- /dev/null +++ b/conformance-checkers/html-svg/shapes-polygon-03-t-isvalid.html @@ -0,0 +1,52 @@ + + + + shapes-polygon-03-t-manual.svg + + + +

    Source SVG: shapes-polygon-03-t-manual.svg

    + + + + + + + + + + $RCSfile: shapes-polygon-03-t.svg,v $ + + + + + + + + + + + + + + + + + + + $Revision: 1.1 $ + + + + + + + diff --git a/conformance-checkers/html-svg/shapes-polyline-01-t-isvalid.html b/conformance-checkers/html-svg/shapes-polyline-01-t-isvalid.html new file mode 100644 index 00000000000000..3954e8c3a1ef71 --- /dev/null +++ b/conformance-checkers/html-svg/shapes-polyline-01-t-isvalid.html @@ -0,0 +1,74 @@ + + + + shapes-polyline-01-t-manual.svg + + + +

    Source SVG: shapes-polyline-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: shapes-polyline-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/shapes-polyline-02-t-isvalid.html b/conformance-checkers/html-svg/shapes-polyline-02-t-isvalid.html new file mode 100644 index 00000000000000..dda9c7194fd5e7 --- /dev/null +++ b/conformance-checkers/html-svg/shapes-polyline-02-t-isvalid.html @@ -0,0 +1,73 @@ + + + + shapes-polyline-02-t-manual.svg + + + +

    Source SVG: shapes-polyline-02-t-manual.svg

    + + + + + + + + + + + + $RCSfile: shapes-polyline-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + + diff --git a/conformance-checkers/html-svg/shapes-rect-01-t-isvalid.html b/conformance-checkers/html-svg/shapes-rect-01-t-isvalid.html new file mode 100644 index 00000000000000..5a74947fb7c8e9 --- /dev/null +++ b/conformance-checkers/html-svg/shapes-rect-01-t-isvalid.html @@ -0,0 +1,64 @@ + + + + shapes-rect-01-t-manual.svg + + + +

    Source SVG: shapes-rect-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: shapes-rect-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/shapes-rect-02-t-isvalid.html b/conformance-checkers/html-svg/shapes-rect-02-t-isvalid.html new file mode 100644 index 00000000000000..651458f76525e8 --- /dev/null +++ b/conformance-checkers/html-svg/shapes-rect-02-t-isvalid.html @@ -0,0 +1,63 @@ + + + + shapes-rect-02-t-manual.svg + + + +

    Source SVG: shapes-rect-02-t-manual.svg

    + + + + + + + + + + + + $RCSfile: shapes-rect-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/shapes-rect-03-t-novalid.html b/conformance-checkers/html-svg/shapes-rect-03-t-novalid.html new file mode 100644 index 00000000000000..8cfea5eba81a87 --- /dev/null +++ b/conformance-checkers/html-svg/shapes-rect-03-t-novalid.html @@ -0,0 +1,127 @@ + + + + shapes-rect-03-t-manual.svg + + + +

    Source SVG: shapes-rect-03-t-manual.svg

    + + + + + + + + + + $RCSfile: shapes-rect-03-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.9 $ + + + + + + diff --git a/conformance-checkers/html-svg/shapes-rect-04-f-isvalid.html b/conformance-checkers/html-svg/shapes-rect-04-f-isvalid.html new file mode 100644 index 00000000000000..30ad9d4bd54d05 --- /dev/null +++ b/conformance-checkers/html-svg/shapes-rect-04-f-isvalid.html @@ -0,0 +1,53 @@ + + + + shapes-rect-04-f-manual.svg + + + +

    Source SVG: shapes-rect-04-f-manual.svg

    + + + + + + + + + + $RCSfile: shapes-rect-04-f.svg,v $ + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + diff --git a/conformance-checkers/html-svg/shapes-rect-05-f-isvalid.html b/conformance-checkers/html-svg/shapes-rect-05-f-isvalid.html new file mode 100644 index 00000000000000..f971231d3023bc --- /dev/null +++ b/conformance-checkers/html-svg/shapes-rect-05-f-isvalid.html @@ -0,0 +1,59 @@ + + + + shapes-rect-05-f-manual.svg + + + +

    Source SVG: shapes-rect-05-f-manual.svg

    + + + + + + + + + + $RCSfile: shapes-rect-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/shapes-rect-06-f-isvalid.html b/conformance-checkers/html-svg/shapes-rect-06-f-isvalid.html new file mode 100644 index 00000000000000..4fa17abd67e419 --- /dev/null +++ b/conformance-checkers/html-svg/shapes-rect-06-f-isvalid.html @@ -0,0 +1,57 @@ + + + + shapes-rect-06-f-manual.svg + + + +

    Source SVG: shapes-rect-06-f-manual.svg

    + + + + + + + + + + $RCSfile: shapes-rect-06-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/shapes-rect-07-f-isvalid.html b/conformance-checkers/html-svg/shapes-rect-07-f-isvalid.html new file mode 100644 index 00000000000000..d8d11f6476f907 --- /dev/null +++ b/conformance-checkers/html-svg/shapes-rect-07-f-isvalid.html @@ -0,0 +1,52 @@ + + + + shapes-rect-07-f-manual.svg + + + +

    Source SVG: shapes-rect-07-f-manual.svg

    + + + + + + + + + + $RCSfile: shapes-rect-07-f.svg,v $ + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + diff --git a/conformance-checkers/html-svg/struct-cond-01-t-isvalid.html b/conformance-checkers/html-svg/struct-cond-01-t-isvalid.html new file mode 100644 index 00000000000000..0680592081370a --- /dev/null +++ b/conformance-checkers/html-svg/struct-cond-01-t-isvalid.html @@ -0,0 +1,49 @@ + + + + struct-cond-01-t-manual.svg + + + +

    Source SVG: struct-cond-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-cond-01-t.svg,v $ + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-cond-02-t-isvalid.html b/conformance-checkers/html-svg/struct-cond-02-t-isvalid.html new file mode 100644 index 00000000000000..e33ec280aa6313 --- /dev/null +++ b/conformance-checkers/html-svg/struct-cond-02-t-isvalid.html @@ -0,0 +1,561 @@ + + + + struct-cond-02-t-manual.svg + + + +

    Source SVG: struct-cond-02-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-cond-02-t.svg,v $ + + + + + + + + + + + + + + Waarom kan hulle nie net doodgewoon Afrikaans praat nie? + Afrikaans + + + ለምንድነው አማርኛ የማይናገሩት፧ + Amharic + + + + لماذا لا يتكلمون اللّغة العربية فحسب؟ + Arabic (SA) + + + Защо те просто не могат да говорят български ? + Bulgarian + + + ওরা েকন বাংলা বলেত পাের না ? + Bengali + + + + Per què no poden simplement parlar en català ? + Catalan + + + Proč prostě nemluví česky ? + Czech + + + Pam dydyn nhw ddim yn siarad Cymraeg ? + Welsh + + + Hvorfor kan de ikke bare tale dansk ? + Danish + + + + Warum sprechen sie nicht einfach Deutsch ? + German (DE) + + + Μα γιατί δεν μπορούν να μιλήσουν Ελληνικά ; + Greek (modern, GR) + + + Why can't they just speak English ? + English (US) + + + ¿Por qué no pueden simplemente hablar en castellano ? + Spanish (ES) + + + Zergatik ezin dute  Euzkeraz bakarrik hitzegin? + Basque + + + خب، چرا فارسى صحبت نمى كنند؟ + Farsi + + + Miksi he eivät yksinkertaisesti puhu suomea ? + Finnish + + + + Pourquoi, tout simplement, ne parlent-ils pas en Français ? + French (FR) + + + Carson nach eil iad a'bruidhinn na Gàidhlige ? + Scots Gaelic + + + બદ્ધા લોકો ગુજરાતી કૅમ નથી બોલતા? + Gujarti (IN) + + + + למה הם פשוט לא מדברים עברית ? + Hebrew (modern) + + + यह लोग हिन्दी क्यों नहीं बोल सकते हैं ? + Hindi + + + Zašto jednostavno ne govore hrvatski ? + Croatian + + + Miért nem beszélnek egyszerűen magyarul ? + Hungarian + + + + Ինչու՞ նրանք չեն խոսում Հայերեն + + Armenian + + + Mengapa mereka tidak bisa bicara bahasa Indonesia ? + Indonesian + + + Hvers vegna geta þeir ekki réttlátur tala Íslenska ? + Icelandic + + + Perchè non possono semplicemente parlare italiano ? + Italian + + + + ᓱᒻᒪᓂᒃᑯᐊ ᐃᓄᒃᑎᑐ ᑐᐃᓐᓇᔭᙱᓚᑦ + Inuktitut + + + なぜ、みんな日本語を話してくれないのか? + Japanese (JP) + + + Kenapa kok ora nganggo  basa Jawa  wae? + Javanese + + + რატომ არ ლაპარაკობენ ისინი ქართულად ? + Georgian + + + Олар неге қазақ тiлiнде сойлемейдi? + Kazakh + + + ಅವರು ಕನ್ನಡ ಮಾತನಾಡಬಹುದಲ್ಲಾ? + Kannada + + + 세계의 모든 사람들이 한국어 를 이해한다면 얼마나 좋을까? + Korean + + + Емне үчүн алар кыргызча сүйлбйт? + Kirghiz + + + Kodėl gi jie nekalba lietuviškai ? + Lithuanian + + + Зошто тие едноставно не говорат македонски ? + Macedonian + + + लोकांना मराठी का बोलता येत नाही? + Marathi + + + Waarom spreken ze niet gewoon Nederlands ? + Dutch + + + Hvorfor kan de ikke bare snakke norsk ? + Norwegian + + + ସେମାନେ ଉଡିଯା ରେ କହିନ୍କି କହିବେ ନହିଁ? + Oriya + + + Dlaczego oni nie mówią po polsku ? + Polish + + + + Porque é que eles não falam simplesmente em Português ? + Portugese (PT) + + + Porque é que eles não falam em Português (do Brasil) ? + Portugese (BR) + + + Porque é que eles não falam simplesmente em Português ? + Portugese + + + De ce ei nu vorbesc moldoveneşte ? + Romanian + + + Почему же они не говорят по-русски ? + Russian + + + ते किं संस्कृतः माम वदन्ति ? + Sanskrit + + + Zašto jednostavno ne govore srpski ? + Serbian + + + අැයි ඔවුන්ට ඉංගරිස කතා ෛනබ ? + Sinhalese + + + + Zakaj vendar ne govorijo slovensko ? + Slovenian + + + Pse nuk duan të flasin vetëm shqip ? + Albanian + + + Varför pratar dom inte bara svenska ? + Swedish + + + அவர்கள் ஏன் தமிழில் பேசக்கூடாது ? + Tamil + + + + తెలుగు లో ఎందుకు మాట్లాడరు? + + Telugu + + + Čaro onho ba zaboni točiki gap namezanand? + Tajik + + + ทำไมเขาถึงไม่พูด ภาษาไทย + Thai + + + Bakit hindi na lang sila magsalita ng Tagalog ? + Tagalog (Filipino) + + + Neden Türkçe konuşamıyorlar? + Turkish + + + Нишләп олар татарча сүләша алмыйлар? + Tatar + + + Чому б їм не розмовляти українською ? + Ukranian + + + ﻦﻴﻫ ﻰﺘﻠﻭﺒ ﻦﻴﻬﻨ ﻦﻭﻴﻜ ﻮﺪﺭﺃ بس ﻮﻩ ﻟﻮﮒ؟ + Urdu (IN) + + + ﻦﻴﻫ ﻰﺘﻠﻭﺒ ﻦﻴﻬﻨ ﻦﻭﻴﻜ ﻮﺪﺭﺃ بس ﻮﻩ ﻟﻮﮒ؟ + Urdu (PK) + + + + Nega ular uzbek tilinda gapirmaidilar? + Uzbek + + + Tại sao họ không thể chỉ nói tiếng Việt ? + Vietnamese + + + פֿאַרװאָס רעדט מען ניט פּשוט ייִדיש ? + Yiddish + + + 他们为什么不说中文 (中国) ? + Chinese (CN) + + + 他們爲什麽不說中文(台灣)? + Chinese (TW) + + + + You have no (matching) language preference set + なぜ、みんな日本語を話してくれないのか? + Why can't they just speak English ? + Pourquoi, tout simplement, ne parlent-ils pas en Français ? + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-cond-03-t-isvalid.html b/conformance-checkers/html-svg/struct-cond-03-t-isvalid.html new file mode 100644 index 00000000000000..7989905dfce7ec --- /dev/null +++ b/conformance-checkers/html-svg/struct-cond-03-t-isvalid.html @@ -0,0 +1,63 @@ + + + + struct-cond-03-t-manual.svg + + + +

    Source SVG: struct-cond-03-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-cond-03-t.svg,v $ + + + + + + + + + + + + This viewer does more than SVG Tiny + + + + + + + + + + + + + This is not an SVG Tiny Viewer + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-cond-overview-02-f-isvalid.html b/conformance-checkers/html-svg/struct-cond-overview-02-f-isvalid.html new file mode 100644 index 00000000000000..0a89eae5db1eac --- /dev/null +++ b/conformance-checkers/html-svg/struct-cond-overview-02-f-isvalid.html @@ -0,0 +1,55 @@ + + + + struct-cond-overview-02-f-manual.svg + + + +

    Source SVG: struct-cond-overview-02-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-cond-overview-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-cond-overview-03-f-isvalid.html b/conformance-checkers/html-svg/struct-cond-overview-03-f-isvalid.html new file mode 100644 index 00000000000000..000da4f1676f48 --- /dev/null +++ b/conformance-checkers/html-svg/struct-cond-overview-03-f-isvalid.html @@ -0,0 +1,49 @@ + + + + struct-cond-overview-03-f-manual.svg + + + +

    Source SVG: struct-cond-overview-03-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-cond-overview-03-f.svg,v $ + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-cond-overview-04-f-isvalid.html b/conformance-checkers/html-svg/struct-cond-overview-04-f-isvalid.html new file mode 100644 index 00000000000000..e775e8bc324e78 --- /dev/null +++ b/conformance-checkers/html-svg/struct-cond-overview-04-f-isvalid.html @@ -0,0 +1,47 @@ + + + + struct-cond-overview-04-f-manual.svg + + + +

    Source SVG: struct-cond-overview-04-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-cond-overview-04-f.svg,v $ + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-cond-overview-05-f-isvalid.html b/conformance-checkers/html-svg/struct-cond-overview-05-f-isvalid.html new file mode 100644 index 00000000000000..ff93b25160d08c --- /dev/null +++ b/conformance-checkers/html-svg/struct-cond-overview-05-f-isvalid.html @@ -0,0 +1,60 @@ + + + + struct-cond-overview-05-f-manual.svg + + + +

    Source SVG: struct-cond-overview-05-f-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-cond-overview-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-defs-01-t-isvalid.html b/conformance-checkers/html-svg/struct-defs-01-t-isvalid.html new file mode 100644 index 00000000000000..f93b3a067daa14 --- /dev/null +++ b/conformance-checkers/html-svg/struct-defs-01-t-isvalid.html @@ -0,0 +1,51 @@ + + + + struct-defs-01-t-manual.svg + + + +

    Source SVG: struct-defs-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-defs-01-t.svg,v $ + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-dom-01-b-isvalid.html b/conformance-checkers/html-svg/struct-dom-01-b-isvalid.html new file mode 100644 index 00000000000000..cf66db736b2ea7 --- /dev/null +++ b/conformance-checkers/html-svg/struct-dom-01-b-isvalid.html @@ -0,0 +1,166 @@ + + + + struct-dom-01-b-manual.svg + + + +

    Source SVG: struct-dom-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-dom-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-dom-02-b-isvalid.html b/conformance-checkers/html-svg/struct-dom-02-b-isvalid.html new file mode 100644 index 00000000000000..3dbe6f64524f8f --- /dev/null +++ b/conformance-checkers/html-svg/struct-dom-02-b-isvalid.html @@ -0,0 +1,97 @@ + + + + struct-dom-02-b-manual.svg + + + +

    Source SVG: struct-dom-02-b-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-dom-02-b.svg,v $ + + + + + + + + + + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-dom-03-b-isvalid.html b/conformance-checkers/html-svg/struct-dom-03-b-isvalid.html new file mode 100644 index 00000000000000..dba765cf969d68 --- /dev/null +++ b/conformance-checkers/html-svg/struct-dom-03-b-isvalid.html @@ -0,0 +1,97 @@ + + + + struct-dom-03-b-manual.svg + + + +

    Source SVG: struct-dom-03-b-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-dom-03-b.svg,v $ + + + + + + + + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-dom-04-b-isvalid.html b/conformance-checkers/html-svg/struct-dom-04-b-isvalid.html new file mode 100644 index 00000000000000..f3e613b2a2c26f --- /dev/null +++ b/conformance-checkers/html-svg/struct-dom-04-b-isvalid.html @@ -0,0 +1,116 @@ + + + + struct-dom-04-b-manual.svg + + + +

    Source SVG: struct-dom-04-b-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-dom-04-b.svg,v $ + + + + + + + + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-dom-05-b-isvalid.html b/conformance-checkers/html-svg/struct-dom-05-b-isvalid.html new file mode 100644 index 00000000000000..2ebb11336c4dfe --- /dev/null +++ b/conformance-checkers/html-svg/struct-dom-05-b-isvalid.html @@ -0,0 +1,114 @@ + + + + struct-dom-05-b-manual.svg + + + +

    Source SVG: struct-dom-05-b-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-dom-05-b.svg,v $ + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-dom-06-b-isvalid.html b/conformance-checkers/html-svg/struct-dom-06-b-isvalid.html new file mode 100644 index 00000000000000..a763b8476d73f0 --- /dev/null +++ b/conformance-checkers/html-svg/struct-dom-06-b-isvalid.html @@ -0,0 +1,90 @@ + + + + struct-dom-06-b-manual.svg + + + +

    Source SVG: struct-dom-06-b-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-dom-06-b.svg,v $ + + + + + + + + + + + + + + + + + + + + Removing DOM Elements is not supported + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-dom-07-f-novalid.html b/conformance-checkers/html-svg/struct-dom-07-f-novalid.html new file mode 100644 index 00000000000000..e3688befe993ac --- /dev/null +++ b/conformance-checkers/html-svg/struct-dom-07-f-novalid.html @@ -0,0 +1,81 @@ + + + + struct-dom-07-f-manual.svg + + + +

    Source SVG: struct-dom-07-f-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-dom-07-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-dom-08-f-novalid.html b/conformance-checkers/html-svg/struct-dom-08-f-novalid.html new file mode 100644 index 00000000000000..6216a6541b70e9 --- /dev/null +++ b/conformance-checkers/html-svg/struct-dom-08-f-novalid.html @@ -0,0 +1,69 @@ + + + + struct-dom-08-f-manual.svg + + + +

    Source SVG: struct-dom-08-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-dom-08-f.svg,v $ + + + + + + + + + + Test that unsuspendRedraw() doesn't throw + + + + + + $Revision: 1.8 $ + + + + + + diff --git a/conformance-checkers/html-svg/struct-dom-11-f-novalid.html b/conformance-checkers/html-svg/struct-dom-11-f-novalid.html new file mode 100644 index 00000000000000..0e9a19b7fd8faf --- /dev/null +++ b/conformance-checkers/html-svg/struct-dom-11-f-novalid.html @@ -0,0 +1,153 @@ + + + + struct-dom-11-f-manual.svg + + + +

    Source SVG: struct-dom-11-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-dom-11-f.svg,v $ + + + + + + + + + + Test getIntersectionList and getEnclosureList return value liveness + + + getIntersectionList + + + getEnclosureList + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-dom-12-b-isvalid.html b/conformance-checkers/html-svg/struct-dom-12-b-isvalid.html new file mode 100644 index 00000000000000..b5a467e685c20e --- /dev/null +++ b/conformance-checkers/html-svg/struct-dom-12-b-isvalid.html @@ -0,0 +1,84 @@ + + + + struct-dom-12-b-manual.svg + + + +

    Source SVG: struct-dom-12-b-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-dom-12-b.svg,v $ + + + + + + + + + + + + + + + + + Click on the grey rectangle to start + Test for correspondingUseElement + Test for correspondingElement + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/struct-dom-13-f-novalid.html b/conformance-checkers/html-svg/struct-dom-13-f-novalid.html new file mode 100644 index 00000000000000..3d1a44d4f3c539 --- /dev/null +++ b/conformance-checkers/html-svg/struct-dom-13-f-novalid.html @@ -0,0 +1,159 @@ + + + + struct-dom-13-f-manual.svg + + + +

    Source SVG: struct-dom-13-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-dom-13-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-dom-14-f-novalid.html b/conformance-checkers/html-svg/struct-dom-14-f-novalid.html new file mode 100644 index 00000000000000..94ef4480ea9752 --- /dev/null +++ b/conformance-checkers/html-svg/struct-dom-14-f-novalid.html @@ -0,0 +1,96 @@ + + + + struct-dom-14-f-manual.svg + + + +

    Source SVG: struct-dom-14-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-dom-14-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-dom-15-f-novalid.html b/conformance-checkers/html-svg/struct-dom-15-f-novalid.html new file mode 100644 index 00000000000000..d84d99c77b35fd --- /dev/null +++ b/conformance-checkers/html-svg/struct-dom-15-f-novalid.html @@ -0,0 +1,131 @@ + + + + struct-dom-15-f-manual.svg + + + +

    Source SVG: struct-dom-15-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-dom-15-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-dom-16-f-isvalid.html b/conformance-checkers/html-svg/struct-dom-16-f-isvalid.html new file mode 100644 index 00000000000000..e16c3a55151c0f --- /dev/null +++ b/conformance-checkers/html-svg/struct-dom-16-f-isvalid.html @@ -0,0 +1,117 @@ + + + + struct-dom-16-f-manual.svg + + + +

    Source SVG: struct-dom-16-f-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-dom-16-f.svg,v $ + + + + + + + + + + FAIL + PASS + + + + $Revision: 1.5 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-dom-17-f-novalid.html b/conformance-checkers/html-svg/struct-dom-17-f-novalid.html new file mode 100644 index 00000000000000..f24a537d0db0b6 --- /dev/null +++ b/conformance-checkers/html-svg/struct-dom-17-f-novalid.html @@ -0,0 +1,95 @@ + + + + struct-dom-17-f-manual.svg + + + +

    Source SVG: struct-dom-17-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-dom-17-f.svg,v $ + + + + + + + + + + + + + + + + + FAIL + PASS + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-dom-18-f-isvalid.html b/conformance-checkers/html-svg/struct-dom-18-f-isvalid.html new file mode 100644 index 00000000000000..89c29539372c5a --- /dev/null +++ b/conformance-checkers/html-svg/struct-dom-18-f-isvalid.html @@ -0,0 +1,130 @@ + + + + struct-dom-18-f-manual.svg + + + +

    Source SVG: struct-dom-18-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-dom-18-f.svg,v $ + + + + + + + + + + + + + + + + + + + Filler text + + FAIL + + + + $Revision: 1.4 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-dom-19-f-novalid.html b/conformance-checkers/html-svg/struct-dom-19-f-novalid.html new file mode 100644 index 00000000000000..1dabbecde7f913 --- /dev/null +++ b/conformance-checkers/html-svg/struct-dom-19-f-novalid.html @@ -0,0 +1,80 @@ + + + + struct-dom-19-f-manual.svg + + + +

    Source SVG: struct-dom-19-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-dom-19-f.svg,v $ + + + + + + + + + + + + + FAIL + PASS + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-dom-20-f-novalid.html b/conformance-checkers/html-svg/struct-dom-20-f-novalid.html new file mode 100644 index 00000000000000..d57ffb8806dc9d --- /dev/null +++ b/conformance-checkers/html-svg/struct-dom-20-f-novalid.html @@ -0,0 +1,131 @@ + + + + struct-dom-20-f-manual.svg + + + +

    Source SVG: struct-dom-20-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-dom-20-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-frag-01-t-isvalid.html b/conformance-checkers/html-svg/struct-frag-01-t-isvalid.html new file mode 100644 index 00000000000000..2627fe74e61545 --- /dev/null +++ b/conformance-checkers/html-svg/struct-frag-01-t-isvalid.html @@ -0,0 +1,41 @@ + + + + struct-frag-01-t-manual.svg + + + +

    Source SVG: struct-frag-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-frag-01-t.svg,v $ + + + + + + + + + + + + + + + diff --git a/conformance-checkers/html-svg/struct-frag-02-t-isvalid.html b/conformance-checkers/html-svg/struct-frag-02-t-isvalid.html new file mode 100644 index 00000000000000..3e2a8660bec775 --- /dev/null +++ b/conformance-checkers/html-svg/struct-frag-02-t-isvalid.html @@ -0,0 +1,51 @@ + + + + struct-frag-02-t-manual.svg + + + +

    Source SVG: struct-frag-02-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-frag-02-t.svg,v $ + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-frag-03-t-isvalid.html b/conformance-checkers/html-svg/struct-frag-03-t-isvalid.html new file mode 100644 index 00000000000000..83a83efbcb2b19 --- /dev/null +++ b/conformance-checkers/html-svg/struct-frag-03-t-isvalid.html @@ -0,0 +1,49 @@ + + + + struct-frag-03-t-manual.svg + + + +

    Source SVG: struct-frag-03-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-frag-03-t.svg,v $ + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-frag-04-t-isvalid.html b/conformance-checkers/html-svg/struct-frag-04-t-isvalid.html new file mode 100644 index 00000000000000..b43e0a2615035b --- /dev/null +++ b/conformance-checkers/html-svg/struct-frag-04-t-isvalid.html @@ -0,0 +1,49 @@ + + + + struct-frag-04-t-manual.svg + + + +

    Source SVG: struct-frag-04-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-frag-04-t.svg,v $ + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-frag-05-t-novalid.html b/conformance-checkers/html-svg/struct-frag-05-t-novalid.html new file mode 100644 index 00000000000000..e9c0a8792bc555 --- /dev/null +++ b/conformance-checkers/html-svg/struct-frag-05-t-novalid.html @@ -0,0 +1,56 @@ + + + + struct-frag-05-t-manual.svg + + + +

    Source SVG: struct-frag-05-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-frag-05-t.svg,v $ + + + + + + + + + + + + + + + Valid + + + Invalid + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-frag-06-t-isvalid.html b/conformance-checkers/html-svg/struct-frag-06-t-isvalid.html new file mode 100644 index 00000000000000..791a75610bb690 --- /dev/null +++ b/conformance-checkers/html-svg/struct-frag-06-t-isvalid.html @@ -0,0 +1,58 @@ + + + + struct-frag-06-t-manual.svg + + + +

    Source SVG: struct-frag-06-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-frag-06-t.svg,v $ + + + + + + + + + Default entities: amp, lt, gt, apos, quot: + &, <, >, ', " + Character references: + A hexadecimal (&#x41)= A + A decimal (&#65)= A + Entity references: + gray + + + + outlined + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-group-01-t-isvalid.html b/conformance-checkers/html-svg/struct-group-01-t-isvalid.html new file mode 100644 index 00000000000000..e38ea32bd3da71 --- /dev/null +++ b/conformance-checkers/html-svg/struct-group-01-t-isvalid.html @@ -0,0 +1,58 @@ + + + + struct-group-01-t-manual.svg + + + +

    Source SVG: struct-group-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-group-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-group-02-b-isvalid.html b/conformance-checkers/html-svg/struct-group-02-b-isvalid.html new file mode 100644 index 00000000000000..7a74783d8c394a --- /dev/null +++ b/conformance-checkers/html-svg/struct-group-02-b-isvalid.html @@ -0,0 +1,53 @@ + + + + struct-group-02-b-manual.svg + + + +

    Source SVG: struct-group-02-b-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-group-02-b.svg,v $ + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-group-03-t-isvalid.html b/conformance-checkers/html-svg/struct-group-03-t-isvalid.html new file mode 100644 index 00000000000000..d2525331d6cc26 --- /dev/null +++ b/conformance-checkers/html-svg/struct-group-03-t-isvalid.html @@ -0,0 +1,269 @@ + + + + struct-group-03-t-manual.svg + + + +

    Source SVG: struct-group-03-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-group-03-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + color + display + fill + fill-rule + stroke + stroke-dasharray + stroke-dashoffset + stroke-linecap + stroke-linejoin + stroke-miterlimit + stroke-width + visibility + font-family + font-size + font-style + font-weight + text-anchor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A + + + + A + + + + A + + + + A + + + + A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A + + + + A + + + + A + + + + A + + + + A + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-image-01-t-isvalid.html b/conformance-checkers/html-svg/struct-image-01-t-isvalid.html new file mode 100644 index 00000000000000..042f324ff3827d --- /dev/null +++ b/conformance-checkers/html-svg/struct-image-01-t-isvalid.html @@ -0,0 +1,46 @@ + + + + struct-image-01-t-manual.svg + + + +

    Source SVG: struct-image-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-image-01-t.svg,v $ + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-image-02-b-isvalid.html b/conformance-checkers/html-svg/struct-image-02-b-isvalid.html new file mode 100644 index 00000000000000..b28ba8b2459351 --- /dev/null +++ b/conformance-checkers/html-svg/struct-image-02-b-isvalid.html @@ -0,0 +1,69 @@ + + + + struct-image-02-b-manual.svg + + + +

    Source SVG: struct-image-02-b-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-image-02-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-image-03-t-isvalid.html b/conformance-checkers/html-svg/struct-image-03-t-isvalid.html new file mode 100644 index 00000000000000..4852a11138e80f --- /dev/null +++ b/conformance-checkers/html-svg/struct-image-03-t-isvalid.html @@ -0,0 +1,52 @@ + + + + struct-image-03-t-manual.svg + + + +

    Source SVG: struct-image-03-t-manual.svg

    + + + + + + + + + + $RCSfile: struct-image-03-t.svg,v $ + + + + + + + + + + + + + + + Gamma correction + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-image-04-t-isvalid.html b/conformance-checkers/html-svg/struct-image-04-t-isvalid.html new file mode 100644 index 00000000000000..0a99c3049a0406 --- /dev/null +++ b/conformance-checkers/html-svg/struct-image-04-t-isvalid.html @@ -0,0 +1,46 @@ + + + + struct-image-04-t-manual.svg + + + +

    Source SVG: struct-image-04-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-image-04-t.svg,v $ + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-image-05-b-isvalid.html b/conformance-checkers/html-svg/struct-image-05-b-isvalid.html new file mode 100644 index 00000000000000..6d810c721f69a3 --- /dev/null +++ b/conformance-checkers/html-svg/struct-image-05-b-isvalid.html @@ -0,0 +1,45 @@ + + + + struct-image-05-b-manual.svg + + + +

    Source SVG: struct-image-05-b-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-image-05-b.svg,v $ + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-image-06-t-isvalid.html b/conformance-checkers/html-svg/struct-image-06-t-isvalid.html new file mode 100644 index 00000000000000..0d7a38a42900c1 --- /dev/null +++ b/conformance-checkers/html-svg/struct-image-06-t-isvalid.html @@ -0,0 +1,83 @@ + + + + struct-image-06-t-manual.svg + + + +

    Source SVG: struct-image-06-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-image-06-t.svg,v $ + + + + + + + + + + Example PreserveAspectRatio - demonstrate available options + SVG to fit + + + + Viewport 1 + + + + Viewport 2 + + + + + ---------- meet ---------- + + xMid* + + + + + + ---------- meet ---------- + + *YMid + + + + + + ---------- meet ---------- + + *none + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-image-07-t-isvalid.html b/conformance-checkers/html-svg/struct-image-07-t-isvalid.html new file mode 100644 index 00000000000000..abb9fb42298622 --- /dev/null +++ b/conformance-checkers/html-svg/struct-image-07-t-isvalid.html @@ -0,0 +1,66 @@ + + + + struct-image-07-t-manual.svg + + + +

    Source SVG: struct-image-07-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-image-07-t.svg,v $ + + + + + + + + + + + + no + xml:base + + + + + + xml:base + on image + + + + + + xml:base + on parent + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-image-08-t-isvalid.html b/conformance-checkers/html-svg/struct-image-08-t-isvalid.html new file mode 100644 index 00000000000000..bd3171949356aa --- /dev/null +++ b/conformance-checkers/html-svg/struct-image-08-t-isvalid.html @@ -0,0 +1,50 @@ + + + + struct-image-08-t-manual.svg + + + +

    Source SVG: struct-image-08-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-image-08-t.svg,v $ + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-image-09-t-isvalid.html b/conformance-checkers/html-svg/struct-image-09-t-isvalid.html new file mode 100644 index 00000000000000..61b5717c9fbda5 --- /dev/null +++ b/conformance-checkers/html-svg/struct-image-09-t-isvalid.html @@ -0,0 +1,49 @@ + + + + struct-image-09-t-manual.svg + + + +

    Source SVG: struct-image-09-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-image-09-t.svg,v $ + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-image-10-t-isvalid.html b/conformance-checkers/html-svg/struct-image-10-t-isvalid.html new file mode 100644 index 00000000000000..59d76cead8492a --- /dev/null +++ b/conformance-checkers/html-svg/struct-image-10-t-isvalid.html @@ -0,0 +1,50 @@ + + + + struct-image-10-t-manual.svg + + + +

    Source SVG: struct-image-10-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-image-10-t.svg,v $ + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-image-11-b-isvalid.html b/conformance-checkers/html-svg/struct-image-11-b-isvalid.html new file mode 100644 index 00000000000000..baba6dfacee584 --- /dev/null +++ b/conformance-checkers/html-svg/struct-image-11-b-isvalid.html @@ -0,0 +1,56 @@ + + + + struct-image-11-b-manual.svg + + + +

    Source SVG: struct-image-11-b-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-image-11-b.svg,v $ + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-image-12-b-novalid.html b/conformance-checkers/html-svg/struct-image-12-b-novalid.html new file mode 100644 index 00000000000000..c9201db7cec167 --- /dev/null +++ b/conformance-checkers/html-svg/struct-image-12-b-novalid.html @@ -0,0 +1,60 @@ + + + + struct-image-12-b-manual.svg + + + +

    Source SVG: struct-image-12-b-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-image-12-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-image-13-f-isvalid.html b/conformance-checkers/html-svg/struct-image-13-f-isvalid.html new file mode 100644 index 00000000000000..fb87740daf8ed3 --- /dev/null +++ b/conformance-checkers/html-svg/struct-image-13-f-isvalid.html @@ -0,0 +1,111 @@ + + + + struct-image-13-f-manual.svg + + + +

    Source SVG: struct-image-13-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-image-13-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Greyscale, various bit depths, two with alpha + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Truecolor and indexed, various bit depths, two with alpha + + Non-interlaced images + + + + + + $Revision: 1.2 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-image-14-f-isvalid.html b/conformance-checkers/html-svg/struct-image-14-f-isvalid.html new file mode 100644 index 00000000000000..ee6ef116c1c4fe --- /dev/null +++ b/conformance-checkers/html-svg/struct-image-14-f-isvalid.html @@ -0,0 +1,111 @@ + + + + struct-image-14-f-manual.svg + + + +

    Source SVG: struct-image-14-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-image-14-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Greyscale, various bit depths, two with alpha + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Truecolor and indexed, various bit depths, two with alpha + + Interlaced images + + + + + + $Revision: 1.2 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-image-15-f-isvalid.html b/conformance-checkers/html-svg/struct-image-15-f-isvalid.html new file mode 100644 index 00000000000000..29b21469dbd695 --- /dev/null +++ b/conformance-checkers/html-svg/struct-image-15-f-isvalid.html @@ -0,0 +1,120 @@ + + + + struct-image-15-f-manual.svg + + + +

    Source SVG: struct-image-15-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-image-15-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Background color, with alpha + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Background color, with transparency + + Handling bKGd and tRNs + + + + + + $Revision: 1.2 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-image-16-f-isvalid.html b/conformance-checkers/html-svg/struct-image-16-f-isvalid.html new file mode 100644 index 00000000000000..f80990ee5bf78c --- /dev/null +++ b/conformance-checkers/html-svg/struct-image-16-f-isvalid.html @@ -0,0 +1,49 @@ + + + + struct-image-16-f-manual.svg + + + +

    Source SVG: struct-image-16-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-image-16-f.svg,v $ + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/struct-image-17-b-isvalid.html b/conformance-checkers/html-svg/struct-image-17-b-isvalid.html new file mode 100644 index 00000000000000..cd70a27a11b657 --- /dev/null +++ b/conformance-checkers/html-svg/struct-image-17-b-isvalid.html @@ -0,0 +1,46 @@ + + + + struct-image-17-b-manual.svg + + + +

    Source SVG: struct-image-17-b-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-image-17-b.svg,v $ + + + + + + + + + Test that SVG images in <image> are not scripted or animated + + + + $Revision: 1.2 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-image-18-f-isvalid.html b/conformance-checkers/html-svg/struct-image-18-f-isvalid.html new file mode 100644 index 00000000000000..8f7d163ce69adc --- /dev/null +++ b/conformance-checkers/html-svg/struct-image-18-f-isvalid.html @@ -0,0 +1,52 @@ + + + + struct-image-18-f-manual.svg + + + +

    Source SVG: struct-image-18-f-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-image-18-f.svg,v $ + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-image-19-f-isvalid.html b/conformance-checkers/html-svg/struct-image-19-f-isvalid.html new file mode 100644 index 00000000000000..c6ff4c82c4d855 --- /dev/null +++ b/conformance-checkers/html-svg/struct-image-19-f-isvalid.html @@ -0,0 +1,53 @@ + + + + struct-image-19-f-manual.svg + + + +

    Source SVG: struct-image-19-f-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-image-19-f.svg,v $ + + + + + + + + + + + + + + + + + $Revision: 1.1 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-svg-01-f-isvalid.html b/conformance-checkers/html-svg/struct-svg-01-f-isvalid.html new file mode 100644 index 00000000000000..24f927f9da9583 --- /dev/null +++ b/conformance-checkers/html-svg/struct-svg-01-f-isvalid.html @@ -0,0 +1,114 @@ + + + + struct-svg-01-f-manual.svg + + + +

    Source SVG: struct-svg-01-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-svg-01-f.svg,v $ + + + + + + + + + + + + Initial value of the 'svg' tag's 'width' attribute: + + + Initial value of the 'svg' tag's 'height' attribute: + + + Initial value of the 'svg' tag's 'x' attribute: + + + Initial value of the 'svg' tag's 'y' attribute: + + + FAIL + + + + + + $Revision: 1.4 $ + + + + + + + + diff --git a/conformance-checkers/html-svg/struct-svg-02-f-isvalid.html b/conformance-checkers/html-svg/struct-svg-02-f-isvalid.html new file mode 100644 index 00000000000000..b5a4b3f49f7d86 --- /dev/null +++ b/conformance-checkers/html-svg/struct-svg-02-f-isvalid.html @@ -0,0 +1,134 @@ + + + + struct-svg-02-f-manual.svg + + + +

    Source SVG: struct-svg-02-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-svg-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-svg-03-f-isvalid.html b/conformance-checkers/html-svg/struct-svg-03-f-isvalid.html new file mode 100644 index 00000000000000..edb9af23d6ca87 --- /dev/null +++ b/conformance-checkers/html-svg/struct-svg-03-f-isvalid.html @@ -0,0 +1,60 @@ + + + + struct-svg-03-f-manual.svg + + + +

    Source SVG: struct-svg-03-f-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-svg-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.1 $ + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-symbol-01-b-isvalid.html b/conformance-checkers/html-svg/struct-symbol-01-b-isvalid.html new file mode 100644 index 00000000000000..e52bc5632f3f30 --- /dev/null +++ b/conformance-checkers/html-svg/struct-symbol-01-b-isvalid.html @@ -0,0 +1,60 @@ + + + + struct-symbol-01-b-manual.svg + + + +

    Source SVG: struct-symbol-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-symbol-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-use-01-t-isvalid.html b/conformance-checkers/html-svg/struct-use-01-t-isvalid.html new file mode 100644 index 00000000000000..da3389e6de2788 --- /dev/null +++ b/conformance-checkers/html-svg/struct-use-01-t-isvalid.html @@ -0,0 +1,99 @@ + + + + struct-use-01-t-manual.svg + + + +

    Source SVG: struct-use-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-use-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Text + + + + + + + <rect> + <circle> + <ellipse> + <line> + <polyline> + <polygon> + <path> + <image> + <text> + + + <g> + <use> + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-use-03-t-isvalid.html b/conformance-checkers/html-svg/struct-use-03-t-isvalid.html new file mode 100644 index 00000000000000..2f917b3309d3ab --- /dev/null +++ b/conformance-checkers/html-svg/struct-use-03-t-isvalid.html @@ -0,0 +1,61 @@ + + + + struct-use-03-t-manual.svg + + + +

    Source SVG: struct-use-03-t-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-use-03-t.svg,v $ + + + + + + + + + + + + + Reference + + <use> + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-use-04-b-isvalid.html b/conformance-checkers/html-svg/struct-use-04-b-isvalid.html new file mode 100644 index 00000000000000..a3c60058cd02d0 --- /dev/null +++ b/conformance-checkers/html-svg/struct-use-04-b-isvalid.html @@ -0,0 +1,54 @@ + + + + struct-use-04-b-manual.svg + + + +

    Source SVG: struct-use-04-b-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-use-04-b.svg,v $ + + + + + + + + + + + + + + + + + + External references on <use> + + + $Revision: 1.6 $ + + + + + + diff --git a/conformance-checkers/html-svg/struct-use-05-b-isvalid.html b/conformance-checkers/html-svg/struct-use-05-b-isvalid.html new file mode 100644 index 00000000000000..e5ade488fcf06d --- /dev/null +++ b/conformance-checkers/html-svg/struct-use-05-b-isvalid.html @@ -0,0 +1,70 @@ + + + + struct-use-05-b-manual.svg + + + +

    Source SVG: struct-use-05-b-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-use-05-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + External references and computed values + + + + $Revision: 1.4 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-use-06-b-isvalid.html b/conformance-checkers/html-svg/struct-use-06-b-isvalid.html new file mode 100644 index 00000000000000..613ed6fcfb893c --- /dev/null +++ b/conformance-checkers/html-svg/struct-use-06-b-isvalid.html @@ -0,0 +1,51 @@ + + + + struct-use-06-b-manual.svg + + + +

    Source SVG: struct-use-06-b-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-use-06-b.svg,v $ + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-use-07-b-isvalid.html b/conformance-checkers/html-svg/struct-use-07-b-isvalid.html new file mode 100644 index 00000000000000..84d9a1cd54d212 --- /dev/null +++ b/conformance-checkers/html-svg/struct-use-07-b-isvalid.html @@ -0,0 +1,56 @@ + + + + struct-use-07-b-manual.svg + + + +

    Source SVG: struct-use-07-b-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-use-07-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-use-08-b-isvalid.html b/conformance-checkers/html-svg/struct-use-08-b-isvalid.html new file mode 100644 index 00000000000000..0e42e2b1b7d9e6 --- /dev/null +++ b/conformance-checkers/html-svg/struct-use-08-b-isvalid.html @@ -0,0 +1,57 @@ + + + + struct-use-08-b-manual.svg + + + +

    Source SVG: struct-use-08-b-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-use-08-b.svg,v $ + + + + + + + + + + + + 'use' referencing 'svg' element + + + + + + 'use' referencing 'image' element + + + This text should be visible. + + + $Revision: 1.5 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-use-09-b-isvalid.html b/conformance-checkers/html-svg/struct-use-09-b-isvalid.html new file mode 100644 index 00000000000000..70b079a1c12e18 --- /dev/null +++ b/conformance-checkers/html-svg/struct-use-09-b-isvalid.html @@ -0,0 +1,67 @@ + + + + struct-use-09-b-manual.svg + + + +

    Source SVG: struct-use-09-b-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-use-09-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-use-10-f-isvalid.html b/conformance-checkers/html-svg/struct-use-10-f-isvalid.html new file mode 100644 index 00000000000000..f2da4cd7ece387 --- /dev/null +++ b/conformance-checkers/html-svg/struct-use-10-f-isvalid.html @@ -0,0 +1,121 @@ + + + + struct-use-10-f-manual.svg + + + +

    Source SVG: struct-use-10-f-manual.svg

    + + + + + + + + + + + + $RCSfile: struct-use-10-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + CSS selectors and use element + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-use-11-f-novalid.html b/conformance-checkers/html-svg/struct-use-11-f-novalid.html new file mode 100644 index 00000000000000..ad303ba7c29064 --- /dev/null +++ b/conformance-checkers/html-svg/struct-use-11-f-novalid.html @@ -0,0 +1,137 @@ + + + + struct-use-11-f-manual.svg + + + +

    Source SVG: struct-use-11-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-use-11-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/struct-use-12-f-novalid.html b/conformance-checkers/html-svg/struct-use-12-f-novalid.html new file mode 100644 index 00000000000000..bddac061e44100 --- /dev/null +++ b/conformance-checkers/html-svg/struct-use-12-f-novalid.html @@ -0,0 +1,86 @@ + + + + struct-use-12-f-manual.svg + + + +

    Source SVG: struct-use-12-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-use-12-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/struct-use-13-f-novalid.html b/conformance-checkers/html-svg/struct-use-13-f-novalid.html new file mode 100644 index 00000000000000..7bd9b978ceba31 --- /dev/null +++ b/conformance-checkers/html-svg/struct-use-13-f-novalid.html @@ -0,0 +1,65 @@ + + + + struct-use-13-f-manual.svg + + + +

    Source SVG: struct-use-13-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-use-13-f.svg,v $ + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + + diff --git a/conformance-checkers/html-svg/struct-use-14-f-isvalid.html b/conformance-checkers/html-svg/struct-use-14-f-isvalid.html new file mode 100644 index 00000000000000..6812e604282073 --- /dev/null +++ b/conformance-checkers/html-svg/struct-use-14-f-isvalid.html @@ -0,0 +1,63 @@ + + + + struct-use-14-f-manual.svg + + + +

    Source SVG: struct-use-14-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-use-14-f.svg,v $ + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/struct-use-15-f-isvalid.html b/conformance-checkers/html-svg/struct-use-15-f-isvalid.html new file mode 100644 index 00000000000000..2dd2cea81a7590 --- /dev/null +++ b/conformance-checkers/html-svg/struct-use-15-f-isvalid.html @@ -0,0 +1,66 @@ + + + + struct-use-15-f-manual.svg + + + +

    Source SVG: struct-use-15-f-manual.svg

    + + + + + + + + + + $RCSfile: struct-use-15-f.svg,v $ + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/styling-class-01-f-isvalid.html b/conformance-checkers/html-svg/styling-class-01-f-isvalid.html new file mode 100644 index 00000000000000..923205d9150595 --- /dev/null +++ b/conformance-checkers/html-svg/styling-class-01-f-isvalid.html @@ -0,0 +1,62 @@ + + + + styling-class-01-f-manual.svg + + + +

    Source SVG: styling-class-01-f-manual.svg

    + + + + + + + + + + $RCSfile: styling-class-01-f.svg,v $ + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/styling-css-01-b-isvalid.html b/conformance-checkers/html-svg/styling-css-01-b-isvalid.html new file mode 100644 index 00000000000000..e5e0ab36043171 --- /dev/null +++ b/conformance-checkers/html-svg/styling-css-01-b-isvalid.html @@ -0,0 +1,82 @@ + + + + styling-css-01-b-manual.svg + + + +

    Source SVG: styling-css-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: styling-css-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + element selectors: + + + + + + + + + + + + + + + class selectors: + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/styling-css-02-b-isvalid.html b/conformance-checkers/html-svg/styling-css-02-b-isvalid.html new file mode 100644 index 00000000000000..6845ede211dd0c --- /dev/null +++ b/conformance-checkers/html-svg/styling-css-02-b-isvalid.html @@ -0,0 +1,78 @@ + + + + styling-css-02-b-manual.svg + + + +

    Source SVG: styling-css-02-b-manual.svg

    + + + + + + + + + + + + $RCSfile: styling-css-02-b.svg,v $ + + + + + + + + + + + + + + + + id selectors: + + + + + + + + + + + + + + attribute selectors: + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/styling-css-03-b-isvalid.html b/conformance-checkers/html-svg/styling-css-03-b-isvalid.html new file mode 100644 index 00000000000000..2bc98ea6ce5fc7 --- /dev/null +++ b/conformance-checkers/html-svg/styling-css-03-b-isvalid.html @@ -0,0 +1,84 @@ + + + + styling-css-03-b-manual.svg + + + +

    Source SVG: styling-css-03-b-manual.svg

    + + + + + + + + + + + + $RCSfile: styling-css-03-b.svg,v $ + + + + + + + + + + + + + + + ancestor selectors and child selectors: + + + + + + + + + + + + + + + ancestor, immediate-sibling and first-child selectors: + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/styling-css-04-f-isvalid.html b/conformance-checkers/html-svg/styling-css-04-f-isvalid.html new file mode 100644 index 00000000000000..e9aeb2e163256a --- /dev/null +++ b/conformance-checkers/html-svg/styling-css-04-f-isvalid.html @@ -0,0 +1,141 @@ + + + + styling-css-04-f-manual.svg + + + +

    Source SVG: styling-css-04-f-manual.svg

    + + + + + + + + + + + + $RCSfile: styling-css-04-f.svg,v $ + + + + + + + + + + CSS selector test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A + B + C + D + E + F + 1 + 2 + 3 + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/styling-css-05-b-isvalid.html b/conformance-checkers/html-svg/styling-css-05-b-isvalid.html new file mode 100644 index 00000000000000..9b831845f6a7ad --- /dev/null +++ b/conformance-checkers/html-svg/styling-css-05-b-isvalid.html @@ -0,0 +1,60 @@ + + + + styling-css-05-b-manual.svg + + + +

    Source SVG: styling-css-05-b-manual.svg

    + + + + + + + + + + + + $RCSfile: styling-css-05-b.svg,v $ + + + + + + + + + + + + + + + + Good morning! + + Bon avant-midi! + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/styling-css-06-b-isvalid.html b/conformance-checkers/html-svg/styling-css-06-b-isvalid.html new file mode 100644 index 00000000000000..2767329013e748 --- /dev/null +++ b/conformance-checkers/html-svg/styling-css-06-b-isvalid.html @@ -0,0 +1,165 @@ + + + + styling-css-06-b-manual.svg + + + +

    Source SVG: styling-css-06-b-manual.svg

    + + + + + + + + + + + + $RCSfile: styling-css-06-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Visited + + + Unvisited + + + Hover me + + And me, too! + Select me + + + + $Revision: 1.4 $ + + + + + + + diff --git a/conformance-checkers/html-svg/styling-css-07-f-isvalid.html b/conformance-checkers/html-svg/styling-css-07-f-isvalid.html new file mode 100644 index 00000000000000..e08d2febdfa208 --- /dev/null +++ b/conformance-checkers/html-svg/styling-css-07-f-isvalid.html @@ -0,0 +1,50 @@ + + + + styling-css-07-f-manual.svg + + + +

    Source SVG: styling-css-07-f-manual.svg

    + + + + + + + + + + $RCSfile: styling-css-07-f.svg,v $ + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/styling-css-08-f-isvalid.html b/conformance-checkers/html-svg/styling-css-08-f-isvalid.html new file mode 100644 index 00000000000000..ab31884c8a159a --- /dev/null +++ b/conformance-checkers/html-svg/styling-css-08-f-isvalid.html @@ -0,0 +1,104 @@ + + + + styling-css-08-f-manual.svg + + + +

    Source SVG: styling-css-08-f-manual.svg

    + + + + + + + + + + $RCSfile: styling-css-08-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/styling-css-09-f-isvalid.html b/conformance-checkers/html-svg/styling-css-09-f-isvalid.html new file mode 100644 index 00000000000000..f7e053ef682594 --- /dev/null +++ b/conformance-checkers/html-svg/styling-css-09-f-isvalid.html @@ -0,0 +1,70 @@ + + + + styling-css-09-f-manual.svg + + + +

    Source SVG: styling-css-09-f-manual.svg

    + + + + + + + + + + $RCSfile: styling-css-09-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/styling-css-10-f-isvalid.html b/conformance-checkers/html-svg/styling-css-10-f-isvalid.html new file mode 100644 index 00000000000000..1f2f2ff2ab111f --- /dev/null +++ b/conformance-checkers/html-svg/styling-css-10-f-isvalid.html @@ -0,0 +1,59 @@ + + + + styling-css-10-f-manual.svg + + + +

    Source SVG: styling-css-10-f-manual.svg

    + + + + + + + + + + $RCSfile: styling-css-10-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/styling-elem-01-b-isvalid.html b/conformance-checkers/html-svg/styling-elem-01-b-isvalid.html new file mode 100644 index 00000000000000..6d59038b16b801 --- /dev/null +++ b/conformance-checkers/html-svg/styling-elem-01-b-isvalid.html @@ -0,0 +1,56 @@ + + + + styling-elem-01-b-manual.svg + + + +

    Source SVG: styling-elem-01-b-manual.svg

    + + + + + + + + + + $RCSfile: styling-elem-01-b.svg,v $ + + + + + + + + + + Test that <style type=""> is honored + + + + No type="" attribute + Rubbish type="" attribute + + + + + + + $Revision: 1.6 $ + + + + + + diff --git a/conformance-checkers/html-svg/styling-inherit-01-b-isvalid.html b/conformance-checkers/html-svg/styling-inherit-01-b-isvalid.html new file mode 100644 index 00000000000000..a3709ae708107d --- /dev/null +++ b/conformance-checkers/html-svg/styling-inherit-01-b-isvalid.html @@ -0,0 +1,61 @@ + + + + styling-inherit-01-b-manual.svg + + + +

    Source SVG: styling-inherit-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: styling-inherit-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/styling-pres-01-t-isvalid.html b/conformance-checkers/html-svg/styling-pres-01-t-isvalid.html new file mode 100644 index 00000000000000..329792c63f00be --- /dev/null +++ b/conformance-checkers/html-svg/styling-pres-01-t-isvalid.html @@ -0,0 +1,48 @@ + + + + styling-pres-01-t-manual.svg + + + +

    Source SVG: styling-pres-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: styling-pres-01-t.svg,v $ + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/styling-pres-02-f-novalid.html b/conformance-checkers/html-svg/styling-pres-02-f-novalid.html new file mode 100644 index 00000000000000..35fa750d414038 --- /dev/null +++ b/conformance-checkers/html-svg/styling-pres-02-f-novalid.html @@ -0,0 +1,185 @@ + + + + styling-pres-02-f-manual.svg + + + +

    Source SVG: styling-pres-02-f-manual.svg

    + + + + + + + + + + $RCSfile: styling-pres-02-f.svg,v $ + + + + + + + + + Testing inapplicable presentation attributes + + + + + + + + + abc + + + + + + + + fill on image + + + stop-opacity on tspan + + + font-size on rect + + + font-style on circle + + + stop-color on text + + + font-variant on ellipse + + + letter-spacing on polyline + + + flood-color on tref + + + flood-opacity on textPath + + + clr-intp-filters on altGlyph + + + display on linearGradient + + + fill-rule on stop + + + visibility on radialGradient + + + lighting-color on clipPath + + + + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/styling-pres-03-f-isvalid.html b/conformance-checkers/html-svg/styling-pres-03-f-isvalid.html new file mode 100644 index 00000000000000..117eb41ad59792 --- /dev/null +++ b/conformance-checkers/html-svg/styling-pres-03-f-isvalid.html @@ -0,0 +1,48 @@ + + + + styling-pres-03-f-manual.svg + + + +

    Source SVG: styling-pres-03-f-manual.svg

    + + + + + + + + + + $RCSfile: styling-pres-03-f.svg,v $ + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/styling-pres-04-f-isvalid.html b/conformance-checkers/html-svg/styling-pres-04-f-isvalid.html new file mode 100644 index 00000000000000..6ddcdb289eff88 --- /dev/null +++ b/conformance-checkers/html-svg/styling-pres-04-f-isvalid.html @@ -0,0 +1,93 @@ + + + + styling-pres-04-f-manual.svg + + + +

    Source SVG: styling-pres-04-f-manual.svg

    + + + + + + + + + + $RCSfile: styling-pres-04-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/styling-pres-05-f-isvalid.html b/conformance-checkers/html-svg/styling-pres-05-f-isvalid.html new file mode 100644 index 00000000000000..226dc0db47cf6f --- /dev/null +++ b/conformance-checkers/html-svg/styling-pres-05-f-isvalid.html @@ -0,0 +1,66 @@ + + + + styling-pres-05-f-manual.svg + + + +

    Source SVG: styling-pres-05-f-manual.svg

    + + + + + + + + + + $RCSfile: styling-pres-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/svgdom-over-01-f-novalid.html b/conformance-checkers/html-svg/svgdom-over-01-f-novalid.html new file mode 100644 index 00000000000000..71108691bd0c21 --- /dev/null +++ b/conformance-checkers/html-svg/svgdom-over-01-f-novalid.html @@ -0,0 +1,190 @@ + + + + svgdom-over-01-f-manual.svg + + + +

    Source SVG: svgdom-over-01-f-manual.svg

    + + + + + + + + + + $RCSfile: svgdom-over-01-f.svg,v $ + + + + + + + + + + + + + + + + sometext + + + + + + + + + + + $Revision: 1.9 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/text-align-01-b-isvalid.html b/conformance-checkers/html-svg/text-align-01-b-isvalid.html new file mode 100644 index 00000000000000..edfd5a317f3bc1 --- /dev/null +++ b/conformance-checkers/html-svg/text-align-01-b-isvalid.html @@ -0,0 +1,67 @@ + + + + text-align-01-b-manual.svg + + + +

    Source SVG: text-align-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-align-01-b.svg,v $ + + + + + + + + + Test 'text-anchor' (horizontal) + + + + + text-anchor:none + + + + + text-anchor:start + + + + + text-anchor:middle + + + + + text-anchor:end + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-align-02-b-isvalid.html b/conformance-checkers/html-svg/text-align-02-b-isvalid.html new file mode 100644 index 00000000000000..098c04096f8692 --- /dev/null +++ b/conformance-checkers/html-svg/text-align-02-b-isvalid.html @@ -0,0 +1,56 @@ + + + + text-align-02-b-manual.svg + + + +

    Source SVG: text-align-02-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-align-02-b.svg,v $ + + + + + + + + + Test 'baseline-shift' (horizontal) + + + Normalbaseline-shift:7text + + + Normalbaseline-shift:-70%text + + + Normalsubsupertext + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-align-03-b-isvalid.html b/conformance-checkers/html-svg/text-align-03-b-isvalid.html new file mode 100644 index 00000000000000..c6e84fa2f6b143 --- /dev/null +++ b/conformance-checkers/html-svg/text-align-03-b-isvalid.html @@ -0,0 +1,53 @@ + + + + text-align-03-b-manual.svg + + + +

    Source SVG: text-align-03-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-align-03-b.svg,v $ + + + + + + + + + Test of 'text-anchor' + + + + + + Begin with "end", switch to "middle" in a tspan, and "start" ends it. + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-align-04-b-isvalid.html b/conformance-checkers/html-svg/text-align-04-b-isvalid.html new file mode 100644 index 00000000000000..80cb910d30c43d --- /dev/null +++ b/conformance-checkers/html-svg/text-align-04-b-isvalid.html @@ -0,0 +1,72 @@ + + + + text-align-04-b-manual.svg + + + +

    Source SVG: text-align-04-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-align-04-b.svg,v $ + + + + + + + + + + + + + + Test of 'text-anchor' + + end text tref + + + + Tspan, tref, toap + + + + + start text pink tspan + + + middle text bold tspan + + + + + + Text-anchor: end text on path + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-align-05-b-isvalid.html b/conformance-checkers/html-svg/text-align-05-b-isvalid.html new file mode 100644 index 00000000000000..98fba0d2917bdb --- /dev/null +++ b/conformance-checkers/html-svg/text-align-05-b-isvalid.html @@ -0,0 +1,61 @@ + + + + text-align-05-b-manual.svg + + + +

    Source SVG: text-align-05-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-align-05-b.svg,v $ + + + + + + + + + Test 'text-anchor' (vertical) + + + + + start + + + + middle + + + + end + + + + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-align-06-b-isvalid.html b/conformance-checkers/html-svg/text-align-06-b-isvalid.html new file mode 100644 index 00000000000000..3ceb6a540df186 --- /dev/null +++ b/conformance-checkers/html-svg/text-align-06-b-isvalid.html @@ -0,0 +1,62 @@ + + + + text-align-06-b-manual.svg + + + +

    Source SVG: text-align-06-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-align-06-b.svg,v $ + + + + + + + + + Test 'baseline-shift' (vertic.) + + + + + te7xt + + + te-70%xt + + + tesubxt + + + tesuperxt + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-align-07-t-isvalid.html b/conformance-checkers/html-svg/text-align-07-t-isvalid.html new file mode 100644 index 00000000000000..865da7e53a3b91 --- /dev/null +++ b/conformance-checkers/html-svg/text-align-07-t-isvalid.html @@ -0,0 +1,69 @@ + + + + text-align-07-t-manual.svg + + + +

    Source SVG: text-align-07-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-align-07-t.svg,v $ + + + + + + + + + + + + a犜णa犜णa犜ण + + + + hanging base line + + + + alphabetic base line + + + + ideographic base line + + + + + $Revision: 1.9 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/text-align-08-b-isvalid.html b/conformance-checkers/html-svg/text-align-08-b-isvalid.html new file mode 100644 index 00000000000000..d94599332e59ac --- /dev/null +++ b/conformance-checkers/html-svg/text-align-08-b-isvalid.html @@ -0,0 +1,73 @@ + + + + text-align-08-b-manual.svg + + + +

    Source SVG: text-align-08-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-align-08-b.svg,v $ + + + + + + + + + + + + + + + + + + + + a犜णa犜णa犜ण + + + + + + + + $Revision: 1.10 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/text-altglyph-01-b-isvalid.html b/conformance-checkers/html-svg/text-altglyph-01-b-isvalid.html new file mode 100644 index 00000000000000..f339b216b4d88c --- /dev/null +++ b/conformance-checkers/html-svg/text-altglyph-01-b-isvalid.html @@ -0,0 +1,100 @@ + + + + text-altglyph-01-b-manual.svg + + + +

    Source SVG: text-altglyph-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-altglyph-01-b.svg,v $ + + + + + + + + + + Test 'altGlyph' facilities + and many-to-many chars to glyphs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +H +A +P +P +Y + + + SAD + + SASSY + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-altglyph-02-b-isvalid.html b/conformance-checkers/html-svg/text-altglyph-02-b-isvalid.html new file mode 100644 index 00000000000000..01a47f922e8fa6 --- /dev/null +++ b/conformance-checkers/html-svg/text-altglyph-02-b-isvalid.html @@ -0,0 +1,323 @@ + + + + text-altglyph-02-b-manual.svg + + + +

    Source SVG: text-altglyph-02-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-altglyph-02-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Actual + Expected + Actual + Expected + + + + + + + + + abcde + + + abcde + + + abcde + + + abcde + + + + + abcde + + + abcde + + + abcde + + + abcde + + + abcde + + + abcde + + + + + + + abde + + + abde + + + abde + + + abde + + + abde + + + abde + + + + + abcde + + + abcde + + + abcde + + + abcde + + + + + a + b + + + + + + abcde + + + abcde + + + abcde + + abcde + + + abcde + + + abcde + + + abcde + + + abcde + + + abcde + + abcde + + + + + abcde + + + abcde + + + abcde + + + abcde + + + abcde + + abde + + + acde + + + acde + + + acde + + abcde + + + + + + + + + + + + $Revision: 1.10 $ + + + + + + diff --git a/conformance-checkers/html-svg/text-altglyph-03-b-isvalid.html b/conformance-checkers/html-svg/text-altglyph-03-b-isvalid.html new file mode 100644 index 00000000000000..595f8a134529b9 --- /dev/null +++ b/conformance-checkers/html-svg/text-altglyph-03-b-isvalid.html @@ -0,0 +1,348 @@ + + + + text-altglyph-03-b-manual.svg + + + +

    Source SVG: text-altglyph-03-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-altglyph-03-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Actual + Expected + Actual + Expected + + + + + + + + + abcde + + + abcde + + + abcde + + + abcde + + + + + abcde + + + abcde + + + abcde + + + abcde + + + abcde + + + abcde + + + + + bcde + + + bcde + + + bcde + + + bcde + + + + + + + abde + + + abde + + + abde + + + abde + + + abde + + + abde + + + + + abcde + + + abcde + + + abcde + + + abcde + + + + + a + b + + + + + + abcde + + + abcde + + + abcde + + abcde + + + abcde + + + abcde + + + abcde + + + abcde + + + abcde + + abcde + + + abcde + + + abcde + + + abcde + + bcde + + + + + abcde + + + abcde + + + abcde + + + abcde + + + abcde + + abde + + + acde + + + acde + + + acde + + abcde + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/text-bidi-01-t-isvalid.html b/conformance-checkers/html-svg/text-bidi-01-t-isvalid.html new file mode 100644 index 00000000000000..ecd3a129314b61 --- /dev/null +++ b/conformance-checkers/html-svg/text-bidi-01-t-isvalid.html @@ -0,0 +1,49 @@ + + + + text-bidi-01-t-manual.svg + + + +

    Source SVG: text-bidi-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-bidi-01-t.svg,v $ + + + + + + + + + مفتاح معايير الويب + + + + $Revision: 1.1 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/text-deco-01-b-isvalid.html b/conformance-checkers/html-svg/text-deco-01-b-isvalid.html new file mode 100644 index 00000000000000..d42609eb21594b --- /dev/null +++ b/conformance-checkers/html-svg/text-deco-01-b-isvalid.html @@ -0,0 +1,60 @@ + + + + text-deco-01-b-manual.svg + + + +

    Source SVG: text-deco-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-deco-01-b.svg,v $ + + + + + + + + + + Normal text + Text with line-through + Underlined text + + + One + word + has + different + underlining + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-dom-01-f-isvalid.html b/conformance-checkers/html-svg/text-dom-01-f-isvalid.html new file mode 100644 index 00000000000000..198307a9091150 --- /dev/null +++ b/conformance-checkers/html-svg/text-dom-01-f-isvalid.html @@ -0,0 +1,161 @@ + + + + text-dom-01-f-manual.svg + + + +

    Source SVG: text-dom-01-f-manual.svg

    + + + + + + + + + + + + $RCSfile: text-dom-01-f.svg,v $ + + + + + + + + + + + + This is a test of the interface SVGTextContentElement. + + .getCharNumAtPosition() result: + .getComputedTextLength() result: + .getEndPositionOfChar(11) result ('e'): + .getExtentOfChar(11) result ('e'): + .getNumberOfChars() result: + .getRotationOfChar(5) result: + .getStartPositionOfChar(11) result: + .getSubStringLength(22,9) result ('interface'): + .selectSubString(18,3) result: the word 'the' should be selected + .textLength.baseVal.value result: + .textLength.animVal.value result: + .lengthAdjust.baseVal and .lengthAdjust.animVal result: + + + + $Revision: 1.4 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/text-dom-02-f-novalid.html b/conformance-checkers/html-svg/text-dom-02-f-novalid.html new file mode 100644 index 00000000000000..da0d7228b3cf1a --- /dev/null +++ b/conformance-checkers/html-svg/text-dom-02-f-novalid.html @@ -0,0 +1,110 @@ + + + + text-dom-02-f-manual.svg + + + +

    Source SVG: text-dom-02-f-manual.svg

    + + + + + + + + + + + + $RCSfile: text-dom-02-f.svg,v $ + + + + + + + + + Test that SVGTextContentElement methods work on UTF-16 code units + Methods independent of layout + + + + + + + + a𐀀b + + + getNumberOfChars + + + getSubStringLength + + + + + $Revision: 1.10 $ + + + + + + diff --git a/conformance-checkers/html-svg/text-dom-03-f-novalid.html b/conformance-checkers/html-svg/text-dom-03-f-novalid.html new file mode 100644 index 00000000000000..d9ce2ca074913b --- /dev/null +++ b/conformance-checkers/html-svg/text-dom-03-f-novalid.html @@ -0,0 +1,113 @@ + + + + text-dom-03-f-manual.svg + + + +

    Source SVG: text-dom-03-f-manual.svg

    + + + + + + + + + + + + $RCSfile: text-dom-03-f.svg,v $ + + + + + + + + + Test that getSubStringLength() handles out-of-range arguments + + + + + + + + + ababa + + + charnum < 0 + + + nchars < 0 + + + charnum = 0, nchars = length + + + charnum = 0, nchars = length + 10 + + + charnum = 1, nchars = -1 + + + + + $Revision: 1.9 $ + + + + + + diff --git a/conformance-checkers/html-svg/text-dom-04-f-isvalid.html b/conformance-checkers/html-svg/text-dom-04-f-isvalid.html new file mode 100644 index 00000000000000..76ac4659814f93 --- /dev/null +++ b/conformance-checkers/html-svg/text-dom-04-f-isvalid.html @@ -0,0 +1,149 @@ + + + + text-dom-04-f-manual.svg + + + +

    Source SVG: text-dom-04-f-manual.svg

    + + + + + + + + + + $RCSfile: text-dom-04-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + abca𝍒cb + + + + + + $Revision: 1.4 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/text-dom-05-f-novalid.html b/conformance-checkers/html-svg/text-dom-05-f-novalid.html new file mode 100644 index 00000000000000..af843569ba6fbf --- /dev/null +++ b/conformance-checkers/html-svg/text-dom-05-f-novalid.html @@ -0,0 +1,157 @@ + + + + text-dom-05-f-manual.svg + + + +

    Source SVG: text-dom-05-f-manual.svg

    + + + + + + + + + + + + $RCSfile: text-dom-05-f.svg,v $ + + + + + + + + + Test that SVGTextContentElement methods work on UTF-16 code units + Methods that rely on layout + + + + + + + + a𐀀b + + + getStartPositionOfChar + + + getEndPositionOfChar + + + getExtentOfChar + + + getRotationOfChar + + + getCharNumAtPosition + + + + + $Revision: 1.6 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/text-fonts-01-t-isvalid.html b/conformance-checkers/html-svg/text-fonts-01-t-isvalid.html new file mode 100644 index 00000000000000..1f228b767646ed --- /dev/null +++ b/conformance-checkers/html-svg/text-fonts-01-t-isvalid.html @@ -0,0 +1,55 @@ + + + + text-fonts-01-t-manual.svg + + + +

    Source SVG: text-fonts-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-fonts-01-t.svg,v $ + + + + + + + + + + A serifed face 画像 + A sans-serif face 画像 + A mono (iW) face 画像 + + A serifed face 画像 + A sans-serif face 画像 + A mono (iW) face 画像 + + This must be displayed + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-fonts-02-t-isvalid.html b/conformance-checkers/html-svg/text-fonts-02-t-isvalid.html new file mode 100644 index 00000000000000..9a94bf4e81e22b --- /dev/null +++ b/conformance-checkers/html-svg/text-fonts-02-t-isvalid.html @@ -0,0 +1,63 @@ + + + + text-fonts-02-t-manual.svg + + + +

    Source SVG: text-fonts-02-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-fonts-02-t.svg,v $ + + + + + + + + + + 100 + 200 + 300 + 400 + 500 + 600 + 700 + 800 + 900 + This is bold + This is normal + + Blue is bolder + + + Blue is lighter + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-fonts-03-t-novalid.html b/conformance-checkers/html-svg/text-fonts-03-t-novalid.html new file mode 100644 index 00000000000000..8417477271af06 --- /dev/null +++ b/conformance-checkers/html-svg/text-fonts-03-t-novalid.html @@ -0,0 +1,73 @@ + + + + text-fonts-03-t-manual.svg + + + +

    Source SVG: text-fonts-03-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-fonts-03-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + font-family = "Haettenschweiler" + ABC + + font-family = "Charlesworth" + ABC + + font-family = "Invalid Name" + ABC + + font-family = not specified + ABC + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-fonts-04-t-isvalid.html b/conformance-checkers/html-svg/text-fonts-04-t-isvalid.html new file mode 100644 index 00000000000000..488e07f81b2ba4 --- /dev/null +++ b/conformance-checkers/html-svg/text-fonts-04-t-isvalid.html @@ -0,0 +1,59 @@ + + + + text-fonts-04-t-manual.svg + + + +

    Source SVG: text-fonts-04-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-fonts-04-t.svg,v $ + + + + + + + + + + + font-family = "Haettenschweiler" + ABC + + font-family = "Charlesworth" + ABC + + font-family = "Invalid Name" + ABC + + font-family = not specified + ABC + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-fonts-05-f-novalid.html b/conformance-checkers/html-svg/text-fonts-05-f-novalid.html new file mode 100644 index 00000000000000..0f008ed9a4f4fb --- /dev/null +++ b/conformance-checkers/html-svg/text-fonts-05-f-novalid.html @@ -0,0 +1,51 @@ + + + + text-fonts-05-f-manual.svg + + + +

    Source SVG: text-fonts-05-f-manual.svg

    + + + + + + + + + + + + $RCSfile: text-fonts-05-f.svg,v $ + + + + + + + + + + FillerText + FillerText + FillerText + + + + + $Revision: 1.4 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/text-fonts-202-t-isvalid.html b/conformance-checkers/html-svg/text-fonts-202-t-isvalid.html new file mode 100644 index 00000000000000..acf7ebb1bebc08 --- /dev/null +++ b/conformance-checkers/html-svg/text-fonts-202-t-isvalid.html @@ -0,0 +1,74 @@ + + + + text-fonts-202-t-manual.svg + + + +

    Source SVG: text-fonts-202-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-fonts-202-t.svg,v $ + + + + + + + + + + + 100 + 200 + 300 + 400 + 500 + 600 + 700 + 800 + 900 + This is bold + This is normal + + Blue is bolder + + + Blue is lighter + + + ZalamanderCaps is an OpenType font + by Tim Ahrens of Just Another Foundry + + + + + + $Revision: 1.4 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-fonts-203-t-isvalid.html b/conformance-checkers/html-svg/text-fonts-203-t-isvalid.html new file mode 100644 index 00000000000000..8c0743cad3d65d --- /dev/null +++ b/conformance-checkers/html-svg/text-fonts-203-t-isvalid.html @@ -0,0 +1,119 @@ + + + + text-fonts-203-t-manual.svg + + + +

    Source SVG: text-fonts-203-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-fonts-203-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + 200 + 300 + 400 + 500 + 600 + 700 + 800 + 900 + This is bold + This is normal + + Blue is bolder + + + Blue is lighter + + + ZalamanderCaps is an OpenType font + by Tim Ahrens of Just Another Foundry + + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-fonts-204-t-isvalid.html b/conformance-checkers/html-svg/text-fonts-204-t-isvalid.html new file mode 100644 index 00000000000000..7a4b1d63eaddd9 --- /dev/null +++ b/conformance-checkers/html-svg/text-fonts-204-t-isvalid.html @@ -0,0 +1,111 @@ + + + + text-fonts-204-t-manual.svg + + + +

    Source SVG: text-fonts-204-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-fonts-204-t.svg,v $ + + + + + + + + + + + + + + 100 + 200 + 300 + 400 + 500 + 600 + 700 + 800 + 900 + This is bold + This is normal + + Blue is bolder + + + Blue is lighter + + + ZalamanderCaps is an OpenType font + by Tim Ahrens of Just Another Foundry + + + + + + $Revision: 1.1 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/text-intro-01-t-isvalid.html b/conformance-checkers/html-svg/text-intro-01-t-isvalid.html new file mode 100644 index 00000000000000..7951c2c2d907d3 --- /dev/null +++ b/conformance-checkers/html-svg/text-intro-01-t-isvalid.html @@ -0,0 +1,64 @@ + + + + text-intro-01-t-manual.svg + + + +

    Source SVG: text-intro-01-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-intro-01-t.svg,v $ + + + + + + + + + + + + + + + Test left-to-right text. + + Polish: Mogę jeść szkło, i mi ... + Russian: Я могу есть стекло, ... + Greek: Μπορώ να φάω ... + Hebrew: אני יכול לאכול זכוכית ... + Yiddish: איך קען עסן גלאָז און ... + + + Chinese:我能吞下玻璃而不伤身体。 + + + Japanese: 私はガラスを食べます。 + + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-intro-02-b-isvalid.html b/conformance-checkers/html-svg/text-intro-02-b-isvalid.html new file mode 100644 index 00000000000000..8a789427bd0f62 --- /dev/null +++ b/conformance-checkers/html-svg/text-intro-02-b-isvalid.html @@ -0,0 +1,56 @@ + + + + text-intro-02-b-manual.svg + + + +

    Source SVG: text-intro-02-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-intro-02-b.svg,v $ + + + + + + + + + unicode-bidi="bidi-override" direction="ltr". + + Text "אני יכול לאכול זכוכית וזה לא מזיק לי" is in Hebrew + + unicode-bidi="bidi-override" direction="rtl". + + Text "אני יכול לאכול זכוכית וזה לא מזיק לי" is in Hebrew + + unicode-bidi="normal" direction="rtl". + + Text "אני יכול לאכול זכוכית וזה לא מזיק לי" is in Hebrew + + + + $Revision: 1.10 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-intro-03-b-isvalid.html b/conformance-checkers/html-svg/text-intro-03-b-isvalid.html new file mode 100644 index 00000000000000..d219e4039329f7 --- /dev/null +++ b/conformance-checkers/html-svg/text-intro-03-b-isvalid.html @@ -0,0 +1,52 @@ + + + + text-intro-03-b-manual.svg + + + +

    Source SVG: text-intro-03-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-intro-03-b.svg,v $ + + + + + + + + + + Text "我能吞下玻璃而不伤身体。" in Chinese + Japanese: 私はガラスを食べられます。それは私を傷つけません。 + Japanese: 私はガラスを食べられます。それは私を傷つけません。 + xt "我能吞 + se: 私は + se: 私は + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-intro-04-t-isvalid.html b/conformance-checkers/html-svg/text-intro-04-t-isvalid.html new file mode 100644 index 00000000000000..4131a17e108d79 --- /dev/null +++ b/conformance-checkers/html-svg/text-intro-04-t-isvalid.html @@ -0,0 +1,55 @@ + + + + text-intro-04-t-manual.svg + + + +

    Source SVG: text-intro-04-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-intro-04-t.svg,v $ + + + + + + + + + Test horizontal text. + + Polish: Mogę jeść szkło, i mi nie szkodzi. + Russian: Я могу есть стекло, это мне не вредит. + Greek: Μπορώ να φάω σπασμένα γυαλιά χωρίς να πάθω τίποτα. + + Text "אני יכול לאכול זכוכית וזה לא מזיק לי" is in Hebrew + Yiddish: איך קען עסן גלאָז און עס טוט מיר נישט װײ. + Chinese:我能吞下玻璃而不伤身体。 + Japanese: 私はガラスを食べられます。それは私を傷つけません。 + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-intro-05-t-isvalid.html b/conformance-checkers/html-svg/text-intro-05-t-isvalid.html new file mode 100644 index 00000000000000..fcd2a965cdc077 --- /dev/null +++ b/conformance-checkers/html-svg/text-intro-05-t-isvalid.html @@ -0,0 +1,54 @@ + + + + text-intro-05-t-manual.svg + + + +

    Source SVG: text-intro-05-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-intro-05-t.svg,v $ + + + + + + + + + لماذا لا يتكلمون اللّغة العربية فحسب؟ + + لماذا لا يتكلمون اللّغة العربية فحسب؟ + + لماذا لا يتكلمون اللّغة العربية فحسب؟ + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-intro-06-t-isvalid.html b/conformance-checkers/html-svg/text-intro-06-t-isvalid.html new file mode 100644 index 00000000000000..48b50d8d42c09b --- /dev/null +++ b/conformance-checkers/html-svg/text-intro-06-t-isvalid.html @@ -0,0 +1,56 @@ + + + + text-intro-06-t-manual.svg + + + +

    Source SVG: text-intro-06-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-intro-06-t.svg,v $ + + + + + + + + + + + + + آلات + ثلاثة + + + + $Revision: 1.10 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-intro-07-t-isvalid.html b/conformance-checkers/html-svg/text-intro-07-t-isvalid.html new file mode 100644 index 00000000000000..55d3a817649e2a --- /dev/null +++ b/conformance-checkers/html-svg/text-intro-07-t-isvalid.html @@ -0,0 +1,52 @@ + + + + text-intro-07-t-manual.svg + + + +

    Source SVG: text-intro-07-t-manual.svg

    + + + + + + + + + + $RCSfile: text-intro-07-t.svg,v $ + + + + + + + + + + + + + آلات + ثلاثة + + + + + $Revision: 1.2 $ + + + + + diff --git a/conformance-checkers/html-svg/text-intro-09-b-isvalid.html b/conformance-checkers/html-svg/text-intro-09-b-isvalid.html new file mode 100644 index 00000000000000..d6c6f8d325a3bc --- /dev/null +++ b/conformance-checkers/html-svg/text-intro-09-b-isvalid.html @@ -0,0 +1,67 @@ + + + + text-intro-09-b-manual.svg + + + +

    Source SVG: text-intro-09-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-intro-09-b.svg,v $ + + + + + + + + + + + + + + + unicode-bidi="bidi-override" direction="ltr". + + Text "אני יכול לאכול זכוכית וזה לא מזיק לי" is in Hebrew + + unicode-bidi="bidi-override" direction="rtl". + + Text "אני יכול לאכול זכוכית וזה לא מזיק לי" is in Hebrew + + unicode-bidi="normal" direction="rtl". + + Text "אני יכול לאכול זכוכית וזה לא מזיק לי" is in Hebrew + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-intro-10-f-isvalid.html b/conformance-checkers/html-svg/text-intro-10-f-isvalid.html new file mode 100644 index 00000000000000..783afff2b22b76 --- /dev/null +++ b/conformance-checkers/html-svg/text-intro-10-f-isvalid.html @@ -0,0 +1,56 @@ + + + + text-intro-10-f-manual.svg + + + +

    Source SVG: text-intro-10-f-manual.svg

    + + + + + + + + + + + + $RCSfile: text-intro-10-f.svg,v $ + + + + + + + + + + لماذا لا يتكلمون اللّغة العربية فحسب؟ + + لماذا لا يتكلمون اللّغة العربية فحسب؟ + + لماذا لا يتكلمون اللّغة العربية فحسب؟ + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/text-intro-11-t-isvalid.html b/conformance-checkers/html-svg/text-intro-11-t-isvalid.html new file mode 100644 index 00000000000000..0e94a24dcf5625 --- /dev/null +++ b/conformance-checkers/html-svg/text-intro-11-t-isvalid.html @@ -0,0 +1,57 @@ + + + + text-intro-11-t-manual.svg + + + +

    Source SVG: text-intro-11-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-intro-11-t.svg,v $ + + + + + + + + + + + + + + + آلات + آلات + آلات + ثلاثة + ثلاثة + ثلاثة + + + + $Revision: 1.2 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/text-intro-12-t-isvalid.html b/conformance-checkers/html-svg/text-intro-12-t-isvalid.html new file mode 100644 index 00000000000000..a2d65e1893bab0 --- /dev/null +++ b/conformance-checkers/html-svg/text-intro-12-t-isvalid.html @@ -0,0 +1,56 @@ + + + + text-intro-12-t-manual.svg + + + +

    Source SVG: text-intro-12-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-intro-12-t.svg,v $ + + + + + + + + + + + + + آلات + ثلاثة + + + + $Revision: 1.3 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/text-path-01-b-isvalid.html b/conformance-checkers/html-svg/text-path-01-b-isvalid.html new file mode 100644 index 00000000000000..e5f9b605e879e7 --- /dev/null +++ b/conformance-checkers/html-svg/text-path-01-b-isvalid.html @@ -0,0 +1,76 @@ + + + + text-path-01-b-manual.svg + + + +

    Source SVG: text-path-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-path-01-b.svg,v $ + + + + + + + + + + + + + + + + + Text on a path + + + + + + + + Text on a path + + + + 'tspan' subelement inside + the 'textPath' element. + + + + + The Text on path + + + 'startOffset' attribute of the + 'textPath' element. + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-path-02-b-isvalid.html b/conformance-checkers/html-svg/text-path-02-b-isvalid.html new file mode 100644 index 00000000000000..48dea56fb8e6ad --- /dev/null +++ b/conformance-checkers/html-svg/text-path-02-b-isvalid.html @@ -0,0 +1,81 @@ + + + + text-path-02-b-manual.svg + + + +

    Source SVG: text-path-02-b-manual.svg

    + + + + + + + + + + $RCSfile: text-path-02-b.svg,v $ + + + + + + + + + + + + + + + + + Positive offset Negative offset + + + + + + Positive offset Negative offset + + + + + + + Positive offset Negative offset + + + + + + Positive offset Negative offset + + + + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-spacing-01-b-isvalid.html b/conformance-checkers/html-svg/text-spacing-01-b-isvalid.html new file mode 100644 index 00000000000000..d9e3826cda2cd2 --- /dev/null +++ b/conformance-checkers/html-svg/text-spacing-01-b-isvalid.html @@ -0,0 +1,52 @@ + + + + text-spacing-01-b-manual.svg + + + +

    Source SVG: text-spacing-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-spacing-01-b.svg,v $ + + + + + + + + + + letter-spacing:0 + letter-spacing:-1 + letter-spacing:.3 + ws:0 - Two Words + ws:-3 - Two Words + ws:3 - Two Words + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-text-01-b-isvalid.html b/conformance-checkers/html-svg/text-text-01-b-isvalid.html new file mode 100644 index 00000000000000..800a0e65744d53 --- /dev/null +++ b/conformance-checkers/html-svg/text-text-01-b-isvalid.html @@ -0,0 +1,147 @@ + + + + text-text-01-b-manual.svg + + + +

    Source SVG: text-text-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-text-01-b.svg,v $ + + + + + + + + + Basic test of 'textLength' + and 'lengthAdjust' attributes. + + + + + Line to Stretch + this is a line to squeeze + + + + + + + + + + + + + + + + + + textLength: default + lengthAdjust: default + textLength: default + lengthAdjust: default + + + + + + + Line to Stretch + this is a line to squeeze + + + + + + + + + + + + + textLength: 25% longer + lengthAdjust: default + textLength: 15% shorter + lengthAdjust: default + + + + + + + Line to Stretch + this is a line to squeeze + + + + + + + + + + + + + textLength: 25% longer + lengthAdjust: spacing + textLength: 15% shorter + lengthAdjust: spacing + + + + + + + Line to Stretch + this is a line to squeeze + + + + + + + + + + + + + textLength: 25% longer + lengthAdjust: sAG + textLength: 20% shorter + lengthAdjust: sAG + + + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-text-03-b-isvalid.html b/conformance-checkers/html-svg/text-text-03-b-isvalid.html new file mode 100644 index 00000000000000..d7b3d08a9a0b2d --- /dev/null +++ b/conformance-checkers/html-svg/text-text-03-b-isvalid.html @@ -0,0 +1,78 @@ + + + + text-text-03-b-manual.svg + + + +

    Source SVG: text-text-03-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-text-03-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Plain + Italic + Bold + Underline + Line through + Bold, italic and underlined + + + + Each line of text which flows in a + rectangular box has to be broken + into separated lines. + + + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-text-04-t-isvalid.html b/conformance-checkers/html-svg/text-text-04-t-isvalid.html new file mode 100644 index 00000000000000..ab06f0f36f8a04 --- /dev/null +++ b/conformance-checkers/html-svg/text-text-04-t-isvalid.html @@ -0,0 +1,183 @@ + + + + text-text-04-t-manual.svg + + + +

    Source SVG: text-text-04-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-text-04-t.svg,v $ + + + + + + + + + + + + + + + + + + + + Reference + + + + + + 1234 + + + + + + + x all + + + + + + 1234 + + + + x more + + + + + + + 1234 + + + + x fewer + + + + + + 1234 + + + + y all + + + + + 1234 + + + + y more + + + + + 1234 + + + + y fewer + + + + + 1234 + + + + + x/y all + + + + + + 1234 + + + + x/y more + + + + + + + 1234 + + + + x/y fewer + + + + + + 1234 + + + + x all y fewer + + + + + + 1234 + + + + x fewer y all + + + + + + 1234 + + + + + + $Revision: 1.12 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-text-05-t-isvalid.html b/conformance-checkers/html-svg/text-text-05-t-isvalid.html new file mode 100644 index 00000000000000..9dd6b49b8d0d5a --- /dev/null +++ b/conformance-checkers/html-svg/text-text-05-t-isvalid.html @@ -0,0 +1,157 @@ + + + + text-text-05-t-manual.svg + + + +

    Source SVG: text-text-05-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-text-05-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.x 1.y + 4.x 1.y + 2.x 1.y + 1.x 4.y + 4.x 4.y + 2.x 4.y + 1.x 2.y + 4.x 2.y + 2.x 2.y + + + + text-anchor + start + + + + + + 1234 + + + + + + + 1234 + + + + + 1234 + + + + + + + + 1234 + + + + + + + + + 1234 + + + + + + + + + 1234 + + + + + + + 1234 + + + + + + + + + 1234 + + + + + + + 1234 + + + + + + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-text-06-t-isvalid.html b/conformance-checkers/html-svg/text-text-06-t-isvalid.html new file mode 100644 index 00000000000000..823cbb68db825e --- /dev/null +++ b/conformance-checkers/html-svg/text-text-06-t-isvalid.html @@ -0,0 +1,108 @@ + + + + text-text-06-t-manual.svg + + + +

    Source SVG: text-text-06-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-text-06-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x positioning + y positioning + x/y positioning + + + + + + + + + + fi1234 + + + + + + + + + + fi1234 + + + + + + + + + + fi1234 + + + + + + $Revision: 1.9 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-text-07-t-isvalid.html b/conformance-checkers/html-svg/text-text-07-t-isvalid.html new file mode 100644 index 00000000000000..70414a516b211d --- /dev/null +++ b/conformance-checkers/html-svg/text-text-07-t-isvalid.html @@ -0,0 +1,47 @@ + + + + text-text-07-t-manual.svg + + + +

    Source SVG: text-text-07-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-text-07-t.svg,v $ + + + + + + + + + Multi X Y + ROTATE + Both Together + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-text-08-b-isvalid.html b/conformance-checkers/html-svg/text-text-08-b-isvalid.html new file mode 100644 index 00000000000000..a0735eae15998c --- /dev/null +++ b/conformance-checkers/html-svg/text-text-08-b-isvalid.html @@ -0,0 +1,48 @@ + + + + text-text-08-b-manual.svg + + + +

    Source SVG: text-text-08-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-text-08-b.svg,v $ + + + + + + + + + Normal Text + Fill opacity + Stroke opacity + Opacity + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-text-09-t-isvalid.html b/conformance-checkers/html-svg/text-text-09-t-isvalid.html new file mode 100644 index 00000000000000..1512cb330a1894 --- /dev/null +++ b/conformance-checkers/html-svg/text-text-09-t-isvalid.html @@ -0,0 +1,47 @@ + + + + text-text-09-t-manual.svg + + + +

    Source SVG: text-text-09-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-text-09-t.svg,v $ + + + + + + + + + Multi X Y + ROTATE + Both Together + + + $Revision: 1.7 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-text-10-t-isvalid.html b/conformance-checkers/html-svg/text-text-10-t-isvalid.html new file mode 100644 index 00000000000000..399223c58a1f5b --- /dev/null +++ b/conformance-checkers/html-svg/text-text-10-t-isvalid.html @@ -0,0 +1,68 @@ + + + + text-text-10-t-manual.svg + + + +

    Source SVG: text-text-10-t-manual.svg

    + + + + + + + + + + $RCSfile: text-text-10-t.svg,v $ + + + + + + + + + + Rotated 90 degrees + Rotated -90 degrees + Rotated 180 degrees + Unrotated text + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/text-text-11-t-isvalid.html b/conformance-checkers/html-svg/text-text-11-t-isvalid.html new file mode 100644 index 00000000000000..341dfc052a391d --- /dev/null +++ b/conformance-checkers/html-svg/text-text-11-t-isvalid.html @@ -0,0 +1,72 @@ + + + + text-text-11-t-manual.svg + + + +

    Source SVG: text-text-11-t-manual.svg

    + + + + + + + + + + $RCSfile: text-text-11-t.svg,v $ + + + + + + + + + + + + Rotated 90 degrees + Rotated -90 degrees + Rotated 180 degrees + Unrotated text + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + + + + + $Revision: 1.3 $ + + + + + + diff --git a/conformance-checkers/html-svg/text-text-12-t-isvalid.html b/conformance-checkers/html-svg/text-text-12-t-isvalid.html new file mode 100644 index 00000000000000..d28fd0745dcad0 --- /dev/null +++ b/conformance-checkers/html-svg/text-text-12-t-isvalid.html @@ -0,0 +1,167 @@ + + + + text-text-12-t-manual.svg + + + +

    Source SVG: text-text-12-t-manual.svg

    + + + + + + + + + + + + $RCSfile: text-text-12-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.x 1.y + 4.x 1.y + 2.x 1.y + 1.x 4.y + 4.x 4.y + 2.x 4.y + 1.x 2.y + 4.x 2.y + 2.x 2.y + + + + + + + 1234 + + + + + + + 1234 + + + + + 1234 + + + + + + + + 1234 + + + + + + + + + 1234 + + + + + + + + + 1234 + + + + + + + 1234 + + + + + + + + + 1234 + + + + + + + 1234 + + + + + + text-anchor + middle + + + + + + text-anchor + end + + + + + + + + $Revision: 1.1 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/text-tref-01-b-isvalid.html b/conformance-checkers/html-svg/text-tref-01-b-isvalid.html new file mode 100644 index 00000000000000..2681a1d57da78f --- /dev/null +++ b/conformance-checkers/html-svg/text-tref-01-b-isvalid.html @@ -0,0 +1,58 @@ + + + + text-tref-01-b-manual.svg + + + +

    Source SVG: text-tref-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-tref-01-b.svg,v $ + + + + + + + + + + Test 'tref' element with an external referenced string. + + + + + + 'tref' to a string in another file + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-tselect-01-b-isvalid.html b/conformance-checkers/html-svg/text-tselect-01-b-isvalid.html new file mode 100644 index 00000000000000..8c01db917374c8 --- /dev/null +++ b/conformance-checkers/html-svg/text-tselect-01-b-isvalid.html @@ -0,0 +1,55 @@ + + + + text-tselect-01-b-manual.svg + + + +

    Source SVG: text-tselect-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-tselect-01-b.svg,v $ + + + + + + + + + Test single line and multiline text selection. + + Here is a stand-alone 'text' element. + Here is a second 'text' element just below. + Because these are four separate 'text' elements, + text selection should not go across lines here. + + However, these lines of text are achieved by using + one 'tspan' per line, all contained within the same + 'text' element, so you should be able to select all + four lines at the same time. + + + $Revision: 1.8 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-tselect-02-f-novalid.html b/conformance-checkers/html-svg/text-tselect-02-f-novalid.html new file mode 100644 index 00000000000000..bee4bf91dd92ce --- /dev/null +++ b/conformance-checkers/html-svg/text-tselect-02-f-novalid.html @@ -0,0 +1,94 @@ + + + + text-tselect-02-f-manual.svg + + + +

    Source SVG: text-tselect-02-f-manual.svg

    + + + + + + + + + + + + $RCSfile: text-tselect-02-f.svg,v $ + + + + + + + + + + + + + + StartIndex: 0 NumChars: 0 + + + abc אבג 123 דהו def + + + + + startIndex++ + + + startIndex-- + + + numChars++ + + + numChars-- + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-tselect-03-f-novalid.html b/conformance-checkers/html-svg/text-tselect-03-f-novalid.html new file mode 100644 index 00000000000000..6ce8758c73f93d --- /dev/null +++ b/conformance-checkers/html-svg/text-tselect-03-f-novalid.html @@ -0,0 +1,105 @@ + + + + text-tselect-03-f-manual.svg + + + +

    Source SVG: text-tselect-03-f-manual.svg

    + + + + + + + + + + + + $RCSfile: text-tselect-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + + StartIndex: 0 NumChars: 0 + + + abc אבג 123 דהו def + + + + + startIndex++ + + + startIndex-- + + + numChars++ + + + numChars-- + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-tspan-01-b-isvalid.html b/conformance-checkers/html-svg/text-tspan-01-b-isvalid.html new file mode 100644 index 00000000000000..c583e13e6718fc --- /dev/null +++ b/conformance-checkers/html-svg/text-tspan-01-b-isvalid.html @@ -0,0 +1,100 @@ + + + + text-tspan-01-b-manual.svg + + + +

    Source SVG: text-tspan-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: text-tspan-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Basics of tspan: changing visual properties and positioning. + + + + You are not a banana. + + + Text: "You are not a banana." + 'tspan' changes visual attributes of "not", + to green, bold. + + + + + But youare a peach! + + + Text: "But you are a peach!" + Using dx,dy, 'tspan' raises "are", + 'tspan' lowers "a peach!" + + + + + Cute and + fuzzy. + + + Text: "Cute and fuzzy." + 'tspan' char-by-char placement of "Cute and", + 'tspan' char-by-char "fuzzy", below it. + + + + $Revision: 1.10 $ + + + + + + + diff --git a/conformance-checkers/html-svg/text-tspan-02-b-isvalid.html b/conformance-checkers/html-svg/text-tspan-02-b-isvalid.html new file mode 100644 index 00000000000000..3c48f013531a33 --- /dev/null +++ b/conformance-checkers/html-svg/text-tspan-02-b-isvalid.html @@ -0,0 +1,110 @@ + + + + text-tspan-02-b-manual.svg + + + +

    Source SVG: text-tspan-02-b-manual.svg

    + + + + + + + + + + $RCSfile: text-tspan-02-b.svg,v $ + + + + + + + + + + + Not all characters in the + text have a specified rotation + + + + + Not + + + all characters + + + in + + + the + + + + + text + + + have a + + + + specified + + + rotation + + + + +5 15 25 + + +-10 -20 -30 + + + -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 + + +70 60 + + +40 30 20 + + +-40 -40 -40 -40 -40 -40 -40 -40 -40 + + + -10 -10 -10 -10 -10 -10 -10 -10 + + +-10 + + + 55 55 55 55 55 55 55 55 + + + + + + $Revision: 1.11 $ + + + + + + diff --git a/conformance-checkers/html-svg/types-basic-01-f-isvalid.html b/conformance-checkers/html-svg/types-basic-01-f-isvalid.html new file mode 100644 index 00000000000000..0051cc3f958627 --- /dev/null +++ b/conformance-checkers/html-svg/types-basic-01-f-isvalid.html @@ -0,0 +1,64 @@ + + + + types-basic-01-f-manual.svg + + + +

    Source SVG: types-basic-01-f-manual.svg

    + + + + + + + + + + $RCSfile: types-basic-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + + Different forms of the <number> type + + + 50 + 5e1 + .5e2 + + + + + $Revision: 1.5 $ + + + + + + + diff --git a/conformance-checkers/html-svg/types-basic-02-f-isvalid.html b/conformance-checkers/html-svg/types-basic-02-f-isvalid.html new file mode 100644 index 00000000000000..341db7a1de85b0 --- /dev/null +++ b/conformance-checkers/html-svg/types-basic-02-f-isvalid.html @@ -0,0 +1,75 @@ + + + + types-basic-02-f-manual.svg + + + +

    Source SVG: types-basic-02-f-manual.svg

    + + + + + + + + + + $RCSfile: types-basic-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.1 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/types-dom-01-b-isvalid.html b/conformance-checkers/html-svg/types-dom-01-b-isvalid.html new file mode 100644 index 00000000000000..35ccad21130471 --- /dev/null +++ b/conformance-checkers/html-svg/types-dom-01-b-isvalid.html @@ -0,0 +1,75 @@ + + + + types-dom-01-b-manual.svg + + + +

    Source SVG: types-dom-01-b-manual.svg

    + + + + + + + + + + + + $RCSfile: types-dom-01-b.svg,v $ + + + + + + + + + + + + Rotated Text for testing SVGLocatable + Some other text with id 'otherText' + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + + diff --git a/conformance-checkers/html-svg/types-dom-02-f-novalid.html b/conformance-checkers/html-svg/types-dom-02-f-novalid.html new file mode 100644 index 00000000000000..9072bacb932b21 --- /dev/null +++ b/conformance-checkers/html-svg/types-dom-02-f-novalid.html @@ -0,0 +1,134 @@ + + + + types-dom-02-f-manual.svg + + + +

    Source SVG: types-dom-02-f-manual.svg

    + + + + + + + + + + $RCSfile: types-dom-02-f.svg,v $ + + + + + + + + + + animVal != baseVal: + + + + SVGAnimatedNumberList + + SVGAnimatedLength + + SVGAnimatedLengthList + + SVGAnimatedAngle + + SVGAnimatedRect + + SVGAnimatedTransformList + + SVGAnimatedPreserveAspectRatio + + + + abc + + + + + + + + + + $Revision: 1.8 $ + + + + + + diff --git a/conformance-checkers/html-svg/types-dom-03-b-novalid.html b/conformance-checkers/html-svg/types-dom-03-b-novalid.html new file mode 100644 index 00000000000000..03623bf3256e2a --- /dev/null +++ b/conformance-checkers/html-svg/types-dom-03-b-novalid.html @@ -0,0 +1,69 @@ + + + + types-dom-03-b-manual.svg + + + +

    Source SVG: types-dom-03-b-manual.svg

    + + + + + + + + + + $RCSfile: types-dom-03-b.svg,v $ + + + + + + + + + + Test that getBBox() works before SVGLoad + + + Abc + + + + + $Revision: 1.7 $ + + + + + + diff --git a/conformance-checkers/html-svg/types-dom-04-b-novalid.html b/conformance-checkers/html-svg/types-dom-04-b-novalid.html new file mode 100644 index 00000000000000..123399b0ae7215 --- /dev/null +++ b/conformance-checkers/html-svg/types-dom-04-b-novalid.html @@ -0,0 +1,226 @@ + + + + types-dom-04-b-manual.svg + + + +

    Source SVG: types-dom-04-b-manual.svg

    + + + + + + + + + + $RCSfile: types-dom-04-b.svg,v $ + + + + + + + + + + Testing liveness of SVG DOM objects + + + + SVGAnimatedNumberList + + SVGAnimatedLength + + SVGAnimatedLengthList + + SVGAnimatedAngle + + SVGAnimatedRect + + SVGAnimatedTransformList + + SVGAnimatedPreserveAspectRatio + + SVGAnimatedBoolean + + SVGAnimatedString + + SVGAnimatedEnumeration + + SVGAnimatedInteger + + SVGAnimatedNumber + + + + abc + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + diff --git a/conformance-checkers/html-svg/types-dom-05-b-novalid.html b/conformance-checkers/html-svg/types-dom-05-b-novalid.html new file mode 100644 index 00000000000000..22a540f71b8017 --- /dev/null +++ b/conformance-checkers/html-svg/types-dom-05-b-novalid.html @@ -0,0 +1,109 @@ + + + + types-dom-05-b-manual.svg + + + +

    Source SVG: types-dom-05-b-manual.svg

    + + + + + + + + + + $RCSfile: types-dom-05-b.svg,v $ + + + + + + + + + + Test side effects of assigning to valueAsString + + + + + + + Valid string on SVGLength + Invalid string on SVGLength + Valid string on SVGAngle + Invalid string on SVGAngle + + + + + + + + + $Revision: 1.6 $ + + + + + + diff --git a/conformance-checkers/html-svg/types-dom-06-f-isvalid.html b/conformance-checkers/html-svg/types-dom-06-f-isvalid.html new file mode 100644 index 00000000000000..983ce09fa89061 --- /dev/null +++ b/conformance-checkers/html-svg/types-dom-06-f-isvalid.html @@ -0,0 +1,119 @@ + + + + types-dom-06-f-manual.svg + + + +

    Source SVG: types-dom-06-f-manual.svg

    + + + + + + + + + + $RCSfile: types-dom-06-f.svg,v $ + + + + + + + + + + + + + + SVGStringList DOM + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + diff --git a/conformance-checkers/html-svg/types-dom-07-f-novalid.html b/conformance-checkers/html-svg/types-dom-07-f-novalid.html new file mode 100644 index 00000000000000..e5edef0d70bc2e --- /dev/null +++ b/conformance-checkers/html-svg/types-dom-07-f-novalid.html @@ -0,0 +1,135 @@ + + + + types-dom-07-f-manual.svg + + + +

    Source SVG: types-dom-07-f-manual.svg

    + + + + + + + + + + $RCSfile: types-dom-07-f.svg,v $ + + + + + + + + + + animVal is read only: + + + + SVGAnimatedNumberList + + SVGAnimatedLength + + SVGAnimatedLengthList + + SVGAnimatedAngle + + SVGAnimatedRect + + SVGAnimatedTransformList + + SVGAnimatedPreserveAspectRatio + + + + abc + + + + + + + + + + $Revision: 1.2 $ + + + + + + diff --git a/conformance-checkers/html-svg/types-dom-08-f-novalid.html b/conformance-checkers/html-svg/types-dom-08-f-novalid.html new file mode 100644 index 00000000000000..2f46c1cbebc8c7 --- /dev/null +++ b/conformance-checkers/html-svg/types-dom-08-f-novalid.html @@ -0,0 +1,181 @@ + + + + types-dom-08-f-manual.svg + + + +

    Source SVG: types-dom-08-f-manual.svg

    + + + + + + + + + + $RCSfile: types-dom-08-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SVGLocatable.getBBox() - basic test + + + + failed + + + + + + + $Revision: 1.1 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/types-dom-svgfittoviewbox-01-f-isvalid.html b/conformance-checkers/html-svg/types-dom-svgfittoviewbox-01-f-isvalid.html new file mode 100644 index 00000000000000..a4ec2b6a648d67 --- /dev/null +++ b/conformance-checkers/html-svg/types-dom-svgfittoviewbox-01-f-isvalid.html @@ -0,0 +1,82 @@ + + + + types-dom-svgfittoviewbox-01-f-manual.svg + + + +

    Source SVG: types-dom-svgfittoviewbox-01-f-manual.svg

    + + + + + + + + + + + + $RCSfile: types-dom-svgfittoviewbox-01-f.svg,v $ + + + + + + + + + + FAIL + PASS + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/types-dom-svglengthlist-01-f-isvalid.html b/conformance-checkers/html-svg/types-dom-svglengthlist-01-f-isvalid.html new file mode 100644 index 00000000000000..1b0470c23fef4c --- /dev/null +++ b/conformance-checkers/html-svg/types-dom-svglengthlist-01-f-isvalid.html @@ -0,0 +1,105 @@ + + + + types-dom-svglengthlist-01-f-manual.svg + + + +

    Source SVG: types-dom-svglengthlist-01-f-manual.svg

    + + + + + + + + + + $RCSfile: types-dom-svglengthlist-01-f.svg,v $ + + + + + + + + + + + FAIL + PASS + + + + + $Revision: 1.4 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/types-dom-svgnumberlist-01-f-isvalid.html b/conformance-checkers/html-svg/types-dom-svgnumberlist-01-f-isvalid.html new file mode 100644 index 00000000000000..7dbda069fc4a10 --- /dev/null +++ b/conformance-checkers/html-svg/types-dom-svgnumberlist-01-f-isvalid.html @@ -0,0 +1,105 @@ + + + + types-dom-svgnumberlist-01-f-manual.svg + + + +

    Source SVG: types-dom-svgnumberlist-01-f-manual.svg

    + + + + + + + + + + $RCSfile: types-dom-svgnumberlist-01-f.svg,v $ + + + + + + + + + + + FAIL + PASS + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/types-dom-svgstringlist-01-f-isvalid.html b/conformance-checkers/html-svg/types-dom-svgstringlist-01-f-isvalid.html new file mode 100644 index 00000000000000..f1ad11693eba80 --- /dev/null +++ b/conformance-checkers/html-svg/types-dom-svgstringlist-01-f-isvalid.html @@ -0,0 +1,104 @@ + + + + types-dom-svgstringlist-01-f-manual.svg + + + +

    Source SVG: types-dom-svgstringlist-01-f-manual.svg

    + + + + + + + + + + $RCSfile: types-dom-svgstringlist-01-f.svg,v $ + + + + + + + + + + + FAIL + PASS + + + + + $Revision: 1.4 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html-svg/types-dom-svgtransformable-01-f-isvalid.html b/conformance-checkers/html-svg/types-dom-svgtransformable-01-f-isvalid.html new file mode 100644 index 00000000000000..c9ba4eb8425677 --- /dev/null +++ b/conformance-checkers/html-svg/types-dom-svgtransformable-01-f-isvalid.html @@ -0,0 +1,81 @@ + + + + types-dom-svgtransformable-01-f-manual.svg + + + +

    Source SVG: types-dom-svgtransformable-01-f-manual.svg

    + + + + + + + + + + $RCSfile: types-dom-svgtransformable-01-f.svg,v $ + + + + + + + + + + + FAIL + PASS + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + + + diff --git a/conformance-checkers/html/elements/a/href/port-999999-novalid.html b/conformance-checkers/html/elements/a/href/port-999999-novalid.html new file mode 100644 index 00000000000000..8fcc801efba334 --- /dev/null +++ b/conformance-checkers/html/elements/a/href/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid href: port-999999 + diff --git a/conformance-checkers/html/elements/area/href/port-999999-novalid.html b/conformance-checkers/html/elements/area/href/port-999999-novalid.html new file mode 100644 index 00000000000000..13106ac2279f5e --- /dev/null +++ b/conformance-checkers/html/elements/area/href/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid href: port-999999 + diff --git a/conformance-checkers/html/elements/audio/src/port-999999-novalid.html b/conformance-checkers/html/elements/audio/src/port-999999-novalid.html new file mode 100644 index 00000000000000..76b70598e17a90 --- /dev/null +++ b/conformance-checkers/html/elements/audio/src/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid src: port-999999 + diff --git a/conformance-checkers/html/elements/base/href/port-999999-isvalid.html b/conformance-checkers/html/elements/base/href/port-999999-isvalid.html deleted file mode 100644 index 391b88094ba1d3..00000000000000 --- a/conformance-checkers/html/elements/base/href/port-999999-isvalid.html +++ /dev/null @@ -1,4 +0,0 @@ - - -valid href: port-999999 - diff --git a/conformance-checkers/html/elements/base/href/port-999999-novalid.html b/conformance-checkers/html/elements/base/href/port-999999-novalid.html new file mode 100644 index 00000000000000..95393fab21c354 --- /dev/null +++ b/conformance-checkers/html/elements/base/href/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid href: port-999999 + diff --git a/conformance-checkers/html/elements/blockquote/cite/port-999999-novalid.html b/conformance-checkers/html/elements/blockquote/cite/port-999999-novalid.html new file mode 100644 index 00000000000000..1797e6467cb051 --- /dev/null +++ b/conformance-checkers/html/elements/blockquote/cite/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid cite: port-999999 +
    diff --git a/conformance-checkers/html/elements/button/formaction/port-999999-novalid.html b/conformance-checkers/html/elements/button/formaction/port-999999-novalid.html new file mode 100644 index 00000000000000..8a997594d1b16f --- /dev/null +++ b/conformance-checkers/html/elements/button/formaction/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid formaction: port-999999 + diff --git a/conformance-checkers/html/elements/del/cite/port-999999-novalid.html b/conformance-checkers/html/elements/del/cite/port-999999-novalid.html new file mode 100644 index 00000000000000..a654a888c15a96 --- /dev/null +++ b/conformance-checkers/html/elements/del/cite/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid cite: port-999999 + diff --git a/conformance-checkers/html/elements/embed/src/port-999999-novalid.html b/conformance-checkers/html/elements/embed/src/port-999999-novalid.html new file mode 100644 index 00000000000000..21fb6e26f28afb --- /dev/null +++ b/conformance-checkers/html/elements/embed/src/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid src: port-999999 + diff --git a/conformance-checkers/html/elements/form/action/port-999999-novalid.html b/conformance-checkers/html/elements/form/action/port-999999-novalid.html new file mode 100644 index 00000000000000..fe4932f5f69035 --- /dev/null +++ b/conformance-checkers/html/elements/form/action/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid action: port-999999 +
    diff --git a/conformance-checkers/html/elements/html/manifest/port-999999-isvalid.html b/conformance-checkers/html/elements/html/manifest/port-999999-isvalid.html deleted file mode 100644 index bd27dd49f1b0f2..00000000000000 --- a/conformance-checkers/html/elements/html/manifest/port-999999-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ - - - -valid manifest: port-999999 - diff --git a/conformance-checkers/html/elements/html/manifest/port-999999-novalid.html b/conformance-checkers/html/elements/html/manifest/port-999999-novalid.html new file mode 100644 index 00000000000000..d05e591ed81524 --- /dev/null +++ b/conformance-checkers/html/elements/html/manifest/port-999999-novalid.html @@ -0,0 +1,5 @@ + + + +invalid manifest: port-999999 + diff --git a/conformance-checkers/html/elements/iframe/src/port-999999-novalid.html b/conformance-checkers/html/elements/iframe/src/port-999999-novalid.html new file mode 100644 index 00000000000000..4f2290d2a504a7 --- /dev/null +++ b/conformance-checkers/html/elements/iframe/src/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid src: port-999999 + diff --git a/conformance-checkers/html/elements/img/src/port-999999-novalid.html b/conformance-checkers/html/elements/img/src/port-999999-novalid.html new file mode 100644 index 00000000000000..0c7d01801d41ad --- /dev/null +++ b/conformance-checkers/html/elements/img/src/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid src: port-999999 + diff --git a/conformance-checkers/html/elements/input/type-image-formaction/port-999999-novalid.html b/conformance-checkers/html/elements/input/type-image-formaction/port-999999-novalid.html new file mode 100644 index 00000000000000..a01365d72779ab --- /dev/null +++ b/conformance-checkers/html/elements/input/type-image-formaction/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid formaction: port-999999 + diff --git a/conformance-checkers/html/elements/input/type-image-src/port-999999-novalid.html b/conformance-checkers/html/elements/input/type-image-src/port-999999-novalid.html new file mode 100644 index 00000000000000..7c5b961f4c8d63 --- /dev/null +++ b/conformance-checkers/html/elements/input/type-image-src/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid src: port-999999 + diff --git a/conformance-checkers/html/elements/input/type-submit-formaction/port-999999-novalid.html b/conformance-checkers/html/elements/input/type-submit-formaction/port-999999-novalid.html new file mode 100644 index 00000000000000..56fed6806c9875 --- /dev/null +++ b/conformance-checkers/html/elements/input/type-submit-formaction/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid formaction: port-999999 + diff --git a/conformance-checkers/html/elements/input/type-url-value/port-999999-novalid.html b/conformance-checkers/html/elements/input/type-url-value/port-999999-novalid.html new file mode 100644 index 00000000000000..9ea67f37828abb --- /dev/null +++ b/conformance-checkers/html/elements/input/type-url-value/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid value attribute: port-999999 + diff --git a/conformance-checkers/html/elements/ins/cite/port-999999-novalid.html b/conformance-checkers/html/elements/ins/cite/port-999999-novalid.html new file mode 100644 index 00000000000000..006149af2f3dbf --- /dev/null +++ b/conformance-checkers/html/elements/ins/cite/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid cite: port-999999 + diff --git a/conformance-checkers/html/elements/link/href/port-999999-novalid.html b/conformance-checkers/html/elements/link/href/port-999999-novalid.html new file mode 100644 index 00000000000000..4b7e189c426df3 --- /dev/null +++ b/conformance-checkers/html/elements/link/href/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid href: port-999999 + diff --git a/conformance-checkers/html/elements/object/data/port-999999-novalid.html b/conformance-checkers/html/elements/object/data/port-999999-novalid.html new file mode 100644 index 00000000000000..7cc877269c1d09 --- /dev/null +++ b/conformance-checkers/html/elements/object/data/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid data: port-999999 + diff --git a/conformance-checkers/html/elements/q/cite/port-999999-novalid.html b/conformance-checkers/html/elements/q/cite/port-999999-novalid.html new file mode 100644 index 00000000000000..2f0ddf31561dd1 --- /dev/null +++ b/conformance-checkers/html/elements/q/cite/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid cite: port-999999 + diff --git a/conformance-checkers/html/elements/script/src/port-999999-novalid.html b/conformance-checkers/html/elements/script/src/port-999999-novalid.html new file mode 100644 index 00000000000000..e9fc4b917bcfd2 --- /dev/null +++ b/conformance-checkers/html/elements/script/src/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid src: port-999999 + diff --git a/conformance-checkers/html/elements/source/src/port-999999-novalid.html b/conformance-checkers/html/elements/source/src/port-999999-novalid.html new file mode 100644 index 00000000000000..c635f3b667e1f7 --- /dev/null +++ b/conformance-checkers/html/elements/source/src/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid src: port-999999 + diff --git a/conformance-checkers/html/elements/track/src/port-999999-novalid.html b/conformance-checkers/html/elements/track/src/port-999999-novalid.html new file mode 100644 index 00000000000000..963a3310125afa --- /dev/null +++ b/conformance-checkers/html/elements/track/src/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid src: port-999999 + diff --git a/conformance-checkers/html/elements/video/poster/port-999999-novalid.html b/conformance-checkers/html/elements/video/poster/port-999999-novalid.html new file mode 100644 index 00000000000000..9ceec19628f8e7 --- /dev/null +++ b/conformance-checkers/html/elements/video/poster/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid poster: port-999999 + diff --git a/conformance-checkers/html/elements/video/src/port-999999-novalid.html b/conformance-checkers/html/elements/video/src/port-999999-novalid.html new file mode 100644 index 00000000000000..e877d815b976b9 --- /dev/null +++ b/conformance-checkers/html/elements/video/src/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid src: port-999999 + diff --git a/conformance-checkers/html/microdata/itemid/port-999999-novalid.html b/conformance-checkers/html/microdata/itemid/port-999999-novalid.html new file mode 100644 index 00000000000000..6c1f14fbad3175 --- /dev/null +++ b/conformance-checkers/html/microdata/itemid/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid itemid: port-999999 +
    diff --git a/conformance-checkers/html/microdata/itemtype/port-999999-novalid.html b/conformance-checkers/html/microdata/itemtype/port-999999-novalid.html new file mode 100644 index 00000000000000..ceb94815df3c11 --- /dev/null +++ b/conformance-checkers/html/microdata/itemtype/port-999999-novalid.html @@ -0,0 +1,4 @@ + + +invalid itemtype: port-999999 +
    diff --git a/conformance-checkers/messages.json b/conformance-checkers/messages.json index 62cf37b56c1cdd..70841a3f4f84e8 100644 --- a/conformance-checkers/messages.json +++ b/conformance-checkers/messages.json @@ -80,6 +80,7 @@ "html/elements/a/href/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201chref\u201d on element \u201ca\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/a/href/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201chref\u201d on element \u201ca\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/a/href/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/a/href/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201chref\u201d on element \u201ca\u201d: Bad URL: Port number must be less than 65536.", "html/elements/a/href/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201chref\u201d on element \u201ca\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/a/href/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201chref\u201d on element \u201ca\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/a/href/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201chref\u201d on element \u201ca\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -149,6 +150,7 @@ "html/elements/area/href/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201chref\u201d on element \u201carea\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/area/href/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201chref\u201d on element \u201carea\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/area/href/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/area/href/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201chref\u201d on element \u201carea\u201d: Bad URL: Port number must be less than 65536.", "html/elements/area/href/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201chref\u201d on element \u201carea\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/area/href/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201chref\u201d on element \u201carea\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/area/href/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201chref\u201d on element \u201carea\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -218,6 +220,7 @@ "html/elements/audio/src/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201csrc\u201d on element \u201caudio\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/audio/src/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201csrc\u201d on element \u201caudio\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/audio/src/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/audio/src/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201csrc\u201d on element \u201caudio\u201d: Bad URL: Port number must be less than 65536.", "html/elements/audio/src/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201csrc\u201d on element \u201caudio\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/audio/src/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201csrc\u201d on element \u201caudio\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/audio/src/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201csrc\u201d on element \u201caudio\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -283,6 +286,7 @@ "html/elements/base/href/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201chref\u201d on element \u201cbase\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/base/href/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201chref\u201d on element \u201cbase\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/base/href/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/base/href/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201chref\u201d on element \u201cbase\u201d: Bad URL: Port number must be less than 65536.", "html/elements/base/href/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201chref\u201d on element \u201cbase\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/base/href/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201chref\u201d on element \u201cbase\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/base/href/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201chref\u201d on element \u201cbase\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -348,6 +352,7 @@ "html/elements/blockquote/cite/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201ccite\u201d on element \u201cblockquote\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/blockquote/cite/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201ccite\u201d on element \u201cblockquote\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/blockquote/cite/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/blockquote/cite/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201ccite\u201d on element \u201cblockquote\u201d: Bad URL: Port number must be less than 65536.", "html/elements/blockquote/cite/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201ccite\u201d on element \u201cblockquote\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/blockquote/cite/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201ccite\u201d on element \u201cblockquote\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/blockquote/cite/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201ccite\u201d on element \u201cblockquote\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -416,6 +421,7 @@ "html/elements/button/formaction/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201cformaction\u201d on element \u201cbutton\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/button/formaction/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201cformaction\u201d on element \u201cbutton\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/button/formaction/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/button/formaction/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201cformaction\u201d on element \u201cbutton\u201d: Bad URL: Port number must be less than 65536.", "html/elements/button/formaction/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201cformaction\u201d on element \u201cbutton\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/button/formaction/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201cformaction\u201d on element \u201cbutton\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/button/formaction/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201cformaction\u201d on element \u201cbutton\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -483,6 +489,7 @@ "html/elements/del/cite/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201ccite\u201d on element \u201cdel\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/del/cite/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201ccite\u201d on element \u201cdel\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/del/cite/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/del/cite/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201ccite\u201d on element \u201cdel\u201d: Bad URL: Port number must be less than 65536.", "html/elements/del/cite/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201ccite\u201d on element \u201cdel\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/del/cite/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201ccite\u201d on element \u201cdel\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/del/cite/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201ccite\u201d on element \u201cdel\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -645,6 +652,7 @@ "html/elements/embed/src/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201csrc\u201d on element \u201cembed\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/embed/src/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201csrc\u201d on element \u201cembed\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/embed/src/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/embed/src/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201csrc\u201d on element \u201cembed\u201d: Bad URL: Port number must be less than 65536.", "html/elements/embed/src/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201csrc\u201d on element \u201cembed\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/embed/src/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201csrc\u201d on element \u201cembed\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/embed/src/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201csrc\u201d on element \u201cembed\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -715,6 +723,7 @@ "html/elements/form/action/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201caction\u201d on element \u201cform\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/form/action/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201caction\u201d on element \u201cform\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/form/action/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/form/action/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201caction\u201d on element \u201cform\u201d: Bad URL: Port number must be less than 65536.", "html/elements/form/action/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201caction\u201d on element \u201cform\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/form/action/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201caction\u201d on element \u201cform\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/form/action/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201caction\u201d on element \u201cform\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -790,6 +799,7 @@ "html/elements/html/manifest/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/html/manifest/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/html/manifest/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/html/manifest/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Port number must be less than 65536.", "html/elements/html/manifest/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/html/manifest/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/html/manifest/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -858,6 +868,7 @@ "html/elements/iframe/src/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201csrc\u201d on element \u201ciframe\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/iframe/src/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201csrc\u201d on element \u201ciframe\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/iframe/src/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/iframe/src/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201csrc\u201d on element \u201ciframe\u201d: Bad URL: Port number must be less than 65536.", "html/elements/iframe/src/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201csrc\u201d on element \u201ciframe\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/iframe/src/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201csrc\u201d on element \u201ciframe\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/iframe/src/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201csrc\u201d on element \u201ciframe\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -925,6 +936,7 @@ "html/elements/img/src/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201csrc\u201d on element \u201cimg\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/img/src/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201csrc\u201d on element \u201cimg\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/img/src/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/img/src/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201csrc\u201d on element \u201cimg\u201d: Bad URL: Port number must be less than 65536.", "html/elements/img/src/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201csrc\u201d on element \u201cimg\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/img/src/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201csrc\u201d on element \u201cimg\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/img/src/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201csrc\u201d on element \u201cimg\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -996,6 +1008,7 @@ "html/elements/input/type-image-formaction/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201cformaction\u201d on element \u201cinput\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/input/type-image-formaction/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201cformaction\u201d on element \u201cinput\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/input/type-image-formaction/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/input/type-image-formaction/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201cformaction\u201d on element \u201cinput\u201d: Bad URL: Port number must be less than 65536.", "html/elements/input/type-image-formaction/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201cformaction\u201d on element \u201cinput\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/input/type-image-formaction/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201cformaction\u201d on element \u201cinput\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/input/type-image-formaction/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201cformaction\u201d on element \u201cinput\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -1062,6 +1075,7 @@ "html/elements/input/type-image-src/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201csrc\u201d on element \u201cinput\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/input/type-image-src/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201csrc\u201d on element \u201cinput\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/input/type-image-src/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/input/type-image-src/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201csrc\u201d on element \u201cinput\u201d: Bad URL: Port number must be less than 65536.", "html/elements/input/type-image-src/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201csrc\u201d on element \u201cinput\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/input/type-image-src/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201csrc\u201d on element \u201cinput\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/input/type-image-src/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201csrc\u201d on element \u201cinput\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -1128,6 +1142,7 @@ "html/elements/input/type-submit-formaction/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201cformaction\u201d on element \u201cinput\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/input/type-submit-formaction/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201cformaction\u201d on element \u201cinput\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/input/type-submit-formaction/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/input/type-submit-formaction/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201cformaction\u201d on element \u201cinput\u201d: Bad URL: Port number must be less than 65536.", "html/elements/input/type-submit-formaction/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201cformaction\u201d on element \u201cinput\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/input/type-submit-formaction/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201cformaction\u201d on element \u201cinput\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/input/type-submit-formaction/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201cformaction\u201d on element \u201cinput\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -1200,6 +1215,7 @@ "html/elements/input/type-url-value/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201cvalue\u201d on element \u201cinput\u201d: Bad absolute URL: Tab, new line or carriage return found.", "html/elements/input/type-url-value/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201cvalue\u201d on element \u201cinput\u201d: Bad absolute URL: Illegal character in path segment: space is not allowed.", "html/elements/input/type-url-value/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/input/type-url-value/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201cvalue\u201d on element \u201cinput\u201d: Bad absolute URL: Port number must be less than 65536.", "html/elements/input/type-url-value/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201cvalue\u201d on element \u201cinput\u201d: Bad absolute URL: Tab, new line or carriage return found.", "html/elements/input/type-url-value/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201cvalue\u201d on element \u201cinput\u201d: Bad absolute URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/input/type-url-value/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201cvalue\u201d on element \u201cinput\u201d: Bad absolute URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -1266,6 +1282,7 @@ "html/elements/ins/cite/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201ccite\u201d on element \u201cins\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/ins/cite/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201ccite\u201d on element \u201cins\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/ins/cite/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/ins/cite/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201ccite\u201d on element \u201cins\u201d: Bad URL: Port number must be less than 65536.", "html/elements/ins/cite/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201ccite\u201d on element \u201cins\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/ins/cite/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201ccite\u201d on element \u201cins\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/ins/cite/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201ccite\u201d on element \u201cins\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -1433,6 +1450,7 @@ "html/elements/link/href/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201chref\u201d on element \u201clink\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/link/href/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201chref\u201d on element \u201clink\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/link/href/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/link/href/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201chref\u201d on element \u201clink\u201d: Bad URL: Port number must be less than 65536.", "html/elements/link/href/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201chref\u201d on element \u201clink\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/link/href/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201chref\u201d on element \u201clink\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/link/href/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201chref\u201d on element \u201clink\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -1501,6 +1519,7 @@ "html/elements/object/data/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201cdata\u201d on element \u201cobject\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/object/data/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201cdata\u201d on element \u201cobject\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/object/data/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/object/data/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201cdata\u201d on element \u201cobject\u201d: Bad URL: Port number must be less than 65536.", "html/elements/object/data/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201cdata\u201d on element \u201cobject\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/object/data/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201cdata\u201d on element \u201cobject\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/object/data/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201cdata\u201d on element \u201cobject\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -1769,6 +1788,7 @@ "html/elements/q/cite/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201ccite\u201d on element \u201cq\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/q/cite/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201ccite\u201d on element \u201cq\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/q/cite/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/q/cite/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201ccite\u201d on element \u201cq\u201d: Bad URL: Port number must be less than 65536.", "html/elements/q/cite/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201ccite\u201d on element \u201cq\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/q/cite/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201ccite\u201d on element \u201cq\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/q/cite/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201ccite\u201d on element \u201cq\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -1840,6 +1860,7 @@ "html/elements/script/src/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201csrc\u201d on element \u201cscript\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/script/src/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201csrc\u201d on element \u201cscript\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/script/src/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/script/src/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201csrc\u201d on element \u201cscript\u201d: Bad URL: Port number must be less than 65536.", "html/elements/script/src/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201csrc\u201d on element \u201cscript\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/script/src/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201csrc\u201d on element \u201cscript\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/script/src/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201csrc\u201d on element \u201cscript\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -1907,6 +1928,7 @@ "html/elements/source/src/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201csrc\u201d on element \u201csource\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/source/src/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201csrc\u201d on element \u201csource\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/source/src/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/source/src/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201csrc\u201d on element \u201csource\u201d: Bad URL: Port number must be less than 65536.", "html/elements/source/src/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201csrc\u201d on element \u201csource\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/source/src/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201csrc\u201d on element \u201csource\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/source/src/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201csrc\u201d on element \u201csource\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -1988,6 +2010,7 @@ "html/elements/track/src/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201csrc\u201d on element \u201ctrack\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/track/src/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201csrc\u201d on element \u201ctrack\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/track/src/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/track/src/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201csrc\u201d on element \u201ctrack\u201d: Bad URL: Port number must be less than 65536.", "html/elements/track/src/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201csrc\u201d on element \u201ctrack\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/track/src/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201csrc\u201d on element \u201ctrack\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/track/src/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201csrc\u201d on element \u201ctrack\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -2057,6 +2080,7 @@ "html/elements/video/poster/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201cposter\u201d on element \u201cvideo\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/video/poster/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201cposter\u201d on element \u201cvideo\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/video/poster/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/video/poster/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201cposter\u201d on element \u201cvideo\u201d: Bad URL: Port number must be less than 65536.", "html/elements/video/poster/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201cposter\u201d on element \u201cvideo\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/video/poster/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201cposter\u201d on element \u201cvideo\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/video/poster/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201cposter\u201d on element \u201cvideo\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -2121,6 +2145,7 @@ "html/elements/video/src/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201csrc\u201d on element \u201cvideo\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/video/src/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201csrc\u201d on element \u201cvideo\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/elements/video/src/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/elements/video/src/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201csrc\u201d on element \u201cvideo\u201d: Bad URL: Port number must be less than 65536.", "html/elements/video/src/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201csrc\u201d on element \u201cvideo\u201d: Bad URL: Tab, new line or carriage return found.", "html/elements/video/src/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201csrc\u201d on element \u201cvideo\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/elements/video/src/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201csrc\u201d on element \u201cvideo\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -2209,6 +2234,7 @@ "html/microdata/itemid/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201citemid\u201d on element \u201cdiv\u201d: Bad URL: Tab, new line or carriage return found.", "html/microdata/itemid/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201citemid\u201d on element \u201cdiv\u201d: Bad URL: Illegal character in path segment: space is not allowed.", "html/microdata/itemid/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/microdata/itemid/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201citemid\u201d on element \u201cdiv\u201d: Bad URL: Port number must be less than 65536.", "html/microdata/itemid/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201citemid\u201d on element \u201cdiv\u201d: Bad URL: Tab, new line or carriage return found.", "html/microdata/itemid/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201citemid\u201d on element \u201cdiv\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/microdata/itemid/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201citemid\u201d on element \u201cdiv\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", @@ -2282,6 +2308,7 @@ "html/microdata/itemtype/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201citemtype\u201d on element \u201cdiv\u201d: Bad absolute URL: The string \u201cbar\u201d is not an absolute URL.", "html/microdata/itemtype/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201citemtype\u201d on element \u201cdiv\u201d: Bad absolute URL: The string \u201c?\u201d is not an absolute URL.", "html/microdata/itemtype/path-u0091-novalid.html": "Forbidden code point U+0091.", + "html/microdata/itemtype/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201citemtype\u201d on element \u201cdiv\u201d: Bad absolute URL: Port number must be less than 65536.", "html/microdata/itemtype/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201citemtype\u201d on element \u201cdiv\u201d: Bad absolute URL: The string \u201c/c\u201d is not an absolute URL.", "html/microdata/itemtype/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201citemtype\u201d on element \u201cdiv\u201d: Bad absolute URL: Illegal character in port: \u201c:\u201d is not allowed.", "html/microdata/itemtype/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201citemtype\u201d on element \u201cdiv\u201d: Bad absolute URL: Illegal character in port: \u201c:\u201d is not allowed.", diff --git a/conformance-checkers/tools/build-svg-tests.py b/conformance-checkers/tools/build-svg-tests.py new file mode 100644 index 00000000000000..c212e78896b668 --- /dev/null +++ b/conformance-checkers/tools/build-svg-tests.py @@ -0,0 +1,315 @@ +#!/usr/bin/env python2.7 + +# Copyright (c) 2016 PowerMapper Software +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +"""build_svg_tests.py. + +This script builds a set of SVG-in-HTML test files for the Nu Html Checker +based on the SVG 1.1 Second Edition Test Suite +http://www.w3.org/Graphics/SVG/Test/20110816/archives/W3C_SVG_11_TestSuite.tar.gz + +""" + +import logging +import os +import sys, getopt +import urllib2 + +# some files in the SVG 1.1 test suite don't validate against the SVG 1.1 DTD +# but are valid against the HTML 5 spec + +valid_svg_files = dict([ + # these entries manually added after cross checking behaviour with spec + + # VNU warns about text not in Unicode Normalization Form C, but it's not an error + ('struct-cond-02-t-manual.svg', 'Source text is not in Unicode Normalization Form C'), + # FiLl, fill and FILL are all valid in case-insensitive HTML (but SVG DTD is case-sensitive) + ('styling-css-10-f-manual.svg', 'Attribute FiLl not allowed on SVG element circle at this point') +]) + +# some files in the SVG 1.1 test suite don't validate against the SVG 1.1 DTD +# and some files are marked as version='SVG 1.2'. +# this is used to toggle between -isvalid.html and -novalid.html output + +invalid_svg_files = dict([ + # 'DTD Invalid' entries are produced by calling validate_svg_dtd (see below) + ('animate-dom-01-f-manual.svg', 'DTD Invalid'), + ('animate-dom-02-f-manual.svg', 'DTD Invalid'), + ('animate-elem-24-t-manual.svg', 'DTD Invalid'), + ('animate-elem-77-t-manual.svg', 'DTD Invalid'), + ('animate-pservers-grad-01-b-manual.svg', 'DTD Invalid'), + ('animate-script-elem-01-b-manual.svg', 'DTD Invalid'), + ('animate-struct-dom-01-b-manual.svg', 'DTD Invalid'), + ('conform-viewers-03-f-manual.svg', 'DTD Invalid'), + ('coords-dom-01-f-manual.svg', 'DTD Invalid'), + ('coords-dom-02-f-manual.svg', 'DTD Invalid'), + ('coords-dom-03-f-manual.svg', 'DTD Invalid'), + ('extend-namespace-01-f-manual.svg', 'DTD Invalid'), + ('filters-color-02-b-manual.svg', 'DTD Invalid'), + ('filters-conv-02-f-manual.svg', 'DTD Invalid'), + ('filters-conv-04-f-manual.svg', 'DTD Invalid'), + ('filters-conv-05-f-manual.svg', 'DTD Invalid'), + ('filters-light-05-f-manual.svg', 'DTD Invalid'), + ('fonts-glyph-04-t-manual.svg', 'DTD Invalid'), + ('interact-events-02-b-manual.svg', 'DTD Invalid'), + ('interact-pevents-01-b-manual.svg', 'DTD Invalid'), + ('interact-pevents-03-b-manual.svg', 'DTD Invalid'), + ('interact-pevents-05-b-manual.svg', 'DTD Invalid'), + ('interact-pevents-07-t-manual.svg', 'DTD Invalid'), + ('interact-pevents-08-f-manual.svg', 'DTD Invalid'), + ('interact-pevents-09-f-manual.svg', 'DTD Invalid'), + ('interact-pointer-01-t-manual.svg', 'DTD Invalid'), + ('interact-pointer-02-t-manual.svg', 'DTD Invalid'), + ('interact-pointer-03-t-manual.svg', 'DTD Invalid'), + ('linking-a-09-b-manual.svg', 'DTD Invalid'), + ('linking-a-10-f-manual.svg', 'DTD Invalid'), + ('masking-filter-01-f-manual.svg', 'DTD Invalid'), + ('masking-intro-01-f-manual.svg', 'DTD Invalid'), + ('masking-path-09-b-manual.svg', 'DTD Invalid'), + ('painting-marker-04-f-manual.svg', 'DTD Invalid'), + ('paths-data-18-f-manual.svg', 'DTD Invalid'), + ('paths-data-20-f-manual.svg', 'DTD Invalid'), + ('paths-dom-01-f-manual.svg', 'DTD Invalid'), + ('paths-dom-02-f-manual.svg', 'DTD Invalid'), + ('pservers-grad-23-f-manual.svg', 'DTD Invalid'), + ('render-elems-03-t-manual.svg', 'DTD Invalid'), + ('shapes-rect-03-t-manual.svg', 'DTD Invalid'), + ('struct-cond-02-t-manual.svg', 'DTD Invalid'), + ('struct-dom-07-f-manual.svg', 'DTD Invalid'), + ('struct-dom-08-f-manual.svg', 'DTD Invalid'), + ('struct-dom-11-f-manual.svg', 'DTD Invalid'), + ('struct-dom-13-f-manual.svg', 'DTD Invalid'), + ('struct-dom-14-f-manual.svg', 'DTD Invalid'), + ('struct-dom-15-f-manual.svg', 'DTD Invalid'), + ('struct-dom-17-f-manual.svg', 'DTD Invalid'), + ('struct-dom-19-f-manual.svg', 'DTD Invalid'), + ('struct-dom-20-f-manual.svg', 'DTD Invalid'), + ('struct-frag-05-t-manual.svg', 'DTD Invalid'), + ('struct-image-12-b-manual.svg', 'DTD Invalid'), + ('struct-use-11-f-manual.svg', 'DTD Invalid'), + ('struct-use-12-f-manual.svg', 'DTD Invalid'), + ('struct-use-13-f-manual.svg', 'DTD Invalid'), + ('styling-css-10-f-manual.svg', 'DTD Invalid'), + ('styling-pres-02-f-manual.svg', 'DTD Invalid'), + ('svgdom-over-01-f-manual.svg', 'DTD Invalid'), + ('text-dom-02-f-manual.svg', 'DTD Invalid'), + ('text-dom-03-f-manual.svg', 'DTD Invalid'), + ('text-dom-05-f-manual.svg', 'DTD Invalid'), + ('text-fonts-03-t-manual.svg', 'DTD Invalid'), + ('text-fonts-05-f-manual.svg', 'DTD Invalid'), + ('text-tref-02-b-manual.svg', 'DTD Invalid'), + ('text-tselect-02-f-manual.svg', 'DTD Invalid'), + ('text-tselect-03-f-manual.svg', 'DTD Invalid'), + ('types-dom-02-f-manual.svg', 'DTD Invalid'), + ('types-dom-03-b-manual.svg', 'DTD Invalid'), + ('types-dom-04-b-manual.svg', 'DTD Invalid'), + ('types-dom-05-b-manual.svg', 'DTD Invalid'), + ('types-dom-07-f-manual.svg', 'DTD Invalid'), + ('types-dom-08-f-manual.svg', 'DTD Invalid'), + + # these entries manually added after cross checking behaviour with spec + # note there are some confusing differences between w:iri-ref (used in HTML for img/@src) + # and xsd:anyURI (used in SVG for image/@xlink:href) + ('animate-elem-40-t-manual.svg', 'Spaces in data: URI - not allowed by URL Standard or RFC 2397.'), + ('conform-viewers-02-f-manual.svg', 'Newlines in data: URI - not allowed by URL Standard or RFC 2397.'), + ('coords-transformattr-01-f-manual.svg', 'Numeric character reference expanded to carriage return - not allowed in HTML5 - see 8.1.4'), + ('fonts-overview-201-t-manual.svg', 'Unsupported SVG version specified - specifies SVG 1.2'), + ('script-specify-01-f-manual.svg', 'Attribute contentscripttype not allowed on element svg at this point - not allowed in HTML5 - see 4.8.18 SVG'), + ('types-dom-04-b-manual.svg', 'Attribute externalresourcesrequired not allowed on element svg at this point - not allowed in HTML5 - see 4.8.18 SVG'), + ('metadata-example-01-t-manual.svg', 'Element rdf:rdf not allowed as child of element metadata in this context - namespaced XML not allowed in HTML5') +]) + +# TODO Github Issue #216 MathML and SVG uses xsd:anyURI, HTML URLs use URL Standard +# TODO Github Issue #217 NU has script/@type optional for HTML, but not SVG-in-HTML + +def build_html_testfiles(svgdirectory,htmldirectory): + """Builds HTML test files from SVG test suite folder.""" + + logging.debug('build_html_testfiles: IN') + + testfiles = [] + + for filename in os.listdir(svgdirectory): + #logging.debug(filename) + if filename.endswith(".svg"): + htmlpathname = build_html_test_file(filename, svgdirectory, htmldirectory) + if htmlpathname: + testfiles.append(htmlpathname) + pass + pass + + indexpathname = "index-isvalid.html" + build_html_index_file(indexpathname, testfiles) + + +def build_html_index_file(indexpathname, testfiles): + """Builds HTML test index.""" + + htmlfile = open(indexpathname, "w") + + htmlfile.write("\n") + htmlfile.write("\n") + + htmlfile.write("\n") + htmlfile.write(" SVG in HTML Test Index\n") + htmlfile.write(" \n") + htmlfile.write("\n") + + htmlfile.write("\n") + htmlfile.write("

    SVG in HTML Test Index

    \n") + + for filename in testfiles: + if filename.find("-isvalid") > 0: + htmlfile.write("

    %s

    \n" % (filename, filename)) + + htmlfile.write("\n") + + htmlfile.write("\n") + htmlfile.close() + + +def build_html_test_file(filename, svgdirectory, htmldirectory): + """Builds HTML test file by wrapping input SVG in boilerplate HTML.""" + + svgpathname = svgdirectory + "/" + filename + + # valid_svg_file overrides invalid_svg_files (may invalid in case-sensitive XML but valid in case-insensitive HTML) + if invalid_svg_files.has_key(filename) and not valid_svg_files.has_key(filename): + htmlpathname = htmldirectory + "/" + filename.replace( "-manual.svg", "-novalid.html") + else: + htmlpathname = htmldirectory + "/" + filename.replace( "-manual.svg", "-isvalid.html") + + logging.debug(svgpathname) + logging.debug(htmlpathname) + + # read SVG data + svgfile = open(svgpathname, "r") + svg = svgfile.read() + svgfile.close() + + # but remove from file (not valid in HTML or SVG DTD) + svg = svg.replace('', '') + svgbefore = svg.split("")[1]; + svg = svgbefore + svgafter + + # ignore files with SVG DOCTYPE and !ENTITY declarations (unsupported in HTML) + if svg.find( "\n") + htmlfile.write("\n") + + htmlfile.write("\n") + htmlfile.write(" %s\n" % os.path.basename(svgpathname) ) + htmlfile.write(" \n") + htmlfile.write("\n") + + htmlfile.write("\n") + htmlfile.write("

    Source SVG: %s

    \n" % os.path.basename(svgpathname) ) + + # insert SVG without any XML processing to avoid unexpected transformations on + # encoding and entity refs, but remove from file (not valid in HTML) + htmlfile.write(svgbefore) + htmlfile.write(svgafter) + + htmlfile.write("\n") + + htmlfile.write("\n") + htmlfile.close() + + return htmlpathname + +def create_dir_if_missing(directory): + """Create the given directory if it doesn't exist""" + + d = os.path.dirname(directory) + if not os.path.exists(directory): + os.makedirs(directory) + + +def validate_svg_dtd(filename,svg): + """Prints legacy DTD markup validation status to stdout in a format suitable for pasting into invalid_svg_files dict above.""" + + # setup multipart/form-data POST body + body = '' + body = body + '--AaB03x\r\n' + body = body + 'Content-Disposition: form-data; name="fieldname"\r\n' + body = body + '\r\n' + body = body + 'value\r\n' + body = body + '--AaB03x\r\n' + body = body + 'Content-Disposition: form-data; name="uploaded_file"; filename="test.svg"\r\n' + body = body + 'Content-Type: image/svg+xml\r\n' + body = body + '\r\n' + body = body + svg + body = body + '\r\n' + body = body + '--AaB03x--\r\n' + + # send request to W3 DTD validator for SVG 1.1 validation + headers = { "Content-type" : "multipart/form-data; boundary=AaB03x", "Content-length" : len(body) } + request = urllib2.Request("http://validator.w3.org/check?charset=utf-8&doctype=SVG+1.1&output=json", data=body, headers=headers) + response = urllib2.urlopen(request, timeout=60) + + status = response.info().getheader('X-W3C-Validator-Status') + logging.debug(status) + + if status == "Valid": + return True + + print " ('%s', 'DTD %s')," % (filename, status) + return False + + +def main(): + + #logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') + logging.debug('main: IN') + + svgdirectory = "../../svg/import" + htmldirectory = "../html-svg" + + try: + opts, args = getopt.getopt(sys.argv[1:],"",["svgdir=","outdir="]) + except getopt.GetoptError: + print 'build-svg-tests.py --svgdir --outdir ' + sys.exit(2) + + for opt, arg in opts: + print opt, arg + if opt in ("-s", "--svgdir"): + svgdirectory = arg + elif opt in ("-o", "--outdir"): + htmldirectory = arg + + + create_dir_if_missing(htmldirectory) + build_html_testfiles(svgdirectory, htmldirectory) + + +main() \ No newline at end of file diff --git a/conformance-checkers/tools/index-isvalid.html b/conformance-checkers/tools/index-isvalid.html new file mode 100644 index 00000000000000..5f3e02fc0ba41d --- /dev/null +++ b/conformance-checkers/tools/index-isvalid.html @@ -0,0 +1,451 @@ + + + + SVG in HTML Test Index + + + +

    SVG in HTML Test Index

    +

    ../html-svg/animate-elem-02-t-isvalid.html

    +

    ../html-svg/animate-elem-03-t-isvalid.html

    +

    ../html-svg/animate-elem-04-t-isvalid.html

    +

    ../html-svg/animate-elem-05-t-isvalid.html

    +

    ../html-svg/animate-elem-06-t-isvalid.html

    +

    ../html-svg/animate-elem-07-t-isvalid.html

    +

    ../html-svg/animate-elem-08-t-isvalid.html

    +

    ../html-svg/animate-elem-09-t-isvalid.html

    +

    ../html-svg/animate-elem-10-t-isvalid.html

    +

    ../html-svg/animate-elem-11-t-isvalid.html

    +

    ../html-svg/animate-elem-12-t-isvalid.html

    +

    ../html-svg/animate-elem-13-t-isvalid.html

    +

    ../html-svg/animate-elem-14-t-isvalid.html

    +

    ../html-svg/animate-elem-15-t-isvalid.html

    +

    ../html-svg/animate-elem-17-t-isvalid.html

    +

    ../html-svg/animate-elem-19-t-isvalid.html

    +

    ../html-svg/animate-elem-20-t-isvalid.html

    +

    ../html-svg/animate-elem-21-t-isvalid.html

    +

    ../html-svg/animate-elem-22-b-isvalid.html

    +

    ../html-svg/animate-elem-23-t-isvalid.html

    +

    ../html-svg/animate-elem-25-t-isvalid.html

    +

    ../html-svg/animate-elem-26-t-isvalid.html

    +

    ../html-svg/animate-elem-27-t-isvalid.html

    +

    ../html-svg/animate-elem-28-t-isvalid.html

    +

    ../html-svg/animate-elem-29-b-isvalid.html

    +

    ../html-svg/animate-elem-30-t-isvalid.html

    +

    ../html-svg/animate-elem-31-t-isvalid.html

    +

    ../html-svg/animate-elem-32-t-isvalid.html

    +

    ../html-svg/animate-elem-33-t-isvalid.html

    +

    ../html-svg/animate-elem-34-t-isvalid.html

    +

    ../html-svg/animate-elem-35-t-isvalid.html

    +

    ../html-svg/animate-elem-36-t-isvalid.html

    +

    ../html-svg/animate-elem-37-t-isvalid.html

    +

    ../html-svg/animate-elem-38-t-isvalid.html

    +

    ../html-svg/animate-elem-39-t-isvalid.html

    +

    ../html-svg/animate-elem-41-t-isvalid.html

    +

    ../html-svg/animate-elem-44-t-isvalid.html

    +

    ../html-svg/animate-elem-46-t-isvalid.html

    +

    ../html-svg/animate-elem-52-t-isvalid.html

    +

    ../html-svg/animate-elem-53-t-isvalid.html

    +

    ../html-svg/animate-elem-60-t-isvalid.html

    +

    ../html-svg/animate-elem-61-t-isvalid.html

    +

    ../html-svg/animate-elem-62-t-isvalid.html

    +

    ../html-svg/animate-elem-63-t-isvalid.html

    +

    ../html-svg/animate-elem-64-t-isvalid.html

    +

    ../html-svg/animate-elem-65-t-isvalid.html

    +

    ../html-svg/animate-elem-66-t-isvalid.html

    +

    ../html-svg/animate-elem-67-t-isvalid.html

    +

    ../html-svg/animate-elem-68-t-isvalid.html

    +

    ../html-svg/animate-elem-69-t-isvalid.html

    +

    ../html-svg/animate-elem-70-t-isvalid.html

    +

    ../html-svg/animate-elem-78-t-isvalid.html

    +

    ../html-svg/animate-elem-80-t-isvalid.html

    +

    ../html-svg/animate-elem-81-t-isvalid.html

    +

    ../html-svg/animate-elem-82-t-isvalid.html

    +

    ../html-svg/animate-elem-83-t-isvalid.html

    +

    ../html-svg/animate-elem-84-t-isvalid.html

    +

    ../html-svg/animate-elem-85-t-isvalid.html

    +

    ../html-svg/animate-elem-86-t-isvalid.html

    +

    ../html-svg/animate-elem-87-t-isvalid.html

    +

    ../html-svg/animate-elem-88-t-isvalid.html

    +

    ../html-svg/animate-elem-89-t-isvalid.html

    +

    ../html-svg/animate-elem-90-b-isvalid.html

    +

    ../html-svg/animate-elem-91-t-isvalid.html

    +

    ../html-svg/animate-elem-92-t-isvalid.html

    +

    ../html-svg/animate-interact-events-01-t-isvalid.html

    +

    ../html-svg/animate-interact-pevents-01-t-isvalid.html

    +

    ../html-svg/animate-interact-pevents-02-t-isvalid.html

    +

    ../html-svg/animate-interact-pevents-03-t-isvalid.html

    +

    ../html-svg/animate-interact-pevents-04-t-isvalid.html

    +

    ../html-svg/color-prof-01-f-isvalid.html

    +

    ../html-svg/color-prop-01-b-isvalid.html

    +

    ../html-svg/color-prop-02-f-isvalid.html

    +

    ../html-svg/color-prop-03-t-isvalid.html

    +

    ../html-svg/color-prop-04-t-isvalid.html

    +

    ../html-svg/color-prop-05-t-isvalid.html

    +

    ../html-svg/coords-coord-01-t-isvalid.html

    +

    ../html-svg/coords-coord-02-t-isvalid.html

    +

    ../html-svg/coords-dom-04-f-isvalid.html

    +

    ../html-svg/coords-trans-01-b-isvalid.html

    +

    ../html-svg/coords-trans-02-t-isvalid.html

    +

    ../html-svg/coords-trans-03-t-isvalid.html

    +

    ../html-svg/coords-trans-04-t-isvalid.html

    +

    ../html-svg/coords-trans-05-t-isvalid.html

    +

    ../html-svg/coords-trans-06-t-isvalid.html

    +

    ../html-svg/coords-trans-07-t-isvalid.html

    +

    ../html-svg/coords-trans-08-t-isvalid.html

    +

    ../html-svg/coords-trans-09-t-isvalid.html

    +

    ../html-svg/coords-trans-10-f-isvalid.html

    +

    ../html-svg/coords-trans-11-f-isvalid.html

    +

    ../html-svg/coords-trans-12-f-isvalid.html

    +

    ../html-svg/coords-trans-13-f-isvalid.html

    +

    ../html-svg/coords-trans-14-f-isvalid.html

    +

    ../html-svg/coords-transformattr-02-f-isvalid.html

    +

    ../html-svg/coords-transformattr-03-f-isvalid.html

    +

    ../html-svg/coords-transformattr-04-f-isvalid.html

    +

    ../html-svg/coords-transformattr-05-f-isvalid.html

    +

    ../html-svg/coords-units-01-b-isvalid.html

    +

    ../html-svg/coords-units-02-b-isvalid.html

    +

    ../html-svg/coords-units-03-b-isvalid.html

    +

    ../html-svg/coords-viewattr-03-b-isvalid.html

    +

    ../html-svg/filters-background-01-f-isvalid.html

    +

    ../html-svg/filters-blend-01-b-isvalid.html

    +

    ../html-svg/filters-color-01-b-isvalid.html

    +

    ../html-svg/filters-composite-02-b-isvalid.html

    +

    ../html-svg/filters-composite-03-f-isvalid.html

    +

    ../html-svg/filters-composite-04-f-isvalid.html

    +

    ../html-svg/filters-composite-05-f-isvalid.html

    +

    ../html-svg/filters-comptran-01-b-isvalid.html

    +

    ../html-svg/filters-conv-01-f-isvalid.html

    +

    ../html-svg/filters-conv-03-f-isvalid.html

    +

    ../html-svg/filters-diffuse-01-f-isvalid.html

    +

    ../html-svg/filters-displace-01-f-isvalid.html

    +

    ../html-svg/filters-displace-02-f-isvalid.html

    +

    ../html-svg/filters-example-01-b-isvalid.html

    +

    ../html-svg/filters-felem-01-b-isvalid.html

    +

    ../html-svg/filters-felem-02-f-isvalid.html

    +

    ../html-svg/filters-gauss-01-b-isvalid.html

    +

    ../html-svg/filters-gauss-02-f-isvalid.html

    +

    ../html-svg/filters-gauss-03-f-isvalid.html

    +

    ../html-svg/filters-image-01-b-isvalid.html

    +

    ../html-svg/filters-image-02-b-isvalid.html

    +

    ../html-svg/filters-image-03-f-isvalid.html

    +

    ../html-svg/filters-image-04-f-isvalid.html

    +

    ../html-svg/filters-image-05-f-isvalid.html

    +

    ../html-svg/filters-light-01-f-isvalid.html

    +

    ../html-svg/filters-light-02-f-isvalid.html

    +

    ../html-svg/filters-light-03-f-isvalid.html

    +

    ../html-svg/filters-light-04-f-isvalid.html

    +

    ../html-svg/filters-morph-01-f-isvalid.html

    +

    ../html-svg/filters-offset-01-b-isvalid.html

    +

    ../html-svg/filters-offset-02-b-isvalid.html

    +

    ../html-svg/filters-overview-01-b-isvalid.html

    +

    ../html-svg/filters-overview-02-b-isvalid.html

    +

    ../html-svg/filters-overview-03-b-isvalid.html

    +

    ../html-svg/filters-specular-01-f-isvalid.html

    +

    ../html-svg/filters-tile-01-b-isvalid.html

    +

    ../html-svg/filters-turb-01-f-isvalid.html

    +

    ../html-svg/filters-turb-02-f-isvalid.html

    +

    ../html-svg/fonts-desc-01-t-isvalid.html

    +

    ../html-svg/fonts-desc-02-t-isvalid.html

    +

    ../html-svg/fonts-desc-03-t-isvalid.html

    +

    ../html-svg/fonts-desc-04-t-isvalid.html

    +

    ../html-svg/fonts-desc-05-t-isvalid.html

    +

    ../html-svg/fonts-elem-01-t-isvalid.html

    +

    ../html-svg/fonts-elem-02-t-isvalid.html

    +

    ../html-svg/fonts-elem-03-b-isvalid.html

    +

    ../html-svg/fonts-elem-04-b-isvalid.html

    +

    ../html-svg/fonts-elem-05-t-isvalid.html

    +

    ../html-svg/fonts-elem-06-t-isvalid.html

    +

    ../html-svg/fonts-elem-07-b-isvalid.html

    +

    ../html-svg/fonts-glyph-02-t-isvalid.html

    +

    ../html-svg/fonts-glyph-03-t-isvalid.html

    +

    ../html-svg/fonts-kern-01-t-isvalid.html

    +

    ../html-svg/imp-path-01-f-isvalid.html

    +

    ../html-svg/interact-cursor-01-f-isvalid.html

    +

    ../html-svg/interact-dom-01-b-isvalid.html

    +

    ../html-svg/interact-events-01-b-isvalid.html

    +

    ../html-svg/interact-events-202-f-isvalid.html

    +

    ../html-svg/interact-events-203-t-isvalid.html

    +

    ../html-svg/interact-order-01-b-isvalid.html

    +

    ../html-svg/interact-order-02-b-isvalid.html

    +

    ../html-svg/interact-order-03-b-isvalid.html

    +

    ../html-svg/interact-pevents-04-t-isvalid.html

    +

    ../html-svg/interact-pevents-10-f-isvalid.html

    +

    ../html-svg/interact-pointer-04-f-isvalid.html

    +

    ../html-svg/interact-zoom-01-t-isvalid.html

    +

    ../html-svg/interact-zoom-02-t-isvalid.html

    +

    ../html-svg/interact-zoom-03-t-isvalid.html

    +

    ../html-svg/linking-a-01-b-isvalid.html

    +

    ../html-svg/linking-a-03-b-isvalid.html

    +

    ../html-svg/linking-a-04-t-isvalid.html

    +

    ../html-svg/linking-a-05-t-isvalid.html

    +

    ../html-svg/linking-a-07-t-isvalid.html

    +

    ../html-svg/linking-a-08-t-isvalid.html

    +

    ../html-svg/linking-frag-01-f-isvalid.html

    +

    ../html-svg/linking-uri-01-b-isvalid.html

    +

    ../html-svg/linking-uri-02-b-isvalid.html

    +

    ../html-svg/linking-uri-03-t-isvalid.html

    +

    ../html-svg/masking-mask-01-b-isvalid.html

    +

    ../html-svg/masking-mask-02-f-isvalid.html

    +

    ../html-svg/masking-opacity-01-b-isvalid.html

    +

    ../html-svg/masking-path-01-b-isvalid.html

    +

    ../html-svg/masking-path-02-b-isvalid.html

    +

    ../html-svg/masking-path-03-b-isvalid.html

    +

    ../html-svg/masking-path-04-b-isvalid.html

    +

    ../html-svg/masking-path-05-f-isvalid.html

    +

    ../html-svg/masking-path-06-b-isvalid.html

    +

    ../html-svg/masking-path-07-b-isvalid.html

    +

    ../html-svg/masking-path-08-b-isvalid.html

    +

    ../html-svg/masking-path-10-b-isvalid.html

    +

    ../html-svg/masking-path-11-b-isvalid.html

    +

    ../html-svg/masking-path-12-f-isvalid.html

    +

    ../html-svg/masking-path-13-f-isvalid.html

    +

    ../html-svg/masking-path-14-f-isvalid.html

    +

    ../html-svg/painting-control-01-f-isvalid.html

    +

    ../html-svg/painting-control-02-f-isvalid.html

    +

    ../html-svg/painting-control-03-f-isvalid.html

    +

    ../html-svg/painting-control-04-f-isvalid.html

    +

    ../html-svg/painting-control-05-f-isvalid.html

    +

    ../html-svg/painting-control-06-f-isvalid.html

    +

    ../html-svg/painting-fill-01-t-isvalid.html

    +

    ../html-svg/painting-fill-02-t-isvalid.html

    +

    ../html-svg/painting-fill-03-t-isvalid.html

    +

    ../html-svg/painting-fill-04-t-isvalid.html

    +

    ../html-svg/painting-fill-05-b-isvalid.html

    +

    ../html-svg/painting-marker-01-f-isvalid.html

    +

    ../html-svg/painting-marker-02-f-isvalid.html

    +

    ../html-svg/painting-marker-03-f-isvalid.html

    +

    ../html-svg/painting-marker-05-f-isvalid.html

    +

    ../html-svg/painting-marker-06-f-isvalid.html

    +

    ../html-svg/painting-marker-07-f-isvalid.html

    +

    ../html-svg/painting-marker-properties-01-f-isvalid.html

    +

    ../html-svg/painting-render-01-b-isvalid.html

    +

    ../html-svg/painting-render-02-b-isvalid.html

    +

    ../html-svg/painting-stroke-01-t-isvalid.html

    +

    ../html-svg/painting-stroke-02-t-isvalid.html

    +

    ../html-svg/painting-stroke-03-t-isvalid.html

    +

    ../html-svg/painting-stroke-04-t-isvalid.html

    +

    ../html-svg/painting-stroke-05-t-isvalid.html

    +

    ../html-svg/painting-stroke-06-t-isvalid.html

    +

    ../html-svg/painting-stroke-07-t-isvalid.html

    +

    ../html-svg/painting-stroke-08-t-isvalid.html

    +

    ../html-svg/painting-stroke-09-t-isvalid.html

    +

    ../html-svg/painting-stroke-10-t-isvalid.html

    +

    ../html-svg/paths-data-01-t-isvalid.html

    +

    ../html-svg/paths-data-02-t-isvalid.html

    +

    ../html-svg/paths-data-03-f-isvalid.html

    +

    ../html-svg/paths-data-04-t-isvalid.html

    +

    ../html-svg/paths-data-05-t-isvalid.html

    +

    ../html-svg/paths-data-06-t-isvalid.html

    +

    ../html-svg/paths-data-07-t-isvalid.html

    +

    ../html-svg/paths-data-08-t-isvalid.html

    +

    ../html-svg/paths-data-09-t-isvalid.html

    +

    ../html-svg/paths-data-10-t-isvalid.html

    +

    ../html-svg/paths-data-12-t-isvalid.html

    +

    ../html-svg/paths-data-13-t-isvalid.html

    +

    ../html-svg/paths-data-14-t-isvalid.html

    +

    ../html-svg/paths-data-15-t-isvalid.html

    +

    ../html-svg/paths-data-16-t-isvalid.html

    +

    ../html-svg/paths-data-17-f-isvalid.html

    +

    ../html-svg/paths-data-19-f-isvalid.html

    +

    ../html-svg/pservers-grad-01-b-isvalid.html

    +

    ../html-svg/pservers-grad-02-b-isvalid.html

    +

    ../html-svg/pservers-grad-03-b-isvalid.html

    +

    ../html-svg/pservers-grad-04-b-isvalid.html

    +

    ../html-svg/pservers-grad-05-b-isvalid.html

    +

    ../html-svg/pservers-grad-06-b-isvalid.html

    +

    ../html-svg/pservers-grad-07-b-isvalid.html

    +

    ../html-svg/pservers-grad-08-b-isvalid.html

    +

    ../html-svg/pservers-grad-09-b-isvalid.html

    +

    ../html-svg/pservers-grad-10-b-isvalid.html

    +

    ../html-svg/pservers-grad-11-b-isvalid.html

    +

    ../html-svg/pservers-grad-12-b-isvalid.html

    +

    ../html-svg/pservers-grad-13-b-isvalid.html

    +

    ../html-svg/pservers-grad-14-b-isvalid.html

    +

    ../html-svg/pservers-grad-15-b-isvalid.html

    +

    ../html-svg/pservers-grad-16-b-isvalid.html

    +

    ../html-svg/pservers-grad-17-b-isvalid.html

    +

    ../html-svg/pservers-grad-18-b-isvalid.html

    +

    ../html-svg/pservers-grad-20-b-isvalid.html

    +

    ../html-svg/pservers-grad-21-b-isvalid.html

    +

    ../html-svg/pservers-grad-22-b-isvalid.html

    +

    ../html-svg/pservers-grad-24-f-isvalid.html

    +

    ../html-svg/pservers-grad-stops-01-f-isvalid.html

    +

    ../html-svg/pservers-pattern-01-b-isvalid.html

    +

    ../html-svg/pservers-pattern-02-f-isvalid.html

    +

    ../html-svg/pservers-pattern-03-f-isvalid.html

    +

    ../html-svg/pservers-pattern-04-f-isvalid.html

    +

    ../html-svg/pservers-pattern-05-f-isvalid.html

    +

    ../html-svg/pservers-pattern-06-f-isvalid.html

    +

    ../html-svg/pservers-pattern-07-f-isvalid.html

    +

    ../html-svg/pservers-pattern-08-f-isvalid.html

    +

    ../html-svg/pservers-pattern-09-f-isvalid.html

    +

    ../html-svg/render-elems-01-t-isvalid.html

    +

    ../html-svg/render-elems-02-t-isvalid.html

    +

    ../html-svg/render-elems-06-t-isvalid.html

    +

    ../html-svg/render-elems-07-t-isvalid.html

    +

    ../html-svg/render-elems-08-t-isvalid.html

    +

    ../html-svg/render-groups-01-b-isvalid.html

    +

    ../html-svg/render-groups-03-t-isvalid.html

    +

    ../html-svg/script-handle-01-b-isvalid.html

    +

    ../html-svg/script-handle-02-b-isvalid.html

    +

    ../html-svg/script-handle-03-b-isvalid.html

    +

    ../html-svg/script-handle-04-b-isvalid.html

    +

    ../html-svg/script-specify-02-f-isvalid.html

    +

    ../html-svg/shapes-circle-01-t-isvalid.html

    +

    ../html-svg/shapes-circle-02-t-isvalid.html

    +

    ../html-svg/shapes-ellipse-01-t-isvalid.html

    +

    ../html-svg/shapes-ellipse-02-t-isvalid.html

    +

    ../html-svg/shapes-ellipse-03-f-isvalid.html

    +

    ../html-svg/shapes-grammar-01-f-isvalid.html

    +

    ../html-svg/shapes-intro-01-t-isvalid.html

    +

    ../html-svg/shapes-intro-02-f-isvalid.html

    +

    ../html-svg/shapes-line-01-t-isvalid.html

    +

    ../html-svg/shapes-line-02-f-isvalid.html

    +

    ../html-svg/shapes-polygon-01-t-isvalid.html

    +

    ../html-svg/shapes-polygon-02-t-isvalid.html

    +

    ../html-svg/shapes-polygon-03-t-isvalid.html

    +

    ../html-svg/shapes-polyline-01-t-isvalid.html

    +

    ../html-svg/shapes-polyline-02-t-isvalid.html

    +

    ../html-svg/shapes-rect-01-t-isvalid.html

    +

    ../html-svg/shapes-rect-02-t-isvalid.html

    +

    ../html-svg/shapes-rect-04-f-isvalid.html

    +

    ../html-svg/shapes-rect-05-f-isvalid.html

    +

    ../html-svg/shapes-rect-06-f-isvalid.html

    +

    ../html-svg/shapes-rect-07-f-isvalid.html

    +

    ../html-svg/struct-cond-01-t-isvalid.html

    +

    ../html-svg/struct-cond-02-t-isvalid.html

    +

    ../html-svg/struct-cond-03-t-isvalid.html

    +

    ../html-svg/struct-cond-overview-02-f-isvalid.html

    +

    ../html-svg/struct-cond-overview-03-f-isvalid.html

    +

    ../html-svg/struct-cond-overview-04-f-isvalid.html

    +

    ../html-svg/struct-cond-overview-05-f-isvalid.html

    +

    ../html-svg/struct-defs-01-t-isvalid.html

    +

    ../html-svg/struct-dom-01-b-isvalid.html

    +

    ../html-svg/struct-dom-02-b-isvalid.html

    +

    ../html-svg/struct-dom-03-b-isvalid.html

    +

    ../html-svg/struct-dom-04-b-isvalid.html

    +

    ../html-svg/struct-dom-05-b-isvalid.html

    +

    ../html-svg/struct-dom-06-b-isvalid.html

    +

    ../html-svg/struct-dom-12-b-isvalid.html

    +

    ../html-svg/struct-dom-16-f-isvalid.html

    +

    ../html-svg/struct-dom-18-f-isvalid.html

    +

    ../html-svg/struct-frag-01-t-isvalid.html

    +

    ../html-svg/struct-frag-02-t-isvalid.html

    +

    ../html-svg/struct-frag-03-t-isvalid.html

    +

    ../html-svg/struct-frag-04-t-isvalid.html

    +

    ../html-svg/struct-frag-06-t-isvalid.html

    +

    ../html-svg/struct-group-01-t-isvalid.html

    +

    ../html-svg/struct-group-02-b-isvalid.html

    +

    ../html-svg/struct-group-03-t-isvalid.html

    +

    ../html-svg/struct-image-01-t-isvalid.html

    +

    ../html-svg/struct-image-02-b-isvalid.html

    +

    ../html-svg/struct-image-03-t-isvalid.html

    +

    ../html-svg/struct-image-04-t-isvalid.html

    +

    ../html-svg/struct-image-05-b-isvalid.html

    +

    ../html-svg/struct-image-06-t-isvalid.html

    +

    ../html-svg/struct-image-07-t-isvalid.html

    +

    ../html-svg/struct-image-08-t-isvalid.html

    +

    ../html-svg/struct-image-09-t-isvalid.html

    +

    ../html-svg/struct-image-10-t-isvalid.html

    +

    ../html-svg/struct-image-11-b-isvalid.html

    +

    ../html-svg/struct-image-13-f-isvalid.html

    +

    ../html-svg/struct-image-14-f-isvalid.html

    +

    ../html-svg/struct-image-15-f-isvalid.html

    +

    ../html-svg/struct-image-16-f-isvalid.html

    +

    ../html-svg/struct-image-17-b-isvalid.html

    +

    ../html-svg/struct-image-18-f-isvalid.html

    +

    ../html-svg/struct-image-19-f-isvalid.html

    +

    ../html-svg/struct-svg-01-f-isvalid.html

    +

    ../html-svg/struct-svg-02-f-isvalid.html

    +

    ../html-svg/struct-svg-03-f-isvalid.html

    +

    ../html-svg/struct-symbol-01-b-isvalid.html

    +

    ../html-svg/struct-use-01-t-isvalid.html

    +

    ../html-svg/struct-use-03-t-isvalid.html

    +

    ../html-svg/struct-use-04-b-isvalid.html

    +

    ../html-svg/struct-use-05-b-isvalid.html

    +

    ../html-svg/struct-use-06-b-isvalid.html

    +

    ../html-svg/struct-use-07-b-isvalid.html

    +

    ../html-svg/struct-use-08-b-isvalid.html

    +

    ../html-svg/struct-use-09-b-isvalid.html

    +

    ../html-svg/struct-use-10-f-isvalid.html

    +

    ../html-svg/struct-use-14-f-isvalid.html

    +

    ../html-svg/struct-use-15-f-isvalid.html

    +

    ../html-svg/styling-class-01-f-isvalid.html

    +

    ../html-svg/styling-css-01-b-isvalid.html

    +

    ../html-svg/styling-css-02-b-isvalid.html

    +

    ../html-svg/styling-css-03-b-isvalid.html

    +

    ../html-svg/styling-css-04-f-isvalid.html

    +

    ../html-svg/styling-css-05-b-isvalid.html

    +

    ../html-svg/styling-css-06-b-isvalid.html

    +

    ../html-svg/styling-css-07-f-isvalid.html

    +

    ../html-svg/styling-css-08-f-isvalid.html

    +

    ../html-svg/styling-css-09-f-isvalid.html

    +

    ../html-svg/styling-css-10-f-isvalid.html

    +

    ../html-svg/styling-elem-01-b-isvalid.html

    +

    ../html-svg/styling-inherit-01-b-isvalid.html

    +

    ../html-svg/styling-pres-01-t-isvalid.html

    +

    ../html-svg/styling-pres-03-f-isvalid.html

    +

    ../html-svg/styling-pres-04-f-isvalid.html

    +

    ../html-svg/styling-pres-05-f-isvalid.html

    +

    ../html-svg/text-align-01-b-isvalid.html

    +

    ../html-svg/text-align-02-b-isvalid.html

    +

    ../html-svg/text-align-03-b-isvalid.html

    +

    ../html-svg/text-align-04-b-isvalid.html

    +

    ../html-svg/text-align-05-b-isvalid.html

    +

    ../html-svg/text-align-06-b-isvalid.html

    +

    ../html-svg/text-align-07-t-isvalid.html

    +

    ../html-svg/text-align-08-b-isvalid.html

    +

    ../html-svg/text-altglyph-01-b-isvalid.html

    +

    ../html-svg/text-altglyph-02-b-isvalid.html

    +

    ../html-svg/text-altglyph-03-b-isvalid.html

    +

    ../html-svg/text-bidi-01-t-isvalid.html

    +

    ../html-svg/text-deco-01-b-isvalid.html

    +

    ../html-svg/text-dom-01-f-isvalid.html

    +

    ../html-svg/text-dom-04-f-isvalid.html

    +

    ../html-svg/text-fonts-01-t-isvalid.html

    +

    ../html-svg/text-fonts-02-t-isvalid.html

    +

    ../html-svg/text-fonts-04-t-isvalid.html

    +

    ../html-svg/text-fonts-202-t-isvalid.html

    +

    ../html-svg/text-fonts-203-t-isvalid.html

    +

    ../html-svg/text-fonts-204-t-isvalid.html

    +

    ../html-svg/text-intro-01-t-isvalid.html

    +

    ../html-svg/text-intro-02-b-isvalid.html

    +

    ../html-svg/text-intro-03-b-isvalid.html

    +

    ../html-svg/text-intro-04-t-isvalid.html

    +

    ../html-svg/text-intro-05-t-isvalid.html

    +

    ../html-svg/text-intro-06-t-isvalid.html

    +

    ../html-svg/text-intro-07-t-isvalid.html

    +

    ../html-svg/text-intro-09-b-isvalid.html

    +

    ../html-svg/text-intro-10-f-isvalid.html

    +

    ../html-svg/text-intro-11-t-isvalid.html

    +

    ../html-svg/text-intro-12-t-isvalid.html

    +

    ../html-svg/text-path-01-b-isvalid.html

    +

    ../html-svg/text-path-02-b-isvalid.html

    +

    ../html-svg/text-spacing-01-b-isvalid.html

    +

    ../html-svg/text-text-01-b-isvalid.html

    +

    ../html-svg/text-text-03-b-isvalid.html

    +

    ../html-svg/text-text-04-t-isvalid.html

    +

    ../html-svg/text-text-05-t-isvalid.html

    +

    ../html-svg/text-text-06-t-isvalid.html

    +

    ../html-svg/text-text-07-t-isvalid.html

    +

    ../html-svg/text-text-08-b-isvalid.html

    +

    ../html-svg/text-text-09-t-isvalid.html

    +

    ../html-svg/text-text-10-t-isvalid.html

    +

    ../html-svg/text-text-11-t-isvalid.html

    +

    ../html-svg/text-text-12-t-isvalid.html

    +

    ../html-svg/text-tref-01-b-isvalid.html

    +

    ../html-svg/text-tselect-01-b-isvalid.html

    +

    ../html-svg/text-tspan-01-b-isvalid.html

    +

    ../html-svg/text-tspan-02-b-isvalid.html

    +

    ../html-svg/types-basic-01-f-isvalid.html

    +

    ../html-svg/types-basic-02-f-isvalid.html

    +

    ../html-svg/types-dom-01-b-isvalid.html

    +

    ../html-svg/types-dom-06-f-isvalid.html

    +

    ../html-svg/types-dom-svgfittoviewbox-01-f-isvalid.html

    +

    ../html-svg/types-dom-svglengthlist-01-f-isvalid.html

    +

    ../html-svg/types-dom-svgnumberlist-01-f-isvalid.html

    +

    ../html-svg/types-dom-svgstringlist-01-f-isvalid.html

    +

    ../html-svg/types-dom-svgtransformable-01-f-isvalid.html

    + + diff --git a/conformance-checkers/tools/url.py b/conformance-checkers/tools/url.py index ce3eef7d868af3..f97d428abe9642 100644 --- a/conformance-checkers/tools/url.py +++ b/conformance-checkers/tools/url.py @@ -29,6 +29,7 @@ "host-newline": "http://example.\norg", "host-cr": "http://example.\rorg", "host-square-brackets-port-contains-colon": "http://[1::2]:3:4", + "port-999999": "http://f:999999/c", "port-single-letter": "http://f:b/c", "port-multiple-letters": "http://f:fifty-two/c", "port-leading-colon": "http://2001::1", diff --git a/content-security-policy/blink-contrib-2/stylehash-default-src.sub.html b/content-security-policy/blink-contrib-2/stylehash-default-src.sub.html index 683558e2958ad8..159338c6db0e1a 100644 --- a/content-security-policy/blink-contrib-2/stylehash-default-src.sub.html +++ b/content-security-policy/blink-contrib-2/stylehash-default-src.sub.html @@ -2,8 +2,8 @@ stylehash allowed from default-src - - + + diff --git a/content-security-policy/blink-contrib/connect-src-beacon-blocked.sub.html b/content-security-policy/blink-contrib/connect-src-beacon-blocked.sub.html index fdde9e760b2687..f68d3c384db51c 100644 --- a/content-security-policy/blink-contrib/connect-src-beacon-blocked.sub.html +++ b/content-security-policy/blink-contrib/connect-src-beacon-blocked.sub.html @@ -22,9 +22,9 @@ } else { try { var es = navigator.sendBeacon("http://www1.{{host}}:{{ports[http][0]}}/security/contentSecurityPolicy/echo-report.php"); - log("Fail"); + log("Pass"); } catch (e) { - log("Pass"); + log("Fail"); } var report = document.createElement("script"); report.src = "../support/checkReport.sub.js?reportExists=true&reportField=violated-directive&reportValue=connect-src%20'self'"; diff --git a/cors/resources/cors-makeheader.py b/cors/resources/cors-makeheader.py index 408e12d3f5be53..eab35eedfc9afb 100644 --- a/cors/resources/cors-makeheader.py +++ b/cors/resources/cors-makeheader.py @@ -28,7 +28,11 @@ def main(request, response): if 'methods' in request.GET: response.headers.set("Access-Control-Allow-Methods", request.GET.first('methods')) - code = request.GET.first('code', None) + code_raw = request.GET.first('code', None) + if code_raw: + code = int(code_raw) + else: + code = None if request.method == 'OPTIONS': #Override the response code if we're in a preflight and it's asked if 'preflight' in request.GET: @@ -61,4 +65,3 @@ def main(request, response): return (code, "StatusText"), [], body else: return body - diff --git a/custom-elements/custom-elements-registry/define.html b/custom-elements/custom-element-registry/define.html similarity index 83% rename from custom-elements/custom-elements-registry/define.html rename to custom-elements/custom-element-registry/define.html index 670c963001b0b5..fedb687416e8be 100644 --- a/custom-elements/custom-elements-registry/define.html +++ b/custom-elements/custom-element-registry/define.html @@ -110,7 +110,7 @@ }, `Element names: defining an element named ${name} should throw a SyntaxError`); }); - // 3. If this CustomElementsRegistry contains an entry with name name, + // 3. If this CustomElementRegistry contains an entry with name name, // then throw a NotSupportedError and abort these steps. test(() => { customElements.define('test-define-dup-name', class {}); @@ -119,7 +119,7 @@ }); }, 'If the name is already defined, should throw a NotSupportedError'); - // 4. If this CustomElementsRegistry contains an entry with constructor constructor, + // 5. If this CustomElementRegistry contains an entry with constructor constructor, // then throw a NotSupportedError and abort these steps. test(() => { class TestDupConstructor {}; @@ -129,7 +129,7 @@ }); }, 'If the constructor is already defined, should throw a NotSupportedError'); - // 7.1. If extends is a valid custom element name, + // 9.1. If extends is a valid custom element name, // then throw a NotSupportedError. validCustomElementNames.forEach(name => { test(() => { @@ -139,7 +139,7 @@ }, `If extends is ${name}, should throw a NotSupportedError`); }); - // 7.2. If the element interface for extends and the HTML namespace is HTMLUnknownElement + // 9.2. If the element interface for extends and the HTML namespace is HTMLUnknownElement // (e.g., if extends does not indicate an element definition in this specification), // then throw a NotSupportedError. [ @@ -159,19 +159,7 @@ }, `If extends is ${name}, should throw a NotSupportedError`); }); - // 8. Let observedAttributesIterable be Get(constructor, "observedAttributes"). - // Rethrow any exceptions. - test(() => { - class C { - static get observedAttributes() { throw_rethrown_error(); } - attributeChangedCallback() {} - } - assert_rethrown(() => { - customElements.define('test-define-observedattributes-rethrow', C); - }); - }, 'If constructor.observedAttributes throws, should rethrow'); - - // 10. Let prototype be Get(constructor, "prototype"). Rethrow any exceptions. + // 12.1. Let prototype be Get(constructor, "prototype"). Rethrow any exceptions. function assert_rethrown(func, description) { assert_throws({ name: 'rethrown' }, func, description); } @@ -190,7 +178,8 @@ customElements.define('test-define-constructor-prototype-rethrow', BadConstructor); }); }, 'If constructor.prototype throws, should rethrow'); - // 11. If Type(prototype) is not Object, + + // 12.2. If Type(prototype) is not Object, // then throw a TypeError exception. test(() => { const c = (function () { }).bind({}); // prototype is undefined. @@ -206,18 +195,18 @@ }); }, 'If Type(constructor.prototype) is string, should throw a TypeError'); - // 12. Let connectedCallback be Get(prototype, "connectedCallback"). Rethrow any exceptions. - // 13. If connectedCallback is not undefined, and IsCallable(connectedCallback) is false, - // then throw a TypeError exception. - // 14. Let disconnectedCallback be Get(prototype, "disconnectedCallback"). Rethrow any exceptions. - // 15. If disconnectedCallback is not undefined, and IsCallable(disconnectedCallback) is false, - // then throw a TypeError exception. - // 16. Let attributeChangedCallback be Get(prototype, "attributeChangedCallback"). Rethrow any exceptions. - // 17. If attributeChangedCallback is not undefined, and IsCallable(attributeChangedCallback) is false, - // then throw a TypeError exception. + // 12.3. Let lifecycleCallbacks be a map with the four keys "connectedCallback", + // "disconnectedCallback", "adoptedCallback", and "attributeChangedCallback", + // each of which belongs to an entry whose value is null. + // 12.4. For each of the four keys callbackName in lifecycleCallbacks: + // 12.4.1. Let callbackValue be Get(prototype, callbackName). Rethrow any exceptions. + // 12.4.2. If callbackValue is not undefined, then set the value of the entry in + // lifecycleCallbacks with key callbackName to the result of converting callbackValue + // to the Web IDL Function callback type. Rethrow any exceptions from the conversion. [ 'connectedCallback', 'disconnectedCallback', + 'adoptedCallback', 'attributeChangedCallback', ].forEach(name => { test(() => { diff --git a/docs/test-format-guidelines.md b/docs/test-format-guidelines.md index 430702ba769c9b..d3e75db1133875 100644 --- a/docs/test-format-guidelines.md +++ b/docs/test-format-guidelines.md @@ -193,19 +193,40 @@ with extension `.worker.js` that imports `testharness.js`. The test can then use all the usual APIs, and can be run from the path to the JavaScript file with the `.js` removed. -For example, one could write a test for the `Blob` constructor by -creating a `FileAPI/Blob-constructor.worker.js` as follows: +For example, one could write a test for the `FileReaderSync` API by +creating a `FileAPI/FileReaderSync.worker.js` as follows: importScripts("/resources/testharness.js"); + test(function () { + var blob = new Blob(["Hello"]); + var fr = new FileReaderSync(); + assert_equals(fr.readAsText(blob), "Hello"); + }, "FileReaderSync#readAsText."); + done(); + +This test could then be run from `FileAPI/FileReaderSync.worker`. + +### Multi-global tests + +Tests for features that exist in multiple global scopes can be written in a way +that they are automatically run in a window scope as well as a dedicated worker +scope. +In this case, the test is a JavaScript file with extension `.any.js`. +The test can then use all the usual APIs, and can be run from the path to the +JavaScript file with the `.js` replaced by `.worker` or `.html`. + +For example, one could write a test for the `Blob` constructor by +creating a `FileAPI/Blob-constructor.any.js` as follows: + test(function () { var blob = new Blob(); assert_equals(blob.size, 0); assert_equals(blob.type, ""); assert_false(blob.isClosed); }, "The Blob constructor."); - done(); -This test could then be run from `FileAPI/Blob-constructor.worker`. +This test could then be run from `FileAPI/Blob-constructor.any.worker` as well +as `FileAPI/Blob-constructor.any.html`. ### Tests Involving Multiple Origins diff --git a/dom/events/AddEventListenerOptions-once.html b/dom/events/AddEventListenerOptions-once.html new file mode 100644 index 00000000000000..ae750702c79d0e --- /dev/null +++ b/dom/events/AddEventListenerOptions-once.html @@ -0,0 +1,81 @@ + + +AddEventListenerOptions.once + + + + +
    + diff --git a/dom/events/Event-initEvent.html b/dom/events/Event-initEvent.html index 28f7faf349e79d..85abdff2fe7bdb 100644 --- a/dom/events/Event-initEvent.html +++ b/dom/events/Event-initEvent.html @@ -13,7 +13,7 @@ e.initEvent("type", bubbles, cancelable) // Step 3. - // Can't test the stop propagation flag and stop immediate propagation flag. + // Stop (immediate) propagation flag is tested later assert_equals(e.defaultPrevented, false, "defaultPrevented") // Step 4. assert_equals(e.isTrusted, false, "isTrusted") @@ -78,30 +78,27 @@ this.done() }, "Calling initEvent must not have an effect during dispatching.") -async_test(function() { +test(function() { var e = document.createEvent("Event") - e.initEvent("type", false, false) e.stopPropagation() - + e.initEvent("type", false, false) var target = document.createElement("div") - target.addEventListener("type", this.step_func(function() { - assert_unreached("") - }), false) - assert_equals(target.dispatchEvent(e), true, "dispatchEvent must return true") - assert_equals(target.dispatchEvent(e), true, "dispatchEvent must return true") + var called = false + target.addEventListener("type", function() { called = true }, false) + assert_true(target.dispatchEvent(e), "dispatchEvent must return true") + assert_true(called, "Listener must be called") +}, "Calling initEvent must unset the stop propagation flag.") +test(function() { + var e = document.createEvent("Event") + e.stopImmediatePropagation() e.initEvent("type", false, false) - var called = false var target = document.createElement("div") - target.addEventListener("type", this.step_func(function() { - called = true - }), false) - assert_false(called) - assert_equals(target.dispatchEvent(e), true, "dispatchEvent must return true") - assert_true(called) - - this.done() -}, "Calling initEvent must unset the stop propagation flag.") + var called = false + target.addEventListener("type", function() { called = true }, false) + assert_true(target.dispatchEvent(e), "dispatchEvent must return true") + assert_true(called, "Listener must be called") +}, "Calling initEvent must unset the stop immediate propagation flag.") async_test(function() { var e = document.createEvent("Event") diff --git a/dom/events/Event-propagation.html b/dom/events/Event-propagation.html index c57c7e9b255653..6fc9701012b89c 100644 --- a/dom/events/Event-propagation.html +++ b/dom/events/Event-propagation.html @@ -13,10 +13,11 @@ var callback = function() { called = true }; document.head.addEventListener("foo", callback); document.head.dispatchEvent(ev); - // Gecko resets the flags after dispatching; it will happily dispatch + assert_equals(called, expected, "Propagation flag"); + // dispatchEvent resets the propagation flags so it will happily dispatch // the event the second time around. document.head.dispatchEvent(ev); - assert_equals(called, expected, "Propagation flag"); + assert_equals(called, true, "Propagation flag after first dispatch"); document.head.removeEventListener("foo", callback); }, desc); } diff --git a/dom/events/EventTarget-dispatchEvent.html b/dom/events/EventTarget-dispatchEvent.html index 354441aa03e340..1a8bf3de915d5c 100644 --- a/dom/events/EventTarget-dispatchEvent.html +++ b/dom/events/EventTarget-dispatchEvent.html @@ -17,13 +17,13 @@ assert_throws(new TypeError(), function() { document.dispatchEvent(null) }) }, "Calling dispatchEvent(null).") -aliases.forEach(function(alias) { +for (var alias in aliases) { test(function() { - var e = document.createEvent(alias[0]) + var e = document.createEvent(alias) assert_equals(e.type, "", "Event type should be empty string before initialization") assert_throws("InvalidStateError", function() { document.dispatchEvent(e) }) - }, "If the event's initialized flag is not set, an InvalidStateError must be thrown (" + alias [0] + ").") -}) + }, "If the event's initialized flag is not set, an InvalidStateError must be thrown (" + alias + ").") +} var dispatch_dispatch = async_test("If the event's dispatch flag is set, an InvalidStateError must be thrown.") dispatch_dispatch.step(function() { diff --git a/dom/historical.html b/dom/historical.html index 58881affcccb77..cec309308649c6 100644 --- a/dom/historical.html +++ b/dom/historical.html @@ -10,7 +10,6 @@ }, "Historical DOM features must be removed: " + name) } var nukedInterfaces = [ - "CDATASection", "DOMConfiguration", "DOMError", "DOMErrorHandler", @@ -39,7 +38,6 @@ }, "Historical DOM features must be removed: " + name) } var documentNuked = [ - "createCDATASection", "createEntityReference", "xmlEncoding", "xmlStandalone", diff --git a/dom/interfaces.html b/dom/interfaces.html index 407bff8a1b5692..ae327b5e8897ae 100644 --- a/dom/interfaces.html +++ b/dom/interfaces.html @@ -159,7 +159,7 @@

    DOM IDL tests

    [Constructor(MutationCallback callback)] interface MutationObserver { - void observe(Node target, MutationObserverInit options); + void observe(Node target, optional MutationObserverInit options); void disconnect(); sequence takeRecords(); }; @@ -196,7 +196,7 @@

    DOM IDL tests

    const unsigned short ELEMENT_NODE = 1; const unsigned short ATTRIBUTE_NODE = 2; // historical const unsigned short TEXT_NODE = 3; - const unsigned short CDATA_SECTION_NODE = 4; // historical + const unsigned short CDATA_SECTION_NODE = 4; const unsigned short ENTITY_REFERENCE_NODE = 5; // historical const unsigned short ENTITY_NODE = 6; // historical const unsigned short PROCESSING_INSTRUCTION_NODE = 7; @@ -272,6 +272,7 @@

    DOM IDL tests

    [NewObject] Element createElementNS(DOMString? namespace, DOMString qualifiedName, optional ElementCreationOptions options); [NewObject] DocumentFragment createDocumentFragment(); [NewObject] Text createTextNode(DOMString data); + [NewObject] CDATASection createCDATASection(DOMString data); [NewObject] Comment createComment(DOMString data); [NewObject] ProcessingInstruction createProcessingInstruction(DOMString target, DOMString data); @@ -395,15 +396,12 @@

    DOM IDL tests

    [Exposed=Window] -interface Attr { +interface Attr : Node { readonly attribute DOMString? namespaceURI; readonly attribute DOMString? prefix; readonly attribute DOMString localName; readonly attribute DOMString name; - readonly attribute DOMString nodeName; // historical alias of .name attribute DOMString value; - [TreatNullAs=EmptyString] attribute DOMString nodeValue; // historical alias of .value - [TreatNullAs=EmptyString] attribute DOMString textContent; // historical alias of .value readonly attribute Element? ownerElement; @@ -429,6 +427,10 @@

    DOM IDL tests

    readonly attribute DOMString wholeText; }; +[Exposed=Window] +interface CDATASection : Text { +}; + [Exposed=Window] interface ProcessingInstruction : CharacterData { readonly attribute DOMString target; @@ -527,7 +529,7 @@

    DOM IDL tests

    const unsigned long SHOW_ELEMENT = 0x1; const unsigned long SHOW_ATTRIBUTE = 0x2; // historical const unsigned long SHOW_TEXT = 0x4; - const unsigned long SHOW_CDATA_SECTION = 0x8; // historical + const unsigned long SHOW_CDATA_SECTION = 0x8; const unsigned long SHOW_ENTITY_REFERENCE = 0x10; // historical const unsigned long SHOW_ENTITY = 0x20; // historical const unsigned long SHOW_PROCESSING_INSTRUCTION = 0x40; diff --git a/dom/lists/DOMTokenList-iteration.html b/dom/lists/DOMTokenList-iteration.html new file mode 100644 index 00000000000000..1911f7bb32a6f4 --- /dev/null +++ b/dom/lists/DOMTokenList-iteration.html @@ -0,0 +1,48 @@ + + +DOMTokenList iteration: keys, values, etc. + + + + diff --git a/dom/nodes/DOMImplementation-hasFeature.html b/dom/nodes/DOMImplementation-hasFeature.html index 2912051e73114d..637565a60f4e89 100644 --- a/dom/nodes/DOMImplementation-hasFeature.html +++ b/dom/nodes/DOMImplementation-hasFeature.html @@ -8,6 +8,12 @@ diff --git a/dom/nodes/Document-Element-getElementsByTagName.js b/dom/nodes/Document-Element-getElementsByTagName.js index 3d206062d3a2b6..edbac646d5ae84 100644 --- a/dom/nodes/Document-Element-getElementsByTagName.js +++ b/dom/nodes/Document-Element-getElementsByTagName.js @@ -162,17 +162,17 @@ function test_getElementsByTagName(context, element) { test(function() { var t = element.appendChild(document.createElementNS("http://www.w3.org/1999/xhtml", "test:aÇ")) this.add_cleanup(function() {element.removeChild(t)}) - assert_array_equals(context.getElementsByTagName("AÇ"), [t], "All uppercase input") - assert_array_equals(context.getElementsByTagName("aÇ"), [t], "Ascii lowercase input") - assert_array_equals(context.getElementsByTagName("aç"), [], "All lowercase input") + assert_array_equals(context.getElementsByTagName("TEST:AÇ"), [t], "All uppercase input") + assert_array_equals(context.getElementsByTagName("test:aÇ"), [t], "Ascii lowercase input") + assert_array_equals(context.getElementsByTagName("test:aç"), [], "All lowercase input") }, "Element in HTML namespace, prefix, non-ascii characters in name") test(function() { - var t = element.appendChild(document.createElementNS("test", "test:AÇ")) + var t = element.appendChild(document.createElementNS("test", "TEST:AÇ")) this.add_cleanup(function() {element.removeChild(t)}) - assert_array_equals(context.getElementsByTagName("AÇ"), [t], "All uppercase input") - assert_array_equals(context.getElementsByTagName("aÇ"), [], "Ascii lowercase input") - assert_array_equals(context.getElementsByTagName("aç"), [], "All lowercase input") + assert_array_equals(context.getElementsByTagName("TEST:AÇ"), [t], "All uppercase input") + assert_array_equals(context.getElementsByTagName("test:aÇ"), [], "Ascii lowercase input") + assert_array_equals(context.getElementsByTagName("test:aç"), [], "All lowercase input") }, "Element in non-HTML namespace, prefix, non-ascii characters in name") test(function() { diff --git a/dom/nodes/Document-getElementsByTagName-xhtml.xhtml b/dom/nodes/Document-getElementsByTagName-xhtml.xhtml index 2ae90748c2ffae..309a29ae772351 100644 --- a/dom/nodes/Document-getElementsByTagName-xhtml.xhtml +++ b/dom/nodes/Document-getElementsByTagName-xhtml.xhtml @@ -71,17 +71,17 @@ test(function() { test(function() { var t = document.body.appendChild(document.createElementNS("http://www.w3.org/1999/xhtml", "test:aÇ")) this.add_cleanup(function() {document.body.removeChild(t)}) - assert_array_equals(document.getElementsByTagName("AÇ"), [], "All uppercase input") - assert_array_equals(document.getElementsByTagName("aÇ"), [t], "Ascii lowercase input") - assert_array_equals(document.getElementsByTagName("aç"), [], "All lowercase input") + assert_array_equals(document.getElementsByTagName("TEST:AÇ"), [], "All uppercase input") + assert_array_equals(document.getElementsByTagName("test:aÇ"), [t], "Ascii lowercase input") + assert_array_equals(document.getElementsByTagName("test:aç"), [], "All lowercase input") }, "Element in HTML namespace, prefix, non-ascii characters in name") test(function() { - var t = document.body.appendChild(document.createElementNS("test", "test:AÇ")) + var t = document.body.appendChild(document.createElementNS("test", "TEST:AÇ")) this.add_cleanup(function() {document.body.removeChild(t)}) - assert_array_equals(document.getElementsByTagName("AÇ"), [t], "All uppercase input") - assert_array_equals(document.getElementsByTagName("aÇ"), [], "Ascii lowercase input") - assert_array_equals(document.getElementsByTagName("aç"), [], "All lowercase input") + assert_array_equals(document.getElementsByTagName("TEST:AÇ"), [t], "All uppercase input") + assert_array_equals(document.getElementsByTagName("test:aÇ"), [], "Ascii lowercase input") + assert_array_equals(document.getElementsByTagName("test:aç"), [], "All lowercase input") }, "Element in non-HTML namespace, prefix, non-ascii characters in name") test(function() { diff --git a/dom/nodes/Node-childNodes.html b/dom/nodes/Node-childNodes.html index d08dd2e1fa551a..8bd1f250e472c0 100644 --- a/dom/nodes/Node-childNodes.html +++ b/dom/nodes/Node-childNodes.html @@ -45,4 +45,53 @@ test(function() { check_parent_node(new Document()); }, "Node.childNodes on a Document."); + +test(function() { + var node = document.createElement("div"); + var kid1 = document.createElement("p"); + var kid2 = document.createTextNode("hey"); + var kid3 = document.createElement("span"); + node.appendChild(kid1); + node.appendChild(kid2); + node.appendChild(kid3); + + var list = node.childNodes; + assert_array_equals([...list], [kid1, kid2, kid3]); + + var keys = list.keys(); + assert_false(keys instanceof Array); + keys = [...keys]; + assert_array_equals(keys, [0, 1, 2]); + + var values = list.values(); + assert_false(values instanceof Array); + values = [...values]; + assert_array_equals(values, [kid1, kid2, kid3]); + + var entries = list.entries(); + assert_false(entries instanceof Array); + entries = [...entries]; + assert_equals(entries.length, keys.length); + assert_equals(entries.length, values.length); + for (var i = 0; i < entries.length; ++i) { + assert_array_equals(entries[i], [keys[i], values[i]]); + } + + var cur = 0; + var thisObj = {}; + list.forEach(function(value, key, listObj) { + assert_equals(listObj, list); + assert_equals(this, thisObj); + assert_equals(value, values[cur]); + assert_equals(key, keys[cur]); + cur++; + }, thisObj); + assert_equals(cur, entries.length); + + assert_equals(list[Symbol.iterator], Array.prototype[Symbol.iterator]); + assert_equals(list.keys, Array.prototype.keys); + assert_equals(list.values, Array.prototype.values); + assert_equals(list.entries, Array.prototype.entries); + assert_equals(list.forEach, Array.prototype.forEach); +}, "Iterator behavior of Node.childNodes"); diff --git a/dom/nodes/Node-properties.html b/dom/nodes/Node-properties.html index 83723ae1ed359b..10f92e7d7e857f 100644 --- a/dom/nodes/Node-properties.html +++ b/dom/nodes/Node-properties.html @@ -226,7 +226,7 @@ textContent: "do re mi fa so la ti", // Element - namespaceURI: "http://www.w3.org/1999/xhtml", + namespaceURI: null, prefix: null, localName: "igiveuponcreativenames", tagName: "igiveuponcreativenames", @@ -246,7 +246,7 @@ textContent: "", // Element - namespaceURI: "http://www.w3.org/1999/xhtml", + namespaceURI: null, prefix: null, localName: "everyone-hates-hyphenated-element-names", tagName: "everyone-hates-hyphenated-element-names", diff --git a/dom/nodes/attributes.html b/dom/nodes/attributes.html index 0f324ba42a192e..8d983350df9df4 100644 --- a/dom/nodes/attributes.html +++ b/dom/nodes/attributes.html @@ -20,23 +20,6 @@ var XML = "http://www.w3.org/XML/1998/namespace" var XMLNS = "http://www.w3.org/2000/xmlns/" -// AttrExodus -test(function() { - document.body.setAttribute("abc", "pass") - var attr = document.body.attributes[0] - assert_true(attr instanceof Attr, "should be an Attr") - assert_false(attr instanceof Node, "should not be a Node") - var removed_members = [ - "appendChild", - "insertBefore", - "childNodes", - ] - removed_members.forEach(function(m) { - assert_false(m in attr, m + " should not be supported") - }) - assert_equals(attr.value, "pass") -}, "AttrExodus") - // setAttribute exhaustive tests // Step 1 test(function() { diff --git a/dom/ranges/Range-mutations.html b/dom/ranges/Range-mutations.html index ade44bb989b003..ef99ca2ef04710 100644 --- a/dom/ranges/Range-mutations.html +++ b/dom/ranges/Range-mutations.html @@ -86,12 +86,14 @@ ]); tests.push([ descFn(params) + ", with selected " + describeRange(params[len - 4], params[len - 3], params[len - 2], params[len - 1]), - function(params) { return function() { - var evaledParams = params.map(eval); + function(params) { return function(selectedRange) { + var evaledParams = params.slice(0, len - 4).map(eval); for (var i = 0; i < evaledParams.length; i++) { assert_true(typeof evaledParams[i] != "undefined", "Test bug: " + params[i] + " is undefined"); } + // Override input range with the one that was actually selected when computing the expected result. + evaledParams = evaledParams.concat([selectedRange.startContainer, selectedRange.startOffset, selectedRange.endContainer, selectedRange.endOffset]); return testFn.apply(null, evaledParams); } }(params), true, @@ -133,26 +135,16 @@ getSelection().removeAllRanges(); getSelection().addRange(range); - assert_equals(getSelection().rangeCount, 1, - "Sanity check: selection must have exactly one range after adding the range"); - assert_equals(getSelection().getRangeAt(0), range, - "Sanity check: selection's range must initially be the same as the range we added"); - assert_equals(range.startContainer, startContainer, - "Sanity check: range's startContainer must initially be the one we set"); - assert_equals(range.endContainer, endContainer, - "Sanity check: range's endContainer must initially be the one we set"); - assert_equals(range.startOffset, startOffset, - "Sanity check: range's startOffset must initially be the one we set"); - assert_equals(range.endOffset, endOffset, - "Sanity check: range's endOffset must initially be the one we set"); + // Some browsers refuse to add a range unless it results in an actual visible selection. + if (!getSelection().rangeCount) + return; + + // Override range with the one that was actually selected as it differs in some browsers. + range = getSelection().getRangeAt(0); } - var expected = callback(); + var expected = callback(range); - if (useSelection) { - assert_equals(getSelection().getRangeAt(0), range, - "The range we added must not be removed from the selection"); - } assert_equals(range.startContainer, expected[0], "Wrong start container"); assert_equals(range.startOffset, expected[1], diff --git a/dom/traversal/TreeWalker-acceptNode-filter.html b/dom/traversal/TreeWalker-acceptNode-filter.html index fc53b22c3a19c6..1446f40f68dd25 100644 --- a/dom/traversal/TreeWalker-acceptNode-filter.html +++ b/dom/traversal/TreeWalker-acceptNode-filter.html @@ -1,7 +1,7 @@ TreeWalker: acceptNode-filter diff --git a/dom/traversal/TreeWalker-basic.html b/dom/traversal/TreeWalker-basic.html index 21ab6d62f53a96..d1147637b139cd 100644 --- a/dom/traversal/TreeWalker-basic.html +++ b/dom/traversal/TreeWalker-basic.html @@ -1,7 +1,7 @@ TreeWalker: Basic test diff --git a/dom/traversal/TreeWalker-currentNode.html b/dom/traversal/TreeWalker-currentNode.html index c512051aef5454..8a09940b1e79a3 100644 --- a/dom/traversal/TreeWalker-currentNode.html +++ b/dom/traversal/TreeWalker-currentNode.html @@ -1,7 +1,7 @@ TreeWalker: currentNode diff --git a/dom/traversal/TreeWalker-previousNodeLastChildReject.html b/dom/traversal/TreeWalker-previousNodeLastChildReject.html index 513476f3d13301..236ab803c59365 100644 --- a/dom/traversal/TreeWalker-previousNodeLastChildReject.html +++ b/dom/traversal/TreeWalker-previousNodeLastChildReject.html @@ -1,7 +1,7 @@ TreeWalker: previousNodeLastChildReject diff --git a/dom/traversal/TreeWalker-previousSiblingLastChildSkip.html b/dom/traversal/TreeWalker-previousSiblingLastChildSkip.html index d582bf16d6e5c1..17da4d56971b15 100644 --- a/dom/traversal/TreeWalker-previousSiblingLastChildSkip.html +++ b/dom/traversal/TreeWalker-previousSiblingLastChildSkip.html @@ -1,7 +1,7 @@ TreeWalker: previousSiblingLastChildSkip diff --git a/dom/traversal/TreeWalker-traversal-reject.html b/dom/traversal/TreeWalker-traversal-reject.html index f5b2e8ea8332b7..273b33236f95dd 100644 --- a/dom/traversal/TreeWalker-traversal-reject.html +++ b/dom/traversal/TreeWalker-traversal-reject.html @@ -1,7 +1,7 @@ TreeWalker: traversal-reject diff --git a/dom/traversal/TreeWalker-traversal-skip-most.html b/dom/traversal/TreeWalker-traversal-skip-most.html index a0c16fd08df92e..567ef665569e54 100644 --- a/dom/traversal/TreeWalker-traversal-skip-most.html +++ b/dom/traversal/TreeWalker-traversal-skip-most.html @@ -1,7 +1,7 @@ TreeWalker: traversal-skip-most diff --git a/dom/traversal/TreeWalker-traversal-skip.html b/dom/traversal/TreeWalker-traversal-skip.html index 4032bde13b2490..0e3b81a274f041 100644 --- a/dom/traversal/TreeWalker-traversal-skip.html +++ b/dom/traversal/TreeWalker-traversal-skip.html @@ -1,7 +1,7 @@ TreeWalker: traversal-skip diff --git a/domparsing/DOMParser-parseFromString-xml-doctype.html b/domparsing/DOMParser-parseFromString-xml-doctype.html new file mode 100644 index 00000000000000..cd655acf930e7b --- /dev/null +++ b/domparsing/DOMParser-parseFromString-xml-doctype.html @@ -0,0 +1,27 @@ + + +HTML entities for various XHTML Doctype variants + + + +
    + diff --git a/domparsing/innerhtml-02.html b/domparsing/innerhtml-02.html new file mode 100644 index 00000000000000..e80c886b6c6551 --- /dev/null +++ b/domparsing/innerhtml-02.html @@ -0,0 +1,126 @@ + +innerHTML in HTML + + + + +
    + \ No newline at end of file diff --git a/domparsing/insert_adjacent_html.xhtml b/domparsing/insert_adjacent_html-xhtml.xhtml similarity index 100% rename from domparsing/insert_adjacent_html.xhtml rename to domparsing/insert_adjacent_html-xhtml.xhtml diff --git a/domparsing/style_attribute_html.html b/domparsing/style_attribute_html.html new file mode 100644 index 00000000000000..f7f057d2d86249 --- /dev/null +++ b/domparsing/style_attribute_html.html @@ -0,0 +1,52 @@ + + +Style attribute in HTML + + + diff --git a/editing/README b/editing/README index 3d95bec1485578..945ce83a00b407 100644 --- a/editing/README +++ b/editing/README @@ -1,9 +1,14 @@ -This suite tests conformance to the editing spec written long ago by Aryeh -Gregor. Nobody actually implements the spec, but the tests are still useful -for regression testing. The files in data/ were generated from a JavaScript -implementation of the specification using a complex procedure that can't -actually be replicated right now as-is. Editing them manually is possible, but -they're not really meant to be human-readable. If anyone is interested, it -would be possible for Aryeh to get the test generation procedure working again. -Or you could look into the repository history and figure out how to do it -yourself, if you're brave. +Most of this directory tests conformance to the editing spec written long ago +by Aryeh Gregor. Nobody actually implements the spec, but the tests are still +useful for regression testing. The files in data/ were generated from a +JavaScript implementation of the specification using a complex procedure that +can't actually be replicated right now as-is. Editing them manually is +possible, but they're not really meant to be human-readable. If anyone is +interested, it would be possible for Aryeh to get the test generation procedure +working again. Or you could look into the repository history and figure out +how to do it yourself, if you're brave. + +There is also a directory other/ that contains additional editor-related tests. +They aren't necessarily based on any specification, but try to specify sensible +behavior, and are meant to be helpful with regression testing for existing +implementations and finding bugs in new implementations. diff --git a/editing/data/delete.js b/editing/data/delete.js index 0ee5805d49f583..bfea92831421f2 100644 --- a/editing/data/delete.js +++ b/editing/data/delete.js @@ -73,7 +73,7 @@ var browserTests = [ [["defaultparagraphseparator","div"],["delete",""]], "

    foo{}bar

    ", [true,true], - {"defaultparagraphseparator":[false,false,"p",false,false,"div"],"delete":[false,false,"",false,false,""]}], + {"defaultparagraphseparator":[false,false,"div",false,false,"div"],"delete":[false,false,"",false,false,""]}], ["

    foo

    []bar

    ", [["defaultparagraphseparator","p"],["delete",""]], "

    foo{}bar

    ", diff --git a/editing/data/formatblock.js b/editing/data/formatblock.js index c478dba243b83c..39c20e2680afd0 100644 --- a/editing/data/formatblock.js +++ b/editing/data/formatblock.js @@ -3,7 +3,7 @@ var browserTests = [ [["defaultparagraphseparator","div"],["formatblock","
    "]], "
    foo[]bar

    extra

    ", [true,true], - {"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"",false,false,"div"]}], + {"defaultparagraphseparator":[false,false,"div",false,false,"div"],"formatblock":[false,false,"",false,false,"div"]}], ["foo[]bar

    extra", [["defaultparagraphseparator","p"],["formatblock","

    "]], "
    foo[]bar

    extra

    ", diff --git a/editing/data/forwarddelete.js b/editing/data/forwarddelete.js index abfc488aeee352..66cf6cf337803f 100644 --- a/editing/data/forwarddelete.js +++ b/editing/data/forwarddelete.js @@ -88,7 +88,7 @@ var browserTests = [ [["defaultparagraphseparator","div"],["forwarddelete",""]], "

    foo{}bar

    ", [true,true], - {"defaultparagraphseparator":[false,false,"p",false,false,"div"],"forwarddelete":[false,false,"",false,false,""]}], + {"defaultparagraphseparator":[false,false,"div",false,false,"div"],"forwarddelete":[false,false,"",false,false,""]}], ["

    foo[]

    bar

    ", [["defaultparagraphseparator","p"],["forwarddelete",""]], "

    foo{}bar

    ", diff --git a/editing/data/inserthorizontalrule.js b/editing/data/inserthorizontalrule.js index f79ae5058a3916..6f0cdba33c17f5 100644 --- a/editing/data/inserthorizontalrule.js +++ b/editing/data/inserthorizontalrule.js @@ -103,7 +103,7 @@ var browserTests = [ [["defaultparagraphseparator","div"],["inserthorizontalrule",""]], "

    foo


    {}

    baz

    ", [true,true], - {"defaultparagraphseparator":[false,false,"p",false,false,"div"],"inserthorizontalrule":[false,false,"",false,false,""]}], + {"defaultparagraphseparator":[false,false,"div",false,false,"div"],"inserthorizontalrule":[false,false,"",false,false,""]}], ["

    foo

    [bar]

    baz", [["defaultparagraphseparator","p"],["inserthorizontalrule",""]], "

    foo


    {}

    baz

    ", diff --git a/editing/data/inserthtml.js b/editing/data/inserthtml.js index f790fc2e85793f..78581bf533d799 100644 --- a/editing/data/inserthtml.js +++ b/editing/data/inserthtml.js @@ -138,7 +138,7 @@ var browserTests = [ [["defaultparagraphseparator","div"],["inserthtml","

    abc"]], "

    foo

    abc

    {}

    baz

    ", [true,true], - {"defaultparagraphseparator":[false,false,"p",false,false,"div"],"inserthtml":[false,false,"",false,false,""]}], + {"defaultparagraphseparator":[false,false,"div",false,false,"div"],"inserthtml":[false,false,"",false,false,""]}], ["

    foo[bar]baz", [["defaultparagraphseparator","p"],["inserthtml","

    abc"]], "

    foo

    abc

    {}

    baz

    ", diff --git a/editing/data/insertimage.js b/editing/data/insertimage.js index 4478cd12a27828..d1874e6521216f 100644 --- a/editing/data/insertimage.js +++ b/editing/data/insertimage.js @@ -128,7 +128,7 @@ var browserTests = [ [["defaultparagraphseparator","div"],["insertimage","/img/lion.svg"]], "

    foo

    {}

    baz

    ", [true,true], - {"defaultparagraphseparator":[false,false,"p",false,false,"div"],"insertimage":[false,false,"",false,false,""]}], + {"defaultparagraphseparator":[false,false,"div",false,false,"div"],"insertimage":[false,false,"",false,false,""]}], ["

    foo

    {

    bar

    }

    baz

    ", [["defaultparagraphseparator","p"],["insertimage","/img/lion.svg"]], "

    foo

    {}

    baz

    ", diff --git a/editing/data/insertlinebreak.js b/editing/data/insertlinebreak.js index 635ddd14dc45d2..2793cbb1c5f6c9 100644 --- a/editing/data/insertlinebreak.js +++ b/editing/data/insertlinebreak.js @@ -333,7 +333,7 @@ var browserTests = [ [["defaultparagraphseparator","div"],["insertlinebreak",""]], "

    foo
    {}quz

    ", [true,true], - {"defaultparagraphseparator":[false,false,"p",false,false,"div"],"insertlinebreak":[false,false,"",false,false,""]}], + {"defaultparagraphseparator":[false,false,"div",false,false,"div"],"insertlinebreak":[false,false,"",false,false,""]}], ["

    foo[bar

    baz]quz

    ", [["defaultparagraphseparator","p"],["insertlinebreak",""]], "

    foo
    {}quz

    ", diff --git a/editing/data/insertorderedlist.js b/editing/data/insertorderedlist.js index cf9d148771b0d7..76bda2d4babdfb 100644 --- a/editing/data/insertorderedlist.js +++ b/editing/data/insertorderedlist.js @@ -73,7 +73,7 @@ var browserTests = [ [["defaultparagraphseparator","div"],["insertorderedlist",""]], "

    foo

    1. [bar]

    baz

    ", [true,true], - {"defaultparagraphseparator":[false,false,"p",false,false,"div"],"insertorderedlist":[false,false,"",false,true,""]}], + {"defaultparagraphseparator":[false,false,"div",false,false,"div"],"insertorderedlist":[false,false,"",false,true,""]}], ["

    foo

    [bar]

    baz", [["defaultparagraphseparator","p"],["insertorderedlist",""]], "

    foo

    1. [bar]

    baz

    ", diff --git a/editing/data/insertparagraph.js b/editing/data/insertparagraph.js index fb55da65dc2e6e..a9a3be4e70335d 100644 --- a/editing/data/insertparagraph.js +++ b/editing/data/insertparagraph.js @@ -3,7 +3,7 @@ var browserTests = [ [["defaultparagraphseparator","div"],["insertparagraph",""]], "
    foo
    {}baz
    ", [true,true], - {"defaultparagraphseparator":[false,false,"p",false,false,"div"],"insertparagraph":[false,false,"",false,false,""]}], + {"defaultparagraphseparator":[false,false,"div",false,false,"div"],"insertparagraph":[false,false,"",false,false,""]}], ["foo[bar]baz", [["defaultparagraphseparator","p"],["insertparagraph",""]], "

    foo

    {}baz

    ", diff --git a/editing/data/inserttext.js b/editing/data/inserttext.js index 02f1c7966a89d7..8d4e31c17a2b4e 100644 --- a/editing/data/inserttext.js +++ b/editing/data/inserttext.js @@ -23,7 +23,7 @@ var browserTests = [ [["defaultparagraphseparator","div"],["inserttext","\n"]], "
    foo
    {}bar
    ", [true,true], - {"defaultparagraphseparator":[false,false,"p",false,false,"div"],"inserttext":[false,false,"",false,false,""]}], + {"defaultparagraphseparator":[false,false,"div",false,false,"div"],"inserttext":[false,false,"",false,false,""]}], ["foo[]bar", [["defaultparagraphseparator","p"],["inserttext","\n"]], "

    foo

    {}bar

    ", diff --git a/editing/data/insertunorderedlist.js b/editing/data/insertunorderedlist.js index 763ac62b505377..ad4a7236faed1e 100644 --- a/editing/data/insertunorderedlist.js +++ b/editing/data/insertunorderedlist.js @@ -73,7 +73,7 @@ var browserTests = [ [["defaultparagraphseparator","div"],["insertunorderedlist",""]], "

    foo

    • [bar]

    baz

    ", [true,true], - {"defaultparagraphseparator":[false,false,"p",false,false,"div"],"insertunorderedlist":[false,false,"",false,true,""]}], + {"defaultparagraphseparator":[false,false,"div",false,false,"div"],"insertunorderedlist":[false,false,"",false,true,""]}], ["

    foo

    [bar]

    baz", [["defaultparagraphseparator","p"],["insertunorderedlist",""]], "

    foo

    • [bar]

    baz

    ", diff --git a/editing/data/justifycenter.js b/editing/data/justifycenter.js index 82049f1bb1632c..76491ee44c52db 100644 --- a/editing/data/justifycenter.js +++ b/editing/data/justifycenter.js @@ -3,7 +3,7 @@ var browserTests = [ [["stylewithcss","true"],["defaultparagraphseparator","div"],["justifycenter",""]], "
    foo[]bar

    extra

    ", [true,true,true], - {"stylewithcss":[false,false,"",false,true,""],"defaultparagraphseparator":[false,false,"p",false,false,"div"],"justifycenter":[false,false,"left",false,true,"center"]}], + {"stylewithcss":[false,false,"",false,true,""],"defaultparagraphseparator":[false,false,"div",false,false,"div"],"justifycenter":[false,false,"left",false,true,"center"]}], ["foo[]bar

    extra", [["stylewithcss","false"],["defaultparagraphseparator","div"],["justifycenter",""]], "

    foo[]bar

    extra

    ", diff --git a/editing/data/justifyfull.js b/editing/data/justifyfull.js index d52cbae570ea20..c8beca840cfa1b 100644 --- a/editing/data/justifyfull.js +++ b/editing/data/justifyfull.js @@ -3,7 +3,7 @@ var browserTests = [ [["stylewithcss","true"],["defaultparagraphseparator","div"],["justifyfull",""]], "
    foo[]bar

    extra

    ", [true,true,true], - {"stylewithcss":[false,false,"",false,true,""],"defaultparagraphseparator":[false,false,"p",false,false,"div"],"justifyfull":[false,false,"left",false,true,"justify"]}], + {"stylewithcss":[false,false,"",false,true,""],"defaultparagraphseparator":[false,false,"div",false,false,"div"],"justifyfull":[false,false,"left",false,true,"justify"]}], ["foo[]bar

    extra", [["stylewithcss","false"],["defaultparagraphseparator","div"],["justifyfull",""]], "

    foo[]bar

    extra

    ", diff --git a/editing/data/justifyleft.js b/editing/data/justifyleft.js index 74a2bb09629607..c08033744beb66 100644 --- a/editing/data/justifyleft.js +++ b/editing/data/justifyleft.js @@ -53,7 +53,7 @@ var browserTests = [ [["stylewithcss","true"],["defaultparagraphseparator","div"],["justifyleft",""]], "

    [foo]

    bar

    extra

    ", [true,true,true], - {"stylewithcss":[false,false,"",false,true,""],"defaultparagraphseparator":[false,false,"p",false,false,"div"],"justifyleft":[false,false,"center",false,true,"left"]}], + {"stylewithcss":[false,false,"",false,true,""],"defaultparagraphseparator":[false,false,"div",false,false,"div"],"justifyleft":[false,false,"center",false,true,"left"]}], ["

    [foo]

    bar

    extra", [["stylewithcss","false"],["defaultparagraphseparator","div"],["justifyleft",""]], "

    [foo]

    bar

    extra

    ", diff --git a/editing/data/justifyright.js b/editing/data/justifyright.js index fdb8f4a1d005b8..595f7376eee105 100644 --- a/editing/data/justifyright.js +++ b/editing/data/justifyright.js @@ -3,7 +3,7 @@ var browserTests = [ [["stylewithcss","true"],["defaultparagraphseparator","div"],["justifyright",""]], "
    foo[]bar

    extra

    ", [true,true,true], - {"stylewithcss":[false,false,"",false,true,""],"defaultparagraphseparator":[false,false,"p",false,false,"div"],"justifyright":[false,false,"left",false,true,"right"]}], + {"stylewithcss":[false,false,"",false,true,""],"defaultparagraphseparator":[false,false,"div",false,false,"div"],"justifyright":[false,false,"left",false,true,"right"]}], ["foo[]bar

    extra", [["stylewithcss","false"],["defaultparagraphseparator","div"],["justifyright",""]], "

    foo[]bar

    extra

    ", diff --git a/editing/data/misc.js b/editing/data/misc.js index aab6d5f0aa84ab..490b595377ab9c 100644 --- a/editing/data/misc.js +++ b/editing/data/misc.js @@ -3,7 +3,7 @@ var browserTests = [ [["defaultparagraphseparator",""]], "foo[bar]baz", [false], - {"defaultparagraphseparator":[false,false,"p",false,false,"div"]}], + {"defaultparagraphseparator":[false,false,"div",false,false,"div"]}], ["foo[bar]baz", [["defaultparagraphseparator","div"]], "foo[bar]baz", diff --git a/editing/data/outdent.js b/editing/data/outdent.js index 548a150c93751a..18d48d0cb988b1 100644 --- a/editing/data/outdent.js +++ b/editing/data/outdent.js @@ -83,7 +83,7 @@ var browserTests = [ [["stylewithcss","true"],["defaultparagraphseparator","div"],["outdent",""]], "

    foo[bar]

    baz

    extra

    ", [true,true,true], - {"stylewithcss":[false,false,"",false,true,""],"defaultparagraphseparator":[false,false,"p",false,false,"div"],"outdent":[false,false,"",false,false,""]}], + {"stylewithcss":[false,false,"",false,true,""],"defaultparagraphseparator":[false,false,"div",false,false,"div"],"outdent":[false,false,"",false,false,""]}], ["

    foo[bar]

    baz

    extra", [["stylewithcss","false"],["defaultparagraphseparator","div"],["outdent",""]], "

    foo[bar]

    baz

    extra

    ", diff --git a/editing/include/implementation.js b/editing/include/implementation.js index b64e930600545f..44a7afd82d25fd 100644 --- a/editing/include/implementation.js +++ b/editing/include/implementation.js @@ -4,7 +4,7 @@ var htmlNamespace = "http://www.w3.org/1999/xhtml"; var cssStylingFlag = false; -var defaultSingleLineContainerName = "p"; +var defaultSingleLineContainerName = "div"; // This is bad :( var globalRange = null; diff --git a/editing/include/tests.js b/editing/include/tests.js index a2a96d979f0c0f..740cbce6854077 100644 --- a/editing/include/tests.js +++ b/editing/include/tests.js @@ -4639,7 +4639,7 @@ var defaultValues = { inserthtml: "abcd", insertimage: "/img/lion.svg", inserttext: "a", - defaultparagraphseparator: "p", + defaultparagraphseparator: "div", stylewithcss: "true", usecss: "true", }; diff --git a/editing/other/delete.html b/editing/other/delete.html new file mode 100644 index 00000000000000..b9bd1437e3721f --- /dev/null +++ b/editing/other/delete.html @@ -0,0 +1,149 @@ + + +Deletion tests + + +
    + diff --git a/encrypted-media/EncryptedMediaExtensions.idl b/encrypted-media/EncryptedMediaExtensions.idl new file mode 100644 index 00000000000000..107dffeba866ec --- /dev/null +++ b/encrypted-media/EncryptedMediaExtensions.idl @@ -0,0 +1,118 @@ +// Encrypted Media Extensions WebIDL +// +// NOTE: Please update the link below to the specification version from +// which this IDL was extracted. +// +// https://www.w3.org/TR/2016/WD-encrypted-media-20160610/ +// + +partial interface Navigator { + Promise requestMediaKeySystemAccess (DOMString keySystem, sequence supportedConfigurations); +}; + +enum MediaKeysRequirement { + "required", + "optional", + "not-allowed" +}; + +dictionary MediaKeySystemConfiguration { + DOMString label = ""; + sequence initDataTypes = []; + sequence audioCapabilities = []; + sequence videoCapabilities = []; + MediaKeysRequirement distinctiveIdentifier = "optional"; + MediaKeysRequirement persistentState = "optional"; + sequence sessionTypes; +}; + +dictionary MediaKeySystemMediaCapability { + DOMString contentType = ""; + DOMString robustness = ""; +}; + +interface MediaKeySystemAccess { + readonly attribute DOMString keySystem; + MediaKeySystemConfiguration getConfiguration (); + Promise createMediaKeys (); +}; + +enum MediaKeySessionType { + "temporary", + "persistent-usage-record", + "persistent-license" +}; + +interface MediaKeys { + MediaKeySession createSession (optional MediaKeySessionType sessionType = "temporary"); + Promise setServerCertificate (BufferSource serverCertificate); +}; + +interface MediaKeySession : EventTarget { + readonly attribute DOMString sessionId; + readonly attribute unrestricted double expiration; + readonly attribute Promise closed; + readonly attribute MediaKeyStatusMap keyStatuses; + attribute EventHandler onkeystatuseschange; + attribute EventHandler onmessage; + Promise generateRequest (DOMString initDataType, BufferSource initData); + Promise load (DOMString sessionId); + Promise update (BufferSource response); + Promise close (); + Promise remove (); +}; + +interface MediaKeyStatusMap { + iterable; + readonly attribute unsigned long size; + boolean has (BufferSource keyId); + any get (BufferSource keyId); +}; + +enum MediaKeyStatus { + "usable", + "expired", + "released", + "output-restricted", + "output-downscaled", + "status-pending", + "internal-error" +}; + +enum MediaKeyMessageType { + "license-request", + "license-renewal", + "license-release", + "individualization-request" +}; + +[ Constructor (DOMString type, optional MediaKeyMessageEventInit eventInitDict)] +interface MediaKeyMessageEvent : Event { + readonly attribute MediaKeyMessageType messageType; + readonly attribute ArrayBuffer message; +}; + +dictionary MediaKeyMessageEventInit : EventInit { + MediaKeyMessageType messageType = "license-request"; + ArrayBuffer message; +}; + +// partial interface HTMLMediaElement : EventTarget { +partial interface HTMLMediaElement { + readonly attribute MediaKeys? mediaKeys; + attribute EventHandler onencrypted; + attribute EventHandler onwaitingforkey; + Promise setMediaKeys (MediaKeys? mediaKeys); +}; + +[ Constructor (DOMString type, optional MediaEncryptedEventInit eventInitDict)] +interface MediaEncryptedEvent : Event { + readonly attribute DOMString initDataType; + readonly attribute ArrayBuffer? initData; +}; + +dictionary MediaEncryptedEventInit : EventInit { + DOMString initDataType = ""; + ArrayBuffer? initData = null; +}; + diff --git a/encrypted-media/Google/encrypted-media-async-creation-with-gc.html b/encrypted-media/Google/chromium_specific_disabled/encrypted-media-async-creation-with-gc.html similarity index 77% rename from encrypted-media/Google/encrypted-media-async-creation-with-gc.html rename to encrypted-media/Google/chromium_specific_disabled/encrypted-media-async-creation-with-gc.html index e171b0dcad70d0..4dd705f9f4cc6e 100644 --- a/encrypted-media/Google/encrypted-media-async-creation-with-gc.html +++ b/encrypted-media/Google/chromium_specific_disabled/encrypted-media-async-creation-with-gc.html @@ -4,8 +4,11 @@ Test asynchronous creation of MediaKeys and MediaKeySession while running garbage collection - - +
    @@ -18,11 +21,9 @@ var initDataType; var initData; var mediaKeySession; - getSupportedInitDataType().then(function(type) { - initDataType = type; + navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) { + initDataType = access.getConfiguration().initDataTypes[0]; initData = getInitData(initDataType); - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]); - }).then(function(access) { return access.createMediaKeys(); }).then(function(mediaKeys) { mediaKeySession = mediaKeys.createSession(); diff --git a/encrypted-media/Google/encrypted-media-async-setcert-with-gc.html b/encrypted-media/Google/chromium_specific_disabled/encrypted-media-async-setcert-with-gc.html similarity index 79% rename from encrypted-media/Google/encrypted-media-async-setcert-with-gc.html rename to encrypted-media/Google/chromium_specific_disabled/encrypted-media-async-setcert-with-gc.html index 7a963807b65a6f..4da562894d6cf4 100644 --- a/encrypted-media/Google/encrypted-media-async-setcert-with-gc.html +++ b/encrypted-media/Google/chromium_specific_disabled/encrypted-media-async-setcert-with-gc.html @@ -4,8 +4,11 @@ Test asynchronous setServerCertificate while running garbage collection - - +
    @@ -15,7 +18,7 @@ promise_test(function(test) { - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) { + return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) { return access.createMediaKeys(); }).then(function(mediaKeys) { var cert = new Uint8Array(200); diff --git a/encrypted-media/Google/encrypted-media-lifetime-mediakeys-with-session.html b/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeys-with-session.html similarity index 91% rename from encrypted-media/Google/encrypted-media-lifetime-mediakeys-with-session.html rename to encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeys-with-session.html index 95395bf7adf749..a892b969c49b5d 100644 --- a/encrypted-media/Google/encrypted-media-lifetime-mediakeys-with-session.html +++ b/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeys-with-session.html @@ -4,8 +4,11 @@ Test MediaKeys lifetime when adding a session - - +
    @@ -32,12 +35,9 @@ } // Create a MediaKeys object with a session. - getSupportedInitDataType().then(function(type) { - initDataType = type; + navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) { + initDataType = access.getConfiguration().initDataTypes[0]; initData = getInitData(initDataType); - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]); - }).then(function(access) { - assert_equals(access.keySystem, 'org.w3.clearkey'); return access.createMediaKeys(); }).then(function(result) { mediaKeys = result; diff --git a/encrypted-media/Google/encrypted-media-lifetime-mediakeys.html b/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeys.html similarity index 87% rename from encrypted-media/Google/encrypted-media-lifetime-mediakeys.html rename to encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeys.html index 0274c46a40bd64..b8e79ac8bbb7e9 100644 --- a/encrypted-media/Google/encrypted-media-lifetime-mediakeys.html +++ b/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeys.html @@ -4,8 +4,11 @@ Test MediaKeys lifetime - - +
    @@ -13,7 +16,7 @@ async_test(function(test) { // Create a MediaKeys object and free immediately. - navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) { + navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) { return access.createMediaKeys(); }).then(function(result) { // Do nothing with the created object @@ -31,7 +34,7 @@ async_test(function(test) { var mediaKeys; - navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) { + navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) { return access.createMediaKeys(); }).then(function(result) { mediaKeys = result; diff --git a/encrypted-media/Google/encrypted-media-lifetime-mediakeysession-reference.html b/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-reference.html similarity index 94% rename from encrypted-media/Google/encrypted-media-lifetime-mediakeysession-reference.html rename to encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-reference.html index 41bbcc54ac8fdf..4b8ad1b46dd818 100644 --- a/encrypted-media/Google/encrypted-media-lifetime-mediakeysession-reference.html +++ b/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-reference.html @@ -4,8 +4,11 @@ Test MediaKeySession lifetime without release() - - +
    @@ -32,12 +35,9 @@ return window.internals.activeDOMObjectCount(document) - startingActiveDOMObjectCount; } - getSupportedInitDataType().then(function(type) { - initDataType = type; + navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) { + initDataType = access.getConfiguration().initDataTypes[0]; initData = getInitData(initDataType); - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]); - }).then(function(access) { - assert_equals(access.keySystem, 'org.w3.clearkey'); return access.createMediaKeys(); }).then(function(result) { mediaKeys = result; diff --git a/encrypted-media/Google/encrypted-media-lifetime-mediakeysession-release-noreference.html b/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-release-noreference.html similarity index 94% rename from encrypted-media/Google/encrypted-media-lifetime-mediakeysession-release-noreference.html rename to encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-release-noreference.html index f3241422c144c7..a962844a39afce 100644 --- a/encrypted-media/Google/encrypted-media-lifetime-mediakeysession-release-noreference.html +++ b/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-release-noreference.html @@ -4,8 +4,11 @@ Test MediaKeySession lifetime after release() without references - - +
    @@ -31,11 +34,10 @@ var mediaKeys; var mediaKeySession1; var mediaKeySession2; - getSupportedInitDataType().then(function(type) { - initDataType = type; + + navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) { + initDataType = access.getConfiguration().initDataTypes[0]; initData = getInitData(initDataType); - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]); - }).then(function(access) { return access.createMediaKeys(); }).then(function(result) { mediaKeys = result; diff --git a/encrypted-media/Google/encrypted-media-lifetime-mediakeysession-release.html b/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-release.html similarity index 93% rename from encrypted-media/Google/encrypted-media-lifetime-mediakeysession-release.html rename to encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-release.html index 24d0e88f01582c..6265267615ee5e 100644 --- a/encrypted-media/Google/encrypted-media-lifetime-mediakeysession-release.html +++ b/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-release.html @@ -4,8 +4,11 @@ MediaKeySession lifetime after release() - - +
    @@ -31,11 +34,9 @@ } // Create 2 sessions. - getSupportedInitDataType().then(function(type) { - initDataType = type; + navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) { + initDataType = access.getConfiguration().initDataTypes[0]; initData = getInitData(initDataType); - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]); - }).then(function(access) { return access.createMediaKeys(); }).then(function(result) { mediaKeys = result; diff --git a/encrypted-media/Google/encrypted-media-lifetime-multiple-mediakeys.html b/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-multiple-mediakeys.html similarity index 94% rename from encrypted-media/Google/encrypted-media-lifetime-multiple-mediakeys.html rename to encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-multiple-mediakeys.html index 3681fbcae95ffa..42638a0695b8b8 100644 --- a/encrypted-media/Google/encrypted-media-lifetime-multiple-mediakeys.html +++ b/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-multiple-mediakeys.html @@ -4,8 +4,11 @@ Test multiple MediaKeys lifetimes - - +
    @@ -25,9 +28,7 @@ // with the new MediaKeys object. function createMediaKeys() { - return getSupportedInitDataType().then(function(type) { - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]); - }).then(function(access) { + return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) { return access.createMediaKeys(); }).then(function(mediaKeys) { return mediaKeys; diff --git a/encrypted-media/Google/encrypted-media-lifetime-reload.html b/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-reload.html similarity index 92% rename from encrypted-media/Google/encrypted-media-lifetime-reload.html rename to encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-reload.html index c8877fe1936389..b2f8ffb1f5491b 100644 --- a/encrypted-media/Google/encrypted-media-lifetime-reload.html +++ b/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-reload.html @@ -4,8 +4,11 @@ Reloading during encrypted media playback - - + @@ -14,6 +17,7 @@ async_test(function(test) { var video = document.getElementById('testVideo'); + var content = 'webm/test-encrypted.webm'; var mediaKeySession = null; var hasSessionUpdateSucceeded = false; var encryptedEventCount = 0; @@ -81,12 +85,12 @@ location.reload(); } - navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) { + navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content)).then(function(access) { return access.createMediaKeys(); }).then(function(mediaKeys) { waitForEventAndRunStep('encrypted', video, onEncrypted, test); waitForEventAndRunStep('playing', video, onPlaying, test); - video.src = '../content/test-encrypted.webm'; + video.src = content; return video.setMediaKeys(mediaKeys); }).then(function(result) { video.play(); diff --git a/encrypted-media/Google/encrypted-media-clear-key-invalid-license.html b/encrypted-media/Google/encrypted-media-clear-key-invalid-license.html index f347e1b97451e5..4061c4fd512e09 100644 --- a/encrypted-media/Google/encrypted-media-clear-key-invalid-license.html +++ b/encrypted-media/Google/encrypted-media-clear-key-invalid-license.html @@ -4,8 +4,8 @@ Invalid Clear Key License. - - + +
    @@ -27,11 +27,9 @@ }); } - getSupportedInitDataType().then(function(type) { - initDataType = type; + navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) { + initDataType = access.getConfiguration().initDataTypes[0]; initData = getInitData(initDataType); - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]); - }).then(function(access) { return access.createMediaKeys(); }).then(function(mediaKeys) { var keySession = mediaKeys.createSession(); diff --git a/encrypted-media/Google/encrypted-media-clearkey-update-non-ascii-input.html b/encrypted-media/Google/encrypted-media-clearkey-update-non-ascii-input.html index 9eed42393dd0a8..f9d00f904ab045 100644 --- a/encrypted-media/Google/encrypted-media-clearkey-update-non-ascii-input.html +++ b/encrypted-media/Google/encrypted-media-clearkey-update-non-ascii-input.html @@ -4,8 +4,8 @@ Test Clear Key handling of non-ASCII responses for update(). - - + +
    @@ -16,6 +16,7 @@ async_test(function(test) { var initDataType; + var initData; var mediaKeySession; function processMessage(event) @@ -34,15 +35,14 @@ }); } - getSupportedInitDataType().then(function(type) { - initDataType = type; - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]); - }).then(function(access) { + navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) { + initDataType = access.getConfiguration().initDataTypes[0]; + initData = getInitData(initDataType); return access.createMediaKeys(); }).then(function(mediaKeys) { mediaKeySession = mediaKeys.createSession(); waitForEventAndRunStep('message', mediaKeySession, processMessage, test); - return mediaKeySession.generateRequest(initDataType, getInitData(initDataType)); + return mediaKeySession.generateRequest(initDataType, initData); }); }, 'Clear Key update() with non-ASCII response.'); diff --git a/encrypted-media/Google/encrypted-media-keystatuses-multiple-sessions.html b/encrypted-media/Google/encrypted-media-keystatuses-multiple-sessions.html index 056a8a3daba8f9..26bc02328d5685 100644 --- a/encrypted-media/Google/encrypted-media-keystatuses-multiple-sessions.html +++ b/encrypted-media/Google/encrypted-media-keystatuses-multiple-sessions.html @@ -4,8 +4,8 @@ Verify MediaKeySession.keyStatuses with multiple sessions - - + +
    @@ -89,11 +89,9 @@ test.done(); } - getSupportedInitDataType().then(function(type) { - initDataType = type; + navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) { + initDataType = access.getConfiguration().initDataTypes[0]; initData = getInitData(initDataType); - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]); - }).then(function(access) { return access.createMediaKeys(); }).then(function(mediaKeys) { mediaKeySession1 = mediaKeys.createSession(); diff --git a/encrypted-media/Google/encrypted-media-keystatuses-multiple-updates.html b/encrypted-media/Google/encrypted-media-keystatuses-multiple-updates.html index df30026c6ec9e2..514109d04fcc8e 100644 --- a/encrypted-media/Google/encrypted-media-keystatuses-multiple-updates.html +++ b/encrypted-media/Google/encrypted-media-keystatuses-multiple-updates.html @@ -4,8 +4,8 @@ Verify MediaKeySession.keyStatuses with multiple updates - - + +
    @@ -61,11 +61,9 @@ } } - getSupportedInitDataType().then(function(type) { - initDataType = type; + navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) { + initDataType = access.getConfiguration().initDataTypes[0]; initData = getInitData(initDataType); - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]); - }).then(function(access) { return access.createMediaKeys(); }).then(function(mediaKeys) { mediaKeySession = mediaKeys.createSession(); diff --git a/encrypted-media/Google/encrypted-media-keystatuses.html b/encrypted-media/Google/encrypted-media-keystatuses.html deleted file mode 100644 index 096cc03981a29e..00000000000000 --- a/encrypted-media/Google/encrypted-media-keystatuses.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - Verify MediaKeySession.keyStatuses - - - - - -
    - - - diff --git a/encrypted-media/Google/encrypted-media-onencrypted.html b/encrypted-media/Google/encrypted-media-onencrypted.html index 64699de6033c07..01d140454a44fa 100644 --- a/encrypted-media/Google/encrypted-media-onencrypted.html +++ b/encrypted-media/Google/encrypted-media-onencrypted.html @@ -4,8 +4,8 @@ onencrypted - - + + @@ -19,6 +19,7 @@ async_test(function(test) { var video = document.getElementById('testVideo'); + var content = 'webm/test-encrypted.webm'; var onEncrypted = function(event) { @@ -33,7 +34,7 @@ }; waitForEventAndRunStep('encrypted', video, onEncrypted, test); - video.src = '../content/test-encrypted.webm'; + video.src = content; }, 'encrypted fired on encrypted media file.'); diff --git a/encrypted-media/Google/encrypted-media-playback-encrypted-and-clear-sources.html b/encrypted-media/Google/encrypted-media-playback-encrypted-and-clear-sources.html index ac9d197584d883..4d0acda5b5ad9b 100644 --- a/encrypted-media/Google/encrypted-media-playback-encrypted-and-clear-sources.html +++ b/encrypted-media/Google/encrypted-media-playback-encrypted-and-clear-sources.html @@ -4,8 +4,8 @@ Multiple playbacks alternating between encrypted and clear sources. - - + + @@ -18,6 +18,10 @@ var encryptedEventCount = 0; var playbackCount = 0; + // Content to be played. These files must be the same format. + var encryptedContent = 'webm/test-encrypted.webm'; + var unencryptedContent = 'webm/test.webm'; + var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b, 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]); @@ -93,18 +97,20 @@ } function startPlayback() { + // Alternate between encrypted and unencrypted files. if (playbackCount % 2) { - video.src = '../content/test-vp8-vorbis-webvtt.webm'; + // Unencrypted files don't require MediaKeys. + video.src = unencryptedContent; video.play(); return; } - navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) { + navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(encryptedContent)).then(function(access) { return access.createMediaKeys(); }).then(function(mediaKeys) { return video.setMediaKeys(mediaKeys); }).then(function(result) { - video.src = '../content/test-encrypted.webm'; + video.src = encryptedContent; assert_false(video.mediaKeys === null, "video.mediaKeys is null."); video.play(); }).catch(function(error) { diff --git a/encrypted-media/Google/encrypted-media-playback-multiple-sessions.html b/encrypted-media/Google/encrypted-media-playback-multiple-sessions.html index bddc4a2fc4978f..2a4adc340ddbe5 100644 --- a/encrypted-media/Google/encrypted-media-playback-multiple-sessions.html +++ b/encrypted-media/Google/encrypted-media-playback-multiple-sessions.html @@ -4,8 +4,8 @@ Clear Key Playback with Multiple Sessions - - + + @@ -14,6 +14,7 @@ async_test(function(test) { var video = document.getElementById('testVideo'); + var content = 'webm/test-encrypted-different-av-keys.webm'; var audioMediaKeySession = null; var videoMediaKeySession = null; var audioInitDataType = null; @@ -121,12 +122,12 @@ test.done(); } - navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) { + navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content)).then(function(access) { return access.createMediaKeys(); }).then(function(mediaKeys) { waitForEventAndRunStep('encrypted', video, onEncrypted, test); waitForEventAndRunStep('playing', video, onPlaying, test); - video.src = '../content/test-encrypted-different-av-keys.webm'; + video.src = content; return video.setMediaKeys(mediaKeys); }).then(function(result) { video.play(); diff --git a/encrypted-media/Google/encrypted-media-requestmediakeysystemaccess.html b/encrypted-media/Google/encrypted-media-requestmediakeysystemaccess.html index 9c85fca7577602..68002d2a808d7b 100644 --- a/encrypted-media/Google/encrypted-media-requestmediakeysystemaccess.html +++ b/encrypted-media/Google/encrypted-media-requestmediakeysystemaccess.html @@ -4,8 +4,8 @@ Test navigator.requestMediaKeySystemAccess() - - + +
    diff --git a/encrypted-media/Google/encrypted-media-reset-src-after-setmediakeys.html b/encrypted-media/Google/encrypted-media-reset-src-after-setmediakeys.html index 9158dcc4fbcfb0..dc2c1d5332480e 100644 --- a/encrypted-media/Google/encrypted-media-reset-src-after-setmediakeys.html +++ b/encrypted-media/Google/encrypted-media-reset-src-after-setmediakeys.html @@ -4,8 +4,8 @@ Reset src after setMediaKeys() - - + + @@ -18,6 +18,10 @@ var video = document.getElementById('testVideo'); assert_not_equals(video, null); + // Content to be played. These files must be the same format. + var content = 'webm/test-encrypted.webm'; + var alternateContent = 'webm/test-encrypted-different-av-keys.webm'; + var onEncrypted = function(event) { ++encryptedEventIndex; @@ -28,7 +32,7 @@ // for the video stream each time .src is set. if (encryptedEventIndex == 2) { // Finished first video; set src to a different video. - video.src = '../content/test-encrypted-different-av-keys.webm'; + video.src = alternateContent; } else if (encryptedEventIndex == 4) { // Finished second video. test.done(); @@ -36,7 +40,7 @@ }; // Create a MediaKeys object and assign it to video. - navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]) + navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content)) .then(function(access) { assert_equals(access.keySystem, 'org.w3.clearkey'); return access.createMediaKeys(); @@ -50,7 +54,7 @@ // Set src to a video. waitForEventAndRunStep('encrypted', video, onEncrypted, test); - video.src = '../content/test-encrypted.webm'; + video.src = content; }).catch(function(error) { forceTestFailureFromPromise(test, error); }); diff --git a/encrypted-media/Google/encrypted-media-session-closed-event.html b/encrypted-media/Google/encrypted-media-session-closed-event.html index fdabb2571d959c..6f817f7b3e55a1 100644 --- a/encrypted-media/Google/encrypted-media-session-closed-event.html +++ b/encrypted-media/Google/encrypted-media-session-closed-event.html @@ -4,8 +4,8 @@ Test MediaKeySession closed event - - + +
    @@ -15,11 +15,10 @@ var initDataType; var initData; var mediaKeySession; - getSupportedInitDataType().then(function(type) { - initDataType = type; + + navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) { + initDataType = access.getConfiguration().initDataTypes[0]; initData = getInitData(initDataType); - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]); - }).then(function(access) { return access.createMediaKeys(); }).then(function(mediaKeys) { mediaKeySession = mediaKeys.createSession(); diff --git a/encrypted-media/Google/encrypted-media-setmediakeys-again-after-playback.html b/encrypted-media/Google/encrypted-media-setmediakeys-again-after-playback.html index 33abeb1ba00831..2106c937781276 100644 --- a/encrypted-media/Google/encrypted-media-setmediakeys-again-after-playback.html +++ b/encrypted-media/Google/encrypted-media-setmediakeys-again-after-playback.html @@ -4,8 +4,8 @@ setMediaKeys() again after playback - - + + @@ -17,7 +17,7 @@ var keyId = stringToUint8Array('0123456789012345'); var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b, 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]); - var content = '../content/test-encrypted.webm'; + var content = 'webm/test-encrypted.webm'; var duration = 0.2; return createMediaKeys(keyId, rawKey).then(function(mediaKeys) { diff --git a/encrypted-media/Google/encrypted-media-setmediakeys-again-after-resetting-src.html b/encrypted-media/Google/encrypted-media-setmediakeys-again-after-resetting-src.html index 176a5eaaeafe39..ed7f2370271429 100644 --- a/encrypted-media/Google/encrypted-media-setmediakeys-again-after-resetting-src.html +++ b/encrypted-media/Google/encrypted-media-setmediakeys-again-after-resetting-src.html @@ -4,8 +4,8 @@ setMediaKeys() again after resetting src - - + + @@ -17,7 +17,7 @@ var keyId = stringToUint8Array('0123456789012345'); var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b, 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]); - var content = '../content/test-encrypted.webm'; + var content = 'webm/test-encrypted.webm'; var duration = 0.2; return createMediaKeys(keyId, rawKey).then(function(mediaKeys) { diff --git a/encrypted-media/Google/encrypted-media-setmediakeys-at-same-time.html b/encrypted-media/Google/encrypted-media-setmediakeys-at-same-time.html index a0a286b04cb396..62c636529697b9 100644 --- a/encrypted-media/Google/encrypted-media-setmediakeys-at-same-time.html +++ b/encrypted-media/Google/encrypted-media-setmediakeys-at-same-time.html @@ -4,8 +4,8 @@ Set MediaKeys multiple times in parallel - - + + @@ -56,6 +56,7 @@ promise_test(function(test) { var video = document.getElementById('video'); + var content = 'webm/test-encrypted.webm'; var access; var mediaKeys1; var mediaKeys2; @@ -65,10 +66,10 @@ // Start a video now so that it is waiting for MediaKeys // in order to continue. - video.src = '../content/test-encrypted.webm'; + video.src = content; video.play(); return wait_for_encrypted_event(video).then(function() { - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]); + return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content)); }).then(function(result) { access = result; return access.createMediaKeys(); diff --git a/encrypted-media/Google/encrypted-media-setmediakeys-multiple-times-with-different-mediakeys.html b/encrypted-media/Google/encrypted-media-setmediakeys-multiple-times-with-different-mediakeys.html index 644d3baac8513d..bea28d0e1767ba 100644 --- a/encrypted-media/Google/encrypted-media-setmediakeys-multiple-times-with-different-mediakeys.html +++ b/encrypted-media/Google/encrypted-media-setmediakeys-multiple-times-with-different-mediakeys.html @@ -4,8 +4,8 @@ setMediaKeys() multiple times with different MediaKeys. - - + + @@ -14,13 +14,14 @@ promise_test(function(test) { var video = document.getElementById('video'); + var content = 'webm/test-encrypted.webm'; var keySystemAccess; var mediaKeys1; var mediaKeys2; assert_equals(video.mediaKeys, null); - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) { + return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content)).then(function(access) { keySystemAccess = access; // Create a mediaKeys. return keySystemAccess.createMediaKeys(); @@ -49,7 +50,7 @@ }).then(function() { assert_true(video.mediaKeys === mediaKeys1); // Load the media element to create the WebMediaPlayer. - video.src = '../content/test-encrypted.webm'; + video.src = content; // Set mediaKeys2 on video (switching MediaKeys) not // supported after WebMediaPlayer is created. return video.setMediaKeys(mediaKeys2); diff --git a/encrypted-media/Google/encrypted-media-setmediakeys-multiple-times-with-the-same-mediakeys.html b/encrypted-media/Google/encrypted-media-setmediakeys-multiple-times-with-the-same-mediakeys.html index 1ef710164315b0..93af8cceb7c9bf 100644 --- a/encrypted-media/Google/encrypted-media-setmediakeys-multiple-times-with-the-same-mediakeys.html +++ b/encrypted-media/Google/encrypted-media-setmediakeys-multiple-times-with-the-same-mediakeys.html @@ -4,8 +4,8 @@ setMediaKeys() multiple times with the same MediaKeys. - - + + @@ -14,11 +14,12 @@ promise_test(function(test) { var video = document.getElementById('video'); + var content = 'webm/test-encrypted.webm'; var mediaKeys; assert_equals(video.mediaKeys, null); - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) { + return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content)).then(function(access) { return access.createMediaKeys(); }).then(function(result) { mediaKeys = result; @@ -33,7 +34,7 @@ }).then(function() { assert_true(video.mediaKeys === mediaKeys); // Load the media element to create the WebMediaPlayer. - video.src = '../content/test-encrypted.webm'; + video.src = content; // Set mediaKeys again on video should still return a // resolved promise. return video.setMediaKeys(mediaKeys); diff --git a/encrypted-media/Google/encrypted-media-setmediakeys-to-multiple-video-elements.html b/encrypted-media/Google/encrypted-media-setmediakeys-to-multiple-video-elements.html index b51d44a99caccf..38c11ee74ef879 100644 --- a/encrypted-media/Google/encrypted-media-setmediakeys-to-multiple-video-elements.html +++ b/encrypted-media/Google/encrypted-media-setmediakeys-to-multiple-video-elements.html @@ -4,8 +4,8 @@ setMediaKeys() on multiple video elements. - - + + @@ -18,7 +18,7 @@ var video2 = document.getElementById('video2'); var mediaKeys; - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) { + return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) { return access.createMediaKeys(); }).then(function(result) { mediaKeys = result; diff --git a/encrypted-media/Google/encrypted-media-setmediakeys.html b/encrypted-media/Google/encrypted-media-setmediakeys.html index 66dae88bfb4085..5374c9a65c41a8 100644 --- a/encrypted-media/Google/encrypted-media-setmediakeys.html +++ b/encrypted-media/Google/encrypted-media-setmediakeys.html @@ -4,8 +4,8 @@ setMediaKeys - - + + @@ -34,7 +34,7 @@ assert_equals(error.name, 'TypeError'); // Create a MediaKeys object and assign it to video. - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]); + return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()); }).then(function(access) { assert_equals(access.keySystem, 'org.w3.clearkey'); return access.createMediaKeys(); diff --git a/encrypted-media/Google/encrypted-media-syntax.html b/encrypted-media/Google/encrypted-media-syntax.html index 0e314bc1602542..13240922fe3ab1 100644 --- a/encrypted-media/Google/encrypted-media-syntax.html +++ b/encrypted-media/Google/encrypted-media-syntax.html @@ -4,8 +4,8 @@ Test EME syntax - - + +
    diff --git a/encrypted-media/Google/encrypted-media-unique-origin.html b/encrypted-media/Google/encrypted-media-unique-origin.html index 822c7edcda67d8..83bd6b50d16842 100644 --- a/encrypted-media/Google/encrypted-media-unique-origin.html +++ b/encrypted-media/Google/encrypted-media-unique-origin.html @@ -3,8 +3,8 @@ Unique origin is unable to create MediaKeys - - + +
    @@ -36,7 +36,13 @@ var script = 'data:text/html,' + ' - - + +
    @@ -16,6 +16,7 @@ async_test(function(test) { var initDataType; + var initData; var mediaKeySession; function repeat(pattern, count) { @@ -54,15 +55,14 @@ }); } - getSupportedInitDataType().then(function(type) { - initDataType = type; - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]); - }).then(function(access) { + navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) { + initDataType = access.getConfiguration().initDataTypes[0]; + initData = getInitData(initDataType); return access.createMediaKeys(); }).then(function(mediaKeys) { mediaKeySession = mediaKeys.createSession(); waitForEventAndRunStep('message', mediaKeySession, processMessage, test); - return mediaKeySession.generateRequest(initDataType, getInitData(initDataType)); + return mediaKeySession.generateRequest(initDataType, initData); }); }, 'update() with response longer than 64Kb characters.'); diff --git a/encrypted-media/Google/encrypted-media-utils.js b/encrypted-media/Google/encrypted-media-utils.js index f23104857eddf3..5fbcdf689a5db7 100644 --- a/encrypted-media/Google/encrypted-media-utils.js +++ b/encrypted-media/Google/encrypted-media-utils.js @@ -19,23 +19,8 @@ function consoleWrite(text) function isInitDataTypeSupported(initDataType) { return navigator.requestMediaKeySystemAccess( - "org.w3.clearkey", [{ initDataTypes : [initDataType] }]) - .then(function() { return(true); }, function() { return(false); }); -} - -// Returns a promise that is fulfilled with an initDataType that is supported, -// rejected if none are supported. -function getSupportedInitDataType() -{ - var configuration = [{ initDataTypes : [ 'webm', 'cenc', 'keyids' ] }]; - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', configuration) - .then(function(access) { - var initDataTypes = access.getConfiguration().initDataTypes; - assert_greater_than(initDataTypes.length, 0); - return Promise.resolve(initDataTypes[0]); - }, function(error) { - return Promise.reject('No supported initDataType.'); - }); + "org.w3.clearkey", getSimpleConfigurationForInitDataType(initDataType)) + .then(function() { return true; }, function() { return false; }); } function getInitData(initDataType) @@ -49,7 +34,7 @@ function getInitData(initDataType) if (initDataType == 'cenc') { return new Uint8Array([ - 0x00, 0x00, 0x00, 0x00, // size = 0 + 0x00, 0x00, 0x00, 0x34, // size = 52 0x70, 0x73, 0x73, 0x68, // 'pssh' 0x01, // version = 1 0x00, 0x00, 0x00, // flags @@ -73,6 +58,54 @@ function getInitData(initDataType) throw 'initDataType ' + initDataType + ' not supported.'; } +// Returns an array of audioCapabilities that includes entries for a set of +// codecs that should cover all user agents. +function getPossibleAudioCapabilities() +{ + return [ + { contentType: 'audio/mp4; codecs="mp4a.40.2"' }, + { contentType: 'audio/webm; codecs="opus"' }, + ]; +} + +// Returns a trivial MediaKeySystemConfiguration that should be accepted, +// possibly as a subset of the specified capabilities, by all user agents. +function getSimpleConfiguration() +{ + return [ { + initDataTypes : [ 'webm', 'cenc', 'keyids' ], + audioCapabilities: getPossibleAudioCapabilities() + } ]; +} + +// Returns a MediaKeySystemConfiguration for |initDataType| that should be +// accepted, possibly as a subset of the specified capabilities, by all +// user agents. +function getSimpleConfigurationForInitDataType(initDataType) +{ + return [ { + initDataTypes: [ initDataType ], + audioCapabilities: getPossibleAudioCapabilities() + } ]; +} + +// Returns a MediaKeySystemConfiguration for |mediaFile| that specifies +// both audio and video capabilities for the specified file.. +function getConfigurationForFile(mediaFile) +{ + if (mediaFile.toLowerCase().endsWith('webm')) { + return [ { + initDataTypes: [ 'webm' ], + audioCapabilities: [ { contentType: 'audio/webm; codecs="opus"' } ], + videoCapabilities: [ { contentType: 'video/webm; codecs="vp8"' } ] + } ]; + } + + // NOTE: Supporting other mediaFormats is not currently implemented as + // Chromium only tests with WebM files. + throw 'mediaFile ' + mediaFile + ' not supported.'; +} + function waitForEventAndRunStep(eventName, element, func, stepTest) { var eventCallback = function(event) { @@ -130,23 +163,23 @@ function dumpKeyStatuses(keyStatuses) { consoleWrite("for (var entry of keyStatuses)"); for (var entry of keyStatuses) { - consoleWrite(arrayBufferAsString(entry[0]) + ", " + entry[1]); + consoleWrite(arrayBufferAsString(entry[0]) + ": " + entry[1]); } - consoleWrite("for (var key of keyStatuses.keys())"); - for (var key of keyStatuses.keys()) { - consoleWrite(arrayBufferAsString(key)); + consoleWrite("for (var keyId of keyStatuses.keys())"); + for (var keyId of keyStatuses.keys()) { + consoleWrite(arrayBufferAsString(keyId)); } - consoleWrite("for (var value of keyStatuses.values())"); - for (var value of keyStatuses.values()) { - consoleWrite(value); + consoleWrite("for (var status of keyStatuses.values())"); + for (var status of keyStatuses.values()) { + consoleWrite(status); } consoleWrite("for (var entry of keyStatuses.entries())"); for (var entry of keyStatuses.entries()) { - consoleWrite(arrayBufferAsString(entry[0]) + ", " + entry[1]); + consoleWrite(arrayBufferAsString(entry[0]) + ": " + entry[1]); } consoleWrite("keyStatuses.forEach()"); - keyStatuses.forEach(function(value, key, map) { - consoleWrite(arrayBufferAsString(key) + ", " + value); + keyStatuses.forEach(function(status, keyId) { + consoleWrite(arrayBufferAsString(keyId) + ": " + status); }); } @@ -270,7 +303,7 @@ function createMediaKeys(keyId, key) var request = stringToUint8Array(createKeyIDs(keyId)); var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId, key))); - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) { + return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfigurationForInitDataType('keyids')).then(function(access) { return access.createMediaKeys(); }).then(function(result) { mediaKeys = result; diff --git a/encrypted-media/Google/encrypted-media-waiting-for-a-key.html b/encrypted-media/Google/encrypted-media-waiting-for-a-key.html index e6c1559a0d32de..3469b159ad0c40 100644 --- a/encrypted-media/Google/encrypted-media-waiting-for-a-key.html +++ b/encrypted-media/Google/encrypted-media-waiting-for-a-key.html @@ -4,8 +4,8 @@ Waiting for a key. - - + + @@ -21,6 +21,7 @@ promise_test(function(test) { var video = document.getElementById('testVideo'); + var content = 'webm/test-encrypted.webm'; var initData; var initDataType; var mediaKeySession; @@ -44,14 +45,14 @@ var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b, 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]); - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) { + return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content)).then(function(access) { debugMessage = 'createMediaKeys()'; return access.createMediaKeys(); }).then(function(mediaKeys) { debugMessage = 'setMediaKeys()'; return video.setMediaKeys(mediaKeys); }).then(function() { - video.src = '../content/test-encrypted.webm'; + video.src = content; video.play(); debugMessage = 'wait_for_encrypted_event()'; return wait_for_encrypted_event(video); diff --git a/encrypted-media/Google/encrypted-media-check-init-data-type.html b/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-check-init-data-type.html similarity index 85% rename from encrypted-media/Google/encrypted-media-check-init-data-type.html rename to encrypted-media/Google/migrated_to_root_disabled/encrypted-media-check-init-data-type.html index 00d2d4b537c80d..f71cf48a825ad1 100644 --- a/encrypted-media/Google/encrypted-media-check-init-data-type.html +++ b/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-check-init-data-type.html @@ -4,8 +4,11 @@ Test support of different initDataTypes. - - +
    @@ -17,8 +20,7 @@ if (!result) return Promise.resolve('Not supported'); - var options = [ { initDataTypes: [initDataType] } ]; - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', options) + return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfigurationForInitDataType(initDataType)) .then(function(access) { return access.createMediaKeys(); }).then(function(mediaKeys) { diff --git a/encrypted-media/Google/encrypted-media-events.html b/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-events.html similarity index 86% rename from encrypted-media/Google/encrypted-media-events.html rename to encrypted-media/Google/migrated_to_root_disabled/encrypted-media-events.html index eec702aa674d61..a2a70f169c5ef8 100644 --- a/encrypted-media/Google/encrypted-media-events.html +++ b/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-events.html @@ -4,8 +4,11 @@ Verify v2 events - - +
    @@ -45,11 +48,9 @@ test.done(); } - getSupportedInitDataType().then(function(type) { - initDataType = type; + navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) { + initDataType = access.getConfiguration().initDataTypes[0]; initData = getInitData(initDataType); - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]); - }).then(function(access) { return access.createMediaKeys(); }).then(test.step_func(function(mediaKeys) { mediaKeySession = mediaKeys.createSession(); diff --git a/encrypted-media/Google/encrypted-media-generate-request-disallowed-input.html b/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-generate-request-disallowed-input.html similarity index 91% rename from encrypted-media/Google/encrypted-media-generate-request-disallowed-input.html rename to encrypted-media/Google/migrated_to_root_disabled/encrypted-media-generate-request-disallowed-input.html index 66eb0f7c5eab39..53e5c95b78a0d7 100644 --- a/encrypted-media/Google/encrypted-media-generate-request-disallowed-input.html +++ b/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-generate-request-disallowed-input.html @@ -4,8 +4,11 @@ Test handling of invalid initData for generateRequest(). - - +
    @@ -21,7 +24,7 @@ if (!result) return Promise.resolve('Not supported'); - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) { + return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfigurationForInitDataType(initDataType)).then(function(access) { return access.createMediaKeys(); }).then(function(mediaKeys) { var mediaKeySession = mediaKeys.createSession(); @@ -67,13 +70,13 @@ 0x00, 0x00, 0x00, 0x00 // datasize ]); return test_session('cenc', initData); - }, 'generateRequest() with invalid pssh data.'); + }, 'generateRequest() with invalid pssh box size.'); promise_test(function() { // Invalid data as type = 'psss'. var initData = new Uint8Array([ - 0x00, 0x00, 0x00, 0x00, // size = 0 + 0x00, 0x00, 0x00, 0x20, // size = 32 0x70, 0x73, 0x73, 0x73, // 'psss' 0x00, // version = 0 0x00, 0x00, 0x00, // flags diff --git a/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses.html b/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses.html new file mode 100644 index 00000000000000..043bc132241201 --- /dev/null +++ b/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses.html @@ -0,0 +1,174 @@ + + + + + Verify MediaKeySession.keyStatuses + + + + +
    + + + diff --git a/encrypted-media/Google/encrypted-media-not-callable-after-createsession.html b/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-not-callable-after-createsession.html similarity index 86% rename from encrypted-media/Google/encrypted-media-not-callable-after-createsession.html rename to encrypted-media/Google/migrated_to_root_disabled/encrypted-media-not-callable-after-createsession.html index 416cc091159dd6..9b92c69053f114 100644 --- a/encrypted-media/Google/encrypted-media-not-callable-after-createsession.html +++ b/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-not-callable-after-createsession.html @@ -4,8 +4,11 @@ Test MediaKeySession not callable immediately after CreateSession(). - - +
    @@ -15,7 +18,7 @@ promise_test(function() { - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) { + return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) { return access.createMediaKeys(); }).then(function(mediaKeys) { var mediaKeySession = mediaKeys.createSession(); @@ -31,7 +34,7 @@ promise_test(function() { - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) { + return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) { return access.createMediaKeys(); }).then(function(mediaKeys) { var mediaKeySession = mediaKeys.createSession(); @@ -46,7 +49,7 @@ promise_test(function() { - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) { + return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) { return access.createMediaKeys(); }).then(function(mediaKeys) { var mediaKeySession = mediaKeys.createSession(); diff --git a/encrypted-media/Google/encrypted-media-playback-setmediakeys-after-src.html b/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-setmediakeys-after-src.html similarity index 91% rename from encrypted-media/Google/encrypted-media-playback-setmediakeys-after-src.html rename to encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-setmediakeys-after-src.html index 51b7fc9acaab53..2a8cac4866128b 100644 --- a/encrypted-media/Google/encrypted-media-playback-setmediakeys-after-src.html +++ b/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-setmediakeys-after-src.html @@ -4,8 +4,11 @@ Clear Key Playback - - + @@ -14,6 +17,7 @@ async_test(function(test) { var video = document.getElementById('testVideo'); + var content = 'webm/test-encrypted.webm'; var isUpdatePromiseResolved = false; var encryptedEventCount = 0; @@ -72,14 +76,14 @@ test.done(); } - navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) { + navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content)).then(function(access) { return access.createMediaKeys(); }).then(function(mediaKeys) { waitForEventAndRunStep('encrypted', video, onEncrypted, test); waitForEventAndRunStep('playing', video, onPlaying, test); - video.src = '../content/test-encrypted.webm'; + video.src = content; return video.setMediaKeys(mediaKeys); }).then(function(result) { video.play(); diff --git a/encrypted-media/Google/encrypted-media-playback-setmediakeys-before-src.html b/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-setmediakeys-before-src.html similarity index 91% rename from encrypted-media/Google/encrypted-media-playback-setmediakeys-before-src.html rename to encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-setmediakeys-before-src.html index ffa97e6fe232ef..84100570c22cf5 100644 --- a/encrypted-media/Google/encrypted-media-playback-setmediakeys-before-src.html +++ b/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-setmediakeys-before-src.html @@ -4,8 +4,11 @@ Clear Key Playback - - + @@ -14,6 +17,7 @@ async_test(function(test) { var video = document.getElementById('testVideo'); + var content = 'webm/test-encrypted.webm'; var isUpdatePromiseResolved = false; var encryptedEventCount = 0; @@ -72,7 +76,7 @@ test.done(); } - navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) { + navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content)).then(function(access) { return access.createMediaKeys(); }).then(function(mediaKeys) { @@ -81,7 +85,7 @@ return video.setMediaKeys(mediaKeys); }).then(function(result) { - video.src = '../content/test-encrypted.webm'; + video.src = content; video.play(); }).catch(function(error) { forceTestFailureFromPromise(test, error); diff --git a/encrypted-media/Google/encrypted-media-playback-two-videos.html b/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-two-videos.html similarity index 90% rename from encrypted-media/Google/encrypted-media-playback-two-videos.html rename to encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-two-videos.html index 44483c035ab6f5..0bdc7757ba0214 100644 --- a/encrypted-media/Google/encrypted-media-playback-two-videos.html +++ b/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-two-videos.html @@ -4,8 +4,11 @@ Clear Key Play Two Videos At Same Time - - + @@ -18,19 +21,20 @@ var keyId = stringToUint8Array('0123456789012345'); var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b, 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]); + var content = 'webm/test-encrypted.webm'; promise_test(function(test) { var promises = [ - play_video_as_promise(document.getElementById('testVideo'), '../content/test-encrypted.webm'), - play_video_as_promise(document.getElementById('secondVideo'), '../content/test-encrypted.webm') + play_video_as_promise(document.getElementById('testVideo'), content), + play_video_as_promise(document.getElementById('secondVideo'), content) ]; return Promise.all(promises); }, 'Play two videos at the same time.'); function play_video_as_promise(video, content) { - return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) { + return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content)).then(function(access) { return access.createMediaKeys(); }).then(function(mediaKeys) { return video.setMediaKeys(mediaKeys); diff --git a/encrypted-media/Google/test-encrypted-different-av-keys.webm b/encrypted-media/Google/webm/test-encrypted-different-av-keys.webm similarity index 100% rename from encrypted-media/Google/test-encrypted-different-av-keys.webm rename to encrypted-media/Google/webm/test-encrypted-different-av-keys.webm diff --git a/encrypted-media/Google/test-encrypted.webm b/encrypted-media/Google/webm/test-encrypted.webm similarity index 100% rename from encrypted-media/Google/test-encrypted.webm rename to encrypted-media/Google/webm/test-encrypted.webm diff --git a/encrypted-media/Google/webm/test.webm b/encrypted-media/Google/webm/test.webm new file mode 100644 index 00000000000000..6c2138d4ecaed9 Binary files /dev/null and b/encrypted-media/Google/webm/test.webm differ diff --git a/encrypted-media/clearkey-check-initdata-type.html b/encrypted-media/clearkey-check-initdata-type.html new file mode 100644 index 00000000000000..d580a8cc3cdce5 --- /dev/null +++ b/encrypted-media/clearkey-check-initdata-type.html @@ -0,0 +1,33 @@ + + + + + + Encrypted Media Extensions: Successful Playback, Temporary session with Clear Key, mp4 + + + + + + + + + + + + + + + + + + +
    + + + + diff --git a/encrypted-media/clearkey-events.html b/encrypted-media/clearkey-events.html new file mode 100644 index 00000000000000..6b0f72fa1c1f23 --- /dev/null +++ b/encrypted-media/clearkey-events.html @@ -0,0 +1,44 @@ + + + + + + Encrypted Media Extensions: Events with Clear Key + + + + + + + + + + + + + + + + + + + + + + +
    + + + + diff --git a/encrypted-media/clearkey-generate-request-disallowed-input.html b/encrypted-media/clearkey-generate-request-disallowed-input.html new file mode 100644 index 00000000000000..7ee374211db320 --- /dev/null +++ b/encrypted-media/clearkey-generate-request-disallowed-input.html @@ -0,0 +1,33 @@ + + + + + + Encrypted Media Extensions: Test handling of invalid initData for generateRequest() + + + + + + + + + + + + + + + + +
    + + + + diff --git a/encrypted-media/clearkey-keystatuses-multiple-sessions.html b/encrypted-media/clearkey-keystatuses-multiple-sessions.html new file mode 100644 index 00000000000000..ccb0d5ca678158 --- /dev/null +++ b/encrypted-media/clearkey-keystatuses-multiple-sessions.html @@ -0,0 +1,52 @@ + + + + + + Encrypted Media Extensions: Verify MediaKeySession.keyStatuses with multiple sessions, Clear Key + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + diff --git a/encrypted-media/clearkey-keystatuses.html b/encrypted-media/clearkey-keystatuses.html new file mode 100644 index 00000000000000..127c06dca50e21 --- /dev/null +++ b/encrypted-media/clearkey-keystatuses.html @@ -0,0 +1,51 @@ + + + + + + Encrypted Media Extensions: Verify MediaKeySession.keyStatuses with multiple sessions, Clear Key + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + \ No newline at end of file diff --git a/encrypted-media/clearkey-mp4-playback-persistent-license-events.html b/encrypted-media/clearkey-mp4-playback-persistent-license-events.html new file mode 100644 index 00000000000000..dea4f6454a7f85 --- /dev/null +++ b/encrypted-media/clearkey-mp4-playback-persistent-license-events.html @@ -0,0 +1,53 @@ + + + + + + Encrypted Media Extensions: Successful Playback, persistent-license session with Clear Key, mp4, event sequence + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + \ No newline at end of file diff --git a/encrypted-media/clearkey-mp4-playback-persistent-license.html b/encrypted-media/clearkey-mp4-playback-persistent-license.html new file mode 100644 index 00000000000000..92b275dc9e360d --- /dev/null +++ b/encrypted-media/clearkey-mp4-playback-persistent-license.html @@ -0,0 +1,53 @@ + + + + + + Encrypted Media Extensions: Successful Playback, persistent-license session with Clear Key, mp4 + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + \ No newline at end of file diff --git a/encrypted-media/clearkey-mp4-playback-persistent-usage-record-events.html b/encrypted-media/clearkey-mp4-playback-persistent-usage-record-events.html new file mode 100644 index 00000000000000..e673d82ca05dd3 --- /dev/null +++ b/encrypted-media/clearkey-mp4-playback-persistent-usage-record-events.html @@ -0,0 +1,53 @@ + + + + + + Encrypted Media Extensions: Successful Playback, persistent-usage-record session with Clear Key, mp4, event sequence + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + diff --git a/encrypted-media/clearkey-mp4-playback-persistent-usage-record.html b/encrypted-media/clearkey-mp4-playback-persistent-usage-record.html new file mode 100644 index 00000000000000..64ce9b87171303 --- /dev/null +++ b/encrypted-media/clearkey-mp4-playback-persistent-usage-record.html @@ -0,0 +1,53 @@ + + + + + + Encrypted Media Extensions: Successful Playback, persistent-usage-record session with Clear Key, mp4, event sequence + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + diff --git a/encrypted-media/clearkey-mp4-playback-retrieve-persistent-license.html b/encrypted-media/clearkey-mp4-playback-retrieve-persistent-license.html new file mode 100644 index 00000000000000..5d991c8e8e024e --- /dev/null +++ b/encrypted-media/clearkey-mp4-playback-retrieve-persistent-license.html @@ -0,0 +1,54 @@ + + + + + + Encrypted Media Extensions: Successful Playback, persistent-license session with Clear Key, mp4, event sequence + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + \ No newline at end of file diff --git a/encrypted-media/clearkey-mp4-playback-retrieve-persistent-usage-record.html b/encrypted-media/clearkey-mp4-playback-retrieve-persistent-usage-record.html new file mode 100644 index 00000000000000..165b1faa30b5de --- /dev/null +++ b/encrypted-media/clearkey-mp4-playback-retrieve-persistent-usage-record.html @@ -0,0 +1,54 @@ + + + + + + Encrypted Media Extensions: persistent-usage-record, playback and retrieve record in new window, Clear Key, mp4 + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + diff --git a/encrypted-media/clearkey-mp4-playback-temporary-events.html b/encrypted-media/clearkey-mp4-playback-temporary-events.html new file mode 100644 index 00000000000000..422b8bd6e97efd --- /dev/null +++ b/encrypted-media/clearkey-mp4-playback-temporary-events.html @@ -0,0 +1,53 @@ + + + + + + Encrypted Media Extensions: Successful playback, Temporary session with Clear Key, mp4, validating events + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + diff --git a/encrypted-media/clearkey-mp4-playback-temporary-multikey-sequential.html b/encrypted-media/clearkey-mp4-playback-temporary-multikey-sequential.html new file mode 100644 index 00000000000000..6c37eb267ac307 --- /dev/null +++ b/encrypted-media/clearkey-mp4-playback-temporary-multikey-sequential.html @@ -0,0 +1,54 @@ + + + + + + Encrypted Media Extensions: Successful Playback, Temporary session with Clear Key, mp4, multiple keys in sequence + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + diff --git a/encrypted-media/clearkey-mp4-playback-temporary-multikey.html b/encrypted-media/clearkey-mp4-playback-temporary-multikey.html new file mode 100644 index 00000000000000..fe3f96dbf4169b --- /dev/null +++ b/encrypted-media/clearkey-mp4-playback-temporary-multikey.html @@ -0,0 +1,54 @@ + + + + + + Encrypted Media Extensions: Successful Playback, Temporary session with Clear Key, mp4, multiple keys for audio/video + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + diff --git a/encrypted-media/clearkey-mp4-playback-temporary-setMediaKeys-after-src.html b/encrypted-media/clearkey-mp4-playback-temporary-setMediaKeys-after-src.html new file mode 100644 index 00000000000000..a4052fe27636e6 --- /dev/null +++ b/encrypted-media/clearkey-mp4-playback-temporary-setMediaKeys-after-src.html @@ -0,0 +1,54 @@ + + + + + + Encrypted Media Extensions: Successful Playback, Temporary session with Clear Key, mp4 + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + \ No newline at end of file diff --git a/encrypted-media/clearkey-mp4-playback-temporary-setMediaKeys-after-update.html b/encrypted-media/clearkey-mp4-playback-temporary-setMediaKeys-after-update.html new file mode 100644 index 00000000000000..2e0e0e65753165 --- /dev/null +++ b/encrypted-media/clearkey-mp4-playback-temporary-setMediaKeys-after-update.html @@ -0,0 +1,54 @@ + + + + + + Encrypted Media Extensions: Successful Playback, Temporary session with Clear Key, mp4 + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + \ No newline at end of file diff --git a/encrypted-media/clearkey-mp4-playback-temporary-setMediaKeys-immediately.html b/encrypted-media/clearkey-mp4-playback-temporary-setMediaKeys-immediately.html new file mode 100644 index 00000000000000..1cf3f122c146f4 --- /dev/null +++ b/encrypted-media/clearkey-mp4-playback-temporary-setMediaKeys-immediately.html @@ -0,0 +1,54 @@ + + + + + + Encrypted Media Extensions: Successful Playback, Temporary session with Clear Key, mp4 + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + diff --git a/encrypted-media/clearkey-mp4-playback-temporary-setMediaKeys-onencrypted.html b/encrypted-media/clearkey-mp4-playback-temporary-setMediaKeys-onencrypted.html new file mode 100644 index 00000000000000..f8c17b91e5cc05 --- /dev/null +++ b/encrypted-media/clearkey-mp4-playback-temporary-setMediaKeys-onencrypted.html @@ -0,0 +1,54 @@ + + + + + + Encrypted Media Extensions: Successful Playback, Temporary session with Clear Key, mp4 + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + \ No newline at end of file diff --git a/encrypted-media/clearkey-mp4-playback-temporary-two-videos.html b/encrypted-media/clearkey-mp4-playback-temporary-two-videos.html new file mode 100644 index 00000000000000..99e5ef3465ca4f --- /dev/null +++ b/encrypted-media/clearkey-mp4-playback-temporary-two-videos.html @@ -0,0 +1,55 @@ + + + + + + Encrypted Media Extensions: Successful Playback, Temporary session with Clear Key, mp4, two videos + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + +
    + + + + diff --git a/encrypted-media/clearkey-mp4-playback-temporary-waitingforkey.html b/encrypted-media/clearkey-mp4-playback-temporary-waitingforkey.html new file mode 100644 index 00000000000000..17929262d619d3 --- /dev/null +++ b/encrypted-media/clearkey-mp4-playback-temporary-waitingforkey.html @@ -0,0 +1,52 @@ + + + + + + Encrypted Media Extensions: Successful Playback, Temporary session with Clear Key, mp4, play, wait for key, continue play + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + \ No newline at end of file diff --git a/encrypted-media/clearkey-mp4-playback-temporary.html b/encrypted-media/clearkey-mp4-playback-temporary.html new file mode 100644 index 00000000000000..d6ff85c37fdefc --- /dev/null +++ b/encrypted-media/clearkey-mp4-playback-temporary.html @@ -0,0 +1,53 @@ + + + + + + Encrypted Media Extensions: Successful Playback, Temporary session with Clear Key, mp4 + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + diff --git a/encrypted-media/clearkey-not-callable-after-createsession.html b/encrypted-media/clearkey-not-callable-after-createsession.html new file mode 100644 index 00000000000000..452c252735bbfb --- /dev/null +++ b/encrypted-media/clearkey-not-callable-after-createsession.html @@ -0,0 +1,36 @@ + + + + + + Encrypted Media Extensions: Test MediaKeySession not callable immediately after CreateSession(). + + + + + + + + + + + + + + + + + + + +
    + + + + diff --git a/encrypted-media/content/audio_aac-lc_128k_2keys_2sess.mp4 b/encrypted-media/content/audio_aac-lc_128k_2keys_2sess.mp4 new file mode 100644 index 00000000000000..526998d6ac9d29 Binary files /dev/null and b/encrypted-media/content/audio_aac-lc_128k_2keys_2sess.mp4 differ diff --git a/encrypted-media/content/audio_aac-lc_128k_dashinit.mp4 b/encrypted-media/content/audio_aac-lc_128k_dashinit.mp4 new file mode 100644 index 00000000000000..4daf4d5633ef0b Binary files /dev/null and b/encrypted-media/content/audio_aac-lc_128k_dashinit.mp4 differ diff --git a/encrypted-media/content/audio_aac-lc_128k_enc_dashinit.mp4 b/encrypted-media/content/audio_aac-lc_128k_enc_dashinit.mp4 new file mode 100644 index 00000000000000..77e869f80845ba Binary files /dev/null and b/encrypted-media/content/audio_aac-lc_128k_enc_dashinit.mp4 differ diff --git a/encrypted-media/content/content-metadata.js b/encrypted-media/content/content-metadata.js new file mode 100644 index 00000000000000..282b41f0ab0534 --- /dev/null +++ b/encrypted-media/content/content-metadata.js @@ -0,0 +1,199 @@ +content = addMemberListToObject( { + 'mp4-basic' : { initDataType: 'cenc', + audio : { type: 'audio/mp4;codecs="mp4a.40.2"', + path: '/encrypted-media/content/audio_aac-lc_128k_dashinit.mp4' }, + video : { type: 'video/mp4;codecs="avc1.4d401e"', + path: '/encrypted-media/content/video_512x288_h264-360k_enc_dashinit.mp4' }, + keys : [ { kid: [ 0xad, 0x13, 0xf9, 0xea, 0x2b, 0xe6, 0x98, 0xb8, 0x75, 0xf5, 0x04, 0xa8, 0xe3, 0xcc, 0xea, 0x64 ], + key: [ 0xbe, 0x7d, 0xf8, 0xa3, 0x66, 0x7a, 0x6a, 0x8f, 0xd5, 0x64, 0xd0, 0xed, 0x81, 0x33, 0x9a, 0x95 ], + initDataType: 'cenc', + initData: 'AAAAcXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAFEIARIQrRP56ivmmLh19QSo48zqZBoIY2FzdGxhYnMiKGV5SmhjM05sZEVsa0lqb2laVzFsTFhSbGMzUXRjMmx1WjJ4bEluMD0yB2RlZmF1bHQAAAMacHNzaAAAAACaBPB5mEBChquS5lvgiF+VAAAC+voCAAABAAEA8AI8AFcAUgBNAEgARQBBAEQARQBSACAAeABtAGwAbgBzAD0AIgBoAHQAdABwADoALwAvAHMAYwBoAGUAbQBhAHMALgBtAGkAYwByAG8AcwBvAGYAdAAuAGMAbwBtAC8ARABSAE0ALwAyADAAMAA3AC8AMAAzAC8AUABsAGEAeQBSAGUAYQBkAHkASABlAGEAZABlAHIAIgAgAHYAZQByAHMAaQBvAG4APQAiADQALgAwAC4AMAAuADAAIgA+ADwARABBAFQAQQA+ADwAUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEUAWQBMAEUATgA+ADEANgA8AC8ASwBFAFkATABFAE4APgA8AEEATABHAEkARAA+AEEARQBTAEMAVABSADwALwBBAEwARwBJAEQAPgA8AC8AUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEkARAA+ADYAdgBrAFQAcgBlAFkAcgB1AEoAaAAxADkAUQBTAG8ANAA4AHoAcQBaAEEAPQA9ADwALwBLAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AagBZAEYATgBmADAAeQBmADQAaQBzAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwATABBAF8AVQBSAEwAPgBoAHQAdABwADoALwAvAHAAbABhAHkAcgBlAGEAZAB5AC4AZABpAHIAZQBjAHQAdABhAHAAcwAuAG4AZQB0AC8AcAByAC8AcwB2AGMALwByAGkAZwBoAHQAcwBtAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA/AFAAbABhAHkAUgBpAGcAaAB0AD0AMQAmAGEAbQBwADsAVQBzAGUAUwBpAG0AcABsAGUATgBvAG4AUABlAHIAcwBpAHMAdABlAG4AdABMAGkAYwBlAG4AcwBlAD0AMQA8AC8ATABBAF8AVQBSAEwAPgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==' } ] + }, + + 'mp4-av-multikey' : { + initDataType: 'cenc', + associatedInitData: true, // indicates that initData for one key causes other keys to be returned as well + audio: { type: 'audio/mp4;codecs="mp4a.40.2"', + path: '/encrypted-media/content/audio_aac-lc_128k_enc_dashinit.mp4' }, + video : { type: 'video/mp4;codecs="avc1.4d401e"', + path: '/encrypted-media/content/video_512x288_h264-360k_enc_dashinit.mp4' }, + keys : [ { kid: [ 0xad, 0x13, 0xf9, 0xea, 0x2b, 0xe6, 0x98, 0xb8, 0x75, 0xf5, 0x04, 0xa8, 0xe3, 0xcc, 0xea, 0x64 ], + key: [ 0xbe, 0x7d, 0xf8, 0xa3, 0x66, 0x7a, 0x6a, 0x8f, 0xd5, 0x64, 0xd0, 0xed, 0x81, 0x33, 0x9a, 0x95 ], + initDataType: 'cenc', + initData: 'AAAAcXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAFEIARIQrRP56ivmmLh19QSo48zqZBoIY2FzdGxhYnMiKGV5SmhjM05sZEVsa0lqb2laVzFsTFhSbGMzUXRjMmx1WjJ4bEluMD0yB2RlZmF1bHQAAAMacHNzaAAAAACaBPB5mEBChquS5lvgiF+VAAAC+voCAAABAAEA8AI8AFcAUgBNAEgARQBBAEQARQBSACAAeABtAGwAbgBzAD0AIgBoAHQAdABwADoALwAvAHMAYwBoAGUAbQBhAHMALgBtAGkAYwByAG8AcwBvAGYAdAAuAGMAbwBtAC8ARABSAE0ALwAyADAAMAA3AC8AMAAzAC8AUABsAGEAeQBSAGUAYQBkAHkASABlAGEAZABlAHIAIgAgAHYAZQByAHMAaQBvAG4APQAiADQALgAwAC4AMAAuADAAIgA+ADwARABBAFQAQQA+ADwAUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEUAWQBMAEUATgA+ADEANgA8AC8ASwBFAFkATABFAE4APgA8AEEATABHAEkARAA+AEEARQBTAEMAVABSADwALwBBAEwARwBJAEQAPgA8AC8AUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEkARAA+ADYAdgBrAFQAcgBlAFkAcgB1AEoAaAAxADkAUQBTAG8ANAA4AHoAcQBaAEEAPQA9ADwALwBLAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AagBZAEYATgBmADAAeQBmADQAaQBzAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwATABBAF8AVQBSAEwAPgBoAHQAdABwADoALwAvAHAAbABhAHkAcgBlAGEAZAB5AC4AZABpAHIAZQBjAHQAdABhAHAAcwAuAG4AZQB0AC8AcAByAC8AcwB2AGMALwByAGkAZwBoAHQAcwBtAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA/AFAAbABhAHkAUgBpAGcAaAB0AD0AMQAmAGEAbQBwADsAVQBzAGUAUwBpAG0AcABsAGUATgBvAG4AUABlAHIAcwBpAHMAdABlAG4AdABMAGkAYwBlAG4AcwBlAD0AMQA8AC8ATABBAF8AVQBSAEwAPgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==' }, + { kid: [ 0x55, 0x8e, 0xe5, 0x41, 0xb9, 0x0a, 0xb2, 0xf3, 0x95, 0x0d, 0x00, 0xad, 0xe3, 0x76, 0x0d, 0x45 ], + key: [ 0x91, 0x03, 0x92, 0x63, 0x01, 0x6d, 0xa6, 0x35, 0x77, 0x0d, 0x57, 0xdb, 0x92, 0xf9, 0x8b, 0xd0 ], + initDataType : 'cenc', + initData: 'AAAAcXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAFEIARIQVY7lQbkKsvOVDQCt43YNRRoIY2FzdGxhYnMiKGV5SmhjM05sZEVsa0lqb2laVzFsTFhSbGMzUXRjMmx1WjJ4bEluMD0yB2RlZmF1bHQAAAMacHNzaAAAAACaBPB5mEBChquS5lvgiF+VAAAC+voCAAABAAEA8AI8AFcAUgBNAEgARQBBAEQARQBSACAAeABtAGwAbgBzAD0AIgBoAHQAdABwADoALwAvAHMAYwBoAGUAbQBhAHMALgBtAGkAYwByAG8AcwBvAGYAdAAuAGMAbwBtAC8ARABSAE0ALwAyADAAMAA3AC8AMAAzAC8AUABsAGEAeQBSAGUAYQBkAHkASABlAGEAZABlAHIAIgAgAHYAZQByAHMAaQBvAG4APQAiADQALgAwAC4AMAAuADAAIgA+ADwARABBAFQAQQA+ADwAUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEUAWQBMAEUATgA+ADEANgA8AC8ASwBFAFkATABFAE4APgA8AEEATABHAEkARAA+AEEARQBTAEMAVABSADwALwBBAEwARwBJAEQAPgA8AC8AUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEkARAA+AFEAZQBXAE8AVgBRAHEANQA4ADcASwBWAEQAUQBDAHQANAAzAFkATgBSAFEAPQA9ADwALwBLAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AWQBpAE8ALwAxADYATABzADkANgBFAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwATABBAF8AVQBSAEwAPgBoAHQAdABwADoALwAvAHAAbABhAHkAcgBlAGEAZAB5AC4AZABpAHIAZQBjAHQAdABhAHAAcwAuAG4AZQB0AC8AcAByAC8AcwB2AGMALwByAGkAZwBoAHQAcwBtAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA/AFAAbABhAHkAUgBpAGcAaAB0AD0AMQAmAGEAbQBwADsAVQBzAGUAUwBpAG0AcABsAGUATgBvAG4AUABlAHIAcwBpAHMAdABlAG4AdABMAGkAYwBlAG4AcwBlAD0AMQA8AC8ATABBAF8AVQBSAEwAPgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==' } ] + }, + + 'mp4-multikey' : { initDataType: 'cenc', + audio: { type: 'audio/mp4;codecs="mp4a.40.2"', + path: '/encrypted-media/content/audio_aac-lc_128k_2keys_2sess.mp4' }, + video: { type: 'video/mp4;codecs="avc1.4d401e"', + path: '/encrypted-media/content/video_512x288_h264-360k_enc_2keys_2sess.mp4' }, + keys: [ { kid: [ 0x13, 0xa7, 0x53, 0x06, 0xd1, 0x18, 0x91, 0x7b, 0x47, 0xa6, 0xc1, 0x83, 0x64, 0x42, 0x51, 0x6f ], + key: [ 0x8a, 0xaa, 0xd8, 0xc4, 0xdb, 0xde, 0xac, 0xcd, 0xad, 0x26, 0x76, 0xa1, 0xed, 0x38, 0x95, 0x2e ], + initDataType: 'cenc', + initData: 'AAAAjXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAG0IARIQE6dTBtEYkXtHpsGDZEJRbxoIY2FzdGxhYnMiRGV5SmhjM05sZEVsa0lqb2laVzFsTFhSbGMzUXRNbk5sYzNOcGIyNGlMQ0oyWVhKcFlXNTBTV1FpT2lKclpYa3hJbjA9MgdkZWZhdWx0AAADwnBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAA6KiAwAAAQABAJgDPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgBCAGwATwBuAEUAeABqAFIAZQA1AEYASABwAHMARwBEAFoARQBKAFIAYgB3AD0APQA8AC8ASwBJAEQAPgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAGwAaQBjAC4AcwB0AGEAZwBpAG4AZwAuAGQAcgBtAHQAbwBkAGEAeQAuAGMAbwBtAC8AbABpAGMAZQBuAHMAZQAtAHAAcgBvAHgAeQAtAGgAZQBhAGQAZQByAGEAdQB0AGgALwBkAHIAbQB0AG8AZABhAHkALwBSAGkAZwBoAHQAcwBNAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA8AC8ATABBAF8AVQBSAEwAPgA8AEwAVQBJAF8AVQBSAEwAPgBoAHQAdABwAHMAOgAvAC8AbABpAGMALgBzAHQAYQBnAGkAbgBnAC4AZAByAG0AdABvAGQAYQB5AC4AYwBvAG0ALwBsAGkAYwBlAG4AcwBlAC0AcAByAG8AeAB5AC0AaABlAGEAZABlAHIAYQB1AHQAaAAvAGQAcgBtAHQAbwBkAGEAeQAvAFIAaQBnAGgAdABzAE0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAFUASQBfAFUAUgBMAD4APABDAEgARQBDAEsAUwBVAE0APgBJAEQAUgB0AFAAZwBVAEkALwBiAEkAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=' }, + { kid: [ 0xee, 0x73, 0x56, 0x4e, 0xc8, 0xa8, 0x90, 0xf0, 0x78, 0xef, 0x68, 0x71, 0xfa, 0x4b, 0xe1, 0x8b ], + key: [ 0xe4, 0x4f, 0xe1, 0x45, 0x7c, 0x5e, 0xbc, 0xd8, 0x3e, 0xad, 0xdc, 0xd6, 0x2c, 0xaf, 0x55, 0x18 ], + initDataType: 'cenc', + initData: 'AAAAjXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAG0IARIQ7nNWTsiokPB472hx+kvhixoIY2FzdGxhYnMiRGV5SmhjM05sZEVsa0lqb2laVzFsTFhSbGMzUXRNbk5sYzNOcGIyNGlMQ0oyWVhKcFlXNTBTV1FpT2lKclpYa3lJbjA9MgdkZWZhdWx0AAADwnBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAA6KiAwAAAQABAJgDPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgBUAGwAWgB6ADcAcQBqAEkAOABKAEIANAA3ADIAaAB4ACsAawB2AGgAaQB3AD0APQA8AC8ASwBJAEQAPgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAGwAaQBjAC4AcwB0AGEAZwBpAG4AZwAuAGQAcgBtAHQAbwBkAGEAeQAuAGMAbwBtAC8AbABpAGMAZQBuAHMAZQAtAHAAcgBvAHgAeQAtAGgAZQBhAGQAZQByAGEAdQB0AGgALwBkAHIAbQB0AG8AZABhAHkALwBSAGkAZwBoAHQAcwBNAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA8AC8ATABBAF8AVQBSAEwAPgA8AEwAVQBJAF8AVQBSAEwAPgBoAHQAdABwAHMAOgAvAC8AbABpAGMALgBzAHQAYQBnAGkAbgBnAC4AZAByAG0AdABvAGQAYQB5AC4AYwBvAG0ALwBsAGkAYwBlAG4AcwBlAC0AcAByAG8AeAB5AC0AaABlAGEAZABlAHIAYQB1AHQAaAAvAGQAcgBtAHQAbwBkAGEAeQAvAFIAaQBnAGgAdABzAE0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAFUASQBfAFUAUgBMAD4APABDAEgARQBDAEsAUwBVAE0APgB4AEQASwBBAFkAMAB2AFoAaABVAFUAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=' } ] }, + + 'webm' : { audio : { type: 'audio/webm; codecs="opus"' }, + video : { type: 'video/webm; codecs="vp8"', + path: '/encrypted-media/content/test-encrypted.webm' }, + keys : [ { kid: [48,49,50,51,52,53,54,55,56,57,48,49,50,51,52,53], + key: [0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b, + 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c ] } ] + }, + 'webm-multikey' : + { audio : { type: 'audio/webm; codecs="opus"' }, + video : { type: 'video/webm; codecs="vp8"', + path: '/encrypted-media/content/test-encrypted-different-av-keys.webm' }, + keys : [ { kid: [48,49,50,51,52,53,54,55,56,57,48,49,50,51,52,53], + key: [ 0x7A, 0x7A, 0x62, 0xF1, 0x68, 0x14, 0xD2, 0x7B, + 0x68, 0xEF, 0x12, 0x2A, 0xFC, 0xE4, 0xAE, 0x0A ] }, + { kid: [49,50,51,52,53,54,55,56,57,48,49,50,51,52,53,54], + key: [ 0x30, 0x30, 0x62, 0xF1, 0x68, 0x14, 0xD2, 0x7B, + 0x68, 0xEF, 0x12, 0x2A, 0xFC, 0xE4, 0xAE, 0x0A ] } ] + }, +} ); + +function addMemberListToObject( o ) +{ + var items = [ ]; + for( var item in o ) + { + if ( !o.hasOwnProperty( item ) ) continue; + + o[item].name = item; + items.push( o[item] ); + } + + o._items = items; + + return o; +} + +function getInitData( contentitem, initDataType ) +{ + if (initDataType == 'webm') { + return new Uint8Array( contentitem.keys[ 0 ].kid ); // WebM initData supports only a single key + } + + if (initDataType == 'cenc') { + + var size = 36 + contentitem.keys.length * 16, + kids = contentitem.keys.map( function( k ) { return k.kid; } ); + + return new Uint8Array(Array.prototype.concat.call( [ + 0x00, 0x00, size / 256, size % 256, // size + 0x70, 0x73, 0x73, 0x68, // 'pssh' + 0x01, // version = 1 + 0x00, 0x00, 0x00, // flags + 0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02, // Common SystemID + 0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B, + 0x00, 0x00, 0x00, kids.length ], // key count ] + Array.prototype.concat.apply( [], kids ), + [ 0x00, 0x00, 0x00, 0x00 ]// datasize + )); + } + if (initDataType == 'keyids') { + + return toUtf8( { kids: contentitem.keys.map( function( k ) { return base64urlEncode( new Uint8Array( k.kid ) ); } ) } ); + } + throw 'initDataType ' + initDataType + ' not supported.'; +} + +function getSingleKeyInitData( kid, initDataType ) +{ + if (initDataType == 'webm') { + return new Uint8Array( kid ); + } + + if (initDataType == 'cenc') { + + var size = 52; + + return new Uint8Array(Array.prototype.concat.call( [ + 0x00, 0x00, size / 256, size % 256, // size + 0x70, 0x73, 0x73, 0x68, // 'pssh' + 0x01, // version = 1 + 0x00, 0x00, 0x00, // flags + 0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02, // Common SystemID + 0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B, + 0x00, 0x00, 0x00, 0x01 ], // key count ] + kid, + [ 0x00, 0x00, 0x00, 0x00 ]// datasize + )); + } + if (initDataType == 'keyids') { + + return toUtf8( { kids: [ base64urlEncode( new Uint8Array( kid ) ) ] } ); + } + throw 'initDataType ' + initDataType + ' not supported.'; +} + +function getMultikeyInitDatas( contentitem, initDataType ) +{ + return contentitem.keys.map( function( k ) { return getSingleKeyInitData( k.kid, initDataType ); } ); +} + +function getProprietaryInitDatas( contentitem ) +{ + return { initDataType: contentitem.initDataType, + initDatas : contentitem.keys.filter( function( k ) { return k.initData; } ) + .map( function( k ) { return k.initData; } ) }; +} + +// Returns a promise that resolves to true or false depending on whether the content is supported with the key system and one of the initDataTypes +function isContentSupportedForInitDataTypes( keysystem, intiDataTypes, contentitem ) +{ + var configuration = { initDataTypes : intiDataTypes, + audioCapabilities: [ { contentType: contentitem.audio.type } ], + videoCapabilities: [ { contentType: contentitem.video.type } ] + }; + return navigator.requestMediaKeySystemAccess( keysystem, [ configuration ] ) + .then( function( access ) { + return { content: contentitem, supported: true, initDataTypes: access.getConfiguration().initDataTyes }; + }, + function() { + return { content: contentitem, supported: false }; + } ); +} + +// Returns a promise that resolves to { content:, supported:, initDataTypes: } object +function isContentSupported( keysystem, contentitem ) +{ + return isContentSupportedForInitDataTypes( keysystem, [ 'cenc', 'webm', 'keyids' ], contentitem ); +} + +// Returns a Promise resolving to an array of supported content for the key system +function getSupportedContent( keysystem ) +{ + return Promise.all( content._items.map( isContentSupported.bind( null, keysystem ) ) ). + then( function( results ) + { + return results.filter( function( r ) { return r.supported; } ).map( function( r ) { return r.content; } ); + } ); +} + +// Returns a Promise resolving to an array of { content:, initDataType: } pairs for the key system +function getSupportedContentAndInitDataTypes( keysystem ) +{ + return Promise.all( content._items.map( isContentSupported.bind( null, keysystem ) ) ). + then( function( results ) + { + return results.filter( function( r ) { return r.supported; } ); + } ); +} + +// gets a configuration object for provided piece of content +function getSimpleConfigurationForContent( contentitem ) +{ + return { initDataTypes: [ 'keyids', 'webm', 'cenc' ], + audioCapabilities: [ { contentType: contentitem.audio.type } ], + videoCapabilities: [ { contentType: contentitem.video.type } ] }; +} \ No newline at end of file diff --git a/encrypted-media/content/video_512x288_h264-360k_dashinit.mp4 b/encrypted-media/content/video_512x288_h264-360k_dashinit.mp4 new file mode 100644 index 00000000000000..53a461e8ae8df8 Binary files /dev/null and b/encrypted-media/content/video_512x288_h264-360k_dashinit.mp4 differ diff --git a/encrypted-media/content/video_512x288_h264-360k_enc_2keys_2sess.mp4 b/encrypted-media/content/video_512x288_h264-360k_enc_2keys_2sess.mp4 new file mode 100644 index 00000000000000..d33f2a6c16014c Binary files /dev/null and b/encrypted-media/content/video_512x288_h264-360k_enc_2keys_2sess.mp4 differ diff --git a/encrypted-media/content/video_512x288_h264-360k_enc_dashinit.mp4 b/encrypted-media/content/video_512x288_h264-360k_enc_dashinit.mp4 new file mode 100644 index 00000000000000..156a799a9db977 Binary files /dev/null and b/encrypted-media/content/video_512x288_h264-360k_enc_dashinit.mp4 differ diff --git a/encrypted-media/drm-check-initdata-type.html b/encrypted-media/drm-check-initdata-type.html new file mode 100644 index 00000000000000..e168b789325afb --- /dev/null +++ b/encrypted-media/drm-check-initdata-type.html @@ -0,0 +1,33 @@ + + + + + + Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4 + + + + + + + + + + + + + + + + + + +
    + + + + diff --git a/encrypted-media/drm-events.html b/encrypted-media/drm-events.html new file mode 100644 index 00000000000000..dc71eecfeb5ca0 --- /dev/null +++ b/encrypted-media/drm-events.html @@ -0,0 +1,72 @@ + + + + + + Encrypted Media Extensions: Events with DRM + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + diff --git a/encrypted-media/drm-generate-request-disallowed-input.html b/encrypted-media/drm-generate-request-disallowed-input.html new file mode 100644 index 00000000000000..39ae5aea2655ee --- /dev/null +++ b/encrypted-media/drm-generate-request-disallowed-input.html @@ -0,0 +1,33 @@ + + + + + + Encrypted Media Extensions: Test handling of invalid initData for generateRequest() + + + + + + + + + + + + + + + + +
    + + + + diff --git a/encrypted-media/drm-keystatuses-multiple-sessions.html b/encrypted-media/drm-keystatuses-multiple-sessions.html new file mode 100644 index 00000000000000..3cd3c83d8d0b58 --- /dev/null +++ b/encrypted-media/drm-keystatuses-multiple-sessions.html @@ -0,0 +1,56 @@ + + + + + + Encrypted Media Extensions: Successful Playback, Temporary session with Clear Key, mp4, multiple keys for audio/video + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + diff --git a/encrypted-media/drm-keystatuses.html b/encrypted-media/drm-keystatuses.html new file mode 100644 index 00000000000000..946bfad604a0a2 --- /dev/null +++ b/encrypted-media/drm-keystatuses.html @@ -0,0 +1,54 @@ + + + + + + Encrypted Media Extensions: Verify MediaKeySession.keyStatuses with multiple sessions, DRM + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + \ No newline at end of file diff --git a/encrypted-media/drm-mp4-playback-persistent-usage-record-events.html b/encrypted-media/drm-mp4-playback-persistent-usage-record-events.html new file mode 100644 index 00000000000000..e8b9b7098664f6 --- /dev/null +++ b/encrypted-media/drm-mp4-playback-persistent-usage-record-events.html @@ -0,0 +1,54 @@ + + + + + + Encrypted Media Extensions: Successful Playback, persistent-usage-record session with DRM, mp4, event sequence + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + diff --git a/encrypted-media/drm-mp4-playback-persistent-usage-record.html b/encrypted-media/drm-mp4-playback-persistent-usage-record.html new file mode 100644 index 00000000000000..9d1cb6a118d66b --- /dev/null +++ b/encrypted-media/drm-mp4-playback-persistent-usage-record.html @@ -0,0 +1,54 @@ + + + + + + Encrypted Media Extensions: Successful Playback, persistent-usage-record session with DRM, mp4 + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + diff --git a/encrypted-media/drm-mp4-playback-retrieve-persistent-usage-record.html b/encrypted-media/drm-mp4-playback-retrieve-persistent-usage-record.html new file mode 100644 index 00000000000000..b9f7cd20be403c --- /dev/null +++ b/encrypted-media/drm-mp4-playback-retrieve-persistent-usage-record.html @@ -0,0 +1,55 @@ + + + + + + Encrypted Media Extensions: persistent-usage-record, playback and retrieve record in new window, DRM, mp4 + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + diff --git a/encrypted-media/drm-mp4-playback-temporary-events.html b/encrypted-media/drm-mp4-playback-temporary-events.html new file mode 100644 index 00000000000000..243b1ceccf4552 --- /dev/null +++ b/encrypted-media/drm-mp4-playback-temporary-events.html @@ -0,0 +1,53 @@ + + + + + + Encrypted Media Extensions: Successful playback, temporary session with DRM, mp4, validating events + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + diff --git a/encrypted-media/drm-mp4-playback-temporary-multikey-sequential.html b/encrypted-media/drm-mp4-playback-temporary-multikey-sequential.html new file mode 100644 index 00000000000000..1e68161ae813c8 --- /dev/null +++ b/encrypted-media/drm-mp4-playback-temporary-multikey-sequential.html @@ -0,0 +1,55 @@ + + + + + + Encrypted Media Extensions: Verify MediaKeySession.keyStatuses with multiple sessions, DRM + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + diff --git a/encrypted-media/drm-mp4-playback-temporary-multikey.html b/encrypted-media/drm-mp4-playback-temporary-multikey.html new file mode 100644 index 00000000000000..2fd6b45457c5bf --- /dev/null +++ b/encrypted-media/drm-mp4-playback-temporary-multikey.html @@ -0,0 +1,54 @@ + + + + + + Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4, multiple keys + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + diff --git a/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-src.html b/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-src.html new file mode 100644 index 00000000000000..5df1cc7cf2b9c4 --- /dev/null +++ b/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-src.html @@ -0,0 +1,54 @@ + + + + + + Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4 + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + \ No newline at end of file diff --git a/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-update.html b/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-update.html new file mode 100644 index 00000000000000..dc94fb96e360d5 --- /dev/null +++ b/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-update.html @@ -0,0 +1,54 @@ + + + + + + Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4 + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + \ No newline at end of file diff --git a/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-immediately.html b/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-immediately.html new file mode 100644 index 00000000000000..bc371321f23338 --- /dev/null +++ b/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-immediately.html @@ -0,0 +1,54 @@ + + + + + + Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4 + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + diff --git a/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-onencrypted.html b/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-onencrypted.html new file mode 100644 index 00000000000000..c17442a7883f95 --- /dev/null +++ b/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-onencrypted.html @@ -0,0 +1,54 @@ + + + + + + Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4 + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + \ No newline at end of file diff --git a/encrypted-media/drm-mp4-playback-temporary-two-videos.html b/encrypted-media/drm-mp4-playback-temporary-two-videos.html new file mode 100644 index 00000000000000..2e914bfdde0c4b --- /dev/null +++ b/encrypted-media/drm-mp4-playback-temporary-two-videos.html @@ -0,0 +1,55 @@ + + + + + + Encrypted Media Extensions: Successful Playback, Temporary session with Clear Key, mp4, two videos + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + +
    + + + + diff --git a/encrypted-media/drm-mp4-playback-temporary-waitingforkey.html b/encrypted-media/drm-mp4-playback-temporary-waitingforkey.html new file mode 100644 index 00000000000000..2f21eb2c6144e1 --- /dev/null +++ b/encrypted-media/drm-mp4-playback-temporary-waitingforkey.html @@ -0,0 +1,52 @@ + + + + + + Encrypted Media Extensions: Verify MediaKeySession.keyStatuses with multiple sessions, DRM + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + \ No newline at end of file diff --git a/encrypted-media/drm-mp4-playback-temporary.html b/encrypted-media/drm-mp4-playback-temporary.html new file mode 100644 index 00000000000000..60fd50b18077db --- /dev/null +++ b/encrypted-media/drm-mp4-playback-temporary.html @@ -0,0 +1,53 @@ + + + + + + Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4 + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + diff --git a/encrypted-media/drm-not-callable-after-createsession.html b/encrypted-media/drm-not-callable-after-createsession.html new file mode 100644 index 00000000000000..a40519225f7d5a --- /dev/null +++ b/encrypted-media/drm-not-callable-after-createsession.html @@ -0,0 +1,36 @@ + + + + + + Encrypted Media Extensions: Test MediaKeySession not callable immediately after CreateSession(). + + + + + + + + + + + + + + + + + + + +
    + + + + diff --git a/encrypted-media/idlharness.html b/encrypted-media/idlharness.html new file mode 100644 index 00000000000000..e65ad5e30ba275 --- /dev/null +++ b/encrypted-media/idlharness.html @@ -0,0 +1,51 @@ + + + + + Encrypted Media Extentions IDL test + + + + + + + + + +

    Description

    +

    + This test verifies that implementations of the Encrypted Media Extensions API match its WebIDL definition. +

    + +
    + + + + diff --git a/encrypted-media/polyfill/cast-polyfill.js b/encrypted-media/polyfill/cast-polyfill.js new file mode 100644 index 00000000000000..576e0ad04066d3 --- /dev/null +++ b/encrypted-media/polyfill/cast-polyfill.js @@ -0,0 +1,80 @@ +(function() { + + if ( /CrKey\/[0-9]+\.[0-9a-z]+\.[0-9a-z]+/i.exec( navigator.userAgent ) ) { + + var castscript = document.createElement('script'); + castscript.type = 'text/javascript'; + castscript.src = 'https://www.gstatic.com/cast/sdk/libs/receiver/2.0.0/cast_receiver.js' + document.head.appendChild( castscript ); + + var _requestMediaKeySystemAccess = navigator.requestMediaKeySystemAccess.bind( navigator ), + _setMediaKeys = HTMLMediaElement.prototype.setMediaKeys, + _load = MediaKeySession.prototype.load; + + MediaKeySession.prototype.load = function load() + { + return _load.call( this ).then( function( success ) + { + return success ? this.remove() : false; + }.bind( this ) ); + }; + + function MediaKeys( mediaKeys ) + { + this._mediaKeys = mediaKeys; + } + + MediaKeys.prototype.setServerCertificate = function setServerCertificate( certificate ) + { + return this._mediaKeys.setServerCertificate( certificate ); + }; + + MediaKeys.prototype.createSession = function createSession( sessionType ) { + + if ( sessionType === 'persistent-usage-record' ) + { + return cast.receiver.eme.KeySession.createSession( this._mediaKeys, 'persistent-release-message' ); + } + + return this._mediaKeys.createSession( sessionType ); + }; + + function MediaKeySystemAccess( access ) + { + this._access = mediaKeySystemAccess; + } + + Object.defineProperty( MediaKeySystemAccess.prototype, 'keySystem', { get: function() { return this._access.keySystem; } } ); + + MediaKeySystemAccess.prototype.getConfiguration = function getConfiguration() { return this._access.getConfiguration(); }; + + MediaKeySystemAccess.prototype.createMediaKeys = function createMediaKeys() { + + return this._access.createMediaKey().then( function( mediaKeys ) { return new MediaKeys( mediaKeys ); } ); + + }; + + HTMLMediaElement.prototype.setMediaKeys = function setMediaKeys( mediaKeys ) + { + if ( mediaKeys instanceof MediaKeys ) + { + return _setMediaKeys.call( this, mediaKeys._mediaKeys ); + } + else + { + return _setMediaKeys.call( this, mediaKeys ); + } + }; + + navigator.requestMediaKeySystemAccess = function requestMediaKeySystemAccess( keysystem, supportedConfigurations ) { + + if ( keysystem !== 'com.chromecast.playready' ) + { + return _requestMediaKeySystemAccess( keysystem, supportedConfigurations ); + } + + return _requestMediaKeySystemAccess( keysystem, supportedConfigurations ) + .then( function( access ) { return new MediaKeySystemAccess( access ); } ); + }; + } +})(); \ No newline at end of file diff --git a/encrypted-media/polyfill/chrome-polyfill.js b/encrypted-media/polyfill/chrome-polyfill.js new file mode 100644 index 00000000000000..346da6c67cc642 --- /dev/null +++ b/encrypted-media/polyfill/chrome-polyfill.js @@ -0,0 +1,36 @@ +(function(){ + if(navigator.userAgent.toLowerCase().indexOf('chrome') > -1){ + + if ( ( /chrome\/([0-9]*)\./.exec( navigator.userAgent.toLowerCase() )[1] | 0 ) < 54 ) { + + // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=622956 + // Chrome does not fire the empty keystatuschange event when a session is closed + var _mediaKeySessionClose = MediaKeySession.prototype.close; + var _mediaKeySessionKeyStatusesGetter = Object.getOwnPropertyDescriptor( MediaKeySession.prototype, 'keyStatuses' ).get; + var _emptyMediaKeyStatusMap = { size: 0, + has: function() { return false; }, + get: function() { return undefined; }, + entries:function() { return []; }, // this may not be correct, I think it should be some iterator thing + keys: function() { return []; }, + values: function() { return []; }, + forEach:function() { return; } }; + + MediaKeySession.prototype.close = function close() + { + this.__closed = true; + + setTimeout( function() { + this.dispatchEvent( new Event( 'keystatuseschange' ) ); + }.bind( this ), 0 ); + + return _mediaKeySessionClose.call( this ); + }; + + Object.defineProperty( MediaKeySession.prototype, 'keyStatuses', { get: function() { + + return this.__closed ? _emptyMediaKeyStatusMap : _mediaKeySessionKeyStatusesGetter.call( this ); + + } } ); + } + } +}()); diff --git a/encrypted-media/polyfill/clearkey-polyfill.js b/encrypted-media/polyfill/clearkey-polyfill.js new file mode 100644 index 00000000000000..27961a6a80f411 --- /dev/null +++ b/encrypted-media/polyfill/clearkey-polyfill.js @@ -0,0 +1,510 @@ +(function(){ + + // Save platform functions that will be modified + var _requestMediaKeySystemAccess = navigator.requestMediaKeySystemAccess.bind( navigator ), + _setMediaKeys = HTMLMediaElement.prototype.setMediaKeys; + + // Allow us to modify the target of Events + Object.defineProperties( Event.prototype, { + target: { get: function() { return this._target || this.currentTarget; }, + set: function( newtarget ) { this._target = newtarget; } } + } ); + + var EventTarget = function(){ + this.listeners = {}; + }; + + EventTarget.prototype.listeners = null; + + EventTarget.prototype.addEventListener = function(type, callback){ + if(!(type in this.listeners)) { + this.listeners[type] = []; + } + this.listeners[type].push(callback); + }; + + EventTarget.prototype.removeEventListener = function(type, callback){ + if(!(type in this.listeners)) { + return; + } + var stack = this.listeners[type]; + for(var i = 0, l = stack.length; i < l; i++){ + if(stack[i] === callback){ + stack.splice(i, 1); + return this.removeEventListener(type, callback); + } + } + }; + + EventTarget.prototype.dispatchEvent = function(event){ + if(!(event.type in this.listeners)) { + return; + } + var stack = this.listeners[event.type]; + event.target = this; + for(var i = 0, l = stack.length; i < l; i++) { + stack[i].call(this, event); + } + }; + + function MediaKeySystemAccessProxy( keysystem, access, configuration ) + { + this._keysystem = keysystem; + this._access = access; + this._configuration = configuration; + } + + Object.defineProperties( MediaKeySystemAccessProxy.prototype, { + keysystem: { get: function() { return this._keysystem; } } + }); + + MediaKeySystemAccessProxy.prototype.getConfiguration = function getConfiguration() + { + return this._configuration; + }; + + MediaKeySystemAccessProxy.prototype.createMediaKeys = function createMediaKeys() + { + return new Promise( function( resolve, reject ) { + + this._access.createMediaKeys() + .then( function( mediaKeys ) { resolve( new MediaKeysProxy( mediaKeys ) ); }) + .catch( function( error ) { reject( error ); } ); + + }.bind( this ) ); + }; + + function MediaKeysProxy( mediaKeys ) + { + this._mediaKeys = mediaKeys; + this._sessions = [ ]; + this._videoelement = undefined; + this._onTimeUpdateListener = MediaKeysProxy.prototype._onTimeUpdate.bind( this ); + } + + MediaKeysProxy.prototype._setVideoElement = function _setVideoElement( videoElement ) + { + if ( videoElement !== this._videoelement ) + { + if ( this._videoelement ) + { + this._videoelement.removeEventListener( 'timeupdate', this._onTimeUpdateListener ); + } + + this._videoelement = videoElement; + + if ( this._videoelement ) + { + this._videoelement.addEventListener( 'timeupdate', this._onTimeUpdateListener ); + } + } + }; + + MediaKeysProxy.prototype._onTimeUpdate = function( event ) + { + this._sessions.forEach( function( session ) { + + if ( session._sessionType === 'persistent-usage-record' ) + { + session._onTimeUpdate( event ); + } + + } ); + }; + + MediaKeysProxy.prototype._removeSession = function _removeSession( session ) + { + var index = this._sessions.indexOf( session ); + if ( index !== -1 ) this._sessions.splice( index, 1 ); + }; + + MediaKeysProxy.prototype.createSession = function createSession( sessionType ) + { + if ( !sessionType || sessionType === 'temporary' ) return this._mediaKeys.createSession(); + + var session = new MediaKeySessionProxy( this, sessionType ); + this._sessions.push( session ); + + return session; + }; + + MediaKeysProxy.prototype.setServerCertificate = function setServerCertificate( certificate ) + { + return this._mediaKeys.setServerCertificate( certificate ); + }; + + function MediaKeySessionProxy( mediaKeysProxy, sessionType ) + { + EventTarget.call( this ); + + this._mediaKeysProxy = mediaKeysProxy + this._sessionType = sessionType; + this._sessionId = ""; + + // MediaKeySessionProxy states + // 'created' - After initial creation + // 'loading' - Persistent license session waiting for key message to load stored keys + // 'active' - Normal active state - proxy all key messages + // 'removing' - Release message generated, waiting for ack + // 'closed' - Session closed + this._state = 'created'; + + this._closed = new Promise( function( resolve ) { this._resolveClosed = resolve; }.bind( this ) ); + } + + MediaKeySessionProxy.prototype = Object.create( EventTarget.prototype ); + + Object.defineProperties( MediaKeySessionProxy.prototype, { + + sessionId: { get: function() { return this._sessionId; } }, + expiration: { get: function() { return NaN; } }, + closed: { get: function() { return this._closed; } }, + keyStatuses:{ get: function() { return this._session.keyStatuses; } }, // TODO this will fail if examined too early + _kids: { get: function() { return this._keys.map( function( key ) { return key.kid; } ); } }, + }); + + MediaKeySessionProxy.prototype._createSession = function _createSession() + { + this._session = this._mediaKeysProxy._mediaKeys.createSession(); + + this._session.addEventListener( 'message', MediaKeySessionProxy.prototype._onMessage.bind( this ) ); + this._session.addEventListener( 'keystatuseschange', MediaKeySessionProxy.prototype._onKeyStatusesChange.bind( this ) ); + }; + + MediaKeySessionProxy.prototype._onMessage = function _onMessage( event ) + { + switch( this._state ) + { + case 'loading': + this._session.update( toUtf8( { keys: this._keys } ) ) + .then( this._loaded( true ) ) + .catch( this._loadfailed ); + + break; + + case 'active': + this.dispatchEvent( event ); + break; + + default: + // Swallow the event + break; + } + }; + + MediaKeySessionProxy.prototype._onKeyStatusesChange = function _onKeyStatusesChange( event ) + { + switch( this._state ) + { + case 'active' : + case 'removing' : + this.dispatchEvent( event ); + break; + + default: + // Swallow the event + break; + } + }; + + MediaKeySessionProxy.prototype._onTimeUpdate = function _onTimeUpdate( event ) + { + if ( !this._firstTime ) this._firstTime = Date.now(); + this._latestTime = Date.now(); + this._store(); + }; + + MediaKeySessionProxy.prototype._queueMessage = function _queueMessage( messageType, message ) + { + setTimeout( function() { + + var messageAsArray = toUtf8( message ).buffer; + + this.dispatchEvent( new MediaKeyMessageEvent( 'message', { messageType: messageType, message: messageAsArray } ) ); + + }.bind( this ) ); + }; + + function _storageKey( sessionId ) + { + return sessionId; + } + + MediaKeySessionProxy.prototype._store = function _store() + { + var data; + + if ( this._sessionType === 'persistent-usage-record' ) + { + data = { kids: this._kids }; + if ( this._firstTime ) data.firstTime = this._firstTime; + if ( this._latestTime ) data.latestTime = this._latestTime; + } + else + { + data = { keys: this._keys }; + } + + window.localStorage.setItem( _storageKey( this._sessionId ), JSON.stringify( data ) ); + }; + + MediaKeySessionProxy.prototype._load = function _load( sessionId ) + { + var store = window.localStorage.getItem( _storageKey( sessionId ) ); + if ( store === null ) return false; + + var data; + try { data = JSON.parse( store ) } catch( error ) { + return false; + } + + if ( data.kids ) + { + this._sessionType = 'persistent-usage-record'; + this._keys = data.kids.map( function( kid ) { return { kid: kid }; } ); + if ( data.firstTime ) this._firstTime = data.firstTime; + if ( data.latestTime ) this._latestTime = data.latestTime; + } + else + { + this._sessionType = 'persistent-license'; + this._keys = data.keys; + } + + return true; + }; + + MediaKeySessionProxy.prototype._clear = function _clear() + { + window.localStorage.removeItem( _storageKey( this._sessionId ) ); + }; + + MediaKeySessionProxy.prototype.generateRequest = function generateRequest( initDataType, initData ) + { + if ( this._state !== 'created' ) return Promise.reject( new InvalidStateError() ); + + this._createSession(); + + this._state = 'active'; + + return this._session.generateRequest( initDataType, initData ) + .then( function() { + this._sessionId = Math.random().toString(36).slice(2); + }.bind( this ) ); + }; + + MediaKeySessionProxy.prototype.load = function load( sessionId ) + { + if ( this._state !== 'created' ) return Promise.reject( new InvalidStateError() ); + + return new Promise( function( resolve, reject ) { + + try + { + if ( !this._load( sessionId ) ) + { + resolve( false ); + + return; + } + + if ( this._sessionType === 'persistent-usage-record' ) + { + var msg = { kids: this._kids }; + if ( this._firstTime ) msg.firstTime = this._firstTime; + if ( this._latestTime ) msg.latestTime = this._latestTime; + + this._queueMessage( 'license-release', msg ); + + this._state = 'removing'; + + resolve( true ); + } + else + { + this._createSession(); + + this._state = 'loading'; + this._loaded = resolve; + this._loadfailed = reject; + + var initData = { kids: this._kids }; + + this._session.generateRequest( 'keyids', toUtf8( initData ) ); + } + } + catch( error ) + { + reject( error ); + } + }.bind( this ) ); + }; + + MediaKeySessionProxy.prototype.update = function update( response ) + { + return new Promise( function( resolve, reject ) { + + switch( this._state ) { + + case 'active' : + + var message = fromUtf8( response ); + + // JSON Web Key Set + this._keys = message.keys; + + this._store(); + + resolve( this._session.update( response ) ); + + break; + + case 'removing' : + + this._state = 'closed'; + + this._clear(); + + this._mediaKeysProxy._removeSession( this ); + + this._resolveClosed(); + + delete this._session; + + resolve(); + + break; + + default: + reject( new InvalidStateError() ); + } + + }.bind( this ) ); + }; + + MediaKeySessionProxy.prototype.close = function close() + { + if ( this._state === 'closed' ) return Promise.resolve(); + + this._state = 'closed'; + + this._mediaKeysProxy._removeSession( this ); + + this._resolveClosed(); + + var session = this._session; + if ( !session ) return Promise.resolve(); + + this._session = undefined; + + return session.close(); + }; + + MediaKeySessionProxy.prototype.remove = function remove() + { + if ( this._state !== 'active' || !this._session ) return Promise.reject( new DOMException('InvalidStateError') ); + + this._state = 'removing'; + + this._mediaKeysProxy._removeSession( this ); + + return this._session.close() + .then( function() { + + var msg = { kids: this._kids }; + + if ( this._sessionType === 'persistent-usage-record' ) + { + if ( this._firstTime ) msg.firstTime = this._firstTime; + if ( this._latestTime ) msg.latestTime = this._latestTime; + } + else + { + this._clear(); + } + + this._queueMessage( 'license-release', msg ); + + }.bind( this ) ) + }; + + HTMLMediaElement.prototype.setMediaKeys = function setMediaKeys( mediaKeys ) + { + if ( mediaKeys instanceof MediaKeysProxy ) + { + mediaKeys._setVideoElement( this ); + return _setMediaKeys.call( this, mediaKeys._mediaKeys ); + } + else + { + return _setMediaKeys.call( this, mediaKeys ); + } + }; + + navigator.requestMediaKeySystemAccess = function( keysystem, configurations ) + { + // First, see if this is supported by the platform + return new Promise( function( resolve, reject ) { + + _requestMediaKeySystemAccess( keysystem, configurations ) + .then( function( access ) { resolve( access ); } ) + .catch( function( error ) { + + if ( error instanceof TypeError ) reject( error ); + + if ( keysystem !== 'org.w3.clearkey' ) reject( error ); + + if ( !configurations.some( is_persistent_configuration ) ) reject( error ); + + // Shallow copy the configurations, swapping out the labels and omitting the sessiontypes + var configurations_copy = configurations.map( function( config, index ) { + + var config_copy = copy_configuration( config ); + config_copy.label = index.toString(); + return config_copy; + + } ); + + // And try again with these configurations + _requestMediaKeySystemAccess( keysystem, configurations_copy ) + .then( function( access ) { + + // Create the supported configuration based on the original request + var configuration = access.getConfiguration(), + original_configuration = configurations[ configuration.label ]; + + // If the original configuration did not need persistent session types, then we're done + if ( !is_persistent_configuration( original_configuration ) ) resolve( access ); + + // Create the configuration that we will return + var returned_configuration = copy_configuration( configuration ); + + if ( original_configuration.label ) + returned_configuration.label = original_configuration; + else + delete returned_configuration.label; + + returned_configuration.sessionTypes = original_configuration.sessionTypes; + + resolve( new MediaKeySystemAccessProxy( keysystem, access, returned_configuration ) ); + } ) + .catch( function( error ) { reject( error ); } ); + } ); + } ); + }; + + function is_persistent_configuration( configuration ) + { + return configuration.sessionTypes && + ( configuration.sessionTypes.indexOf( 'persistent-usage-record' ) !== -1 + || configuration.sessionTypes.indexOf( 'persistent-license' ) !== -1 ); + } + + function copy_configuration( src ) + { + var dst = {}; + [ 'label', 'initDataTypes', 'audioCapabilities', 'videoCapabilities', 'distinctiveIdenfifier', 'persistentState' ] + .forEach( function( item ) { if ( src[item] ) dst[item] = src[item]; } ); + return dst; + } +}()); \ No newline at end of file diff --git a/encrypted-media/polyfill/edge-polyfill.js b/encrypted-media/polyfill/edge-polyfill.js new file mode 100644 index 00000000000000..7f86f0c05895a2 --- /dev/null +++ b/encrypted-media/polyfill/edge-polyfill.js @@ -0,0 +1,193 @@ +(function() { + + // This polyfill fixes the following problems with Edge browser + // (1) To retrieve a persisted usage record, you must use session type 'persistent-release-message' instead of 'persistent-usage-record' + // (2) To retrieve a persisted usage record, you must call remove() after calling load() + // (3) On providing a license release acknowledgement, the session does not automatically close as is should + // (4) Retrieval of the usage record at the end of an active session is not supported + + if ( navigator.userAgent.toLowerCase().indexOf('edge') > -1 ) { + + var _mediaKeySystemAccessCreateMediaKeys = MediaKeySystemAccess.prototype.createMediaKeys; + _mediaKeysCreateSession = MediaKeys.prototype.createSession; + + // MediaKeySession proxy + function MediaKeySession( mediaKeys, session ) + { + EventTarget.call( this ); + + this._mediaKeys = mediaKeys; + this._session = session; + this._sessionId = undefined; + this._removing = false; + + session.addEventListener( 'message', this.dispatchEvent.bind( this ) ); + session.addEventListener( 'keystatuseschange', this.dispatchEvent.bind( this ) ); + session.closed.then( function() { if ( !this._removing ) this._resolveClosed(); }.bind ( this ) ); + + this._closed = new Promise( function( resolve ) { this._resolveClosed = resolve; }.bind( this ) ); + } + + MediaKeySession.prototype = Object.create( EventTarget.prototype ); + + Object.defineProperties( MediaKeySession.prototype, { + sessionId: { get: function() { return this._sessionId ? this._sessionId : this._session.sessionId; } }, + expiration: { get: function() { return this._session.expiration; } }, + closed: { get: function() { return this._closed; } }, + keyStatuses:{ get: function() { return this._session.keyStatuses; } } + }); + + // load() + // + // Use a surrogate 'persistent-release-message' session to obtain the release message + // + MediaKeySession.prototype.load = function load( sessionId ) + { + if ( this.sessionId ) return Promise.reject( new DOMException('InvalidAccessError') ); + + this._surrogate = this._mediaKeys.createSession( 'persistent-release-message' ); + this._surrogate.addEventListener( 'message', this.dispatchEvent.bind( this ) ); + + return this._surrogate.load( sessionId ).then( function( success ) { + if (!success) return false; + + this._sessionId = sessionId; + this._removing = true; + this._session.close(); + + return this._surrogate.remove().then( function() { return true; } ); + }.bind( this ) ); + }; + + // remove() + // + // On an existing session, use a surrogate 'persistent-release-message' session to obtain the release message + // + MediaKeySession.prototype.remove = function remove() + { + if ( this._sessionId !== undefined ) return Promise.reject( new DOMException('InvalidAccessError') ); + if ( this.sessionId === undefined ) return Promise.reject( new DOMException('InvalidAccessError') ); + + this._surrogate = this._mediaKeys.createSession( 'persistent-release-message' ); + this._surrogate.addEventListener( 'message', this.dispatchEvent.bind( this ) ); + this._removing = true; + this._sessionId = this._session.sessionId; + + var self = this; + + return Promise.all( [ self._session.close(), self._session.closed ] ).then( function() { + return self._surrogate.load( self._sessionId ); + }).then( function( success ) { + if ( !success ) { + throw new DOMException('InvalidAccessError'); + } + + return self._surrogate.remove(); + }).then( function() { return true; } ); + } + + // update() + // + // For a normal session, pass through, otherwise update the surrogate and close the proxy + MediaKeySession.prototype.update = function update( message ) + { + if ( !this._removing ) return this._session.update( message ); + + return this._surrogate.update( message ).then( function() { + this._sessionId = undefined; + this._resolveClosed(); + }.bind( this ) ); + }; + + // close() - pass through + // + MediaKeySession.prototype.close = function close() + { + if ( !this._removing ) return this._session.close(); + this._resolveClosed(); + return Promise.resolve(); + }; + + // generateRequest() - pass through + // + MediaKeySession.prototype.generateRequest = function generateRequest( initDataType, initData ) + { + if ( this.sessionId ) Promise.reject( new DOMException('InvalidAccessError') ); + return this._session.generateRequest( initDataType, initData ); + }; + + // Wrap PlayReady persistent-usage-record sessions in our Proxy + MediaKeys.prototype.createSession = function createSession( sessionType ) { + + var session = _mediaKeysCreateSession.call( this, sessionType ); + if ( this._keySystem !== 'com.microsoft.playready' || sessionType !== 'persistent-usage-record' ) + { + return session; + } + + return new MediaKeySession( this, session ); + + }; + + // + // Annotation polyfills - annotate not otherwise available data + // + + // Annotate MediaKeys with the keysystem + MediaKeySystemAccess.prototype.createMediaKeys = function createMediaKeys() + { + return _mediaKeySystemAccessCreateMediaKeys.call( this ).then( function( mediaKeys ) { + mediaKeys._keySystem = this.keySystem; + return mediaKeys; + }.bind( this ) ); + }; + + // + // Utilities + // + + // Allow us to modify the target of Events + Object.defineProperties( Event.prototype, { + target: { get: function() { return this._target || this.currentTarget; }, + set: function( newtarget ) { this._target = newtarget; } } + } ); + + // Make an EventTarget base class + function EventTarget(){ + this.listeners = {}; + }; + + EventTarget.prototype.listeners = null; + + EventTarget.prototype.addEventListener = function(type, callback){ + if(!(type in this.listeners)) { + this.listeners[type] = []; + } + this.listeners[type].push(callback); + }; + + EventTarget.prototype.removeEventListener = function(type, callback){ + if(!(type in this.listeners)) { + return; + } + var stack = this.listeners[type]; + for(var i = 0, l = stack.length; i < l; i++){ + if(stack[i] === callback){ + stack.splice(i, 1); + return this.removeEventListener(type, callback); + } + } + }; + + EventTarget.prototype.dispatchEvent = function(event){ + if(!(event.type in this.listeners)) { + return; + } + var stack = this.listeners[event.type]; + event.target = this; + for(var i = 0, l = stack.length; i < l; i++) { + stack[i].call(this, event); + } + }; + } +})(); diff --git a/encrypted-media/polyfill/firefox-polyfill.js b/encrypted-media/polyfill/firefox-polyfill.js new file mode 100644 index 00000000000000..0e42187971f5bf --- /dev/null +++ b/encrypted-media/polyfill/firefox-polyfill.js @@ -0,0 +1,23 @@ +(function(){ + if(navigator.userAgent.toLowerCase().indexOf('firefox') > -1){ + + // Work around https://bugzilla.mozilla.org/show_bug.cgi?id=1282142 + // Firefox does not correctly reject the Clear Key session types it does not support + var _requestMediaKeySystemAccess = navigator.requestMediaKeySystemAccess.bind( navigator ); + + navigator.requestMediaKeySystemAccess = function( keysystem, configurations ) + { + if ( keysystem !== 'org.w3.clearkey' ) return _requestMediaKeySystemAccess( keysystem, configurations ); + + var supported_configurations = configurations.filter( function( c ) { + + return !c.sessionTypes || ( c.sessionTypes.length === 1 && c.sessionTypes[ 0 ] === 'temporary' ); + + } ); + + if ( supported_configurations.length === 0 ) return Promise.reject( new DOMException( 'None of the requested configurations were supported.' ) ); + + return _requestMediaKeySystemAccess( keysystem, supported_configurations ); + } + } +}()) \ No newline at end of file diff --git a/encrypted-media/polyfill/make-polyfill-tests.py b/encrypted-media/polyfill/make-polyfill-tests.py new file mode 100644 index 00000000000000..7e7dc496e80a5a --- /dev/null +++ b/encrypted-media/polyfill/make-polyfill-tests.py @@ -0,0 +1,28 @@ +#!/usr/bin/python +import os, re, os.path, glob + +head = re.compile( r"^(\s*)", re.MULTILINE ) +runtest = re.compile( r"runTest\(\s*(\S.*?)\s*\)", re.DOTALL ) + +scripts = ''' + + + + + ''' + +def process_file( infile, outfile ) : + with open( outfile, "w" ) as output : + with open( infile, "r" ) as input : + output.write( runtest.sub( r"runTest( \1, 'polyfill: ' )", head.sub( scripts + r"\1", input.read() ) ) ) + +if __name__ == '__main__' : + if (not os.getcwd().endswith('polyfill')) : + print "Please run from polyfill directory" + exit( 1 ) + + for infile in glob.glob( "../*.html" ) : + process_file( infile, os.path.basename( infile ) ) + + for infile in glob.glob( "../resources/*.html" ) : + process_file( infile, os.path.join( "resources", os.path.basename( infile ) ) ) \ No newline at end of file diff --git a/encrypted-media/resources/clearkey-retrieve-persistent-license.html b/encrypted-media/resources/clearkey-retrieve-persistent-license.html new file mode 100644 index 00000000000000..5b2369fd417710 --- /dev/null +++ b/encrypted-media/resources/clearkey-retrieve-persistent-license.html @@ -0,0 +1,90 @@ + + + + + + Encrypted Media Extensions: Retrieve stored persistent-license + + + + + + + + + + + + + +
    + +
    + +
    + + + + diff --git a/encrypted-media/resources/drm-retrieve-persistent-usage-record.html b/encrypted-media/resources/drm-retrieve-persistent-usage-record.html new file mode 100644 index 00000000000000..8831e6999cf932 --- /dev/null +++ b/encrypted-media/resources/drm-retrieve-persistent-usage-record.html @@ -0,0 +1,72 @@ + + + + + + Encrypted Media Extensions: Retrieve stored persistent-usage-record + + + + + + + + + + + + +
    + + + + diff --git a/encrypted-media/resources/retrieve-persistent-usage-record.html b/encrypted-media/resources/retrieve-persistent-usage-record.html new file mode 100644 index 00000000000000..3bfbb52e540364 --- /dev/null +++ b/encrypted-media/resources/retrieve-persistent-usage-record.html @@ -0,0 +1,94 @@ + + + + + + Encrypted Media Extensions: Retrieve stored persistent-usage-record + + + + + + + + + + + + +
    + + + + \ No newline at end of file diff --git a/encrypted-media/scripts/check-initdata-type.js b/encrypted-media/scripts/check-initdata-type.js new file mode 100644 index 00000000000000..8f2937def06712 --- /dev/null +++ b/encrypted-media/scripts/check-initdata-type.js @@ -0,0 +1,35 @@ + function runTest( config, qualifier ) + { + function checkInitDataType(initDataType) + { + return isInitDataTypeSupported(initDataType).then(function(result) { + // If |initDataType| is not supported, simply succeed. + if (!result) + return Promise.resolve('Not supported'); + + return navigator.requestMediaKeySystemAccess( config.keysystem, getSimpleConfigurationForInitDataType(initDataType)) + .then(function(access) { + return access.createMediaKeys(); + }).then(function(mediaKeys) { + var mediaKeySession = mediaKeys.createSession(); + var initData = getInitData(initDataType); + return mediaKeySession.generateRequest(initDataType, initData); + }); + }); + } + + promise_test(function() + { + return checkInitDataType('webm'); + }, ( qualifier || '' ) + config.keysystem + ' support for "webm".'); + + promise_test(function() + { + return checkInitDataType('cenc'); + }, ( qualifier || '' ) + config.keysystem + ' support for "cenc".'); + + promise_test(function() + { + return checkInitDataType('keyids'); + }, ( qualifier || '' ) + config.keysystem + ' support for "keyids".'); +} diff --git a/encrypted-media/scripts/events.js b/encrypted-media/scripts/events.js new file mode 100644 index 00000000000000..47e2f40449c4f0 --- /dev/null +++ b/encrypted-media/scripts/events.js @@ -0,0 +1,64 @@ +function runTest(config,qualifier) { + + var testname = ( qualifier || '' ) + config.keysystem + ', events'; + + var configuration = getSimpleConfigurationForContent( config.content ); + + if ( config.initDataType && config.initData ) configuration.initDataTypes = [ config.initDataType ] + + async_test(function(test) + { + var initDataType; + var initData; + var mediaKeySession; + + function processMessage(event) + { + assert_true(event instanceof window.MediaKeyMessageEvent); + assert_equals(event.target, mediaKeySession); + assert_equals(event.type, 'message'); + assert_any( assert_equals, + event.messageType, + [ 'license-request', 'individualization-request' ] ); + + config.messagehandler( event.messageType, event.message ).then( function( response ) { + + waitForEventAndRunStep('keystatuseschange', mediaKeySession, test.step_func(processKeyStatusesChange), test); + mediaKeySession.update( response ).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + }); + } + + function processKeyStatusesChange(event) + { + assert_true(event instanceof Event); + assert_equals(event.target, mediaKeySession); + assert_equals(event.type, 'keystatuseschange'); + test.done(); + } + + navigator.requestMediaKeySystemAccess( config.keysystem, [ configuration ] ).then(function(access) { + + initDataType = access.getConfiguration().initDataTypes[0]; + + if ( config.initDataType && config.initData ) + { + initData = config.initData; + } + else + { + initData = getInitData(config.content, initDataType); + } + + return access.createMediaKeys(); + }).then(test.step_func(function(mediaKeys) { + mediaKeySession = mediaKeys.createSession(); + waitForEventAndRunStep('message', mediaKeySession, test.step_func(processMessage), test); + return mediaKeySession.generateRequest(initDataType, initData); + })).catch(test.step_func(function(error) { + forceTestFailureFromPromise(test, error); + })); + }, testname ); + +} diff --git a/encrypted-media/scripts/generate-request-disallowed-input.js b/encrypted-media/scripts/generate-request-disallowed-input.js new file mode 100644 index 00000000000000..f57fa4087f3423 --- /dev/null +++ b/encrypted-media/scripts/generate-request-disallowed-input.js @@ -0,0 +1,92 @@ +function runTest(config,qualifier) { + + // Create a session and call generateRequest() with |initDataType| + // and |initData|. generateRequest() should fail with an + // InvalidAccessError. Returns a promise that resolves successfully + // if the error happened, rejects otherwise. + function test_session(keysystem,initDataType, initData) + { + return isInitDataTypeSupported(initDataType).then(function(result) { + // If |initDataType| is not supported, simply succeed. + if (!result) + return Promise.resolve('Not supported'); + + return navigator.requestMediaKeySystemAccess( keysystem, getSimpleConfigurationForInitDataType(initDataType)).then(function(access) { + return access.createMediaKeys(); + }).then(function(mediaKeys) { + var mediaKeySession = mediaKeys.createSession(); + return mediaKeySession.generateRequest(initDataType, initData); + }).then(function() { + assert_unreached('generateRequest() succeeded'); + }, function(error) { + assert_equals(error.name, 'InvalidAccessError'); + return Promise.resolve('success'); + }); + }) + } + + promise_test(function() + { + var initData = new Uint8Array(70000); + return test_session(config.keysystem,'webm', initData); + }, ( qualifier || '' ) + config.keysystem + ': generateRequest() with webm initData longer than 64Kb characters.'); + + promise_test(function() + { + var initData = new Uint8Array(70000); + return test_session(config.keysystem,'cenc', initData); + }, ( qualifier || '' ) + config.keysystem + ': generateRequest() with cenc initData longer than 64Kb characters.'); + + promise_test(function() + { + var initData = new Uint8Array(70000); + return test_session(config.keysystem,'keyids', initData); + }, ( qualifier || '' ) + config.keysystem + ': generateRequest() with keyids initData longer than 64Kb characters.'); + + promise_test(function() + { + // Invalid 'pssh' box as the size specified is larger than what + // is provided. + var initData = new Uint8Array([ + 0x00, 0x00, 0xff, 0xff, // size = huge + 0x70, 0x73, 0x73, 0x68, // 'pssh' + 0x00, // version = 0 + 0x00, 0x00, 0x00, // flags + 0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02, // Common SystemID + 0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B, + 0x00, 0x00, 0x00, 0x00 // datasize + ]); + return test_session(config.keysystem,'cenc', initData); + }, ( qualifier || '' ) + config.keysystem + ': generateRequest() with invalid pssh data.'); + + promise_test(function() + { + // Invalid data as type = 'psss'. + var initData = new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, // size = 0 + 0x70, 0x73, 0x73, 0x73, // 'psss' + 0x00, // version = 0 + 0x00, 0x00, 0x00, // flags + 0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02, // Common SystemID + 0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B, + 0x00, 0x00, 0x00, 0x00 // datasize + ]); + return test_session(config.keysystem,'cenc', initData); + }, ( qualifier || '' ) + config.keysystem + ': generateRequest() with non pssh data.'); + + promise_test(function() + { + // Valid key ID size must be at least 1 character for keyids. + var keyId = new Uint8Array(0); + var initData = stringToUint8Array(createKeyIDs(keyId)); + return test_session(config.keysystem,'keyids', initData); + }, ( qualifier || '' ) + config.keysystem + ': generateRequest() with too short key ID.'); + + promise_test(function() + { + // Valid key ID size must be less than 512 characters for keyids. + var keyId = new Uint8Array(600); + var initData = stringToUint8Array(createKeyIDs(keyId)); + return test_session(config.keysystem,'keyids', initData); + }, ( qualifier || '' ) + config.keysystem + ': generateRequest() with too long key ID.'); +} diff --git a/encrypted-media/scripts/keystatuses-multiple-sessions.js b/encrypted-media/scripts/keystatuses-multiple-sessions.js new file mode 100644 index 00000000000000..c19b045a7e2453 --- /dev/null +++ b/encrypted-media/scripts/keystatuses-multiple-sessions.js @@ -0,0 +1,107 @@ +function runTest(config,qualifier) +{ + var testname = ( qualifier || '' ) + config.keysystem + ', keystatuses, multiple sessions'; + + var configuration = getSimpleConfigurationForContent( config.content ); + + if ( config.initDataType && config.initData ) configuration.initDataTypes = [ config.initDataType ]; + + async_test(function(test) + { + var mediaKeySession1; + var mediaKeySession2; + + // Even though key ids are uint8, using printable values so that + // they can be verified easily. + var key1 = new Uint8Array( config.content.keys[ 0 ].kid ), + key2 = new Uint8Array( config.content.keys[ 1 ].kid ); + + function processMessage1(event) + { + // This should only be called for session1. + assert_equals(event.target, mediaKeySession1); + + // No keys added yet. + verifyKeyStatuses(mediaKeySession1.keyStatuses, { expected: [], unexpected: [key1, key2] }); + + // Add key1 to session1. + config.messagehandler( event.messageType, event.message ).then( function( response ) { + + event.target.update( response ).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + }); + + } + + function processKeyStatusesChange1(event) + { + // This should only be called for session1. + assert_equals(event.target, mediaKeySession1); + + // Check that keyStatuses contains the expected key1 only. + verifyKeyStatuses(mediaKeySession1.keyStatuses, { expected: [key1], unexpected: [key2] }); + + // Now trigger a message event on session2. + mediaKeySession2.generateRequest(config.initDataType, config.initData[ 1 ]).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + } + + function processMessage2(event) + { + // This should only be called for session2. + assert_equals(event.target, mediaKeySession2); + + // session2 has no keys added yet. + verifyKeyStatuses(mediaKeySession2.keyStatuses, { expected: [], unexpected: [key1, key2] }); + + // session1 should still have 1 key. + verifyKeyStatuses(mediaKeySession1.keyStatuses, { expected: [key1], unexpected: [key2] }); + + // Add key2 to session2. + config.messagehandler( event.messageType, event.message ).then( function( response ) { + + event.target.update( response ).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + }); + } + + function processKeyStatusesChange2(event) + { + // This should only be called for session2. + assert_equals(event.target, mediaKeySession2); + + // Check that keyStatuses contains the expected key2 only. + verifyKeyStatuses(mediaKeySession2.keyStatuses, { expected: [key2], unexpected: [key1] }); + + // session1 should still have 1 key. + verifyKeyStatuses(mediaKeySession1.keyStatuses, { expected: [key1], unexpected: [key2] }); + + test.done(); + } + + navigator.requestMediaKeySystemAccess( config.keysystem, [ configuration ] ).then(function(access) { + return access.createMediaKeys(); + }).then(function(mediaKeys) { + mediaKeySession1 = mediaKeys.createSession(); + mediaKeySession2 = mediaKeys.createSession(); + + // There should be no keys defined on either session. + verifyKeyStatuses(mediaKeySession1.keyStatuses, { expected: [], unexpected: [key1, key2] }); + verifyKeyStatuses(mediaKeySession2.keyStatuses, { expected: [], unexpected: [key1, key2] }); + + // Bind all the event handlers now. + waitForEventAndRunStep('message', mediaKeySession1, processMessage1, test); + waitForEventAndRunStep('message', mediaKeySession2, processMessage2, test); + waitForEventAndRunStep('keystatuseschange', mediaKeySession1, processKeyStatusesChange1, test); + waitForEventAndRunStep('keystatuseschange', mediaKeySession2, processKeyStatusesChange2, test); + + // Generate a request on session1. + return mediaKeySession1.generateRequest(config.initDataType, config.initData[ 0 ] ); + }).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + }, testname ); +} diff --git a/encrypted-media/scripts/keystatuses.js b/encrypted-media/scripts/keystatuses.js new file mode 100644 index 00000000000000..a438d610e0bc84 --- /dev/null +++ b/encrypted-media/scripts/keystatuses.js @@ -0,0 +1,161 @@ +function runTest(config,qualifier) +{ + var testname = ( qualifier || '' ) + config.keysystem + ', keystatuses'; + + var configuration = getSimpleConfigurationForContent( config.content ); + + if ( config.initDataType && config.initData ) configuration.initDataTypes = [ config.initDataType ]; + + async_test(function(test) + { + var mediaKeySession; + var initDataType; + var initData; + var closed = false; + + // Even though key ids are uint8, using printable values so that + // they can be verified easily. + var key1 = new Uint8Array( config.content.keys[ 0 ].kid ), + key2 = new Uint8Array( config.content.keys[ 1 ].kid ), + key1String = arrayBufferAsString(key1), + key2String = arrayBufferAsString(key2); + + function onFailure(error) { + forceTestFailureFromPromise(test, error); + } + + function processMessage(event) + { + // No keys added yet. + assert_equals(mediaKeySession.keyStatuses.size, 0); + + waitForEventAndRunStep('keystatuseschange', mediaKeySession, processKeyStatusesChange, test); + + // Add keys to session + config.messagehandler( event.messageType, event.message ).then( function( response ) { + event.target.update( response ).catch(onFailure); + }); + } + + function checkKeyStatusFor2Keys() + { + // Two keys added, so both should show up in |keyStatuses|. + assert_equals(mediaKeySession.keyStatuses.size, 2); + + // Check |keyStatuses| for 2 entries. + var result = []; + for (let item of mediaKeySession.keyStatuses) { + result.push({ key: arrayBufferAsString(item[0]), value: item[1] }); + } + function lexicographical( a, b ) { return a < b ? -1 : a === b ? 0 : +1; } + function lexicographicalkey( a, b ) { return lexicographical( a.key, b.key ); } + var expected = [{ key: key1String, value: 'usable'}, { key: key2String, value: 'usable'}].sort( lexicographicalkey ); + assert_equals(JSON.stringify(result), + JSON.stringify(expected), + "keystatuses should have the two expected keys with keystatus 'usable'"); + + // |keyStatuses| must contain both keys. + result = []; + for (var key of mediaKeySession.keyStatuses.keys()) { + result.push(arrayBufferAsString(key)); + } + assert_array_equals(result, + [key1String, key2String].sort( lexicographical ), + "keyStatuses.keys() should return an iterable over the two expected keys"); + + // Both values in |mediaKeySession| should be 'usable'. + result = []; + for (var value of mediaKeySession.keyStatuses.values()) { + result.push(value); + } + assert_array_equals(result, + ['usable', 'usable'], + "keyStatuses.values() should return an iterable with two 'usable' values"); + + // Check |keyStatuses.entries()|. + result = []; + for (var entry of mediaKeySession.keyStatuses.entries()) { + result.push({ key: arrayBufferAsString(entry[0]), value: entry[1] }); + } + assert_equals(JSON.stringify(result), + JSON.stringify(expected), + "keyStatuses.entries() should return an iterable over the two expected keys, with keystatus 'usable'"); + + // forEach() should return both entries. + result = []; + mediaKeySession.keyStatuses.forEach(function(status, keyId) { + result.push({ key: arrayBufferAsString(keyId), value: status }); + }); + assert_equals(JSON.stringify(result), + JSON.stringify(expected), + "keyStatuses.forEach() should iterate over the two expected keys, with keystatus 'usable'"); + + // has() and get() should return the expected values. + assert_true(mediaKeySession.keyStatuses.has(key1), "keyStatuses should have key1"); + assert_true(mediaKeySession.keyStatuses.has(key2), "keyStatuses should have key2"); + assert_equals(mediaKeySession.keyStatuses.get(key1), 'usable', "key1 should have status 'usable'"); + assert_equals(mediaKeySession.keyStatuses.get(key2), 'usable', "key2 should have status 'usable'"); + + // Try some invalid keyIds. + var invalid1 = key1.subarray(0, key1.length - 1); + assert_false(mediaKeySession.keyStatuses.has(invalid1), "keystatuses should not have invalid key (1)"); + assert_equals(mediaKeySession.keyStatuses.get(invalid1), undefined, "keystatus value for invalid key should be undefined (1)"); + + var invalid2 = key1.subarray(1); + assert_false(mediaKeySession.keyStatuses.has(invalid2), "keystatuses should not have invalid key (2)"); + assert_equals(mediaKeySession.keyStatuses.get(invalid2), undefined, "keystatus value for invalid key should be undefined (2)"); + + var invalid3 = new Uint8Array(key1); + invalid3[0] += 1; + assert_false(mediaKeySession.keyStatuses.has(invalid3), "keystatuses should not have invalid key (3)"); + assert_equals(mediaKeySession.keyStatuses.get(invalid3), undefined, "keystatus value for invalid key should be undefined (3)"); + + var invalid4 = new Uint8Array(key1); + invalid4[invalid4.length - 1] -= 1; + assert_false(mediaKeySession.keyStatuses.has(invalid4), "keystatuses should not have invalid key (4)"); + assert_equals(mediaKeySession.keyStatuses.get(invalid4), undefined, "keystatus value for invalid key should be undefined (4)"); + + var invalid5 = new Uint8Array(key1.length + 1); + invalid5.set(key1, 1); // First element will be 0. + assert_false(mediaKeySession.keyStatuses.has(invalid5), "keystatuses should not have invalid key (5)"); + assert_equals(mediaKeySession.keyStatuses.get(invalid5), undefined, "keystatus value for invalid key should be undefined (5)"); + + var invalid6 = new Uint8Array(key1.length + 1); + invalid6.set(key1, 0); // Last element will be 0. + assert_false(mediaKeySession.keyStatuses.has(invalid6), "keystatuses should not have invalid key (6)"); + assert_equals(mediaKeySession.keyStatuses.get(invalid6), undefined, "keystatus value for invalid key should be undefined (6)"); + } + + function processKeyStatusesChange(event) + { + if ( !closed ) + { + // The first keystatuseschange (caused by update()) + // should include both keys. + checkKeyStatusFor2Keys(); + + mediaKeySession.close().catch(onFailure); + closed = true; + } + else + { + // The second keystatuseschange (caused by close()) + // should not have any keys. + assert_equals(mediaKeySession.keyStatuses.size, 0); + test.done(); + } + } + + navigator.requestMediaKeySystemAccess( config.keysystem, [ configuration ] ).then(function(access) { + return access.createMediaKeys(); + }).then(test.step_func( function(mediaKeys) { + mediaKeySession = mediaKeys.createSession(); + + // There should be no keys defined yet. + //verifyKeyStatuses(mediaKeySession.keyStatuses, { expected: [], unexpected: [key1, key2] }); + + waitForEventAndRunStep('message', mediaKeySession, processMessage, test); + return mediaKeySession.generateRequest(config.initDataType, config.initData); + })).catch(onFailure); + }, testname ); +} diff --git a/encrypted-media/scripts/not-callable-after-createsession.js b/encrypted-media/scripts/not-callable-after-createsession.js new file mode 100644 index 00000000000000..5962e7bf13c946 --- /dev/null +++ b/encrypted-media/scripts/not-callable-after-createsession.js @@ -0,0 +1,50 @@ + function runTest(config,qualifier) { + // After creation, the MediaKeySession object is not + // callable, and we should get a InvalidStateError. + + promise_test(function() + { + return navigator.requestMediaKeySystemAccess(config.keysystem, getSimpleConfiguration()).then(function(access) { + return access.createMediaKeys(); + }).then(function(mediaKeys) { + var mediaKeySession = mediaKeys.createSession(); + + var arbitraryResponse = new Uint8Array([0x00, 0x11]); + return mediaKeySession.update(arbitraryResponse).then(function(result) { + assert_unreached('update() succeeded unexpectedly.'); + }).catch(function(error) { + assert_equals(error.name, 'InvalidStateError'); + }); + }); + }, ( qualifier || '' ) + config.keysystem + ': Update() immediately after CreateSession().'); + + promise_test(function() + { + return navigator.requestMediaKeySystemAccess(config.keysystem, getSimpleConfiguration()).then(function(access) { + return access.createMediaKeys(); + }).then(function(mediaKeys) { + var mediaKeySession = mediaKeys.createSession(); + + return mediaKeySession.close().then(function(result) { + assert_unreached('close() succeeded unexpectedly.'); + }).catch(function(error) { + assert_equals(error.name, 'InvalidStateError'); + }); + }); + }, ( qualifier || '' ) + config.keysystem + ': Close() immediately after CreateSession().'); + + promise_test(function() + { + return navigator.requestMediaKeySystemAccess(config.keysystem, getSimpleConfiguration()).then(function(access) { + return access.createMediaKeys(); + }).then(function(mediaKeys) { + var mediaKeySession = mediaKeys.createSession(); + + return mediaKeySession.remove().then(function(result) { + assert_unreached('remove() succeeded unexpectedly.'); + }).catch(function(error) { + assert_equals(error.name, 'InvalidStateError'); + }); + }); + }, ( qualifier || '' ) + config.keysystem + ': Remove() immediately after CreateSession().'); +} diff --git a/encrypted-media/scripts/playback-persistent-license-events.js b/encrypted-media/scripts/playback-persistent-license-events.js new file mode 100644 index 00000000000000..e6327b2ee3d9aa --- /dev/null +++ b/encrypted-media/scripts/playback-persistent-license-events.js @@ -0,0 +1,167 @@ +function runTest(config,qualifier) { + + var testname = ( qualifier || '' ) + config.keysystem + + ', successful playback, persistent-license, ' + + /video\/([^;]*)/.exec( config.videoType )[ 1 ] + + ', set src before setMediaKeys, check events'; + + var configuration = { initDataTypes: [ config.initDataType ], + audioCapabilities: [ { contentType: config.audioType } ], + videoCapabilities: [ { contentType: config.videoType } ], + sessionTypes: [ 'persistent-license' ] }; + + + async_test( function( test ) { + + var _video = config.video, + _mediaKeys, + _mediaKeySession, + _mediaSource, + _sessionId, + _receivedAllKeysUsableEvent = false, + _receivedPlayingEvent = false, + _receivedTimeupdateEvent = false, + _startedReleaseSequence = false, + _events = [ ]; + + function onMessage(event) { + assert_equals( event.target, _mediaKeySession ); + assert_true( event instanceof window.MediaKeyMessageEvent ); + assert_equals( event.type, 'message'); + + if ( !_startedReleaseSequence ) { + assert_in_array( event.messageType, [ 'license-request', 'individualization-request' ] ); + } else { + assert_equals( event.messageType, 'license-release' ); + } + + if ( event.messageType !== 'individualization-request' ) { + _events.push( event.messageType ); + } + + config.messagehandler( event.messageType, event.message ).then( function( response ) { + if ( event.messageType === 'license-request' ) { + _events.push( 'license-response' ); + } else if ( event.messageType === 'license-release' ) { + _events.push( 'release-response' ); + } + + waitForEventAndRunStep('keystatuseschange', _mediaKeySession, onKeyStatusesChange, test); + _mediaKeySession.update( response ).then( function() { + _events.push('updated'); + }).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + }); + } + + function onKeyStatusesChange(event) { + assert_equals(event.target, _mediaKeySession ); + assert_true(event instanceof window.Event ); + assert_equals(event.type, 'keystatuseschange' ); + + var hasKeys = false, pendingKeys = false; + _mediaKeySession.keyStatuses.forEach( function( value, keyid ) { + assert_any( assert_equals, value, [ 'status-pending', 'usable' ] ); + + hasKeys = true; + pendingKeys = pendingKeys || ( value === 'status-pending' ); + }); + + if ( !_receivedAllKeysUsableEvent && hasKeys && !pendingKeys ) { + _receivedAllKeysUsableEvent = true; + _events.push( 'allkeysusable' ); + } + + if ( !hasKeys ) { + _events.push( 'emptykeyslist' ); + } + } + + function onEncrypted(event) { + assert_equals(event.target, _video); + assert_true(event instanceof window.MediaEncryptedEvent); + assert_equals(event.type, 'encrypted'); + + waitForEventAndRunStep('message', _mediaKeySession, onMessage, test); + _mediaKeySession.generateRequest( config.initData ? config.initDataType : event.initDataType, + config.initData || event.initData ).then( function() { + + _events.push( 'generaterequest' ); + _sessionId = _mediaKeySession.sessionId; + }).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + } + + function onClosed(event) { + _events.push( 'closed-promise' ); + + setTimeout( test.step_func( function() { + assert_array_equals( _events, + [ + 'generaterequest', + 'license-request', + 'license-response', + 'updated', + 'allkeysusable', + 'playing', + 'remove', + 'emptykeyslist', + 'license-release', + 'release-response', + 'closed-promise', + 'updated' + ], + "Expected events sequence" ); + + _video.setMediaKeys( null ).then( function() { test.done() } ); + } ), 0 ); + } + + function onTimeupdate(event) { + if ( _video.currentTime > ( config.duration || 2 ) && !_receivedTimeupdateEvent ) { + _receivedTimeupdateEvent = true; + _video.pause(); + + _startedReleaseSequence = true; + + _mediaKeySession.closed.then( test.step_func( onClosed ) ); + _mediaKeySession.remove().then( function() { + _events.push( 'remove' ); + }).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + } + } + + function onPlaying(event) { + _receivedPlayingEvent = true; + _events.push( 'playing' ); + + // Not using waitForEventAndRunStep() to avoid too many + // EVENT(onTimeUpdate) logs. + _video.addEventListener('timeupdate', onTimeupdate, true); + } + + navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) { + return access.createMediaKeys(); + }).then(function(mediaKeys) { + _mediaKeys = mediaKeys; + return _video.setMediaKeys(_mediaKeys); + }).then(function() { + _mediaKeySession = _mediaKeys.createSession( 'persistent-license' ); + + waitForEventAndRunStep('encrypted', _video, onEncrypted, test); + waitForEventAndRunStep('playing', _video, onPlaying, test); + }).then(function() { + return testmediasource(config); + }).then(function(source) { + _mediaSource = source; + _video.src = URL.createObjectURL(_mediaSource); + _video.play(); + }).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + }, testname); +} \ No newline at end of file diff --git a/encrypted-media/scripts/playback-persistent-license.js b/encrypted-media/scripts/playback-persistent-license.js new file mode 100644 index 00000000000000..132c141bc3edfe --- /dev/null +++ b/encrypted-media/scripts/playback-persistent-license.js @@ -0,0 +1,92 @@ +function runTest(config,qualfier) { + + var testname = ( qualifier || '' ) + config.keysystem + + ', successful playback, persistent-license, ' + + /video\/([^;]*)/.exec( config.videoType )[ 1 ] + + ', set src before setMediaKeys'; + + var configuration = { initDataTypes: [ config.initDataType ], + audioCapabilities: [ { contentType: config.audioType } ], + videoCapabilities: [ { contentType: config.videoType } ], + sessionTypes: [ 'persistent-license' ] }; + + + async_test( function( test ) { + + var _video = config.video, + _mediaKeys, + _mediaKeySession, + _mediaSource, + _startedReleaseSequence = false; + + function onFailure(error) { + forceTestFailureFromPromise(test, error); + } + + function onMessage(event) { + assert_equals( event.target, _mediaKeySession ); + assert_true( event instanceof window.MediaKeyMessageEvent ); + assert_equals( event.type, 'message'); + + if ( !_startedReleaseSequence ) { + assert_in_array( event.messageType, [ 'license-request', 'individualization-request' ] ); + } else { + assert_equals( event.messageType, 'license-release' ); + } + + config.messagehandler( event.messageType, event.message ) + .then( function( response ) { + _mediaKeySession.update( response ) + .catch(onFailure); + }); + } + + function onEncrypted(event) { + assert_equals(event.target, _video); + assert_true(event instanceof window.MediaEncryptedEvent); + assert_equals(event.type, 'encrypted'); + + waitForEventAndRunStep('message', _mediaKeySession, onMessage, test); + _mediaKeySession.generateRequest( config.initData ? config.initDataType : event.initDataType, + config.initData || event.initData ).catch(onFailure); + } + + function onTimeupdate(event) { + if ( _video.currentTime > ( config.duration || 2 ) && !_startedReleaseSequence ) { + _video.removeEventListener('timeupdate', onTimeupdate ); + _video.pause(); + _video.removeAttribute('src'); + _video.load(); + + _startedReleaseSequence = true; + + _mediaKeySession.closed.then( function() { test.done(); } ); + _mediaKeySession.remove().catch(onFailure); + } + } + + function onPlaying(event) { + // Not using waitForEventAndRunStep() to avoid too many + // EVENT(onTimeUpdate) logs. + _video.addEventListener('timeupdate', onTimeupdate, true); + } + + navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) { + return access.createMediaKeys(); + }).then(function(mediaKeys) { + _mediaKeys = mediaKeys; + return _video.setMediaKeys(_mediaKeys); + }).then(function() { + _mediaKeySession = _mediaKeys.createSession( 'persistent-license' ); + + waitForEventAndRunStep('encrypted', _video, onEncrypted, test); + waitForEventAndRunStep('playing', _video, onPlaying, test); + }).then(function() { + return testmediasource(config); + }).then(function(source) { + _mediaSource = source; + _video.src = URL.createObjectURL(_mediaSource); + _video.play(); + }).catch(onFailure); + }, testname); +} diff --git a/encrypted-media/scripts/playback-persistent-usage-record-events.js b/encrypted-media/scripts/playback-persistent-usage-record-events.js new file mode 100644 index 00000000000000..89389489022fe1 --- /dev/null +++ b/encrypted-media/scripts/playback-persistent-usage-record-events.js @@ -0,0 +1,115 @@ +function runTest(config,qualifier) { + + var testname = ( qualifier || '' ) + config.keysystem + + ', persistent-usage-record, playback, ' + + /video\/([^;]*)/.exec( config.videoType )[ 1 ] + + ', event sequence'; + + var configuration = { initDataTypes: [ config.initDataType ], + audioCapabilities: [ { contentType: config.audioType } ], + videoCapabilities: [ { contentType: config.videoType } ], + sessionTypes: [ 'persistent-usage-record' ] }; + + + async_test( function( test ) { + + var _video = config.video, + _mediaKeys, + _mediaKeySession, + _sessionId, + _timeupdateEvent = false, + _events = [ ]; + + function recordEventFunc( eventType ) { + return function() { _events.push( eventType ); }; + } + + function onFailure(error) { + forceTestFailureFromPromise(test, error); + } + + function onMessage(event) { + assert_equals( event.target, _mediaKeySession ); + assert_true( event instanceof window.MediaKeyMessageEvent ); + assert_equals( event.type, 'message'); + + if ( event.messageType !== 'individualization-request' ) { + _events.push( event.messageType ); + } + + config.messagehandler( event.messageType, event.message ).then( function( response ) { + _events.push( event.messageType + '-response' ); + _mediaKeySession.update( response ).then( test.step_func(function() { + _events.push( 'update-done' ); + if ( event.messageType === 'license-release' ) { + consoleWrite( _events ); + assert_array_equals( _events, + [ 'encrypted', + 'generaterequest-done', + 'license-request', + 'license-request-response', + 'update-done', + 'keystatuseschange', + 'playing', + 'remove-done', + 'keystatuseschange', + 'license-release', + 'license-release-response', + 'closed-promise', + 'update-done' + ], + "Expected events sequence" ); + test.done(); + } + + if ( event.messageType === 'license-request' ) { + _video.setMediaKeys( _mediaKeys ); + } + })).catch(onFailure); + }); + } + + function onEncrypted(event) { + assert_equals(event.target, _video); + assert_true(event instanceof window.MediaEncryptedEvent); + _events.push(event.type); + _mediaKeySession.generateRequest( config.initDataType || event.initDataType, + config.initData || event.initData ).then( function() { + _events.push( 'generaterequest-done' ); + _sessionId = _mediaKeySession.sessionId; + }).catch(onFailure); + } + + function onTimeupdate(event) { + if ( _video.currentTime > ( config.duration || 2 ) && !_timeupdateEvent ) { + _timeupdateEvent = true; + _video.pause(); + _mediaKeySession.remove().then( recordEventFunc('remove-done') ).catch(onFailure); + } + } + + navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) { + return access.createMediaKeys(); + }).then(function(mediaKeys) { + _mediaKeys = mediaKeys; + waitForEventAndRunStep('encrypted', _video, onEncrypted, test); + waitForEventAndRunStep('playing', _video, recordEventFunc('playing'), test); + + // Not using waitForEventAndRunStep() to avoid too many + // EVENT(onTimeUpdate) logs. + _video.addEventListener('timeupdate', onTimeupdate, true); + + _mediaKeySession = _mediaKeys.createSession( 'persistent-usage-record' ); + waitForEventAndRunStep('message', _mediaKeySession, onMessage, test); + waitForEventAndRunStep('keystatuseschange', _mediaKeySession, recordEventFunc('keystatuseschange'), test); + _mediaKeySession.closed.then( recordEventFunc('closed-promise') ); + }).then(function() { + return config.servercertificate ? _mediaKeys.setServerCertificate( config.servercertificate ) : true; + }).then(function( success ) { + return testmediasource(config); + }).then(function(source) { + _video.src = URL.createObjectURL(source); + _video.play(); + }).catch(onFailure); + }, testname); +} diff --git a/encrypted-media/scripts/playback-persistent-usage-record.js b/encrypted-media/scripts/playback-persistent-usage-record.js new file mode 100644 index 00000000000000..dc20fcc7d5c235 --- /dev/null +++ b/encrypted-media/scripts/playback-persistent-usage-record.js @@ -0,0 +1,113 @@ +function runTest(config,qualifier) { + + var testname = ( qualifier || '' ) + config.keysystem + + ', successful playback, persistent-usage-record, ' + + /video\/([^;]*)/.exec( config.videoType )[ 1 ] + + ', set src before setMediaKeys'; + + var configuration = { initDataTypes: [ config.initDataType ], + audioCapabilities: [ { contentType: config.audioType } ], + videoCapabilities: [ { contentType: config.videoType } ], + sessionTypes: [ 'persistent-usage-record' ] }; + + + async_test( function( test ) { + + var _video = config.video, + _mediaKeys, + _mediaKeySession, + _mediaSource, + _releaseSequence = false; + + function onMessage(event) { + assert_equals( event.target, _mediaKeySession ); + // event instance verification failing on CastTV + // assert_true( event instanceof window.MediaKeyMessageEvent ); + assert_equals( event.type, 'message'); + + if ( !_releaseSequence ) + { + assert_in_array( event.messageType, [ 'license-request', 'individualization-request' ] ); + } + else + { + assert_equals( event.messageType, 'license-release' ); + } + + config.messagehandler( event.messageType, event.message ).then( function( response ) { + _mediaKeySession.update( response ).catch(function(error) { + forceTestFailureFromPromise(test, error); + }).then(function() { + if(event.messageType === 'license-request') { + _video.setMediaKeys(_mediaKeys); + } else if(event.messageType === 'license-release') { + test.done(); + } + }); + }); + } + + function onEncrypted(event) { + assert_equals(event.target, _video); + assert_true(event instanceof window.MediaEncryptedEvent); + assert_equals(event.type, 'encrypted'); + + waitForEventAndRunStep('message', _mediaKeySession, onMessage, test); + _mediaKeySession.generateRequest( config.initData ? config.initDataType : event.initDataType, + config.initData || event.initData ) + .catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + } + + function onClosed(event) { + _video.src = ""; + _video.setMediaKeys( null ); + } + + function onTimeupdate(event) { + if ( _video.currentTime > ( config.duration || 2 ) && !_releaseSequence ) { + + _video.removeEventListener('timeupdate', onTimeupdate ); + + _video.pause(); + + _releaseSequence = true; + + _mediaKeySession.closed.then( test.step_func( onClosed ) ); + _mediaKeySession.remove().catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + + _video.removeEventListener('timeupdate', onTimeupdate ); + } + } + + function onPlaying(event) { + + // Not using waitForEventAndRunStep() to avoid too many + // EVENT(onTimeUpdate) logs. + _video.addEventListener('timeupdate', onTimeupdate, true); + } + + navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) { + return access.createMediaKeys(); + }).then(function(mediaKeys) { + _mediaKeys = mediaKeys; + _mediaKeySession = _mediaKeys.createSession( 'persistent-usage-record' ); + + waitForEventAndRunStep('encrypted', _video, onEncrypted, test); + waitForEventAndRunStep('playing', _video, onPlaying, test); + }).then(function() { + return config.servercertificate ? _mediaKeys.setServerCertificate( config.servercertificate ) : true; + }).then(function( success ) { + return testmediasource(config); + }).then(function(source) { + _mediaSource = source; + _video.src = URL.createObjectURL(_mediaSource); + _video.play(); + }).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + }, testname); +} diff --git a/encrypted-media/scripts/playback-retrieve-persistent-license.js b/encrypted-media/scripts/playback-retrieve-persistent-license.js new file mode 100644 index 00000000000000..7ca63ff2e3fb07 --- /dev/null +++ b/encrypted-media/scripts/playback-retrieve-persistent-license.js @@ -0,0 +1,110 @@ +function runTest(config,qualifier) { + + var testname = ( qualifier || '' ) + config.keysystem + + ', retrieve persistent-license in new window, ' + + /video\/([^;]*)/.exec( config.videoType )[ 1 ]; + + var configuration = { initDataTypes: [ config.initDataType ], + audioCapabilities: [ { contentType: config.audioType } ], + videoCapabilities: [ { contentType: config.videoType } ], + sessionTypes: [ 'persistent-license' ] }; + + + async_test( function( test ) { + var _video = config.video, + _mediaKeys, + _mediaKeySession, + _mediaSource, + _sessionId; + + function onFailure(error) { + forceTestFailureFromPromise(test, error); + } + + function onEncrypted(event) { + assert_equals(event.target, _video); + assert_true(event instanceof window.MediaEncryptedEvent); + assert_equals(event.type, 'encrypted'); + + waitForEventAndRunStep('message', _mediaKeySession, onMessage, test); + _mediaKeySession.generateRequest( config.initData ? config.initDataType : event.initDataType, + config.initData || event.initData ).then( function() { + _sessionId = _mediaKeySession.sessionId; + }).catch(onFailure); + } + + function onMessage(event) { + assert_equals( event.target, _mediaKeySession ); + assert_true( event instanceof window.MediaKeyMessageEvent ); + assert_equals( event.type, 'message'); + + assert_in_array( event.messageType, [ 'license-request', 'individualization-request' ] ); + + config.messagehandler( event.messageType, event.message ).then( function( response ) { + _mediaKeySession.update( response ) + .catch(onFailure); + }); + } + + function onPlaying(event) { + // Not using waitForEventAndRunStep() to avoid too many + // EVENT(onTimeUpdate) logs. + _video.addEventListener('timeupdate', onTimeupdate, true); + } + + function onTimeupdate(event) { + if ( _video.currentTime > ( config.duration || 2 ) ) { + _video.removeEventListener('timeupdate', onTimeupdate ); + _video.pause(); + _video.removeAttribute('src'); + _video.load() + + _mediaKeySession.closed.then( test.step_func( onClosed ) ); + _mediaKeySession.close(); + } + } + + function onClosed() { + // Open a new window in which we will attempt to play with the persisted license + var win = window.open( config.windowscript ); + + // Lisen for an event from the new window containing its test assertions + window.addEventListener('message', test.step_func(function( messageEvent ) { + messageEvent.data.forEach(test.step_func(function( assertion ) { + assert_equals(assertion.actual, assertion.expected, assertion.message); + })); + + win.close(); + test.done(); + })); + + // Delete things which can't be cloned and posted over to the new window + delete config.video; + delete config.messagehandler; + + // Post the config and session id to the new window when it is ready + win.onload = function() { + win.postMessage( { config: config, sessionId: _sessionId }, '*' ); + } + } + + navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) { + return access.createMediaKeys(); + }).then(function(mediaKeys) { + _mediaKeys = mediaKeys; + + _video.setMediaKeys( mediaKeys ); + + _mediaKeySession = _mediaKeys.createSession( 'persistent-license' ); + + waitForEventAndRunStep('encrypted', _video, onEncrypted, test); + waitForEventAndRunStep('playing', _video, onPlaying, test); + }).then(function() { + return testmediasource(config); + }).then(function(source) { + _mediaSource = source; + _video.src = URL.createObjectURL(_mediaSource); + _video.play(); + }).catch(onFailure); + }, testname); +} diff --git a/encrypted-media/scripts/playback-retrieve-persistent-usage-record.js b/encrypted-media/scripts/playback-retrieve-persistent-usage-record.js new file mode 100644 index 00000000000000..2fdb01299728ee --- /dev/null +++ b/encrypted-media/scripts/playback-retrieve-persistent-usage-record.js @@ -0,0 +1,121 @@ +function runTest(config,qualifier) { + + var testname = ( qualifier || '' ) + config.keysystem + + ', retrieve persistent-usage-record in new window, ' + + /video\/([^;]*)/.exec( config.videoType )[ 1 ]; + + var configuration = { initDataTypes: [ config.initDataType ], + audioCapabilities: [ { contentType: config.audioType } ], + videoCapabilities: [ { contentType: config.videoType } ], + sessionTypes: [ 'persistent-usage-record' ] }; + + + async_test( function( test ) { + + var _video = config.video, + _mediaKeys, + _mediaKeySession, + _mediaSource, + _sessionId, + _isClosing = false; + + function onEncrypted(event) { + assert_equals(event.target, _video); + assert_true(event instanceof window.MediaEncryptedEvent); + assert_equals(event.type, 'encrypted'); + + waitForEventAndRunStep('message', _mediaKeySession, onMessage, test); + _mediaKeySession.generateRequest( config.initDataType || event.initDataType, + config.initData || event.initData ).then( function() { + + _sessionId = _mediaKeySession.sessionId; + }).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + } + + function onMessage(event) { + assert_equals( event.target, _mediaKeySession ); + assert_true( event instanceof window.MediaKeyMessageEvent ); + assert_equals( event.type, 'message'); + + assert_in_array( event.messageType, [ 'license-request', 'individualization-request' ] ); + + config.messagehandler( event.messageType, event.message ).then( function( response ) { + + _mediaKeySession.update( response ).then(function() { + _video.setMediaKeys(_mediaKeys); + }).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + }); + } + + function onPlaying(event) { + + // Not using waitForEventAndRunStep() to avoid too many + // EVENT(onTimeUpdate) logs. + _video.addEventListener('timeupdate', onTimeupdate, true); + } + + function onTimeupdate(event) { + if ( !_isClosing && _video.currentTime > ( config.duration || 2 ) ) { + _isClosing = true; + _video.removeEventListener('timeupdate', onTimeupdate ); + _video.pause(); + _mediaKeySession.closed.then( test.step_func( onClosed ) ); + _mediaKeySession.close(); + } + } + + function onClosed(event) { + _video.src = ""; + _video.setMediaKeys( null ); + + var win = window.open( config.windowscript ); + window.addEventListener('message', test.step_func(function( event ) { + + event.data.forEach(test.step_func(function( assertion ) { + + assert_equals(assertion.actual, assertion.expected, assertion.message); + + })); + + win.close(); + + test.done(); + })); + + delete config.video; + delete config.messagehandler; + + win.onload = function() { + + win.postMessage( { config: config, sessionId: _sessionId }, '*' ); + } + } + + navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) { + return access.createMediaKeys(); + }).then(function(mediaKeys) { + _mediaKeys = mediaKeys; + + _video.setMediaKeys( mediaKeys ); + + _mediaKeySession = _mediaKeys.createSession( 'persistent-usage-record' ); + + waitForEventAndRunStep('encrypted', _video, onEncrypted, test); + waitForEventAndRunStep('playing', _video, onPlaying, test); + }).then(function() { + return config.servercertificate ? _mediaKeys.setServerCertificate( config.servercertificate ) : true; + }).then(function( success ) { + return testmediasource(config); + }).then(function(source) { + _mediaSource = source; + _video.src = URL.createObjectURL(_mediaSource); + _video.play(); + }).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + }, testname); +} diff --git a/encrypted-media/scripts/playback-temporary-events.js b/encrypted-media/scripts/playback-temporary-events.js new file mode 100644 index 00000000000000..f2d007c877a0c9 --- /dev/null +++ b/encrypted-media/scripts/playback-temporary-events.js @@ -0,0 +1,156 @@ +function runTest(config,qualifier) { + + var testname = ( qualifier || '' ) + config.keysystem + + ', sucessful playback and events, temporary, ' + + /video\/([^;]*)/.exec( config.videoType )[ 1 ] + + ', set src before setMediaKeys'; + + var configuration = { initDataTypes: [ config.initDataType ], + audioCapabilities: [ { contentType: config.audioType } ], + videoCapabilities: [ { contentType: config.videoType } ], + sessionTypes: [ 'temporary' ] }; + + async_test( function( test ) { + + var _video = config.video, + _mediaKeys, + _mediaKeySession, + _mediaSource, + _allKeysUsableEvent = false, + _playingEvent = false, + _timeupdateEvent = false, + _events = [ ]; + + function onMessage(event) { + assert_equals( event.target, _mediaKeySession ); + assert_true( event instanceof window.MediaKeyMessageEvent ); + assert_equals( event.type, 'message'); + + assert_any( assert_equals, + event.messageType, + [ 'license-request', 'individualization-request' ] ); + + if ( event.messageType !== 'individualization-request' ) { + _events.push( event.messageType ); + } + + config.messagehandler( event.messageType, event.message ).then( function( response ) { + _events.push( 'license-response' ); + + waitForEventAndRunStep('keystatuseschange', _mediaKeySession, onKeyStatusesChange, test); + _mediaKeySession.update( response ).then( function() { + _events.push('updated'); + }).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + }); + } + + function onKeyStatusesChange(event) { + assert_equals(event.target, _mediaKeySession ); + assert_true(event instanceof window.Event ); + assert_equals(event.type, 'keystatuseschange' ); + + var hasKeys = false, pendingKeys = false; + _mediaKeySession.keyStatuses.forEach( function( value, keyid ) { + assert_any( assert_equals, value, [ 'status-pending', 'usable' ] ); + + hasKeys = true; + pendingKeys = pendingKeys || ( value === 'status-pending' ); + + }); + + if ( !_allKeysUsableEvent && hasKeys && !pendingKeys ) { + _allKeysUsableEvent = true; + _events.push( 'allkeysusable' ); + _video.setMediaKeys(_mediaKeys); + } + + if ( !hasKeys ) { + _events.push( 'emptykeyslist' ); + } + } + + function onEncrypted(event) { + assert_equals(event.target, _video); + assert_true(event instanceof window.MediaEncryptedEvent); + assert_equals(event.type, 'encrypted'); + + waitForEventAndRunStep('message', _mediaKeySession, onMessage, test); + _mediaKeySession.generateRequest( config.initData ? config.initDataType : event.initDataType, + config.initData || event.initData ).then( function() { + _events.push( 'generaterequest' ); + }).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + } + + function onClosed(event) { + + _events.push( 'closed-promise' ); + + setTimeout( test.step_func( function() { + + assert_array_equals( _events, + [ + 'generaterequest', + 'license-request', + 'license-response', + 'updated', + 'allkeysusable', + 'playing', + 'closed', + 'closed-promise', + 'emptykeyslist' + ], + "Expected events sequence" ); + + _video.src = ""; + _video.setMediaKeys( null ).then(function(){ + test.done(); + }); + } ), 0 ); + } + + function onTimeupdate(event) { + if ( _video.currentTime > ( config.duration || 2 ) && !_timeupdateEvent ) { + _timeupdateEvent = true; + _video.pause(); + + _mediaKeySession.closed.then( test.step_func( onClosed ) ); + _mediaKeySession.close().then( function() { + _events.push( 'closed' ); + }).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + } + } + + function onPlaying(event) { + _playingEvent = true; + _events.push( 'playing' ); + + // Not using waitForEventAndRunStep() to avoid too many + // EVENT(onTimeUpdate) logs. + _video.addEventListener('timeupdate', onTimeupdate, true); + } + + navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) { + return access.createMediaKeys(); + }).then(function(mediaKeys) { + _mediaKeys = mediaKeys; + _mediaKeySession = _mediaKeys.createSession( 'temporary' ); + + waitForEventAndRunStep('encrypted', _video, onEncrypted, test); + waitForEventAndRunStep('playing', _video, onPlaying, test); + }).then(function() { + return testmediasource(config); + }).then(function(source) { + _mediaSource = source; + _video.src = URL.createObjectURL(_mediaSource); + _video.play(); + }).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + }, testname); +} diff --git a/encrypted-media/scripts/playback-temporary-multikey-multisession.js b/encrypted-media/scripts/playback-temporary-multikey-multisession.js new file mode 100644 index 00000000000000..060e46c7069511 --- /dev/null +++ b/encrypted-media/scripts/playback-temporary-multikey-multisession.js @@ -0,0 +1,96 @@ +function runTest(config,qualifier) { + + var testname = ( qualifier || '' ) + config.keysystem + + ', successful playback, temporary, ' + + /video\/([^;]*)/.exec( config.videoType )[ 1 ] + + ', multiple keys and sessions, ' + + config.testcase; + + var configuration = { initDataTypes: [ config.initDataType ], + audioCapabilities: [ { contentType: config.audioType } ], + videoCapabilities: [ { contentType: config.videoType } ], + sessionTypes: [ 'temporary' ] }; + + async_test( function( test ) { + + var _video = config.video, + _mediaKeys, + _mediaKeySessions = [ ], + _mediaSource; + + function onMessage(event) { + assert_any( assert_equals, event.target, _mediaKeySessions ); + assert_true( event instanceof window.MediaKeyMessageEvent ); + assert_equals( event.type, 'message'); + + assert_any( assert_equals, + event.messageType, + [ 'license-request', 'individualization-request' ] ); + + config.messagehandler( event.messageType, event.message ) + .then( function( response ) { + + event.target.update( response ) + .catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + }); + } + + function onPlaying(event) { + + // Not using waitForEventAndRunStep() to avoid too many + // EVENT(onTimeUpdate) logs. + _video.addEventListener('timeupdate', onTimeupdate, true); + + } + + function onTimeupdate(event) { + if ( _video.currentTime > ( config.duration || 2 ) ) { + + consoleWrite("Session 0:"); + dumpKeyStatuses( _mediaKeySessions[ 0 ].keyStatuses ); + consoleWrite("Session 1:"); + dumpKeyStatuses( _mediaKeySessions[ 1 ].keyStatuses ); + + _video.removeEventListener('timeupdate', onTimeupdate); + _video.pause(); + test.done(); + } + } + + navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) { + return access.createMediaKeys(); + }).then(function(mediaKeys) { + _mediaKeys = mediaKeys; + + _video.setMediaKeys(_mediaKeys); + + waitForEventAndRunStep('playing', _video, onPlaying, test); + + config.initData.forEach( function( initData ) { + + var mediaKeySession = _mediaKeys.createSession( 'temporary' ); + + waitForEventAndRunStep('message', mediaKeySession, onMessage, test); + + _mediaKeySessions.push( mediaKeySession ); + + mediaKeySession.generateRequest( config.initDataType, initData ) + .catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + + } ); + + }).then(function() { + return testmediasource(config); + }).then(function(source) { + _mediaSource = source; + _video.src = URL.createObjectURL(_mediaSource); + _video.play(); + }).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + }, testname); +} diff --git a/encrypted-media/scripts/playback-temporary-multikey.js b/encrypted-media/scripts/playback-temporary-multikey.js new file mode 100644 index 00000000000000..24f5830f73a4e5 --- /dev/null +++ b/encrypted-media/scripts/playback-temporary-multikey.js @@ -0,0 +1,111 @@ +function runTest(config,qualifier) { + + var testname = ( qualifier || '' ) + config.keysystem + + ', successful playback, temporary, ' + + /video\/([^;]*)/.exec( config.videoType )[ 1 ] + + ', multiple keys, single session, ' + + config.testcase; + + var configuration = { initDataTypes: [ config.initDataType ], + audioCapabilities: [ { contentType: config.audioType } ], + videoCapabilities: [ { contentType: config.videoType } ], + sessionTypes: [ 'temporary' ] }; + + async_test( function( test ) { + + var _video = config.video, + _mediaKeys, + _mediaKeySessions = [ ], + _mediaSource; + + function onEncrypted(event) { + assert_equals(event.target, _video); + assert_true(event instanceof window.MediaEncryptedEvent); + assert_equals(event.type, 'encrypted'); + + // Only create a session for the first encrypted event + if ( _mediaKeySessions.length > 0 ) return; + + var mediaKeySession = _mediaKeys.createSession( 'temporary' ); + + waitForEventAndRunStep('message', mediaKeySession, onMessage, test); + + var initDataType, initData; + if ( config.initDataType && config.initData ) + { + initDataType = config.initDataType; + initData = config.initData; + } + else + { + initDataType = event.initDataType; + initData = event.initData; + } + + _mediaKeySessions.push( mediaKeySession ); + + mediaKeySession.generateRequest( initDataType, initData ) + .catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + } + + function onMessage(event) { + assert_any( assert_equals, event.target, _mediaKeySessions ); + assert_true( event instanceof window.MediaKeyMessageEvent ); + assert_equals( event.type, 'message'); + + assert_any( assert_equals, + event.messageType, + [ 'license-request', 'individualization-request' ] ); + + config.messagehandler( event.messageType, event.message ) + .then( function( response ) { + + event.target.update( response ) + .catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + }); + } + + function onPlaying(event) { + + // Not using waitForEventAndRunStep() to avoid too many + // EVENT(onTimeUpdate) logs. + _video.addEventListener('timeupdate', onTimeupdate, true); + } + + function onTimeupdate(event) { + if ( _video.currentTime > ( config.duration || 2 ) ) { + + consoleWrite("Session 0:"); + dumpKeyStatuses( _mediaKeySessions[ 0 ].keyStatuses ); + + _video.removeEventListener('timeupdate', onTimeupdate); + _video.pause(); + test.done(); + } + } + + navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) { + return access.createMediaKeys(); + }).then(function(mediaKeys) { + _mediaKeys = mediaKeys; + + _video.setMediaKeys(_mediaKeys); + + waitForEventAndRunStep('encrypted', _video, onEncrypted, test); + waitForEventAndRunStep('playing', _video, onPlaying, test); + + }).then(function() { + return testmediasource(config); + }).then(function(source) { + _mediaSource = source; + _video.src = URL.createObjectURL(_mediaSource); + _video.play(); + }).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + }, testname); +} diff --git a/encrypted-media/scripts/playback-temporary-setMediaKeys.js b/encrypted-media/scripts/playback-temporary-setMediaKeys.js new file mode 100644 index 00000000000000..aa44d9e55072bd --- /dev/null +++ b/encrypted-media/scripts/playback-temporary-setMediaKeys.js @@ -0,0 +1,106 @@ +SETMEDIAKEYS_IMMEDIATELY = 0; +SETMEDIAKEYS_AFTER_SRC = 1; +SETMEDIAKEYS_ONENCRYPTED = 2; +SETMEDIAKEYS_AFTER_UPDATE = 3; + +function runTest(config,qualifier) { + + var testcase = ( config.testcase === SETMEDIAKEYS_IMMEDIATELY ) ? 'setMediaKeys first' + : ( config.testcase === SETMEDIAKEYS_AFTER_SRC ) ? 'setMediaKeys after setting video.src' + : ( config.testcase === SETMEDIAKEYS_ONENCRYPTED ) ? 'setMediaKeys in encrypted event' + : ( config.testcase === SETMEDIAKEYS_AFTER_UPDATE ) ? 'setMediaKeys after updating session' + : 'unknown'; + + var testname = ( qualifier || '' ) + config.keysystem + + ', sucessful playback, temporary, ' + + /video\/([^;]*)/.exec( config.videoType )[ 1 ] + + ', ' + testcase; + + var configuration = { initDataTypes: [ config.initDataType ], + audioCapabilities: [ { contentType: config.audioType } ], + videoCapabilities: [ { contentType: config.videoType } ], + sessionTypes: [ 'temporary' ] }; + + async_test( function( test ) { + + var _video = config.video, + _mediaKeys, + _mediaKeySession, + _mediaSource; + + function onFailure(error) { + forceTestFailureFromPromise(test, error); + } + + function onMessage(event) { + assert_equals( event.target, _mediaKeySession ); + assert_true( event instanceof window.MediaKeyMessageEvent ); + assert_equals( event.type, 'message'); + + assert_any( assert_equals, + event.messageType, + [ 'license-request', 'individualization-request' ] ); + + config.messagehandler( event.messageType, event.message ).then( function( response ) { + return _mediaKeySession.update( response ); + }).then( function() { + if ( config.testcase === SETMEDIAKEYS_AFTER_UPDATE ) { + return _video.setMediaKeys( _mediaKeys ); + } + }).catch(onFailure); + } + + function onEncrypted(event) { + assert_equals(event.target, _video); + assert_true(event instanceof window.MediaEncryptedEvent); + assert_equals(event.type, 'encrypted'); + + var promise = ( config.testcase === SETMEDIAKEYS_ONENCRYPTED ) + ? _video.setMediaKeys( _mediaKeys ) + : Promise.resolve(); + + promise.then( function() { + waitForEventAndRunStep('message', _mediaKeySession, onMessage, test); + return _mediaKeySession.generateRequest(config.initData ? config.initDataType : event.initDataType, + config.initData || event.initData ); + }).catch(onFailure); + } + + function onTimeupdate(event) { + if ( _video.currentTime > ( config.duration || 2 ) ) { + _video.pause(); + test.done(); + } + } + + function onPlaying(event) { + // Not using waitForEventAndRunStep() to avoid too many + // EVENT(onTimeUpdate) logs. + _video.addEventListener('timeupdate', onTimeupdate, true); + } + + navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) { + return access.createMediaKeys(); + }).then(test.step_func(function(mediaKeys) { + _mediaKeys = mediaKeys; + if ( config.testcase === SETMEDIAKEYS_IMMEDIATELY ) { + return _video.setMediaKeys( _mediaKeys ); + } + })).then(function(){ + _mediaKeySession = _mediaKeys.createSession( 'temporary' ); + + waitForEventAndRunStep('encrypted', _video, onEncrypted, test); + waitForEventAndRunStep('playing', _video, onPlaying, test); + + return testmediasource(config); + }).then(test.step_func(function(source) { + _mediaSource = source; + _video.src = URL.createObjectURL(_mediaSource); + _video.play(); + + if ( config.testcase === SETMEDIAKEYS_AFTER_SRC ) { + return _video.setMediaKeys( _mediaKeys ); + } + })).catch(onFailure); + }, testname); +} diff --git a/encrypted-media/scripts/playback-temporary-two-videos.js b/encrypted-media/scripts/playback-temporary-two-videos.js new file mode 100644 index 00000000000000..e8b32491ad0add --- /dev/null +++ b/encrypted-media/scripts/playback-temporary-two-videos.js @@ -0,0 +1,91 @@ +function runTest(config,qualifier) { + + var testname = ( qualifier || '' ) + config.keysystem + + ', sucessful playback, temporary, ' + + /video\/([^;]*)/.exec( config.videoType )[ 1 ] + + ', set src before setMediaKeys'; + + var configuration = { initDataTypes: [ config.initDataType ], + audioCapabilities: [ { contentType: config.audioType } ], + videoCapabilities: [ { contentType: config.videoType } ], + sessionTypes: [ 'temporary' ] }; + + promise_test(function(test) + { + var promises = config.video.map( function( video ) { return play_video_as_promise( test, video ); } ); + + return Promise.all(promises); + + }, testname ); + + function play_video_as_promise( test, _video ) { + var _mediaKeys, + _mediaKeySession, + _mediaSource; + + function onMessage(event) { + assert_equals( event.target, _mediaKeySession ); + assert_true( event instanceof window.MediaKeyMessageEvent ); + assert_equals( event.type, 'message'); + + assert_any( assert_equals, + event.messageType, + [ 'license-request', 'individualization-request' ] ); + + config.messagehandler( event.messageType, event.message ).then( function( response ) { + + _mediaKeySession.update( response ).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + }); + } + + function onEncrypted(event) { + assert_equals(event.target, _video); + assert_true(event instanceof window.MediaEncryptedEvent); + assert_equals(event.type, 'encrypted'); + + waitForEventAndRunStep('message', _mediaKeySession, onMessage, test); + + _mediaKeySession.generateRequest( config.initData ? config.initDataType : event.initDataType, + config.initData || event.initData ) + .catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + + _video.setMediaKeys(_mediaKeys); + } + + function wait_for_timeupdate_message(video) + { + return new Promise(function(resolve) { + video.addEventListener('timeupdate', function listener(event) { + if ( event.target.currentTime > ( config.duration || 2 ) ) + { + video.removeEventListener('timeupdate', listener); + resolve(event); + } + }); + }); + }; + + return navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) { + return access.createMediaKeys(); + }).then(function(mediaKeys) { + _mediaKeys = mediaKeys; + _mediaKeySession = _mediaKeys.createSession( 'temporary' ); + + waitForEventAndRunStep('encrypted', _video, onEncrypted, test); + + }).then(function() { + return testmediasource(config); + }).then(function(source) { + _mediaSource = source; + _video.src = URL.createObjectURL(_mediaSource); + _video.play(); + return wait_for_timeupdate_message(_video); + }).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + } +} diff --git a/encrypted-media/scripts/playback-temporary-waitingforkey.js b/encrypted-media/scripts/playback-temporary-waitingforkey.js new file mode 100644 index 00000000000000..c11332c4b52e64 --- /dev/null +++ b/encrypted-media/scripts/playback-temporary-waitingforkey.js @@ -0,0 +1,70 @@ +function runTest(config,qualifier) { + + // config.initData contains a list of keys. We expect those to be needed in order and get + // one waitingforkey event for each one. + + var testname = ( qualifier || '' ) + config.keysystem + + ', successful playback, temporary, ' + + /video\/([^;]*)/.exec( config.videoType )[ 1 ] + + ', waitingforkey event, ' + + config.initData.length + ' key' + ( config.initData.length > 1 ? 's' : '' ); + + var configuration = { initDataTypes: [ config.initDataType ], + audioCapabilities: [ { contentType: config.audioType } ], + videoCapabilities: [ { contentType: config.videoType } ], + sessionTypes: [ 'temporary' ] }; + + async_test( function( test ) { + + var _video = config.video, + _mediaKeys, + _mediaKeySessions = [ ], + _mediaSource; + + function onFailure( error ) { + forceTestFailureFromPromise(test, error); + } + + function onMessage(event) { + config.messagehandler( config.keysystem, event.messageType, event.message ).then( function( response ) { + event.target.update( response ).catch(onFailure); + }); + } + + function onWaitingForKey(event) { + // Expect one waitingforkey event for each initData we were given + assert_less_than( _mediaKeySessions.length, config.initData.length ); + var mediaKeySession = _mediaKeys.createSession( 'temporary' ); + waitForEventAndRunStep('message', mediaKeySession, onMessage, test); + _mediaKeySessions.push( mediaKeySession ); + mediaKeySession.generateRequest( config.initDataType, config.initData[ _mediaKeySessions.length - 1 ] ).catch(onFailure); + } + + function onTimeupdate(event) { + if ( _video.currentTime > ( config.duration || 5 ) ) { + assert_equals( _mediaKeySessions.length, config.initData.length ); + _video.removeEventListener('timeupdate', onTimeupdate); + _video.pause(); + test.done(); + } + } + + navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) { + return access.createMediaKeys(); + }).then(function(mediaKeys) { + _mediaKeys = mediaKeys; + _video.setMediaKeys(_mediaKeys); + waitForEventAndRunStep('waitingforkey', _video, onWaitingForKey, test); + + // Not using waitForEventAndRunStep() to avoid too many + // EVENT(onTimeUpdate) logs. + _video.addEventListener('timeupdate', onTimeupdate, true); + }).then(function() { + return testmediasource(config); + }).then(function(source) { + _mediaSource = source; + _video.src = URL.createObjectURL(_mediaSource); + _video.play(); + }).catch(onFailure); + }, testname); +} diff --git a/encrypted-media/scripts/playback-temporary.js b/encrypted-media/scripts/playback-temporary.js new file mode 100644 index 00000000000000..13aac3d4cac2e3 --- /dev/null +++ b/encrypted-media/scripts/playback-temporary.js @@ -0,0 +1,83 @@ +function runTest(config,qualifier) { + + var testname = ( qualifier || '' ) + config.keysystem + + ', sucessful playback, temporary, ' + + /video\/([^;]*)/.exec( config.videoType )[ 1 ] + + ', set src before setMediaKeys'; + + var configuration = { initDataTypes: [ config.initDataType ], + audioCapabilities: [ { contentType: config.audioType } ], + videoCapabilities: [ { contentType: config.videoType } ], + sessionTypes: [ 'temporary' ] }; + + async_test( function( test ) { + + var _video = config.video, + _mediaKeys, + _mediaKeySession, + _mediaSource; + + function onMessage(event) { + assert_equals( event.target, _mediaKeySession ); + assert_true( event instanceof window.MediaKeyMessageEvent ); + assert_equals( event.type, 'message'); + + assert_any( assert_equals, + event.messageType, + [ 'license-request', 'individualization-request' ] ); + + config.messagehandler( event.messageType, event.message ).then( function( response ) { + + _mediaKeySession.update( response ).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + }); + } + + function onEncrypted(event) { + assert_equals(event.target, _video); + assert_true(event instanceof window.MediaEncryptedEvent); + assert_equals(event.type, 'encrypted'); + + waitForEventAndRunStep('message', _mediaKeySession, onMessage, test); + _mediaKeySession.generateRequest( config.initData ? config.initDataType : event.initDataType, + config.initData || event.initData ) + .catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + + _video.setMediaKeys(_mediaKeys); + } + + function onTimeupdate(event) { + if ( _video.currentTime > ( config.duration || 2 ) ) { + _video.pause(); + test.done(); + } + } + + function onPlaying(event) { + // Not using waitForEventAndRunStep() to avoid too many + // EVENT(onTimeUpdate) logs. + _video.addEventListener('timeupdate', onTimeupdate, true); + } + + navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) { + return access.createMediaKeys(); + }).then(function(mediaKeys) { + _mediaKeys = mediaKeys; + _mediaKeySession = _mediaKeys.createSession( 'temporary' ); + + waitForEventAndRunStep('encrypted', _video, onEncrypted, test); + waitForEventAndRunStep('playing', _video, onPlaying, test); + }).then(function() { + return testmediasource(config); + }).then(function(source) { + _mediaSource = source; + _video.src = URL.createObjectURL(_mediaSource); + _video.play(); + }).catch(function(error) { + forceTestFailureFromPromise(test, error); + }); + }, testname); +} diff --git a/encrypted-media/util/clearkey-messagehandler.js b/encrypted-media/util/clearkey-messagehandler.js new file mode 100644 index 00000000000000..d82d4daf959f59 --- /dev/null +++ b/encrypted-media/util/clearkey-messagehandler.js @@ -0,0 +1,44 @@ +// Expect utf8decoder and utf8decoder to be TextEncoder('utf-8') and TextDecoder('utf-8') respectively + +function MessageHandler( keysystem, content ) { + this._keysystem = keysystem; + this._content = content; + this.messagehandler = MessageHandler.prototype.messagehandler.bind( this ); + this.servercertificate = undefined; +} + +MessageHandler.prototype.messagehandler = function messagehandler( messageType, message ) +{ + if ( messageType === 'license-request' ) + { + var request = fromUtf8( message ); + + var keys = request.kids.map( function( kid ) { + + var key; + for( var i=0; i < this._content.keys.length; ++i ) + { + if ( base64urlEncode( this._content.keys[ i ].kid ) === kid ) + { + key = base64urlEncode( this._content.keys[ i ].key ); + break; + } + } + + return { kty: 'oct', kid: kid, k: key }; + + }.bind( this ) ); + + return Promise.resolve( toUtf8( { keys: keys } ) ); + } + else if ( messageType === 'license-release' ) + { + var release = fromUtf8( message ); + + // TODO: Check the license release message here + + return Promise.resolve( toUtf8( { kids: release.kids } ) ); + } + + throw new TypeError( 'Unsupported message type for ClearKey' ); +}; \ No newline at end of file diff --git a/encrypted-media/util/drm-messagehandler.js b/encrypted-media/util/drm-messagehandler.js new file mode 100644 index 00000000000000..f2b07550b1fc05 --- /dev/null +++ b/encrypted-media/util/drm-messagehandler.js @@ -0,0 +1,234 @@ +// Expect utf8decoder and utf8decoder to be TextEncoder('utf-8') and TextDecoder('utf-8') respectively +// +// drmconfig format: +// { : { "serverURL" : , +// "httpRequestHeaders" : , +// "servertype" : "microsoft" | "drmtoday", // affects how request parameters are formed +// "certificate" : } } +// + +drmconfig = { + "com.widevine.alpha": { + "serverURL": "https://lic.staging.drmtoday.com/license-proxy-widevine/cenc/", + "servertype" : "drmtoday", + "userId" : "12345", + "merchant" : "cablelabs" + }, +/* + "com.microsoft.playready": { + "serverURL": "http://playready-testserver.azurewebsites.net/rightsmanager.asmx", + "servertype": "microsoft", + "certificate" : "Q0hBSQAAAAEAAAUEAAAAAAAAAAJDRVJUAAAAAQAAAfQAAAFkAAEAAQAAAFjt9G6KdSncCkrjbTQPN+/2AAAAAAAAAAAAAAAJIPbrW9dj0qydQFIomYFHOwbhGZVGP2ZsPwcvjh+NFkP/////AAAAAAAAAAAAAAAAAAAAAAABAAoAAABYxw6TjIuUUmvdCcl00t4RBAAAADpodHRwOi8vcGxheXJlYWR5LmRpcmVjdHRhcHMubmV0L3ByL3N2Yy9yaWdodHNtYW5hZ2VyLmFzbXgAAAAAAQAFAAAADAAAAAAAAQAGAAAAXAAAAAEAAQIAAAAAADBRmRRpqV4cfRLcWz9WoXIGZ5qzD9xxJe0CSI2mXJQdPHEFZltrTkZtdmurwVaEI2etJY0OesCeOCzCqmEtTkcAAAABAAAAAgAAAAcAAAA8AAAAAAAAAAVEVEFQAAAAAAAAABVNZXRlcmluZyBDZXJ0aWZpY2F0ZQAAAAAAAAABAAAAAAABAAgAAACQAAEAQGHic/IPbmLCKXxc/MH20X/RtjhXH4jfowBWsQE1QWgUUBPFId7HH65YuQJ5fxbQJCT6Hw0iHqKzaTkefrhIpOoAAAIAW+uRUsdaChtq/AMUI4qPlK2Bi4bwOyjJcSQWz16LAFfwibn5yHVDEgNA4cQ9lt3kS4drx7pCC+FR/YLlHBAV7ENFUlQAAAABAAAC/AAAAmwAAQABAAAAWMk5Z0ovo2X0b2C9K5PbFX8AAAAAAAAAAAAAAARTYd1EkpFovPAZUjOj2doDLnHiRSfYc89Fs7gosBfar/////8AAAAAAAAAAAAAAAAAAAAAAAEABQAAAAwAAAAAAAEABgAAAGAAAAABAAECAAAAAABb65FSx1oKG2r8AxQjio+UrYGLhvA7KMlxJBbPXosAV/CJufnIdUMSA0DhxD2W3eRLh2vHukIL4VH9guUcEBXsAAAAAgAAAAEAAAAMAAAABwAAAZgAAAAAAAAAgE1pY3Jvc29mdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgFBsYXlSZWFkeSBTTDAgTWV0ZXJpbmcgUm9vdCBDQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgDEuMC4wLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEACAAAAJAAAQBArAKJsEIDWNG5ulOgLvSUb8I2zZ0c5lZGYvpIO56Z0UNk/uC4Mq3jwXQUUN6m/48V5J/vuLDhWu740aRQc1dDDAAAAgCGTWHP8iVuQixWizwoABz7PhUnZYWEugUht5sYKNk23h2Cao/D5uf6epDVyilG8fZKLvufXc/+fkNOtEKT+sWr" + }, + + "com.microsoft.playready": { + "serverURL": "http://playready.directtaps.net/pr/svc/rightsmanager.asmx", + "servertype": "microsoft", + "certificate" : "Q0hBSQAAAAEAAAUEAAAAAAAAAAJDRVJUAAAAAQAAAfQAAAFkAAEAAQAAAFjt9G6KdSncCkrjbTQPN+/2AAAAAAAAAAAAAAAJIPbrW9dj0qydQFIomYFHOwbhGZVGP2ZsPwcvjh+NFkP/////AAAAAAAAAAAAAAAAAAAAAAABAAoAAABYxw6TjIuUUmvdCcl00t4RBAAAADpodHRwOi8vcGxheXJlYWR5LmRpcmVjdHRhcHMubmV0L3ByL3N2Yy9yaWdodHNtYW5hZ2VyLmFzbXgAAAAAAQAFAAAADAAAAAAAAQAGAAAAXAAAAAEAAQIAAAAAADBRmRRpqV4cfRLcWz9WoXIGZ5qzD9xxJe0CSI2mXJQdPHEFZltrTkZtdmurwVaEI2etJY0OesCeOCzCqmEtTkcAAAABAAAAAgAAAAcAAAA8AAAAAAAAAAVEVEFQAAAAAAAAABVNZXRlcmluZyBDZXJ0aWZpY2F0ZQAAAAAAAAABAAAAAAABAAgAAACQAAEAQGHic/IPbmLCKXxc/MH20X/RtjhXH4jfowBWsQE1QWgUUBPFId7HH65YuQJ5fxbQJCT6Hw0iHqKzaTkefrhIpOoAAAIAW+uRUsdaChtq/AMUI4qPlK2Bi4bwOyjJcSQWz16LAFfwibn5yHVDEgNA4cQ9lt3kS4drx7pCC+FR/YLlHBAV7ENFUlQAAAABAAAC/AAAAmwAAQABAAAAWMk5Z0ovo2X0b2C9K5PbFX8AAAAAAAAAAAAAAARTYd1EkpFovPAZUjOj2doDLnHiRSfYc89Fs7gosBfar/////8AAAAAAAAAAAAAAAAAAAAAAAEABQAAAAwAAAAAAAEABgAAAGAAAAABAAECAAAAAABb65FSx1oKG2r8AxQjio+UrYGLhvA7KMlxJBbPXosAV/CJufnIdUMSA0DhxD2W3eRLh2vHukIL4VH9guUcEBXsAAAAAgAAAAEAAAAMAAAABwAAAZgAAAAAAAAAgE1pY3Jvc29mdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgFBsYXlSZWFkeSBTTDAgTWV0ZXJpbmcgUm9vdCBDQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgDEuMC4wLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEACAAAAJAAAQBArAKJsEIDWNG5ulOgLvSUb8I2zZ0c5lZGYvpIO56Z0UNk/uC4Mq3jwXQUUN6m/48V5J/vuLDhWu740aRQc1dDDAAAAgCGTWHP8iVuQixWizwoABz7PhUnZYWEugUht5sYKNk23h2Cao/D5uf6epDVyilG8fZKLvufXc/+fkNOtEKT+sWr" + }, +*/ + "com.microsoft.playready": { + "serverURL": "https://lic.staging.drmtoday.com/license-proxy-headerauth/drmtoday/RightsManager.asmx", + "servertype" : "drmtoday", + "userId" : "12345", + "merchant" : "cablelabs" + } +}; + +function MessageHandler( keysystem, content, sessionType ) { + this._keysystem = keysystem; + this._content = content; + this._sessionType = sessionType || "temporary"; + this._drmconfig = drmconfig[ this._keysystem ]; + + this.messagehandler = MessageHandler.prototype.messagehandler.bind( this ); + if ( this._drmconfig && this._drmconfig.certificate ) { + this.servercertificate = stringToUint8Array( atob( this._drmconfig.certificate ) ); + } +} + +MessageHandler.prototype.messagehandler = function messagehandler( messageType, message) { + + // For the DRM Today server, mapping between Key System messages and server protocol messages depends on + // the Key System, so we provide key-system-specific functions here to perform the mapping. + // + // For the Microsoft server, the mapping for PlayReady is the same as for the DRM Today server + // + const keySystems = { + 'com.widevine.alpha': { + responseType: 'json', + getLicenseMessage: function(response) { + return base64DecodeToUnit8Array( response.license ); + }, + getErrorResponse: function(response) { + return response; + }, + getLicenseRequestFromMessage: function(message) { + return new Uint8Array(message); + }, + getRequestHeadersFromMessage: function(/*message*/) { + return null; + } + }, + 'com.microsoft.playready': { + responseType: 'arraybuffer', + getLicenseMessage: function(response) { + return response; + }, + getErrorResponse: function(response) { + return String.fromCharCode.apply(null, new Uint16Array(response)); + }, + getLicenseRequestFromMessage: function(message) { + var msg, + xmlDoc; + var licenseRequest = null; + var parser = new DOMParser(); + var dataview = new Uint16Array(message); + + msg = String.fromCharCode.apply(null, dataview); + + xmlDoc = parser.parseFromString(msg, 'application/xml'); + + if (xmlDoc.getElementsByTagName('Challenge')[0]) { + var Challenge = xmlDoc.getElementsByTagName('Challenge')[0].childNodes[0].nodeValue; + if (Challenge) { + licenseRequest = atob(Challenge); + } + } + return licenseRequest; + }, + getRequestHeadersFromMessage: function(message) { + var msg, + xmlDoc; + var headers = {}; + var parser = new DOMParser(); + var dataview = new Uint16Array(message); + + msg = String.fromCharCode.apply(null, dataview); + xmlDoc = parser.parseFromString(msg, 'application/xml'); + + var headerNameList = xmlDoc.getElementsByTagName('name'); + var headerValueList = xmlDoc.getElementsByTagName('value'); + for (var i = 0; i < headerNameList.length; i++) { + headers[headerNameList[i].childNodes[0].nodeValue] = headerValueList[i].childNodes[0].nodeValue; + } + // some versions of the PlayReady CDM return 'Content' instead of 'Content-Type', + // but the license server expects 'Content-Type', so we fix it up here. + if (headers.hasOwnProperty('Content')) { + headers['Content-Type'] = headers.Content; + delete headers.Content; + } + return headers; + } + } + }; + + // License request parameters are communicated to the DRM Today and Microsoft servers in different ways, + // using a custom HTTP headers (DRM Today) and URL parameters (Microsoft). + const serverTypes = { + 'drmtoday': { + constructLicenseRequestUrl : function( serverURL, sessionType, messageType, content ) { + return serverURL; + }, + getCustomHeaders : function( drmconfig, sessionType ) { + var customToken = { outputProtection: { digital : false, analogue: false, enforce: false }, + profile: { purchase: { } }, + storeLicense: ( sessionType === 'persistent-license' ) }; + var customHeader = { userId: drmconfig.userId, + merchant: drmconfig.merchant, + sessionId: btoa( JSON.stringify( customToken )) }; + return { "dt-custom-data" : btoa( JSON.stringify( customHeader ) ) }; + } + }, + 'microsoft': { + constructLicenseRequestUrl : function( serverURL, sessionType, messageType, content ) { + if ( messageType !== 'license-request' ) { + return serverURL; + } + + var url = serverURL + "?"; + if ( sessionType === 'temporary' || sessionType === 'persistent-usage-record' ) { + url += "UseSimpleNonPersistentLicense=1&"; + } + if ( sessionType === 'persistent-usage-record' ) { + url += "SecureStop=1&"; + } + url += "PlayEnablers=B621D91F-EDCC-4035-8D4B-DC71760D43E9&"; // disable output protection + url += "ContentKey=" + btoa(String.fromCharCode.apply(null, content.keys[0].key)); + return url; + }, + getCustomHeaders : function() { return {}; } + } + }; + + return new Promise(function(resolve, reject) { + var keysystemfns = keySystems[this._keysystem], + serverfns, + url = undefined, + requestheaders = {}, + credentials = undefined; + + if ( !this._drmconfig || !keysystemfns || !this._drmconfig.servertype || !serverTypes[this._drmconfig.servertype] ) { + reject('Unsupported Key System'); + return; + } + + serverfns = serverTypes[this._drmconfig.servertype]; + + if ( !this._drmconfig.serverURL ) { + reject('Undefined serverURL'); + return; + } + + url = serverfns.constructLicenseRequestUrl( this._drmconfig.serverURL, this._sessionType, messageType, this._content ); + + // Ensure valid license server URL + if (!url) { + reject('No license server URL specified!'); + return; + } + + // Set optional XMLHttpRequest headers from protection data and message + var updateHeaders = function(headers) { + var key; + if (headers) { + for (key in headers) { + if ('authorization' === key.toLowerCase()) { + credentials = 'include'; + } + requestheaders[key] = headers[key]; + } + } + }; + + updateHeaders(serverfns.getCustomHeaders( this._drmconfig, this._sessionType ) ); + updateHeaders(keysystemfns.getRequestHeadersFromMessage(message)); + + // Set withCredentials property from server + if ( this._drmconfig.withCredentials ) { + credentials = 'include'; + } + + fetch(url, { + method: 'POST', + headers: requestheaders, + credentials: credentials, + body: keysystemfns.getLicenseRequestFromMessage(message) + }).then(function(fetchresponse) { + if(fetchresponse.status !== 200) { + reject( this._keysystem + ' update, XHR status is "' + fetchresponse.statusText + + '" (' + fetchresponse.status + '), expected to be 200. readyState is ' + fetchresponse.readyState + '.' + + ' Response is ' + ((fetchresponse) ? keysystemfns.getErrorResponse(fetchresponse) : 'NONE' )); + return; + } + + if(keysystemfns.responseType === 'json') { + return fetchresponse.json(); + } else if(keysystemfns.responseType === 'arraybuffer') { + return fetchresponse.arrayBuffer(); + } + }.bind( this )).then(function(response){ + resolve(keysystemfns.getLicenseMessage(response)); + }).catch(reject); + }.bind( this )); +}; diff --git a/encrypted-media/util/fetch.js b/encrypted-media/util/fetch.js new file mode 100644 index 00000000000000..d14d00bdbe2bda --- /dev/null +++ b/encrypted-media/util/fetch.js @@ -0,0 +1,456 @@ +// https://github.com/github/fetch +// +// Copyright (c) 2014-2016 GitHub, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +(function(self) { + 'use strict'; + + if (self.fetch) { + return + } + + var support = { + searchParams: 'URLSearchParams' in self, + iterable: 'Symbol' in self && 'iterator' in Symbol, + blob: 'FileReader' in self && 'Blob' in self && (function() { + try { + new Blob() + return true + } catch(e) { + return false + } + })(), + formData: 'FormData' in self, + arrayBuffer: 'ArrayBuffer' in self + } + + function normalizeName(name) { + if (typeof name !== 'string') { + name = String(name) + } + if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) { + throw new TypeError('Invalid character in header field name') + } + return name.toLowerCase() + } + + function normalizeValue(value) { + if (typeof value !== 'string') { + value = String(value) + } + return value + } + + // Build a destructive iterator for the value list + function iteratorFor(items) { + var iterator = { + next: function() { + var value = items.shift() + return {done: value === undefined, value: value} + } + } + + if (support.iterable) { + iterator[Symbol.iterator] = function() { + return iterator + } + } + + return iterator + } + + function Headers(headers) { + this.map = {} + + if (headers instanceof Headers) { + headers.forEach(function(value, name) { + this.append(name, value) + }, this) + + } else if (headers) { + Object.getOwnPropertyNames(headers).forEach(function(name) { + this.append(name, headers[name]) + }, this) + } + } + + Headers.prototype.append = function(name, value) { + name = normalizeName(name) + value = normalizeValue(value) + var list = this.map[name] + if (!list) { + list = [] + this.map[name] = list + } + list.push(value) + } + + Headers.prototype['delete'] = function(name) { + delete this.map[normalizeName(name)] + } + + Headers.prototype.get = function(name) { + var values = this.map[normalizeName(name)] + return values ? values[0] : null + } + + Headers.prototype.getAll = function(name) { + return this.map[normalizeName(name)] || [] + } + + Headers.prototype.has = function(name) { + return this.map.hasOwnProperty(normalizeName(name)) + } + + Headers.prototype.set = function(name, value) { + this.map[normalizeName(name)] = [normalizeValue(value)] + } + + Headers.prototype.forEach = function(callback, thisArg) { + Object.getOwnPropertyNames(this.map).forEach(function(name) { + this.map[name].forEach(function(value) { + callback.call(thisArg, value, name, this) + }, this) + }, this) + } + + Headers.prototype.keys = function() { + var items = [] + this.forEach(function(value, name) { items.push(name) }) + return iteratorFor(items) + } + + Headers.prototype.values = function() { + var items = [] + this.forEach(function(value) { items.push(value) }) + return iteratorFor(items) + } + + Headers.prototype.entries = function() { + var items = [] + this.forEach(function(value, name) { items.push([name, value]) }) + return iteratorFor(items) + } + + if (support.iterable) { + Headers.prototype[Symbol.iterator] = Headers.prototype.entries + } + + function consumed(body) { + if (body.bodyUsed) { + return Promise.reject(new TypeError('Already read')) + } + body.bodyUsed = true + } + + function fileReaderReady(reader) { + return new Promise(function(resolve, reject) { + reader.onload = function() { + resolve(reader.result) + } + reader.onerror = function() { + reject(reader.error) + } + }) + } + + function readBlobAsArrayBuffer(blob) { + var reader = new FileReader() + reader.readAsArrayBuffer(blob) + return fileReaderReady(reader) + } + + function readBlobAsText(blob) { + var reader = new FileReader() + reader.readAsText(blob) + return fileReaderReady(reader) + } + + function Body() { + this.bodyUsed = false + + this._initBody = function(body) { + this._bodyInit = body + if (typeof body === 'string') { + this._bodyText = body + } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { + this._bodyBlob = body + } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { + this._bodyFormData = body + } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { + this._bodyText = body.toString() + } else if (!body) { + this._bodyText = '' + } else if (support.arrayBuffer && ArrayBuffer.prototype.isPrototypeOf(body)) { + // Only support ArrayBuffers for POST method. + // Receiving ArrayBuffers happens via Blobs, instead. + } else { + throw new Error('unsupported BodyInit type') + } + + if (!this.headers.get('content-type')) { + if (typeof body === 'string') { + this.headers.set('content-type', 'text/plain;charset=UTF-8') + } else if (this._bodyBlob && this._bodyBlob.type) { + this.headers.set('content-type', this._bodyBlob.type) + } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { + this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8') + } + } + } + + if (support.blob) { + this.blob = function() { + var rejected = consumed(this) + if (rejected) { + return rejected + } + + if (this._bodyBlob) { + return Promise.resolve(this._bodyBlob) + } else if (this._bodyFormData) { + throw new Error('could not read FormData body as blob') + } else { + return Promise.resolve(new Blob([this._bodyText])) + } + } + + this.arrayBuffer = function() { + return this.blob().then(readBlobAsArrayBuffer) + } + + this.text = function() { + var rejected = consumed(this) + if (rejected) { + return rejected + } + + if (this._bodyBlob) { + return readBlobAsText(this._bodyBlob) + } else if (this._bodyFormData) { + throw new Error('could not read FormData body as text') + } else { + return Promise.resolve(this._bodyText) + } + } + } else { + this.text = function() { + var rejected = consumed(this) + return rejected ? rejected : Promise.resolve(this._bodyText) + } + } + + if (support.formData) { + this.formData = function() { + return this.text().then(decode) + } + } + + this.json = function() { + return this.text().then(JSON.parse) + } + + return this + } + + // HTTP methods whose capitalization should be normalized + var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'] + + function normalizeMethod(method) { + var upcased = method.toUpperCase() + return (methods.indexOf(upcased) > -1) ? upcased : method + } + + function Request(input, options) { + options = options || {} + var body = options.body + if (Request.prototype.isPrototypeOf(input)) { + if (input.bodyUsed) { + throw new TypeError('Already read') + } + this.url = input.url + this.credentials = input.credentials + if (!options.headers) { + this.headers = new Headers(input.headers) + } + this.method = input.method + this.mode = input.mode + if (!body) { + body = input._bodyInit + input.bodyUsed = true + } + } else { + this.url = input + } + + this.credentials = options.credentials || this.credentials || 'omit' + if (options.headers || !this.headers) { + this.headers = new Headers(options.headers) + } + this.method = normalizeMethod(options.method || this.method || 'GET') + this.mode = options.mode || this.mode || null + this.referrer = null + + if ((this.method === 'GET' || this.method === 'HEAD') && body) { + throw new TypeError('Body not allowed for GET or HEAD requests') + } + this._initBody(body) + } + + Request.prototype.clone = function() { + return new Request(this) + } + + function decode(body) { + var form = new FormData() + body.trim().split('&').forEach(function(bytes) { + if (bytes) { + var split = bytes.split('=') + var name = split.shift().replace(/\+/g, ' ') + var value = split.join('=').replace(/\+/g, ' ') + form.append(decodeURIComponent(name), decodeURIComponent(value)) + } + }) + return form + } + + function headers(xhr) { + var head = new Headers() + var pairs = (xhr.getAllResponseHeaders() || '').trim().split('\n') + pairs.forEach(function(header) { + var split = header.trim().split(':') + var key = split.shift().trim() + var value = split.join(':').trim() + head.append(key, value) + }) + return head + } + + Body.call(Request.prototype) + + function Response(bodyInit, options) { + if (!options) { + options = {} + } + + this.type = 'default' + this.status = options.status + this.ok = this.status >= 200 && this.status < 300 + this.statusText = options.statusText + this.headers = options.headers instanceof Headers ? options.headers : new Headers(options.headers) + this.url = options.url || '' + this._initBody(bodyInit) + } + + Body.call(Response.prototype) + + Response.prototype.clone = function() { + return new Response(this._bodyInit, { + status: this.status, + statusText: this.statusText, + headers: new Headers(this.headers), + url: this.url + }) + } + + Response.error = function() { + var response = new Response(null, {status: 0, statusText: ''}) + response.type = 'error' + return response + } + + var redirectStatuses = [301, 302, 303, 307, 308] + + Response.redirect = function(url, status) { + if (redirectStatuses.indexOf(status) === -1) { + throw new RangeError('Invalid status code') + } + + return new Response(null, {status: status, headers: {location: url}}) + } + + self.Headers = Headers + self.Request = Request + self.Response = Response + + self.fetch = function(input, init) { + return new Promise(function(resolve, reject) { + var request + if (Request.prototype.isPrototypeOf(input) && !init) { + request = input + } else { + request = new Request(input, init) + } + + var xhr = new XMLHttpRequest() + + function responseURL() { + if ('responseURL' in xhr) { + return xhr.responseURL + } + + // Avoid security warnings on getResponseHeader when not allowed by CORS + if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) { + return xhr.getResponseHeader('X-Request-URL') + } + + return + } + + xhr.onload = function() { + var options = { + status: xhr.status, + statusText: xhr.statusText, + headers: headers(xhr), + url: responseURL() + } + var body = 'response' in xhr ? xhr.response : xhr.responseText + resolve(new Response(body, options)) + } + + xhr.onerror = function() { + reject(new TypeError('Network request failed')) + } + + xhr.ontimeout = function() { + reject(new TypeError('Network request failed')) + } + + xhr.open(request.method, request.url, true) + + if (request.credentials === 'include') { + xhr.withCredentials = true + } + + if ('responseType' in xhr && support.blob) { + xhr.responseType = 'blob' + } + + request.headers.forEach(function(value, name) { + xhr.setRequestHeader(name, value) + }) + + xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit) + }) + } + self.fetch.polyfill = true +})(typeof self !== 'undefined' ? self : this); \ No newline at end of file diff --git a/encrypted-media/util/testmediasource.js b/encrypted-media/util/testmediasource.js new file mode 100644 index 00000000000000..62c2d577d3cf92 --- /dev/null +++ b/encrypted-media/util/testmediasource.js @@ -0,0 +1,43 @@ +function testmediasource(config) { + + return new Promise(function(resolve, reject) { + // Fetch the media resources + var fetches = [config.audioPath, config.videoPath].map(function(path) { + return fetch(path).then(function(response) { + if (!response.ok) throw new Error('Resource fetch failed'); + return response.arrayBuffer(); + }); + }); + + Promise.all(fetches).then(function(resources) { + config.audioMedia = resources[0]; + config.videoMedia = resources[1]; + + // Create media source + var source = new MediaSource(); + + // Create and fill source buffers when the media source is opened + source.addEventListener('sourceopen', onSourceOpen); + + function onSourceOpen(event) { + var audioSourceBuffer = source.addSourceBuffer(config.audioType), + videoSourceBuffer = source.addSourceBuffer(config.videoType); + + audioSourceBuffer.appendBuffer(config.audioMedia); + videoSourceBuffer.appendBuffer(config.videoMedia); + + function endOfStream() { + if (audioSourceBuffer.updating || videoSourceBuffer.updating) { + setTimeout(endOfStream, 250); + } else { + source.endOfStream(); + } + } + + endOfStream(); + } + + resolve(source); + }); + }); +} \ No newline at end of file diff --git a/encrypted-media/util/utf8.js b/encrypted-media/util/utf8.js new file mode 100644 index 00000000000000..5b11760137c2ed --- /dev/null +++ b/encrypted-media/util/utf8.js @@ -0,0 +1,22 @@ +if ( typeof TextEncoder !== "undefined" && typeof TextDecoder !== "undefined" ) +{ + utf8encoder = new TextEncoder('utf-8'); + utf8decoder = new TextDecoder('utf-8'); +} +else +{ + utf8encoder = { encode: function( text ) + { + var result = new Uint8Array(text.length); + for(var i = 0; i < text.length; i++) { result[i] = text.charCodeAt(i); } + return result; + } }; + + utf8decoder = { decode: function( buffer ) + { + return String.fromCharCode.apply(null, new Uint8Array(buffer)); + } }; +} + +toUtf8 = function( o ) { return utf8encoder.encode( JSON.stringify( o ) ); } +fromUtf8 = function( t ) { return JSON.parse( utf8decoder.decode( t ) ); } \ No newline at end of file diff --git a/encrypted-media/util/utils.js b/encrypted-media/util/utils.js new file mode 100644 index 00000000000000..8f1b09059b9dcd --- /dev/null +++ b/encrypted-media/util/utils.js @@ -0,0 +1,224 @@ +function getInitData(initDataType) { + + // FIXME: This is messed up, because here we are hard coding the key ids for the different content + // that we use for clearkey testing: webm and mp4. For keyids we return the mp4 one + // + // The content used with the DRM today servers has a different key id altogether + + if (initDataType == 'webm') { + return new Uint8Array([ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F + ]); + } + + if (initDataType == 'cenc') { + return new Uint8Array([ + 0x00, 0x00, 0x00, 0x34, // size + 0x70, 0x73, 0x73, 0x68, // 'pssh' + 0x01, // version = 1 + 0x00, 0x00, 0x00, // flags + 0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02, // Common SystemID + 0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B, + 0x00, 0x00, 0x00, 0x01, // key count + 0x00, 0x00, 0x00, 0x00, 0x03, 0xd2, 0xfc, 0x41, // key id + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 // datasize + ]); + } + if (initDataType == 'keyids') { + var keyId = new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, 0x03, 0xd2, 0xfc, 0x41, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + ]); + return stringToUint8Array(createKeyIDs(keyId)); + } + throw 'initDataType ' + initDataType + ' not supported.'; +} + +function stringToUint8Array(str) +{ + var result = new Uint8Array(str.length); + for(var i = 0; i < str.length; i++) { + result[i] = str.charCodeAt(i); + } + return result; +} +// Encodes |data| into base64url string. There is no '=' padding, and the +// characters '-' and '_' must be used instead of '+' and '/', respectively. +function base64urlEncode(data) { + var result = btoa(String.fromCharCode.apply(null, data)); + return result.replace(/=+$/g, '').replace(/\+/g, "-").replace(/\//g, "_"); +} +// Decode |encoded| using base64url decoding. +function base64urlDecode(encoded) { + return atob(encoded.replace(/\-/g, "+").replace(/\_/g, "/")); +} +// Decode |encoded| using base64 to a Uint8Array +function base64DecodeToUnit8Array(encoded) { + return new Uint8Array( atob( encoded ).split('').map( function(c){return c.charCodeAt(0);} ) ); +} +// Clear Key can also support Key IDs Initialization Data. +// ref: http://w3c.github.io/encrypted-media/keyids-format.html +// Each parameter is expected to be a key id in an Uint8Array. +function createKeyIDs() { + var keyIds = '{"kids":["'; + for (var i = 0; i < arguments.length; i++) { + if (i != 0) keyIds += '","'; + keyIds += base64urlEncode(arguments[i]); + } + keyIds += '"]}'; + return keyIds; +} + +function getSupportedKeySystem() { + var userAgent = navigator.userAgent.toLowerCase(); + var keysystem = undefined; + if (userAgent.indexOf('edge') > -1 ) { + keysystem = 'com.microsoft.playready'; + } else if ( userAgent.indexOf('chrome') > -1 || userAgent.indexOf('firefox') > -1 ) { + keysystem = 'com.widevine.alpha'; + } + return keysystem; +} + +function waitForEventAndRunStep(eventName, element, func, stepTest) +{ + var eventCallback = function(event) { + if (func) + func(event); + } + + element.addEventListener(eventName, stepTest.step_func(eventCallback), true); +} + +var consoleDiv = null; + +function consoleWrite(text) +{ + if (!consoleDiv && document.body) { + consoleDiv = document.createElement('div'); + document.body.appendChild(consoleDiv); + } + var span = document.createElement('span'); + span.appendChild(document.createTextNode(text)); + span.appendChild(document.createElement('br')); + consoleDiv.appendChild(span); +} + +function forceTestFailureFromPromise(test, error, message) +{ + // Promises convert exceptions into rejected Promises. Since there is + // currently no way to report a failed test in the test harness, errors + // are reported using force_timeout(). + if (message) + consoleWrite(message + ': ' + error.message); + else if (error) + consoleWrite(error); + + test.force_timeout(); + test.done(); +} + +// Returns an array of audioCapabilities that includes entries for a set of +// codecs that should cover all user agents. +function getPossibleAudioCapabilities() +{ + return [ + { contentType: 'audio/mp4; codecs="mp4a.40.2"' }, + { contentType: 'audio/webm; codecs="opus"' }, + ]; +} + +// Returns a trivial MediaKeySystemConfiguration that should be accepted, +// possibly as a subset of the specified capabilities, by all user agents. +function getSimpleConfiguration() +{ + return [ { + initDataTypes : [ 'webm', 'cenc', 'keyids' ], + audioCapabilities: getPossibleAudioCapabilities() + } ]; +} + +// Returns a MediaKeySystemConfiguration for |initDataType| that should be +// accepted, possibly as a subset of the specified capabilities, by all +// user agents. +function getSimpleConfigurationForInitDataType(initDataType) +{ + return [ { + initDataTypes: [ initDataType ], + audioCapabilities: getPossibleAudioCapabilities() + } ]; +} + +// Returns a promise that is fulfilled with true if |initDataType| is supported, +// by keysystem or false if not. +function isInitDataTypeSupported(keysystem,initDataType) +{ + return navigator.requestMediaKeySystemAccess( + keysystem, getSimpleConfigurationForInitDataType(initDataType)) + .then(function() { return true; }, function() { return false; }); +} + +function getSupportedInitDataTypes( keysystem ) +{ + return [ 'cenc', 'keyids', 'webm' ].filter( isInitDataTypeSupported.bind( null, keysystem ) ); +} + +function arrayBufferAsString(buffer) +{ + var array = []; + Array.prototype.push.apply( array, new Uint8Array( buffer ) ); + return '0x' + array.map( function( x ) { return x < 16 ? '0'+x.toString(16) : x.toString(16); } ).join(''); +} + +function dumpKeyStatuses(keyStatuses) +{ + consoleWrite("for (var entry of keyStatuses)"); + for (var entry of keyStatuses) { + consoleWrite(arrayBufferAsString(entry[0]) + ": " + entry[1]); + } + consoleWrite("for (var keyId of keyStatuses.keys())"); + for (var keyId of keyStatuses.keys()) { + consoleWrite(arrayBufferAsString(keyId)); + } + consoleWrite("for (var status of keyStatuses.values())"); + for (var status of keyStatuses.values()) { + consoleWrite(status); + } + consoleWrite("for (var entry of keyStatuses.entries())"); + for (var entry of keyStatuses.entries()) { + consoleWrite(arrayBufferAsString(entry[0]) + ": " + entry[1]); + } + consoleWrite("keyStatuses.forEach()"); + keyStatuses.forEach(function(status, keyId) { + consoleWrite(arrayBufferAsString(keyId) + ": " + status); + }); +} + +// Verify that |keyStatuses| contains just the keys in |keys.expected| +// and none of the keys in |keys.unexpected|. All keys should have status +// 'usable'. Example call: verifyKeyStatuses(mediaKeySession.keyStatuses, +// { expected: [key1], unexpected: [key2] }); +function verifyKeyStatuses(keyStatuses, keys) +{ + var expected = keys.expected || []; + var unexpected = keys.unexpected || []; + + // |keyStatuses| should have same size as number of |keys.expected|. + assert_equals(keyStatuses.size, expected.length, "keystatuses should have expected size"); + + // All |keys.expected| should be found. + expected.map(function(key) { + assert_true(keyStatuses.has(key), "keystatuses should have the expected keys"); + assert_equals(keyStatuses.get(key), 'usable', "keystatus value should be 'usable'"); + }); + + // All |keys.unexpected| should not be found. + unexpected.map(function(key) { + assert_false(keyStatuses.has(key), "keystatuses should not have unexpected keys"); + assert_equals(keyStatuses.get(key), undefined, "keystatus for unexpected key should be undefined"); + }); +} + + diff --git a/eventsource/resources/cors.py b/eventsource/resources/cors.py index 8be80523603abf..d01596c8366367 100644 --- a/eventsource/resources/cors.py +++ b/eventsource/resources/cors.py @@ -22,7 +22,7 @@ def main(request, response): "cache-control"]: if handler == "cache-control": response.headers.set("Content-Type", "text/event-stream") - rv = open(os.path.join(request.doc_root, "eventsource", "resources", "cache-control.event_stream")).read() + rv = open(os.path.join(request.doc_root, "eventsource", "resources", "cache-control.event_stream"), "r").read() response.content = rv pipes.sub(request, response) return diff --git a/fetch/api/basic/mode-same-origin-worker.html b/fetch/api/basic/mode-same-origin-worker.html index 0c62472aaf1841..cc39af3cb75950 100644 --- a/fetch/api/basic/mode-same-origin-worker.html +++ b/fetch/api/basic/mode-same-origin-worker.html @@ -11,7 +11,7 @@ - \ No newline at end of file + diff --git a/fetch/api/basic/mode-same-origin.html b/fetch/api/basic/mode-same-origin.html index d94832a2aa06e5..550053f30cca3b 100644 --- a/fetch/api/basic/mode-same-origin.html +++ b/fetch/api/basic/mode-same-origin.html @@ -11,6 +11,7 @@ - + + - \ No newline at end of file + diff --git a/fetch/api/basic/mode-same-origin.js b/fetch/api/basic/mode-same-origin.js index c00d96fad32e9f..6edc88b4d67886 100644 --- a/fetch/api/basic/mode-same-origin.js +++ b/fetch/api/basic/mode-same-origin.js @@ -1,6 +1,7 @@ if (this.document === undefined) { importScripts("/resources/testharness.js"); importScripts("../resources/utils.js"); + importScripts("/common/get-host-info.sub.js") } function fetchSameOrigin(url, shouldPass) { @@ -15,10 +16,12 @@ function fetchSameOrigin(url, shouldPass) { }, "Fetch "+ url + " with same-origin mode"); } +var host_info = get_host_info(); + fetchSameOrigin(RESOURCES_DIR + "top.txt", true); -fetchSameOrigin("http://{{host}}:{{ports[http][0]}}/fetch/api/resources/top.txt", true); -fetchSameOrigin("https://{{host}}:{{ports[https][0]}}/fetch/api/resources/top.txt", false); -fetchSameOrigin("http://{{domains[www]}}:{{ports[http][0]}}/fetch/api/resources/top.txt", false); +fetchSameOrigin(host_info.HTTP_ORIGIN + "/fetch/api/resources/top.txt", true); +fetchSameOrigin(host_info.HTTPS_ORIGIN + "/fetch/api/resources/top.txt", false); +fetchSameOrigin(host_info.HTTP_REMOTE_ORIGIN + "/fetch/api/resources/top.txt", false); done(); diff --git a/fetch/api/basic/referrer-worker.html b/fetch/api/basic/referrer-worker.html new file mode 100644 index 00000000000000..4b397de437da15 --- /dev/null +++ b/fetch/api/basic/referrer-worker.html @@ -0,0 +1,17 @@ + + + + + Fetch in worker: same-origin mode + + + + + + + + + + diff --git a/fetch/api/basic/referrer.html b/fetch/api/basic/referrer.html new file mode 100644 index 00000000000000..1af3f75ba0f419 --- /dev/null +++ b/fetch/api/basic/referrer.html @@ -0,0 +1,17 @@ + + + + + Fetch: same-origin mode + + + + + + + + + + + + diff --git a/fetch/api/basic/referrer.js b/fetch/api/basic/referrer.js new file mode 100644 index 00000000000000..93219fcb683fd4 --- /dev/null +++ b/fetch/api/basic/referrer.js @@ -0,0 +1,23 @@ +if (this.document === undefined) { + importScripts("/resources/testharness.js"); + importScripts("../resources/utils.js"); + importScripts("/common/get-host-info.sub.js") +} + +function runTest(url, init, expectedReferrer, title) { + promise_test(function(test) { + return fetch(url , init).then(function(resp) { + assert_equals(resp.status, 200, "HTTP status is 200"); + assert_equals(resp.headers.get("x-request-referer"), expectedReferrer, "Request's referrer is correct"); + }); + }, title); +} + +var fetchedUrl = RESOURCES_DIR + "inspect-headers.py?headers=referer"; +var corsFetchedUrl = get_host_info().HTTP_REMOTE_ORIGIN + dirname(location.pathname) + RESOURCES_DIR + "inspect-headers.py?headers=referer&cors"; + +runTest(fetchedUrl, { referrerPolicy: "origin-when-cross-origin" }, location.toString(), "origin-when-cross-origin policy on a same-origin URL"); +runTest(corsFetchedUrl, { referrerPolicy: "origin-when-cross-origin" }, get_host_info().HTTP_ORIGIN + "/", "origin-when-cross-origin policy on a cross-origin URL"); + +done(); + diff --git a/fetch/api/basic/request-headers.js b/fetch/api/basic/request-headers.js index 2ddce2af5f6d5c..785576e0e39623 100644 --- a/fetch/api/basic/request-headers.js +++ b/fetch/api/basic/request-headers.js @@ -23,7 +23,8 @@ function requestHeaders(desc, url, method, body, expectedOrigin, expectedContent var url = RESOURCES_DIR + "inspect-headers.py" requestHeaders("Fetch with GET", url, "GET", null, location.origin, null); -requestHeaders("Fetch with HEAD", url, "HEAD", null, location.origin, "0"); +requestHeaders("Fetch with HEAD", url, "HEAD", null, location.origin, null); +requestHeaders("Fetch with HEAD with body", url, "HEAD", "Request's body", location.origin, "14"); requestHeaders("Fetch with PUT without body", url, "POST", null, location.origin, "0"); requestHeaders("Fetch with PUT with body", url, "PUT", "Request's body", location.origin, "14"); requestHeaders("Fetch with POST without body", url, "POST", null, location.origin, "0"); diff --git a/fetch/api/basic/request-referrer.html b/fetch/api/basic/request-referrer.html new file mode 100644 index 00000000000000..dd895617b7f4f7 --- /dev/null +++ b/fetch/api/basic/request-referrer.html @@ -0,0 +1,13 @@ + + + + + Fetch: fetch() respects Request referrer value + + + + + + + + diff --git a/fetch/api/basic/request-referrer.js b/fetch/api/basic/request-referrer.js new file mode 100644 index 00000000000000..cc5cc8e01d40da --- /dev/null +++ b/fetch/api/basic/request-referrer.js @@ -0,0 +1,28 @@ +if (this.document === undefined) { + importScripts("/resources/testharness.js"); + importScripts("../resources/utils.js"); +} + +function testReferrer(referrer, expected) { + promise_test(function(test) { + var url = RESOURCES_DIR + "inspect-headers.py?headers=referer" + var req = new Request(url, { referrer: referrer }); + return fetch(req).then(function(resp) { + var actual = resp.headers.get("x-request-referer"); + if (expected) { + assert_equals(actual, expected, "request's referer should be: " + expected); + return; + } + if (actual) { + assert_equals(actual, "", "request's referer should be empty"); + } + }); + }); +} + +testReferrer("about:client", window.location.href); + +var fooURL = new URL("./foo", window.location).href; +testReferrer(fooURL, fooURL); + +done(); diff --git a/fetch/api/basic/scheme-about.js b/fetch/api/basic/scheme-about.js index 5f3e7cfd5c59a0..ddf711bf0a19fe 100644 --- a/fetch/api/basic/scheme-about.js +++ b/fetch/api/basic/scheme-about.js @@ -3,27 +3,25 @@ if (this.document === undefined) { importScripts("../resources/utils.js"); } -var unicorn = ''; - -function checkFetchResponse(url, data, mime, desc) { +function checkFetchResponse(url, method, desc) { if (!desc) { - var cut = (url.length >= 45) ? "[...]" : ""; - desc = "Fetching " + url.substring(0, 45) + cut + " is OK" + var cut = (url.length >= 40) ? "[...]" : ""; + cut += " (" + method + ")" + desc = "Fetching " + url.substring(0, 40) + cut + " is OK" } promise_test(function(test) { - return fetch(url).then(function(resp) { + return fetch(url, { method: method }).then(function(resp) { assert_equals(resp.status, 200, "HTTP status is 200"); assert_equals(resp.type, "basic", "response type is basic"); - assert_equals(resp.headers.get("Content-Type"), mime, "Content-Type is " + resp.headers.get("Content-Type")); + assert_equals(resp.headers.get("Content-Type"), "text/html;charset=utf-8", "Content-Type is " + resp.headers.get("Content-Type")); return resp.text(); - }).then(function(bodyAsText) { - assert_equals(bodyAsText, data, "Response's body is " + data); }) }, desc); } -checkFetchResponse("about:blank", "", "text/html;charset=utf-8"); -checkFetchResponse("about:unicorn", unicorn, "image/svg+xml"); +checkFetchResponse("about:blank", "GET"); +checkFetchResponse("about:blank", "PUT"); +checkFetchResponse("about:blank", "POST"); function checkKoUrl(url, desc) { if (!desc) @@ -36,5 +34,6 @@ function checkKoUrl(url, desc) { checkKoUrl("about:invalid.com"); checkKoUrl("about:config"); +checkKoUrl("about:unicorn"); done(); diff --git a/fetch/api/cors/cors-basic-worker.html b/fetch/api/cors/cors-basic-worker.html index 97e173c15226f7..2373bf710b5329 100644 --- a/fetch/api/cors/cors-basic-worker.html +++ b/fetch/api/cors/cors-basic-worker.html @@ -13,7 +13,7 @@ - \ No newline at end of file + diff --git a/fetch/api/cors/cors-basic.html b/fetch/api/cors/cors-basic.html index 4aa38f75b85b7e..feddf59d0a2af6 100644 --- a/fetch/api/cors/cors-basic.html +++ b/fetch/api/cors/cors-basic.html @@ -13,6 +13,7 @@ - + + - \ No newline at end of file + diff --git a/fetch/api/cors/cors-basic.js b/fetch/api/cors/cors-basic.js index 8ee783f610a44b..cff3961827d2f3 100644 --- a/fetch/api/cors/cors-basic.js +++ b/fetch/api/cors/cors-basic.js @@ -1,17 +1,11 @@ if (this.document === undefined) { importScripts("/resources/testharness.js"); importScripts("../resources/utils.js"); + importScripts("/common/get-host-info.sub.js"); } -function cors(desc, scheme, subdomain, port) { - if (!port) - port = location.port; - if (subdomain) - subdomain = subdomain + "."; - else - subdomain = ""; - - var url = scheme + "://" + subdomain + "{{host}}" + ":" + port + dirname(location.pathname); +function cors(desc, origin) { + var url = origin + dirname(location.pathname); var urlParameters = "?pipe=header(Access-Control-Allow-Origin,*)"; promise_test(function(test) { @@ -36,10 +30,12 @@ function cors(desc, scheme, subdomain, port) { }, desc + " [cors mode]"); } -cors("Same domain different port", "http", undefined, "{{ports[http][1]}}"); -cors("Same domain different protocol different port", "https", undefined, "{{ports[https][0]}}"); -cors("Cross domain basic usage", "http", "www1"); -cors("Cross domain different port", "http", "www1", "{{ports[http][1]}}"); -cors("Cross domain different protocol", "https", "www1", "{{ports[https][0]}}"); +var host_info = get_host_info(); + +cors("Same domain different port", host_info.HTTP_ORIGIN_WITH_DIFFERENT_PORT); +cors("Same domain different protocol different port", host_info.HTTPS_ORIGIN); +cors("Cross domain basic usage", host_info.HTTP_REMOTE_ORIGIN); +cors("Cross domain different port", host_info.HTTP_REMOTE_ORIGIN_WITH_DIFFERENT_PORT); +cors("Cross domain different protocol", host_info.HTTPS_REMOTE_ORIGIN); done(); diff --git a/fetch/api/cors/cors-cookies-worker.html b/fetch/api/cors/cors-cookies-worker.html index fd79aad8f056ab..c0738e571d7529 100644 --- a/fetch/api/cors/cors-cookies-worker.html +++ b/fetch/api/cors/cors-cookies-worker.html @@ -12,7 +12,7 @@ - \ No newline at end of file + diff --git a/fetch/api/cors/cors-cookies.html b/fetch/api/cors/cors-cookies.html index 8fb6a7c0cd7d49..d9fa2e3eeb0bd8 100644 --- a/fetch/api/cors/cors-cookies.html +++ b/fetch/api/cors/cors-cookies.html @@ -12,6 +12,7 @@ - + + - \ No newline at end of file + diff --git a/fetch/api/cors/cors-cookies.js b/fetch/api/cors/cors-cookies.js index 64bc2cc32f483f..6c8aa8df289e0b 100644 --- a/fetch/api/cors/cors-cookies.js +++ b/fetch/api/cors/cors-cookies.js @@ -1,11 +1,12 @@ if (this.document === undefined) { importScripts("/resources/testharness.js"); importScripts("../resources/utils.js"); + importScripts("/common/get-host-info.sub.js") } -function corsCookies(desc, domain1, domain2, credentialsMode, cookies) { - var urlSetCookie = "http://" + domain1 + ":{{ports[http][0]}}" + dirname(location.pathname) + RESOURCES_DIR + "top.txt"; - var urlCheckCookies = "http://" + domain2 + ":{{ports[http][0]}}" + dirname(location.pathname) + RESOURCES_DIR + "inspect-headers.py?cors&headers=cookie"; +function corsCookies(desc, baseURL1, baseURL2, credentialsMode, cookies) { + var urlSetCookie = baseURL1 + dirname(location.pathname) + RESOURCES_DIR + "top.txt"; + var urlCheckCookies = baseURL2 + dirname(location.pathname) + RESOURCES_DIR + "inspect-headers.py?cors&headers=cookie"; //enable cors with credentials var urlParameters = "?pipe=header(Access-Control-Allow-Origin," + location.origin + ")"; urlParameters += "|header(Access-Control-Allow-Credentials,true)"; @@ -29,7 +30,7 @@ function corsCookies(desc, domain1, domain2, credentialsMode, cookies) { }).then(function(resp) { assert_equals(resp.status, 200, "HTTP status is 200"); assert_false(resp.headers.has("Cookie") , "Cookie header is not exposed in response"); - if (credentialsMode === "include" && domain1 === domain2) { + if (credentialsMode === "include" && baseURL1 === baseURL2) { assert_equals(resp.headers.get("x-request-cookie") , cookies.join("; "), "Request includes cookie(s)"); } else { @@ -38,21 +39,23 @@ function corsCookies(desc, domain1, domain2, credentialsMode, cookies) { //clean cookies return fetch(urlSetCookie + urlCleanParameters, {"credentials": "include"}); }).catch(function(e) { - fetch(urlSetCookie + urlCleanParameters, {"credentials": "include"}); - throw e; + return fetch(urlSetCookie + urlCleanParameters, {"credentials": "include"}).then(function(resp) { + throw e; + }) }); }, desc); } -var local = "{{host}}"; -var remote = "www.{{host}}"; -var remote1 = "www1.{{host}}"; +var local = get_host_info().HTTP_ORIGIN; +var remote = get_host_info().HTTP_REMOTE_ORIGIN; +// FIXME: otherRemote might not be accessible on some test environments. +var otherRemote = local.replace("http://", "http://www."); corsCookies("Omit mode: no cookie sent", local, local, "omit", ["g=7"]); corsCookies("Include mode: 1 cookie", remote, remote, "include", ["a=1"]); corsCookies("Include mode: local cookies are not sent with remote request", local, remote, "include", ["c=3"]); corsCookies("Include mode: remote cookies are not sent with local request", remote, local, "include", ["d=4"]); -corsCookies("Include mode: remote cookies are not sent with other remote request", remote, remote1, "include", ["e=5"]); corsCookies("Same-origin mode: cookies are discarded in cors request", remote, remote, "same-origin", ["f=6"]); +corsCookies("Include mode: remote cookies are not sent with other remote request", remote, otherRemote, "include", ["e=5"]); done(); diff --git a/fetch/api/cors/cors-no-preflight-worker.html b/fetch/api/cors/cors-no-preflight-worker.html index c6402ada09318b..b65a73e0700828 100644 --- a/fetch/api/cors/cors-no-preflight-worker.html +++ b/fetch/api/cors/cors-no-preflight-worker.html @@ -14,7 +14,7 @@ - \ No newline at end of file + diff --git a/fetch/api/cors/cors-no-preflight.html b/fetch/api/cors/cors-no-preflight.html index 3ff5c97eac697f..5426d5adbd5498 100644 --- a/fetch/api/cors/cors-no-preflight.html +++ b/fetch/api/cors/cors-no-preflight.html @@ -15,6 +15,7 @@ - + + - \ No newline at end of file + diff --git a/fetch/api/cors/cors-no-preflight.js b/fetch/api/cors/cors-no-preflight.js index 8d932cc38bc716..f2f3e200ea7532 100644 --- a/fetch/api/cors/cors-no-preflight.js +++ b/fetch/api/cors/cors-no-preflight.js @@ -1,26 +1,21 @@ if (this.document === undefined) { - importScripts("/resources/testharness.js"); importScripts("/common/utils.js"); + importScripts("/resources/testharness.js"); importScripts("../resources/utils.js"); + importScripts("/common/get-host-info.sub.js") } -function corsNoPreflight(desc, scheme, subdomain, port, method, headerName, headerValue) { - if (!port) - port = location.port; - if (subdomain) - subdomain = subdomain + "."; - else - subdomain = ""; +function corsNoPreflight(desc, baseURL, method, headerName, headerValue) { var uuid_token = token(); - var url = scheme + "://" + subdomain + "{{host}}" + ":" + port + dirname(location.pathname) + RESOURCES_DIR + "preflight.py"; + var url = baseURL + dirname(location.pathname) + RESOURCES_DIR + "preflight.py"; var urlParameters = "?token=" + uuid_token + "&max_age=0"; var requestInit = {"mode": "cors", "method": method, "headers":{}}; if (headerName) requestInit["headers"][headerName] = headerValue; promise_test(function(test) { - fetch(RESOURCES_DIR + "clean-stash.py?token=" + uuid_token).then(function(resp) { + return fetch(RESOURCES_DIR + "clean-stash.py?token=" + uuid_token).then(function(resp) { assert_equals(resp.status, 200, "Clean stash response's status is 200"); return fetch(url + urlParameters, requestInit).then(function(resp) { assert_equals(resp.status, 200, "Response's status is 200"); @@ -29,22 +24,23 @@ function corsNoPreflight(desc, scheme, subdomain, port, method, headerName, head }); }, desc); } -var port2 = "{{ports[http][1]}}"; -var httpsPort = "{{ports[https][0]}}"; -corsNoPreflight("Cross domain basic usage [GET]", "http", "www1", undefined, "GET"); -corsNoPreflight("Same domain different port [GET]", "http", undefined, port2, "GET"); -corsNoPreflight("Cross domain different port [GET]", "http", "www1", port2, "GET"); -corsNoPreflight("Cross domain different protocol [GET]", "https", "www1", httpsPort, "GET"); -corsNoPreflight("Same domain different protocol different port [GET]", "https", undefined, httpsPort, "GET"); -corsNoPreflight("Cross domain [POST]", "http", "www1", undefined, "POST"); -corsNoPreflight("Cross domain [HEAD]", "http", "www1", undefined, "HEAD"); -corsNoPreflight("Cross domain [GET] [Accept: */*]", "http", "www1", undefined, "GET" , "Accept", "*/*"); -corsNoPreflight("Cross domain [GET] [Accept-Language: fr]", "http", "www1", undefined, "GET" , "Accept-Language", "fr"); -corsNoPreflight("Cross domain [GET] [Content-Language: fr]", "http", "www1", undefined, "GET" , "Content-Language", "fr"); -corsNoPreflight("Cross domain [GET] [Content-Type: application/x-www-form-urlencoded]", "http", "www1", undefined, "GET" , "Content-Type", "application/x-www-form-urlencoded"); -corsNoPreflight("Cross domain [GET] [Content-Type: multipart/form-data]", "http", "www1", undefined, "GET" , "Content-Type", "multipart/form-data"); -corsNoPreflight("Cross domain [GET] [Content-Type: text/plain]", "http", "www1", undefined, "GET" , "Content-Type", "text/plain"); -corsNoPreflight("Cross domain [GET] [Content-Type: text/plain;charset=utf-8]", "http", "www1", undefined, "GET" , "Content-Type", "text/plain;charset=utf-8"); +var host_info = get_host_info(); + +corsNoPreflight("Cross domain basic usage [GET]", host_info.HTTP_REMOTE_ORIGIN, "GET"); +corsNoPreflight("Same domain different port [GET]", host_info.HTTP_ORIGIN_WITH_DIFFERENT_PORT, "GET"); +corsNoPreflight("Cross domain different port [GET]", host_info.HTTP_REMOTE_ORIGIN_WITH_DIFFERENT_PORT, "GET"); +corsNoPreflight("Cross domain different protocol [GET]", host_info.HTTPS_REMOTE_ORIGIN, "GET"); +corsNoPreflight("Same domain different protocol different port [GET]", host_info.HTTPS_ORIGIN, "GET"); +corsNoPreflight("Cross domain [POST]", host_info.HTTP_REMOTE_ORIGIN, "POST"); +corsNoPreflight("Cross domain [HEAD]", host_info.HTTP_REMOTE_ORIGIN, "HEAD"); +corsNoPreflight("Cross domain [GET] [Accept: */*]", host_info.HTTP_REMOTE_ORIGIN, "GET" , "Accept", "*/*"); +corsNoPreflight("Cross domain [GET] [Accept-Language: fr]", host_info.HTTP_REMOTE_ORIGIN, "GET" , "Accept-Language", "fr"); +corsNoPreflight("Cross domain [GET] [Content-Language: fr]", host_info.HTTP_REMOTE_ORIGIN, "GET" , "Content-Language", "fr"); +corsNoPreflight("Cross domain [GET] [Content-Type: application/x-www-form-urlencoded]", host_info.HTTP_REMOTE_ORIGIN, "GET" , "Content-Type", "application/x-www-form-urlencoded"); +corsNoPreflight("Cross domain [GET] [Content-Type: multipart/form-data]", host_info.HTTP_REMOTE_ORIGIN, "GET" , "Content-Type", "multipart/form-data"); +corsNoPreflight("Cross domain [GET] [Content-Type: text/plain]", host_info.HTTP_REMOTE_ORIGIN, "GET" , "Content-Type", "text/plain"); +corsNoPreflight("Cross domain [GET] [Content-Type: text/plain;charset=utf-8]", host_info.HTTP_REMOTE_ORIGIN, "GET" , "Content-Type", "text/plain;charset=utf-8"); +corsNoPreflight("Cross domain [GET] [Content-Type: Text/Plain;charset=utf-8]", host_info.HTTP_REMOTE_ORIGIN, "GET" , "Content-Type", "Text/Plain;charset=utf-8"); done(); diff --git a/fetch/api/cors/cors-origin-worker.html b/fetch/api/cors/cors-origin-worker.html index f6145e6e3e1a3b..e59a0b0bdec94d 100644 --- a/fetch/api/cors/cors-origin-worker.html +++ b/fetch/api/cors/cors-origin-worker.html @@ -13,7 +13,7 @@ - \ No newline at end of file + diff --git a/fetch/api/cors/cors-origin.html b/fetch/api/cors/cors-origin.html index de7a0552accb28..87f0dff8152b8d 100644 --- a/fetch/api/cors/cors-origin.html +++ b/fetch/api/cors/cors-origin.html @@ -14,6 +14,7 @@ - + + - \ No newline at end of file + diff --git a/fetch/api/cors/cors-origin.js b/fetch/api/cors/cors-origin.js index 36052742a5fa34..56f4a3b6490a3a 100644 --- a/fetch/api/cors/cors-origin.js +++ b/fetch/api/cors/cors-origin.js @@ -1,23 +1,18 @@ if (this.document === undefined) { + importScripts("/common/utils.js"); importScripts("/resources/testharness.js"); importScripts("../resources/utils.js"); - importScripts("/common/utils.js"); + importScripts("/common/get-host-info.sub.js") } /* If origin is undefined, it is set to fetched url's origin*/ -function corsOrigin(desc, scheme, subdomain, port, method, origin, shouldPass) { - if (!port) - port = location.port; - if (subdomain) - subdomain = subdomain + "."; - else - subdomain = ""; +function corsOrigin(desc, baseURL, method, origin, shouldPass) { if (!origin) - origin = scheme + "://" + subdomain + "{{host}}" + ":" + port; + origin = baseURL; var uuid_token = token(); var urlParameters = "?token=" + uuid_token + "&max_age=0&origin=" + encodeURIComponent(origin) + "&allow_methods=" + method; - var url = scheme + "://" + subdomain + "{{host}}" + ":" + port + dirname(location.pathname) + RESOURCES_DIR + "preflight.py"; + var url = baseURL + dirname(location.pathname) + RESOURCES_DIR + "preflight.py"; var requestInit = {"mode": "cors", "method": method}; promise_test(function(test) { @@ -34,28 +29,28 @@ function corsOrigin(desc, scheme, subdomain, port, method, origin, shouldPass) { }, desc); } -var port = "{{ports[http][0]}}"; -var port2 = "{{ports[http][1]}}"; -var httpsPort = "{{ports[https][0]}}"; + +var host_info = get_host_info(); + /* Actual origin */ -var origin = "http://{{host}}:{{ports[http][0]}}"; - -corsOrigin("Cross domain different subdomain [origin OK]", "http", "www1", undefined, "GET", origin, true); -corsOrigin("Cross domain different subdomain [origin KO]", "http", "www1", undefined, "GET", undefined, false); -corsOrigin("Same domain different port [origin OK]", "http", undefined, port2, "GET", origin, true); -corsOrigin("Same domain different port [origin KO]", "http", undefined, port2, "GET", undefined, false); -corsOrigin("Cross domain different port [origin OK]", "http", "www1", port2, "GET", origin, true); -corsOrigin("Cross domain different port [origin KO]", "http", "www1", port2, "GET", undefined, false); -corsOrigin("Cross domain different protocol [origin OK]", "https", "www1", httpsPort, "GET", origin, true); -corsOrigin("Cross domain different protocol [origin KO]", "https", "www1", httpsPort, "GET", undefined, false); -corsOrigin("Same domain different protocol different port [origin OK]", "https", undefined, httpsPort, "GET", origin, true); -corsOrigin("Same domain different protocol different port [origin KO]", "https", undefined, httpsPort, "GET", undefined, false); -corsOrigin("Cross domain [POST] [origin OK]", "http", "www1", undefined, "POST", origin, true); -corsOrigin("Cross domain [POST] [origin KO]", "http", "www1", undefined, "POST", undefined, false); -corsOrigin("Cross domain [HEAD] [origin OK]", "http", "www1", undefined, "HEAD", origin, true); -corsOrigin("Cross domain [HEAD] [origin KO]", "http", "www1", undefined, "HEAD", undefined, false); -corsOrigin("CORS preflight [PUT] [origin OK]", "http", "www1", undefined, "PUT", origin, true); -corsOrigin("CORS preflight [PUT] [origin KO]", "http", "www1", undefined, "PUT", undefined, false); -corsOrigin("Allowed origin: \"\" [origin KO]", "http", "www1", undefined, "GET", "" , false); +var origin = host_info.HTTP_ORIGIN; + +corsOrigin("Cross domain different subdomain [origin OK]", host_info.HTTP_REMOTE_ORIGIN, "GET", origin, true); +corsOrigin("Cross domain different subdomain [origin KO]", host_info.HTTP_REMOTE_ORIGIN, "GET", undefined, false); +corsOrigin("Same domain different port [origin OK]", host_info.HTTP_ORIGIN_WITH_DIFFERENT_PORT, "GET", origin, true); +corsOrigin("Same domain different port [origin KO]", host_info.HTTP_ORIGIN_WITH_DIFFERENT_PORT, "GET", undefined, false); +corsOrigin("Cross domain different port [origin OK]", host_info.HTTP_REMOTE_ORIGIN_WITH_DIFFERENT_PORT, "GET", origin, true); +corsOrigin("Cross domain different port [origin KO]", host_info.HTTP_REMOTE_ORIGIN_WITH_DIFFERENT_PORT, "GET", undefined, false); +corsOrigin("Cross domain different protocol [origin OK]", host_info.HTTPS_REMOTE_ORIGIN, "GET", origin, true); +corsOrigin("Cross domain different protocol [origin KO]", host_info.HTTPS_REMOTE_ORIGIN, "GET", undefined, false); +corsOrigin("Same domain different protocol different port [origin OK]", host_info.HTTPS_ORIGIN, "GET", origin, true); +corsOrigin("Same domain different protocol different port [origin KO]", host_info.HTTPS_ORIGIN, "GET", undefined, false); +corsOrigin("Cross domain [POST] [origin OK]", host_info.HTTP_REMOTE_ORIGIN, "POST", origin, true); +corsOrigin("Cross domain [POST] [origin KO]", host_info.HTTP_REMOTE_ORIGIN, "POST", undefined, false); +corsOrigin("Cross domain [HEAD] [origin OK]", host_info.HTTP_REMOTE_ORIGIN, "HEAD", origin, true); +corsOrigin("Cross domain [HEAD] [origin KO]", host_info.HTTP_REMOTE_ORIGIN, "HEAD", undefined, false); +corsOrigin("CORS preflight [PUT] [origin OK]", host_info.HTTP_REMOTE_ORIGIN, "PUT", origin, true); +corsOrigin("CORS preflight [PUT] [origin KO]", host_info.HTTP_REMOTE_ORIGIN, "PUT", undefined, false); +corsOrigin("Allowed origin: \"\" [origin KO]", host_info.HTTP_REMOTE_ORIGIN, "GET", "" , false); done(); diff --git a/fetch/api/cors/cors-preflight-redirect-worker.html b/fetch/api/cors/cors-preflight-redirect-worker.html index 663f5d655c133d..24066c08d8da99 100644 --- a/fetch/api/cors/cors-preflight-redirect-worker.html +++ b/fetch/api/cors/cors-preflight-redirect-worker.html @@ -12,7 +12,7 @@ - \ No newline at end of file + diff --git a/fetch/api/cors/cors-preflight-redirect.html b/fetch/api/cors/cors-preflight-redirect.html index 6f136af76be9bf..8f2534037e582a 100644 --- a/fetch/api/cors/cors-preflight-redirect.html +++ b/fetch/api/cors/cors-preflight-redirect.html @@ -13,6 +13,7 @@ - + + - \ No newline at end of file + diff --git a/fetch/api/cors/cors-preflight-redirect.js b/fetch/api/cors/cors-preflight-redirect.js index 52a7bca3cd7133..f375c0d6e5198c 100644 --- a/fetch/api/cors/cors-preflight-redirect.js +++ b/fetch/api/cors/cors-preflight-redirect.js @@ -2,6 +2,7 @@ if (this.document === undefined) { importScripts("/resources/testharness.js"); importScripts("../resources/utils.js"); importScripts("/common/utils.js"); + importScripts("/common/get-host-info.sub.js"); } function corsPreflightRedirect(desc, redirectUrl, redirectLocation, redirectStatus, redirectPreflight) { @@ -27,8 +28,8 @@ function corsPreflightRedirect(desc, redirectUrl, redirectLocation, redirectStat }, desc); } -var redirectUrl = "http://www1.{{host}}:{{ports[http][0]}}" + dirname(location.pathname) + RESOURCES_DIR + "redirect.py"; -var locationUrl = "http://www1.{{host}}:{{ports[http][0]}}" + dirname(location.pathname) + RESOURCES_DIR + "preflight.py"; +var redirectUrl = get_host_info().HTTP_REMOTE_ORIGIN + dirname(location.pathname) + RESOURCES_DIR + "redirect.py"; +var locationUrl = get_host_info().HTTP_REMOTE_ORIGIN + dirname(location.pathname) + RESOURCES_DIR + "preflight.py"; for (var code of [301, 302, 303, 307, 308]) { /* preflight should not follow the redirection */ diff --git a/fetch/api/cors/cors-preflight-referrer-worker.html b/fetch/api/cors/cors-preflight-referrer-worker.html index 4ed9072fb51214..6913c7e69b445a 100644 --- a/fetch/api/cors/cors-preflight-referrer-worker.html +++ b/fetch/api/cors/cors-preflight-referrer-worker.html @@ -12,7 +12,7 @@ - \ No newline at end of file + diff --git a/fetch/api/cors/cors-preflight-referrer.html b/fetch/api/cors/cors-preflight-referrer.html index a399a051cb1e52..62403caeea2fc0 100644 --- a/fetch/api/cors/cors-preflight-referrer.html +++ b/fetch/api/cors/cors-preflight-referrer.html @@ -13,6 +13,7 @@ - + + - \ No newline at end of file + diff --git a/fetch/api/cors/cors-preflight-referrer.js b/fetch/api/cors/cors-preflight-referrer.js index 40e4a7f79012a9..1039fcd13516aa 100644 --- a/fetch/api/cors/cors-preflight-referrer.js +++ b/fetch/api/cors/cors-preflight-referrer.js @@ -1,6 +1,7 @@ if (this.document === undefined) { importScripts("/resources/testharness.js"); importScripts("/common/utils.js"); + importScripts("/common/get-host-info.sub.js"); importScripts("../resources/utils.js"); } @@ -21,17 +22,18 @@ function corsPreflightReferrer(desc, corsUrl, referrerPolicy, expectedReferrer) assert_equals(resp.status, 200, "Response's status is 200"); assert_equals(resp.headers.get("x-did-preflight"), "1", "Preflight request has been made"); assert_equals(resp.headers.get("x-preflight-referrer"), expectedReferrer, "Preflight's referrer is correct"); - assert_equals(resp.headers.get("x-referrer"), expectedReferrer, "Request's refferer is correct"); + assert_equals(resp.headers.get("x-referrer"), expectedReferrer, "Request's referrer is correct"); }); }); }, desc); } -var corsUrl = "http://{{host}}:{{ports[http][1]}}" + dirname(location.pathname) + RESOURCES_DIR + "preflight.py"; -var origin = "http://{{host}}:{{ports[http][0]}}"; +var corsUrl = get_host_info().HTTP_REMOTE_ORIGIN + dirname(location.pathname) + RESOURCES_DIR + "preflight.py"; +var origin = get_host_info().HTTP_ORIGIN + "/"; corsPreflightReferrer("Referrer policy: no-referrer", corsUrl, "no-referrer", ""); -corsPreflightReferrer("Referrer policy: \"\"", corsUrl, "", ""); +corsPreflightReferrer("Referrer policy: \"\"", corsUrl, "", location.toString()) + corsPreflightReferrer("Referrer policy: origin", corsUrl, "origin", origin); corsPreflightReferrer("Referrer policy: origin-when-cross-origin", corsUrl, "origin-when-cross-origin", origin); corsPreflightReferrer("Referrer policy: unsafe-url", corsUrl, "unsafe-url", location.toString()); diff --git a/fetch/api/cors/cors-preflight-status-worker.html b/fetch/api/cors/cors-preflight-status-worker.html index 7650c37d1ea373..281d7739697369 100644 --- a/fetch/api/cors/cors-preflight-status-worker.html +++ b/fetch/api/cors/cors-preflight-status-worker.html @@ -12,7 +12,7 @@ - \ No newline at end of file + diff --git a/fetch/api/cors/cors-preflight-status.html b/fetch/api/cors/cors-preflight-status.html index bc11fb755e6be3..4b619d6d13a0fa 100644 --- a/fetch/api/cors/cors-preflight-status.html +++ b/fetch/api/cors/cors-preflight-status.html @@ -12,6 +12,7 @@ - + + - \ No newline at end of file + diff --git a/fetch/api/cors/cors-preflight-status.js b/fetch/api/cors/cors-preflight-status.js index 07bd23c9003234..5b4b15a9a90d04 100644 --- a/fetch/api/cors/cors-preflight-status.js +++ b/fetch/api/cors/cors-preflight-status.js @@ -2,6 +2,7 @@ if (this.document === undefined) { importScripts("/resources/testharness.js"); importScripts("../resources/utils.js"); importScripts("/common/utils.js"); + importScripts("/common/get-host-info.sub.js"); } /* Check preflight is ok if status is ok status (200 to 299)*/ @@ -31,7 +32,7 @@ function corsPreflightStatus(desc, corsUrl, preflightStatus) { }, desc); } -var corsUrl = "http://www1.{{host}}:{{ports[http][0]}}" + dirname(location.pathname) + RESOURCES_DIR + "preflight.py"; +var corsUrl = get_host_info().HTTP_REMOTE_ORIGIN + dirname(location.pathname) + RESOURCES_DIR + "preflight.py"; for (status of [200, 201, 202, 203, 204, 205, 206, 300, 301, 302, 303, 304, 305, 306, 307, 308, 400, 401, 402, 403, 404, 405, diff --git a/fetch/api/cors/cors-preflight-worker.html b/fetch/api/cors/cors-preflight-worker.html index bedef5d77511b1..c80d1e989bfaa1 100644 --- a/fetch/api/cors/cors-preflight-worker.html +++ b/fetch/api/cors/cors-preflight-worker.html @@ -14,7 +14,7 @@ - \ No newline at end of file + diff --git a/fetch/api/cors/cors-preflight.html b/fetch/api/cors/cors-preflight.html index c4a581a55c5cc6..036f2f515ed205 100644 --- a/fetch/api/cors/cors-preflight.html +++ b/fetch/api/cors/cors-preflight.html @@ -14,7 +14,8 @@ + - + - \ No newline at end of file + diff --git a/fetch/api/cors/cors-preflight.js b/fetch/api/cors/cors-preflight.js index f6f75bb2fbcbbb..d89c7b9b99d54f 100644 --- a/fetch/api/cors/cors-preflight.js +++ b/fetch/api/cors/cors-preflight.js @@ -1,7 +1,16 @@ if (this.document === undefined) { importScripts("/resources/testharness.js"); - importScripts("../resources/utils.js"); importScripts("/common/utils.js"); + importScripts("../resources/utils.js"); + importScripts("/common/get-host-info.sub.js"); +} + +function headerNames(headers) +{ + let names = []; + for (let header of headers) + names.push(header[0].toLowerCase()); + return names } /* @@ -9,15 +18,19 @@ if (this.document === undefined) { Control if server allows method and headers and check accordingly Check control access headers added by UA (for method and headers) */ -function corsPreflight(desc, corsUrl, method, allowed, headers) { +function corsPreflight(desc, corsUrl, method, allowed, headers, safeHeaders) { return promise_test(function(test) { var uuid_token = token(); return fetch(RESOURCES_DIR + "clean-stash.py?token=" + uuid_token).then(function(response) { var url = corsUrl; var urlParameters = "?token=" + uuid_token + "&max_age=0"; var requestInit = {"mode": "cors", "method": method}; + var requestHeaders = []; if (headers) - requestInit["headers"] = headers; + requestHeaders.push.apply(requestHeaders, headers); + if (safeHeaders) + requestHeaders.push.apply(requestHeaders, safeHeaders); + requestInit["headers"] = requestHeaders; if (allowed) { urlParameters += "&allow_methods=" + method; @@ -26,20 +39,22 @@ function corsPreflight(desc, corsUrl, method, allowed, headers) { //Server will send back headers from Access-Control-Request-Headers in x-control-request-headers urlParameters += "&control_request_headers" //Make the server allow the headers - urlParameters += "&allow_headers=" - urlParameters += headers.map(function (x) { return x[0]; }).join("%2C%20"); + urlParameters += "&allow_headers=" + headerNames(headers).join("%20%2C"); } return fetch(url + urlParameters, requestInit).then(function(resp) { assert_equals(resp.status, 200, "Response's status is 200"); assert_equals(resp.headers.get("x-did-preflight"), "1", "Preflight request has been made"); if (headers) { - var actualHeaders = resp.headers.get("x-control-request-headers").split(","); + var actualHeaders = resp.headers.get("x-control-request-headers").toLowerCase().split(","); for (var i in actualHeaders) actualHeaders[i] = actualHeaders[i].trim(); for (var header of headers) - assert_in_array(header[0], actualHeaders, "Preflight asked permission for header: " + header); + assert_in_array(header[0].toLowerCase(), actualHeaders, "Preflight asked permission for header: " + header); + + let accessControlAllowHeaders = headerNames(headers).sort().join(","); + assert_equals(resp.headers.get("x-control-request-headers").replace(new RegExp(" ", "g"), ""), accessControlAllowHeaders, "Access-Control-Allow-Headers value"); + return fetch(RESOURCES_DIR + "clean-stash.py?token=" + uuid_token); } - return fetch(RESOURCES_DIR + "clean-stash.py?token=" + uuid_token); }); } else { return promise_rejects(test, new TypeError(), fetch(url + urlParameters, requestInit)).then(function(){ @@ -50,7 +65,7 @@ function corsPreflight(desc, corsUrl, method, allowed, headers) { }, desc); } -var corsUrl = "http://{{host}}:{{ports[http][1]}}" + dirname(location.pathname) + RESOURCES_DIR + "preflight.py"; +var corsUrl = get_host_info().HTTP_REMOTE_ORIGIN + dirname(location.pathname) + RESOURCES_DIR + "preflight.py"; corsPreflight("CORS [DELETE], server allows", corsUrl, "DELETE", true); corsPreflight("CORS [DELETE], server refuses", corsUrl, "DELETE", false); @@ -64,12 +79,25 @@ corsPreflight("CORS [NEW], server refuses", corsUrl, "NEW", false); corsPreflight("CORS [GET] [x-test-header: allowed], server allows", corsUrl, "GET", true, [["x-test-header1", "allowed"]]); corsPreflight("CORS [GET] [x-test-header: refused], server refuses", corsUrl, "GET", false, [["x-test-header1", "refused"]]); -var headers = [["x-test-header1", "allowedOrRefused"], - ["x-test-header2", "allowedOrRefused"], - ["x-test-header3", "allowedOrRefused"]]; -corsPreflight("CORS [GET] [several headers], server allows", corsUrl, "GET", true, headers); -corsPreflight("CORS [GET] [several headers], server refuses", corsUrl, "GET", false, headers); -corsPreflight("CORS [PUT] [several headers], server allows", corsUrl, "PUT", true, headers); -corsPreflight("CORS [PUT] [several headers], server refuses", corsUrl, "PUT", false, headers); +var headers = [ + ["x-test-header1", "allowedOrRefused"], + ["x-test-header2", "allowedOrRefused"], + ["X-test-header3", "allowedOrRefused"], + ["x-test-header-b", "allowedOrRefused"], + ["x-test-header-D", "allowedOrRefused"], + ["x-test-header-C", "allowedOrRefused"], + ["x-test-header-a", "allowedOrRefused"], + ["Content-Type", "allowedOrRefused"], +]; +var safeHeaders= [ + ["Accept", "*"], + ["Accept-Language", "bzh"], + ["Content-Language", "eu"], +]; + +corsPreflight("CORS [GET] [several headers], server allows", corsUrl, "GET", true, headers, safeHeaders); +corsPreflight("CORS [GET] [several headers], server refuses", corsUrl, "GET", false, headers, safeHeaders); +corsPreflight("CORS [PUT] [several headers], server allows", corsUrl, "PUT", true, headers, safeHeaders); +corsPreflight("CORS [PUT] [several headers], server refuses", corsUrl, "PUT", false, headers, safeHeaders); done(); diff --git a/fetch/api/cors/cors-redirect-credentials.html b/fetch/api/cors/cors-redirect-credentials.html index 2491f692d10a06..410c0e491d730c 100644 --- a/fetch/api/cors/cors-redirect-credentials.html +++ b/fetch/api/cors/cors-redirect-credentials.html @@ -10,6 +10,7 @@ - + + - \ No newline at end of file + diff --git a/fetch/api/cors/cors-redirect-credentials.js b/fetch/api/cors/cors-redirect-credentials.js index 5ffd9451736b15..1b3fe5d4bb4aa4 100644 --- a/fetch/api/cors/cors-redirect-credentials.js +++ b/fetch/api/cors/cors-redirect-credentials.js @@ -1,6 +1,7 @@ if (this.document === undefined) { importScripts("/resources/testharness.js"); importScripts("../resources/utils.js"); + importScripts("/common/get-host-info.sub.js") } function corsRedirectCredentials(desc, redirectUrl, redirectLocation, redirectStatus, locationCredentials) { @@ -19,12 +20,14 @@ function corsRedirectCredentials(desc, redirectUrl, redirectLocation, redirectSt var redirPath = dirname(location.pathname) + RESOURCES_DIR + "redirect.py"; var preflightPath = dirname(location.pathname) + RESOURCES_DIR + "preflight.py"; -var localRedirect = "http://{{host}}:{{ports[http][0]}}" + redirPath; -var remoteRedirect = "http://{{host}}:{{ports[http][1]}}" + redirPath; +var host_info = get_host_info(); -var localLocation = "http://{{host}}:{{ports[http][0]}}" + preflightPath; -var remoteLocation = "http://{{host}}:{{ports[http][1]}}" + preflightPath; -var remoteLocation2 = "http://www.{{host}}:{{ports[http][0]}}" + preflightPath; +var localRedirect = host_info.HTTP_ORIGIN + redirPath; +var remoteRedirect = host_info.HTTP_ORIGIN_WITH_DIFFERENT_PORT + redirPath; + +var localLocation = host_info.HTTP_ORIGIN + preflightPath; +var remoteLocation = host_info.HTTP_ORIGIN_WITH_DIFFERENT_PORT + preflightPath; +var remoteLocation2 = host_info.HTTP_REMOTE_ORIGIN + preflightPath; for (var code of [301, 302, 303, 307, 308]) { corsRedirectCredentials("Redirect " + code + " from same origin to remote with user and password", localRedirect, remoteLocation, code, "user:password"); diff --git a/fetch/api/cors/cors-redirect-preflight-worker.html b/fetch/api/cors/cors-redirect-preflight-worker.html new file mode 100644 index 00000000000000..d7d83a51013a44 --- /dev/null +++ b/fetch/api/cors/cors-redirect-preflight-worker.html @@ -0,0 +1,15 @@ + + + + + Fetch in worker: CORS preflight after redirection + + + + + + + + diff --git a/fetch/api/cors/cors-redirect-preflight.html b/fetch/api/cors/cors-redirect-preflight.html new file mode 100644 index 00000000000000..40f8cbd0681d69 --- /dev/null +++ b/fetch/api/cors/cors-redirect-preflight.html @@ -0,0 +1,16 @@ + + + + + Fetch: CORS preflight after redirection + + + + + + + + + + + diff --git a/fetch/api/cors/cors-redirect-preflight.js b/fetch/api/cors/cors-redirect-preflight.js new file mode 100644 index 00000000000000..6a970961f45cc2 --- /dev/null +++ b/fetch/api/cors/cors-redirect-preflight.js @@ -0,0 +1,50 @@ +if (this.document === undefined) { + importScripts("/resources/testharness.js"); + importScripts("/common/utils.js"); + importScripts("../resources/utils.js"); + importScripts("../resources/get-host-info.sub.js"); +} + +function corsRedirect(desc, redirectUrl, redirectLocation, redirectStatus, expectSuccess) { + var urlBaseParameters = "&redirect_status=" + redirectStatus; + var urlParametersSuccess = urlBaseParameters + "&allow_headers=x-w3c&location=" + encodeURIComponent(redirectLocation + "?allow_headers=x-w3c"); + var urlParametersFailure = urlBaseParameters + "&location=" + encodeURIComponent(redirectLocation); + + var requestInit = {"mode": "cors", "redirect": "follow", "headers" : [["x-w3c", "test"]]}; + + promise_test(function(test) { + var uuid_token = token(); + return fetch(RESOURCES_DIR + "clean-stash.py?token=" + uuid_token).then(function(resp) { + return fetch(redirectUrl + "?token=" + uuid_token + "&max_age=0" + urlParametersSuccess, requestInit).then(function(resp) { + assert_equals(resp.status, 200, "Response's status is 200"); + assert_equals(resp.headers.get("x-did-preflight"), "1", "Preflight request has been made"); + }); + }); + }, desc + " (preflight after redirection success case)"); + promise_test(function(test) { + var uuid_token = token(); + return fetch(RESOURCES_DIR + "clean-stash.py?token=" + uuid_token).then(function(resp) { + return promise_rejects(test, new TypeError(), fetch(redirectUrl + "?token=" + uuid_token + "&max_age=0" + urlParametersFailure, requestInit)); + }); + }, desc + " (preflight after redirection failure case)"); +} + +var redirPath = dirname(location.pathname) + RESOURCES_DIR + "redirect.py"; +var preflightPath = dirname(location.pathname) + RESOURCES_DIR + "preflight.py"; + +var host_info = get_host_info(); + +var localRedirect = host_info.HTTP_ORIGIN + redirPath; +var remoteRedirect = host_info.HTTP_REMOTE_ORIGIN + redirPath; + +var localLocation = host_info.HTTP_ORIGIN + preflightPath; +var remoteLocation = host_info.HTTP_REMOTE_ORIGIN + preflightPath; +var remoteLocation2 = host_info.HTTP_ORIGIN_WITH_DIFFERENT_PORT + preflightPath; + +for (var code of [301, 302, 303, 307, 308]) { + corsRedirect("Redirect " + code + ": same origin to cors", localRedirect, remoteLocation, code); + corsRedirect("Redirect " + code + ": cors to same origin", remoteRedirect, localLocation, code); + corsRedirect("Redirect " + code + ": cors to another cors", remoteRedirect, remoteLocation2, code); +} + +done(); diff --git a/fetch/api/cors/cors-redirect-worker.html b/fetch/api/cors/cors-redirect-worker.html index bf7bd965272a84..9f8dfb022b7d8c 100644 --- a/fetch/api/cors/cors-redirect-worker.html +++ b/fetch/api/cors/cors-redirect-worker.html @@ -11,7 +11,7 @@ - \ No newline at end of file + diff --git a/fetch/api/cors/cors-redirect.html b/fetch/api/cors/cors-redirect.html index f88eacf7bc57f8..87424f43216acf 100644 --- a/fetch/api/cors/cors-redirect.html +++ b/fetch/api/cors/cors-redirect.html @@ -12,6 +12,7 @@ - + + - \ No newline at end of file + diff --git a/fetch/api/cors/cors-redirect.js b/fetch/api/cors/cors-redirect.js index a818054ab102d9..75f67e7ee31f70 100644 --- a/fetch/api/cors/cors-redirect.js +++ b/fetch/api/cors/cors-redirect.js @@ -2,6 +2,7 @@ if (this.document === undefined) { importScripts("/resources/testharness.js"); importScripts("/common/utils.js"); importScripts("../resources/utils.js"); + importScripts("/common/get-host-info.sub.js"); } function corsRedirect(desc, redirectUrl, redirectLocation, redirectStatus, expectedOrigin) { @@ -13,7 +14,7 @@ function corsRedirect(desc, redirectUrl, redirectLocation, redirectStatus, expec var requestInit = {"mode": "cors", "redirect": "follow"}; - promise_test(function(test) { + return promise_test(function(test) { fetch(RESOURCES_DIR + "clean-stash.py?token=" + uuid_token).then(function(resp) { return fetch(url + urlParameters, requestInit).then(function(resp) { assert_equals(resp.status, 200, "Response's status is 200"); @@ -27,12 +28,14 @@ function corsRedirect(desc, redirectUrl, redirectLocation, redirectStatus, expec var redirPath = dirname(location.pathname) + RESOURCES_DIR + "redirect.py"; var preflightPath = dirname(location.pathname) + RESOURCES_DIR + "preflight.py"; -var localRedirect = "http://{{host}}:{{ports[http][0]}}" + redirPath; -var remoteRedirect = "http://www1.{{host}}:{{ports[http][0]}}" + redirPath; +var host_info = get_host_info(); -var localLocation = "http://{{host}}:{{ports[http][0]}}" + preflightPath; -var remoteLocation = "http://www1.{{host}}:{{ports[http][0]}}" + preflightPath; -var remoteLocation2 = "http://www.{{host}}:{{ports[http][0]}}" + preflightPath; +var localRedirect = host_info.HTTP_ORIGIN + redirPath; +var remoteRedirect = host_info.HTTP_REMOTE_ORIGIN + redirPath; + +var localLocation = host_info.HTTP_ORIGIN + preflightPath; +var remoteLocation = host_info.HTTP_REMOTE_ORIGIN + preflightPath; +var remoteLocation2 = host_info.HTTP_ORIGIN_WITH_DIFFERENT_PORT + preflightPath; for (var code of [301, 302, 303, 307, 308]) { corsRedirect("Redirect " + code + ": cors to same cors", remoteRedirect, remoteLocation, code, location.origin); diff --git a/fetch/api/headers/headers-basic.html b/fetch/api/headers/headers-basic.html index 5c374ed1fafeb3..90ba2b2a90832d 100644 --- a/fetch/api/headers/headers-basic.html +++ b/fetch/api/headers/headers-basic.html @@ -66,7 +66,7 @@ assert_equals(headers2.get(name), String(headerDict[name]), "name: " + name + " has value: " + headerDict[name]); } - }, "Create headers whith existing headers"); + }, "Create headers with existing headers"); test(function() { var headers = new Headers(); @@ -120,14 +120,29 @@ "Content-Types": "value6" }; var sortedHeaderDict = {}; + var headerValues = []; var sortedHeaderKeys = Object.keys(headerEntriesDict).map(function(value) { sortedHeaderDict[value.toLowerCase()] = headerEntriesDict[value]; + headerValues.push(headerEntriesDict[value]); return value.toLowerCase(); }).sort(); + var iteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([].values())); + function checkIteratorProperties(iterator) { + var prototype = Object.getPrototypeOf(iterator); + assert_equals(Object.getPrototypeOf(prototype), iteratorPrototype); + + var descriptor = Object.getOwnPropertyDescriptor(prototype, "next"); + assert_true(descriptor.configurable, "configurable"); + assert_true(descriptor.enumerable, "enumerable"); + assert_true(descriptor.writable, "writable"); + } + test(function() { var headers = new Headers(headerEntriesDict); var actual = headers.keys(); + checkIteratorProperties(actual); + sortedHeaderKeys.forEach(function(key) { entry = actual.next(); assert_false(entry.done); @@ -135,11 +150,15 @@ }); assert_true(actual.next().done); assert_true(actual.next().done); + + for (key of headers.keys()) + assert_true(sortedHeaderKeys.indexOf(key) != -1); }, "Check keys method"); test(function() { var headers = new Headers(headerEntriesDict); var actual = headers.values(); + checkIteratorProperties(actual); sortedHeaderKeys.forEach(function(key) { entry = actual.next(); @@ -148,11 +167,15 @@ }); assert_true(actual.next().done); assert_true(actual.next().done); + + for (value of headers.values()) + assert_true(headerValues.indexOf(value) != -1); }, "Check values method"); test(function() { var headers = new Headers(headerEntriesDict); var actual = headers.entries(); + checkIteratorProperties(actual); sortedHeaderKeys.forEach(function(key) { entry = actual.next(); @@ -162,6 +185,9 @@ }); assert_true(actual.next().done); assert_true(actual.next().done); + + for (entry of headers.entries()) + assert_equals(entry[1], sortedHeaderDict[entry[0]]); }, "Check entries method"); test(function() { diff --git a/fetch/api/policies/referrer-no-referrer.html.headers b/fetch/api/policies/referrer-no-referrer.html.headers index 6954766b475129..7ffbf17d6be5a5 100644 --- a/fetch/api/policies/referrer-no-referrer.html.headers +++ b/fetch/api/policies/referrer-no-referrer.html.headers @@ -1 +1 @@ -Content-Security-Policy: referrer no-referrer; \ No newline at end of file +Referrer-Policy: no-referrer diff --git a/fetch/api/policies/referrer-no-referrer.js.headers b/fetch/api/policies/referrer-no-referrer.js.headers index 6954766b475129..7ffbf17d6be5a5 100644 --- a/fetch/api/policies/referrer-no-referrer.js.headers +++ b/fetch/api/policies/referrer-no-referrer.js.headers @@ -1 +1 @@ -Content-Security-Policy: referrer no-referrer; \ No newline at end of file +Referrer-Policy: no-referrer diff --git a/fetch/api/policies/referrer-origin-when-cross-origin-worker.html b/fetch/api/policies/referrer-origin-when-cross-origin-worker.html new file mode 100644 index 00000000000000..f95ae8cf081d13 --- /dev/null +++ b/fetch/api/policies/referrer-origin-when-cross-origin-worker.html @@ -0,0 +1,16 @@ + + + + + Fetch in worker: referrer with origin-when-cross-origin policy + + + + + + + + + diff --git a/fetch/api/policies/referrer-origin-when-cross-origin.html b/fetch/api/policies/referrer-origin-when-cross-origin.html new file mode 100644 index 00000000000000..18de7364634d18 --- /dev/null +++ b/fetch/api/policies/referrer-origin-when-cross-origin.html @@ -0,0 +1,15 @@ + + + + + Fetch: referrer with origin-when-cross-origin policy + + + + + + + + + + diff --git a/fetch/api/policies/referrer-origin-when-cross-origin.html.headers b/fetch/api/policies/referrer-origin-when-cross-origin.html.headers new file mode 100644 index 00000000000000..ad768e63294149 --- /dev/null +++ b/fetch/api/policies/referrer-origin-when-cross-origin.html.headers @@ -0,0 +1 @@ +Referrer-Policy: origin-when-cross-origin diff --git a/fetch/api/policies/referrer-origin-when-cross-origin.js b/fetch/api/policies/referrer-origin-when-cross-origin.js new file mode 100644 index 00000000000000..2baf7d12593fdd --- /dev/null +++ b/fetch/api/policies/referrer-origin-when-cross-origin.js @@ -0,0 +1,16 @@ +if (this.document === undefined) { + importScripts("/resources/testharness.js"); + importScripts("../resources/utils.js"); +} + +var referrerOrigin = "http://{{host}}:{{ports[http][0]}}/"; +var fetchedUrl = "http://{{host}}:{{ports[http][1]}}" + dirname(location.pathname) + RESOURCES_DIR + "inspect-headers.py?cors&headers=referer"; + +promise_test(function(test) { + return fetch(fetchedUrl).then(function(resp) { + assert_equals(resp.status, 200, "HTTP status is 200"); + assert_equals(resp.headers.get("x-request-referer"), referrerOrigin, "request's referrer is " + referrerOrigin); + }); +}, "Request's referrer is origin"); + +done(); diff --git a/fetch/api/policies/referrer-origin-when-cross-origin.js.headers b/fetch/api/policies/referrer-origin-when-cross-origin.js.headers new file mode 100644 index 00000000000000..ad768e63294149 --- /dev/null +++ b/fetch/api/policies/referrer-origin-when-cross-origin.js.headers @@ -0,0 +1 @@ +Referrer-Policy: origin-when-cross-origin diff --git a/fetch/api/policies/referrer-origin.html.headers b/fetch/api/policies/referrer-origin.html.headers index 9bb592a867d209..5b29739bbdde3a 100644 --- a/fetch/api/policies/referrer-origin.html.headers +++ b/fetch/api/policies/referrer-origin.html.headers @@ -1 +1 @@ -Content-Security-Policy: referrer origin; \ No newline at end of file +Referrer-Policy: origin diff --git a/fetch/api/policies/referrer-origin.js.headers b/fetch/api/policies/referrer-origin.js.headers index 9bb592a867d209..5b29739bbdde3a 100644 --- a/fetch/api/policies/referrer-origin.js.headers +++ b/fetch/api/policies/referrer-origin.js.headers @@ -1 +1 @@ -Content-Security-Policy: referrer origin; \ No newline at end of file +Referrer-Policy: origin diff --git a/fetch/api/policies/referrer-unsafe-url.html.headers b/fetch/api/policies/referrer-unsafe-url.html.headers index 8efcca15fe0da1..8e23770bd60404 100644 --- a/fetch/api/policies/referrer-unsafe-url.html.headers +++ b/fetch/api/policies/referrer-unsafe-url.html.headers @@ -1 +1 @@ -Content-Security-Policy: referrer unsafe-url; \ No newline at end of file +Referrer-Policy: unsafe-url diff --git a/fetch/api/policies/referrer-unsafe-url.js.headers b/fetch/api/policies/referrer-unsafe-url.js.headers index 8efcca15fe0da1..8e23770bd60404 100644 --- a/fetch/api/policies/referrer-unsafe-url.js.headers +++ b/fetch/api/policies/referrer-unsafe-url.js.headers @@ -1 +1 @@ -Content-Security-Policy: referrer unsafe-url; \ No newline at end of file +Referrer-Policy: unsafe-url diff --git a/fetch/api/redirect/redirect-origin-worker.html b/fetch/api/redirect/redirect-origin-worker.html new file mode 100644 index 00000000000000..fdb542237d9df0 --- /dev/null +++ b/fetch/api/redirect/redirect-origin-worker.html @@ -0,0 +1,17 @@ + + + + + Fetch in worker: redirect mode handling + + + + + + + + + + diff --git a/fetch/api/redirect/redirect-origin.html b/fetch/api/redirect/redirect-origin.html new file mode 100644 index 00000000000000..4cbe1c07d002ae --- /dev/null +++ b/fetch/api/redirect/redirect-origin.html @@ -0,0 +1,18 @@ + + + + + Fetch: redirect mode handling + + + + + + + + + + + + + diff --git a/fetch/api/redirect/redirect-origin.js b/fetch/api/redirect/redirect-origin.js new file mode 100644 index 00000000000000..77f841e94b588a --- /dev/null +++ b/fetch/api/redirect/redirect-origin.js @@ -0,0 +1,40 @@ +if (this.document === undefined) { + importScripts("/common/utils.js"); + importScripts("/resources/testharness.js"); + importScripts("../resources/utils.js"); + importScripts("/common/get-host-info.sub.js"); +} + +function testOriginAfterRedirection(desc, redirectUrl, redirectLocation, redirectStatus, expectedOrigin) { + var uuid_token = token(); + var url = redirectUrl; + var urlParameters = "?token=" + uuid_token + "&max_age=0"; + urlParameters += "&redirect_status=" + redirectStatus; + urlParameters += "&location=" + encodeURIComponent(redirectLocation); + + var requestInit = {"mode": "cors", "redirect": "follow"}; + + promise_test(function(test) { + return fetch(RESOURCES_DIR + "clean-stash.py?token=" + uuid_token).then(function(resp) { + assert_equals(resp.status, 200, "Clean stash response's status is 200"); + return fetch(url + urlParameters, requestInit).then(function(response) { + assert_equals(response.status, 200, "Inspect header response's status is 200"); + assert_equals(response.headers.get("x-request-origin"), expectedOrigin, "Check origin header"); + }); + }); + }, desc); +} + +var redirectUrl = RESOURCES_DIR + "redirect.py"; +var corsRedirectUrl = get_host_info().HTTP_REMOTE_ORIGIN + dirname(location.pathname) + RESOURCES_DIR + "redirect.py"; +var locationUrl = get_host_info().HTTP_ORIGIN + dirname(location.pathname) + RESOURCES_DIR + "inspect-headers.py?headers=origin"; +var corsLocationUrl = get_host_info().HTTP_REMOTE_ORIGIN + dirname(location.pathname) + RESOURCES_DIR + "inspect-headers.py?cors&headers=origin"; + +for (var code of [301, 302, 303, 307, 308]) { + testOriginAfterRedirection("Same origin to same origin redirection " + code, redirectUrl, locationUrl, code, null); + testOriginAfterRedirection("Same origin to other origin redirection " + code, redirectUrl, corsLocationUrl, code, get_host_info().HTTP_ORIGIN); + testOriginAfterRedirection("Other origin to other origin redirection " + code, corsRedirectUrl, corsLocationUrl, code, get_host_info().HTTP_ORIGIN); + testOriginAfterRedirection("Other origin to same origin redirection " + code, corsRedirectUrl, locationUrl + "&cors", code, "null"); +} + +done(); diff --git a/fetch/api/redirect/redirect-schemes.html b/fetch/api/redirect/redirect-schemes.html index 2abb1203c1f92a..cffec19d56a32f 100644 --- a/fetch/api/redirect/redirect-schemes.html +++ b/fetch/api/redirect/redirect-schemes.html @@ -6,18 +6,18 @@
    diff --git a/fetch/api/request/request-cache.html b/fetch/api/request/request-cache.html index 9e9b8f4ed8ddea..f2c442a54094e0 100644 --- a/fetch/api/request/request-cache.html +++ b/fetch/api/request/request-cache.html @@ -8,7 +8,7 @@ - + diff --git a/fetch/api/request/resources/get-host-info.sub.js b/fetch/api/request/resources/get-host-info.sub.js deleted file mode 100644 index 47fdef9c29d1cf..00000000000000 --- a/fetch/api/request/resources/get-host-info.sub.js +++ /dev/null @@ -1,32 +0,0 @@ -// This file is duplicated verbatim from: -// service-workers/service-worker/resources/get-host-info.sub.js -// with the rationale that: -// - it's better to not reinvent this -// - at the same time, referencing tests deep inside a sibling test group is -// not a great idea and copying the file is the lesser evil. -function get_host_info() { - var ORIGINAL_HOST = '127.0.0.1'; - var REMOTE_HOST = 'localhost'; - var UNAUTHENTICATED_HOST = 'example.test'; - var HTTP_PORT = 8000; - var HTTPS_PORT = 8443; - try { - // In W3C test, we can get the hostname and port number in config.json - // using wptserve's built-in pipe. - // http://wptserve.readthedocs.org/en/latest/pipes.html#built-in-pipes - HTTP_PORT = eval('{{ports[http][0]}}'); - HTTPS_PORT = eval('{{ports[https][0]}}'); - ORIGINAL_HOST = eval('\'{{host}}\''); - REMOTE_HOST = 'www1.' + ORIGINAL_HOST; - } catch (e) { - } - return { - HTTP_ORIGIN: 'http://' + ORIGINAL_HOST + ':' + HTTP_PORT, - HTTPS_ORIGIN: 'https://' + ORIGINAL_HOST + ':' + HTTPS_PORT, - HTTPS_ORIGIN_WITH_CREDS: 'https://foo:bar@' + ORIGINAL_HOST + ':' + HTTPS_PORT, - HTTP_REMOTE_ORIGIN: 'http://' + REMOTE_HOST + ':' + HTTP_PORT, - HTTPS_REMOTE_ORIGIN: 'https://' + REMOTE_HOST + ':' + HTTPS_PORT, - HTTPS_REMOTE_ORIGIN_WITH_CREDS: 'https://foo:bar@' + REMOTE_HOST + ':' + HTTPS_PORT, - UNAUTHENTICATED_ORIGIN: 'http://' + UNAUTHENTICATED_HOST + ':' + HTTP_PORT - }; -} diff --git a/fetch/api/resources/redirect.py b/fetch/api/resources/redirect.py index 3767b223aacca3..1dac4f0d2786d4 100644 --- a/fetch/api/resources/redirect.py +++ b/fetch/api/resources/redirect.py @@ -1,3 +1,6 @@ +from urllib import urlencode +from urlparse import urlparse + def main(request, response): stashed_data = {'count': 0, 'preflight': "0"} status = 302 @@ -28,13 +31,16 @@ def main(request, response): stashed_data['count'] += 1 - #keep url parameters in location - url_parameters = "?" + "&".join(map(lambda x: x[0][0] + "=" + x[1][0], request.GET.items())) - #make sure location changes during redirection loop - url_parameters += "&count=" + str(stashed_data['count']) - if "location" in request.GET: - headers.append(("Location", request.GET['location'] + url_parameters)) + url = request.GET['location'] + scheme = urlparse(url).scheme + if scheme == "" or scheme == "http" or scheme == "https": + url += "&" if '?' in url else "?" + #keep url parameters in location + url += urlencode(request.GET.items()) + #make sure location changes during redirection loop + url += "&count=" + str(stashed_data['count']) + headers.append(("Location", url)) if token: request.server.stash.put(request.GET.first("token"), stashed_data) diff --git a/fetch/api/resources/utils.js b/fetch/api/resources/utils.js index a0235fef99f096..86542c7bc8fdcd 100644 --- a/fetch/api/resources/utils.js +++ b/fetch/api/resources/utils.js @@ -53,12 +53,13 @@ function stringToArray(str) { function validateBufferFromString(buffer, expectedValue, message) { - return assert_array_equals(new Uint8Array(buffer), stringToArray(expectedValue), message); + return assert_array_equals(new Uint8Array(buffer !== undefined ? buffer : []), stringToArray(expectedValue), message); } function validateStreamFromString(reader, expectedValue, retrievedArrayBuffer) { return reader.read().then(function(data) { if (!data.done) { + assert_true(data.value instanceof Uint8Array, "Fetch ReadableStream chunks should be Uint8Array"); var newBuffer; if (retrievedArrayBuffer) { newBuffer = new ArrayBuffer(data.value.length + retrievedArrayBuffer.length); diff --git a/fetch/api/response/response-clone.html b/fetch/api/response/response-clone.html index 2d36d97685dc69..88b93458b13a96 100644 --- a/fetch/api/response/response-clone.html +++ b/fetch/api/response/response-clone.html @@ -54,7 +54,7 @@ }, "Check cloned response's body"); promise_test(function(test) { - var disturbedResponse = new Response(); + var disturbedResponse = new Response("data"); return disturbedResponse.text().then(function() { assert_true(disturbedResponse.bodyUsed, "response is disturbed"); assert_throws(new TypeError() , function() { disturbedResponse.clone(); }, diff --git a/fetch/api/response/response-consume.html b/fetch/api/response/response-consume.html index 02814ff5be926b..7ead2a5e8d3bc1 100644 --- a/fetch/api/response/response-consume.html +++ b/fetch/api/response/response-consume.html @@ -92,6 +92,25 @@ checkBlobResponseBody(blob, textData, "json", checkBodyJSON); checkBlobResponseBody(blob, textData, "arrayBuffer", checkBodyArrayBuffer); + function checkReadableStreamResponseBody(streamData, bodyType, checkFunction) { + promise_test(function(test) { + var stream = new ReadableStream({ + start: function(controller) { + controller.enqueue(stringToArray(streamData)); + controller.close(); + } + }); + var response = new Response(stream); + assert_false(response.bodyUsed, "bodyUsed is false at init"); + return checkFunction(response, streamData); + }, "Consume stream response's body as " + bodyType); + } + + checkReadableStreamResponseBody(textData, "blob", checkBodyBlob); + checkReadableStreamResponseBody(textData, "text", checkBodyText); + checkReadableStreamResponseBody(textData, "json", checkBodyJSON); + checkReadableStreamResponseBody(textData, "arrayBuffer", checkBodyArrayBuffer); + diff --git a/fetch/api/response/response-init-001.html b/fetch/api/response/response-init-001.html index e36f90e4c82798..4a8a7bd80cceaf 100644 --- a/fetch/api/response/response-init-001.html +++ b/fetch/api/response/response-init-001.html @@ -60,4 +60,4 @@ }, "Check " + attributeName + " init values and associated getter"); - \ No newline at end of file + diff --git a/fetch/nosniff/resources/image.py b/fetch/nosniff/resources/image.py index 32a07c197dfffa..8fb05edc658dd0 100644 --- a/fetch/nosniff/resources/image.py +++ b/fetch/nosniff/resources/image.py @@ -3,7 +3,7 @@ def main(request, response): type = request.GET.first("type", None) - body = open(os.path.join(os.path.dirname(__file__), "../../../images/blue96x96.png")).read() + body = open(os.path.join(os.path.dirname(__file__), "../../../images/blue96x96.png"), "rb").read() response.add_required_headers = False response.writer.write_status(200) diff --git a/fetch/nosniff/stylesheet.html b/fetch/nosniff/stylesheet.html index 07de819f8afafc..0ad04038e2027c 100644 --- a/fetch/nosniff/stylesheet.html +++ b/fetch/nosniff/stylesheet.html @@ -22,11 +22,7 @@ var link = document.createElement("link") link.rel = "stylesheet" link.onerror = t.unreached_func("Unexpected error event") - link.onload = t.step_func_done(function(){ - if(passes[passes.length-1] == urlpart) { - assert_equals(document.styleSheets.length, passes.length) - } - }) + link.onload = t.step_func_done(function(){}) link.href = "resources/css.py" + urlpart document.body.appendChild(link) }, "URL query: " + urlpart) diff --git a/html/browsers/browsing-the-web/history-traversal/browsing_context_name.html b/html/browsers/browsing-the-web/history-traversal/browsing_context_name.html index 0159a36b22dadc..a277eccea818d5 100644 --- a/html/browsers/browsing-the-web/history-traversal/browsing_context_name.html +++ b/html/browsers/browsing-the-web/history-traversal/browsing_context_name.html @@ -17,7 +17,7 @@ var steps = [ function() {f.src = "browsing_context_name-1.html"}, function() { - var navigated = true; + navigated = true; assert_equals(f.contentWindow.name, "test", "Initial load"); setTimeout(next, 0); }, diff --git a/html/browsers/browsing-the-web/navigating-across-documents/source/navigate-child-function-parent.html b/html/browsers/browsing-the-web/navigating-across-documents/source/navigate-child-function-parent.html new file mode 100644 index 00000000000000..bd2d9dfdb1e58b --- /dev/null +++ b/html/browsers/browsing-the-web/navigating-across-documents/source/navigate-child-function-parent.html @@ -0,0 +1,17 @@ + + +Set location from a parent + + +
    + + diff --git a/html/browsers/browsing-the-web/navigating-across-documents/source/navigate-child-function-src.html b/html/browsers/browsing-the-web/navigating-across-documents/source/navigate-child-function-src.html new file mode 100644 index 00000000000000..4a15b3f0837ab7 --- /dev/null +++ b/html/browsers/browsing-the-web/navigating-across-documents/source/navigate-child-function-src.html @@ -0,0 +1,17 @@ + + +Set src from a function called from a parent + + +
    + + diff --git a/html/browsers/browsing-the-web/navigating-across-documents/source/navigate-child-function.html b/html/browsers/browsing-the-web/navigating-across-documents/source/navigate-child-function.html new file mode 100644 index 00000000000000..b75062b8d93bed --- /dev/null +++ b/html/browsers/browsing-the-web/navigating-across-documents/source/navigate-child-function.html @@ -0,0 +1,18 @@ + + +Set location from a function called from a parent + + +
    + + diff --git a/html/browsers/browsing-the-web/navigating-across-documents/source/navigate-child-src-about-blank.html b/html/browsers/browsing-the-web/navigating-across-documents/source/navigate-child-src-about-blank.html new file mode 100644 index 00000000000000..dce6ab2f6934b9 --- /dev/null +++ b/html/browsers/browsing-the-web/navigating-across-documents/source/navigate-child-src-about-blank.html @@ -0,0 +1,17 @@ + + +Set the src attribute to about:blank and check referrer + + +
    + + diff --git a/html/browsers/browsing-the-web/navigating-across-documents/source/support/dummy.html b/html/browsers/browsing-the-web/navigating-across-documents/source/support/dummy.html new file mode 100644 index 00000000000000..0638657093c6c0 --- /dev/null +++ b/html/browsers/browsing-the-web/navigating-across-documents/source/support/dummy.html @@ -0,0 +1,3 @@ + + +

    Hello. \ No newline at end of file diff --git a/html/browsers/browsing-the-web/navigating-across-documents/source/support/location-set.html b/html/browsers/browsing-the-web/navigating-across-documents/source/support/location-set.html new file mode 100644 index 00000000000000..ad733afac3ec65 --- /dev/null +++ b/html/browsers/browsing-the-web/navigating-across-documents/source/support/location-set.html @@ -0,0 +1,8 @@ + + + +

    Hello. Go. \ No newline at end of file diff --git a/html/browsers/browsing-the-web/navigating-across-documents/source/support/set-parent-src.html b/html/browsers/browsing-the-web/navigating-across-documents/source/support/set-parent-src.html new file mode 100644 index 00000000000000..9d45be8c8dfeba --- /dev/null +++ b/html/browsers/browsing-the-web/navigating-across-documents/source/support/set-parent-src.html @@ -0,0 +1,8 @@ + + + +

    Hello. Go. \ No newline at end of file diff --git a/html/browsers/history/the-history-interface/008.js b/html/browsers/history/the-history-interface/008.js new file mode 100644 index 00000000000000..96a1fe5d4a6f7e --- /dev/null +++ b/html/browsers/history/the-history-interface/008.js @@ -0,0 +1,11 @@ +var beforehref = location.href; + +test(function () { + history.pushState('','','/testing_ignore_me_404'); + assert_equals(location.href,beforehref.replace(/^(\w*:\/\/[^\/]*\/)[\w\W]*$/,'$1testing_ignore_me_404')); +}, 'history.pushState URL resolving should be done relative to the document, not the script'); + +test(function () { + history.replaceState('','','/testing_ignore_me_404_2'); + assert_equals(location.href,beforehref.replace(/^(\w*:\/\/[^\/]*\/)[\w\W]*$/,'$1testing_ignore_me_404_2')); +}, 'history.replaceState URL resolving should be done relative to the document, not the script'); diff --git a/html/browsers/history/the-location-interface/security_location_0.sub.htm b/html/browsers/history/the-location-interface/security_location_0.sub.htm index b6ebbc28a45eb7..f509c23b18c55b 100644 --- a/html/browsers/history/the-location-interface/security_location_0.sub.htm +++ b/html/browsers/history/the-location-interface/security_location_0.sub.htm @@ -11,13 +11,17 @@

    Access location object from different origins doesn't raise SECURITY_ERR exception

    + - + + diff --git a/html/browsers/origin/cross-origin-objects/cross-origin-objects.sub.html b/html/browsers/origin/cross-origin-objects/cross-origin-objects.sub.html index ee7c7763663d63..b7a939d6f9b0b6 100644 --- a/html/browsers/origin/cross-origin-objects/cross-origin-objects.sub.html +++ b/html/browsers/origin/cross-origin-objects/cross-origin-objects.sub.html @@ -51,7 +51,10 @@ */ addTest(function() { - assert_equals(location.host, '{{domains[]}}:{{location[port]}}', 'Need to run the top-level test from {{domains[]}}:{{location[port]}}'); + // Note: we do not check location.hostname as its default port semantics are hard to reflect + // statically + assert_equals(location.hostname, '{{domains[]}}', 'Need to run the top-level test from domain {{domains[]}}'); + assert_equals(location.port, '{{location[port]}}', 'Need to run the top-level test from port {{location[port]}}') assert_equals(B.parent, window, "window.parent works same-origin"); assert_equals(C.parent, window, "window.parent works cross-origin"); assert_equals(B.location.pathname, path, "location.href works same-origin"); @@ -189,6 +192,8 @@ * [[Delete]] */ addTest(function() { + assert_throws(null, function() { delete C[0]; }, "Can't delete cross-origin indexed property"); + assert_throws(null, function() { delete C[100]; }, "Can't delete cross-origin indexed property"); assert_throws(null, function() { delete C.location; }, "Can't delete cross-origin property"); assert_throws(null, function() { delete C.parent; }, "Can't delete cross-origin property"); assert_throws(null, function() { delete C.length; }, "Can't delete cross-origin property"); diff --git a/html/browsers/the-window-object/security-window/window-security.sub.html b/html/browsers/the-window-object/security-window/window-security.sub.html index 213c7bdda84a8f..15f68ee22e9458 100644 --- a/html/browsers/the-window-object/security-window/window-security.sub.html +++ b/html/browsers/the-window-object/security-window/window-security.sub.html @@ -12,10 +12,9 @@ +
    - + + diff --git a/html/browsers/windows/nested-browsing-contexts/frameElement.sub.html b/html/browsers/windows/nested-browsing-contexts/frameElement.sub.html index a9fe824ef3cd71..f1d5581f689583 100644 --- a/html/browsers/windows/nested-browsing-contexts/frameElement.sub.html +++ b/html/browsers/windows/nested-browsing-contexts/frameElement.sub.html @@ -4,6 +4,7 @@ + + diff --git a/html/dom/documents/dom-tree-accessors/Document.currentScript.sub.html b/html/dom/documents/dom-tree-accessors/Document.currentScript.sub.html index c523bfb0ac34d8..b0e16274aaa0ce 100644 --- a/html/dom/documents/dom-tree-accessors/Document.currentScript.sub.html +++ b/html/dom/documents/dom-tree-accessors/Document.currentScript.sub.html @@ -5,6 +5,7 @@ +
    diff --git a/html/dom/interfaces.html b/html/dom/interfaces.html index 7d6acb0f1c5277..ed8e18c255efcc 100644 --- a/html/dom/interfaces.html +++ b/html/dom/interfaces.html @@ -84,8 +84,6 @@

    HTML IDL tests

    [Unscopable] void prepend((Node or DOMString)... nodes); [Unscopable] void append((Node or DOMString)... nodes); - [Unscopable] Element? query(DOMString relativeSelectors); - [NewObject, Unscopable] Elements queryAll(DOMString relativeSelectors); Element? querySelector(DOMString selectors); [NewObject] NodeList querySelectorAll(DOMString selectors); }; @@ -167,7 +165,7 @@

    HTML IDL tests

    const unsigned short ELEMENT_NODE = 1; const unsigned short ATTRIBUTE_NODE = 2; // historical const unsigned short TEXT_NODE = 3; - const unsigned short CDATA_SECTION_NODE = 4; // historical + const unsigned short CDATA_SECTION_NODE = 4; const unsigned short ENTITY_REFERENCE_NODE = 5; // historical const unsigned short ENTITY_NODE = 6; // historical const unsigned short PROCESSING_INSTRUCTION_NODE = 7; @@ -239,6 +237,7 @@

    HTML IDL tests

    [NewObject] Element createElementNS(DOMString? namespace, DOMString qualifiedName); [NewObject] DocumentFragment createDocumentFragment(); [NewObject] Text createTextNode(DOMString data); + [NewObject] CDATASection createCDATASection(DOMString data); [NewObject] Comment createComment(DOMString data); [NewObject] ProcessingInstruction createProcessingInstruction(DOMString target, DOMString data); @@ -354,6 +353,10 @@

    HTML IDL tests

    readonly attribute DOMString wholeText; }; +[Exposed=Window] +interface CDATASection : Text { +}; + interface ProcessingInstruction : CharacterData { readonly attribute DOMString target; }; @@ -443,7 +446,7 @@

    HTML IDL tests

    const unsigned long SHOW_ELEMENT = 0x1; const unsigned long SHOW_ATTRIBUTE = 0x2; // historical const unsigned long SHOW_TEXT = 0x4; - const unsigned long SHOW_CDATA_SECTION = 0x8; // historical + const unsigned long SHOW_CDATA_SECTION = 0x8; const unsigned long SHOW_ENTITY_REFERENCE = 0x10; // historical const unsigned long SHOW_ENTITY = 0x20; // historical const unsigned long SHOW_PROCESSING_INSTRUCTION = 0x40; @@ -907,63 +910,56 @@

    HTML IDL tests

    deleter void (DOMString name); }; -interface DOMElementMap { - getter Element (DOMString name); - setter creator void (DOMString name, Element value); - deleter void (DOMString name); -}; - -typedef (ArrayBuffer or CanvasProxy or MessagePort) Transferable; +typedef (ArrayBuffer or MessagePort) Transferable; callback FileCallback = void (File file); enum DocumentReadyState { "loading", "interactive", "complete" }; +typedef (HTMLScriptElement or SVGScriptElement) HTMLOrSVGScriptElement; [OverrideBuiltins] partial /*sealed*/ interface Document { // resource metadata management [PutForwards=href, Unforgeable] readonly attribute Location? location; - attribute DOMString domain; - readonly attribute DOMString referrer; - attribute DOMString cookie; + attribute USVString domain; + readonly attribute USVString referrer; + attribute USVString cookie; readonly attribute DOMString lastModified; readonly attribute DocumentReadyState readyState; // DOM tree accessors getter object (DOMString name); - attribute DOMString title; - attribute DOMString dir; - attribute HTMLElement? body; + [CEReactions] attribute DOMString title; + [CEReactions] attribute DOMString dir; + [CEReactions] attribute HTMLElement? body; readonly attribute HTMLHeadElement? head; - readonly attribute HTMLCollection images; - readonly attribute HTMLCollection embeds; - readonly attribute HTMLCollection plugins; - readonly attribute HTMLCollection links; - readonly attribute HTMLCollection forms; - readonly attribute HTMLCollection scripts; + [SameObject] readonly attribute HTMLCollection images; + [SameObject] readonly attribute HTMLCollection embeds; + [SameObject] readonly attribute HTMLCollection plugins; + [SameObject] readonly attribute HTMLCollection links; + [SameObject] readonly attribute HTMLCollection forms; + [SameObject] readonly attribute HTMLCollection scripts; NodeList getElementsByName(DOMString elementName); - readonly attribute DOMElementMap cssElementMap; - readonly attribute HTMLScriptElement? currentScript; + readonly attribute HTMLOrSVGScriptElement? currentScript; // classic scripts in a document tree only // dynamic markup insertion - Document open(optional DOMString type = "text/html", optional DOMString replace = ""); - WindowProxy open(DOMString url, DOMString name, DOMString features, optional boolean replace = false); - void close(); - void write(DOMString... text); - void writeln(DOMString... text); + [CEReactions] Document open(optional DOMString type = "text/html", optional DOMString replace = ""); + WindowProxy open(USVString url, DOMString name, DOMString features); + [CEReactions] void close(); + [CEReactions] void write(DOMString... text); + [CEReactions] void writeln(DOMString... text); // user interaction readonly attribute WindowProxy? defaultView; readonly attribute Element? activeElement; boolean hasFocus(); - attribute DOMString designMode; - boolean execCommand(DOMString commandId, optional boolean showUI = false, optional DOMString value = ""); + [CEReactions] attribute DOMString designMode; + [CEReactions] boolean execCommand(DOMString commandId, optional boolean showUI = false, optional DOMString value = ""); boolean queryCommandEnabled(DOMString commandId); boolean queryCommandIndeterm(DOMString commandId); boolean queryCommandState(DOMString commandId); boolean queryCommandSupported(DOMString commandId); DOMString queryCommandValue(DOMString commandId); - readonly attribute HTMLCollection commands; // special event handler IDL attributes that only apply to Document objects [LenientThis] attribute EventHandler onreadystatechange; @@ -971,44 +967,41 @@

    HTML IDL tests

    // also has obsolete members }; Document implements GlobalEventHandlers; +Document implements DocumentAndElementEventHandlers; -partial interface XMLDocument { - boolean load(DOMString url); +[NoInterfaceObject] +interface ElementContentEditable { + [CEReactions] attribute DOMString contentEditable; + readonly attribute boolean isContentEditable; }; interface HTMLElement : Element { // metadata attributes - attribute DOMString title; - attribute DOMString lang; - attribute boolean translate; - attribute DOMString dir; - readonly attribute DOMStringMap dataset; + [CEReactions] attribute DOMString title; + [CEReactions] attribute DOMString lang; + [CEReactions] attribute boolean translate; + [CEReactions] attribute DOMString dir; + [SameObject] readonly attribute DOMStringMap dataset; // user interaction - attribute boolean hidden; + [CEReactions] attribute boolean hidden; void click(); - attribute long tabIndex; + [CEReactions] attribute long tabIndex; void focus(); void blur(); - attribute DOMString accessKey; + [CEReactions] attribute DOMString accessKey; readonly attribute DOMString accessKeyLabel; - attribute boolean draggable; - [PutForwards=value] readonly attribute DOMTokenList dropzone; - attribute DOMString contentEditable; - readonly attribute boolean isContentEditable; - attribute HTMLMenuElement? contextMenu; - attribute boolean spellcheck; + [CEReactions] attribute boolean draggable; + [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList dropzone; + [CEReactions] attribute HTMLMenuElement? contextMenu; + [CEReactions] attribute boolean spellcheck; void forceSpellCheck(); - // command API - readonly attribute DOMString? commandType; - readonly attribute DOMString? commandLabel; - readonly attribute DOMString? commandIcon; - readonly attribute boolean? commandHidden; - readonly attribute boolean? commandDisabled; - readonly attribute boolean? commandChecked; + [CEReactions, TreatNullAs=EmptyString] attribute DOMString innerText; }; HTMLElement implements GlobalEventHandlers; +HTMLElement implements DocumentAndElementEventHandlers; +HTMLElement implements ElementContentEditable; interface HTMLUnknownElement : HTMLElement { }; @@ -1050,9 +1043,9 @@

    HTML IDL tests

    }; interface HTMLStyleElement : HTMLElement { - attribute DOMString media; - attribute DOMString type; - attribute boolean scoped; + [CEReactions] attribute DOMString media; + [CEReactions] attribute DOMString nonce; + [CEReactions] attribute DOMString type; }; HTMLStyleElement implements LinkStyle; @@ -1172,7 +1165,6 @@

    HTML IDL tests

    attribute DOMString srcdoc; attribute DOMString name; [PutForwards=value] readonly attribute DOMTokenList sandbox; - attribute boolean seamless; attribute boolean allowFullscreen; attribute DOMString width; attribute DOMString height; @@ -1300,13 +1292,9 @@

    HTML IDL tests

    readonly attribute boolean ended; attribute boolean autoplay; attribute boolean loop; - void play(); + Promise play(); void pause(); - // media controller - attribute DOMString mediaGroup; - attribute MediaController? controller; - // controls attribute boolean controls; attribute double volume; @@ -1365,46 +1353,6 @@

    HTML IDL tests

    attribute boolean selected; }; -enum MediaControllerPlaybackState { "waiting", "playing", "ended" }; -[Constructor] -interface MediaController : EventTarget { - readonly attribute unsigned short readyState; // uses HTMLMediaElement.readyState's values - - readonly attribute TimeRanges buffered; - readonly attribute TimeRanges seekable; - readonly attribute unrestricted double duration; - attribute double currentTime; - - readonly attribute boolean paused; - readonly attribute MediaControllerPlaybackState playbackState; - readonly attribute TimeRanges played; - void pause(); - void unpause(); - void play(); // calls play() on all media elements as well - - attribute double defaultPlaybackRate; - attribute double playbackRate; - - attribute double volume; - attribute boolean muted; - - attribute EventHandler onemptied; - attribute EventHandler onloadedmetadata; - attribute EventHandler onloadeddata; - attribute EventHandler oncanplay; - attribute EventHandler oncanplaythrough; - attribute EventHandler onplaying; - attribute EventHandler onended; - attribute EventHandler onwaiting; - - attribute EventHandler ondurationchange; - attribute EventHandler ontimeupdate; - attribute EventHandler onplay; - attribute EventHandler onpause; - attribute EventHandler onratechange; - attribute EventHandler onvolumechange; -}; - interface TextTrackList : EventTarget { readonly attribute unsigned long length; getter TextTrack (unsigned long index); @@ -1472,7 +1420,6 @@

    HTML IDL tests

    interface HTMLMapElement : HTMLElement { attribute DOMString name; readonly attribute HTMLCollection areas; - readonly attribute HTMLCollection images; }; interface HTMLAreaElement : HTMLElement { @@ -1503,8 +1450,6 @@

    HTML IDL tests

    readonly attribute HTMLCollection rows; HTMLElement insertRow(optional long index = -1); void deleteRow(long index); - attribute boolean sortable; - void stopSorting(); // also has obsolete members }; @@ -1570,8 +1515,6 @@

    HTML IDL tests

    void reset(); boolean checkValidity(); boolean reportValidity(); - - void requestAutocomplete(); }; interface HTMLLabelElement : HTMLElement { @@ -1618,8 +1561,6 @@

    HTML IDL tests

    [TreatNullAs=EmptyString] attribute DOMString value; attribute Date? valueAsDate; attribute unrestricted double valueAsNumber; - attribute double valueLow; - attribute double valueHigh; attribute unsigned long width; void stepUp(optional long n = 1); @@ -1845,17 +1786,6 @@

    HTML IDL tests

    // also has obsolete members }; -enum AutocompleteErrorReason { "" /* empty string */, "cancel", "disabled", "invalid" }; - -[Constructor(DOMString type, optional AutocompleteErrorEventInit eventInitDict)] -interface AutocompleteErrorEvent : Event { - readonly attribute AutocompleteErrorReason reason; -}; - -dictionary AutocompleteErrorEventInit : EventInit { - AutocompleteErrorReason reason; -}; - enum SelectionMode { "select", "start", @@ -1942,98 +1872,135 @@

    HTML IDL tests

    }; typedef (CanvasRenderingContext2D or WebGLRenderingContext) RenderingContext; +callback BlobCallback = void (Blob? blob); interface HTMLCanvasElement : HTMLElement { attribute unsigned long width; attribute unsigned long height; RenderingContext? getContext(DOMString contextId, any... arguments); - boolean probablySupportsContext(DOMString contextId, any... arguments); - - void setContext(RenderingContext context); - CanvasProxy transferControlToProxy(); DOMString toDataURL(optional DOMString type, any... arguments); - void toBlob(FileCallback? _callback, optional DOMString type, any... arguments); -}; - -[Exposed=(Window,Worker)] -interface CanvasProxy { - void setContext(RenderingContext context); + void toBlob(BlobCallback _callback, optional DOMString type, any... arguments); }; -// CanvasProxy implements Transferable; typedef (HTMLImageElement or + SVGImageElement) HTMLOrSVGImageElement; + +typedef (HTMLOrSVGImageElement or HTMLVideoElement or HTMLCanvasElement or - CanvasRenderingContext2D or ImageBitmap) CanvasImageSource; enum CanvasFillRule { "nonzero", "evenodd" }; -[Constructor(optional unsigned long width, unsigned long height), Exposed=(Window,Worker)] -interface CanvasRenderingContext2D { +dictionary CanvasRenderingContext2DSettings { + boolean alpha = true; +}; +enum ImageSmoothingQuality { "low", "medium", "high" }; + +interface CanvasRenderingContext2D { // back-reference to the canvas readonly attribute HTMLCanvasElement canvas; +}; +CanvasRenderingContext2D implements CanvasState; +CanvasRenderingContext2D implements CanvasTransform; +CanvasRenderingContext2D implements CanvasCompositing; +CanvasRenderingContext2D implements CanvasImageSmoothing; +CanvasRenderingContext2D implements CanvasFillStrokeStyles; +CanvasRenderingContext2D implements CanvasShadowStyles; +CanvasRenderingContext2D implements CanvasFilters; +CanvasRenderingContext2D implements CanvasRect; +CanvasRenderingContext2D implements CanvasDrawPath; +CanvasRenderingContext2D implements CanvasUserInterface; +CanvasRenderingContext2D implements CanvasText; +CanvasRenderingContext2D implements CanvasDrawImage; +CanvasRenderingContext2D implements CanvasHitRegion; +CanvasRenderingContext2D implements CanvasImageData; +CanvasRenderingContext2D implements CanvasPathDrawingStyles; +CanvasRenderingContext2D implements CanvasTextDrawingStyles; +CanvasRenderingContext2D implements CanvasPath; - // canvas dimensions - attribute unsigned long width; - attribute unsigned long height; - - // for contexts that aren't directly fixed to a specific canvas - void commit(); // push the image to the output bitmap - +[NoInterfaceObject] +interface CanvasState { // state void save(); // push state on state stack void restore(); // pop state stack and restore state +}; +[NoInterfaceObject] +interface CanvasTransform { // transformations (default transform is the identity matrix) - attribute SVGMatrix currentTransform; void scale(unrestricted double x, unrestricted double y); void rotate(unrestricted double angle); void translate(unrestricted double x, unrestricted double y); void transform(unrestricted double a, unrestricted double b, unrestricted double c, unrestricted double d, unrestricted double e, unrestricted double f); + + [NewObject] DOMMatrix getTransform(); void setTransform(unrestricted double a, unrestricted double b, unrestricted double c, unrestricted double d, unrestricted double e, unrestricted double f); + void setTransform(optional DOMMatrixInit transform); void resetTransform(); +}; + +[NoInterfaceObject] +interface CanvasCompositing { // compositing - attribute unrestricted double globalAlpha; // (default 1.0) - attribute DOMString globalCompositeOperation; // (default source-over) + attribute unrestricted double globalAlpha; // (default 1.0) + attribute DOMString globalCompositeOperation; // (default source-over) +}; +[NoInterfaceObject] +interface CanvasImageSmoothing { // image smoothing - attribute boolean imageSmoothingEnabled; // (default true) + attribute boolean imageSmoothingEnabled; // (default true) + attribute ImageSmoothingQuality imageSmoothingQuality; // (default low) + +}; - // colours and styles (see also the CanvasDrawingStyles interface) - attribute (DOMString or CanvasGradient or CanvasPattern) strokeStyle; // (default black) - attribute (DOMString or CanvasGradient or CanvasPattern) fillStyle; // (default black) +[NoInterfaceObject] +interface CanvasFillStrokeStyles { + // colours and styles (see also the CanvasPathDrawingStyles and CanvasTextDrawingStyles interfaces) + attribute (DOMString or CanvasGradient or CanvasPattern) strokeStyle; // (default black) + attribute (DOMString or CanvasGradient or CanvasPattern) fillStyle; // (default black) CanvasGradient createLinearGradient(double x0, double y0, double x1, double y1); CanvasGradient createRadialGradient(double x0, double y0, double r0, double x1, double y1, double r1); - CanvasPattern createPattern(CanvasImageSource image, [TreatNullAs=EmptyString] DOMString repetition); + CanvasPattern? createPattern(CanvasImageSource image, [TreatNullAs=EmptyString] DOMString repetition); +}; + +[NoInterfaceObject] +interface CanvasShadowStyles { // shadows - attribute unrestricted double shadowOffsetX; // (default 0) - attribute unrestricted double shadowOffsetY; // (default 0) - attribute unrestricted double shadowBlur; // (default 0) - attribute DOMString shadowColor; // (default transparent black) + attribute unrestricted double shadowOffsetX; // (default 0) + attribute unrestricted double shadowOffsetY; // (default 0) + attribute unrestricted double shadowBlur; // (default 0) + attribute DOMString shadowColor; // (default transparent black) +}; +[NoInterfaceObject] +interface CanvasFilters { + // filters + attribute DOMString filter; // (default "none") +}; + +[NoInterfaceObject] +interface CanvasRect { // rects void clearRect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h); void fillRect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h); void strokeRect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h); +}; - // path API (see also CanvasPathMethods) +[NoInterfaceObject] +interface CanvasDrawPath { + // path API (see also CanvasPath) void beginPath(); void fill(optional CanvasFillRule fillRule = "nonzero"); void fill(Path2D path, optional CanvasFillRule fillRule = "nonzero"); void stroke(); void stroke(Path2D path); - void drawSystemFocusRing(Element element); - void drawSystemFocusRing(Path2D path, Element element); - boolean drawCustomFocusRing(Element element); - boolean drawCustomFocusRing(Path2D path, Element element); - void scrollPathIntoView(); - void scrollPathIntoView(Path2D path); void clip(optional CanvasFillRule fillRule = "nonzero"); void clip(Path2D path, optional CanvasFillRule fillRule = "nonzero"); void resetClip(); @@ -2041,21 +2008,42 @@

    HTML IDL tests

    boolean isPointInPath(Path2D path, unrestricted double x, unrestricted double y, optional CanvasFillRule fillRule = "nonzero"); boolean isPointInStroke(unrestricted double x, unrestricted double y); boolean isPointInStroke(Path2D path, unrestricted double x, unrestricted double y); +}; + +[NoInterfaceObject] +interface CanvasUserInterface { + void drawFocusIfNeeded(Element element); + void drawFocusIfNeeded(Path2D path, Element element); + void scrollPathIntoView(); + void scrollPathIntoView(Path2D path); +}; - // text (see also the CanvasDrawingStyles interface) +[NoInterfaceObject] +interface CanvasText { + // text (see also the CanvasPathDrawingStyles and CanvasTextDrawingStyles interfaces) void fillText(DOMString text, unrestricted double x, unrestricted double y, optional unrestricted double maxWidth); void strokeText(DOMString text, unrestricted double x, unrestricted double y, optional unrestricted double maxWidth); TextMetrics measureText(DOMString text); +}; +[NoInterfaceObject] +interface CanvasDrawImage { // drawing images void drawImage(CanvasImageSource image, unrestricted double dx, unrestricted double dy); void drawImage(CanvasImageSource image, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh); void drawImage(CanvasImageSource image, unrestricted double sx, unrestricted double sy, unrestricted double sw, unrestricted double sh, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh); +}; +[NoInterfaceObject] +interface CanvasHitRegion { // hit regions void addHitRegion(optional HitRegionOptions options); void removeHitRegion(DOMString id); + void clearHitRegions(); +}; +[NoInterfaceObject] +interface CanvasImageData { // pixel manipulation ImageData createImageData(double sw, double sh); ImageData createImageData(ImageData imagedata); @@ -2063,31 +2051,38 @@

    HTML IDL tests

    void putImageData(ImageData imagedata, double dx, double dy); void putImageData(ImageData imagedata, double dx, double dy, double dirtyX, double dirtyY, double dirtyWidth, double dirtyHeight); }; -CanvasRenderingContext2D implements CanvasDrawingStyles; -CanvasRenderingContext2D implements CanvasPathMethods; -[NoInterfaceObject, Exposed=(Window,Worker)] -interface CanvasDrawingStyles { +enum CanvasLineCap { "butt", "round", "square" }; +enum CanvasLineJoin { "round", "bevel", "miter"}; +enum CanvasTextAlign { "start", "end", "left", "right", "center" }; +enum CanvasTextBaseline { "top", "hanging", "middle", "alphabetic", "ideographic", "bottom" }; +enum CanvasDirection { "ltr", "rtl", "inherit" }; + +[NoInterfaceObject] +interface CanvasPathDrawingStyles { // line caps/joins - attribute unrestricted double lineWidth; // (default 1) - attribute DOMString lineCap; // "butt", "round", "square" (default "butt") - attribute DOMString lineJoin; // "round", "bevel", "miter" (default "miter") - attribute unrestricted double miterLimit; // (default 10) + attribute unrestricted double lineWidth; // (default 1) + attribute CanvasLineCap lineCap; // (default "butt") + attribute CanvasLineJoin lineJoin; // (default "miter") + attribute unrestricted double miterLimit; // (default 10) // dashed lines void setLineDash(sequence segments); // default empty sequence getLineDash(); - attribute unrestricted double lineDashOffset; + attribute unrestricted double lineDashOffset; +}; +[NoInterfaceObject] +interface CanvasTextDrawingStyles { // text - attribute DOMString font; // (default 10px sans-serif) - attribute DOMString textAlign; // "start", "end", "left", "right", "center" (default: "start") - attribute DOMString textBaseline; // "top", "hanging", "middle", "alphabetic", "ideographic", "bottom" (default: "alphabetic") - attribute DOMString direction; // "ltr", "rtl", "inherit" (default: "inherit") + attribute DOMString font; // (default 10px sans-serif) + attribute CanvasTextAlign textAlign; // (default: "start") + attribute CanvasTextBaseline textBaseline; // (default: "alphabetic") + attribute CanvasDirection direction; // (default: "inherit") }; [NoInterfaceObject, Exposed=(Window,Worker)] -interface CanvasPathMethods { +interface CanvasPath { // shared path API methods void closePath(); void moveTo(unrestricted double x, unrestricted double y); @@ -2101,19 +2096,16 @@

    HTML IDL tests

    void ellipse(unrestricted double x, unrestricted double y, unrestricted double radiusX, unrestricted double radiusY, unrestricted double rotation, unrestricted double startAngle, unrestricted double endAngle, optional boolean anticlockwise = false); }; -[Exposed=(Window,Worker)] interface CanvasGradient { // opaque object void addColorStop(double offset, DOMString color); }; -[Exposed=(Window,Worker)] interface CanvasPattern { // opaque object - void setTransform(SVGMatrix transform); + void setTransform(optional DOMMatrixInit transform); }; -[Exposed=(Window,Worker)] interface TextMetrics { // x-direction readonly attribute double width; // advance width @@ -2154,23 +2146,14 @@

    HTML IDL tests

    readonly attribute Uint8ClampedArray data; }; -[Constructor(optional Element scope), Exposed=(Window,Worker)] -interface DrawingStyle { }; -DrawingStyle implements CanvasDrawingStyles; - [Constructor, Constructor(Path2D path), - Constructor(Path2D[] paths, optional CanvasFillRule fillRule = "nonzero"), + Constructor(sequence paths, optional CanvasFillRule fillRule = "nonzero"), Constructor(DOMString d), Exposed=(Window,Worker)] interface Path2D { - void addPath(Path2D path, optional SVGMatrix? transformation = null); - void addPathByStrokingPath(Path2D path, CanvasDrawingStyles styles, optional SVGMatrix? transformation = null); - void addText(DOMString text, CanvasDrawingStyles styles, SVGMatrix? transformation, unrestricted double x, unrestricted double y, optional unrestricted double maxWidth); - void addPathByStrokingText(DOMString text, CanvasDrawingStyles styles, SVGMatrix? transformation, unrestricted double x, unrestricted double y, optional unrestricted double maxWidth); - void addText(DOMString text, CanvasDrawingStyles styles, SVGMatrix? transformation, Path2D path, optional unrestricted double maxWidth); - void addPathByStrokingText(DOMString text, CanvasDrawingStyles styles, SVGMatrix? transformation, Path2D path, optional unrestricted double maxWidth); + void addPath(Path2D path, optional DOMMatrixInit transform); }; -Path2D implements CanvasPathMethods; +Path2D implements CanvasPath; partial interface MouseEvent { readonly attribute DOMString? region; @@ -2418,8 +2401,6 @@

    HTML IDL tests

    [NoInterfaceObject] interface GlobalEventHandlers { attribute EventHandler onabort; - attribute EventHandler onautocomplete; - attribute EventHandler onautocompleteerror; attribute EventHandler onblur; attribute EventHandler oncancel; attribute EventHandler oncanplay; @@ -2472,7 +2453,6 @@

    HTML IDL tests

    attribute EventHandler onseeking; attribute EventHandler onselect; attribute EventHandler onshow; - attribute EventHandler onsort; attribute EventHandler onstalled; attribute EventHandler onsubmit; attribute EventHandler onsuspend; @@ -2482,6 +2462,13 @@

    HTML IDL tests

    attribute EventHandler onwaiting; }; +[NoInterfaceObject] +interface DocumentAndElementEventHandlers { + attribute EventHandler oncopy; + attribute EventHandler oncut; + attribute EventHandler onpaste; +}; + [NoInterfaceObject] interface WindowEventHandlers { attribute EventHandler onafterprint; @@ -2530,48 +2517,50 @@

    HTML IDL tests

    Navigator implements NavigatorLanguage; Navigator implements NavigatorOnLine; Navigator implements NavigatorContentUtils; -Navigator implements NavigatorStorageUtils; +Navigator implements NavigatorCookies; Navigator implements NavigatorPlugins; +Navigator implements NavigatorConcurrentHardware; [NoInterfaceObject, Exposed=(Window,Worker)] interface NavigatorID { - readonly attribute DOMString appCodeName; // constant "Mozilla" - readonly attribute DOMString appName; + [Exposed=Window] readonly attribute DOMString appCodeName; // constant "Mozilla" + readonly attribute DOMString appName; // constant "Netscape" readonly attribute DOMString appVersion; readonly attribute DOMString platform; - readonly attribute DOMString product; // constant "Gecko" - boolean taintEnabled(); // constant false + [Exposed=Window] readonly attribute DOMString product; // constant "Gecko" + [Exposed=Window] readonly attribute DOMString productSub; readonly attribute DOMString userAgent; + [Exposed=Window] readonly attribute DOMString vendor; + [Exposed=Window] readonly attribute DOMString vendorSub; // constant "" }; [NoInterfaceObject, Exposed=(Window,Worker)] interface NavigatorLanguage { - readonly attribute DOMString? language; - readonly attribute DOMString[] languages; + readonly attribute DOMString language; + readonly attribute FrozenArray languages; }; [NoInterfaceObject] interface NavigatorContentUtils { // content handler registration - void registerProtocolHandler(DOMString scheme, DOMString url, DOMString title); - void registerContentHandler(DOMString mimeType, DOMString url, DOMString title); - DOMString isProtocolHandlerRegistered(DOMString scheme, DOMString url); - DOMString isContentHandlerRegistered(DOMString mimeType, DOMString url); - void unregisterProtocolHandler(DOMString scheme, DOMString url); - void unregisterContentHandler(DOMString mimeType, DOMString url); + void registerProtocolHandler(DOMString scheme, USVString url, DOMString title); + void registerContentHandler(DOMString mimeType, USVString url, DOMString title); + DOMString isProtocolHandlerRegistered(DOMString scheme, USVString url); + DOMString isContentHandlerRegistered(DOMString mimeType, USVString url); + void unregisterProtocolHandler(DOMString scheme, USVString url); + void unregisterContentHandler(DOMString mimeType, USVString url); }; [NoInterfaceObject] -interface NavigatorStorageUtils { +interface NavigatorCookies { readonly attribute boolean cookieEnabled; - void yieldForStorageUpdates(); }; [NoInterfaceObject] interface NavigatorPlugins { - readonly attribute PluginArray plugins; - readonly attribute MimeTypeArray mimeTypes; - readonly attribute boolean javaEnabled; + [SameObject] readonly attribute PluginArray plugins; + [SameObject] readonly attribute MimeTypeArray mimeTypes; + boolean javaEnabled(); }; interface PluginArray { @@ -2581,6 +2570,11 @@

    HTML IDL tests

    getter Plugin? namedItem(DOMString name); }; +[NoInterfaceObject, Exposed=(Window,Worker)] +interface NavigatorConcurrentHardware { + readonly attribute unsigned long long hardwareConcurrency; +}; + interface MimeTypeArray { readonly attribute unsigned long length; getter MimeType? item(unsigned long index); @@ -2730,16 +2724,6 @@

    HTML IDL tests

    }; // MessagePort implements Transferable; -[Constructor, Exposed=(Window,Worker)] -interface PortCollection { - void add(MessagePort port); - void remove(MessagePort port); - void clear(); - void iterate(PortCollectionCallback callback); -}; - -callback PortCollectionCallback = void (MessagePort port); - [Constructor(DOMString channel), Exposed=(Window,Worker)] interface BroadcastChannel : EventTarget { readonly attribute DOMString name; @@ -3181,7 +3165,6 @@

    HTML IDL tests

    RadioNodeList: [], HTMLOptionsCollection: ['document.createElement("select").options'], DOMStringMap: ['document.head.dataset'], - DOMElementMap: ['document.cssElementMap'], Transferable: [], Document: ['iframe.contentDocument', 'new Document()'], XMLDocument: ['document.implementation.createDocument(null, "", null)'], @@ -3238,7 +3221,6 @@

    HTML IDL tests

    AudioTrack: [], VideoTrackList: [], VideoTrack: [], - MediaController: ['new MediaController()'], TextTrackList: ['document.createElement("video").textTracks'], TextTrack: ['document.createElement("track").track'], TextTrackCueList: ['document.createElement("video").addTextTrack("subtitles").cues'], diff --git a/html/dom/reflection.js b/html/dom/reflection.js index b9adb4cfb3c14c..2f31db921859f3 100644 --- a/html/dom/reflection.js +++ b/html/dom/reflection.js @@ -461,6 +461,46 @@ ReflectionTests.typeMap = { "idlTests": [0, 1, maxInt, maxInt + 1, maxUnsigned], "idlDomExpected": [null/*exception*/, 1, maxInt, null, null] }, + /** + * "If a reflecting IDL attribute has an unsigned integer type (unsigned + * long) that is limited to only non-negative numbers greater than zero + * with fallback, then the behaviour is similar to the previous case, but + * disallowed values are converted to the default value. On getting, the + * content attribute must first be parsed according to the rules for + * parsing non-negative integers, and if that is successful, and the value + * is in the range 1 to 2147483647 inclusive, the resulting value must be + * returned. If, on the other hand, it fails or returns an out of range + * value, or if the attribute is absent, the default value must be returned + * instead. On setting, first, if the new value is in the range 1 to + * 2147483647, then let n be the new value, otherwise let n be the default + * value; then, n must be converted to the shortest possible string + * representing the number as a valid non-negative integer and that string + * must be used as the new content attribute value." + */ + "limited unsigned long with fallback": { + "jsType": "number", + "domTests": [minInt - 1, minInt, -36, -1, 0, 1, maxInt, + maxInt + 1, maxUnsigned, maxUnsigned + 1, "", "-1", "-0", "0", "1", + "\u00097", "\u000B7", "\u000C7", "\u00207", "\u00A07", "\uFEFF7", + "\u000A7", "\u000D7", "\u20287", "\u20297", "\u16807", "\u180E7", + "\u20007", "\u20017", "\u20027", "\u20037", "\u20047", "\u20057", + "\u20067", "\u20077", "\u20087", "\u20097", "\u200A7", "\u202F7", + "\u30007", + " " + binaryString + " foo ", undefined, 1.5, true, false, + {"test": 6}, NaN, +Infinity, -Infinity, "\0", + {toString:function() {return 2;}, valueOf: null}, + {valueOf:function() {return 3;}}], + "domExpected": function(val) { + var parsed = ReflectionTests.parseNonneg(String(val)); + // Note maxInt, not maxUnsigned. + if (parsed === false || parsed < 1 || parsed > maxInt) { + return null; + } + return parsed; + }, + "idlTests": [0, 1, maxInt, maxInt + 1, maxUnsigned], + "idlDomExpected": [null, 1, maxInt, null, null] + }, /** * "If a reflecting IDL attribute is a floating point number type (double), * then, on getting, the content attribute must be parsed according to the diff --git a/html/editing/dnd/the-datatransfer-interface/dndTransferCases-manual.html b/html/editing/dnd/the-datatransfer-interface/dndTransferCases-manual.html new file mode 100755 index 00000000000000..84a8c7ea62d413 --- /dev/null +++ b/html/editing/dnd/the-datatransfer-interface/dndTransferCases-manual.html @@ -0,0 +1,44 @@ + + + + + HTML Test: dropzone_attribute_data_item_kind_string + + + + + + + + +
    Select and drag the blue text to rectangular box.
    +
    blue text
    +
    +
    + + + + diff --git a/html/infrastructure/urls/resolving-urls/query-encoding/resources/resolve-url.js b/html/infrastructure/urls/resolving-urls/query-encoding/resources/resolve-url.js index 349e1619fd57b1..b1b78e7f472042 100644 --- a/html/infrastructure/urls/resolving-urls/query-encoding/resources/resolve-url.js +++ b/html/infrastructure/urls/resolving-urls/query-encoding/resources/resolve-url.js @@ -299,7 +299,7 @@ onload = function() { async_test(function() { var elm = document.createElement(tag); var video_ext = ''; - if (elm.canPlayType('video/ogg; codecs="theora,vorbis"')) { + if (elm.canPlayType('video/ogg; codecs="theora,flac"')) { video_ext = 'ogv'; } else if (elm.canPlayType('video/mp4; codecs="avc1.42E01E,mp4a.40.2"')) { video_ext = 'mp4'; diff --git a/html/infrastructure/urls/resolving-urls/query-encoding/utf-16be.html b/html/infrastructure/urls/resolving-urls/query-encoding/utf-16be.html index 80a3970fc1a1c2..06558fe388f08a 100644 Binary files a/html/infrastructure/urls/resolving-urls/query-encoding/utf-16be.html and b/html/infrastructure/urls/resolving-urls/query-encoding/utf-16be.html differ diff --git a/html/infrastructure/urls/resolving-urls/query-encoding/utf-16le.html b/html/infrastructure/urls/resolving-urls/query-encoding/utf-16le.html index 8d91dcbd8e024c..86510b68525af9 100644 Binary files a/html/infrastructure/urls/resolving-urls/query-encoding/utf-16le.html and b/html/infrastructure/urls/resolving-urls/query-encoding/utf-16le.html differ diff --git a/html/semantics/document-metadata/the-base-element/base_href_specified.sub.html b/html/semantics/document-metadata/the-base-element/base_href_specified.sub.html index e66a9caae466cf..83e71387a0b794 100644 --- a/html/semantics/document-metadata/the-base-element/base_href_specified.sub.html +++ b/html/semantics/document-metadata/the-base-element/base_href_specified.sub.html @@ -5,7 +5,8 @@ - + +
    @@ -13,16 +14,20 @@ var testElement; var baseElement; + var otherOrigin = get_host_info().HTTP_REMOTE_ORIGIN; + setup(function() { testElement = document.getElementById("test"); baseElement = document.getElementById("base"); + + baseElement.setAttribute("href", otherOrigin); }); test(function() { - assert_equals(baseElement.href, "http://{{domains[www]}}:{{ports[http][0]}}/", "The href attribute of the base element is incorrect."); + assert_equals(baseElement.href, otherOrigin + "/", "The href attribute of the base element is incorrect."); }, "The href attribute of the base element is specified"); test(function() { - assert_equals(testElement.src, "http://{{domains[www]}}:{{ports[http][0]}}/test.ico", "The src attribute of the img element is incorrect."); + assert_equals(testElement.src, otherOrigin + "/test.ico", "The src attribute of the img element is incorrect."); }, "The src attribute of the img element must relative to the href attribute of the base element"); diff --git a/html/semantics/document-metadata/the-link-element/link-load-event.html b/html/semantics/document-metadata/the-link-element/link-load-event.html index afe86a4210ce6d..6f6172a2d62cf7 100644 --- a/html/semantics/document-metadata/the-link-element/link-load-event.html +++ b/html/semantics/document-metadata/the-link-element/link-load-event.html @@ -10,12 +10,9 @@ document.getElementById('style_test').onload = t.step_func(function() { saw_link_onload = true; }); -window.addEventListener('load', function() { - t.step_func(function() { - assert_true(saw_link_onload); - }); - t.done(); -}, false); +window.addEventListener('load', t.step_func_done(function() { + assert_true(saw_link_onload); +})); diff --git a/html/semantics/document-metadata/the-link-element/link-style-error-01.html b/html/semantics/document-metadata/the-link-element/link-style-error-01.html index 04608460b83ebc..7a86a86381d854 100644 --- a/html/semantics/document-metadata/the-link-element/link-style-error-01.html +++ b/html/semantics/document-metadata/the-link-element/link-style-error-01.html @@ -40,6 +40,7 @@ assert_true(true, "Got error event for 404 error.") tText.done() }) + elt.onload = tText.unreached_func("load event should not be fired"); elt.rel = "stylesheet"; elt.href = "../../../../../common/css-red.txt"; document.getElementsByTagName("head")[0].appendChild(elt); diff --git a/html/semantics/embedded-content/the-canvas-element/security.drawImage.canvas.sub.html b/html/semantics/embedded-content/the-canvas-element/security.drawImage.canvas.sub.html index 301e93ba8b388c..ef0fc8db7ca573 100644 --- a/html/semantics/embedded-content/the-canvas-element/security.drawImage.canvas.sub.html +++ b/html/semantics/embedded-content/the-canvas-element/security.drawImage.canvas.sub.html @@ -3,6 +3,7 @@ Canvas test: security.drawImage.canvas.sub + @@ -31,5 +32,7 @@

    security.drawImage.canvas.sub

    }); - - + + diff --git a/html/semantics/embedded-content/the-canvas-element/security.drawImage.image.sub.html b/html/semantics/embedded-content/the-canvas-element/security.drawImage.image.sub.html index e15eaa4e2cebf9..55e2f2b8c6f7bd 100644 --- a/html/semantics/embedded-content/the-canvas-element/security.drawImage.image.sub.html +++ b/html/semantics/embedded-content/the-canvas-element/security.drawImage.image.sub.html @@ -3,6 +3,7 @@ Canvas test: security.drawImage.image.sub + @@ -26,5 +27,7 @@

    security.drawImage.image.sub

    }); - - + + diff --git a/html/semantics/embedded-content/the-canvas-element/security.pattern.canvas.fillStyle.sub.html b/html/semantics/embedded-content/the-canvas-element/security.pattern.canvas.fillStyle.sub.html index 0a48d9694c7b29..87a528eb14a2ed 100644 --- a/html/semantics/embedded-content/the-canvas-element/security.pattern.canvas.fillStyle.sub.html +++ b/html/semantics/embedded-content/the-canvas-element/security.pattern.canvas.fillStyle.sub.html @@ -3,6 +3,7 @@ Canvas test: security.pattern.canvas.fillStyle.sub + @@ -33,5 +34,7 @@

    security.pattern.canvas.fillStyle.sub

    }); - - + + diff --git a/html/semantics/embedded-content/the-canvas-element/security.pattern.canvas.strokeStyle.sub.html b/html/semantics/embedded-content/the-canvas-element/security.pattern.canvas.strokeStyle.sub.html index a65e0621a49b01..26b1e1ed1bc88b 100644 --- a/html/semantics/embedded-content/the-canvas-element/security.pattern.canvas.strokeStyle.sub.html +++ b/html/semantics/embedded-content/the-canvas-element/security.pattern.canvas.strokeStyle.sub.html @@ -3,6 +3,7 @@ Canvas test: security.pattern.canvas.strokeStyle.sub + @@ -33,5 +34,7 @@

    security.pattern.canvas.strokeStyle.sub

    }); - - + + diff --git a/html/semantics/embedded-content/the-canvas-element/security.pattern.canvas.timing.sub.html b/html/semantics/embedded-content/the-canvas-element/security.pattern.canvas.timing.sub.html index 5f20edc857f866..b6c5458d99f7dd 100644 --- a/html/semantics/embedded-content/the-canvas-element/security.pattern.canvas.timing.sub.html +++ b/html/semantics/embedded-content/the-canvas-element/security.pattern.canvas.timing.sub.html @@ -3,6 +3,7 @@ Canvas test: security.pattern.canvas.timing.sub + @@ -36,5 +37,7 @@

    security.pattern.canvas.timing.sub

    }); - - + + diff --git a/html/semantics/embedded-content/the-canvas-element/security.pattern.create.sub.html b/html/semantics/embedded-content/the-canvas-element/security.pattern.create.sub.html index 41ed250eb5b670..ffd6295feb5fcc 100644 --- a/html/semantics/embedded-content/the-canvas-element/security.pattern.create.sub.html +++ b/html/semantics/embedded-content/the-canvas-element/security.pattern.create.sub.html @@ -3,6 +3,7 @@ Canvas test: security.pattern.create.sub + @@ -27,5 +28,7 @@

    security.pattern.create.sub

    }); - - + + diff --git a/html/semantics/embedded-content/the-canvas-element/security.pattern.cross.sub.html b/html/semantics/embedded-content/the-canvas-element/security.pattern.cross.sub.html index 83ac1c71b6bb73..c4f76717df152e 100644 --- a/html/semantics/embedded-content/the-canvas-element/security.pattern.cross.sub.html +++ b/html/semantics/embedded-content/the-canvas-element/security.pattern.cross.sub.html @@ -3,6 +3,7 @@ Canvas test: security.pattern.cross.sub + @@ -34,5 +35,7 @@

    security.pattern.cross.sub

    }); - - + + diff --git a/html/semantics/embedded-content/the-canvas-element/security.pattern.image.fillStyle.sub.html b/html/semantics/embedded-content/the-canvas-element/security.pattern.image.fillStyle.sub.html index ba0904ec1d4eae..66f06cdef9e041 100644 --- a/html/semantics/embedded-content/the-canvas-element/security.pattern.image.fillStyle.sub.html +++ b/html/semantics/embedded-content/the-canvas-element/security.pattern.image.fillStyle.sub.html @@ -3,6 +3,7 @@ Canvas test: security.pattern.image.fillStyle.sub + @@ -28,5 +29,7 @@

    security.pattern.image.fillStyle.sub

    }); - - + + diff --git a/html/semantics/embedded-content/the-canvas-element/security.pattern.image.strokeStyle.sub.html b/html/semantics/embedded-content/the-canvas-element/security.pattern.image.strokeStyle.sub.html index d7f32a9484b66e..eda7b4e4b7fb07 100644 --- a/html/semantics/embedded-content/the-canvas-element/security.pattern.image.strokeStyle.sub.html +++ b/html/semantics/embedded-content/the-canvas-element/security.pattern.image.strokeStyle.sub.html @@ -3,6 +3,7 @@ Canvas test: security.pattern.image.strokeStyle.sub + @@ -28,5 +29,7 @@

    security.pattern.image.strokeStyle.sub

    }); - - + + diff --git a/html/semantics/embedded-content/the-canvas-element/security.reset.sub.html b/html/semantics/embedded-content/the-canvas-element/security.reset.sub.html index 28693490ad3d04..e63144983a92fb 100644 --- a/html/semantics/embedded-content/the-canvas-element/security.reset.sub.html +++ b/html/semantics/embedded-content/the-canvas-element/security.reset.sub.html @@ -3,6 +3,7 @@ Canvas test: security.reset.sub + @@ -28,5 +29,7 @@

    security.reset.sub

    }); - - + + diff --git a/html/semantics/embedded-content/the-iframe-element/iframe-allowfullscreen.html b/html/semantics/embedded-content/the-iframe-element/iframe-allowfullscreen.html index 9071a0b89e59f9..da5791a2de9b23 100644 --- a/html/semantics/embedded-content/the-iframe-element/iframe-allowfullscreen.html +++ b/html/semantics/embedded-content/the-iframe-element/iframe-allowfullscreen.html @@ -10,9 +10,8 @@
    + + +

    foobar

    + +
    + +

    foobar

    + +
    + diff --git a/html/semantics/interfaces.html b/html/semantics/interfaces.html index c8a9bed85a103f..359101dd9496c3 100644 --- a/html/semantics/interfaces.html +++ b/html/semantics/interfaces.html @@ -1,4 +1,5 @@ + Test of interfaces diff --git a/html/semantics/interfaces.js b/html/semantics/interfaces.js index 66cfce4859b45d..0280e278c9ad27 100644 --- a/html/semantics/interfaces.js +++ b/html/semantics/interfaces.js @@ -146,5 +146,5 @@ var elements = [ ["video", "Video"], ["wbr", ""], ["xmp", "Pre"], - ["å-bar", "Unknown"], // not a valid custom element name + ["\u00E5-bar", "Unknown"], // not a valid custom element name ]; diff --git a/html/semantics/scripting-1/the-script-element/script-charset-03.html b/html/semantics/scripting-1/the-script-element/script-charset-03.html new file mode 100644 index 00000000000000..4ff4cc6b0bae71 --- /dev/null +++ b/html/semantics/scripting-1/the-script-element/script-charset-03.html @@ -0,0 +1,20 @@ + + + +Script changing @charset + + + +
    + diff --git a/html/semantics/selectors/pseudo-classes/valid-invalid.html b/html/semantics/selectors/pseudo-classes/valid-invalid.html index 034b6ff31f9cdd..d93407707f07e9 100644 --- a/html/semantics/selectors/pseudo-classes/valid-invalid.html +++ b/html/semantics/selectors/pseudo-classes/valid-invalid.html @@ -1,4 +1,6 @@ + + Selector: pseudo-classes (:valid, :invalid) @@ -6,6 +8,13 @@ + + +
    @@ -35,7 +44,27 @@
    - +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + + diff --git a/html/semantics/tabular-data/the-table-element/caption-methods.html b/html/semantics/tabular-data/the-table-element/caption-methods.html index 79546eb594637b..35ee9f44530338 100644 --- a/html/semantics/tabular-data/the-table-element/caption-methods.html +++ b/html/semantics/tabular-data/the-table-element/caption-methods.html @@ -36,6 +36,8 @@ + + diff --git a/html/semantics/tabular-data/the-table-element/remove-row.html b/html/semantics/tabular-data/the-table-element/remove-row.html new file mode 100644 index 00000000000000..b0e529f91ec8b2 --- /dev/null +++ b/html/semantics/tabular-data/the-table-element/remove-row.html @@ -0,0 +1,50 @@ + + +Delete Row tests + + + + + + + + + + + + + + + + + + +
    First columnSecond column
    1.11.2
    2.12.2
    + + diff --git a/html/semantics/tabular-data/the-table-element/tFoot.html b/html/semantics/tabular-data/the-table-element/tFoot.html index 52c6972fefd01c..d06e16f2005e2b 100644 --- a/html/semantics/tabular-data/the-table-element/tFoot.html +++ b/html/semantics/tabular-data/the-table-element/tFoot.html @@ -37,6 +37,15 @@ assert_equals(t.tFoot.previousSibling, tbody2); assert_equals(t.tFoot.nextSibling, null); + t.deleteTFoot(); + assert_equals(t.tFoot, null); + + t.tFoot = tfoot; + assert_equals(t.tFoot, tfoot); + + assert_equals(t.tFoot.previousSibling, tbody2); + assert_equals(t.tFoot.nextSibling, null); + assert_throws(new TypeError(), function(){ t.tFoot = document.createElement("div"); }); diff --git a/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-support.htm b/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-support.htm index 6d1922971a7607..8460f5ff18bfe6 100644 --- a/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-support.htm +++ b/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-support.htm @@ -9,9 +9,16 @@ var parser = new DOMParser(); var parse = parser.parseFromString.bind(parser); - function generateTestFunction(entitystring, expectedString, doctypeMarkupString, mimeType, friendlyMime) { + function generateTestFunction(entitystring, expectedString, publicId, systemId, mimeType, friendlyMime) { return function () { - var doc = parse(doctypeMarkupString + ""+entitystring+"", mimeType); + var doctypeString = ''; + else if (systemId != null) + doctypeString += ' SYSTEM "' + systemId + '">'; + else // both are null + doctypeString += '>'; + var doc = parse(doctypeString + ""+entitystring+"", mimeType); var root = doc.getElementById('test'); assert_not_equals(root, null, friendlyMime + " parsing the entity reference caused a parse error;"); assert_true(!!root.firstChild); @@ -24,10 +31,10 @@ } } - function setupTests(jsonEntities, doctypeMarkupString, mimeType, friendlyMime) { + function setupTests(jsonEntities, publicId, systemId, mimeType, friendlyMime) { for (entityName in jsonEntities) { if ((mimeType == "text/html") || /;$/.test(entityName)) { - test(generateTestFunction(entityName, jsonEntities[entityName].characters, doctypeMarkupString, mimeType, friendlyMime), friendlyMime + " parsing " + entityName); + test(generateTestFunction(entityName, jsonEntities[entityName].characters, publicId, systemId, mimeType, friendlyMime), friendlyMime + " parsing " + entityName); } } } @@ -37,22 +44,21 @@ var xhr = new XMLHttpRequest(); xhr.open("GET", "/common/entities.json"); xhr.onload = function () { - // Note: for proper XML parsing of the Doctype, Edge requires a non-empty string for url part var entitiesJSON = JSON.parse(xhr.response); [ - ["application/xhtml+xml", "", "XHTML1.0 Transitional"], - ["application/xhtml+xml", "", "XHTML1.1"], - ["application/xhtml+xml", "", "XHTML1.0 Strict"], - ["application/xhtml+xml", "", "XHTML1.0 Frameset"], - ["application/xhtml+xml", "", "XHTML Basic"], - ["application/xhtml+xml", "", "XHTML1.1+MathML"], - ["application/xhtml+xml", "", "XHTML1.1+MathML+SVG"], - ["application/xhtml+xml", "", "MathML"], - ["application/xhtml+xml", "", "XHTML Mobile"], -// ["application/xhtml+xml", "", "SYSTEM MathML"], // Experimental - ["text/html", "", "HTML"] + ["application/xhtml+xml", "-//W3C//DTD XHTML 1.0 Transitional//EN", "foo", "XHTML1.0 Transitional"], + ["application/xhtml+xml", "-//W3C//DTD XHTML 1.1//EN", "foo", "XHTML1.1"], + ["application/xhtml+xml", "-//W3C//DTD XHTML 1.0 Strict//EN", "foo", "XHTML1.0 Strict"], + ["application/xhtml+xml", "-//W3C//DTD XHTML 1.0 Frameset//EN", "foo", "XHTML1.0 Frameset"], + ["application/xhtml+xml", "-//W3C//DTD XHTML Basic 1.0//EN", "foo", "XHTML Basic"], + ["application/xhtml+xml", "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN", "foo", "XHTML1.1+MathML"], + ["application/xhtml+xml", "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN", "foo", "XHTML1.1+MathML+SVG"], + ["application/xhtml+xml", "-//W3C//DTD MathML 2.0//EN", "foo", "MathML"], + ["application/xhtml+xml", "-//WAPFORUM//DTD XHTML Mobile 1.0//EN", "foo", "XHTML Mobile"], +// ["application/xhtml+xml", null, "mathml.dtd", "SYSTEM MathML"], // Experimental + ["text/html", null, null, "HTML"] ].forEach(function (row) { - setupTests(entitiesJSON, row[1], row[0], row[2]); + setupTests(entitiesJSON, row[1], row[2], row[0], row[3]); }); done(); } diff --git a/html/tools/update_html5lib_tests.py b/html/tools/update_html5lib_tests.py index ae08e82d3e41df..2235ddffd1b526 100644 --- a/html/tools/update_html5lib_tests.py +++ b/html/tools/update_html5lib_tests.py @@ -100,7 +100,7 @@ def write_test_file(script_dir, out_dir, tests, file_name, template_file_name): file_name = os.path.join(out_dir, file_name + ".html") short_name = os.path.split(file_name)[1] - with open(os.path.join(script_dir, template_file_name)) as f: + with open(os.path.join(script_dir, template_file_name), "r") as f: template = MarkupTemplate(f) stream = template.generate(file_name=short_name, tests=tests) diff --git a/html/webappapis/scripting/event-loops/microtask_after_raf.html b/html/webappapis/scripting/event-loops/microtask_after_raf.html new file mode 100644 index 00000000000000..824dbc4b92e333 --- /dev/null +++ b/html/webappapis/scripting/event-loops/microtask_after_raf.html @@ -0,0 +1,57 @@ + + + + + + + + + + + diff --git a/html/webappapis/scripting/event-loops/microtask_after_script.html b/html/webappapis/scripting/event-loops/microtask_after_script.html new file mode 100644 index 00000000000000..799a0de605fb7a --- /dev/null +++ b/html/webappapis/scripting/event-loops/microtask_after_script.html @@ -0,0 +1,55 @@ + + + + + + + + + + + diff --git a/innerText/getter-tests.js b/innerText/getter-tests.js index cc74890882e339..d4511410b467a8 100644 --- a/innerText/getter-tests.js +++ b/innerText/getter-tests.js @@ -83,7 +83,6 @@ if (CSS.supports("display", "contents")) { testText("
    abc", "abc", "display:contents container"); testText("
    abc", "abc", "display:contents container"); testText("
    123abc", "123abc", "display:contents rendered"); - testText("
    123abc", "123abc", "display:contents rendered"); testText("
    ", "", "display:contents not processed via textContent"); testText("
    ", "", "display:contents not processed via textContent"); } @@ -127,10 +126,10 @@ testText("
    abc", "abc", "
    contents preserved"); testText("
    abc", "abc", "
    contents preserved"); testText("", "", " contents ignored"); testText("