// Helper to access the element, its associated loading promise, and also to // resolve the promise. class ElementLoadPromise { constructor(element_id) { this.element_id = element_id; this.promise = new Promise((resolve, reject) => { this.resolve = resolve this.reject = reject }); } element() { return document.getElementById(this.element_id); } } // Returns if the image is complete and the lazily loaded image matches the expected image. function is_image_fully_loaded(image, expected_image) { if (!image.complete || !expected_image.complete) { return false; } if (image.width != expected_image.width || image.height != expected_image.height) { return false; } let canvas = document.createElement('canvas'); canvas.width = image.width; canvas.height = image.height; let canvasContext = canvas.getContext("2d"); canvasContext.save(); canvasContext.drawImage(image, 0, 0); let data = canvasContext.getImageData(0, 0, canvas.width, canvas.height).data; canvasContext.restore(); canvasContext.drawImage(expected_image, 0, 0); let expected_data = canvasContext.getImageData(0, 0, canvas.width, canvas.height).data; for (var i = 0; i < data.length; i++) { if (data[i] != expected_data[i]) { return false; } } return true; }