| <!DOCTYPE html> |
| <head> |
| <script src="../../resources/js-test-pre.js"></script> |
| </head> |
| <body> |
| <script> |
| if (window.internals) |
| internals.clearMemoryCache(); |
| |
| var fontFace1 = new FontFace("family1", "url('asdf')", {}); |
| var fontFace2 = new FontFace("family2", "url('asdf')", {}); |
| var fontFace3 = new FontFace("family3", "url('../../resources/Ahem.ttf')", {}); |
| var fontFace4 = new FontFace("family3", "url('../../resources/Ahem.ttf')", {'weight': 'bold'}); |
| var fontFace5 = new FontFace("family5", "url('../../resources/Ahem.otf')", {}); |
| |
| shouldThrow("new FontFaceSet()"); |
| shouldBe("new FontFaceSet([]).size", "0"); |
| shouldBe("new FontFaceSet([fontFace1]).size", "1"); |
| shouldThrowErrorName("new FontFaceSet(1)", "TypeError"); |
| shouldThrowErrorName("new FontFaceSet('hello')", "TypeError"); |
| shouldBe("new FontFaceSet(new Set([fontFace1])).size", "1"); |
| shouldBe("x = { [Symbol.iterator]: function*() { yield fontFace1; yield fontFace2; } }; new FontFaceSet(x).size", "2"); |
| shouldThrowErrorName("x = { [Symbol.iterator]: 1 }; new FontFaceSet(x)", "TypeError"); |
| shouldThrowErrorName("x = { [Symbol.iterator]: null }; new FontFaceSet(x)", "TypeError"); |
| shouldThrowErrorName("x = { [Symbol.iterator]: function*() { yield fontFace1; throw {name: 'SomeError', toString: () => 'Some error'}; } }; new FontFaceSet(x)", "SomeError"); |
| |
| var fontFaceSet = new FontFaceSet([]); |
| shouldBeEqualToString("fontFaceSet.status", "loaded"); |
| fontFaceSet.add(fontFace1); |
| |
| // FIXME: FontFaceSet should use setlike<FontFace>, not iterable<FontFace> and should not have an entries() method. |
| var iterator = fontFaceSet.entries(); |
| var item = iterator.next(); |
| shouldBeFalse("item.done"); |
| shouldBe("item.value", "fontFace1"); |
| item = iterator.next(); |
| shouldBeTrue("item.done"); |
| shouldBe("item.value", "undefined"); |
| |
| iterator = fontFaceSet.keys(); |
| item = iterator.next(); |
| shouldBeFalse("item.done"); |
| shouldBe("item.value", "fontFace1"); |
| item = iterator.next(); |
| shouldBeTrue("item.done"); |
| |
| iterator = fontFaceSet.values(); |
| item = iterator.next(); |
| shouldBeFalse("item.done"); |
| shouldBe("item.value", "fontFace1"); |
| item = iterator.next(); |
| shouldBeTrue("item.done"); |
| |
| var value1, value2, set; |
| fontFaceSet.forEach(function(v1, v2, s){ |
| value1 = v1; |
| value2 = v2; |
| set = s; |
| shouldBe("fontFaceSet", "set"); |
| shouldBe("value1", "value2"); |
| }); |
| |
| shouldBe("fontFaceSet.add(fontFace2)", "fontFaceSet"); |
| shouldBe("fontFaceSet.size", "2"); |
| |
| shouldThrow("fontFaceSet.add(null)"); |
| |
| iterator = fontFaceSet.keys(); |
| item = iterator.next(); |
| shouldBeFalse("item.done"); |
| shouldBe("item.value", "fontFace1"); |
| item = iterator.next(); |
| shouldBeFalse("item.done"); |
| shouldBe("item.value", "fontFace2"); |
| item = iterator.next(); |
| shouldBeTrue("item.done"); |
| |
| shouldBe("fontFaceSet.delete(fontFace1)", "true"); |
| shouldBe("fontFaceSet.delete(fontFace3)", "false"); |
| |
| shouldThrow("fontFaceSet.delete(null)"); |
| |
| shouldBeFalse("fontFaceSet.has(fontFace1)"); |
| shouldBeTrue("fontFaceSet.has(fontFace2)"); |
| shouldThrow("fontFaceSet.has(null)"); |
| |
| fontFaceSet.clear(); |
| |
| shouldBe("fontFaceSet.size", "0"); |
| shouldBeTrue("fontFaceSet.values().next().done"); |
| shouldThrow("fontFaceSet.check('garbage')"); |
| shouldBeTrue("fontFaceSet.check('16px garbage')"); |
| |
| self.jsTestIsAsync = true; |
| fontFaceSet.add(fontFace1); |
| shouldBeFalse("fontFaceSet.check('16px family1')"); |
| var item; |
| fontFaceSet.load("garbage").then(function(arg) { |
| testFailed("Should not be able to parse garbage"); |
| finishJSTest(); |
| }, function(arg) { |
| item = arg; |
| shouldBe("item.code", "item.SYNTAX_ERR"); |
| shouldBeFalse("fontFaceSet.check('16px family1')"); |
| return fontFaceSet.load("16px garbage"); |
| }).then(function(arg) { |
| item = arg; |
| shouldBe("item", "[]"); |
| return fontFaceSet.load("16px family1"); |
| }, function(arg) { |
| testFailed("Should not be able to parse garbage"); |
| finishJSTest(); |
| }).then(function(arg) { |
| testFailed("Bogus URL should not load"); |
| finishJSTest(); |
| }, function(arg) { |
| item = arg; |
| shouldBe("item.code", "item.NETWORK_ERR"); |
| fontFaceSet.add(fontFace3); |
| shouldBeFalse("fontFaceSet.check('16px family3')"); |
| var result = fontFaceSet.load("16px family3"); |
| shouldBeEqualToString("fontFaceSet.status", "loading"); |
| return result; |
| }).then(function(arg) { |
| item = arg; |
| shouldBe("item", "[fontFace3]"); |
| shouldBeTrue("fontFaceSet.check('16px family3')"); |
| shouldBeEqualToString("fontFaceSet.status", "loaded"); |
| var result = fontFaceSet.load("16px family3"); // Test when it's in the cache. |
| shouldBeEqualToString("fontFaceSet.status", "loaded"); |
| return result; |
| }, function(arg) { |
| testFailed("Real URL should load"); |
| finishJSTest(); |
| }).then(function(arg) { |
| item = arg; |
| shouldBe("item", "[fontFace3]"); |
| fontFaceSet.add(fontFace4); |
| return fontFaceSet.load("16px family3"); |
| }, function(arg) { |
| testFailed("Real URL should load"); |
| finishJSTest(); |
| }).then(function(arg) { |
| item = arg; |
| shouldBe("item", "[fontFace3]"); |
| fontFaceSet.add(fontFace4); |
| fontFaceSet.load("16px family3"); |
| return fontFaceSet.ready; |
| }, function(arg) { |
| testFailed("Multiple matching faces should load"); |
| finishJSTest(); |
| }).then(function(arg) { |
| item = arg; |
| shouldBe("item", "fontFaceSet"); |
| fontFaceSet.add(fontFace5); |
| shouldBeEqualToString("fontFaceSet.status", "loaded"); |
| fontFaceSet.load("16px family5"); |
| shouldBeEqualToString("fontFaceSet.status", "loading"); |
| return fontFaceSet.ready; |
| }, function(arg) { |
| testFailed("Ready attribute should never fail"); |
| finishJSTest(); |
| }).then(function(arg) { |
| item = arg; |
| shouldBe("item", "fontFaceSet"); |
| }, function(arg) { |
| testFailed("Ready attribute should never fail"); |
| }).then(function() { |
| return Object.getOwnPropertyDescriptor(Object.getPrototypeOf(fontFaceSet), 'ready').get.apply(fontFace5); |
| }).then(function(arg) { |
| testFailed("Ready attribute should be rejected when used with an object which is not FontFaceSet"); |
| finishJSTest(); |
| }, function(arg) { |
| testPassed("" + arg); |
| finishJSTest(); |
| }); |
| shouldBeEqualToString("fontFaceSet.status", "loaded"); |
| </script> |
| <script src="../../resources/js-test-post.js"></script> |
| </body> |
| </html> |