| <!DOCTYPE html> |
| <!-- |
| Copyright 2015 The Chromium Authors. All rights reserved. |
| Use of this source code is governed by a BSD-style license that can be |
| found in the LICENSE file. |
| --> |
| |
| <script> |
| 'use strict'; |
| |
| var testing_common = (function() { |
| |
| var originalXMLHttpRequest = window.XMLHttpRequest; |
| var fixture = null; |
| var xhrMock = null; |
| |
| var XMLHttpRequestMock = function() { |
| this.responseMap_ = {}; |
| window.XMLHttpRequest = this.getMock(); |
| }; |
| |
| XMLHttpRequestMock.prototype.getMock = function() { |
| // TODO(chrisphan): Add support for error state. |
| var self = this; |
| return function() { |
| this.status = 200; |
| this.onerror = function() {}; |
| this.open = function(method, url, async) { |
| this.url = url; |
| }; |
| this.abort = function() {}; |
| this.setRequestHeader = function() {}; |
| this.onload = function() {}; |
| this.send = function(param) { |
| var requestStr = this.url + '?' + sortQueryPart(param); |
| if (requestStr in self.responseMap_) { |
| this.responseText = self.responseMap_[requestStr]; |
| this.onload(); |
| } else if ('*' in self.responseMap_) { |
| this.responseText = self.responseMap_['*']; |
| this.onload(); |
| } else { |
| console.warn('XMLHttpRequest sent without a handler: ' + requestStr); |
| } |
| }; |
| }; |
| }; |
| |
| XMLHttpRequestMock.prototype.add = function(param, response) { |
| if (param != '*') { |
| param = sortQueryPart(param); |
| } |
| this.responseMap_[param] = response; |
| }; |
| |
| function addXhrMock(param, response) { |
| if (!xhrMock) { |
| xhrMock = new XMLHttpRequestMock(); |
| } |
| xhrMock.add(param, response); |
| }; |
| |
| function clearXhrMock() { |
| window.XMLHttpRequest = originalXMLHttpRequest; |
| xhrMock = null; |
| }; |
| |
| /** |
| * Does a deep copy of the object. |
| * @param {*} obj Object to copy. |
| * @return {*} A copy of the object. |
| */ |
| function deepCopy(obj) { |
| return JSON.parse(JSON.stringify(obj)); |
| }; |
| |
| function addToFixture(node) { |
| if (!fixture) { |
| fixture = document.createElement('div'); |
| document.body.appendChild(fixture); |
| } |
| fixture.appendChild(node); |
| }; |
| |
| function clearFixture() { |
| if (fixture) { |
| fixture.innerHTML = ''; |
| } |
| }; |
| |
| var paramString = function(params) { |
| var keys = Object.keys(params).sort(); |
| return keys.map(function(key) { |
| return key + '=' + encodeURIComponent(params[key]); |
| }).join('&'); |
| }; |
| |
| var sortQueryPart = function(paramStr) { |
| var params = {}; |
| var path = paramStr.substring(0, paramStr.indexOf('?') + 1); |
| var query = paramStr.substring(paramStr.indexOf('?') + 1); |
| var queryParts = query.split('&'); |
| for (var i = 0; i < queryParts.length; i++) { |
| var pair = queryParts[i].split('='); |
| params[pair[0]] = pair.length == 1 ? '' : pair[1]; |
| } |
| var keys = Object.keys(params).sort(); |
| query = keys.map(function(key) { |
| return key + '=' + params[key]; |
| }).join('&'); |
| return path + query; |
| }; |
| |
| return { |
| addXhrMock: addXhrMock, |
| clearXhrMock: clearXhrMock, |
| deepCopy: deepCopy, |
| addToFixture: addToFixture, |
| clearFixture: clearFixture, |
| paramString: paramString, |
| sortQueryPart: sortQueryPart |
| }; |
| })(); |
| |
| </script> |