<!DOCTYPE html>
<html>
<head>
    <style>
        .small-box {
            width: 100px;
            height: 100px;
        }
        .large-box {
            width: 200px;
            height: 200px;
        }
    </style>
</head>
<body>
    <img class="small-box non-intrinsic">
    <img class="large-box non-intrinsic">
    <canvas class="small-box non-intrinsic"></canvas>
    <br>
    <img class="small-box intrinsic">
    <img class="large-box intrinsic">
    <canvas class="small-box intrinsic"></canvas>
    <script>
        window.Test = {
            _imageData: [
                {
                    url: "data:image/svg+xml;utf8, \
                        <svg version='1.1' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1000 1000'> \
                            <rect width='100%' height='100%' fill='green'/> \
                        </svg>",
                    selector: "non-intrinsic",
                    image: null
                },
                {
                    url: "data:image/svg+xml;utf8, \
                        <svg version='1.1' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1000 1000' width='100' height='100'> \
                        <rect width='100%' height='100%' fill='green'/> \
                        </svg>",
                    selector: "intrinsic",
                    image: null
                }
            ],
          
            _loadImage: function(imageDatum) {
                var image = new Image();
            
                image.onload = function() {
                    imageDatum.image = image;
                };
                image.src = imageDatum.url;
                
                var elements = document.querySelectorAll("img." + imageDatum.selector);
                for (var i = 0; i <	elements.length; i++)
                    elements[i].src = imageDatum.url;
            },
            
            _loadImages: function() {
                var self = this;                
                this._imageData.forEach(function(imageDatum) {
                    self._loadImage(imageDatum);
                });
            },

            _darwImage: function(imageDatum) {
                var canvas = document.querySelector("canvas." + imageDatum.selector);
                var ctx = canvas.getContext("2d");
                ctx.drawImage(imageDatum.image, 0, 0, canvas.width, canvas.height);
            },

            _areImagesLoaded : function() {
                var loaded = true;
                this._imageData.forEach(function(imageDatum) {
                    loaded &= imageDatum.image != null;
                });
                console.log(loaded);
                return loaded;
            },
        
            _darwImages: function() {
                if (!this._areImagesLoaded())
                    return;

                var self = this;
                this._imageData.forEach(function(imageDatum) {
                    self._darwImage(imageDatum);
                });
                
                clearInterval(this._intervalId);
                
                if (window.testRunner)
                  testRunner.notifyDone();
            },
        
            run: function() {
                if (window.testRunner)
                    testRunner.waitUntilDone();
                this._loadImages();
                this._intervalId = setInterval(this._darwImages.bind(this), 10);
            }
        };
        window.Test.run();
    </script>
</body>
</html>
