Unbundle all JavaScript libraries from Horizon
Remove all external JS libraries from Horizon, and pull them in as xstatic packages instead. Bootstrap, jquery-ui and jquery.bootstrap.wizard will be unbundled in separate patches, as there are some problems adding them to global-requirements. Partial-Implements: blueprint remove-javascript-bundling Change-Id: Icbbcf8e58db2dcce96d187f7307201f728812cd2
This commit is contained in:
parent
ba64a52bb8
commit
210717a43d
@ -1,202 +0,0 @@
|
|||||||
/**
|
|
||||||
* @license AngularJS v1.2.1
|
|
||||||
* (c) 2010-2012 Google, Inc. http://angularjs.org
|
|
||||||
* License: MIT
|
|
||||||
*/
|
|
||||||
(function(window, angular, undefined) {'use strict';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ngdoc overview
|
|
||||||
* @name ngCookies
|
|
||||||
* @description
|
|
||||||
*
|
|
||||||
* # ngCookies
|
|
||||||
*
|
|
||||||
* The `ngCookies` module provides a convenient wrapper for reading and writing browser cookies.
|
|
||||||
*
|
|
||||||
* {@installModule cookies}
|
|
||||||
*
|
|
||||||
* <div doc-module-components="ngCookies"></div>
|
|
||||||
*
|
|
||||||
* See {@link ngCookies.$cookies `$cookies`} and
|
|
||||||
* {@link ngCookies.$cookieStore `$cookieStore`} for usage.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
angular.module('ngCookies', ['ng']).
|
|
||||||
/**
|
|
||||||
* @ngdoc object
|
|
||||||
* @name ngCookies.$cookies
|
|
||||||
* @requires $browser
|
|
||||||
*
|
|
||||||
* @description
|
|
||||||
* Provides read/write access to browser's cookies.
|
|
||||||
*
|
|
||||||
* Only a simple Object is exposed and by adding or removing properties to/from
|
|
||||||
* this object, new cookies are created/deleted at the end of current $eval.
|
|
||||||
*
|
|
||||||
* Requires the {@link ngCookies `ngCookies`} module to be installed.
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
<doc:example>
|
|
||||||
<doc:source>
|
|
||||||
<script>
|
|
||||||
function ExampleController($cookies) {
|
|
||||||
// Retrieving a cookie
|
|
||||||
var favoriteCookie = $cookies.myFavorite;
|
|
||||||
// Setting a cookie
|
|
||||||
$cookies.myFavorite = 'oatmeal';
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
</doc:source>
|
|
||||||
</doc:example>
|
|
||||||
*/
|
|
||||||
factory('$cookies', ['$rootScope', '$browser', function ($rootScope, $browser) {
|
|
||||||
var cookies = {},
|
|
||||||
lastCookies = {},
|
|
||||||
lastBrowserCookies,
|
|
||||||
runEval = false,
|
|
||||||
copy = angular.copy,
|
|
||||||
isUndefined = angular.isUndefined;
|
|
||||||
|
|
||||||
//creates a poller fn that copies all cookies from the $browser to service & inits the service
|
|
||||||
$browser.addPollFn(function() {
|
|
||||||
var currentCookies = $browser.cookies();
|
|
||||||
if (lastBrowserCookies != currentCookies) { //relies on browser.cookies() impl
|
|
||||||
lastBrowserCookies = currentCookies;
|
|
||||||
copy(currentCookies, lastCookies);
|
|
||||||
copy(currentCookies, cookies);
|
|
||||||
if (runEval) $rootScope.$apply();
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
|
|
||||||
runEval = true;
|
|
||||||
|
|
||||||
//at the end of each eval, push cookies
|
|
||||||
//TODO: this should happen before the "delayed" watches fire, because if some cookies are not
|
|
||||||
// strings or browser refuses to store some cookies, we update the model in the push fn.
|
|
||||||
$rootScope.$watch(push);
|
|
||||||
|
|
||||||
return cookies;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pushes all the cookies from the service to the browser and verifies if all cookies were
|
|
||||||
* stored.
|
|
||||||
*/
|
|
||||||
function push() {
|
|
||||||
var name,
|
|
||||||
value,
|
|
||||||
browserCookies,
|
|
||||||
updated;
|
|
||||||
|
|
||||||
//delete any cookies deleted in $cookies
|
|
||||||
for (name in lastCookies) {
|
|
||||||
if (isUndefined(cookies[name])) {
|
|
||||||
$browser.cookies(name, undefined);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//update all cookies updated in $cookies
|
|
||||||
for(name in cookies) {
|
|
||||||
value = cookies[name];
|
|
||||||
if (!angular.isString(value)) {
|
|
||||||
if (angular.isDefined(lastCookies[name])) {
|
|
||||||
cookies[name] = lastCookies[name];
|
|
||||||
} else {
|
|
||||||
delete cookies[name];
|
|
||||||
}
|
|
||||||
} else if (value !== lastCookies[name]) {
|
|
||||||
$browser.cookies(name, value);
|
|
||||||
updated = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//verify what was actually stored
|
|
||||||
if (updated){
|
|
||||||
updated = false;
|
|
||||||
browserCookies = $browser.cookies();
|
|
||||||
|
|
||||||
for (name in cookies) {
|
|
||||||
if (cookies[name] !== browserCookies[name]) {
|
|
||||||
//delete or reset all cookies that the browser dropped from $cookies
|
|
||||||
if (isUndefined(browserCookies[name])) {
|
|
||||||
delete cookies[name];
|
|
||||||
} else {
|
|
||||||
cookies[name] = browserCookies[name];
|
|
||||||
}
|
|
||||||
updated = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}]).
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ngdoc object
|
|
||||||
* @name ngCookies.$cookieStore
|
|
||||||
* @requires $cookies
|
|
||||||
*
|
|
||||||
* @description
|
|
||||||
* Provides a key-value (string-object) storage, that is backed by session cookies.
|
|
||||||
* Objects put or retrieved from this storage are automatically serialized or
|
|
||||||
* deserialized by angular's toJson/fromJson.
|
|
||||||
*
|
|
||||||
* Requires the {@link ngCookies `ngCookies`} module to be installed.
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
*/
|
|
||||||
factory('$cookieStore', ['$cookies', function($cookies) {
|
|
||||||
|
|
||||||
return {
|
|
||||||
/**
|
|
||||||
* @ngdoc method
|
|
||||||
* @name ngCookies.$cookieStore#get
|
|
||||||
* @methodOf ngCookies.$cookieStore
|
|
||||||
*
|
|
||||||
* @description
|
|
||||||
* Returns the value of given cookie key
|
|
||||||
*
|
|
||||||
* @param {string} key Id to use for lookup.
|
|
||||||
* @returns {Object} Deserialized cookie value.
|
|
||||||
*/
|
|
||||||
get: function(key) {
|
|
||||||
var value = $cookies[key];
|
|
||||||
return value ? angular.fromJson(value) : value;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ngdoc method
|
|
||||||
* @name ngCookies.$cookieStore#put
|
|
||||||
* @methodOf ngCookies.$cookieStore
|
|
||||||
*
|
|
||||||
* @description
|
|
||||||
* Sets a value for given cookie key
|
|
||||||
*
|
|
||||||
* @param {string} key Id for the `value`.
|
|
||||||
* @param {Object} value Value to be stored.
|
|
||||||
*/
|
|
||||||
put: function(key, value) {
|
|
||||||
$cookies[key] = angular.toJson(value);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ngdoc method
|
|
||||||
* @name ngCookies.$cookieStore#remove
|
|
||||||
* @methodOf ngCookies.$cookieStore
|
|
||||||
*
|
|
||||||
* @description
|
|
||||||
* Remove given cookie
|
|
||||||
*
|
|
||||||
* @param {string} key Id of the key-value pair to delete.
|
|
||||||
*/
|
|
||||||
remove: function(key) {
|
|
||||||
delete $cookies[key];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}]);
|
|
||||||
|
|
||||||
|
|
||||||
})(window, window.angular);
|
|
2115
horizon/static/horizon/lib/angular/angular-mock.js
vendored
2115
horizon/static/horizon/lib/angular/angular-mock.js
vendored
File diff suppressed because it is too large
Load Diff
20131
horizon/static/horizon/lib/angular/angular.js
vendored
20131
horizon/static/horizon/lib/angular/angular.js
vendored
File diff suppressed because it is too large
Load Diff
8432
horizon/static/horizon/lib/d3.js
vendored
8432
horizon/static/horizon/lib/d3.js
vendored
File diff suppressed because it is too large
Load Diff
@ -1,576 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2011 Twitter, Inc.
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var Hogan = {};
|
|
||||||
|
|
||||||
(function (Hogan, useArrayBuffer) {
|
|
||||||
Hogan.Template = function (renderFunc, text, compiler, options) {
|
|
||||||
this.r = renderFunc || this.r;
|
|
||||||
this.c = compiler;
|
|
||||||
this.options = options;
|
|
||||||
this.text = text || '';
|
|
||||||
this.buf = (useArrayBuffer) ? [] : '';
|
|
||||||
}
|
|
||||||
|
|
||||||
Hogan.Template.prototype = {
|
|
||||||
// render: replaced by generated code.
|
|
||||||
r: function (context, partials, indent) { return ''; },
|
|
||||||
|
|
||||||
// variable escaping
|
|
||||||
v: hoganEscape,
|
|
||||||
|
|
||||||
// triple stache
|
|
||||||
t: coerceToString,
|
|
||||||
|
|
||||||
render: function render(context, partials, indent) {
|
|
||||||
return this.ri([context], partials || {}, indent);
|
|
||||||
},
|
|
||||||
|
|
||||||
// render internal -- a hook for overrides that catches partials too
|
|
||||||
ri: function (context, partials, indent) {
|
|
||||||
return this.r(context, partials, indent);
|
|
||||||
},
|
|
||||||
|
|
||||||
// tries to find a partial in the curent scope and render it
|
|
||||||
rp: function(name, context, partials, indent) {
|
|
||||||
var partial = partials[name];
|
|
||||||
|
|
||||||
if (!partial) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.c && typeof partial == 'string') {
|
|
||||||
partial = this.c.compile(partial, this.options);
|
|
||||||
}
|
|
||||||
|
|
||||||
return partial.ri(context, partials, indent);
|
|
||||||
},
|
|
||||||
|
|
||||||
// render a section
|
|
||||||
rs: function(context, partials, section) {
|
|
||||||
var tail = context[context.length - 1];
|
|
||||||
|
|
||||||
if (!isArray(tail)) {
|
|
||||||
section(context, partials, this);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = 0; i < tail.length; i++) {
|
|
||||||
context.push(tail[i]);
|
|
||||||
section(context, partials, this);
|
|
||||||
context.pop();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// maybe start a section
|
|
||||||
s: function(val, ctx, partials, inverted, start, end, tags) {
|
|
||||||
var pass;
|
|
||||||
|
|
||||||
if (isArray(val) && val.length === 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof val == 'function') {
|
|
||||||
val = this.ls(val, ctx, partials, inverted, start, end, tags);
|
|
||||||
}
|
|
||||||
|
|
||||||
pass = (val === '') || !!val;
|
|
||||||
|
|
||||||
if (!inverted && pass && ctx) {
|
|
||||||
ctx.push((typeof val == 'object') ? val : ctx[ctx.length - 1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return pass;
|
|
||||||
},
|
|
||||||
|
|
||||||
// find values with dotted names
|
|
||||||
d: function(key, ctx, partials, returnFound) {
|
|
||||||
var names = key.split('.'),
|
|
||||||
val = this.f(names[0], ctx, partials, returnFound),
|
|
||||||
cx = null;
|
|
||||||
|
|
||||||
if (key === '.' && isArray(ctx[ctx.length - 2])) {
|
|
||||||
return ctx[ctx.length - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = 1; i < names.length; i++) {
|
|
||||||
if (val && typeof val == 'object' && names[i] in val) {
|
|
||||||
cx = val;
|
|
||||||
val = val[names[i]];
|
|
||||||
} else {
|
|
||||||
val = '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (returnFound && !val) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!returnFound && typeof val == 'function') {
|
|
||||||
ctx.push(cx);
|
|
||||||
val = this.lv(val, ctx, partials);
|
|
||||||
ctx.pop();
|
|
||||||
}
|
|
||||||
|
|
||||||
return val;
|
|
||||||
},
|
|
||||||
|
|
||||||
// find values with normal names
|
|
||||||
f: function(key, ctx, partials, returnFound) {
|
|
||||||
var val = false,
|
|
||||||
v = null,
|
|
||||||
found = false;
|
|
||||||
|
|
||||||
for (var i = ctx.length - 1; i >= 0; i--) {
|
|
||||||
v = ctx[i];
|
|
||||||
if (v && typeof v == 'object' && key in v) {
|
|
||||||
val = v[key];
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!found) {
|
|
||||||
return (returnFound) ? false : "";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!returnFound && typeof val == 'function') {
|
|
||||||
val = this.lv(val, ctx, partials);
|
|
||||||
}
|
|
||||||
|
|
||||||
return val;
|
|
||||||
},
|
|
||||||
|
|
||||||
// higher order templates
|
|
||||||
ho: function(val, cx, partials, text, tags) {
|
|
||||||
var compiler = this.c;
|
|
||||||
var options = this.options;
|
|
||||||
options.delimiters = tags;
|
|
||||||
var text = val.call(cx, text);
|
|
||||||
text = (text == null) ? String(text) : text.toString();
|
|
||||||
this.b(compiler.compile(text, options).render(cx, partials));
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
// template result buffering
|
|
||||||
b: (useArrayBuffer) ? function(s) { this.buf.push(s); } :
|
|
||||||
function(s) { this.buf += s; },
|
|
||||||
fl: (useArrayBuffer) ? function() { var r = this.buf.join(''); this.buf = []; return r; } :
|
|
||||||
function() { var r = this.buf; this.buf = ''; return r; },
|
|
||||||
|
|
||||||
// lambda replace section
|
|
||||||
ls: function(val, ctx, partials, inverted, start, end, tags) {
|
|
||||||
var cx = ctx[ctx.length - 1],
|
|
||||||
t = null;
|
|
||||||
|
|
||||||
if (!inverted && this.c && val.length > 0) {
|
|
||||||
return this.ho(val, cx, partials, this.text.substring(start, end), tags);
|
|
||||||
}
|
|
||||||
|
|
||||||
t = val.call(cx);
|
|
||||||
|
|
||||||
if (typeof t == 'function') {
|
|
||||||
if (inverted) {
|
|
||||||
return true;
|
|
||||||
} else if (this.c) {
|
|
||||||
return this.ho(t, cx, partials, this.text.substring(start, end), tags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return t;
|
|
||||||
},
|
|
||||||
|
|
||||||
// lambda replace variable
|
|
||||||
lv: function(val, ctx, partials) {
|
|
||||||
var cx = ctx[ctx.length - 1];
|
|
||||||
var result = val.call(cx);
|
|
||||||
|
|
||||||
if (typeof result == 'function') {
|
|
||||||
result = coerceToString(result.call(cx));
|
|
||||||
if (this.c && ~result.indexOf("{\u007B")) {
|
|
||||||
return this.c.compile(result, this.options).render(cx, partials);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return coerceToString(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
var rAmp = /&/g,
|
|
||||||
rLt = /</g,
|
|
||||||
rGt = />/g,
|
|
||||||
rApos =/\'/g,
|
|
||||||
rQuot = /\"/g,
|
|
||||||
hChars =/[&<>\"\']/;
|
|
||||||
|
|
||||||
|
|
||||||
function coerceToString(val) {
|
|
||||||
return String((val === null || val === undefined) ? '' : val);
|
|
||||||
}
|
|
||||||
|
|
||||||
function hoganEscape(str) {
|
|
||||||
str = coerceToString(str);
|
|
||||||
return hChars.test(str) ?
|
|
||||||
str
|
|
||||||
.replace(rAmp,'&')
|
|
||||||
.replace(rLt,'<')
|
|
||||||
.replace(rGt,'>')
|
|
||||||
.replace(rApos,''')
|
|
||||||
.replace(rQuot, '"') :
|
|
||||||
str;
|
|
||||||
}
|
|
||||||
|
|
||||||
var isArray = Array.isArray || function(a) {
|
|
||||||
return Object.prototype.toString.call(a) === '[object Array]';
|
|
||||||
};
|
|
||||||
|
|
||||||
})(typeof exports !== 'undefined' ? exports : Hogan);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(function (Hogan) {
|
|
||||||
// Setup regex assignments
|
|
||||||
// remove whitespace according to Mustache spec
|
|
||||||
var rIsWhitespace = /\S/,
|
|
||||||
rQuot = /\"/g,
|
|
||||||
rNewline = /\n/g,
|
|
||||||
rCr = /\r/g,
|
|
||||||
rSlash = /\\/g,
|
|
||||||
tagTypes = {
|
|
||||||
'#': 1, '^': 2, '/': 3, '!': 4, '>': 5,
|
|
||||||
'<': 6, '=': 7, '_v': 8, '{': 9, '&': 10
|
|
||||||
};
|
|
||||||
|
|
||||||
Hogan.scan = function scan(text, delimiters) {
|
|
||||||
var len = text.length,
|
|
||||||
IN_TEXT = 0,
|
|
||||||
IN_TAG_TYPE = 1,
|
|
||||||
IN_TAG = 2,
|
|
||||||
state = IN_TEXT,
|
|
||||||
tagType = null,
|
|
||||||
tag = null,
|
|
||||||
buf = '',
|
|
||||||
tokens = [],
|
|
||||||
seenTag = false,
|
|
||||||
i = 0,
|
|
||||||
lineStart = 0,
|
|
||||||
otag = '{{',
|
|
||||||
ctag = '}}';
|
|
||||||
|
|
||||||
function addBuf() {
|
|
||||||
if (buf.length > 0) {
|
|
||||||
tokens.push(new String(buf));
|
|
||||||
buf = '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function lineIsWhitespace() {
|
|
||||||
var isAllWhitespace = true;
|
|
||||||
for (var j = lineStart; j < tokens.length; j++) {
|
|
||||||
isAllWhitespace =
|
|
||||||
(tokens[j].tag && tagTypes[tokens[j].tag] < tagTypes['_v']) ||
|
|
||||||
(!tokens[j].tag && tokens[j].match(rIsWhitespace) === null);
|
|
||||||
if (!isAllWhitespace) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return isAllWhitespace;
|
|
||||||
}
|
|
||||||
|
|
||||||
function filterLine(haveSeenTag, noNewLine) {
|
|
||||||
addBuf();
|
|
||||||
|
|
||||||
if (haveSeenTag && lineIsWhitespace()) {
|
|
||||||
for (var j = lineStart, next; j < tokens.length; j++) {
|
|
||||||
if (!tokens[j].tag) {
|
|
||||||
if ((next = tokens[j+1]) && next.tag == '>') {
|
|
||||||
// set indent to token value
|
|
||||||
next.indent = tokens[j].toString()
|
|
||||||
}
|
|
||||||
tokens.splice(j, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (!noNewLine) {
|
|
||||||
tokens.push({tag:'\n'});
|
|
||||||
}
|
|
||||||
|
|
||||||
seenTag = false;
|
|
||||||
lineStart = tokens.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
function changeDelimiters(text, index) {
|
|
||||||
var close = '=' + ctag,
|
|
||||||
closeIndex = text.indexOf(close, index),
|
|
||||||
delimiters = trim(
|
|
||||||
text.substring(text.indexOf('=', index) + 1, closeIndex)
|
|
||||||
).split(' ');
|
|
||||||
|
|
||||||
otag = delimiters[0];
|
|
||||||
ctag = delimiters[1];
|
|
||||||
|
|
||||||
return closeIndex + close.length - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (delimiters) {
|
|
||||||
delimiters = delimiters.split(' ');
|
|
||||||
otag = delimiters[0];
|
|
||||||
ctag = delimiters[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < len; i++) {
|
|
||||||
if (state == IN_TEXT) {
|
|
||||||
if (tagChange(otag, text, i)) {
|
|
||||||
--i;
|
|
||||||
addBuf();
|
|
||||||
state = IN_TAG_TYPE;
|
|
||||||
} else {
|
|
||||||
if (text.charAt(i) == '\n') {
|
|
||||||
filterLine(seenTag);
|
|
||||||
} else {
|
|
||||||
buf += text.charAt(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (state == IN_TAG_TYPE) {
|
|
||||||
i += otag.length - 1;
|
|
||||||
tag = tagTypes[text.charAt(i + 1)];
|
|
||||||
tagType = tag ? text.charAt(i + 1) : '_v';
|
|
||||||
if (tagType == '=') {
|
|
||||||
i = changeDelimiters(text, i);
|
|
||||||
state = IN_TEXT;
|
|
||||||
} else {
|
|
||||||
if (tag) {
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
state = IN_TAG;
|
|
||||||
}
|
|
||||||
seenTag = i;
|
|
||||||
} else {
|
|
||||||
if (tagChange(ctag, text, i)) {
|
|
||||||
tokens.push({tag: tagType, n: trim(buf), otag: otag, ctag: ctag,
|
|
||||||
i: (tagType == '/') ? seenTag - ctag.length : i + otag.length});
|
|
||||||
buf = '';
|
|
||||||
i += ctag.length - 1;
|
|
||||||
state = IN_TEXT;
|
|
||||||
if (tagType == '{') {
|
|
||||||
if (ctag == '}}') {
|
|
||||||
i++;
|
|
||||||
} else {
|
|
||||||
cleanTripleStache(tokens[tokens.length - 1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
buf += text.charAt(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
filterLine(seenTag, true);
|
|
||||||
|
|
||||||
return tokens;
|
|
||||||
}
|
|
||||||
|
|
||||||
function cleanTripleStache(token) {
|
|
||||||
if (token.n.substr(token.n.length - 1) === '}') {
|
|
||||||
token.n = token.n.substring(0, token.n.length - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function trim(s) {
|
|
||||||
if (s.trim) {
|
|
||||||
return s.trim();
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.replace(/^\s*|\s*$/g, '');
|
|
||||||
}
|
|
||||||
|
|
||||||
function tagChange(tag, text, index) {
|
|
||||||
if (text.charAt(index) != tag.charAt(0)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = 1, l = tag.length; i < l; i++) {
|
|
||||||
if (text.charAt(index + i) != tag.charAt(i)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildTree(tokens, kind, stack, customTags) {
|
|
||||||
var instructions = [],
|
|
||||||
opener = null,
|
|
||||||
token = null;
|
|
||||||
|
|
||||||
while (tokens.length > 0) {
|
|
||||||
token = tokens.shift();
|
|
||||||
if (token.tag == '#' || token.tag == '^' || isOpener(token, customTags)) {
|
|
||||||
stack.push(token);
|
|
||||||
token.nodes = buildTree(tokens, token.tag, stack, customTags);
|
|
||||||
instructions.push(token);
|
|
||||||
} else if (token.tag == '/') {
|
|
||||||
if (stack.length === 0) {
|
|
||||||
throw new Error('Closing tag without opener: /' + token.n);
|
|
||||||
}
|
|
||||||
opener = stack.pop();
|
|
||||||
if (token.n != opener.n && !isCloser(token.n, opener.n, customTags)) {
|
|
||||||
throw new Error('Nesting error: ' + opener.n + ' vs. ' + token.n);
|
|
||||||
}
|
|
||||||
opener.end = token.i;
|
|
||||||
return instructions;
|
|
||||||
} else {
|
|
||||||
instructions.push(token);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stack.length > 0) {
|
|
||||||
throw new Error('missing closing tag: ' + stack.pop().n);
|
|
||||||
}
|
|
||||||
|
|
||||||
return instructions;
|
|
||||||
}
|
|
||||||
|
|
||||||
function isOpener(token, tags) {
|
|
||||||
for (var i = 0, l = tags.length; i < l; i++) {
|
|
||||||
if (tags[i].o == token.n) {
|
|
||||||
token.tag = '#';
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function isCloser(close, open, tags) {
|
|
||||||
for (var i = 0, l = tags.length; i < l; i++) {
|
|
||||||
if (tags[i].c == close && tags[i].o == open) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Hogan.generate = function (tree, text, options) {
|
|
||||||
var code = 'var _=this;_.b(i=i||"");' + walk(tree) + 'return _.fl();';
|
|
||||||
if (options.asString) {
|
|
||||||
return 'function(c,p,i){' + code + ';}';
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Hogan.Template(new Function('c', 'p', 'i', code), text, Hogan, options);
|
|
||||||
}
|
|
||||||
|
|
||||||
function esc(s) {
|
|
||||||
return s.replace(rSlash, '\\\\')
|
|
||||||
.replace(rQuot, '\\\"')
|
|
||||||
.replace(rNewline, '\\n')
|
|
||||||
.replace(rCr, '\\r');
|
|
||||||
}
|
|
||||||
|
|
||||||
function chooseMethod(s) {
|
|
||||||
return (~s.indexOf('.')) ? 'd' : 'f';
|
|
||||||
}
|
|
||||||
|
|
||||||
function walk(tree) {
|
|
||||||
var code = '';
|
|
||||||
for (var i = 0, l = tree.length; i < l; i++) {
|
|
||||||
var tag = tree[i].tag;
|
|
||||||
if (tag == '#') {
|
|
||||||
code += section(tree[i].nodes, tree[i].n, chooseMethod(tree[i].n),
|
|
||||||
tree[i].i, tree[i].end, tree[i].otag + " " + tree[i].ctag);
|
|
||||||
} else if (tag == '^') {
|
|
||||||
code += invertedSection(tree[i].nodes, tree[i].n,
|
|
||||||
chooseMethod(tree[i].n));
|
|
||||||
} else if (tag == '<' || tag == '>') {
|
|
||||||
code += partial(tree[i]);
|
|
||||||
} else if (tag == '{' || tag == '&') {
|
|
||||||
code += tripleStache(tree[i].n, chooseMethod(tree[i].n));
|
|
||||||
} else if (tag == '\n') {
|
|
||||||
code += text('"\\n"' + (tree.length-1 == i ? '' : ' + i'));
|
|
||||||
} else if (tag == '_v') {
|
|
||||||
code += variable(tree[i].n, chooseMethod(tree[i].n));
|
|
||||||
} else if (tag === undefined) {
|
|
||||||
code += text('"' + esc(tree[i]) + '"');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
function section(nodes, id, method, start, end, tags) {
|
|
||||||
return 'if(_.s(_.' + method + '("' + esc(id) + '",c,p,1),' +
|
|
||||||
'c,p,0,' + start + ',' + end + ',"' + tags + '")){' +
|
|
||||||
'_.rs(c,p,' +
|
|
||||||
'function(c,p,_){' +
|
|
||||||
walk(nodes) +
|
|
||||||
'});c.pop();}';
|
|
||||||
}
|
|
||||||
|
|
||||||
function invertedSection(nodes, id, method) {
|
|
||||||
return 'if(!_.s(_.' + method + '("' + esc(id) + '",c,p,1),c,p,1,0,0,"")){' +
|
|
||||||
walk(nodes) +
|
|
||||||
'};';
|
|
||||||
}
|
|
||||||
|
|
||||||
function partial(tok) {
|
|
||||||
return '_.b(_.rp("' + esc(tok.n) + '",c,p,"' + (tok.indent || '') + '"));';
|
|
||||||
}
|
|
||||||
|
|
||||||
function tripleStache(id, method) {
|
|
||||||
return '_.b(_.t(_.' + method + '("' + esc(id) + '",c,p,0)));';
|
|
||||||
}
|
|
||||||
|
|
||||||
function variable(id, method) {
|
|
||||||
return '_.b(_.v(_.' + method + '("' + esc(id) + '",c,p,0)));';
|
|
||||||
}
|
|
||||||
|
|
||||||
function text(id) {
|
|
||||||
return '_.b(' + id + ');';
|
|
||||||
}
|
|
||||||
|
|
||||||
Hogan.parse = function(tokens, text, options) {
|
|
||||||
options = options || {};
|
|
||||||
return buildTree(tokens, '', [], options.sectionTags || []);
|
|
||||||
},
|
|
||||||
|
|
||||||
Hogan.cache = {};
|
|
||||||
|
|
||||||
Hogan.compile = function(text, options) {
|
|
||||||
// options
|
|
||||||
//
|
|
||||||
// asString: false (default)
|
|
||||||
//
|
|
||||||
// sectionTags: [{o: '_foo', c: 'foo'}]
|
|
||||||
// An array of object with o and c fields that indicate names for custom
|
|
||||||
// section tags. The example above allows parsing of {{_foo}}{{/foo}}.
|
|
||||||
//
|
|
||||||
// delimiters: A string that overrides the default delimiters.
|
|
||||||
// Example: "<% %>"
|
|
||||||
//
|
|
||||||
options = options || {};
|
|
||||||
|
|
||||||
var key = text + '||' + !!options.asString;
|
|
||||||
|
|
||||||
var t = this.cache[key];
|
|
||||||
|
|
||||||
if (t) {
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
t = this.generate(this.parse(this.scan(text, options.delimiters), text, options), text, options);
|
|
||||||
return this.cache[key] = t;
|
|
||||||
};
|
|
||||||
})(typeof exports !== 'undefined' ? exports : Hogan);
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
|||||||
Copyright (c) 2008-2011 Pivotal Labs
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
"Software"), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -1,681 +0,0 @@
|
|||||||
jasmine.HtmlReporterHelpers = {};
|
|
||||||
|
|
||||||
jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) {
|
|
||||||
var el = document.createElement(type);
|
|
||||||
|
|
||||||
for (var i = 2; i < arguments.length; i++) {
|
|
||||||
var child = arguments[i];
|
|
||||||
|
|
||||||
if (typeof child === 'string') {
|
|
||||||
el.appendChild(document.createTextNode(child));
|
|
||||||
} else {
|
|
||||||
if (child) {
|
|
||||||
el.appendChild(child);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var attr in attrs) {
|
|
||||||
if (attr == "className") {
|
|
||||||
el[attr] = attrs[attr];
|
|
||||||
} else {
|
|
||||||
el.setAttribute(attr, attrs[attr]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return el;
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporterHelpers.getSpecStatus = function(child) {
|
|
||||||
var results = child.results();
|
|
||||||
var status = results.passed() ? 'passed' : 'failed';
|
|
||||||
if (results.skipped) {
|
|
||||||
status = 'skipped';
|
|
||||||
}
|
|
||||||
|
|
||||||
return status;
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) {
|
|
||||||
var parentDiv = this.dom.summary;
|
|
||||||
var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite';
|
|
||||||
var parent = child[parentSuite];
|
|
||||||
|
|
||||||
if (parent) {
|
|
||||||
if (typeof this.views.suites[parent.id] == 'undefined') {
|
|
||||||
this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views);
|
|
||||||
}
|
|
||||||
parentDiv = this.views.suites[parent.id].element;
|
|
||||||
}
|
|
||||||
|
|
||||||
parentDiv.appendChild(childElement);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
jasmine.HtmlReporterHelpers.addHelpers = function(ctor) {
|
|
||||||
for(var fn in jasmine.HtmlReporterHelpers) {
|
|
||||||
ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporter = function(_doc) {
|
|
||||||
var self = this;
|
|
||||||
var doc = _doc || window.document;
|
|
||||||
|
|
||||||
var reporterView;
|
|
||||||
|
|
||||||
var dom = {};
|
|
||||||
|
|
||||||
// Jasmine Reporter Public Interface
|
|
||||||
self.logRunningSpecs = false;
|
|
||||||
|
|
||||||
self.reportRunnerStarting = function(runner) {
|
|
||||||
var specs = runner.specs() || [];
|
|
||||||
|
|
||||||
if (specs.length == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
createReporterDom(runner.env.versionString());
|
|
||||||
doc.body.appendChild(dom.reporter);
|
|
||||||
setExceptionHandling();
|
|
||||||
|
|
||||||
reporterView = new jasmine.HtmlReporter.ReporterView(dom);
|
|
||||||
reporterView.addSpecs(specs, self.specFilter);
|
|
||||||
};
|
|
||||||
|
|
||||||
self.reportRunnerResults = function(runner) {
|
|
||||||
reporterView && reporterView.complete();
|
|
||||||
};
|
|
||||||
|
|
||||||
self.reportSuiteResults = function(suite) {
|
|
||||||
reporterView.suiteComplete(suite);
|
|
||||||
};
|
|
||||||
|
|
||||||
self.reportSpecStarting = function(spec) {
|
|
||||||
if (self.logRunningSpecs) {
|
|
||||||
self.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
self.reportSpecResults = function(spec) {
|
|
||||||
reporterView.specComplete(spec);
|
|
||||||
};
|
|
||||||
|
|
||||||
self.log = function() {
|
|
||||||
var console = jasmine.getGlobal().console;
|
|
||||||
if (console && console.log) {
|
|
||||||
if (console.log.apply) {
|
|
||||||
console.log.apply(console, arguments);
|
|
||||||
} else {
|
|
||||||
console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
self.specFilter = function(spec) {
|
|
||||||
if (!focusedSpecName()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return spec.getFullName().indexOf(focusedSpecName()) === 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
return self;
|
|
||||||
|
|
||||||
function focusedSpecName() {
|
|
||||||
var specName;
|
|
||||||
|
|
||||||
(function memoizeFocusedSpec() {
|
|
||||||
if (specName) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var paramMap = [];
|
|
||||||
var params = jasmine.HtmlReporter.parameters(doc);
|
|
||||||
|
|
||||||
for (var i = 0; i < params.length; i++) {
|
|
||||||
var p = params[i].split('=');
|
|
||||||
paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
specName = paramMap.spec;
|
|
||||||
})();
|
|
||||||
|
|
||||||
return specName;
|
|
||||||
}
|
|
||||||
|
|
||||||
function createReporterDom(version) {
|
|
||||||
dom.reporter = self.createDom('div', { id: 'HTMLReporter', className: 'jasmine_reporter' },
|
|
||||||
dom.banner = self.createDom('div', { className: 'banner' },
|
|
||||||
self.createDom('span', { className: 'title' }, "Jasmine "),
|
|
||||||
self.createDom('span', { className: 'version' }, version)),
|
|
||||||
|
|
||||||
dom.symbolSummary = self.createDom('ul', {className: 'symbolSummary'}),
|
|
||||||
dom.alert = self.createDom('div', {className: 'alert'},
|
|
||||||
self.createDom('span', { className: 'exceptions' },
|
|
||||||
self.createDom('label', { className: 'label', 'for': 'no_try_catch' }, 'No try/catch'),
|
|
||||||
self.createDom('input', { id: 'no_try_catch', type: 'checkbox' }))),
|
|
||||||
dom.results = self.createDom('div', {className: 'results'},
|
|
||||||
dom.summary = self.createDom('div', { className: 'summary' }),
|
|
||||||
dom.details = self.createDom('div', { id: 'details' }))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function noTryCatch() {
|
|
||||||
return window.location.search.match(/catch=false/);
|
|
||||||
}
|
|
||||||
|
|
||||||
function searchWithCatch() {
|
|
||||||
var params = jasmine.HtmlReporter.parameters(window.document);
|
|
||||||
var removed = false;
|
|
||||||
var i = 0;
|
|
||||||
|
|
||||||
while (!removed && i < params.length) {
|
|
||||||
if (params[i].match(/catch=/)) {
|
|
||||||
params.splice(i, 1);
|
|
||||||
removed = true;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if (jasmine.CATCH_EXCEPTIONS) {
|
|
||||||
params.push("catch=false");
|
|
||||||
}
|
|
||||||
|
|
||||||
return params.join("&");
|
|
||||||
}
|
|
||||||
|
|
||||||
function setExceptionHandling() {
|
|
||||||
var chxCatch = document.getElementById('no_try_catch');
|
|
||||||
|
|
||||||
if (noTryCatch()) {
|
|
||||||
chxCatch.setAttribute('checked', true);
|
|
||||||
jasmine.CATCH_EXCEPTIONS = false;
|
|
||||||
}
|
|
||||||
chxCatch.onclick = function() {
|
|
||||||
window.location.search = searchWithCatch();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
jasmine.HtmlReporter.parameters = function(doc) {
|
|
||||||
var paramStr = doc.location.search.substring(1);
|
|
||||||
var params = [];
|
|
||||||
|
|
||||||
if (paramStr.length > 0) {
|
|
||||||
params = paramStr.split('&');
|
|
||||||
}
|
|
||||||
return params;
|
|
||||||
}
|
|
||||||
jasmine.HtmlReporter.sectionLink = function(sectionName) {
|
|
||||||
var link = '?';
|
|
||||||
var params = [];
|
|
||||||
|
|
||||||
if (sectionName) {
|
|
||||||
params.push('spec=' + encodeURIComponent(sectionName));
|
|
||||||
}
|
|
||||||
if (!jasmine.CATCH_EXCEPTIONS) {
|
|
||||||
params.push("catch=false");
|
|
||||||
}
|
|
||||||
if (params.length > 0) {
|
|
||||||
link += params.join("&");
|
|
||||||
}
|
|
||||||
|
|
||||||
return link;
|
|
||||||
};
|
|
||||||
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter);
|
|
||||||
jasmine.HtmlReporter.ReporterView = function(dom) {
|
|
||||||
this.startedAt = new Date();
|
|
||||||
this.runningSpecCount = 0;
|
|
||||||
this.completeSpecCount = 0;
|
|
||||||
this.passedCount = 0;
|
|
||||||
this.failedCount = 0;
|
|
||||||
this.skippedCount = 0;
|
|
||||||
|
|
||||||
this.createResultsMenu = function() {
|
|
||||||
this.resultsMenu = this.createDom('span', {className: 'resultsMenu bar'},
|
|
||||||
this.summaryMenuItem = this.createDom('a', {className: 'summaryMenuItem', href: "#"}, '0 specs'),
|
|
||||||
' | ',
|
|
||||||
this.detailsMenuItem = this.createDom('a', {className: 'detailsMenuItem', href: "#"}, '0 failing'));
|
|
||||||
|
|
||||||
this.summaryMenuItem.onclick = function() {
|
|
||||||
dom.reporter.className = dom.reporter.className.replace(/ showDetails/g, '');
|
|
||||||
};
|
|
||||||
|
|
||||||
this.detailsMenuItem.onclick = function() {
|
|
||||||
showDetails();
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
this.addSpecs = function(specs, specFilter) {
|
|
||||||
this.totalSpecCount = specs.length;
|
|
||||||
|
|
||||||
this.views = {
|
|
||||||
specs: {},
|
|
||||||
suites: {}
|
|
||||||
};
|
|
||||||
|
|
||||||
for (var i = 0; i < specs.length; i++) {
|
|
||||||
var spec = specs[i];
|
|
||||||
this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom, this.views);
|
|
||||||
if (specFilter(spec)) {
|
|
||||||
this.runningSpecCount++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
this.specComplete = function(spec) {
|
|
||||||
this.completeSpecCount++;
|
|
||||||
|
|
||||||
if (isUndefined(this.views.specs[spec.id])) {
|
|
||||||
this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom);
|
|
||||||
}
|
|
||||||
|
|
||||||
var specView = this.views.specs[spec.id];
|
|
||||||
|
|
||||||
switch (specView.status()) {
|
|
||||||
case 'passed':
|
|
||||||
this.passedCount++;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'failed':
|
|
||||||
this.failedCount++;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'skipped':
|
|
||||||
this.skippedCount++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
specView.refresh();
|
|
||||||
this.refresh();
|
|
||||||
};
|
|
||||||
|
|
||||||
this.suiteComplete = function(suite) {
|
|
||||||
var suiteView = this.views.suites[suite.id];
|
|
||||||
if (isUndefined(suiteView)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
suiteView.refresh();
|
|
||||||
};
|
|
||||||
|
|
||||||
this.refresh = function() {
|
|
||||||
|
|
||||||
if (isUndefined(this.resultsMenu)) {
|
|
||||||
this.createResultsMenu();
|
|
||||||
}
|
|
||||||
|
|
||||||
// currently running UI
|
|
||||||
if (isUndefined(this.runningAlert)) {
|
|
||||||
this.runningAlert = this.createDom('a', { href: jasmine.HtmlReporter.sectionLink(), className: "runningAlert bar" });
|
|
||||||
dom.alert.appendChild(this.runningAlert);
|
|
||||||
}
|
|
||||||
this.runningAlert.innerHTML = "Running " + this.completeSpecCount + " of " + specPluralizedFor(this.totalSpecCount);
|
|
||||||
|
|
||||||
// skipped specs UI
|
|
||||||
if (isUndefined(this.skippedAlert)) {
|
|
||||||
this.skippedAlert = this.createDom('a', { href: jasmine.HtmlReporter.sectionLink(), className: "skippedAlert bar" });
|
|
||||||
}
|
|
||||||
|
|
||||||
this.skippedAlert.innerHTML = "Skipping " + this.skippedCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all";
|
|
||||||
|
|
||||||
if (this.skippedCount === 1 && isDefined(dom.alert)) {
|
|
||||||
dom.alert.appendChild(this.skippedAlert);
|
|
||||||
}
|
|
||||||
|
|
||||||
// passing specs UI
|
|
||||||
if (isUndefined(this.passedAlert)) {
|
|
||||||
this.passedAlert = this.createDom('span', { href: jasmine.HtmlReporter.sectionLink(), className: "passingAlert bar" });
|
|
||||||
}
|
|
||||||
this.passedAlert.innerHTML = "Passing " + specPluralizedFor(this.passedCount);
|
|
||||||
|
|
||||||
// failing specs UI
|
|
||||||
if (isUndefined(this.failedAlert)) {
|
|
||||||
this.failedAlert = this.createDom('span', {href: "?", className: "failingAlert bar"});
|
|
||||||
}
|
|
||||||
this.failedAlert.innerHTML = "Failing " + specPluralizedFor(this.failedCount);
|
|
||||||
|
|
||||||
if (this.failedCount === 1 && isDefined(dom.alert)) {
|
|
||||||
dom.alert.appendChild(this.failedAlert);
|
|
||||||
dom.alert.appendChild(this.resultsMenu);
|
|
||||||
}
|
|
||||||
|
|
||||||
// summary info
|
|
||||||
this.summaryMenuItem.innerHTML = "" + specPluralizedFor(this.runningSpecCount);
|
|
||||||
this.detailsMenuItem.innerHTML = "" + this.failedCount + " failing";
|
|
||||||
};
|
|
||||||
|
|
||||||
this.complete = function() {
|
|
||||||
dom.alert.removeChild(this.runningAlert);
|
|
||||||
|
|
||||||
this.skippedAlert.innerHTML = "Ran " + this.runningSpecCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all";
|
|
||||||
|
|
||||||
if (this.failedCount === 0) {
|
|
||||||
dom.alert.appendChild(this.createDom('span', {className: 'passingAlert bar'}, "Passing " + specPluralizedFor(this.passedCount)));
|
|
||||||
} else {
|
|
||||||
showDetails();
|
|
||||||
}
|
|
||||||
|
|
||||||
dom.banner.appendChild(this.createDom('span', {className: 'duration'}, "finished in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s"));
|
|
||||||
};
|
|
||||||
|
|
||||||
return this;
|
|
||||||
|
|
||||||
function showDetails() {
|
|
||||||
if (dom.reporter.className.search(/showDetails/) === -1) {
|
|
||||||
dom.reporter.className += " showDetails";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function isUndefined(obj) {
|
|
||||||
return typeof obj === 'undefined';
|
|
||||||
}
|
|
||||||
|
|
||||||
function isDefined(obj) {
|
|
||||||
return !isUndefined(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
function specPluralizedFor(count) {
|
|
||||||
var str = count + " spec";
|
|
||||||
if (count > 1) {
|
|
||||||
str += "s"
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.ReporterView);
|
|
||||||
|
|
||||||
|
|
||||||
jasmine.HtmlReporter.SpecView = function(spec, dom, views) {
|
|
||||||
this.spec = spec;
|
|
||||||
this.dom = dom;
|
|
||||||
this.views = views;
|
|
||||||
|
|
||||||
this.symbol = this.createDom('li', { className: 'pending' });
|
|
||||||
this.dom.symbolSummary.appendChild(this.symbol);
|
|
||||||
|
|
||||||
this.summary = this.createDom('div', { className: 'specSummary' },
|
|
||||||
this.createDom('a', {
|
|
||||||
className: 'description',
|
|
||||||
href: jasmine.HtmlReporter.sectionLink(this.spec.getFullName()),
|
|
||||||
title: this.spec.getFullName()
|
|
||||||
}, this.spec.description)
|
|
||||||
);
|
|
||||||
|
|
||||||
this.detail = this.createDom('div', { className: 'specDetail' },
|
|
||||||
this.createDom('a', {
|
|
||||||
className: 'description',
|
|
||||||
href: '?spec=' + encodeURIComponent(this.spec.getFullName()),
|
|
||||||
title: this.spec.getFullName()
|
|
||||||
}, this.spec.getFullName())
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporter.SpecView.prototype.status = function() {
|
|
||||||
return this.getSpecStatus(this.spec);
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporter.SpecView.prototype.refresh = function() {
|
|
||||||
this.symbol.className = this.status();
|
|
||||||
|
|
||||||
switch (this.status()) {
|
|
||||||
case 'skipped':
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'passed':
|
|
||||||
this.appendSummaryToSuiteDiv();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'failed':
|
|
||||||
this.appendSummaryToSuiteDiv();
|
|
||||||
this.appendFailureDetail();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporter.SpecView.prototype.appendSummaryToSuiteDiv = function() {
|
|
||||||
this.summary.className += ' ' + this.status();
|
|
||||||
this.appendToSummary(this.spec, this.summary);
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporter.SpecView.prototype.appendFailureDetail = function() {
|
|
||||||
this.detail.className += ' ' + this.status();
|
|
||||||
|
|
||||||
var resultItems = this.spec.results().getItems();
|
|
||||||
var messagesDiv = this.createDom('div', { className: 'messages' });
|
|
||||||
|
|
||||||
for (var i = 0; i < resultItems.length; i++) {
|
|
||||||
var result = resultItems[i];
|
|
||||||
|
|
||||||
if (result.type == 'log') {
|
|
||||||
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
|
|
||||||
} else if (result.type == 'expect' && result.passed && !result.passed()) {
|
|
||||||
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
|
|
||||||
|
|
||||||
if (result.trace.stack) {
|
|
||||||
messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (messagesDiv.childNodes.length > 0) {
|
|
||||||
this.detail.appendChild(messagesDiv);
|
|
||||||
this.dom.details.appendChild(this.detail);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView);jasmine.HtmlReporter.SuiteView = function(suite, dom, views) {
|
|
||||||
this.suite = suite;
|
|
||||||
this.dom = dom;
|
|
||||||
this.views = views;
|
|
||||||
|
|
||||||
this.element = this.createDom('div', { className: 'suite' },
|
|
||||||
this.createDom('a', { className: 'description', href: jasmine.HtmlReporter.sectionLink(this.suite.getFullName()) }, this.suite.description)
|
|
||||||
);
|
|
||||||
|
|
||||||
this.appendToSummary(this.suite, this.element);
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporter.SuiteView.prototype.status = function() {
|
|
||||||
return this.getSpecStatus(this.suite);
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporter.SuiteView.prototype.refresh = function() {
|
|
||||||
this.element.className += " " + this.status();
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SuiteView);
|
|
||||||
|
|
||||||
/* @deprecated Use jasmine.HtmlReporter instead
|
|
||||||
*/
|
|
||||||
jasmine.TrivialReporter = function(doc) {
|
|
||||||
this.document = doc || document;
|
|
||||||
this.suiteDivs = {};
|
|
||||||
this.logRunningSpecs = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) {
|
|
||||||
var el = document.createElement(type);
|
|
||||||
|
|
||||||
for (var i = 2; i < arguments.length; i++) {
|
|
||||||
var child = arguments[i];
|
|
||||||
|
|
||||||
if (typeof child === 'string') {
|
|
||||||
el.appendChild(document.createTextNode(child));
|
|
||||||
} else {
|
|
||||||
if (child) { el.appendChild(child); }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var attr in attrs) {
|
|
||||||
if (attr == "className") {
|
|
||||||
el[attr] = attrs[attr];
|
|
||||||
} else {
|
|
||||||
el.setAttribute(attr, attrs[attr]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return el;
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
|
|
||||||
var showPassed, showSkipped;
|
|
||||||
|
|
||||||
this.outerDiv = this.createDom('div', { id: 'TrivialReporter', className: 'jasmine_reporter' },
|
|
||||||
this.createDom('div', { className: 'banner' },
|
|
||||||
this.createDom('div', { className: 'logo' },
|
|
||||||
this.createDom('span', { className: 'title' }, "Jasmine"),
|
|
||||||
this.createDom('span', { className: 'version' }, runner.env.versionString())),
|
|
||||||
this.createDom('div', { className: 'options' },
|
|
||||||
"Show ",
|
|
||||||
showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }),
|
|
||||||
this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "),
|
|
||||||
showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }),
|
|
||||||
this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped")
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
this.runnerDiv = this.createDom('div', { className: 'runner running' },
|
|
||||||
this.createDom('a', { className: 'run_spec', href: '?' }, "run all"),
|
|
||||||
this.runnerMessageSpan = this.createDom('span', {}, "Running..."),
|
|
||||||
this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, ""))
|
|
||||||
);
|
|
||||||
|
|
||||||
this.document.body.appendChild(this.outerDiv);
|
|
||||||
|
|
||||||
var suites = runner.suites();
|
|
||||||
for (var i = 0; i < suites.length; i++) {
|
|
||||||
var suite = suites[i];
|
|
||||||
var suiteDiv = this.createDom('div', { className: 'suite' },
|
|
||||||
this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"),
|
|
||||||
this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description));
|
|
||||||
this.suiteDivs[suite.id] = suiteDiv;
|
|
||||||
var parentDiv = this.outerDiv;
|
|
||||||
if (suite.parentSuite) {
|
|
||||||
parentDiv = this.suiteDivs[suite.parentSuite.id];
|
|
||||||
}
|
|
||||||
parentDiv.appendChild(suiteDiv);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.startedAt = new Date();
|
|
||||||
|
|
||||||
var self = this;
|
|
||||||
showPassed.onclick = function(evt) {
|
|
||||||
if (showPassed.checked) {
|
|
||||||
self.outerDiv.className += ' show-passed';
|
|
||||||
} else {
|
|
||||||
self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, '');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
showSkipped.onclick = function(evt) {
|
|
||||||
if (showSkipped.checked) {
|
|
||||||
self.outerDiv.className += ' show-skipped';
|
|
||||||
} else {
|
|
||||||
self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, '');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) {
|
|
||||||
var results = runner.results();
|
|
||||||
var className = (results.failedCount > 0) ? "runner failed" : "runner passed";
|
|
||||||
this.runnerDiv.setAttribute("class", className);
|
|
||||||
//do it twice for IE
|
|
||||||
this.runnerDiv.setAttribute("className", className);
|
|
||||||
var specs = runner.specs();
|
|
||||||
var specCount = 0;
|
|
||||||
for (var i = 0; i < specs.length; i++) {
|
|
||||||
if (this.specFilter(specs[i])) {
|
|
||||||
specCount++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s");
|
|
||||||
message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s";
|
|
||||||
this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild);
|
|
||||||
|
|
||||||
this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString()));
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) {
|
|
||||||
var results = suite.results();
|
|
||||||
var status = results.passed() ? 'passed' : 'failed';
|
|
||||||
if (results.totalCount === 0) { // todo: change this to check results.skipped
|
|
||||||
status = 'skipped';
|
|
||||||
}
|
|
||||||
this.suiteDivs[suite.id].className += " " + status;
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) {
|
|
||||||
if (this.logRunningSpecs) {
|
|
||||||
this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) {
|
|
||||||
var results = spec.results();
|
|
||||||
var status = results.passed() ? 'passed' : 'failed';
|
|
||||||
if (results.skipped) {
|
|
||||||
status = 'skipped';
|
|
||||||
}
|
|
||||||
var specDiv = this.createDom('div', { className: 'spec ' + status },
|
|
||||||
this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"),
|
|
||||||
this.createDom('a', {
|
|
||||||
className: 'description',
|
|
||||||
href: '?spec=' + encodeURIComponent(spec.getFullName()),
|
|
||||||
title: spec.getFullName()
|
|
||||||
}, spec.description));
|
|
||||||
|
|
||||||
|
|
||||||
var resultItems = results.getItems();
|
|
||||||
var messagesDiv = this.createDom('div', { className: 'messages' });
|
|
||||||
for (var i = 0; i < resultItems.length; i++) {
|
|
||||||
var result = resultItems[i];
|
|
||||||
|
|
||||||
if (result.type == 'log') {
|
|
||||||
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
|
|
||||||
} else if (result.type == 'expect' && result.passed && !result.passed()) {
|
|
||||||
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
|
|
||||||
|
|
||||||
if (result.trace.stack) {
|
|
||||||
messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (messagesDiv.childNodes.length > 0) {
|
|
||||||
specDiv.appendChild(messagesDiv);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.suiteDivs[spec.suite.id].appendChild(specDiv);
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.TrivialReporter.prototype.log = function() {
|
|
||||||
var console = jasmine.getGlobal().console;
|
|
||||||
if (console && console.log) {
|
|
||||||
if (console.log.apply) {
|
|
||||||
console.log.apply(console, arguments);
|
|
||||||
} else {
|
|
||||||
console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.TrivialReporter.prototype.getLocation = function() {
|
|
||||||
return this.document.location;
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.TrivialReporter.prototype.specFilter = function(spec) {
|
|
||||||
var paramMap = {};
|
|
||||||
var params = this.getLocation().search.substring(1).split('&');
|
|
||||||
for (var i = 0; i < params.length; i++) {
|
|
||||||
var p = params[i].split('=');
|
|
||||||
paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!paramMap.spec) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return spec.getFullName().indexOf(paramMap.spec) === 0;
|
|
||||||
};
|
|
@ -1,82 +0,0 @@
|
|||||||
body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; }
|
|
||||||
|
|
||||||
#HTMLReporter { font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333333; }
|
|
||||||
#HTMLReporter a { text-decoration: none; }
|
|
||||||
#HTMLReporter a:hover { text-decoration: underline; }
|
|
||||||
#HTMLReporter p, #HTMLReporter h1, #HTMLReporter h2, #HTMLReporter h3, #HTMLReporter h4, #HTMLReporter h5, #HTMLReporter h6 { margin: 0; line-height: 14px; }
|
|
||||||
#HTMLReporter .banner, #HTMLReporter .symbolSummary, #HTMLReporter .summary, #HTMLReporter .resultMessage, #HTMLReporter .specDetail .description, #HTMLReporter .alert .bar, #HTMLReporter .stackTrace { padding-left: 9px; padding-right: 9px; }
|
|
||||||
#HTMLReporter #jasmine_content { position: fixed; right: 100%; }
|
|
||||||
#HTMLReporter .version { color: #aaaaaa; }
|
|
||||||
#HTMLReporter .banner { margin-top: 14px; }
|
|
||||||
#HTMLReporter .duration { color: #aaaaaa; float: right; }
|
|
||||||
#HTMLReporter .symbolSummary { overflow: hidden; *zoom: 1; margin: 14px 0; }
|
|
||||||
#HTMLReporter .symbolSummary li { display: block; float: left; height: 7px; width: 14px; margin-bottom: 7px; font-size: 16px; }
|
|
||||||
#HTMLReporter .symbolSummary li.passed { font-size: 14px; }
|
|
||||||
#HTMLReporter .symbolSummary li.passed:before { color: #5e7d00; content: "\02022"; }
|
|
||||||
#HTMLReporter .symbolSummary li.failed { line-height: 9px; }
|
|
||||||
#HTMLReporter .symbolSummary li.failed:before { color: #b03911; content: "x"; font-weight: bold; margin-left: -1px; }
|
|
||||||
#HTMLReporter .symbolSummary li.skipped { font-size: 14px; }
|
|
||||||
#HTMLReporter .symbolSummary li.skipped:before { color: #bababa; content: "\02022"; }
|
|
||||||
#HTMLReporter .symbolSummary li.pending { line-height: 11px; }
|
|
||||||
#HTMLReporter .symbolSummary li.pending:before { color: #aaaaaa; content: "-"; }
|
|
||||||
#HTMLReporter .exceptions { color: #fff; float: right; margin-top: 5px; margin-right: 5px; }
|
|
||||||
#HTMLReporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; }
|
|
||||||
#HTMLReporter .runningAlert { background-color: #666666; }
|
|
||||||
#HTMLReporter .skippedAlert { background-color: #aaaaaa; }
|
|
||||||
#HTMLReporter .skippedAlert:first-child { background-color: #333333; }
|
|
||||||
#HTMLReporter .skippedAlert:hover { text-decoration: none; color: white; text-decoration: underline; }
|
|
||||||
#HTMLReporter .passingAlert { background-color: #a6b779; }
|
|
||||||
#HTMLReporter .passingAlert:first-child { background-color: #5e7d00; }
|
|
||||||
#HTMLReporter .failingAlert { background-color: #cf867e; }
|
|
||||||
#HTMLReporter .failingAlert:first-child { background-color: #b03911; }
|
|
||||||
#HTMLReporter .results { margin-top: 14px; }
|
|
||||||
#HTMLReporter #details { display: none; }
|
|
||||||
#HTMLReporter .resultsMenu, #HTMLReporter .resultsMenu a { background-color: #fff; color: #333333; }
|
|
||||||
#HTMLReporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; }
|
|
||||||
#HTMLReporter.showDetails .summaryMenuItem:hover { text-decoration: underline; }
|
|
||||||
#HTMLReporter.showDetails .detailsMenuItem { font-weight: bold; text-decoration: underline; }
|
|
||||||
#HTMLReporter.showDetails .summary { display: none; }
|
|
||||||
#HTMLReporter.showDetails #details { display: block; }
|
|
||||||
#HTMLReporter .summaryMenuItem { font-weight: bold; text-decoration: underline; }
|
|
||||||
#HTMLReporter .summary { margin-top: 14px; }
|
|
||||||
#HTMLReporter .summary .suite .suite, #HTMLReporter .summary .specSummary { margin-left: 14px; }
|
|
||||||
#HTMLReporter .summary .specSummary.passed a { color: #5e7d00; }
|
|
||||||
#HTMLReporter .summary .specSummary.failed a { color: #b03911; }
|
|
||||||
#HTMLReporter .description + .suite { margin-top: 0; }
|
|
||||||
#HTMLReporter .suite { margin-top: 14px; }
|
|
||||||
#HTMLReporter .suite a { color: #333333; }
|
|
||||||
#HTMLReporter #details .specDetail { margin-bottom: 28px; }
|
|
||||||
#HTMLReporter #details .specDetail .description { display: block; color: white; background-color: #b03911; }
|
|
||||||
#HTMLReporter .resultMessage { padding-top: 14px; color: #333333; }
|
|
||||||
#HTMLReporter .resultMessage span.result { display: block; }
|
|
||||||
#HTMLReporter .stackTrace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; }
|
|
||||||
|
|
||||||
#TrivialReporter { padding: 8px 13px; position: absolute; top: 0; bottom: 0; left: 0; right: 0; overflow-y: scroll; background-color: white; font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif; /*.resultMessage {*/ /*white-space: pre;*/ /*}*/ }
|
|
||||||
#TrivialReporter a:visited, #TrivialReporter a { color: #303; }
|
|
||||||
#TrivialReporter a:hover, #TrivialReporter a:active { color: blue; }
|
|
||||||
#TrivialReporter .run_spec { float: right; padding-right: 5px; font-size: .8em; text-decoration: none; }
|
|
||||||
#TrivialReporter .banner { color: #303; background-color: #fef; padding: 5px; }
|
|
||||||
#TrivialReporter .logo { float: left; font-size: 1.1em; padding-left: 5px; }
|
|
||||||
#TrivialReporter .logo .version { font-size: .6em; padding-left: 1em; }
|
|
||||||
#TrivialReporter .runner.running { background-color: yellow; }
|
|
||||||
#TrivialReporter .options { text-align: right; font-size: .8em; }
|
|
||||||
#TrivialReporter .suite { border: 1px outset gray; margin: 5px 0; padding-left: 1em; }
|
|
||||||
#TrivialReporter .suite .suite { margin: 5px; }
|
|
||||||
#TrivialReporter .suite.passed { background-color: #dfd; }
|
|
||||||
#TrivialReporter .suite.failed { background-color: #fdd; }
|
|
||||||
#TrivialReporter .spec { margin: 5px; padding-left: 1em; clear: both; }
|
|
||||||
#TrivialReporter .spec.failed, #TrivialReporter .spec.passed, #TrivialReporter .spec.skipped { padding-bottom: 5px; border: 1px solid gray; }
|
|
||||||
#TrivialReporter .spec.failed { background-color: #fbb; border-color: red; }
|
|
||||||
#TrivialReporter .spec.passed { background-color: #bfb; border-color: green; }
|
|
||||||
#TrivialReporter .spec.skipped { background-color: #bbb; }
|
|
||||||
#TrivialReporter .messages { border-left: 1px dashed gray; padding-left: 1em; padding-right: 1em; }
|
|
||||||
#TrivialReporter .passed { background-color: #cfc; display: none; }
|
|
||||||
#TrivialReporter .failed { background-color: #fbb; }
|
|
||||||
#TrivialReporter .skipped { color: #777; background-color: #eee; display: none; }
|
|
||||||
#TrivialReporter .resultMessage span.result { display: block; line-height: 2em; color: black; }
|
|
||||||
#TrivialReporter .resultMessage .mismatch { color: black; }
|
|
||||||
#TrivialReporter .stackTrace { white-space: pre; font-size: .8em; margin-left: 10px; max-height: 5em; overflow: auto; border: 1px inset red; padding: 1em; background: #eef; }
|
|
||||||
#TrivialReporter .finished-at { padding-left: 1em; font-size: .6em; }
|
|
||||||
#TrivialReporter.show-passed .passed, #TrivialReporter.show-skipped .skipped { display: block; }
|
|
||||||
#TrivialReporter #jasmine_content { position: fixed; right: 100%; }
|
|
||||||
#TrivialReporter .runner { border: 1px solid gray; display: block; margin: 5px 0; padding: 2px 0 2px 10px; }
|
|
File diff suppressed because it is too large
Load Diff
521
horizon/static/horizon/lib/jquery/jquery-migrate.js
vendored
521
horizon/static/horizon/lib/jquery/jquery-migrate.js
vendored
@ -1,521 +0,0 @@
|
|||||||
/*!
|
|
||||||
* jQuery Migrate - v1.2.1 - 2013-05-08
|
|
||||||
* https://github.com/jquery/jquery-migrate
|
|
||||||
* Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT
|
|
||||||
*/
|
|
||||||
(function( jQuery, window, undefined ) {
|
|
||||||
// See http://bugs.jquery.com/ticket/13335
|
|
||||||
// "use strict";
|
|
||||||
|
|
||||||
|
|
||||||
var warnedAbout = {};
|
|
||||||
|
|
||||||
// List of warnings already given; public read only
|
|
||||||
jQuery.migrateWarnings = [];
|
|
||||||
|
|
||||||
// Set to true to prevent console output; migrateWarnings still maintained
|
|
||||||
// jQuery.migrateMute = false;
|
|
||||||
|
|
||||||
// Show a message on the console so devs know we're active
|
|
||||||
if ( !jQuery.migrateMute && window.console && window.console.log ) {
|
|
||||||
window.console.log("JQMIGRATE: Logging is active");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set to false to disable traces that appear with warnings
|
|
||||||
if ( jQuery.migrateTrace === undefined ) {
|
|
||||||
jQuery.migrateTrace = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Forget any warnings we've already given; public
|
|
||||||
jQuery.migrateReset = function() {
|
|
||||||
warnedAbout = {};
|
|
||||||
jQuery.migrateWarnings.length = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
function migrateWarn( msg) {
|
|
||||||
var console = window.console;
|
|
||||||
if ( !warnedAbout[ msg ] ) {
|
|
||||||
warnedAbout[ msg ] = true;
|
|
||||||
jQuery.migrateWarnings.push( msg );
|
|
||||||
if ( console && console.warn && !jQuery.migrateMute ) {
|
|
||||||
console.warn( "JQMIGRATE: " + msg );
|
|
||||||
if ( jQuery.migrateTrace && console.trace ) {
|
|
||||||
console.trace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function migrateWarnProp( obj, prop, value, msg ) {
|
|
||||||
if ( Object.defineProperty ) {
|
|
||||||
// On ES5 browsers (non-oldIE), warn if the code tries to get prop;
|
|
||||||
// allow property to be overwritten in case some other plugin wants it
|
|
||||||
try {
|
|
||||||
Object.defineProperty( obj, prop, {
|
|
||||||
configurable: true,
|
|
||||||
enumerable: true,
|
|
||||||
get: function() {
|
|
||||||
migrateWarn( msg );
|
|
||||||
return value;
|
|
||||||
},
|
|
||||||
set: function( newValue ) {
|
|
||||||
migrateWarn( msg );
|
|
||||||
value = newValue;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
} catch( err ) {
|
|
||||||
// IE8 is a dope about Object.defineProperty, can't warn there
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Non-ES5 (or broken) browser; just set the property
|
|
||||||
jQuery._definePropertyBroken = true;
|
|
||||||
obj[ prop ] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( document.compatMode === "BackCompat" ) {
|
|
||||||
// jQuery has never supported or tested Quirks Mode
|
|
||||||
migrateWarn( "jQuery is not compatible with Quirks Mode" );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
var attrFn = jQuery( "<input/>", { size: 1 } ).attr("size") && jQuery.attrFn,
|
|
||||||
oldAttr = jQuery.attr,
|
|
||||||
valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||
|
|
||||||
function() { return null; },
|
|
||||||
valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||
|
|
||||||
function() { return undefined; },
|
|
||||||
rnoType = /^(?:input|button)$/i,
|
|
||||||
rnoAttrNodeType = /^[238]$/,
|
|
||||||
rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
|
|
||||||
ruseDefault = /^(?:checked|selected)$/i;
|
|
||||||
|
|
||||||
// jQuery.attrFn
|
|
||||||
migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" );
|
|
||||||
|
|
||||||
jQuery.attr = function( elem, name, value, pass ) {
|
|
||||||
var lowerName = name.toLowerCase(),
|
|
||||||
nType = elem && elem.nodeType;
|
|
||||||
|
|
||||||
if ( pass ) {
|
|
||||||
// Since pass is used internally, we only warn for new jQuery
|
|
||||||
// versions where there isn't a pass arg in the formal params
|
|
||||||
if ( oldAttr.length < 4 ) {
|
|
||||||
migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
|
|
||||||
}
|
|
||||||
if ( elem && !rnoAttrNodeType.test( nType ) &&
|
|
||||||
(attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {
|
|
||||||
return jQuery( elem )[ name ]( value );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
|
|
||||||
// for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
|
|
||||||
if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
|
|
||||||
migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Restore boolHook for boolean property/attribute synchronization
|
|
||||||
if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
|
|
||||||
jQuery.attrHooks[ lowerName ] = {
|
|
||||||
get: function( elem, name ) {
|
|
||||||
// Align boolean attributes with corresponding properties
|
|
||||||
// Fall back to attribute presence where some booleans are not supported
|
|
||||||
var attrNode,
|
|
||||||
property = jQuery.prop( elem, name );
|
|
||||||
return property === true || typeof property !== "boolean" &&
|
|
||||||
( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
|
|
||||||
|
|
||||||
name.toLowerCase() :
|
|
||||||
undefined;
|
|
||||||
},
|
|
||||||
set: function( elem, value, name ) {
|
|
||||||
var propName;
|
|
||||||
if ( value === false ) {
|
|
||||||
// Remove boolean attributes when set to false
|
|
||||||
jQuery.removeAttr( elem, name );
|
|
||||||
} else {
|
|
||||||
// value is true since we know at this point it's type boolean and not false
|
|
||||||
// Set boolean attributes to the same name and set the DOM property
|
|
||||||
propName = jQuery.propFix[ name ] || name;
|
|
||||||
if ( propName in elem ) {
|
|
||||||
// Only set the IDL specifically if it already exists on the element
|
|
||||||
elem[ propName ] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
elem.setAttribute( name, name.toLowerCase() );
|
|
||||||
}
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Warn only for attributes that can remain distinct from their properties post-1.9
|
|
||||||
if ( ruseDefault.test( lowerName ) ) {
|
|
||||||
migrateWarn( "jQuery.fn.attr('" + lowerName + "') may use property instead of attribute" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return oldAttr.call( jQuery, elem, name, value );
|
|
||||||
};
|
|
||||||
|
|
||||||
// attrHooks: value
|
|
||||||
jQuery.attrHooks.value = {
|
|
||||||
get: function( elem, name ) {
|
|
||||||
var nodeName = ( elem.nodeName || "" ).toLowerCase();
|
|
||||||
if ( nodeName === "button" ) {
|
|
||||||
return valueAttrGet.apply( this, arguments );
|
|
||||||
}
|
|
||||||
if ( nodeName !== "input" && nodeName !== "option" ) {
|
|
||||||
migrateWarn("jQuery.fn.attr('value') no longer gets properties");
|
|
||||||
}
|
|
||||||
return name in elem ?
|
|
||||||
elem.value :
|
|
||||||
null;
|
|
||||||
},
|
|
||||||
set: function( elem, value ) {
|
|
||||||
var nodeName = ( elem.nodeName || "" ).toLowerCase();
|
|
||||||
if ( nodeName === "button" ) {
|
|
||||||
return valueAttrSet.apply( this, arguments );
|
|
||||||
}
|
|
||||||
if ( nodeName !== "input" && nodeName !== "option" ) {
|
|
||||||
migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
|
|
||||||
}
|
|
||||||
// Does not return so that setAttribute is also used
|
|
||||||
elem.value = value;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
var matched, browser,
|
|
||||||
oldInit = jQuery.fn.init,
|
|
||||||
oldParseJSON = jQuery.parseJSON,
|
|
||||||
// Note: XSS check is done below after string is trimmed
|
|
||||||
rquickExpr = /^([^<]*)(<[\w\W]+>)([^>]*)$/;
|
|
||||||
|
|
||||||
// $(html) "looks like html" rule change
|
|
||||||
jQuery.fn.init = function( selector, context, rootjQuery ) {
|
|
||||||
var match;
|
|
||||||
|
|
||||||
if ( selector && typeof selector === "string" && !jQuery.isPlainObject( context ) &&
|
|
||||||
(match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) {
|
|
||||||
// This is an HTML string according to the "old" rules; is it still?
|
|
||||||
if ( selector.charAt( 0 ) !== "<" ) {
|
|
||||||
migrateWarn("$(html) HTML strings must start with '<' character");
|
|
||||||
}
|
|
||||||
if ( match[ 3 ] ) {
|
|
||||||
migrateWarn("$(html) HTML text after last tag is ignored");
|
|
||||||
}
|
|
||||||
// Consistently reject any HTML-like string starting with a hash (#9521)
|
|
||||||
// Note that this may break jQuery 1.6.x code that otherwise would work.
|
|
||||||
if ( match[ 0 ].charAt( 0 ) === "#" ) {
|
|
||||||
migrateWarn("HTML string cannot start with a '#' character");
|
|
||||||
jQuery.error("JQMIGRATE: Invalid selector string (XSS)");
|
|
||||||
}
|
|
||||||
// Now process using loose rules; let pre-1.8 play too
|
|
||||||
if ( context && context.context ) {
|
|
||||||
// jQuery object as context; parseHTML expects a DOM object
|
|
||||||
context = context.context;
|
|
||||||
}
|
|
||||||
if ( jQuery.parseHTML ) {
|
|
||||||
return oldInit.call( this, jQuery.parseHTML( match[ 2 ], context, true ),
|
|
||||||
context, rootjQuery );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return oldInit.apply( this, arguments );
|
|
||||||
};
|
|
||||||
jQuery.fn.init.prototype = jQuery.fn;
|
|
||||||
|
|
||||||
// Let $.parseJSON(falsy_value) return null
|
|
||||||
jQuery.parseJSON = function( json ) {
|
|
||||||
if ( !json && json !== null ) {
|
|
||||||
migrateWarn("jQuery.parseJSON requires a valid JSON string");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return oldParseJSON.apply( this, arguments );
|
|
||||||
};
|
|
||||||
|
|
||||||
jQuery.uaMatch = function( ua ) {
|
|
||||||
ua = ua.toLowerCase();
|
|
||||||
|
|
||||||
var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
|
|
||||||
/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
|
|
||||||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
|
|
||||||
/(msie) ([\w.]+)/.exec( ua ) ||
|
|
||||||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
|
|
||||||
[];
|
|
||||||
|
|
||||||
return {
|
|
||||||
browser: match[ 1 ] || "",
|
|
||||||
version: match[ 2 ] || "0"
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
// Don't clobber any existing jQuery.browser in case it's different
|
|
||||||
if ( !jQuery.browser ) {
|
|
||||||
matched = jQuery.uaMatch( navigator.userAgent );
|
|
||||||
browser = {};
|
|
||||||
|
|
||||||
if ( matched.browser ) {
|
|
||||||
browser[ matched.browser ] = true;
|
|
||||||
browser.version = matched.version;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Chrome is Webkit, but Webkit is also Safari.
|
|
||||||
if ( browser.chrome ) {
|
|
||||||
browser.webkit = true;
|
|
||||||
} else if ( browser.webkit ) {
|
|
||||||
browser.safari = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
jQuery.browser = browser;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warn if the code tries to get jQuery.browser
|
|
||||||
migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" );
|
|
||||||
|
|
||||||
jQuery.sub = function() {
|
|
||||||
function jQuerySub( selector, context ) {
|
|
||||||
return new jQuerySub.fn.init( selector, context );
|
|
||||||
}
|
|
||||||
jQuery.extend( true, jQuerySub, this );
|
|
||||||
jQuerySub.superclass = this;
|
|
||||||
jQuerySub.fn = jQuerySub.prototype = this();
|
|
||||||
jQuerySub.fn.constructor = jQuerySub;
|
|
||||||
jQuerySub.sub = this.sub;
|
|
||||||
jQuerySub.fn.init = function init( selector, context ) {
|
|
||||||
if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
|
|
||||||
context = jQuerySub( context );
|
|
||||||
}
|
|
||||||
|
|
||||||
return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
|
|
||||||
};
|
|
||||||
jQuerySub.fn.init.prototype = jQuerySub.fn;
|
|
||||||
var rootjQuerySub = jQuerySub(document);
|
|
||||||
migrateWarn( "jQuery.sub() is deprecated" );
|
|
||||||
return jQuerySub;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Ensure that $.ajax gets the new parseJSON defined in core.js
|
|
||||||
jQuery.ajaxSetup({
|
|
||||||
converters: {
|
|
||||||
"text json": jQuery.parseJSON
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
var oldFnData = jQuery.fn.data;
|
|
||||||
|
|
||||||
jQuery.fn.data = function( name ) {
|
|
||||||
var ret, evt,
|
|
||||||
elem = this[0];
|
|
||||||
|
|
||||||
// Handles 1.7 which has this behavior and 1.8 which doesn't
|
|
||||||
if ( elem && name === "events" && arguments.length === 1 ) {
|
|
||||||
ret = jQuery.data( elem, name );
|
|
||||||
evt = jQuery._data( elem, name );
|
|
||||||
if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
|
|
||||||
migrateWarn("Use of jQuery.fn.data('events') is deprecated");
|
|
||||||
return evt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return oldFnData.apply( this, arguments );
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
var rscriptType = /\/(java|ecma)script/i,
|
|
||||||
oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
|
|
||||||
|
|
||||||
jQuery.fn.andSelf = function() {
|
|
||||||
migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
|
|
||||||
return oldSelf.apply( this, arguments );
|
|
||||||
};
|
|
||||||
|
|
||||||
// Since jQuery.clean is used internally on older versions, we only shim if it's missing
|
|
||||||
if ( !jQuery.clean ) {
|
|
||||||
jQuery.clean = function( elems, context, fragment, scripts ) {
|
|
||||||
// Set context per 1.8 logic
|
|
||||||
context = context || document;
|
|
||||||
context = !context.nodeType && context[0] || context;
|
|
||||||
context = context.ownerDocument || context;
|
|
||||||
|
|
||||||
migrateWarn("jQuery.clean() is deprecated");
|
|
||||||
|
|
||||||
var i, elem, handleScript, jsTags,
|
|
||||||
ret = [];
|
|
||||||
|
|
||||||
jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );
|
|
||||||
|
|
||||||
// Complex logic lifted directly from jQuery 1.8
|
|
||||||
if ( fragment ) {
|
|
||||||
// Special handling of each script element
|
|
||||||
handleScript = function( elem ) {
|
|
||||||
// Check if we consider it executable
|
|
||||||
if ( !elem.type || rscriptType.test( elem.type ) ) {
|
|
||||||
// Detach the script and store it in the scripts array (if provided) or the fragment
|
|
||||||
// Return truthy to indicate that it has been handled
|
|
||||||
return scripts ?
|
|
||||||
scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
|
|
||||||
fragment.appendChild( elem );
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
for ( i = 0; (elem = ret[i]) != null; i++ ) {
|
|
||||||
// Check if we're done after handling an executable script
|
|
||||||
if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
|
|
||||||
// Append to fragment and handle embedded scripts
|
|
||||||
fragment.appendChild( elem );
|
|
||||||
if ( typeof elem.getElementsByTagName !== "undefined" ) {
|
|
||||||
// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
|
|
||||||
jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
|
|
||||||
|
|
||||||
// Splice the scripts into ret after their former ancestor and advance our index beyond them
|
|
||||||
ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
|
|
||||||
i += jsTags.length;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
var eventAdd = jQuery.event.add,
|
|
||||||
eventRemove = jQuery.event.remove,
|
|
||||||
eventTrigger = jQuery.event.trigger,
|
|
||||||
oldToggle = jQuery.fn.toggle,
|
|
||||||
oldLive = jQuery.fn.live,
|
|
||||||
oldDie = jQuery.fn.die,
|
|
||||||
ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
|
|
||||||
rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
|
|
||||||
rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
|
|
||||||
hoverHack = function( events ) {
|
|
||||||
if ( typeof( events ) !== "string" || jQuery.event.special.hover ) {
|
|
||||||
return events;
|
|
||||||
}
|
|
||||||
if ( rhoverHack.test( events ) ) {
|
|
||||||
migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
|
|
||||||
}
|
|
||||||
return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
|
|
||||||
};
|
|
||||||
|
|
||||||
// Event props removed in 1.9, put them back if needed; no practical way to warn them
|
|
||||||
if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
|
|
||||||
jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
|
|
||||||
if ( jQuery.event.dispatch ) {
|
|
||||||
migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Support for 'hover' pseudo-event and ajax event warnings
|
|
||||||
jQuery.event.add = function( elem, types, handler, data, selector ){
|
|
||||||
if ( elem !== document && rajaxEvent.test( types ) ) {
|
|
||||||
migrateWarn( "AJAX events should be attached to document: " + types );
|
|
||||||
}
|
|
||||||
eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
|
|
||||||
};
|
|
||||||
jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
|
|
||||||
eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
|
|
||||||
};
|
|
||||||
|
|
||||||
jQuery.fn.error = function() {
|
|
||||||
var args = Array.prototype.slice.call( arguments, 0);
|
|
||||||
migrateWarn("jQuery.fn.error() is deprecated");
|
|
||||||
args.splice( 0, 0, "error" );
|
|
||||||
if ( arguments.length ) {
|
|
||||||
return this.bind.apply( this, args );
|
|
||||||
}
|
|
||||||
// error event should not bubble to window, although it does pre-1.7
|
|
||||||
this.triggerHandler.apply( this, args );
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
jQuery.fn.toggle = function( fn, fn2 ) {
|
|
||||||
|
|
||||||
// Don't mess with animation or css toggles
|
|
||||||
if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
|
|
||||||
return oldToggle.apply( this, arguments );
|
|
||||||
}
|
|
||||||
migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
|
|
||||||
|
|
||||||
// Save reference to arguments for access in closure
|
|
||||||
var args = arguments,
|
|
||||||
guid = fn.guid || jQuery.guid++,
|
|
||||||
i = 0,
|
|
||||||
toggler = function( event ) {
|
|
||||||
// Figure out which function to execute
|
|
||||||
var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
|
|
||||||
jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
|
|
||||||
|
|
||||||
// Make sure that clicks stop
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
// and execute the function
|
|
||||||
return args[ lastToggle ].apply( this, arguments ) || false;
|
|
||||||
};
|
|
||||||
|
|
||||||
// link all the functions, so any of them can unbind this click handler
|
|
||||||
toggler.guid = guid;
|
|
||||||
while ( i < args.length ) {
|
|
||||||
args[ i++ ].guid = guid;
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.click( toggler );
|
|
||||||
};
|
|
||||||
|
|
||||||
jQuery.fn.live = function( types, data, fn ) {
|
|
||||||
migrateWarn("jQuery.fn.live() is deprecated");
|
|
||||||
if ( oldLive ) {
|
|
||||||
return oldLive.apply( this, arguments );
|
|
||||||
}
|
|
||||||
jQuery( this.context ).on( types, this.selector, data, fn );
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
jQuery.fn.die = function( types, fn ) {
|
|
||||||
migrateWarn("jQuery.fn.die() is deprecated");
|
|
||||||
if ( oldDie ) {
|
|
||||||
return oldDie.apply( this, arguments );
|
|
||||||
}
|
|
||||||
jQuery( this.context ).off( types, this.selector || "**", fn );
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Turn global events into document-triggered events
|
|
||||||
jQuery.event.trigger = function( event, data, elem, onlyHandlers ){
|
|
||||||
if ( !elem && !rajaxEvent.test( event ) ) {
|
|
||||||
migrateWarn( "Global events are undocumented and deprecated" );
|
|
||||||
}
|
|
||||||
return eventTrigger.call( this, event, data, elem || document, onlyHandlers );
|
|
||||||
};
|
|
||||||
jQuery.each( ajaxEvents.split("|"),
|
|
||||||
function( _, name ) {
|
|
||||||
jQuery.event.special[ name ] = {
|
|
||||||
setup: function() {
|
|
||||||
var elem = this;
|
|
||||||
|
|
||||||
// The document needs no shimming; must be !== for oldIE
|
|
||||||
if ( elem !== document ) {
|
|
||||||
jQuery.event.add( document, name + "." + jQuery.guid, function() {
|
|
||||||
jQuery.event.trigger( name, null, elem, true );
|
|
||||||
});
|
|
||||||
jQuery._data( this, name, jQuery.guid++ );
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
teardown: function() {
|
|
||||||
if ( this !== document ) {
|
|
||||||
jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
})( jQuery, window );
|
|
@ -1,150 +0,0 @@
|
|||||||
(function($, window, document, undefined) {
|
|
||||||
$.fn.quicksearch = function (target, opt) {
|
|
||||||
|
|
||||||
var timeout, cache, rowcache, jq_results, val = '', e = this, options = $.extend({
|
|
||||||
delay: 100,
|
|
||||||
selector: null,
|
|
||||||
stripeRows: null,
|
|
||||||
loader: null,
|
|
||||||
noResults: '',
|
|
||||||
bind: 'keyup',
|
|
||||||
onBefore: function () {
|
|
||||||
return;
|
|
||||||
},
|
|
||||||
onAfter: function () {
|
|
||||||
return;
|
|
||||||
},
|
|
||||||
show: function () {
|
|
||||||
this.style.display = "";
|
|
||||||
},
|
|
||||||
hide: function () {
|
|
||||||
this.style.display = "none";
|
|
||||||
},
|
|
||||||
prepareQuery: function (val) {
|
|
||||||
return val.toLowerCase().split(' ');
|
|
||||||
},
|
|
||||||
testQuery: function (query, txt, _row) {
|
|
||||||
for (var i = 0; i < query.length; i += 1) {
|
|
||||||
if (txt.indexOf(query[i]) === -1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}, opt);
|
|
||||||
|
|
||||||
this.go = function () {
|
|
||||||
|
|
||||||
var i = 0,
|
|
||||||
noresults = true,
|
|
||||||
query = options.prepareQuery(val),
|
|
||||||
val_empty = (val.replace(' ', '').length === 0);
|
|
||||||
|
|
||||||
for (var i = 0, len = rowcache.length; i < len; i++) {
|
|
||||||
if (val_empty || options.testQuery(query, cache[i], rowcache[i])) {
|
|
||||||
options.show.apply(rowcache[i]);
|
|
||||||
noresults = false;
|
|
||||||
} else {
|
|
||||||
options.hide.apply(rowcache[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (noresults) {
|
|
||||||
this.results(false);
|
|
||||||
} else {
|
|
||||||
this.results(true);
|
|
||||||
this.stripe();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.loader(false);
|
|
||||||
options.onAfter();
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.stripe = function () {
|
|
||||||
|
|
||||||
if (typeof options.stripeRows === "object" && options.stripeRows !== null)
|
|
||||||
{
|
|
||||||
var joined = options.stripeRows.join(' ');
|
|
||||||
var stripeRows_length = options.stripeRows.length;
|
|
||||||
|
|
||||||
jq_results.not(':hidden').each(function (i) {
|
|
||||||
$(this).removeClass(joined).addClass(options.stripeRows[i % stripeRows_length]);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.strip_html = function (input) {
|
|
||||||
var output = input.replace(new RegExp('<[^<]+\>', 'g'), "");
|
|
||||||
output = $.trim(output.toLowerCase());
|
|
||||||
return output;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.results = function (bool) {
|
|
||||||
if (typeof options.noResults === "string" && options.noResults !== "") {
|
|
||||||
if (bool) {
|
|
||||||
$(options.noResults).hide();
|
|
||||||
} else {
|
|
||||||
$(options.noResults).show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.loader = function (bool) {
|
|
||||||
if (typeof options.loader === "string" && options.loader !== "") {
|
|
||||||
(bool) ? $(options.loader).show() : $(options.loader).hide();
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.cache = function () {
|
|
||||||
|
|
||||||
jq_results = $(target);
|
|
||||||
|
|
||||||
if (typeof options.noResults === "string" && options.noResults !== "") {
|
|
||||||
jq_results = jq_results.not(options.noResults);
|
|
||||||
}
|
|
||||||
|
|
||||||
var t = (typeof options.selector === "string") ? jq_results.find(options.selector) : $(target).not(options.noResults);
|
|
||||||
cache = t.map(function () {
|
|
||||||
return e.strip_html(this.innerHTML);
|
|
||||||
});
|
|
||||||
|
|
||||||
rowcache = jq_results.map(function () {
|
|
||||||
return this;
|
|
||||||
});
|
|
||||||
|
|
||||||
return this.go();
|
|
||||||
};
|
|
||||||
|
|
||||||
this.trigger = function () {
|
|
||||||
this.loader(true);
|
|
||||||
options.onBefore();
|
|
||||||
|
|
||||||
window.clearTimeout(timeout);
|
|
||||||
timeout = window.setTimeout(function () {
|
|
||||||
e.go();
|
|
||||||
}, options.delay);
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.cache();
|
|
||||||
this.results(true);
|
|
||||||
this.stripe();
|
|
||||||
this.loader(false);
|
|
||||||
|
|
||||||
return this.each(function () {
|
|
||||||
$(this).bind(options.bind, function () {
|
|
||||||
val = $(this).val();
|
|
||||||
e.trigger();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
}(jQuery, this, document));
|
|
File diff suppressed because it is too large
Load Diff
@ -1,99 +0,0 @@
|
|||||||
The MIT License (MIT)
|
|
||||||
Copyright (c) 2013 AllPlayers.com
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in the
|
|
||||||
Software without restriction, including without limitation the rights to use,
|
|
||||||
copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
|
|
||||||
Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
||||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
CONTAINS CODE FROM YUI LIBRARY SEE LICENSE @ http://yuilibrary.com/license/
|
|
||||||
|
|
||||||
The 'jsrsasign'(RSA-Sign JavaScript Library) License
|
|
||||||
|
|
||||||
Copyright (c) 2010-2013 Kenji Urushima
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
Licensing
|
|
||||||
---------
|
|
||||||
|
|
||||||
This software is covered under the following copyright:
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2003-2005 Tom Wu
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
* a copy of this software and associated documentation files (the
|
|
||||||
* "Software"), to deal in the Software without restriction, including
|
|
||||||
* without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
* permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
* the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be
|
|
||||||
* included in all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
|
||||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
|
|
||||||
* INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
|
|
||||||
* RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF
|
|
||||||
* THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT
|
|
||||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
* In addition, the following condition applies:
|
|
||||||
*
|
|
||||||
* All redistributions must retain an intact copy of this copyright notice
|
|
||||||
* and disclaimer.
|
|
||||||
*/
|
|
||||||
|
|
||||||
Address all questions regarding this license to:
|
|
||||||
|
|
||||||
Tom Wu
|
|
||||||
tjw@cs.Stanford.EDU
|
|
||||||
|
|
||||||
ASN.1 JavaScript decoder
|
|
||||||
Copyright (c) 2008-2013 Lapo Luchini <lapo@lapo.it>
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
@ -1,23 +0,0 @@
|
|||||||
JSEncrypt
|
|
||||||
==============
|
|
||||||
|
|
||||||
This directory contains RSA Javascript encryption library.
|
|
||||||
|
|
||||||
Source code
|
|
||||||
==============
|
|
||||||
|
|
||||||
The library source code can be found here:
|
|
||||||
- https://github.com/travist/jsencrypt/
|
|
||||||
|
|
||||||
Version
|
|
||||||
==============
|
|
||||||
|
|
||||||
The library version included here is based on github commit
|
|
||||||
cc1109283b5f9944f77410e80e6789dc298827e1
|
|
||||||
|
|
||||||
Files
|
|
||||||
==============
|
|
||||||
|
|
||||||
- README.md
|
|
||||||
- LICENCE.txt
|
|
||||||
- jsencrypt.js
|
|
File diff suppressed because it is too large
Load Diff
@ -1,238 +0,0 @@
|
|||||||
/**
|
|
||||||
* QUnit v1.9.0pre - A JavaScript Unit Testing Framework
|
|
||||||
*
|
|
||||||
* http://docs.jquery.com/QUnit
|
|
||||||
*
|
|
||||||
* Copyright (c) 2012 John Resig, Jörn Zaefferer
|
|
||||||
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
|
||||||
* or GPL (GPL-LICENSE.txt) licenses.
|
|
||||||
* Pulled Live from Git Sat Jun 23 20:50:01 UTC 2012
|
|
||||||
* Last Commit: 1c0af4e943400de73bc36310d3db42a5217da215
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** Font Family and Sizes */
|
|
||||||
|
|
||||||
#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
|
|
||||||
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
|
|
||||||
#qunit-tests { font-size: smaller; }
|
|
||||||
|
|
||||||
|
|
||||||
/** Resets */
|
|
||||||
|
|
||||||
#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** Header */
|
|
||||||
|
|
||||||
#qunit-header {
|
|
||||||
padding: 0.5em 0 0.5em 1em;
|
|
||||||
|
|
||||||
color: #8699a4;
|
|
||||||
background-color: #0d3349;
|
|
||||||
|
|
||||||
font-size: 1.5em;
|
|
||||||
line-height: 1em;
|
|
||||||
font-weight: normal;
|
|
||||||
|
|
||||||
border-radius: 15px 15px 0 0;
|
|
||||||
-moz-border-radius: 15px 15px 0 0;
|
|
||||||
-webkit-border-top-right-radius: 15px;
|
|
||||||
-webkit-border-top-left-radius: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-header a {
|
|
||||||
text-decoration: none;
|
|
||||||
color: #c2ccd1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-header a:hover,
|
|
||||||
#qunit-header a:focus {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-header label {
|
|
||||||
display: inline-block;
|
|
||||||
padding-left: 0.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-banner {
|
|
||||||
height: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-testrunner-toolbar {
|
|
||||||
padding: 0.5em 0 0.5em 2em;
|
|
||||||
color: #5E740B;
|
|
||||||
background-color: #eee;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-userAgent {
|
|
||||||
padding: 0.5em 0 0.5em 2.5em;
|
|
||||||
background-color: #2b81af;
|
|
||||||
color: #fff;
|
|
||||||
text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** Tests: Pass/Fail */
|
|
||||||
|
|
||||||
#qunit-tests {
|
|
||||||
list-style-position: inside;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests li {
|
|
||||||
padding: 0.4em 0.5em 0.4em 2.5em;
|
|
||||||
border-bottom: 1px solid #fff;
|
|
||||||
list-style-position: inside;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests li strong {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests li a {
|
|
||||||
padding: 0.5em;
|
|
||||||
color: #c2ccd1;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
#qunit-tests li a:hover,
|
|
||||||
#qunit-tests li a:focus {
|
|
||||||
color: #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests ol {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
padding: 0.5em;
|
|
||||||
|
|
||||||
background-color: #fff;
|
|
||||||
|
|
||||||
border-radius: 15px;
|
|
||||||
-moz-border-radius: 15px;
|
|
||||||
-webkit-border-radius: 15px;
|
|
||||||
|
|
||||||
box-shadow: inset 0px 2px 13px #999;
|
|
||||||
-moz-box-shadow: inset 0px 2px 13px #999;
|
|
||||||
-webkit-box-shadow: inset 0px 2px 13px #999;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
margin-top: .2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests th {
|
|
||||||
text-align: right;
|
|
||||||
vertical-align: top;
|
|
||||||
padding: 0 .5em 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests td {
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests pre {
|
|
||||||
margin: 0;
|
|
||||||
white-space: pre-wrap;
|
|
||||||
word-wrap: break-word;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests del {
|
|
||||||
background-color: #e0f2be;
|
|
||||||
color: #374e0c;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests ins {
|
|
||||||
background-color: #ffcaca;
|
|
||||||
color: #500;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*** Test Counts */
|
|
||||||
|
|
||||||
#qunit-tests b.counts { color: black; }
|
|
||||||
#qunit-tests b.passed { color: #5E740B; }
|
|
||||||
#qunit-tests b.failed { color: #710909; }
|
|
||||||
|
|
||||||
#qunit-tests li li {
|
|
||||||
margin: 0.5em;
|
|
||||||
padding: 0.4em 0.5em 0.4em 0.5em;
|
|
||||||
background-color: #fff;
|
|
||||||
border-bottom: none;
|
|
||||||
list-style-position: inside;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*** Passing Styles */
|
|
||||||
|
|
||||||
#qunit-tests li li.pass {
|
|
||||||
color: #5E740B;
|
|
||||||
background-color: #fff;
|
|
||||||
border-left: 26px solid #C6E746;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
|
|
||||||
#qunit-tests .pass .test-name { color: #366097; }
|
|
||||||
|
|
||||||
#qunit-tests .pass .test-actual,
|
|
||||||
#qunit-tests .pass .test-expected { color: #999999; }
|
|
||||||
|
|
||||||
#qunit-banner.qunit-pass { background-color: #C6E746; }
|
|
||||||
|
|
||||||
/*** Failing Styles */
|
|
||||||
|
|
||||||
#qunit-tests li li.fail {
|
|
||||||
color: #710909;
|
|
||||||
background-color: #fff;
|
|
||||||
border-left: 26px solid #EE5757;
|
|
||||||
white-space: pre;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests > li:last-child {
|
|
||||||
border-radius: 0 0 15px 15px;
|
|
||||||
-moz-border-radius: 0 0 15px 15px;
|
|
||||||
-webkit-border-bottom-right-radius: 15px;
|
|
||||||
-webkit-border-bottom-left-radius: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests .fail { color: #000000; background-color: #EE5757; }
|
|
||||||
#qunit-tests .fail .test-name,
|
|
||||||
#qunit-tests .fail .module-name { color: #000000; }
|
|
||||||
|
|
||||||
#qunit-tests .fail .test-actual { color: #EE5757; }
|
|
||||||
#qunit-tests .fail .test-expected { color: green; }
|
|
||||||
|
|
||||||
#qunit-banner.qunit-fail { background-color: #EE5757; }
|
|
||||||
|
|
||||||
|
|
||||||
/** Result */
|
|
||||||
|
|
||||||
#qunit-testresult {
|
|
||||||
padding: 0.5em 0.5em 0.5em 2.5em;
|
|
||||||
|
|
||||||
color: #2b81af;
|
|
||||||
background-color: #D2E0E6;
|
|
||||||
|
|
||||||
border-bottom: 1px solid white;
|
|
||||||
}
|
|
||||||
#qunit-testresult .module-name {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Fixture */
|
|
||||||
|
|
||||||
#qunit-fixture {
|
|
||||||
position: absolute;
|
|
||||||
top: -10000px;
|
|
||||||
left: -10000px;
|
|
||||||
width: 1000px;
|
|
||||||
height: 1000px;
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,17 +0,0 @@
|
|||||||
// jQuery add-on for allowing spin.js to act on jQuery elements directly.
|
|
||||||
|
|
||||||
$.fn.spin = function(opts) {
|
|
||||||
this.each(function() {
|
|
||||||
var $this = $(this),
|
|
||||||
data = $this.data();
|
|
||||||
|
|
||||||
if (data.spinner) {
|
|
||||||
data.spinner.stop();
|
|
||||||
delete data.spinner;
|
|
||||||
}
|
|
||||||
if (opts !== false) {
|
|
||||||
data.spinner = new Spinner($.extend({color: $this.css('color')}, opts)).spin(this);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return this;
|
|
||||||
};
|
|
@ -1,2 +0,0 @@
|
|||||||
//fgnass.github.com/spin.js#v1.2.5
|
|
||||||
(function(a,b,c){function g(a,c){var d=b.createElement(a||"div"),e;for(e in c)d[e]=c[e];return d}function h(a){for(var b=1,c=arguments.length;b<c;b++)a.appendChild(arguments[b]);return a}function j(a,b,c,d){var g=["opacity",b,~~(a*100),c,d].join("-"),h=.01+c/d*100,j=Math.max(1-(1-a)/b*(100-h),a),k=f.substring(0,f.indexOf("Animation")).toLowerCase(),l=k&&"-"+k+"-"||"";return e[g]||(i.insertRule("@"+l+"keyframes "+g+"{"+"0%{opacity:"+j+"}"+h+"%{opacity:"+a+"}"+(h+.01)+"%{opacity:1}"+(h+b)%100+"%{opacity:"+a+"}"+"100%{opacity:"+j+"}"+"}",0),e[g]=1),g}function k(a,b){var e=a.style,f,g;if(e[b]!==c)return b;b=b.charAt(0).toUpperCase()+b.slice(1);for(g=0;g<d.length;g++){f=d[g]+b;if(e[f]!==c)return f}}function l(a,b){for(var c in b)a.style[k(a,c)||c]=b[c];return a}function m(a){for(var b=1;b<arguments.length;b++){var d=arguments[b];for(var e in d)a[e]===c&&(a[e]=d[e])}return a}function n(a){var b={x:a.offsetLeft,y:a.offsetTop};while(a=a.offsetParent)b.x+=a.offsetLeft,b.y+=a.offsetTop;return b}var d=["webkit","Moz","ms","O"],e={},f,i=function(){var a=g("style");return h(b.getElementsByTagName("head")[0],a),a.sheet||a.styleSheet}(),o={lines:12,length:7,width:5,radius:10,rotate:0,color:"#000",speed:1,trail:100,opacity:.25,fps:20,zIndex:2e9,className:"spinner",top:"auto",left:"auto"},p=function q(a){if(!this.spin)return new q(a);this.opts=m(a||{},q.defaults,o)};p.defaults={},m(p.prototype,{spin:function(a){this.stop();var b=this,c=b.opts,d=b.el=l(g(0,{className:c.className}),{position:"relative",zIndex:c.zIndex}),e=c.radius+c.length+c.width,h,i;a&&(a.insertBefore(d,a.firstChild||null),i=n(a),h=n(d),l(d,{left:(c.left=="auto"?i.x-h.x+(a.offsetWidth>>1):c.left+e)+"px",top:(c.top=="auto"?i.y-h.y+(a.offsetHeight>>1):c.top+e)+"px"})),d.setAttribute("aria-role","progressbar"),b.lines(d,b.opts);if(!f){var j=0,k=c.fps,m=k/c.speed,o=(1-c.opacity)/(m*c.trail/100),p=m/c.lines;!function q(){j++;for(var a=c.lines;a;a--){var e=Math.max(1-(j+a*p)%m*o,c.opacity);b.opacity(d,c.lines-a,e,c)}b.timeout=b.el&&setTimeout(q,~~(1e3/k))}()}return b},stop:function(){var a=this.el;return a&&(clearTimeout(this.timeout),a.parentNode&&a.parentNode.removeChild(a),this.el=c),this},lines:function(a,b){function e(a,d){return l(g(),{position:"absolute",width:b.length+b.width+"px",height:b.width+"px",background:a,boxShadow:d,transformOrigin:"left",transform:"rotate("+~~(360/b.lines*c+b.rotate)+"deg) translate("+b.radius+"px"+",0)",borderRadius:(b.width>>1)+"px"})}var c=0,d;for(;c<b.lines;c++)d=l(g(),{position:"absolute",top:1+~(b.width/2)+"px",transform:b.hwaccel?"translate3d(0,0,0)":"",opacity:b.opacity,animation:f&&j(b.opacity,b.trail,c,b.lines)+" "+1/b.speed+"s linear infinite"}),b.shadow&&h(d,l(e("#000","0 0 4px #000"),{top:"2px"})),h(a,h(d,e(b.color,"0 0 1px rgba(0,0,0,.1)")));return a},opacity:function(a,b,c){b<a.childNodes.length&&(a.childNodes[b].style.opacity=c)}}),!function(){function a(a,b){return g("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">',b)}var b=l(g("group"),{behavior:"url(#default#VML)"});!k(b,"transform")&&b.adj?(i.addRule(".spin-vml","behavior:url(#default#VML)"),p.prototype.lines=function(b,c){function f(){return l(a("group",{coordsize:e+" "+e,coordorigin:-d+" "+ -d}),{width:e,height:e})}function k(b,e,g){h(i,h(l(f(),{rotation:360/c.lines*b+"deg",left:~~e}),h(l(a("roundrect",{arcsize:1}),{width:d,height:c.width,left:c.radius,top:-c.width>>1,filter:g}),a("fill",{color:c.color,opacity:c.opacity}),a("stroke",{opacity:0}))))}var d=c.length+c.width,e=2*d,g=-(c.width+c.length)*2+"px",i=l(f(),{position:"absolute",top:g,left:g}),j;if(c.shadow)for(j=1;j<=c.lines;j++)k(j,-2,"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");for(j=1;j<=c.lines;j++)k(j);return h(b,i)},p.prototype.opacity=function(a,b,c,d){var e=a.firstChild;d=d.shadow&&d.lines||0,e&&b+d<e.childNodes.length&&(e=e.childNodes[b+d],e=e&&e.firstChild,e=e&&e.firstChild,e&&(e.opacity=c))}):f=k(b,"animation")}(),a.Spinner=p})(window,document);
|
|
@ -29,7 +29,7 @@
|
|||||||
<script src="{{ STATIC_URL }}bootstrap/js/bootstrap.js" type="text/javascript" charset="utf-8"></script>
|
<script src="{{ STATIC_URL }}bootstrap/js/bootstrap.js" type="text/javascript" charset="utf-8"></script>
|
||||||
<script src='{{ STATIC_URL }}bootstrap/js/bootstrap-datepicker.js' type='text/javascript' charset='utf-8'></script>
|
<script src='{{ STATIC_URL }}bootstrap/js/bootstrap-datepicker.js' type='text/javascript' charset='utf-8'></script>
|
||||||
|
|
||||||
<script src="{{ STATIC_URL }}horizon/lib/hogan-2.0.0.js" type="text/javascript" charset='utf-8'></script>
|
<script src="{{ STATIC_URL }}horizon/lib/hogan.js" type="text/javascript" charset='utf-8'></script>
|
||||||
|
|
||||||
<script src='{{ STATIC_URL }}horizon/js/horizon.accordion_nav.js' type='text/javascript' charset='utf-8'></script>
|
<script src='{{ STATIC_URL }}horizon/js/horizon.accordion_nav.js' type='text/javascript' charset='utf-8'></script>
|
||||||
<script src='{{ STATIC_URL }}horizon/js/horizon.communication.js' type='text/javascript' charset='utf-8'></script>
|
<script src='{{ STATIC_URL }}horizon/js/horizon.communication.js' type='text/javascript' charset='utf-8'></script>
|
||||||
|
@ -23,11 +23,23 @@ import sys
|
|||||||
import django
|
import django
|
||||||
from django.utils import html_parser
|
from django.utils import html_parser
|
||||||
import xstatic.main
|
import xstatic.main
|
||||||
|
import xstatic.pkg.angular
|
||||||
|
import xstatic.pkg.angular_cookies
|
||||||
|
import xstatic.pkg.angular_mock
|
||||||
|
import xstatic.pkg.d3
|
||||||
|
import xstatic.pkg.hogan
|
||||||
|
import xstatic.pkg.jasmine
|
||||||
import xstatic.pkg.jquery
|
import xstatic.pkg.jquery
|
||||||
|
import xstatic.pkg.jquery_migrate
|
||||||
|
import xstatic.pkg.jquery_quicksearch
|
||||||
|
import xstatic.pkg.jquery_tablesorter
|
||||||
|
import xstatic.pkg.jsencrypt
|
||||||
|
import xstatic.pkg.qunit
|
||||||
|
import xstatic.pkg.rickshaw
|
||||||
|
import xstatic.pkg.spin
|
||||||
|
|
||||||
from horizon.test import patches
|
from horizon.test import patches
|
||||||
|
|
||||||
|
|
||||||
# Patch django.utils.html_parser.HTMLParser as a workaround for bug 1273943
|
# Patch django.utils.html_parser.HTMLParser as a workaround for bug 1273943
|
||||||
if django.get_version() == '1.4' and sys.version_info[:3] > (2, 7, 3):
|
if django.get_version() == '1.4' and sys.version_info[:3] > (2, 7, 3):
|
||||||
html_parser.HTMLParser.parse_starttag = patches.parse_starttag_patched
|
html_parser.HTMLParser.parse_starttag = patches.parse_starttag_patched
|
||||||
@ -140,7 +152,34 @@ STATICFILES_FINDERS = (
|
|||||||
)
|
)
|
||||||
|
|
||||||
STATICFILES_DIRS = (
|
STATICFILES_DIRS = (
|
||||||
('horizon/lib/jquery', xstatic.main.XStatic(xstatic.pkg.jquery).base_dir),
|
('horizon/lib/angular',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.angular).base_dir),
|
||||||
|
('horizon/lib/angular',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.angular_cookies).base_dir),
|
||||||
|
('horizon/lib/angular',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.angular_mock).base_dir),
|
||||||
|
('horizon/lib',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.d3).base_dir),
|
||||||
|
('horizon/lib',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.hogan).base_dir),
|
||||||
|
('horizon/lib/jasmine-1.3.1',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.jasmine).base_dir),
|
||||||
|
('horizon/lib/jquery',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.jquery).base_dir),
|
||||||
|
('horizon/lib/jquery',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.jquery_migrate).base_dir),
|
||||||
|
('horizon/lib/jquery',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.jquery_quicksearch).base_dir),
|
||||||
|
('horizon/lib/jquery',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.jquery_tablesorter).base_dir),
|
||||||
|
('horizon/lib/jsencrypt',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.jsencrypt).base_dir),
|
||||||
|
('horizon/lib/qunit',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.qunit).base_dir),
|
||||||
|
('horizon/lib',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.rickshaw).base_dir),
|
||||||
|
('horizon/lib',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.spin).base_dir),
|
||||||
)
|
)
|
||||||
|
|
||||||
LOGGING = {
|
LOGGING = {
|
||||||
|
@ -23,7 +23,20 @@ import warnings
|
|||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
import xstatic.main
|
import xstatic.main
|
||||||
|
import xstatic.pkg.angular
|
||||||
|
import xstatic.pkg.angular_cookies
|
||||||
|
import xstatic.pkg.angular_mock
|
||||||
|
import xstatic.pkg.d3
|
||||||
|
import xstatic.pkg.hogan
|
||||||
|
import xstatic.pkg.jasmine
|
||||||
import xstatic.pkg.jquery
|
import xstatic.pkg.jquery
|
||||||
|
import xstatic.pkg.jquery_migrate
|
||||||
|
import xstatic.pkg.jquery_quicksearch
|
||||||
|
import xstatic.pkg.jquery_tablesorter
|
||||||
|
import xstatic.pkg.jsencrypt
|
||||||
|
import xstatic.pkg.qunit
|
||||||
|
import xstatic.pkg.rickshaw
|
||||||
|
import xstatic.pkg.spin
|
||||||
|
|
||||||
from openstack_dashboard import exceptions
|
from openstack_dashboard import exceptions
|
||||||
|
|
||||||
@ -136,7 +149,34 @@ STATICFILES_FINDERS = (
|
|||||||
)
|
)
|
||||||
|
|
||||||
STATICFILES_DIRS = (
|
STATICFILES_DIRS = (
|
||||||
('horizon/lib/jquery', xstatic.main.XStatic(xstatic.pkg.jquery).base_dir),
|
('horizon/lib/angular',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.angular).base_dir),
|
||||||
|
('horizon/lib/angular',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.angular_cookies).base_dir),
|
||||||
|
('horizon/lib/angular',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.angular_mock).base_dir),
|
||||||
|
('horizon/lib',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.d3).base_dir),
|
||||||
|
('horizon/lib',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.hogan).base_dir),
|
||||||
|
('horizon/lib/jasmine-1.3.1',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.jasmine).base_dir),
|
||||||
|
('horizon/lib/jquery',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.jquery).base_dir),
|
||||||
|
('horizon/lib/jquery',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.jquery_migrate).base_dir),
|
||||||
|
('horizon/lib/jquery',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.jquery_quicksearch).base_dir),
|
||||||
|
('horizon/lib/jquery',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.jquery_tablesorter).base_dir),
|
||||||
|
('horizon/lib/jsencrypt',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.jsencrypt).base_dir),
|
||||||
|
('horizon/lib/qunit',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.qunit).base_dir),
|
||||||
|
('horizon/lib',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.rickshaw).base_dir),
|
||||||
|
('horizon/lib',
|
||||||
|
xstatic.main.XStatic(xstatic.pkg.spin).base_dir),
|
||||||
)
|
)
|
||||||
|
|
||||||
COMPRESS_PRECOMPILERS = (
|
COMPRESS_PRECOMPILERS = (
|
||||||
|
@ -32,4 +32,17 @@ python-troveclient>=1.0.4
|
|||||||
pytz>=2010h
|
pytz>=2010h
|
||||||
six>=1.7.0
|
six>=1.7.0
|
||||||
xstatic>=1.0.0 # MIT License
|
xstatic>=1.0.0 # MIT License
|
||||||
|
xstatic-angular>=1.2.1.1 # MIT License
|
||||||
|
xstatic-angular-cookies>=1.2.1.1 # MIT License
|
||||||
|
xstatic-angular-mock>=1.2.1.1 # MIT License
|
||||||
|
xstatic-d3>=3.1.6.2 # BSD License (3 clause)
|
||||||
|
xstatic-hogan>=2.0.0.2 # Apache 2.0 License
|
||||||
|
xstatic-jasmine>=1.3.1.1 # MIT License
|
||||||
xstatic-jquery>=1.7.2 # MIT License
|
xstatic-jquery>=1.7.2 # MIT License
|
||||||
|
xstatic-jquery-migrate>=1.2.1.1 # MIT License
|
||||||
|
xstatic-jquery.quicksearch>=2.0.3.1 # MIT License
|
||||||
|
xstatic-jquery.tablesorter>=2.0.5b.0 # MIT License
|
||||||
|
xstatic-jsencrypt>=2.0.0.2 # MIT License
|
||||||
|
xstatic-qunit>=1.14.0.2 # MIT License
|
||||||
|
xstatic-rickshaw>=1.4.6.2 # BSD License (prior)
|
||||||
|
xstatic-spin>=1.2.5.2 # MIT License
|
||||||
|
@ -6,7 +6,7 @@ set -o errexit
|
|||||||
# Increment me any time the environment should be rebuilt.
|
# Increment me any time the environment should be rebuilt.
|
||||||
# This includes dependency changes, directory renames, etc.
|
# This includes dependency changes, directory renames, etc.
|
||||||
# Simple integer sequence: 1, 2, 3...
|
# Simple integer sequence: 1, 2, 3...
|
||||||
environment_version=43
|
environment_version=44
|
||||||
#--------------------------------------------------------#
|
#--------------------------------------------------------#
|
||||||
|
|
||||||
function usage {
|
function usage {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user