Update javascripts
This commit is contained in:
parent
5d35b3271f
commit
19cbbe4372
2
Makefile
2
Makefile
|
@ -201,7 +201,7 @@ MANAGERJSONDST=$(SRCMANAGERDIR)/site/htdocs/static/struct.json \
|
|||
# Javascript and CSS to minify
|
||||
JSSRCFILES:=$(shell find */site/htdocs/static/js $(SRCPORTALDIR)/site/htdocs/static -type f -name '*.js' ! -name '*.min.js') \
|
||||
$(SRCMANAGERDIR)/site/htdocs/static/bwr/file-saver.js/FileSaver.js
|
||||
CSSSRCFILES:=$(shell find */site/htdocs/static/css $(SRCPORTALDIR)/site/htdocs/static -type f -name '*.css' ! -name '*.min.css')
|
||||
CSSSRCFILES:=$(shell find $(SRCMANAGERDIR)/site/htdocs/static $(SRCPORTALDIR)/site/htdocs/static -type f -name '*.css' ! -name '*.min.css')
|
||||
|
||||
# Coffee files
|
||||
MANAGERCOFFEESRCFILES:=$(shell find lemonldap-ng-manager/site/coffee -type f -name '*.coffee')
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* @license Angular UI Tree v2.22.5
|
||||
* @license Angular UI Tree v2.22.6
|
||||
* (c) 2010-2017. https://github.com/angular-ui-tree/angular-ui-tree
|
||||
* License: MIT
|
||||
*/
|
||||
|
@ -10,6 +10,7 @@
|
|||
.constant('treeConfig', {
|
||||
treeClass: 'angular-ui-tree',
|
||||
emptyTreeClass: 'angular-ui-tree-empty',
|
||||
dropzoneClass: 'angular-ui-tree-dropzone',
|
||||
hiddenClass: 'angular-ui-tree-hidden',
|
||||
nodesClass: 'angular-ui-tree-nodes',
|
||||
nodeClass: 'angular-ui-tree-node',
|
||||
|
@ -197,8 +198,8 @@
|
|||
|
||||
angular.module('ui.tree')
|
||||
|
||||
.controller('TreeNodesController', ['$scope', '$element',
|
||||
function ($scope, $element) {
|
||||
.controller('TreeNodesController', ['$scope', '$element', '$timeout',
|
||||
function ($scope, $element, $timeout) {
|
||||
this.scope = $scope;
|
||||
|
||||
$scope.$element = $element;
|
||||
|
@ -242,22 +243,11 @@
|
|||
return $scope.$modelValue.length > 0;
|
||||
};
|
||||
|
||||
$scope.safeApply = function (fn) {
|
||||
var phase = this.$root.$$phase;
|
||||
if (phase == '$apply' || phase == '$digest') {
|
||||
if (fn && (typeof (fn) === 'function')) {
|
||||
fn();
|
||||
}
|
||||
} else {
|
||||
this.$apply(fn);
|
||||
}
|
||||
};
|
||||
|
||||
//Called in apply method of UiTreeHelper.dragInfo.
|
||||
$scope.removeNode = function (node) {
|
||||
var index = $scope.$modelValue.indexOf(node.$modelValue);
|
||||
if (index > -1) {
|
||||
$scope.safeApply(function () {
|
||||
$timeout(function () {
|
||||
$scope.$modelValue.splice(index, 1)[0];
|
||||
});
|
||||
return $scope.$treeScope.$callbacks.removed(node);
|
||||
|
@ -267,7 +257,7 @@
|
|||
|
||||
//Called in apply method of UiTreeHelper.dragInfo.
|
||||
$scope.insertNode = function (index, nodeData) {
|
||||
$scope.safeApply(function () {
|
||||
$timeout(function () {
|
||||
$scope.$modelValue.splice(index, 0, nodeData);
|
||||
});
|
||||
};
|
||||
|
@ -315,6 +305,7 @@
|
|||
$scope.$nodesScope = null; // root nodes
|
||||
$scope.$type = 'uiTree';
|
||||
$scope.$emptyElm = null;
|
||||
$scope.$dropzoneElm = null;
|
||||
$scope.$callbacks = null;
|
||||
|
||||
$scope.dragEnabled = true;
|
||||
|
@ -323,6 +314,7 @@
|
|||
$scope.dragDelay = 0;
|
||||
$scope.cloneEnabled = false;
|
||||
$scope.nodropEnabled = false;
|
||||
$scope.dropzoneEnabled = false;
|
||||
|
||||
// Check if it's a empty tree
|
||||
$scope.isEmpty = function () {
|
||||
|
@ -345,7 +337,17 @@
|
|||
}
|
||||
};
|
||||
|
||||
this.resetDropzoneElement = function () {
|
||||
if ((!$scope.$nodesScope.$modelValue || $scope.$nodesScope.$modelValue.length !== 0) &&
|
||||
$scope.dropzoneEnabled) {
|
||||
$element.append($scope.$dropzoneElm);
|
||||
} else {
|
||||
$scope.$dropzoneElm.remove();
|
||||
}
|
||||
};
|
||||
|
||||
$scope.resetEmptyElement = this.resetEmptyElement;
|
||||
$scope.resetDropzoneElement = this.resetDropzoneElement;
|
||||
}
|
||||
]);
|
||||
})();
|
||||
|
@ -396,11 +398,15 @@
|
|||
scope.$emptyElm.append(tdElm);
|
||||
} else {
|
||||
scope.$emptyElm = angular.element($window.document.createElement('div'));
|
||||
scope.$dropzoneElm = angular.element($window.document.createElement('div'));
|
||||
}
|
||||
|
||||
if (config.emptyTreeClass) {
|
||||
scope.$emptyElm.addClass(config.emptyTreeClass);
|
||||
}
|
||||
if (config.dropzoneClass) {
|
||||
scope.$dropzoneElm.addClass(config.dropzoneClass);
|
||||
}
|
||||
|
||||
scope.$watch('$nodesScope.$modelValue.length', function (val) {
|
||||
if (!angular.isNumber(val)) {
|
||||
|
@ -408,6 +414,7 @@
|
|||
}
|
||||
|
||||
ctrl.resetEmptyElement();
|
||||
ctrl.resetDropzoneElement();
|
||||
}, true);
|
||||
|
||||
scope.$watch(attrs.dragEnabled, function (val) {
|
||||
|
@ -429,6 +436,13 @@
|
|||
}
|
||||
});
|
||||
|
||||
scope.$watch(attrs.dropzoneEnabled, function (val) {
|
||||
if ((typeof val) == 'boolean') {
|
||||
scope.dropzoneEnabled = val;
|
||||
ctrl.resetDropzoneElement();
|
||||
}
|
||||
});
|
||||
|
||||
scope.$watch(attrs.cloneEnabled, function (val) {
|
||||
if ((typeof val) == 'boolean') {
|
||||
scope.cloneEnabled = val;
|
||||
|
@ -902,7 +916,8 @@
|
|||
targetBeforeBuffer,
|
||||
targetHeight,
|
||||
targetChildElm,
|
||||
targetChildHeight;
|
||||
targetChildHeight,
|
||||
isDropzone;
|
||||
|
||||
//If check ensures that drag element was created.
|
||||
if (dragElm) {
|
||||
|
@ -1040,6 +1055,9 @@
|
|||
targetNode = targetElm.controller('uiTreeNodes').scope;
|
||||
} else if (UiTreeHelper.elementIsPlaceholder(targetElm)) {
|
||||
targetNode = targetElm.controller('uiTreeNodes').scope;
|
||||
} else if (UiTreeHelper.elementIsDropzone(targetElm)) {
|
||||
targetNode = targetElm.controller('uiTree').scope;
|
||||
isDropzone = true;
|
||||
} else if (targetElm.controller('uiTreeNode')) {
|
||||
//Is a child element of a node.
|
||||
targetNode = targetElm.controller('uiTreeNode').scope;
|
||||
|
@ -1106,8 +1124,8 @@
|
|||
targetNode = targetNode.$nodeScope;
|
||||
}
|
||||
|
||||
//Check if it is a uiTreeNode or it's an empty tree.
|
||||
if (targetNode.$type !== 'uiTreeNode' && !isEmpty) {
|
||||
//Check if it is a uiTreeNode or it's an empty tree or it's a dropzone.
|
||||
if (targetNode.$type !== 'uiTreeNode' && !isEmpty && !isDropzone) {
|
||||
|
||||
// Allow node to return to its original position if no longer hovering over target
|
||||
if (config.appendChildOnHover) {
|
||||
|
@ -1125,6 +1143,7 @@
|
|||
//If placeholder move from empty tree, reset it.
|
||||
if (treeScope && placeElm.parent()[0] != treeScope.$element[0]) {
|
||||
treeScope.resetEmptyElement();
|
||||
treeScope.resetDropzoneElement();
|
||||
treeScope = null;
|
||||
}
|
||||
|
||||
|
@ -1132,9 +1151,14 @@
|
|||
if (isEmpty) {
|
||||
treeScope = targetNode;
|
||||
if (targetNode.$nodesScope.accept(scope, 0)) {
|
||||
targetNode.place(placeElm);
|
||||
dragInfo.moveTo(targetNode.$nodesScope, targetNode.$nodesScope.childNodes(), 0);
|
||||
}
|
||||
//It's a dropzone
|
||||
} else if (isDropzone) {
|
||||
treeScope = targetNode;
|
||||
if (targetNode.$nodesScope.accept(scope, targetNode.$nodesScope.childNodes().length)) {
|
||||
dragInfo.moveTo(targetNode.$nodesScope, targetNode.$nodesScope.childNodes(), targetNode.$nodesScope.childNodes().length);
|
||||
}
|
||||
//Not empty and drag enabled.
|
||||
} else if (targetNode.dragEnabled()) {
|
||||
|
||||
|
@ -1791,6 +1815,9 @@
|
|||
elementIsPlaceholder: function (element) {
|
||||
return element.hasClass(treeConfig.placeholderClass);
|
||||
},
|
||||
elementIsDropzone: function (element) {
|
||||
return element.hasClass(treeConfig.dropzoneClass);
|
||||
},
|
||||
elementContainsTreeNodeHandler: function (element) {
|
||||
return element[0].querySelectorAll('[ui-tree-handle]').length >= 1;
|
||||
},
|
||||
|
|
|
@ -1 +1 @@
|
|||
.angular-ui-tree-empty{border:1px dashed #bbb;min-height:100px;background-color:#e5e5e5;background-image:-webkit-linear-gradient(45deg,#fff 25%,transparent 0,transparent 75%,#fff 0,#fff),-webkit-linear-gradient(45deg,#fff 25%,transparent 0,transparent 75%,#fff 0,#fff);background-image:linear-gradient(45deg,#fff 25%,transparent 0,transparent 75%,#fff 0,#fff),linear-gradient(45deg,#fff 25%,transparent 0,transparent 75%,#fff 0,#fff);background-size:60px 60px;background-position:0 0,30px 30px;pointer-events:none}.angular-ui-tree-nodes{position:relative;margin:0;padding:0;list-style:none}.angular-ui-tree-nodes .angular-ui-tree-nodes{padding-left:20px}.angular-ui-tree-node,.angular-ui-tree-placeholder{position:relative;margin:0;padding:0;min-height:20px;line-height:20px}.angular-ui-tree-hidden{display:none}.angular-ui-tree-placeholder{margin:10px;padding:0;min-height:30px}.angular-ui-tree-handle{cursor:move;text-decoration:none;font-weight:700;box-sizing:border-box;min-height:20px;line-height:20px}.angular-ui-tree-drag{position:absolute;pointer-events:none;z-index:999;opacity:.8}.angular-ui-tree-drag .tree-node-content{margin-top:0}
|
||||
.angular-ui-tree-dropzone,.angular-ui-tree-empty{border:1px dashed #bbb;min-height:100px;background-color:#e5e5e5;background-image:-webkit-linear-gradient(45deg,#fff 25%,transparent 0,transparent 75%,#fff 0,#fff),-webkit-linear-gradient(45deg,#fff 25%,transparent 0,transparent 75%,#fff 0,#fff);background-image:linear-gradient(45deg,#fff 25%,transparent 0,transparent 75%,#fff 0,#fff),linear-gradient(45deg,#fff 25%,transparent 0,transparent 75%,#fff 0,#fff);background-size:60px 60px;background-position:0 0,30px 30px}.angular-ui-tree-empty{pointer-events:none}.angular-ui-tree-nodes{position:relative;margin:0;padding:0;list-style:none}.angular-ui-tree-nodes .angular-ui-tree-nodes{padding-left:20px}.angular-ui-tree-node,.angular-ui-tree-placeholder{position:relative;margin:0;padding:0;min-height:20px;line-height:20px}.angular-ui-tree-hidden{display:none}.angular-ui-tree-placeholder{margin:10px;padding:0;min-height:30px}.angular-ui-tree-handle{cursor:move;text-decoration:none;font-weight:700;box-sizing:border-box;min-height:20px;line-height:20px}.angular-ui-tree-drag{position:absolute;pointer-events:none;z-index:999;opacity:.8}.angular-ui-tree-drag .tree-node-content{margin-top:0}
|
File diff suppressed because one or more lines are too long
|
@ -1,15 +1,15 @@
|
|||
/*!
|
||||
* jQuery JavaScript Library v3.1.1
|
||||
* jQuery JavaScript Library v3.2.1
|
||||
* https://jquery.com/
|
||||
*
|
||||
* Includes Sizzle.js
|
||||
* https://sizzlejs.com/
|
||||
*
|
||||
* Copyright jQuery Foundation and other contributors
|
||||
* Copyright JS Foundation and other contributors
|
||||
* Released under the MIT license
|
||||
* https://jquery.org/license
|
||||
*
|
||||
* Date: 2016-09-22T22:30Z
|
||||
* Date: 2017-03-20T18:59Z
|
||||
*/
|
||||
( function( global, factory ) {
|
||||
|
||||
|
@ -88,7 +88,7 @@ var support = {};
|
|||
|
||||
|
||||
var
|
||||
version = "3.1.1",
|
||||
version = "3.2.1",
|
||||
|
||||
// Define a local copy of jQuery
|
||||
jQuery = function( selector, context ) {
|
||||
|
@ -236,11 +236,11 @@ jQuery.extend = jQuery.fn.extend = function() {
|
|||
|
||||
// Recurse if we're merging plain objects or arrays
|
||||
if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
|
||||
( copyIsArray = jQuery.isArray( copy ) ) ) ) {
|
||||
( copyIsArray = Array.isArray( copy ) ) ) ) {
|
||||
|
||||
if ( copyIsArray ) {
|
||||
copyIsArray = false;
|
||||
clone = src && jQuery.isArray( src ) ? src : [];
|
||||
clone = src && Array.isArray( src ) ? src : [];
|
||||
|
||||
} else {
|
||||
clone = src && jQuery.isPlainObject( src ) ? src : {};
|
||||
|
@ -279,8 +279,6 @@ jQuery.extend( {
|
|||
return jQuery.type( obj ) === "function";
|
||||
},
|
||||
|
||||
isArray: Array.isArray,
|
||||
|
||||
isWindow: function( obj ) {
|
||||
return obj != null && obj === obj.window;
|
||||
},
|
||||
|
@ -355,10 +353,6 @@ jQuery.extend( {
|
|||
return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
|
||||
},
|
||||
|
||||
nodeName: function( elem, name ) {
|
||||
return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
|
||||
},
|
||||
|
||||
each: function( obj, callback ) {
|
||||
var length, i = 0;
|
||||
|
||||
|
@ -2843,6 +2837,13 @@ var siblings = function( n, elem ) {
|
|||
|
||||
var rneedsContext = jQuery.expr.match.needsContext;
|
||||
|
||||
|
||||
|
||||
function nodeName( elem, name ) {
|
||||
|
||||
return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
|
||||
|
||||
};
|
||||
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
|
||||
|
||||
|
||||
|
@ -3194,7 +3195,18 @@ jQuery.each( {
|
|||
return siblings( elem.firstChild );
|
||||
},
|
||||
contents: function( elem ) {
|
||||
return elem.contentDocument || jQuery.merge( [], elem.childNodes );
|
||||
if ( nodeName( elem, "iframe" ) ) {
|
||||
return elem.contentDocument;
|
||||
}
|
||||
|
||||
// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
|
||||
// Treat the template element as a regular one in browsers that
|
||||
// don't support it.
|
||||
if ( nodeName( elem, "template" ) ) {
|
||||
elem = elem.content || elem;
|
||||
}
|
||||
|
||||
return jQuery.merge( [], elem.childNodes );
|
||||
}
|
||||
}, function( name, fn ) {
|
||||
jQuery.fn[ name ] = function( until, selector ) {
|
||||
|
@ -3292,7 +3304,7 @@ jQuery.Callbacks = function( options ) {
|
|||
fire = function() {
|
||||
|
||||
// Enforce single-firing
|
||||
locked = options.once;
|
||||
locked = locked || options.once;
|
||||
|
||||
// Execute callbacks for all pending executions,
|
||||
// respecting firingIndex overrides and runtime changes
|
||||
|
@ -3461,7 +3473,7 @@ function Thrower( ex ) {
|
|||
throw ex;
|
||||
}
|
||||
|
||||
function adoptValue( value, resolve, reject ) {
|
||||
function adoptValue( value, resolve, reject, noValue ) {
|
||||
var method;
|
||||
|
||||
try {
|
||||
|
@ -3477,9 +3489,10 @@ function adoptValue( value, resolve, reject ) {
|
|||
// Other non-thenables
|
||||
} else {
|
||||
|
||||
// Support: Android 4.0 only
|
||||
// Strict mode functions invoked without .call/.apply get global-object context
|
||||
resolve.call( undefined, value );
|
||||
// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
|
||||
// * false: [ value ].slice( 0 ) => resolve( value )
|
||||
// * true: [ value ].slice( 1 ) => resolve()
|
||||
resolve.apply( undefined, [ value ].slice( noValue ) );
|
||||
}
|
||||
|
||||
// For Promises/A+, convert exceptions into rejections
|
||||
|
@ -3489,7 +3502,7 @@ function adoptValue( value, resolve, reject ) {
|
|||
|
||||
// Support: Android 4.0 only
|
||||
// Strict mode functions invoked without .call/.apply get global-object context
|
||||
reject.call( undefined, value );
|
||||
reject.apply( undefined, [ value ] );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3814,7 +3827,8 @@ jQuery.extend( {
|
|||
|
||||
// Single- and empty arguments are adopted like Promise.resolve
|
||||
if ( remaining <= 1 ) {
|
||||
adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject );
|
||||
adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
|
||||
!remaining );
|
||||
|
||||
// Use .then() to unwrap secondary thenables (cf. gh-3000)
|
||||
if ( master.state() === "pending" ||
|
||||
|
@ -3886,15 +3900,6 @@ jQuery.extend( {
|
|||
// the ready event fires. See #6781
|
||||
readyWait: 1,
|
||||
|
||||
// Hold (or release) the ready event
|
||||
holdReady: function( hold ) {
|
||||
if ( hold ) {
|
||||
jQuery.readyWait++;
|
||||
} else {
|
||||
jQuery.ready( true );
|
||||
}
|
||||
},
|
||||
|
||||
// Handle when the DOM is ready
|
||||
ready: function( wait ) {
|
||||
|
||||
|
@ -4130,7 +4135,7 @@ Data.prototype = {
|
|||
if ( key !== undefined ) {
|
||||
|
||||
// Support array or space separated string of keys
|
||||
if ( jQuery.isArray( key ) ) {
|
||||
if ( Array.isArray( key ) ) {
|
||||
|
||||
// If key is an array of keys...
|
||||
// We always set camelCase keys, so remove that.
|
||||
|
@ -4356,7 +4361,7 @@ jQuery.extend( {
|
|||
|
||||
// Speed up dequeue by getting out quickly if this is just a lookup
|
||||
if ( data ) {
|
||||
if ( !queue || jQuery.isArray( data ) ) {
|
||||
if ( !queue || Array.isArray( data ) ) {
|
||||
queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
|
||||
} else {
|
||||
queue.push( data );
|
||||
|
@ -4733,7 +4738,7 @@ function getAll( context, tag ) {
|
|||
ret = [];
|
||||
}
|
||||
|
||||
if ( tag === undefined || tag && jQuery.nodeName( context, tag ) ) {
|
||||
if ( tag === undefined || tag && nodeName( context, tag ) ) {
|
||||
return jQuery.merge( [ context ], ret );
|
||||
}
|
||||
|
||||
|
@ -5340,7 +5345,7 @@ jQuery.event = {
|
|||
|
||||
// For checkbox, fire native event so checked state will be right
|
||||
trigger: function() {
|
||||
if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
|
||||
if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
|
||||
this.click();
|
||||
return false;
|
||||
}
|
||||
|
@ -5348,7 +5353,7 @@ jQuery.event = {
|
|||
|
||||
// For cross-browser consistency, don't fire native .click() on links
|
||||
_default: function( event ) {
|
||||
return jQuery.nodeName( event.target, "a" );
|
||||
return nodeName( event.target, "a" );
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -5625,11 +5630,12 @@ var
|
|||
rscriptTypeMasked = /^true\/(.*)/,
|
||||
rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
|
||||
|
||||
// Prefer a tbody over its parent table for containing new rows
|
||||
function manipulationTarget( elem, content ) {
|
||||
if ( jQuery.nodeName( elem, "table" ) &&
|
||||
jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
|
||||
if ( nodeName( elem, "table" ) &&
|
||||
nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
|
||||
|
||||
return elem.getElementsByTagName( "tbody" )[ 0 ] || elem;
|
||||
return jQuery( ">tbody", elem )[ 0 ] || elem;
|
||||
}
|
||||
|
||||
return elem;
|
||||
|
@ -6159,12 +6165,18 @@ var getStyles = function( elem ) {
|
|||
|
||||
function curCSS( elem, name, computed ) {
|
||||
var width, minWidth, maxWidth, ret,
|
||||
|
||||
// Support: Firefox 51+
|
||||
// Retrieving style before computed somehow
|
||||
// fixes an issue with getting wrong values
|
||||
// on detached elements
|
||||
style = elem.style;
|
||||
|
||||
computed = computed || getStyles( elem );
|
||||
|
||||
// Support: IE <=9 only
|
||||
// getPropertyValue is only needed for .css('filter') (#12537)
|
||||
// getPropertyValue is needed for:
|
||||
// .css('filter') (IE 9 only, #12537)
|
||||
// .css('--customProperty) (#3144)
|
||||
if ( computed ) {
|
||||
ret = computed.getPropertyValue( name ) || computed[ name ];
|
||||
|
||||
|
@ -6230,6 +6242,7 @@ var
|
|||
// except "table", "table-cell", or "table-caption"
|
||||
// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
|
||||
rdisplayswap = /^(none|table(?!-c[ea]).+)/,
|
||||
rcustomProp = /^--/,
|
||||
cssShow = { position: "absolute", visibility: "hidden", display: "block" },
|
||||
cssNormalTransform = {
|
||||
letterSpacing: "0",
|
||||
|
@ -6259,6 +6272,16 @@ function vendorPropName( name ) {
|
|||
}
|
||||
}
|
||||
|
||||
// Return a property mapped along what jQuery.cssProps suggests or to
|
||||
// a vendor prefixed property.
|
||||
function finalPropName( name ) {
|
||||
var ret = jQuery.cssProps[ name ];
|
||||
if ( !ret ) {
|
||||
ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
function setPositiveNumber( elem, value, subtract ) {
|
||||
|
||||
// Any relative (+/-) values have already been
|
||||
|
@ -6319,44 +6342,31 @@ function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
|
|||
|
||||
function getWidthOrHeight( elem, name, extra ) {
|
||||
|
||||
// Start with offset property, which is equivalent to the border-box value
|
||||
var val,
|
||||
valueIsBorderBox = true,
|
||||
// Start with computed style
|
||||
var valueIsBorderBox,
|
||||
styles = getStyles( elem ),
|
||||
val = curCSS( elem, name, styles ),
|
||||
isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
|
||||
|
||||
// Support: IE <=11 only
|
||||
// Running getBoundingClientRect on a disconnected node
|
||||
// in IE throws an error.
|
||||
if ( elem.getClientRects().length ) {
|
||||
val = elem.getBoundingClientRect()[ name ];
|
||||
// Computed unit is not pixels. Stop here and return.
|
||||
if ( rnumnonpx.test( val ) ) {
|
||||
return val;
|
||||
}
|
||||
|
||||
// Some non-html elements return undefined for offsetWidth, so check for null/undefined
|
||||
// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
|
||||
// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
|
||||
if ( val <= 0 || val == null ) {
|
||||
// Check for style in case a browser which returns unreliable values
|
||||
// for getComputedStyle silently falls back to the reliable elem.style
|
||||
valueIsBorderBox = isBorderBox &&
|
||||
( support.boxSizingReliable() || val === elem.style[ name ] );
|
||||
|
||||
// Fall back to computed then uncomputed css if necessary
|
||||
val = curCSS( elem, name, styles );
|
||||
if ( val < 0 || val == null ) {
|
||||
val = elem.style[ name ];
|
||||
}
|
||||
|
||||
// Computed unit is not pixels. Stop here and return.
|
||||
if ( rnumnonpx.test( val ) ) {
|
||||
return val;
|
||||
}
|
||||
|
||||
// Check for style in case a browser which returns unreliable values
|
||||
// for getComputedStyle silently falls back to the reliable elem.style
|
||||
valueIsBorderBox = isBorderBox &&
|
||||
( support.boxSizingReliable() || val === elem.style[ name ] );
|
||||
|
||||
// Normalize "", auto, and prepare for extra
|
||||
val = parseFloat( val ) || 0;
|
||||
// Fall back to offsetWidth/Height when value is "auto"
|
||||
// This happens for inline elements with no explicit setting (gh-3571)
|
||||
if ( val === "auto" ) {
|
||||
val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ];
|
||||
}
|
||||
|
||||
// Normalize "", auto, and prepare for extra
|
||||
val = parseFloat( val ) || 0;
|
||||
|
||||
// Use the active box-sizing model to add/subtract irrelevant styles
|
||||
return ( val +
|
||||
augmentWidthOrHeight(
|
||||
|
@ -6420,10 +6430,15 @@ jQuery.extend( {
|
|||
// Make sure that we're working with the right name
|
||||
var ret, type, hooks,
|
||||
origName = jQuery.camelCase( name ),
|
||||
isCustomProp = rcustomProp.test( name ),
|
||||
style = elem.style;
|
||||
|
||||
name = jQuery.cssProps[ origName ] ||
|
||||
( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
|
||||
// Make sure that we're working with the right name. We don't
|
||||
// want to query the value if it is a CSS custom property
|
||||
// since they are user-defined.
|
||||
if ( !isCustomProp ) {
|
||||
name = finalPropName( origName );
|
||||
}
|
||||
|
||||
// Gets hook for the prefixed version, then unprefixed version
|
||||
hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
|
||||
|
@ -6459,7 +6474,11 @@ jQuery.extend( {
|
|||
if ( !hooks || !( "set" in hooks ) ||
|
||||
( value = hooks.set( elem, value, extra ) ) !== undefined ) {
|
||||
|
||||
style[ name ] = value;
|
||||
if ( isCustomProp ) {
|
||||
style.setProperty( name, value );
|
||||
} else {
|
||||
style[ name ] = value;
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
|
@ -6478,11 +6497,15 @@ jQuery.extend( {
|
|||
|
||||
css: function( elem, name, extra, styles ) {
|
||||
var val, num, hooks,
|
||||
origName = jQuery.camelCase( name );
|
||||
origName = jQuery.camelCase( name ),
|
||||
isCustomProp = rcustomProp.test( name );
|
||||
|
||||
// Make sure that we're working with the right name
|
||||
name = jQuery.cssProps[ origName ] ||
|
||||
( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
|
||||
// Make sure that we're working with the right name. We don't
|
||||
// want to modify the value if it is a CSS custom property
|
||||
// since they are user-defined.
|
||||
if ( !isCustomProp ) {
|
||||
name = finalPropName( origName );
|
||||
}
|
||||
|
||||
// Try prefixed name followed by the unprefixed name
|
||||
hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
|
||||
|
@ -6507,6 +6530,7 @@ jQuery.extend( {
|
|||
num = parseFloat( val );
|
||||
return extra === true || isFinite( num ) ? num || 0 : val;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
} );
|
||||
|
@ -6606,7 +6630,7 @@ jQuery.fn.extend( {
|
|||
map = {},
|
||||
i = 0;
|
||||
|
||||
if ( jQuery.isArray( name ) ) {
|
||||
if ( Array.isArray( name ) ) {
|
||||
styles = getStyles( elem );
|
||||
len = name.length;
|
||||
|
||||
|
@ -6744,13 +6768,18 @@ jQuery.fx.step = {};
|
|||
|
||||
|
||||
var
|
||||
fxNow, timerId,
|
||||
fxNow, inProgress,
|
||||
rfxtypes = /^(?:toggle|show|hide)$/,
|
||||
rrun = /queueHooks$/;
|
||||
|
||||
function raf() {
|
||||
if ( timerId ) {
|
||||
window.requestAnimationFrame( raf );
|
||||
function schedule() {
|
||||
if ( inProgress ) {
|
||||
if ( document.hidden === false && window.requestAnimationFrame ) {
|
||||
window.requestAnimationFrame( schedule );
|
||||
} else {
|
||||
window.setTimeout( schedule, jQuery.fx.interval );
|
||||
}
|
||||
|
||||
jQuery.fx.tick();
|
||||
}
|
||||
}
|
||||
|
@ -6977,7 +7006,7 @@ function propFilter( props, specialEasing ) {
|
|||
name = jQuery.camelCase( index );
|
||||
easing = specialEasing[ name ];
|
||||
value = props[ index ];
|
||||
if ( jQuery.isArray( value ) ) {
|
||||
if ( Array.isArray( value ) ) {
|
||||
easing = value[ 1 ];
|
||||
value = props[ index ] = value[ 0 ];
|
||||
}
|
||||
|
@ -7036,12 +7065,19 @@ function Animation( elem, properties, options ) {
|
|||
|
||||
deferred.notifyWith( elem, [ animation, percent, remaining ] );
|
||||
|
||||
// If there's more to do, yield
|
||||
if ( percent < 1 && length ) {
|
||||
return remaining;
|
||||
} else {
|
||||
deferred.resolveWith( elem, [ animation ] );
|
||||
return false;
|
||||
}
|
||||
|
||||
// If this was an empty animation, synthesize a final progress notification
|
||||
if ( !length ) {
|
||||
deferred.notifyWith( elem, [ animation, 1, 0 ] );
|
||||
}
|
||||
|
||||
// Resolve the animation and report its conclusion
|
||||
deferred.resolveWith( elem, [ animation ] );
|
||||
return false;
|
||||
},
|
||||
animation = deferred.promise( {
|
||||
elem: elem,
|
||||
|
@ -7106,6 +7142,13 @@ function Animation( elem, properties, options ) {
|
|||
animation.opts.start.call( elem, animation );
|
||||
}
|
||||
|
||||
// Attach callbacks from options
|
||||
animation
|
||||
.progress( animation.opts.progress )
|
||||
.done( animation.opts.done, animation.opts.complete )
|
||||
.fail( animation.opts.fail )
|
||||
.always( animation.opts.always );
|
||||
|
||||
jQuery.fx.timer(
|
||||
jQuery.extend( tick, {
|
||||
elem: elem,
|
||||
|
@ -7114,11 +7157,7 @@ function Animation( elem, properties, options ) {
|
|||
} )
|
||||
);
|
||||
|
||||
// attach callbacks from options
|
||||
return animation.progress( animation.opts.progress )
|
||||
.done( animation.opts.done, animation.opts.complete )
|
||||
.fail( animation.opts.fail )
|
||||
.always( animation.opts.always );
|
||||
return animation;
|
||||
}
|
||||
|
||||
jQuery.Animation = jQuery.extend( Animation, {
|
||||
|
@ -7169,8 +7208,8 @@ jQuery.speed = function( speed, easing, fn ) {
|
|||
easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
|
||||
};
|
||||
|
||||
// Go to the end state if fx are off or if document is hidden
|
||||
if ( jQuery.fx.off || document.hidden ) {
|
||||
// Go to the end state if fx are off
|
||||
if ( jQuery.fx.off ) {
|
||||
opt.duration = 0;
|
||||
|
||||
} else {
|
||||
|
@ -7362,7 +7401,7 @@ jQuery.fx.tick = function() {
|
|||
for ( ; i < timers.length; i++ ) {
|
||||
timer = timers[ i ];
|
||||
|
||||
// Checks the timer has not already been removed
|
||||
// Run the timer and safely remove it when done (allowing for external removal)
|
||||
if ( !timer() && timers[ i ] === timer ) {
|
||||
timers.splice( i--, 1 );
|
||||
}
|
||||
|
@ -7376,30 +7415,21 @@ jQuery.fx.tick = function() {
|
|||
|
||||
jQuery.fx.timer = function( timer ) {
|
||||
jQuery.timers.push( timer );
|
||||
if ( timer() ) {
|
||||
jQuery.fx.start();
|
||||
} else {
|
||||
jQuery.timers.pop();
|
||||
}
|
||||
jQuery.fx.start();
|
||||
};
|
||||
|
||||
jQuery.fx.interval = 13;
|
||||
jQuery.fx.start = function() {
|
||||
if ( !timerId ) {
|
||||
timerId = window.requestAnimationFrame ?
|
||||
window.requestAnimationFrame( raf ) :
|
||||
window.setInterval( jQuery.fx.tick, jQuery.fx.interval );
|
||||
if ( inProgress ) {
|
||||
return;
|
||||
}
|
||||
|
||||
inProgress = true;
|
||||
schedule();
|
||||
};
|
||||
|
||||
jQuery.fx.stop = function() {
|
||||
if ( window.cancelAnimationFrame ) {
|
||||
window.cancelAnimationFrame( timerId );
|
||||
} else {
|
||||
window.clearInterval( timerId );
|
||||
}
|
||||
|
||||
timerId = null;
|
||||
inProgress = null;
|
||||
};
|
||||
|
||||
jQuery.fx.speeds = {
|
||||
|
@ -7516,7 +7546,7 @@ jQuery.extend( {
|
|||
type: {
|
||||
set: function( elem, value ) {
|
||||
if ( !support.radioValue && value === "radio" &&
|
||||
jQuery.nodeName( elem, "input" ) ) {
|
||||
nodeName( elem, "input" ) ) {
|
||||
var val = elem.value;
|
||||
elem.setAttribute( "type", value );
|
||||
if ( val ) {
|
||||
|
@ -7947,7 +7977,7 @@ jQuery.fn.extend( {
|
|||
} else if ( typeof val === "number" ) {
|
||||
val += "";
|
||||
|
||||
} else if ( jQuery.isArray( val ) ) {
|
||||
} else if ( Array.isArray( val ) ) {
|
||||
val = jQuery.map( val, function( value ) {
|
||||
return value == null ? "" : value + "";
|
||||
} );
|
||||
|
@ -8006,7 +8036,7 @@ jQuery.extend( {
|
|||
// Don't return options that are disabled or in a disabled optgroup
|
||||
!option.disabled &&
|
||||
( !option.parentNode.disabled ||
|
||||
!jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
|
||||
!nodeName( option.parentNode, "optgroup" ) ) ) {
|
||||
|
||||
// Get the specific value for the option
|
||||
value = jQuery( option ).val();
|
||||
|
@ -8058,7 +8088,7 @@ jQuery.extend( {
|
|||
jQuery.each( [ "radio", "checkbox" ], function() {
|
||||
jQuery.valHooks[ this ] = {
|
||||
set: function( elem, value ) {
|
||||
if ( jQuery.isArray( value ) ) {
|
||||
if ( Array.isArray( value ) ) {
|
||||
return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
|
||||
}
|
||||
}
|
||||
|
@ -8353,7 +8383,7 @@ var
|
|||
function buildParams( prefix, obj, traditional, add ) {
|
||||
var name;
|
||||
|
||||
if ( jQuery.isArray( obj ) ) {
|
||||
if ( Array.isArray( obj ) ) {
|
||||
|
||||
// Serialize array item.
|
||||
jQuery.each( obj, function( i, v ) {
|
||||
|
@ -8405,7 +8435,7 @@ jQuery.param = function( a, traditional ) {
|
|||
};
|
||||
|
||||
// If an array was passed in, assume that it is an array of form elements.
|
||||
if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
|
||||
if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
|
||||
|
||||
// Serialize the form elements
|
||||
jQuery.each( a, function() {
|
||||
|
@ -8451,7 +8481,7 @@ jQuery.fn.extend( {
|
|||
return null;
|
||||
}
|
||||
|
||||
if ( jQuery.isArray( val ) ) {
|
||||
if ( Array.isArray( val ) ) {
|
||||
return jQuery.map( val, function( val ) {
|
||||
return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
|
||||
} );
|
||||
|
@ -9876,13 +9906,6 @@ jQuery.expr.pseudos.animated = function( elem ) {
|
|||
|
||||
|
||||
|
||||
/**
|
||||
* Gets a window from an element
|
||||
*/
|
||||
function getWindow( elem ) {
|
||||
return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
|
||||
}
|
||||
|
||||
jQuery.offset = {
|
||||
setOffset: function( elem, options, i ) {
|
||||
var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
|
||||
|
@ -9947,13 +9970,14 @@ jQuery.fn.extend( {
|
|||
} );
|
||||
}
|
||||
|
||||
var docElem, win, rect, doc,
|
||||
var doc, docElem, rect, win,
|
||||
elem = this[ 0 ];
|
||||
|
||||
if ( !elem ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
|
||||
// Support: IE <=11 only
|
||||
// Running getBoundingClientRect on a
|
||||
// disconnected node in IE throws an error
|
||||
|
@ -9963,20 +9987,14 @@ jQuery.fn.extend( {
|
|||
|
||||
rect = elem.getBoundingClientRect();
|
||||
|
||||
// Make sure element is not hidden (display: none)
|
||||
if ( rect.width || rect.height ) {
|
||||
doc = elem.ownerDocument;
|
||||
win = getWindow( doc );
|
||||
docElem = doc.documentElement;
|
||||
doc = elem.ownerDocument;
|
||||
docElem = doc.documentElement;
|
||||
win = doc.defaultView;
|
||||
|
||||
return {
|
||||
top: rect.top + win.pageYOffset - docElem.clientTop,
|
||||
left: rect.left + win.pageXOffset - docElem.clientLeft
|
||||
};
|
||||
}
|
||||
|
||||
// Return zeros for disconnected and hidden elements (gh-2310)
|
||||
return rect;
|
||||
return {
|
||||
top: rect.top + win.pageYOffset - docElem.clientTop,
|
||||
left: rect.left + win.pageXOffset - docElem.clientLeft
|
||||
};
|
||||
},
|
||||
|
||||
position: function() {
|
||||
|
@ -10002,7 +10020,7 @@ jQuery.fn.extend( {
|
|||
|
||||
// Get correct offsets
|
||||
offset = this.offset();
|
||||
if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
|
||||
if ( !nodeName( offsetParent[ 0 ], "html" ) ) {
|
||||
parentOffset = offsetParent.offset();
|
||||
}
|
||||
|
||||
|
@ -10049,7 +10067,14 @@ jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function(
|
|||
|
||||
jQuery.fn[ method ] = function( val ) {
|
||||
return access( this, function( elem, method, val ) {
|
||||
var win = getWindow( elem );
|
||||
|
||||
// Coalesce documents and windows
|
||||
var win;
|
||||
if ( jQuery.isWindow( elem ) ) {
|
||||
win = elem;
|
||||
} else if ( elem.nodeType === 9 ) {
|
||||
win = elem.defaultView;
|
||||
}
|
||||
|
||||
if ( val === undefined ) {
|
||||
return win ? win[ prop ] : elem[ method ];
|
||||
|
@ -10158,7 +10183,16 @@ jQuery.fn.extend( {
|
|||
}
|
||||
} );
|
||||
|
||||
jQuery.holdReady = function( hold ) {
|
||||
if ( hold ) {
|
||||
jQuery.readyWait++;
|
||||
} else {
|
||||
jQuery.ready( true );
|
||||
}
|
||||
};
|
||||
jQuery.isArray = Array.isArray;
|
||||
jQuery.parseJSON = JSON.parse;
|
||||
jQuery.nodeName = nodeName;
|
||||
|
||||
|
||||
|
||||
|
@ -10215,6 +10249,5 @@ if ( !noGlobal ) {
|
|||
|
||||
|
||||
|
||||
|
||||
return jQuery;
|
||||
} );
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Fingerprintjs2 1.5.0 - Modern & flexible browser fingerprint library v2
|
||||
* Fingerprintjs2 1.5.1 - Modern & flexible browser fingerprint library v2
|
||||
* https://github.com/Valve/fingerprintjs2
|
||||
* Copyright (c) 2015 Valentin Vasilyev (valentin.vasilyev@outlook.com)
|
||||
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
|
||||
|
@ -24,36 +24,6 @@
|
|||
else { context[name] = definition(); }
|
||||
})("Fingerprint2", this, function() {
|
||||
"use strict";
|
||||
// This will only be polyfilled for IE8 and older
|
||||
// Taken from Mozilla MDC
|
||||
if (!Array.prototype.indexOf) {
|
||||
Array.prototype.indexOf = function(searchElement, fromIndex) {
|
||||
var k;
|
||||
if (this == null) {
|
||||
throw new TypeError("'this' is null or undefined");
|
||||
}
|
||||
var O = Object(this);
|
||||
var len = O.length >>> 0;
|
||||
if (len === 0) {
|
||||
return -1;
|
||||
}
|
||||
var n = +fromIndex || 0;
|
||||
if (Math.abs(n) === Infinity) {
|
||||
n = 0;
|
||||
}
|
||||
if (n >= len) {
|
||||
return -1;
|
||||
}
|
||||
k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
|
||||
while (k < len) {
|
||||
if (k in O && O[k] === searchElement) {
|
||||
return k;
|
||||
}
|
||||
k++;
|
||||
}
|
||||
return -1;
|
||||
};
|
||||
}
|
||||
var Fingerprint2 = function(options) {
|
||||
|
||||
if (!(this instanceof Fingerprint2)) {
|
||||
|
@ -81,11 +51,6 @@
|
|||
}
|
||||
return target;
|
||||
},
|
||||
log: function(msg){
|
||||
if(window.console){
|
||||
console.log(msg);
|
||||
}
|
||||
},
|
||||
get: function(done){
|
||||
var keys = [];
|
||||
keys = this.userAgentKey(keys);
|
||||
|
@ -113,6 +78,7 @@
|
|||
keys = this.hasLiedOsKey(keys);
|
||||
keys = this.hasLiedBrowserKey(keys);
|
||||
keys = this.touchSupportKey(keys);
|
||||
keys = this.customEntropyFunction(keys);
|
||||
var that = this;
|
||||
this.fontsKey(keys, function(newKeys){
|
||||
var values = [];
|
||||
|
@ -127,6 +93,12 @@
|
|||
return done(murmur, newKeys);
|
||||
});
|
||||
},
|
||||
customEntropyFunction: function (keys) {
|
||||
if (typeof this.options.customFunction === "function") {
|
||||
keys.push({key: "custom", value: this.options.customFunction()});
|
||||
}
|
||||
return keys;
|
||||
},
|
||||
userAgentKey: function(keys) {
|
||||
if(!this.options.excludeUserAgent) {
|
||||
keys.push({key: "user_agent", value: this.getUserAgent()});
|
||||
|
@ -260,15 +232,9 @@
|
|||
},
|
||||
webglKey: function(keys) {
|
||||
if(this.options.excludeWebGL) {
|
||||
if(typeof NODEBUG === "undefined"){
|
||||
this.log("Skipping WebGL fingerprinting per excludeWebGL configuration option");
|
||||
}
|
||||
return keys;
|
||||
}
|
||||
if(!this.isWebGlSupported()) {
|
||||
if(typeof NODEBUG === "undefined"){
|
||||
this.log("Skipping WebGL fingerprinting because it is not supported in this browser");
|
||||
}
|
||||
return keys;
|
||||
}
|
||||
keys.push({key: "webgl", value: this.getWebglFp()});
|
||||
|
@ -313,28 +279,16 @@
|
|||
// flash fonts (will increase fingerprinting time 20X to ~ 130-150ms)
|
||||
flashFontsKey: function(keys, done) {
|
||||
if(this.options.excludeFlashFonts) {
|
||||
if(typeof NODEBUG === "undefined"){
|
||||
this.log("Skipping flash fonts detection per excludeFlashFonts configuration option");
|
||||
}
|
||||
return done(keys);
|
||||
}
|
||||
// we do flash if swfobject is loaded
|
||||
if(!this.hasSwfObjectLoaded()){
|
||||
if(typeof NODEBUG === "undefined"){
|
||||
this.log("Swfobject is not detected, Flash fonts enumeration is skipped");
|
||||
}
|
||||
return done(keys);
|
||||
}
|
||||
if(!this.hasMinFlashInstalled()){
|
||||
if(typeof NODEBUG === "undefined"){
|
||||
this.log("Flash is not installed, skipping Flash fonts enumeration");
|
||||
}
|
||||
return done(keys);
|
||||
}
|
||||
if(typeof this.options.swfPath === "undefined"){
|
||||
if(typeof NODEBUG === "undefined"){
|
||||
this.log("To use Flash fonts detection, you must pass a valid swfPath option, skipping Flash fonts enumeration");
|
||||
}
|
||||
return done(keys);
|
||||
}
|
||||
this.loadSwfAndDetectFonts(function(fonts){
|
||||
|
@ -830,20 +784,13 @@
|
|||
try {
|
||||
// Add the unmasked vendor and unmasked renderer if the debug_renderer_info extension is available
|
||||
var extensionDebugRendererInfo = gl.getExtension("WEBGL_debug_renderer_info");
|
||||
if (!extensionDebugRendererInfo) {
|
||||
if (typeof NODEBUG === "undefined") {
|
||||
this.log("WebGL fingerprinting is incomplete, because your browser does not have the extension WEBGL_debug_renderer_info");
|
||||
}
|
||||
} else {
|
||||
if (extensionDebugRendererInfo) {
|
||||
result.push("webgl unmasked vendor:" + gl.getParameter(extensionDebugRendererInfo.UNMASKED_VENDOR_WEBGL));
|
||||
result.push("webgl unmasked renderer:" + gl.getParameter(extensionDebugRendererInfo.UNMASKED_RENDERER_WEBGL));
|
||||
}
|
||||
} catch(e) { /* squelch */ }
|
||||
|
||||
if (!gl.getShaderPrecisionFormat) {
|
||||
if (typeof NODEBUG === "undefined") {
|
||||
this.log("WebGL fingerprinting is incomplete, because your browser does not support getShaderPrecisionFormat");
|
||||
}
|
||||
return result.join("~");
|
||||
}
|
||||
|
||||
|
@ -1327,6 +1274,6 @@
|
|||
return ("00000000" + (h1[0] >>> 0).toString(16)).slice(-8) + ("00000000" + (h1[1] >>> 0).toString(16)).slice(-8) + ("00000000" + (h2[0] >>> 0).toString(16)).slice(-8) + ("00000000" + (h2[1] >>> 0).toString(16)).slice(-8);
|
||||
}
|
||||
};
|
||||
Fingerprint2.VERSION = "1.5.0";
|
||||
Fingerprint2.VERSION = "1.5.1";
|
||||
return Fingerprint2;
|
||||
});
|
||||
|
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue