if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(item) { for (var i = 0; i < this.length; i++) { if (this[i] === item) return i } return -1 } } if (!Array.prototype.map) { Array.prototype.map = function(callback) { var results = [] for (var i = 0; i < this.length; i++) { results[i] = callback(this[i], i, this) } return results } } if (!Array.prototype.filter) { Array.prototype.filter = function(callback) { var results = [] for (var i = 0; i < this.length; i++) { if (callback(this[i], i, this)) results.push(this[i]) } return results } } if (!Object.keys) { Object.keys = function() { var keys = [] for (var i in this) keys.push(i) return keys } } var mock = {} mock.window = (function() { var window = {} window.document = {} window.document.childNodes = [] window.document.createElement = function(tag) { return { style: {}, childNodes: [], nodeType: 1, nodeName: tag.toUpperCase(), appendChild: window.document.appendChild, removeChild: window.document.removeChild, replaceChild: window.document.replaceChild, insertBefore: function(node, reference) { node.parentNode = this var referenceIndex = this.childNodes.indexOf(reference) var index = this.childNodes.indexOf(node) if (index > -1) this.childNodes.splice(index, 1) if (referenceIndex < 0) this.childNodes.push(node) else this.childNodes.splice(referenceIndex, 0, node) }, insertAdjacentHTML: function(position, html) { // todo: accept markup if (position === "beforebegin") { this.parentNode.insertBefore(window.document.createTextNode(html), this) } else if (position === "beforeend") { this.appendChild(window.document.createTextNode(html)) } }, setAttribute: function(name, value) { this[name] = value.toString() }, setAttributeNS: function(namespace, name, value) { this.namespaceURI = namespace this[name] = value.toString() }, getAttribute: function(name, value) { return this[name] }, addEventListener: function () {}, removeEventListener: function () {} } } window.document.createElementNS = function(namespace, tag) { var element = window.document.createElement(tag) element.namespaceURI = namespace return element } window.document.createTextNode = function(text) { return {nodeValue: text.toString()} } window.document.documentElement = window.document.createElement("html") window.document.replaceChild = function(newChild, oldChild) { var index = this.childNodes.indexOf(oldChild) if (index > -1) this.childNodes.splice(index, 1, newChild) else this.childNodes.push(newChild) newChild.parentNode = this oldChild.parentNode = null } window.document.appendChild = function(child) { var index = this.childNodes.indexOf(child) if (index > -1) this.childNodes.splice(index, 1) this.childNodes.push(child) child.parentNode = this } window.document.removeChild = function(child) { var index = this.childNodes.indexOf(child) this.childNodes.splice(index, 1) child.parentNode = null } // getElementsByTagName is only used by JSONP tests, it's not required by // Mithril window.document.getElementsByTagName = function(name){ name = name.toLowerCase(); var out = []; var traverse = function(node){ if(node.childNodes && node.childNodes.length > 0){ node.childNodes.map(function(curr){ if (curr.nodeName.toLowerCase() === name) { out.push(curr); } traverse(curr); }); } } traverse(window.document); return out; } window.scrollTo = function() {} window.cancelAnimationFrame = function() {} window.requestAnimationFrame = function(callback) { window.requestAnimationFrame.$callback = callback return window.requestAnimationFrame.$id++ } window.requestAnimationFrame.$id = 1 window.requestAnimationFrame.$resolve = function() { if (window.requestAnimationFrame.$callback) { var callback = window.requestAnimationFrame.$callback window.requestAnimationFrame.$callback = null callback() } } window.XMLHttpRequest = (function() { var request = function() { this.$headers = {} this.setRequestHeader = function(key, value) { this.$headers[key] = value } this.open = function(method, url) { this.method = method this.url = url } this.send = function() { this.responseText = JSON.stringify(this) this.readyState = 4 this.status = 200 request.$instances.push(this) } } request.$instances = [] return request }()) window.location = {search: "", pathname: "", hash: ""} window.history = {} window.history.$$length = 0 window.history.pushState = function(data, title, url) { window.history.$$length++ window.location.pathname = window.location.search = window.location.hash = url } window.history.replaceState = function(data, title, url) { window.location.pathname = window.location.search = window.location.hash = url } return window }())