<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>
<script>
shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {}).family", "family_name");
shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {}).style", "normal");
shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {}).weight", "normal");
shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {}).stretch", "normal");
shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {}).unicodeRange", "U+0-10ffff");
shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {}).featureSettings", "normal");

shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {'style': 'normal'}).style", "normal");
shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {'style': 'inherit'}).status","error");
shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {'style': 'italic'}).style", "italic");
shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {'style': 'oblique'}).style", "oblique");
shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {'style': 'asdf'}).status", "error");
shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {'weight': 'normal'}).weight", "normal");
shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {'weight': '200'}).weight", "200");
shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {'weight': 'bold'}).weight", "bold");
shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {'weight': 'bolder'}).status", "error");
shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {'weight': 'lighter'}).status", "error");
shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {'weight': 'inherit'}).status", "error");
shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {'stretch': 'ultra-expanded'}).stretch", "ultra-expanded");
shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {'unicodeRange': 'U+26'}).unicodeRange", "U+26");
shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {'unicodeRange': 'U+0-7F'}).unicodeRange", "U+0-7f");
shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {'featureSettings': '\\'titl\\''}).featureSettings", "\"titl\"");

var everything = new FontFace('family_name', 'url(\'asdf\')', {'style': 'italic', 'weight': 'bold', 'stretch': 'extra-expanded', 'unicodeRange': 'U+26', 'featureSettings': '\'titl\''});
shouldBeEqualToString("everything.style", "italic");
shouldBeEqualToString("everything.weight", "bold");
shouldBeEqualToString("everything.stretch", "extra-expanded");
shouldBeEqualToString("everything.unicodeRange", "U+26");
shouldBeEqualToString("everything.featureSettings", "\"titl\"");

everything.family = "other_family_name";
shouldBeEqualToString("everything.family", "other_family_name");
everything.style = "normal";
shouldBeEqualToString("everything.style", "normal");
everything.weight = "300";
shouldBeEqualToString("everything.weight", "300");
everything.stretch = "condensed";
shouldBeEqualToString("everything.stretch", "condensed");
everything.unicodeRange = "U+0-7F";
shouldBeEqualToString("everything.unicodeRange", "U+0-7f");
everything.featureSettings = "'smcp'";
shouldBeEqualToString("everything.featureSettings", "\"smcp\"");

shouldNotThrow("new FontFace('family_name', 'url(\\'asdf\\')', {})");
var newArrayBuffer = new ArrayBuffer(100);
shouldNotThrow("new FontFace('family_name', newArrayBuffer, {})");
shouldNotThrow("new FontFace('family_name', new DataView(newArrayBuffer), {})");
shouldNotThrow("new FontFace('family_name', new Uint8Array(newArrayBuffer), {})");
shouldBeEqualToString("new FontFace('family_name', 5, {}).status", "error");
shouldBeEqualToString("new FontFace('family_name', {}, {}).status", "error");
shouldBeEqualToString("new FontFace('family_name', new Array(), {}).status", "error");
shouldBeEqualToString("new FontFace('family_name', { toString: function() { return 5; } }, {}).status", "error");
shouldThrow("new FontFace('family_name', { toString: function() { throw \"Error\"; } }, {})");
shouldBeEqualToString("new FontFace('family_name', { toString: function() { return \"url(\'asdf\')\"; } }, {}).family", "family_name");

shouldBeEqualToString("new FontFace('family_name', 'url(\\'asdf\\')', {}).status", "unloaded");

var promiseEqualityCheck = new FontFace('family_name', 'url(\'asdf\')', {});
var promise1 = promiseEqualityCheck.loaded;
var promise2 = promiseEqualityCheck.loaded;
var promise3 = promiseEqualityCheck.load();
var promise4 = promiseEqualityCheck.loaded;
var promise5 = promiseEqualityCheck.load();
shouldBe("promise1", "promise2");
shouldBe("promise1", "promise3");
shouldBe("promise1", "promise4");
shouldBe("promise1", "promise5");
shouldBeEqualToString("promiseEqualityCheck.status", "loading");

var oldFontFace;
var newFontFace;
self.jsTestIsAsync = true;
promiseEqualityCheck.loaded.then(function(x) {
    testFailed("Bogus URL should not load");
    finishJSTest();
}, function(y) {
    oldFontFace = y;
    shouldBe("oldFontFace.code", "oldFontFace.NETWORK_ERR");
    shouldBeEqualToString("promiseEqualityCheck.status", "error");
    oldFontFace = new FontFace('family_name', 'url(\'../../resources/Ahem.ttf\')', {});
    return oldFontFace.load();
}).then(function(x) {
    newFontFace = x;
    shouldBe("newFontFace", "oldFontFace");
    shouldBeEqualToString("newFontFace.status", "loaded");
    // Test behavior when the font is in the cache.
    oldFontFace = new FontFace('family_name', 'url(\'../../resources/Ahem.ttf\')', {});
    return oldFontFace.load();
}, function(y) {
    testFailed("Legit URL should load");
    finishJSTest();
}).then(function(x) {
    newFontFace = x;
    shouldBe("newFontFace", "oldFontFace");
    shouldBeEqualToString("newFontFace.status", "loaded");
    return (new FontFace('family_name2', 'url(\'../../resources/Ahem.ttf\') format(\'garbage\')', {})).load()
}, function(y) {
    testFailed("Legit URL should load");
    finishJSTest();
}).then(function() {
    testFailed("Unknown format should not load successfully.");
    finishJSTest();
}, function(y) {
    oldFontFace = y;
    shouldBe("oldFontFace.code", "oldFontFace.NETWORK_ERR");
    finishJSTest();
});

</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
