<html>
<head>
<script>
if (window.testRunner) {
    testRunner.dumpDOMAsWebArchive();
    testRunner.waitUntilDone();
}

function notifyDone()
{
    if (window.testRunner) {
        // FIXME: Web fonts are loaded asynchronously, and there is
        // no way to know when they're done, so just wait a bit.
        setTimeout("testRunner.notifyDone()", 1000);
    }
}
</script>
<style>
@font-face {
    font-family: webkit-ahem;
    font-style: normal;
    src: url(firstInvalidURL), url(secondInvalidURL), url(../resources/Ahem.ttf);
}
</style>
</head>
<body onload="notifyDone()">
<div><p>This page tests that url() resources referenced in CSS stylesheets are saved in webarchives.</p></div>
<div style="border: solid black 1px; height: 64px; background: url(resources/apple.gif?background) no-repeat top left;">This element should have one Apple logo in the background at the top left.</div>
<div style="border: solid black 1px; height: 125px; background-image: url(resources/apple.gif?background-image);">This element should have repeated Apple logos in both x- and y-dimensions in the background.</div>
<div style="border: solid black 1px; height: 64px;"><img style="content: url(resources/apple.gif?content);">This element should contain an img element that draws an Apple logo.</div>
<div style="border: solid black 1px; height: 100px; cursor: url(resources/apple.gif?cursor), auto;">The cursor should change to an Apple logo inside this element.</div>
<div style="border: solid black 1px; height: 25px;">This element contains "Ahem" written in the Ahem font: <span style="font-family: webkit-ahem;">Ahem</span></div>
<div style="border: solid black 1px; list-style: square inside url(resources/apple.gif?list-style-image);">
<ul>
  <li>These items</li>
  <li>should have</li>
  <li>Apple logos</li>
  <li>as bullets.</li>
</ul>
</div>
<div style="border: solid black 1px; display: inline-block; height: 100px; width: 200px; border-color: transparent; border-style: solid; -webkit-box-sizing: border-box; -webkit-border-fit: lines; border-width: 20px 15px 10px 15px; -webkit-border-image: url(resources/apple.gif?webkit-border-image) 20 15 10 15;">This content should be inside a strectched Apple logo.</div>
<div style="border: solid black 1px; height: 130px; background-color: white;"><img src="resources/apple.gif?webkit-box-reflect-image" style="-webkit-box-reflect: below 2px url(resources/apple.gif?webkit-box-reflect) 75 75 75 75 stretch stretch;">This element should have an image of an Apple logo with a full reflection below it.</div>
<div style="border: solid black 1px; background-color: pink; height: 100px; -webkit-mask: url(resources/apple.gif?mask) repeat scroll center top;"><br>This element should have solid pink Apple logos as its mask.</div>
<div style="border: solid black 1px; height: 125px; padding: 50px; color: white; background-color: maroon; -webkit-mask-box-image: url(resources/apple.gif?mask-box-image) 75 75 75 75;"><br>This element should have maroon Apple logos for "borders" with a maroon background.</div>
<div style="border: solid black 1px; height: 100px; margin: 6px; border: 1px dotted green; color: white; background-color: black; -webkit-mask-image: url(resources/apple.gif?mask-image); -webkit-mask-origin: padding; -webkit-mask-size: 25px 25px;">This element should have black Apple logos for its background.</div>
<div style="border: solid black 1px; height: 140px; border: 10px solid black; background-color: lime; -webkit-mask-image: url(resources/apple.gif?mask-top-left), url(resources/apple.gif?mask-top-right), url(resources/apple.gif?mask-bottom-left), url(resources/apple.gif?mask-bottom-right), url(resources/apple.gif?mask-top), url(resources/apple.gif?mask-right), url(resources/apple.gif?mask-bottom), url(resources/apple.gif?mask-left), url(resources/apple.gif?mask-center); -webkit-mask-position: top left, top right, bottom left, bottom right, top center, center right, bottom center, center left, center; -webkit-mask-origin: border; -webkit-mask-repeat: no-repeat, no-repeat, no-repeat, no-repeat, repeat-x, repeat-y, repeat-x, repeat-y, repeat; -webkit-mask-composite: copy;"><br>This element should have lime Apple logos for its background and borders with a black outer border.</div>
<div></div>
</body>
</html>
