Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 1x 1x 2x 1x 1x 1x 78490x 12675x 12675x 78490x 169133x 166969x 166969x 65815x 65815x 78490x 73302x 73302x 78490x | /*!
* VisualEditor Object freeze utilities.
*
* @copyright See AUTHORS.txt
*/
( function () {
const freezeProxyHandler = {
set: ( obj, name ) => {
throw new Error( 'Object is frozen, can\'t set property: ' + name );
},
deleteProperty: ( obj, name ) => {
throw new Error( 'Object is frozen, can\'t delete property: ' + name );
}
};
Iif ( !window.Proxy || !window.Set ) {
return;
}
let deepFreeze;
/**
* Deep freeze an object, making it immutable
*
* Original object properties are overwritten with frozen versions.
*
* @param {Object} object Object to freeze
* @param {boolean} [onlyProperties] Only freeze properties (or array items)
* @param {Set} [seen] Set of already-seen objects (for internal, recursive use)
* @return {Object} Immutable deep copy of the original object
*/
ve.deepFreeze = deepFreeze = function ( object, onlyProperties, seen ) {
if ( !seen ) {
seen = new Set();
seen.add( object );
}
for ( const name in object ) {
if ( Object.prototype.hasOwnProperty.call( object, name ) ) {
const value = object[ name ];
if (
// Truth check so we don't try to freeze null
value &&
typeof value === 'object' &&
!seen.has( value ) &&
!Object.isFrozen( value )
) {
seen.add( value );
// Recurse. Use local name (tests may alias ve.deepFreeze)
object[ name ] = deepFreeze( value, false, seen );
}
}
}
if ( !onlyProperties ) {
object = new window.Proxy( object, freezeProxyHandler );
// Object#freeze isn't really necessary after proxying,
// but use it so we can detect frozen objects with Object.isFrozen.
Object.freeze( object );
}
return object;
};
}() );
|