Best JavaScript code snippet using playwright-internal
ember_computed.js
Source:ember_computed.js  
...72function generateComputedWithKey(macro) {73  return function () {74    var properties = slice.call(arguments, 1);75    var key = arguments[0];76    var computedFunc = computed(function () {77      var values = getValues(this, properties);78      return macro.call(this, key, values);79    });80    return computedFunc.property.apply(computedFunc, properties);81  }82}83function generateComputedWithProperties(macro) {84  return function () {85    var properties = slice.call(arguments);86    var computedFunc = computed(function () {87      return macro.apply(this, [getProperties(this, properties)]);88    });89    var realProperties = properties.slice().invoke('replace', '!', '');90    return computedFunc.property.apply(computedFunc, realProperties);91  };92}93function generateComputedWithValues(macro) {94  return function () {95    var properties = slice.call(arguments);96    var computedFunc = computed(function () {97      return macro.apply(this, [getValues(this, properties)]);98    });99    return computedFunc.property.apply(computedFunc, properties);100  };101}102/**103 *104 * A computed property that returns true if the provided dependent property105 * is equal to the given value.106 * App.*-keys are supported107 * Example*108 * ```javascript109 * var Hamster = Ember.Object.extend({110 *    napTime: Ember.computed.equal('state', 'sleepy')111 *  });112 * var hamster = Hamster.create();113 * hamster.get('napTime'); // false114 * hamster.set('state', 'sleepy');115 * hamster.get('napTime'); // true116 * hamster.set('state', 'hungry');117 * hamster.get('napTime'); // false118 * ```119 * @method equal120 * @param {String} dependentKey121 * @param {String|Number|Object} value122 * @return {Ember.ComputedProperty} computed property which returns true if123 * the original value for property is equal to the given value.124 * @public125 */126computed.equal = function (dependentKey, value) {127  return computed(dependentKey, function () {128    return smartGet(this, dependentKey) === value;129  }).cacheable();130};131/**132 * A computed property that returns true if the provided dependent property is not equal to the given value133 * App.*-keys are supported134 * <pre>135 * var o = Em.Object.create({136 *  p1: 'a',137 *  p2: Em.computed.notEqual('p1', 'a')138 * });139 * console.log(o.get('p2')); // false140 * o.set('p1', 'b');141 * console.log(o.get('p2')); // true142 * </pre>143 *144 * @method notEqual145 * @param {string} dependentKey146 * @param {*} value147 * @returns {Ember.ComputedProperty}148 */149computed.notEqual = function (dependentKey, value) {150  return computed(dependentKey, function () {151    return smartGet(this, dependentKey) !== value;152  });153};154/**155 * A computed property that returns true if provided dependent properties are equal to the each other156 * App.*-keys are supported157 * <pre>158 * var o = Em.Object.create({159 *  p1: 'a',160 *  p2: 'b',161 *  p3: Em.computed.equalProperties('p1', 'p2')162 * });163 * console.log(o.get('p3')); // false164 * o.set('p1', 'b');165 * console.log(o.get('p3')); // true166 * </pre>167 *168 * @method equalProperties169 * @param {string} dependentKey1170 * @param {string} dependentKey2171 * @returns {Ember.ComputedProperty}172 */173computed.equalProperties = function (dependentKey1, dependentKey2) {174  return computed(dependentKey1, dependentKey2, function () {175    return smartGet(this, dependentKey1) === smartGet(this, dependentKey2);176  });177};178/**179 * A computed property that returns true if provided dependent properties are not equal to the each other180 * App.*-keys are supported181 * <pre>182 * var o = Em.Object.create({183 *  p1: 'a',184 *  p2: 'b',185 *  p3: Em.computed.notEqualProperties('p1', 'p2')186 * });187 * console.log(o.get('p3')); // true188 * o.set('p1', 'b');189 * console.log(o.get('p3')); // false190 * </pre>191 *192 * @method notEqualProperties193 * @param {string} dependentKey1194 * @param {string} dependentKey2195 * @returns {Ember.ComputedProperty}196 */197computed.notEqualProperties = function (dependentKey1, dependentKey2) {198  return computed(dependentKey1, dependentKey2, function () {199    return smartGet(this, dependentKey1) !== smartGet(this, dependentKey2);200  });201};202/**203 * A computed property that returns grouped collection's items by propertyName-value204 *205 * @method groupBy206 * @param {string} collectionKey207 * @param {string} propertyName208 * @returns {Ember.ComputedProperty}209 */210computed.groupBy = function (collectionKey, propertyName) {211  return computed(collectionKey + '.@each.' + propertyName, function () {212    var collection = get(this, collectionKey);213    return dataUtils.groupPropertyValues(collection, propertyName);214  });215};216/**217 * A computed property that returns filtered collection by propertyName values-list218 * Wrapper to filterProperty-method that allows using list of values to filter219 *220 * @method filterByMany221 * @param {string} collectionKey222 * @param {string} propertyName223 * @param {array} valuesToFilter224 * @returns {Ember.ComputedProperty}225 */226computed.filterByMany = function (collectionKey, propertyName, valuesToFilter) {227  return computed(collectionKey + '.@each.' + propertyName, function () {228    var collection = get(this, collectionKey);229    return dataUtils.filterPropertyValues(collection, propertyName, makeArray(valuesToFilter));230  });231};232/**233 * A computed property that returns collection without elements with value that is in <code>valuesToReject</code>234 * Exclude objects from <code>collection</code> if its <code>key</code> exist in <code>valuesToReject</code>235 *236 * @method rejectMany237 * @param {string} collectionKey238 * @param {string} propertyName239 * @param {array} valuesToReject240 * @returns {Ember.ComputedProperty}241 */242computed.rejectMany = function (collectionKey, propertyName, valuesToReject) {243  return computed(collectionKey + '.@each.' + propertyName, function () {244    var collection = get(this, collectionKey);245    return dataUtils.rejectPropertyValues(collection, propertyName, makeArray(valuesToReject));246  });247};248/**249 * A computed property that returns trueValue if dependent value is true and falseValue otherwise250 * App.*-keys are supported251 * <pre>252 * var o = Em.Object.create({253 *  p1: true,254 *  p2: Em.computed.ifThenElse('p1', 'abc', 'cba')255 * });256 * console.log(o.get('p2')); // 'abc'257 * o.set('p1', false);258 * console.log(o.get('p2')); // 'cba'259 * </pre>260 *261 * @method ifThenElse262 * @param {string} dependentKey263 * @param {*} trueValue264 * @param {*} falseValue265 * @returns {Ember.ComputedProperty}266 */267computed.ifThenElse = function (dependentKey, trueValue, falseValue) {268  return computed(dependentKey, function () {269    return smartGet(this, dependentKey) ? trueValue : falseValue;270  });271};272/**273 * A computed property that is equal to the logical 'and'274 * Takes any number of arguments275 * Returns true if all of them are truly, false - otherwise276 * App.*-keys are supported277 * <pre>278 * var o = Em.Object.create({279 *  p1: true,280 *  p2: true,281 *  p3: true,282 *  p4: Em.computed.and('p1', 'p2', 'p3')283 * });284 * console.log(o.get('p4')); // true285 * o.set('p1', false);286 * console.log(o.get('p4')); // false287 * </pre>288 *289 * @method and290 * @param {...string} dependentKeys291 * @returns {Ember.ComputedProperty}292 */293computed.and = generateComputedWithProperties(function (properties) {294  var value;295  for (var key in properties) {296    value = !!properties[key];297    if (properties.hasOwnProperty(key) && !value) {298      return false;299    }300  }301  return value;302});303/**304 * A computed property that is equal to the logical 'or'305 * Takes any number of arguments306 * Returns true if at least one of them is truly, false - otherwise307 * App.*-keys are supported308 * <pre>309 * var o = Em.Object.create({310 *  p1: false,311 *  p2: false,312 *  p3: false,313 *  p4: Em.computed.or('p1', 'p2', 'p3')314 * });315 * console.log(o.get('p4')); // false316 * o.set('p1', true);317 * console.log(o.get('p4')); // true318 * </pre>319 *320 * @method or321 * @param {...string} dependentKeys322 * @returns {Ember.ComputedProperty}323 */324computed.or = generateComputedWithProperties(function (properties) {325  var value;326  for (var key in properties) {327    value = !!properties[key];328    if (properties.hasOwnProperty(key) && value) {329      return value;330    }331  }332  return value;333});334/**335 * A computed property that returns sum on the dependent properties values336 * Takes any number of arguments337 * App.*-keys are supported338 * <pre>339 * var o = Em.Object.create({340 *  p1: 1,341 *  p2: 2,342 *  p3: 3,343 *  p4: Em.computed.sumProperties('p1', 'p2', 'p3')344 * });345 * console.log(o.get('p4')); // 6346 * o.set('p1', 2);347 * console.log(o.get('p4')); // 7348 * </pre>349 *350 * @method sumProperties351 * @param {...string} dependentKeys352 * @returns {Ember.ComputedProperty}353 */354computed.sumProperties = generateComputedWithProperties(function (properties) {355  var sum = 0;356  for (var key in properties) {357    if (properties.hasOwnProperty(key)) {358      sum += Number(properties[key]);359    }360  }361  return sum;362});363/**364 * A computed property that returns true if dependent value is greater or equal to the needed value365 * App.*-keys are supported366 * <pre>367 * var o = Em.Object.create({368 *  p1: 4,369 *  p2: Em.computed.gte('p1', 1)370 * });371 * console.log(o.get('p2')); // true372 * o.set('p1', 4);373 * console.log(o.get('p2')); // true374 * o.set('p1', 5);375 * console.log(o.get('p2')); // false376 * </pre>377 *378 * @method gte379 * @param {string} dependentKey380 * @param {*} value381 * @returns {Ember.ComputedProperty}382 */383computed.gte = function (dependentKey, value) {384  return computed(dependentKey, function () {385    return smartGet(this, dependentKey) >= value;386  });387};388/**389 * A computed property that returns true if first dependent property is greater or equal to the second dependent property390 * App.*-keys are supported391 * <pre>392 * var o = Em.Object.create({393 *  p1: 4,394 *  p2: 1,395 *  p3: Em.computed.gteProperties('p1', 'p2')396 * });397 * console.log(o.get('p3')); // true398 * o.set('p2', 4);399 * console.log(o.get('p3')); // true400 * o.set('p2', 5);401 * console.log(o.get('p3')); // false402 * </pre>403 *404 * @method gteProperties405 * @param {string} dependentKey1406 * @param {string} dependentKey2407 * @returns {Ember.ComputedProperty}408 */409computed.gteProperties = function (dependentKey1, dependentKey2) {410  return computed(dependentKey1, dependentKey2, function () {411    return smartGet(this, dependentKey1) >= smartGet(this, dependentKey2);412  });413};414/**415 * A computed property that returns true if dependent property is less or equal to the needed value416 * App.*-keys are supported417 * <pre>418 * var o = Em.Object.create({419 *  p1: 4,420 *  p2: Em.computed.lte('p1', 1)421 * });422 * console.log(o.get('p2')); // false423 * o.set('p1', 4);424 * console.log(o.get('p2')); // true425 * o.set('p1', 5);426 * console.log(o.get('p2')); // true427 * </pre>428 *429 * @method lte430 * @param {string} dependentKey431 * @param {*} value432 * @returns {Ember.ComputedProperty}433 */434computed.lte = function (dependentKey, value) {435  return computed(dependentKey, function () {436    return smartGet(this, dependentKey) <= value;437  });438};439/**440 * A computed property that returns true if first dependent property is less or equal to the second dependent property441 * App.*-keys are supported442 * <pre>443 * var o = Em.Object.create({444 *  p1: 4,445 *  p2: 1,446 *  p3: Em.computed.lteProperties('p1', 'p2')447 * });448 * console.log(o.get('p3')); // false449 * o.set('p2', 4);450 * console.log(o.get('p3')); // true451 * o.set('p2', 5);452 * console.log(o.get('p3')); // true453 * </pre>454 *455 * @method lteProperties456 * @param {string} dependentKey1457 * @param {string} dependentKey2458 * @returns {Ember.ComputedProperty}459 */460computed.lteProperties = function (dependentKey1, dependentKey2) {461  return computed(dependentKey1, dependentKey2, function () {462    return smartGet(this, dependentKey1) <= smartGet(this, dependentKey2);463  });464};465/**466 * A computed property that returns true if dependent value is greater than the needed value467 * App.*-keys are supported468 * <pre>469 * var o = Em.Object.create({470 *  p1: 4,471 *  p2: Em.computed.gt('p1', 1)472 * });473 * console.log(o.get('p2')); // true474 * o.set('p1', 4);475 * console.log(o.get('p2')); // false476 * o.set('p1', 5);477 * console.log(o.get('p2')); // false478 * </pre>479 *480 * @method gt481 * @param {string} dependentKey482 * @param {*} value483 * @returns {Ember.ComputedProperty}484 */485computed.gt = function (dependentKey, value) {486  return computed(dependentKey, function () {487    return smartGet(this, dependentKey) > value;488  });489};490/**491 * A computed property that returns true if first dependent property is greater than the second dependent property492 * App.*-keys are supported493 * <pre>494 * var o = Em.Object.create({495 *  p1: 4,496 *  p2: 1,497 *  p3: Em.computed.gteProperties('p1', 'p2')498 * });499 * console.log(o.get('p3')); // true500 * o.set('p2', 4);501 * console.log(o.get('p3')); // false502 * o.set('p2', 5);503 * console.log(o.get('p3')); // false504 * </pre>505 *506 * @method gtProperties507 * @param {string} dependentKey1508 * @param {string} dependentKey2509 * @returns {Ember.ComputedProperty}510 */511computed.gtProperties = function (dependentKey1, dependentKey2) {512  return computed(dependentKey1, dependentKey2, function () {513    return smartGet(this, dependentKey1) > smartGet(this, dependentKey2);514  });515};516/**517 * A computed property that returns true if dependent value is less than the needed value518 * App.*-keys are supported519 * <pre>520 * var o = Em.Object.create({521 *  p1: 4,522 *  p2: Em.computed.lt('p1', 1)523 * });524 * console.log(o.get('p2')); // false525 * o.set('p1', 4);526 * console.log(o.get('p2')); // false527 * o.set('p1', 5);528 * console.log(o.get('p2')); // true529 * </pre>530 *531 * @method lt532 * @param {string} dependentKey533 * @param {*} value534 * @returns {Ember.ComputedProperty}535 */536computed.lt = function (dependentKey, value) {537  return computed(dependentKey, function () {538    return smartGet(this, dependentKey) < value;539  });540};541/**542 * A computed property that returns true if first dependent property is less than the second dependent property543 * App.*-keys are supported544 * <pre>545 * var o = Em.Object.create({546 *  p1: 4,547 *  p2: 1,548 *  p3: Em.computed.ltProperties('p1', 'p2')549 * });550 * console.log(o.get('p3')); // false551 * o.set('p2', 4);552 * console.log(o.get('p3')); // false553 * o.set('p2', 5);554 * console.log(o.get('p3')); // true555 * </pre>556 *557 * @method gtProperties558 * @param {string} dependentKey1559 * @param {string} dependentKey2560 * @returns {Ember.ComputedProperty}561 */562computed.ltProperties = function (dependentKey1, dependentKey2) {563  return computed(dependentKey1, dependentKey2, function () {564    return smartGet(this, dependentKey1) < smartGet(this, dependentKey2);565  });566};567/**568 * A computed property that returns true if dependent property is match to the needed regular expression569 * <pre>570 * var o = Em.Object.create({571 *  p1: 'abc',572 *  p2: Em.computed.match('p1', /^a/)573 * });574 * console.log(o.get('p2')); // true575 * o.set('p1', 'bc');576 * console.log(o.get('p2')); // false577 * </pre>578 *579 * @method match580 * @param {string} dependentKey581 * @param {RegExp} regexp582 * @returns {Ember.ComputedProperty}583 */584computed.match = function (dependentKey, regexp) {585  return computed(dependentKey, function () {586    var value = get(this, dependentKey);587    if (!regexp) {588      return false;589    }590    return regexp.test(value);591  });592};593/**594 * A computed property that returns true of some collection's item has property with needed value595 * <pre>596 * var o = Em.Object.create({597 *  p1: [{a: 1}, {a: 2}, {a: 3}],598 *  p2: Em.computed.someBy('p1', 'a', 1)599 * });600 * console.log(o.get('p2')); // true601 * o.set('p1.0.a', 2);602 * console.log(o.get('p2')); // false603 * </pre>604 *605 * @method someBy606 * @param {string} collectionKey607 * @param {string} propertyName608 * @param {*} neededValue609 * @returns {Ember.ComputedProperty}610 */611computed.someBy = function (collectionKey, propertyName, neededValue) {612  return computed(collectionKey + '.@each.' + propertyName, function () {613    var collection = smartGet(this, collectionKey);614    if (!collection) {615      return false;616    }617    return collection.someProperty(propertyName, neededValue);618  });619};620/**621 * A computed property that returns true of all collection's items have property with needed value622 * <pre>623 * var o = Em.Object.create({624 *  p1: [{a: 1}, {a: 1}, {a: 1}],625 *  p2: Em.computed.everyBy('p1', 'a', 1)626 * });627 * console.log(o.get('p2')); // true628 * o.set('p1.0.a', 2);629 * console.log(o.get('p2')); // false630 * </pre>631 *632 * @method everyBy633 * @param {string} collectionKey634 * @param {string} propertyName635 * @param {*} neededValue636 * @returns {Ember.ComputedProperty}637 */638computed.everyBy = function (collectionKey, propertyName, neededValue) {639  return computed(collectionKey + '.@each.' + propertyName, function () {640    var collection = smartGet(this, collectionKey);641    if (!collection) {642      return false;643    }644    return collection.everyProperty(propertyName, neededValue);645  });646};647/**648 * A computed property that returns array with values of named property on all items in the collection649 * <pre>650 * var o = Em.Object.create({651 *  p1: [{a: 1}, {a: 2}, {a: 3}],652 *  p2: Em.computed.everyBy('p1', 'a')653 * });654 * console.log(o.get('p2')); // [1, 2, 3]655 * o.set('p1.0.a', 2);656 * console.log(o.get('p2')); // [2, 2, 3]657 * </pre>658 *659 * @method mapBy660 * @param {string} collectionKey661 * @param {string} propertyName662 * @returns {Ember.ComputedProperty}663 */664computed.mapBy = function (collectionKey, propertyName) {665  return computed(collectionKey + '.@each.' + propertyName, function () {666    var collection = smartGet(this, collectionKey);667    if (!collection) {668      return [];669    }670    return collection.mapProperty(propertyName);671  });672};673/**674 * A computed property that returns array with collection's items that have needed property value675 * <pre>676 * var o = Em.Object.create({677 *  p1: [{a: 1}, {a: 2}, {a: 3}],678 *  p2: Em.computed.filterBy('p1', 'a', 2)679 * });680 * console.log(o.get('p2')); // [{a: 2}]681 * o.set('p1.0.a', 2);682 * console.log(o.get('p2')); // [{a: 2}, {a: 2}]683 * </pre>684 *685 * @method filterBy686 * @param {string} collectionKey687 * @param {string} propertyName688 * @param {*} neededValue689 * @returns {Ember.ComputedProperty}690 */691computed.filterBy = function (collectionKey, propertyName, neededValue) {692  return computed(collectionKey + '.@each.' + propertyName, function () {693    var collection = smartGet(this, collectionKey);694    if (!collection) {695      return [];696    }697    return collection.filterProperty(propertyName, neededValue);698  });699};700/**701 * A computed property that returns first collection's item that has needed property value702 * <pre>703 * var o = Em.Object.create({704 *  p1: [{a: 1, b: 1}, {a: 2, b: 2}, {a: 3, b: 3}],705 *  p2: Em.computed.findBy('p1', 'a', 2)706 * });707 * console.log(o.get('p2')); // [{a: 2, b: 2}]708 * o.set('p1.0.a', 2);709 * console.log(o.get('p2')); // [{a: 2, b: 1}]710 * </pre>711 *712 * @method findBy713 * @param {string} collectionKey714 * @param {string} propertyName715 * @param {*} neededValue716 * @returns {Ember.ComputedProperty}717 */718computed.findBy = function (collectionKey, propertyName, neededValue) {719  return computed(collectionKey + '.@each.' + propertyName, function () {720    var collection = smartGet(this, collectionKey);721    if (!collection) {722      return null;723    }724    return collection.findProperty(propertyName, neededValue);725  });726};727/**728 * A computed property that returns value equal to the dependent729 * Should be used as 'short-name' for deeply-nested values730 * App.*-keys are supported731 * <pre>732 * var o = Em.Object.create({733 *  p1: {a: {b: {c: 2}}},734 *  p2: Em.computed.alias('p1.a.b.c')735 * });736 * console.log(o.get('p2')); // 2737 * o.set('p1.a.b.c', 4);738 * console.log(o.get('p2')); // 4739 * </pre>740 *741 * @method alias742 * @param {string} dependentKey743 * @returns {Ember.ComputedProperty}744 */745computed.alias = function (dependentKey) {746  return computed(dependentKey, function () {747    return smartGet(this, dependentKey);748  });749};750/**751 * A computed property that returns true if dependent property exists in the needed values752 * <pre>753 * var o = Em.Object.create({754 *  p1: 2,755 *  p2: Em.computed.existsIn('p1', [1, 2, 3])756 * });757 * console.log(o.get('p2')); // true758 * o.set('p1', 4);759 * console.log(o.get('p2')); // false760 * </pre>761 *762 * @method existsIn763 * @param {string} dependentKey764 * @param {array} neededValues765 * @returns {Ember.ComputedProperty}766 */767computed.existsIn = function (dependentKey, neededValues) {768  return computed(dependentKey, function () {769    var value = smartGet(this, dependentKey);770    return makeArray(neededValues).contains(value);771  });772};773/**774 * A computed property that returns true if dependent property doesn't exist in the needed values775 * <pre>776 * var o = Em.Object.create({777 *  p1: 2,778 *  p2: Em.computed.notExistsIn('p1', [1, 2, 3])779 * });780 * console.log(o.get('p2')); // false781 * o.set('p1', 4);782 * console.log(o.get('p2')); // true783 * </pre>784 *785 * @method notExistsIn786 * @param {string} dependentKey787 * @param {array} neededValues788 * @returns {Ember.ComputedProperty}789 */790computed.notExistsIn = function (dependentKey, neededValues) {791  return computed(dependentKey, function () {792    var value = smartGet(this, dependentKey);793    return !makeArray(neededValues).contains(value);794  });795};796/**797 * A computed property that returns result of calculation <code>(dependentProperty1/dependentProperty2 * 100)</code>798 * If accuracy is 0 (by default), result is rounded to integer799 * Otherwise - result is float with provided accuracy800 * App.*-keys are supported801 * <pre>802 * var o = Em.Object.create({803 *  p1: 2,804 *  p2: 4,805 *  p3: Em.computed.percents('p1', 'p2')806 * });807 * console.log(o.get('p3')); // 50808 * o.set('p2', 5);809 * console.log(o.get('p3')); // 40810 * </pre>811 *812 * @method percents813 * @param {string} dependentKey1814 * @param {string} dependentKey2815 * @param {number} [accuracy=0]816 * @returns {Ember.ComputedProperty}817 */818computed.percents = function (dependentKey1, dependentKey2, accuracy) {819  if (arguments.length < 3) {820    accuracy = 0;821  }822  return computed(dependentKey1, dependentKey2, function () {823    var v1 = Number(smartGet(this, dependentKey1));824    var v2 = Number(smartGet(this, dependentKey2));825    var result = v1 / v2 * 100;826    if (0 === accuracy) {827      return Math.round(result);828    }829    return parseFloat(result.toFixed(accuracy));830  });831};832/**833 * A computed property that returns result of <code>App.format.role</code> for dependent value834 * <pre>835 * var o = Em.Object.create({836 *  p1: 'SECONDARY_NAMENODE',837 *  p3: Em.computed.formatRole('p1', false)838 * });839 * console.log(o.get('p2')); // 'SNameNode'840 * o.set('p1', 'FLUME_HANDLER);841 * console.log(o.get('p2')); // 'Flume'842 * </pre>843 *844 * @method formatRole845 * @param {string} dependentKey846 * @param {boolean} isServiceRole847 * @returns {Ember.ComputedProperty}848 */849computed.formatRole = function (dependentKey, isServiceRole) {850  return computed(dependentKey, function () {851    var value = get(this, dependentKey);852    return App.format.role(value, isServiceRole);853  });854};855/**856 * A computed property that returns sum of the named property in the each collection's item857 * <pre>858 * var o = Em.Object.create({859 *  p1: [{a: 1}, {a: 2}, {a: 3}],860 *  p2: Em.computed.sumBy('p1', 'a')861 * });862 * console.log(o.get('p2')); // 6863 * o.set('p1.0.a', 2);864 * console.log(o.get('p2')); // 7865 * </pre>866 *867 * @method sumBy868 * @param {string} collectionKey869 * @param {string} propertyName870 * @returns {Ember.ComputedProperty}871 */872computed.sumBy = function (collectionKey, propertyName) {873  return computed(collectionKey + '.@each.' + propertyName, function () {874    var collection = smartGet(this, collectionKey);875    if (Em.isEmpty(collection)) {876      return 0;877    }878    var sum = 0;879    collection.forEach(function (item) {880      sum += Number(get(item, propertyName));881    });882    return sum;883  });884};885/**886 * A computed property that returns I18n-string formatted with dependent properties887 * Takes at least one argument888 * App.*-keys are supported889 *890 * @param {string} key key in the I18n-messages891 * @param {...string} dependentKeys892 * @method i18nFormat893 * @returns {Ember.ComputedProperty}894 */895computed.i18nFormat = generateComputedWithKey(function (key, dependentValues) {896  var str = Em.I18n.t(key);897  if (!str) {898    return '';899  }900  return str.format.apply(str, dependentValues);901});902/**903 * A computed property that returns string formatted with dependent properties904 * Takes at least one argument905 * App.*-keys are supported906 * <pre>907 * var o = Em.Object.create({908 *  p1: 'abc',909 *  p2: 'cba',910 *  p3: Em.computed.format('{0} => {1}', 'p1', 'p2')911 * });912 * console.log(o.get('p3')); // 'abc => cba'913 * o.set('p1', 'aaa');914 * console.log(o.get('p3')); // 'aaa => cba'915 * </pre>916 *917 * @param {string} str string to format918 * @param {...string} dependentKeys919 * @method format920 * @returns {Ember.ComputedProperty}921 */922computed.format = generateComputedWithKey(function (str, dependentValues) {923  if (!str) {924    return '';925  }926  return str.format.apply(str, dependentValues);927});928/**929 * A computed property that returns dependent values joined with separator930 * Takes at least one argument931 * App.*-keys are supported932 * <pre>933 * var o = Em.Object.create({934 *  p1: 'abc',935 *  p2: 'cba',936 *  p3: Em.computed.concat('|', 'p1', 'p2')937 * });938 * console.log(o.get('p3')); // 'abc|cba'939 * o.set('p1', 'aaa');940 * console.log(o.get('p3')); // 'aaa|cba'941 * </pre>942 *943 * @param {string} separator944 * @param {...string} dependentKeys945 * @method concat946 * @return {Ember.ComputedProperty}947 */948computed.concat = generateComputedWithKey(function (separator, dependentValues) {949  return dependentValues.join(separator);950});951/**952 * A computed property that returns first not blank value from dependent values953 * Based on <code>Ember.isBlank</code>954 * Takes at least 1 argument955 * Dependent values order affects the result956 * App.*-keys are supported957 * <pre>958 * var o = Em.Object.create({959 *  p1: null,960 *  p2: '',961 *  p3: 'abc'962 *  p4: Em.computed.firstNotBlank('p1', 'p2', 'p3')963 * });964 * console.log(o.get('p4')); // 'abc'965 * o.set('p1', 'aaa');966 * console.log(o.get('p4')); // 'aaa'967 * </pre>968 *969 * @param {...string} dependentKeys970 * @method firstNotBlank971 * @return {Ember.ComputedProperty}972 */973computed.firstNotBlank = generateComputedWithValues(function (values) {974  for (var i = 0; i < values.length; i++) {975    if (!Em.isBlank(values[i])) {976      return values[i];977    }978  }979  return null;980});981/**982 * A computed property that returns dependent value if it is truly or ('0'|0)983 * Returns <code>'n/a'</code> otherwise984 * App.*-keys are supported985 * <pre>986 * var o = Em.Object.create({987 *  p1: 0,988 *  p2: Em.computed.formatUnavailable('p1')989 * });990 * console.log(o.get('p2')); // 0991 * o.set('p1', 12);992 * console.log(o.get('p2')); // 12993 * o.set('p1', 'some string');994 * console.log(o.get('p2')); // 'n/a'995 * </pre>996 *997 * @param {string} dependentKey998 * @method formatUnavailable999 * @returns {Ember.ComputedProperty}1000 */1001computed.formatUnavailable = function(dependentKey) {1002  return computed(dependentKey, function () {1003    var value = smartGet(this, dependentKey);1004    return value || value == 0 ? value : Em.I18n.t('services.service.summary.notAvailable');1005  });1006};1007/**1008 * A computed property that returns one of provided values basing on dependent value1009 * If dependent value is 0, <code>zeroMsg</code> is returned1010 * If dependent value is 1, <code>oneMsg</code> is returned1011 * If dependent value is greater than 1, <code>manyMsg</code> is returned1012 * App.*-keys are supported1013 * <pre>1014 * var o = Em.Object.create({1015 *  p1: 0,1016 *  p2: Em.computed.formatUnavailable('p1', '0msg', '1msg', '2+msg')1017 * });1018 * console.log(o.get('p2')); // '0msg'1019 * o.set('p1', 1);1020 * console.log(o.get('p2')); // '1msg'1021 * o.set('p1', 100500);1022 * console.log(o.get('p2')); // '2+msg'1023 * </pre>1024 *1025 * @param {string} dependentKey1026 * @param {string} zeroMsg1027 * @param {string} oneMsg1028 * @param {string} manyMsg1029 * @returns {Ember.ComputedProperty}1030 * @method countBasedMessage1031 */1032computed.countBasedMessage = function (dependentKey, zeroMsg, oneMsg, manyMsg) {1033  return computed(dependentKey, function () {1034    var value = Number(smartGet(this, dependentKey));1035    if (value === 0) {1036      return zeroMsg;1037    }1038    if (value > 1) {1039      return manyMsg;1040    }1041    return oneMsg;1042  });1043};1044/**1045 * A computed property that returns property value according to the property key and object key1046 * App.*-keys are supported1047 * <pre>1048 *   var o = Em.Object.create({1049 *    p1: {a: 1, b: 2, c: 3},1050 *    p2: 'a',1051 *    p3: Em.computed.getByKey('p1', 'p2')1052 *   });1053 *   console.log(o.get('p3')); // 11054 *   o.set('p2', 'b');1055 *   console.log(o.get('p3')); // 21056 *   o.set('p2', 'c');1057 *   console.log(o.get('p3')); // 31058 * </pre>1059 *1060 * With `defaultValue`1061 * <pre>1062 *   var o = Em.Object.create({1063 *    p1: {a: 1, b: 2, c: 3},1064 *    p2: 'd',1065 *    p3: Em.computed.getByKey('p1', 'p2', 100500)1066 *   });1067 *   console.log(o.get('p3')); // 100500 - default value is returned, because there is no key `d` in the `p1`1068 * </pre>1069 * <b>IMPORTANT!</b> This CP <b>SHOULD NOT</b> be used with for object with values equal to the views (like <code>{a: App.MyViewA, b: App.MyViewB}</code>)1070 * This restriction exists because views may be undefined on the moment when this CP is calculated (files are not `required` yet)1071 *1072 * @param {string} objectKey1073 * @param {string} propertyKey1074 * @param {*} [defaultValue]1075 * @returns {Ember.ComputedProperty}1076 */1077computed.getByKey = function (objectKey, propertyKey, defaultValue) {1078  return computed(objectKey, propertyKey, function () {1079    var object = smartGet(this, objectKey);1080    var property = smartGet(this, propertyKey);1081    if (!object) {1082      return null;1083    }1084    return object.hasOwnProperty(property) ? object[property] : defaultValue;1085  });...keyframe-utils.js
Source:keyframe-utils.js  
1"use strict";2// Utility functions and common keyframe test data.3// ------------------------------4//  Helper functions5// ------------------------------6/**7 * Test equality between two lists of computed keyframes8 * @param {Array.<ComputedKeyframe>} a - actual computed keyframes9 * @param {Array.<ComputedKeyframe>} b - expected computed keyframes10 */11function assert_frame_lists_equal(a, b) {12  assert_equals(a.length, b.length, "number of frames");13  for (var i = 0; i < Math.min(a.length, b.length); i++) {14    assert_frames_equal(a[i], b[i], "ComputedKeyframe #" + i);15  }16}17/** Helper */18function assert_frames_equal(a, b, name) {19  assert_equals(Object.keys(a).sort().toString(),20                Object.keys(b).sort().toString(),21                "properties on " + name);22  for (var p in a) {23    assert_equals(a[p], b[p], "value for '" + p + "' on " + name);24  }25}26// ------------------------------27//  Easing values28// ------------------------------29// [specified easing value, expected easing value]30var gEasingValueTests = [31  ["linear", "linear"],32  ["ease-in-out", "ease-in-out"],33  ["Ease\\2d in-out", "ease-in-out"],34  ["ease /**/", "ease"],35];36var gInvalidEasingInKeyframeSequenceTests = [37  { desc:   "a blank easing",38    input:  [{ easing: "" }] },39  { desc:   "an unrecognized easing",40    input:  [{ easing: "unrecognized" }] },41  { desc:   "an 'initial' easing",42    input:  [{ easing: "initial" }] },43  { desc:   "an 'inherit' easing",44    input:  [{ easing: "inherit" }] },45  { desc:   "a variable easing",46    input:  [{ easing: "var(--x)" }] },47  { desc:   "a multi-value easing",48    input:  [{ easing: "ease-in-out, ease-out" }] }49];50// ------------------------------51//  Composite values52// ------------------------------53var gGoodKeyframeCompositeValueTests = [54  "replace", "add", "accumulate", undefined55];56var gGoodOptionsCompositeValueTests = [57  "replace", "add", "accumulate"58];59var gBadCompositeValueTests = [60  "unrecognised", "replace ", "Replace", null61];62// ------------------------------63//  Keyframes64// ------------------------------65var gEmptyKeyframeListTests = [66  [],67  null,68  undefined,69];70var gPropertyIndexedKeyframesTests = [71  { desc:   "a one property two value property-indexed keyframes specification",72    input:  { left: ["10px", "20px"] },73    output: [{ offset: null, computedOffset: 0, easing: "linear",74               left: "10px" },75             { offset: null, computedOffset: 1, easing: "linear",76               left: "20px" }] },77  { desc:   "a one shorthand property two value property-indexed keyframes"78            + " specification",79    input:  { margin: ["10px", "10px 20px 30px 40px"] },80    output: [{ offset: null, computedOffset: 0, easing: "linear",81               margin: "10px" },82             { offset: null, computedOffset: 1, easing: "linear",83               margin: "10px 20px 30px 40px" }] },84  { desc:   "a two property (one shorthand and one of its longhand components)"85            + " two value property-indexed keyframes specification",86    input:  { marginTop: ["50px", "60px"],87              margin: ["10px", "10px 20px 30px 40px"] },88    output: [{ offset: null, computedOffset: 0, easing: "linear",89               marginTop: "50px", margin: "10px" },90             { offset: null, computedOffset: 1, easing: "linear",91               marginTop: "60px", margin: "10px 20px 30px 40px" }] },92  { desc:   "a two property two value property-indexed keyframes specification",93    input:  { left: ["10px", "20px"],94              top: ["30px", "40px"] },95    output: [{ offset: null, computedOffset: 0, easing: "linear",96               left: "10px", top: "30px" },97             { offset: null, computedOffset: 1, easing: "linear",98               left: "20px", top: "40px" }] },99  { desc:   "a two property property-indexed keyframes specification with"100            + " different numbers of values",101    input:  { left: ["10px", "20px", "30px"],102              top: ["40px", "50px"] },103    output: [{ offset: null, computedOffset: 0.0, easing: "linear",104               left: "10px", top: "40px" },105             { offset: null, computedOffset: 0.5, easing: "linear",106               left: "20px" },107             { offset: null, computedOffset: 1.0, easing: "linear",108               left: "30px", top: "50px" }] },109  { desc:   "a property-indexed keyframes specification with an invalid value",110    input:  { left: ["10px", "20px", "30px", "40px", "50px"],111              top:  ["15px", "25px", "invalid", "45px", "55px"] },112    output: [{ offset: null, computedOffset: 0.00, easing: "linear",113               left: "10px", top: "15px" },114             { offset: null, computedOffset: 0.25, easing: "linear",115               left: "20px", top: "25px" },116             { offset: null, computedOffset: 0.50, easing: "linear",117               left: "30px" },118             { offset: null, computedOffset: 0.75, easing: "linear",119               left: "40px", top: "45px" },120             { offset: null, computedOffset: 1.00, easing: "linear",121               left: "50px", top: "55px" }] },122  { desc:   "a one property two value property-indexed keyframes specification"123            + " that needs to stringify its values",124    input:  { opacity: [0, 1] },125    output: [{ offset: null, computedOffset: 0, easing: "linear",126               opacity: "0" },127             { offset: null, computedOffset: 1, easing: "linear",128               opacity: "1" }] },129  { desc:   "a property-indexed keyframes specification with a CSS variable"130            + " reference",131    input:  { left: [ "var(--dist)", "calc(var(--dist) + 100px)" ] },132    output: [{ offset: null, computedOffset: 0.0, easing: "linear",133               left: "var(--dist)" },134             { offset: null, computedOffset: 1.0, easing: "linear",135               left: "calc(var(--dist) + 100px)" }] },136  { desc:   "a property-indexed keyframes specification with a CSS variable"137            + " reference in a shorthand property",138    input:  { margin: [ "var(--dist)", "calc(var(--dist) + 100px)" ] },139    output: [{ offset: null, computedOffset: 0.0, easing: "linear",140               margin: "var(--dist)" },141             { offset: null, computedOffset: 1.0, easing: "linear",142               margin: "calc(var(--dist) + 100px)" }] },143  { desc:   "a one property one value property-indexed keyframes specification",144    input:  { left: ["10px"] },145    output: [{ offset: null, computedOffset: 1, easing: "linear",146               left: "10px" }] },147  { desc:   "a one property one non-array value property-indexed keyframes"148            + " specification",149    input:  { left: "10px" },150    output: [{ offset: null, computedOffset: 1, easing: "linear",151               left: "10px" }] },152  { desc:   "a one property two value property-indexed keyframes specification"153            + " where the first value is invalid",154    input:  { left: ["invalid", "10px"] },155    output: [{ offset: null, computedOffset: 0, easing: "linear" },156             { offset: null, computedOffset: 1, easing: "linear",157               left: "10px" }] },158  { desc:   "a one property two value property-indexed keyframes specification"159            + " where the second value is invalid",160    input:  { left: ["10px", "invalid"] },161    output: [{ offset: null, computedOffset: 0, easing: "linear",162               left: "10px" },163             { offset: null, computedOffset: 1, easing: "linear" }] },164];165var gKeyframeSequenceTests = [166  { desc:   "a one property one keyframe sequence",167    input:  [{ offset: 1, left: "10px" }],168    output: [{ offset: 1, computedOffset: 1, easing: "linear",169               left: "10px" }] },170  { desc:   "a one property two keyframe sequence",171    input:  [{ offset: 0, left: "10px" },172             { offset: 1, left: "20px" }],173    output: [{ offset: 0, computedOffset: 0, easing: "linear", left: "10px" },174             { offset: 1, computedOffset: 1, easing: "linear", left: "20px" }]175  },176  { desc:   "a two property two keyframe sequence",177    input:  [{ offset: 0, left: "10px", top: "30px" },178             { offset: 1, left: "20px", top: "40px" }],179    output: [{ offset: 0, computedOffset: 0, easing: "linear",180               left: "10px", top: "30px" },181             { offset: 1, computedOffset: 1, easing: "linear",182               left: "20px", top: "40px" }] },183  { desc:   "a one shorthand property two keyframe sequence",184    input:  [{ offset: 0, margin: "10px" },185             { offset: 1, margin: "20px 30px 40px 50px" }],186    output: [{ offset: 0, computedOffset: 0, easing: "linear",187               margin: "10px" },188             { offset: 1, computedOffset: 1, easing: "linear",189               margin: "20px 30px 40px 50px" }] },190  { desc:   "a two property (a shorthand and one of its component longhands)"191            + " two keyframe sequence",192    input:  [{ offset: 0, margin: "10px", marginTop: "20px" },193             { offset: 1, marginTop: "70px", margin: "30px 40px 50px 60px" }],194    output: [{ offset: 0, computedOffset: 0, easing: "linear",195               margin: "10px", marginTop: "20px" },196             { offset: 1, computedOffset: 1, easing: "linear",197               marginTop: "70px", margin: "30px 40px 50px 60px" }] },198  { desc:   "a keyframe sequence with duplicate values for a given interior"199            + " offset",200    input:  [{ offset: 0.0, left: "10px" },201             { offset: 0.5, left: "20px" },202             { offset: 0.5, left: "30px" },203             { offset: 0.5, left: "40px" },204             { offset: 1.0, left: "50px" }],205    output: [{ offset: 0.0, computedOffset: 0.0, easing: "linear",206               left: "10px" },207             { offset: 0.5, computedOffset: 0.5, easing: "linear",208               left: "20px" },209             { offset: 0.5, computedOffset: 0.5, easing: "linear",210               left: "30px" },211             { offset: 0.5, computedOffset: 0.5, easing: "linear",212               left: "40px" },213             { offset: 1.0, computedOffset: 1.0, easing: "linear",214               left: "50px" }] },215  { desc:   "a keyframe sequence with duplicate values for offsets 0 and 1",216    input:  [{ offset: 0, left: "10px" },217             { offset: 0, left: "20px" },218             { offset: 0, left: "30px" },219             { offset: 1, left: "40px" },220             { offset: 1, left: "50px" },221             { offset: 1, left: "60px" }],222    output: [{ offset: 0, computedOffset: 0, easing: "linear", left: "10px" },223             { offset: 0, computedOffset: 0, easing: "linear", left: "20px" },224             { offset: 0, computedOffset: 0, easing: "linear", left: "30px" },225             { offset: 1, computedOffset: 1, easing: "linear", left: "40px" },226             { offset: 1, computedOffset: 1, easing: "linear", left: "50px" },227             { offset: 1, computedOffset: 1, easing: "linear", left: "60px" }]228  },229  { desc:   "a two property four keyframe sequence",230    input:  [{ offset: 0, left: "10px" },231             { offset: 0, top: "20px" },232             { offset: 1, top: "30px" },233             { offset: 1, left: "40px" }],234    output: [{ offset: 0, computedOffset: 0, easing: "linear", left: "10px" },235             { offset: 0, computedOffset: 0, easing: "linear", top: "20px" },236             { offset: 1, computedOffset: 1, easing: "linear", top: "30px" },237             { offset: 1, computedOffset: 1, easing: "linear", left: "40px" }]238  },239  { desc:   "a single keyframe sequence with omitted offset",240    input:  [{ left: "10px" }],241    output: [{ offset: null, computedOffset: 1, easing: "linear",242               left: "10px" }] },243  { desc:   "a single keyframe sequence with null offset",244    input:  [{ offset: null, left: "10px" }],245    output: [{ offset: null, computedOffset: 1, easing: "linear",246               left: "10px" }] },247  { desc:   "a single keyframe sequence with string offset",248    input:  [{ offset: '0.5', left: "10px" }],249    output: [{ offset: 0.5, computedOffset: 0.5, easing: "linear",250               left: "10px" }] },251  { desc:   "a one property keyframe sequence with some omitted offsets",252    input:  [{ offset: 0.00, left: "10px" },253             { offset: 0.25, left: "20px" },254             { left: "30px" },255             { left: "40px" },256             { offset: 1.00, left: "50px" }],257    output: [{ offset: 0.00, computedOffset: 0.00, easing: "linear",258               left: "10px" },259             { offset: 0.25, computedOffset: 0.25, easing: "linear",260               left: "20px" },261             { offset: null, computedOffset: 0.50, easing: "linear",262               left: "30px" },263             { offset: null, computedOffset: 0.75, easing: "linear",264               left: "40px" },265             { offset: 1.00, computedOffset: 1.00, easing: "linear",266               left: "50px" }] },267  { desc:   "a one property keyframe sequence with some null offsets",268    input:  [{ offset: 0.00, left: "10px" },269             { offset: 0.25, left: "20px" },270             { offset: null, left: "30px" },271             { offset: null, left: "40px" },272             { offset: 1.00, left: "50px" }],273    output: [{ offset: 0.00, computedOffset: 0.00, easing: "linear",274               left: "10px" },275             { offset: 0.25, computedOffset: 0.25, easing: "linear",276               left: "20px" },277             { offset: null, computedOffset: 0.50, easing: "linear",278               left: "30px" },279             { offset: null, computedOffset: 0.75, easing: "linear",280               left: "40px" },281             { offset: 1.00, computedOffset: 1.00, easing: "linear",282               left: "50px" }] },283  { desc:   "a two property keyframe sequence with some omitted offsets",284    input:  [{ offset: 0.00, left: "10px", top: "20px" },285             { offset: 0.25, left: "30px" },286             { left: "40px" },287             { left: "50px", top: "60px" },288             { offset: 1.00, left: "70px", top: "80px" }],289    output: [{ offset: 0.00, computedOffset: 0.00, easing: "linear",290               left: "10px", top: "20px" },291             { offset: 0.25, computedOffset: 0.25, easing: "linear",292               left: "30px" },293             { offset: null, computedOffset: 0.50, easing: "linear",294               left: "40px" },295             { offset: null, computedOffset: 0.75, easing: "linear",296               left: "50px", top: "60px" },297             { offset: 1.00, computedOffset: 1.00, easing: "linear",298               left: "70px", top: "80px" }] },299  { desc:   "a one property keyframe sequence with all omitted offsets",300    input:  [{ left: "10px" },301             { left: "20px" },302             { left: "30px" },303             { left: "40px" },304             { left: "50px" }],305    output: [{ offset: null, computedOffset: 0.00, easing: "linear",306               left: "10px" },307             { offset: null, computedOffset: 0.25, easing: "linear",308               left: "20px" },309             { offset: null, computedOffset: 0.50, easing: "linear",310               left: "30px" },311             { offset: null, computedOffset: 0.75, easing: "linear",312               left: "40px" },313             { offset: null, computedOffset: 1.00, easing: "linear",314               left: "50px" }] },315  { desc:   "a keyframe sequence with different easing values, but the same"316            + " easing value for a given offset",317    input:  [{ offset: 0.0, easing: "ease",     left: "10px"},318             { offset: 0.0, easing: "ease",     top: "20px"},319             { offset: 0.5, easing: "linear",   left: "30px" },320             { offset: 0.5, easing: "linear",   top: "40px" },321             { offset: 1.0, easing: "step-end", left: "50px" },322             { offset: 1.0, easing: "step-end", top: "60px" }],323    output: [{ offset: 0.0, computedOffset: 0.0, easing: "ease",324               left: "10px" },325             { offset: 0.0, computedOffset: 0.0, easing: "ease",326               top: "20px" },327             { offset: 0.5, computedOffset: 0.5, easing: "linear",328               left: "30px" },329             { offset: 0.5, computedOffset: 0.5, easing: "linear",330               top: "40px" },331             { offset: 1.0, computedOffset: 1.0, easing: "steps(1)",332               left: "50px" },333             { offset: 1.0, computedOffset: 1.0, easing: "steps(1)",334               top: "60px" }] },335  { desc:   "a keyframe sequence with different composite values, but the"336            + " same composite value for a given offset",337    input:  [{ offset: 0.0, composite: "replace", left: "10px" },338             { offset: 0.0, composite: "replace", top: "20px" },339             { offset: 0.5, composite: "add",     left: "30px" },340             { offset: 0.5, composite: "add",     top: "40px" },341             { offset: 1.0, composite: "replace", left: "50px" },342             { offset: 1.0, composite: "replace", top: "60px" }],343    output: [{ offset: 0.0, computedOffset: 0.0, easing: "linear",344               composite: "replace", left: "10px" },345             { offset: 0.0, computedOffset: 0.0, easing: "linear",346               composite: "replace", top: "20px" },347             { offset: 0.5, computedOffset: 0.5, easing: "linear",348               composite: "add", left: "30px" },349             { offset: 0.5, computedOffset: 0.5, easing: "linear",350               composite: "add", top: "40px" },351             { offset: 1.0, computedOffset: 1.0, easing: "linear",352               composite: "replace", left: "50px" },353             { offset: 1.0, computedOffset: 1.0, easing: "linear",354               composite: "replace", top: "60px" }] },355  { desc:   "a one property two keyframe sequence that needs to stringify"356            + " its values",357    input:  [{ offset: 0, opacity: 0 },358             { offset: 1, opacity: 1 }],359    output: [{ offset: 0, computedOffset: 0, easing: "linear", opacity: "0" },360             { offset: 1, computedOffset: 1, easing: "linear", opacity: "1" }]361  },362  { desc:   "a keyframe sequence with a CSS variable reference",363    input:  [{ left: "var(--dist)" },364             { left: "calc(var(--dist) + 100px)" }],365    output: [{ offset: null, computedOffset: 0.0, easing: "linear",366               left: "var(--dist)" },367             { offset: null, computedOffset: 1.0, easing: "linear",368               left: "calc(var(--dist) + 100px)" }] },369  { desc:   "a keyframe sequence with a CSS variable reference in a shorthand"370            + " property",371    input:  [{ margin: "var(--dist)" },372             { margin: "calc(var(--dist) + 100px)" }],373    output: [{ offset: null, computedOffset: 0.0, easing: "linear",374               margin: "var(--dist)" },375             { offset: null, computedOffset: 1.0, easing: "linear",376               margin: "calc(var(--dist) + 100px)" }] },377  { desc:   "a keyframe sequence where shorthand precedes longhand",378    input:  [{ offset: 0, margin: "10px", marginRight: "20px" },379             { offset: 1, margin: "30px" }],380    output: [{ offset: 0, computedOffset: 0, easing: "linear",381               margin: "10px", marginRight: "20px" },382             { offset: 1, computedOffset: 1, easing: "linear",383               margin: "30px" }] },384  { desc:   "a keyframe sequence where longhand precedes shorthand",385    input:  [{ offset: 0, marginRight: "20px", margin: "10px" },386             { offset: 1, margin: "30px" }],387    output: [{ offset: 0, computedOffset: 0, easing: "linear",388               marginRight: "20px", margin: "10px" },389             { offset: 1, computedOffset: 1, easing: "linear",390               margin: "30px" }] },391  { desc:   "a keyframe sequence where lesser shorthand precedes greater"392            + " shorthand",393    input:  [{ offset: 0,394               borderLeft: "1px solid rgb(1, 2, 3)",395               border: "2px dotted rgb(4, 5, 6)" },396             { offset: 1, border: "3px dashed rgb(7, 8, 9)" }],397    output: [{ offset: 0, computedOffset: 0, easing: "linear",398               borderLeft: "1px solid rgb(1, 2, 3)",399               border: "2px dotted rgb(4, 5, 6)" },400             { offset: 1, computedOffset: 1, easing: "linear",401               border: "3px dashed rgb(7, 8, 9)" }] },402  { desc:   "a keyframe sequence where greater shorthand precedes lesser"403            + " shorthand",404    input:  [{ offset: 0, border: "2px dotted rgb(4, 5, 6)",405               borderLeft: "1px solid rgb(1, 2, 3)" },406             { offset: 1, border: "3px dashed rgb(7, 8, 9)" }],407    output: [{ offset: 0, computedOffset: 0, easing: "linear",408               border: "2px dotted rgb(4, 5, 6)",409               borderLeft: "1px solid rgb(1, 2, 3)" },410             { offset: 1, computedOffset: 1, easing: "linear",411               border: "3px dashed rgb(7, 8, 9)" }] },412  { desc:   "a two property keyframe sequence where one property is missing"413            + " from the first keyframe",414    input:  [{ offset: 0, left: "10px" },415             { offset: 1, left: "20px", top: "30px" }],416    output: [{ offset: 0, computedOffset: 0, easing: "linear", left: "10px" },417             { offset: 1, computedOffset: 1, easing: "linear",418               left: "20px", top: "30px" }] },419  { desc:   "a two property keyframe sequence where one property is missing"420            + " from the last keyframe",421    input:  [{ offset: 0, left: "10px", top: "20px" },422             { offset: 1, left: "30px" }],423    output: [{ offset: 0, computedOffset: 0, easing: "linear",424               left: "10px" , top: "20px" },425             { offset: 1, computedOffset: 1, easing: "linear",426               left: "30px" }] },427  { desc:   "a keyframe sequence with repeated values at offset 1 with"428            + " different easings",429    input:  [{ offset: 0.0, left: "100px", easing: "ease" },430             { offset: 0.0, left: "200px", easing: "ease" },431             { offset: 0.5, left: "300px", easing: "linear" },432             { offset: 1.0, left: "400px", easing: "ease-out" },433             { offset: 1.0, left: "500px", easing: "step-end" }],434    output: [{ offset: 0.0, computedOffset: 0.0, easing: "ease",435               left: "100px" },436             { offset: 0.0, computedOffset: 0.0, easing: "ease",437               left: "200px" },438             { offset: 0.5, computedOffset: 0.5, easing: "linear",439               left: "300px" },440             { offset: 1.0, computedOffset: 1.0, easing: "ease-out",441               left: "400px" },442             { offset: 1.0, computedOffset: 1.0, easing: "steps(1)",443               left: "500px" }] },444];445var gInvalidKeyframesTests = [446  { desc:     "keyframes with an out-of-bounded positive offset",447    input:    [ { opacity: 0 },448                { opacity: 0.5, offset: 2 },449                { opacity: 1 } ],450    expected: { name: "TypeError" } },451  { desc:     "keyframes with an out-of-bounded negative offset",452    input:    [ { opacity: 0 },453                { opacity: 0.5, offset: -1 },454                { opacity: 1 } ],455    expected: { name: "TypeError" } },456  { desc:     "keyframes not loosely sorted by offset",457    input:    [ { opacity: 0, offset: 1 },458                { opacity: 1, offset: 0 } ],459    expected: { name: "TypeError" } },460  { desc:     "property-indexed keyframes with an invalid easing value",461    input:    { opacity: [ 0, 0.5, 1 ],462                easing: "inherit" },463    expected: { name: "TypeError" } },464  { desc:     "a keyframe sequence with an invalid easing value",465    input:    [ { opacity: 0, easing: "jumpy" },466                { opacity: 1 } ],467    expected: { name: "TypeError" } },468  { desc:     "keyframes with an invalid composite value",469    input:    [ { opacity: 0, composite: "alternate" },470                { opacity: 1 } ],471    expected: { name: "TypeError" } }472];473// ------------------------------474//  KeyframeEffectOptions475// ------------------------------476var gKeyframeEffectOptionTests = [477  { desc:     "an empty KeyframeEffectOptions object",478    input:    { },479    expected: { } },480  { desc:     "a normal KeyframeEffectOptions object",481    input:    { delay: 1000,482                fill: "auto",483                iterations: 5.5,484                duration: "auto",485                direction: "alternate" },486    expected: { delay: 1000,487                fill: "auto",488                iterations: 5.5,489                duration: "auto",490                direction: "alternate" } },491  { desc:     "a double value",492    input:    3000,493    expected: { duration: 3000 } },494  { desc:     "+Infinity",495    input:    Infinity,496    expected: { duration: Infinity } },497  { desc:     "an Infinity duration",498    input:    { duration: Infinity },499    expected: { duration: Infinity } },500  { desc:     "an auto duration",501    input:    { duration: "auto" },502    expected: { duration: "auto" } },503  { desc:     "an Infinity iterations",504    input:    { iterations: Infinity },505    expected: { iterations: Infinity } },506  { desc:     "an auto fill",507    input:    { fill: "auto" },508    expected: { fill: "auto" } },509  { desc:     "a forwards fill",510    input:    { fill: "forwards" },511    expected: { fill: "forwards" } }512];513var gInvalidKeyframeEffectOptionTests = [514  { desc:     "-Infinity",515    input:    -Infinity,516    expected: { name: "TypeError" } },517  { desc:     "NaN",518    input:    NaN,519    expected: { name: "TypeError" } },520  { desc:     "a negative value",521    input:    -1,522    expected: { name: "TypeError" } },523  { desc:     "a negative Infinity duration",524    input:    { duration: -Infinity },525    expected: { name: "TypeError" } },526  { desc:     "a NaN duration",527    input:    { duration: NaN },528    expected: { name: "TypeError" } },529  { desc:     "a negative duration",530    input:    { duration: -1 },531    expected: { name: "TypeError" } },532  { desc:     "a string duration",533    input:    { duration: "merrychristmas" },534    expected: { name: "TypeError" } },535  { desc:     "a negative Infinity iterations",536    input:    { iterations: -Infinity},537    expected: { name: "TypeError" } },538  { desc:     "a NaN iterations",539    input:    { iterations: NaN },540    expected: { name: "TypeError" } },541  { desc:     "a negative iterations",542    input:    { iterations: -1 },543    expected: { name: "TypeError" } },544  { desc:     "a blank easing",545    input:    { easing: "" },546    expected: { name: "TypeError" } },547  { desc:     "an unrecognized easing",548    input:    { easing: "unrecognised" },549    expected: { name: "TypeError" } },550  { desc:     "an 'initial' easing",551    input:    { easing: "initial" },552    expected: { name: "TypeError" } },553  { desc:     "an 'inherit' easing",554    input:    { easing: "inherit" },555    expected: { name: "TypeError" } },556  { desc:     "a variable easing",557    input:    { easing: "var(--x)" },558    expected: { name: "TypeError" } },559  { desc:     "a multi-value easing",560    input:    { easing: "ease-in-out, ease-out" },561    expected: { name: "TypeError" } }...border-changes.js
Source:border-changes.js  
1description(2"This test checks the behavior of table styles when changing certain table attributes."3);4var yellow = "rgb(255, 255, 0)";5var orange = "rgb(255, 165, 0)";6var red = "rgb(255, 0, 0)";7var table = document.createElement("table");8table.setAttribute("style", "border-color: yellow");9var row = table.insertRow(-1);10row.setAttribute("style", "border-color: orange");11var cell = row.insertCell(-1);12cell.setAttribute("style", "border-color: red");13document.body.appendChild(table);14shouldBe("getComputedStyle(table, '').borderLeftWidth", "'0px'");15shouldBe("getComputedStyle(table, '').borderRightWidth", "'0px'");16shouldBe("getComputedStyle(table, '').borderTopWidth", "'0px'");17shouldBe("getComputedStyle(table, '').borderBottomWidth", "'0px'");18shouldBe("getComputedStyle(table, '').borderLeftStyle", "'none'");19shouldBe("getComputedStyle(table, '').borderRightStyle", "'none'");20shouldBe("getComputedStyle(table, '').borderTopStyle", "'none'");21shouldBe("getComputedStyle(table, '').borderBottomStyle", "'none'");22shouldBe("getComputedStyle(table, '').borderLeftColor", "yellow");23shouldBe("getComputedStyle(table, '').borderRightColor", "yellow");24shouldBe("getComputedStyle(table, '').borderTopColor", "yellow");25shouldBe("getComputedStyle(table, '').borderBottomColor", "yellow");26shouldBe("getComputedStyle(cell, '').borderLeftWidth", "'0px'");27shouldBe("getComputedStyle(cell, '').borderRightWidth", "'0px'");28shouldBe("getComputedStyle(cell, '').borderTopWidth", "'0px'");29shouldBe("getComputedStyle(cell, '').borderBottomWidth", "'0px'");30shouldBe("getComputedStyle(cell, '').borderLeftStyle", "'none'");31shouldBe("getComputedStyle(cell, '').borderRightStyle", "'none'");32shouldBe("getComputedStyle(cell, '').borderTopStyle", "'none'");33shouldBe("getComputedStyle(cell, '').borderBottomStyle", "'none'");34shouldBe("getComputedStyle(cell, '').borderLeftColor", "red");35shouldBe("getComputedStyle(cell, '').borderRightColor", "red");36shouldBe("getComputedStyle(cell, '').borderTopColor", "red");37shouldBe("getComputedStyle(cell, '').borderBottomColor", "red");38table.border = '';39shouldBe("getComputedStyle(table, '').borderLeftWidth", "'1px'");40shouldBe("getComputedStyle(table, '').borderRightWidth", "'1px'");41shouldBe("getComputedStyle(table, '').borderTopWidth", "'1px'");42shouldBe("getComputedStyle(table, '').borderBottomWidth", "'1px'");43shouldBe("getComputedStyle(table, '').borderLeftStyle", "'outset'");44shouldBe("getComputedStyle(table, '').borderRightStyle", "'outset'");45shouldBe("getComputedStyle(table, '').borderTopStyle", "'outset'");46shouldBe("getComputedStyle(table, '').borderBottomStyle", "'outset'");47shouldBe("getComputedStyle(table, '').borderLeftColor", "yellow");48shouldBe("getComputedStyle(table, '').borderRightColor", "yellow");49shouldBe("getComputedStyle(table, '').borderTopColor", "yellow");50shouldBe("getComputedStyle(table, '').borderBottomColor", "yellow");51shouldBe("getComputedStyle(cell, '').borderLeftWidth", "'1px'");52shouldBe("getComputedStyle(cell, '').borderRightWidth", "'1px'");53shouldBe("getComputedStyle(cell, '').borderTopWidth", "'1px'");54shouldBe("getComputedStyle(cell, '').borderBottomWidth", "'1px'");55shouldBe("getComputedStyle(cell, '').borderLeftStyle", "'inset'");56shouldBe("getComputedStyle(cell, '').borderRightStyle", "'inset'");57shouldBe("getComputedStyle(cell, '').borderTopStyle", "'inset'");58shouldBe("getComputedStyle(cell, '').borderBottomStyle", "'inset'");59shouldBe("getComputedStyle(cell, '').borderLeftColor", "red");60shouldBe("getComputedStyle(cell, '').borderRightColor", "red");61shouldBe("getComputedStyle(cell, '').borderTopColor", "red");62shouldBe("getComputedStyle(cell, '').borderBottomColor", "red");63table.setAttribute("bordercolor", "green");64shouldBe("getComputedStyle(table, '').borderLeftWidth", "'1px'");65shouldBe("getComputedStyle(table, '').borderRightWidth", "'1px'");66shouldBe("getComputedStyle(table, '').borderTopWidth", "'1px'");67shouldBe("getComputedStyle(table, '').borderBottomWidth", "'1px'");68shouldBe("getComputedStyle(table, '').borderLeftStyle", "'solid'");69shouldBe("getComputedStyle(table, '').borderRightStyle", "'solid'");70shouldBe("getComputedStyle(table, '').borderTopStyle", "'solid'");71shouldBe("getComputedStyle(table, '').borderBottomStyle", "'solid'");72shouldBe("getComputedStyle(table, '').borderLeftColor", "yellow");73shouldBe("getComputedStyle(table, '').borderRightColor", "yellow");74shouldBe("getComputedStyle(table, '').borderTopColor", "yellow");75shouldBe("getComputedStyle(table, '').borderBottomColor", "yellow");76shouldBe("getComputedStyle(cell, '').borderLeftWidth", "'1px'");77shouldBe("getComputedStyle(cell, '').borderRightWidth", "'1px'");78shouldBe("getComputedStyle(cell, '').borderTopWidth", "'1px'");79shouldBe("getComputedStyle(cell, '').borderBottomWidth", "'1px'");80shouldBe("getComputedStyle(cell, '').borderLeftStyle", "'solid'");81shouldBe("getComputedStyle(cell, '').borderRightStyle", "'solid'");82shouldBe("getComputedStyle(cell, '').borderTopStyle", "'solid'");83shouldBe("getComputedStyle(cell, '').borderBottomStyle", "'solid'");84shouldBe("getComputedStyle(cell, '').borderLeftColor", "red");85shouldBe("getComputedStyle(cell, '').borderRightColor", "red");86shouldBe("getComputedStyle(cell, '').borderTopColor", "red");87shouldBe("getComputedStyle(cell, '').borderBottomColor", "red");88table.rules = "cols";89shouldBe("getComputedStyle(table, '').borderLeftWidth", "'1px'");90shouldBe("getComputedStyle(table, '').borderRightWidth", "'1px'");91shouldBe("getComputedStyle(table, '').borderTopWidth", "'1px'");92shouldBe("getComputedStyle(table, '').borderBottomWidth", "'1px'");93shouldBe("getComputedStyle(table, '').borderLeftStyle", "'solid'");94shouldBe("getComputedStyle(table, '').borderRightStyle", "'solid'");95shouldBe("getComputedStyle(table, '').borderTopStyle", "'solid'");96shouldBe("getComputedStyle(table, '').borderBottomStyle", "'solid'");97shouldBe("getComputedStyle(table, '').borderLeftColor", "yellow");98shouldBe("getComputedStyle(table, '').borderRightColor", "yellow");99shouldBe("getComputedStyle(table, '').borderTopColor", "yellow");100shouldBe("getComputedStyle(table, '').borderBottomColor", "yellow");101shouldBe("getComputedStyle(cell, '').borderLeftWidth", "'1px'");102shouldBe("getComputedStyle(cell, '').borderRightWidth", "'1px'");103shouldBe("getComputedStyle(cell, '').borderTopWidth", "'0px'");104shouldBe("getComputedStyle(cell, '').borderBottomWidth", "'0px'");105shouldBe("getComputedStyle(cell, '').borderLeftStyle", "'solid'");106shouldBe("getComputedStyle(cell, '').borderRightStyle", "'solid'");107shouldBe("getComputedStyle(cell, '').borderTopStyle", "'none'");108shouldBe("getComputedStyle(cell, '').borderBottomStyle", "'none'");109shouldBe("getComputedStyle(cell, '').borderLeftColor", "red");110shouldBe("getComputedStyle(cell, '').borderRightColor", "red");111shouldBe("getComputedStyle(cell, '').borderTopColor", "red");112shouldBe("getComputedStyle(cell, '').borderBottomColor", "red");113table.rules = "rows";114shouldBe("getComputedStyle(table, '').borderLeftWidth", "'1px'");115shouldBe("getComputedStyle(table, '').borderRightWidth", "'1px'");116shouldBe("getComputedStyle(table, '').borderTopWidth", "'1px'");117shouldBe("getComputedStyle(table, '').borderBottomWidth", "'1px'");118shouldBe("getComputedStyle(table, '').borderLeftStyle", "'solid'");119shouldBe("getComputedStyle(table, '').borderRightStyle", "'solid'");120shouldBe("getComputedStyle(table, '').borderTopStyle", "'solid'");121shouldBe("getComputedStyle(table, '').borderBottomStyle", "'solid'");122shouldBe("getComputedStyle(table, '').borderLeftColor", "yellow");123shouldBe("getComputedStyle(table, '').borderRightColor", "yellow");124shouldBe("getComputedStyle(table, '').borderTopColor", "yellow");125shouldBe("getComputedStyle(table, '').borderBottomColor", "yellow");126shouldBe("getComputedStyle(cell, '').borderLeftWidth", "'0px'");127shouldBe("getComputedStyle(cell, '').borderRightWidth", "'0px'");128shouldBe("getComputedStyle(cell, '').borderTopWidth", "'1px'");129shouldBe("getComputedStyle(cell, '').borderBottomWidth", "'1px'");130shouldBe("getComputedStyle(cell, '').borderLeftStyle", "'none'");131shouldBe("getComputedStyle(cell, '').borderRightStyle", "'none'");132shouldBe("getComputedStyle(cell, '').borderTopStyle", "'solid'");133shouldBe("getComputedStyle(cell, '').borderBottomStyle", "'solid'");134shouldBe("getComputedStyle(cell, '').borderLeftColor", "red");135shouldBe("getComputedStyle(cell, '').borderRightColor", "red");136shouldBe("getComputedStyle(cell, '').borderTopColor", "red");137shouldBe("getComputedStyle(cell, '').borderBottomColor", "red");138document.body.removeChild(table);...scrollbarState.js
Source:scrollbarState.js  
1/*---------------------------------------------------------------------------------------------2 *  Copyright (c) Microsoft Corporation. All rights reserved.3 *  Licensed under the MIT License. See License.txt in the project root for license information.4 *--------------------------------------------------------------------------------------------*/5'use strict';6/**7 * The minimal size of the slider (such that it can still be clickable) -- it is artificially enlarged.8 */9var MINIMUM_SLIDER_SIZE = 20;10var ScrollbarState = /** @class */ (function () {11    function ScrollbarState(arrowSize, scrollbarSize, oppositeScrollbarSize) {12        this._scrollbarSize = Math.round(scrollbarSize);13        this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);14        this._arrowSize = Math.round(arrowSize);15        this._visibleSize = 0;16        this._scrollSize = 0;17        this._scrollPosition = 0;18        this._computedAvailableSize = 0;19        this._computedIsNeeded = false;20        this._computedSliderSize = 0;21        this._computedSliderRatio = 0;22        this._computedSliderPosition = 0;23        this._refreshComputedValues();24    }25    ScrollbarState.prototype.clone = function () {26        var r = new ScrollbarState(this._arrowSize, this._scrollbarSize, this._oppositeScrollbarSize);27        r.setVisibleSize(this._visibleSize);28        r.setScrollSize(this._scrollSize);29        r.setScrollPosition(this._scrollPosition);30        return r;31    };32    ScrollbarState.prototype.setVisibleSize = function (visibleSize) {33        var iVisibleSize = Math.round(visibleSize);34        if (this._visibleSize !== iVisibleSize) {35            this._visibleSize = iVisibleSize;36            this._refreshComputedValues();37            return true;38        }39        return false;40    };41    ScrollbarState.prototype.setScrollSize = function (scrollSize) {42        var iScrollSize = Math.round(scrollSize);43        if (this._scrollSize !== iScrollSize) {44            this._scrollSize = iScrollSize;45            this._refreshComputedValues();46            return true;47        }48        return false;49    };50    ScrollbarState.prototype.setScrollPosition = function (scrollPosition) {51        var iScrollPosition = Math.round(scrollPosition);52        if (this._scrollPosition !== iScrollPosition) {53            this._scrollPosition = iScrollPosition;54            this._refreshComputedValues();55            return true;56        }57        return false;58    };59    ScrollbarState._computeValues = function (oppositeScrollbarSize, arrowSize, visibleSize, scrollSize, scrollPosition) {60        var computedAvailableSize = Math.max(0, visibleSize - oppositeScrollbarSize);61        var computedRepresentableSize = Math.max(0, computedAvailableSize - 2 * arrowSize);62        var computedIsNeeded = (scrollSize > 0 && scrollSize > visibleSize);63        if (!computedIsNeeded) {64            // There is no need for a slider65            return {66                computedAvailableSize: Math.round(computedAvailableSize),67                computedIsNeeded: computedIsNeeded,68                computedSliderSize: Math.round(computedRepresentableSize),69                computedSliderRatio: 0,70                computedSliderPosition: 0,71            };72        }73        // We must artificially increase the size of the slider if needed, since the slider would be too small to grab with the mouse otherwise74        var computedSliderSize = Math.round(Math.max(MINIMUM_SLIDER_SIZE, Math.floor(visibleSize * computedRepresentableSize / scrollSize)));75        // The slider can move from 0 to `computedRepresentableSize` - `computedSliderSize`76        // in the same way `scrollPosition` can move from 0 to `scrollSize` - `visibleSize`.77        var computedSliderRatio = (computedRepresentableSize - computedSliderSize) / (scrollSize - visibleSize);78        var computedSliderPosition = (scrollPosition * computedSliderRatio);79        return {80            computedAvailableSize: Math.round(computedAvailableSize),81            computedIsNeeded: computedIsNeeded,82            computedSliderSize: Math.round(computedSliderSize),83            computedSliderRatio: computedSliderRatio,84            computedSliderPosition: Math.round(computedSliderPosition),85        };86    };87    ScrollbarState.prototype._refreshComputedValues = function () {88        var r = ScrollbarState._computeValues(this._oppositeScrollbarSize, this._arrowSize, this._visibleSize, this._scrollSize, this._scrollPosition);89        this._computedAvailableSize = r.computedAvailableSize;90        this._computedIsNeeded = r.computedIsNeeded;91        this._computedSliderSize = r.computedSliderSize;92        this._computedSliderRatio = r.computedSliderRatio;93        this._computedSliderPosition = r.computedSliderPosition;94    };95    ScrollbarState.prototype.getArrowSize = function () {96        return this._arrowSize;97    };98    ScrollbarState.prototype.getScrollPosition = function () {99        return this._scrollPosition;100    };101    ScrollbarState.prototype.getRectangleLargeSize = function () {102        return this._computedAvailableSize;103    };104    ScrollbarState.prototype.getRectangleSmallSize = function () {105        return this._scrollbarSize;106    };107    ScrollbarState.prototype.isNeeded = function () {108        return this._computedIsNeeded;109    };110    ScrollbarState.prototype.getSliderSize = function () {111        return this._computedSliderSize;112    };113    ScrollbarState.prototype.getSliderPosition = function () {114        return this._computedSliderPosition;115    };116    /**117     * Compute a desired `scrollPosition` such that `offset` ends up in the center of the slider.118     * `offset` is based on the same coordinate system as the `sliderPosition`.119     */120    ScrollbarState.prototype.getDesiredScrollPositionFromOffset = function (offset) {121        if (!this._computedIsNeeded) {122            // no need for a slider123            return 0;124        }125        var desiredSliderPosition = offset - this._arrowSize - this._computedSliderSize / 2;126        return Math.round(desiredSliderPosition / this._computedSliderRatio);127    };128    /**129     * Compute a desired `scrollPosition` such that the slider moves by `delta`.130     */131    ScrollbarState.prototype.getDesiredScrollPositionFromDelta = function (delta) {132        if (!this._computedIsNeeded) {133            // no need for a slider134            return 0;135        }136        var desiredSliderPosition = this._computedSliderPosition + delta;137        return Math.round(desiredSliderPosition / this._computedSliderRatio);138    };139    return ScrollbarState;140}());...webform.element.computed.js
Source:webform.element.computed.js  
1/**2 * @file3 * JavaScript behaviors for computed elements.4 */5(function ($, Drupal) {6  'use strict';7  Drupal.webform = Drupal.webform || {};8  Drupal.webform.computed = Drupal.webform.computed || {};9  Drupal.webform.computed.delay = Drupal.webform.computed.delay || 500;10  var computedElements = [];11  /**12   * Initialize computed elements.13   *14   * @type {Drupal~behavior}15   */16  Drupal.behaviors.webformComputed = {17    attach: function (context) {18      // Find computed elements and build trigger selectors.19      $(context).find('.js-webform-computed').once('webform-computed').each(function () {20        // Get computed element and form.21        var $element = $(this);22        var $form = $element.closest('form');23        // Get unique id for computed element based on the element name24        // and form id.25        var id = $form.attr('id') + '-' + $element.find('input[type="hidden"]').attr('name');26        // Get elements that are used by the computed element.27        var elementKeys = $(this).data('webform-element-keys').split(',');28        if (!elementKeys) {29          return;30        }31        // Get computed element trigger selectors.32        var inputs = [];33        $.each(elementKeys, function (i, key) {34          // Exact input match.35          inputs.push(':input[name="' + key + '"]');36          // Sub inputs. (aka #tree)37          inputs.push(':input[name^="' + key + '["]');38        });39        var triggers = inputs.join(',');40        // Track computed elements.41        computedElements.push({42          id: id,43          element: $element,44          form: $form,45          triggers: triggers46        });47        // Clear computed last values to ensure that a computed element is48        // always re-computed on page load.49        $element.attr('data-webform-computed-last', '');50      });51      // Initialize triggers for each computed element.52      $.each(computedElements, function (index, computedElement) {53        // Get trigger from the current context.54        var $triggers = $(context).find(computedElement.triggers);55        // Make sure current context has triggers.56        if (!$triggers.length) {57          return;58        }59        // Make sure triggers are within the computed element's form60        // and only initialized once.61        $triggers = computedElement.form.find($triggers)62          .once('webform-computed-triggers-' + computedElement.id);63        // Double check that there are triggers which need to be initialized.64        if (!$triggers.length) {65          return;66        }67        initializeTriggers(computedElement.element, $triggers);68      });69      /**70       * Initialize computed element triggers.71       *72       * @param {jQuery} $element73       *   An jQuery object containing the computed element.74       * @param {jQuery} $triggers75       *   An jQuery object containing the computed element triggers.76       */77      function initializeTriggers($element, $triggers) {78        // Add event handler to computed element triggers.79        $triggers.on('keyup change', queueUpdate);80        // Add event handler to computed element tabledrag.81        var $draggable = $triggers.closest('tr.draggable');82        if ($draggable.length) {83          $draggable.find('.tabledrag-handle').on('mouseup pointerup touchend',84            queueUpdate);85        }86        // Queue an update to make sure trigger values are computed.87        queueUpdate();88        // Queue computed element updates using a timer.89        var timer = null;90        function queueUpdate() {91          if (timer) {92            window.clearTimeout(timer);93            timer = null;94          }95          timer = window.setTimeout(triggerUpdate, Drupal.webform.computed.delay);96        }97        function triggerUpdate() {98          // Get computed element wrapper.99          var $wrapper = $element.find('.js-webform-computed-wrapper');100          // If computed element is loading, requeue the update and wait for101          // the computed element to be updated.102          if ($wrapper.hasClass('webform-computed-loading')) {103            queueUpdate();104            return;105          }106          // Prevent duplicate computations.107          // @see Drupal.behaviors.formSingleSubmit108          var formValues = $triggers.serialize();109          var previousValues = $element.attr('data-webform-computed-last');110          if (previousValues === formValues) {111            return;112          }113          $element.attr('data-webform-computed-last', formValues);114          // Add loading class to computed wrapper.115          $wrapper.addClass('webform-computed-loading');116          // Trigger computation.117          $element.find('.js-form-submit').mousedown();118        }119      }120    }121  };...LogScaler.js
Source:LogScaler.js  
1//>>built2define("dojox/dgauges/LogScaler",["dojo/_base/lang","dojo/_base/declare","dojo/Stateful"],function(_1,_2,_3){3return _2("dojox.dgauges.LogScaler",_3,{minimum:0,maximum:1000,multiplier:10,majorTicks:null,_computedMultiplier:NaN,constructor:function(){4this.watchedProperties=["minimum","maximum","multiplier"];5},_buildMajorTickItems:function(){6var _4=[];7this._computedMinimum=this.getComputedMinimum();8this._computedMaximum=this.getComputedMaximum();9this._computedMultiplier=this.getComputedMultiplier();10if(this._computedMaximum>this._computedMinimum){11var _5=Math.max(0,Math.floor(Math.log(this._computedMinimum+1e-9)/Math.LN10));12var _6=Math.max(0,Math.floor(Math.log(this._computedMaximum+1e-9)/Math.LN10));13var _7;14for(var i=_5;i<=_6;i+=this._computedMultiplier){15_7={};16_7.value=Math.pow(10,i);17_7.position=(i-_5)/(_6-_5);18_4.push(_7);19}20}21return _4;22},getComputedMinimum:function(){23return Math.pow(10,Math.max(0,Math.floor(Math.log(this.minimum+1e-9)/Math.LN10)));24},getComputedMaximum:function(){25return Math.pow(10,Math.max(0,Math.floor(Math.log(this.maximum+1e-9)/Math.LN10)));26},getComputedMultiplier:function(){27return Math.max(1,Math.floor(Math.log(this.multiplier+1e-9)/Math.LN10));28},computeTicks:function(){29this.majorTicks=this._buildMajorTickItems();30return this.majorTicks.concat();31},positionForValue:function(_8){32if(this._computedMaximum<this._computedMinimum||_8<=this._computedMinimum||_8<1||isNaN(_8)){33_8=this._computedMinimum;34}35if(_8>=this._computedMaximum){36_8=this._computedMaximum;37}38_8=Math.log(_8)/Math.LN10;39var sv=Math.log(this._computedMinimum)/Math.LN10;40var ev=Math.log(this._computedMaximum)/Math.LN10;41return (_8-sv)/(ev-sv);42},valueForPosition:function(_9){43var sv=Math.log(this._computedMinimum)/Math.LN10;44var ev=Math.log(this._computedMaximum)/Math.LN10;45return Math.pow(10,sv+_9*(ev-sv));46}});...Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  const [response] = await Promise.all([7    page.click('text=Get Started')8  ]);9  await browser.close();10})();11const { chromium } = require('playwright');12(async () => {13  const browser = await chromium.launch();14  const context = await browser.newContext();15  const page = await context.newPage();16  const [response] = await Promise.all([17    page.click('text=Get Started')18  ]);19  await browser.close();20})();21const { chromium } = require('playwright');22(async () => {23  const browser = await chromium.launch();24  const context = await browser.newContext();25  const page = await context.newPage();26  const [response] = await Promise.all([27    page.click('text=Get Started')28  ]);29  await browser.close();30})();31const { chromium } = require('playwright');32(async () => {33  const browser = await chromium.launch();34  const context = await browser.newContext();35  const page = await context.newPage();36  const [response] = await Promise.all([37    page.click('text=Get Started')38  ]);39  await browser.close();40})();41const { chromium } = require('playwright');42(async () => {Using AI Code Generation
1const { chromium } = require('playwright-internal');2(async () => {3  const browser = await chromium.launch();4  const page = await browser.newPage();5  await page.screenshot({ path: 'example.png' });6  await browser.close();7})();8const { chromium } = require('playwright');9(async () => {10  const browser = await chromium.launch();11  const page = await browser.newPage();12  await page.screenshot({ path: 'example.png' });13  await browser.close();14})();Using AI Code Generation
1const {chromium, webkit, firefox} = require('playwright');2(async () => {3  const browser = await chromium.launch({headless: false});4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.screenshot({ path: `example.png` });7  await browser.close();8})();9const {chromium, webkit, firefox} = require('playwright');10(async () => {11  const browser = await chromium.launch({headless: false});12  const context = await browser.newContext();13  const page = await context.newPage();14  await page.screenshot({ path: `example.png` });15  await browser.close();16})();17const {chromium, webkit, firefox} = require('playwright');18(async () => {19  const browser = await chromium.launch({headless: false});20  const context = await browser.newContext();21  const page = await context.newPage();22  await page.screenshot({ path: `example.png` });23  await browser.close();24})();25const {chromium, webkit, firefox} = require('playwright');26(async () => {27  const browser = await chromium.launch({headless: false});28  const context = await browser.newContext();29  const page = await context.newPage();30  await page.screenshot({ path: `example.png` });31  await browser.close();32})();33const {chromium, webkit, firefox} = require('playwright');34(async () => {35  const browser = await chromium.launch({headless: false});36  const context = await browser.newContext();37  const page = await context.newPage();38  await page.screenshot({ path: `example.png` });39  await browser.close();40})();41const {Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const page = await browser.newPage();5  await page.screenshot({ path: 'example.png' });6  await browser.close();7})();8const { chromium } = require('playwright');9(async () => {10  const browser = await chromium.launch();11  const page = await browser.newPage();12  await page.screenshot({ path: 'example.png' });13  await browser.close();14})();15const { chromium } = require('playwright');16(async () => {17  const browser = await chromium.launch();18  const page = await browser.newPage();19  await page.screenshot({ path: 'example.png' });20  await browser.close();21})();22const { chromium } = require('playwright');23(async () => {24  const browser = await chromium.launch();25  const page = await browser.newPage();26  await page.screenshot({ path: 'example.png' });27  await browser.close();28})();29const { chromium } = require('playwright');30(async () => {31  const browser = await chromium.launch();32  const page = await browser.newPage();33  await page.screenshot({ path: 'example.png' });34  await browser.close();35})();36const { chromium } = require('playwright');37(async () => {38  const browser = await chromium.launch();39  const page = await browser.newPage();40  await page.screenshot({ path: 'example.png' });41  await browser.close();42})();43const { chromium } = require('playwright');44(async () => {45  const browser = await chromium.launch();Using AI Code Generation
1const { Playwright } = require('playwright');2const playwright = new Playwright();3const browser = await playwright.chromium.launch();4const page = await browser.newPage();5const selector = await page.$('text=Get started');6const box = await selector.boundingBox();7console.log(box);8await browser.close();9const { Playwright } = require('playwright');10const playwright = new Playwright();11const browser = await playwright.chromium.launch();12const page = await browser.newPage();13const selector = await page.$('text=Get started');14const box = await selector.boundingBox();15console.log(box);16await browser.close();17const { Playwright } = require('playwright');18const playwright = new Playwright();19const browser = await playwright.chromium.launch();20const page = await browser.newPage();21const selector = await page.$('text=Get started');22const box = await selector.boundingBox();23console.log(box);24await browser.close();25const { Playwright } = require('playwright');26const playwright = new Playwright();27const browser = await playwright.chromium.launch();28const page = await browser.newPage();29const selector = await page.$('text=Get started');30const box = await selector.boundingBox();31console.log(box);32await browser.close();33const { Playwright } = require('playwright');34const playwright = new Playwright();35const browser = await playwright.chromium.launch();36const page = await browser.newPage();37const selector = await page.$('text=Get started');38const box = await selector.boundingBox();39console.log(box);40await browser.close();41const { Playwright } = require('playwright');42const playwright = new Playwright();43const browser = await playwright.chromium.launch();44const page = await browser.newPage();Using AI Code Generation
1const { computeSelector } = require('playwright/lib/server/dom.js');2const { test } = require('@playwright/test');3test('test', async ({ page }) => {4  const selector = computeSelector(page, '[aria-label="Search"]');5  console.log(selector);6});7}8const { computeSelector } = require('playwright/lib/server/dom.js');9const { test } = require('@playwright/test');10test('test', async ({ page }) => {11  const selector = computeSelector(page, '[aria-label="Google Search"]');12  console.log(selector);13});Using AI Code Generation
1const { WebKit } = require('playwright');2const webkit = new WebKit();3const page = await webkit.launch().newPage();4const { computedStyle } = page.mainFrame();5const style = await computedStyle('h1');6console.log(style);7const puppeteer = require('puppeteer');8const browser = await puppeteer.launch();9const page = await browser.newPage();10const style = await page.evaluate(() => {11  const element = document.querySelector('h1');12  return window.getComputedStyle(element);13});14console.log(style);15const { webkit } = require('playwright');16const browser = await webkit.launch();17const page = await browser.newPage();18const style = await page.$eval('h1', el => {19  return window.getComputedStyle(el);20});21console.log(style);22const puppeteer = require('puppeteer');23const browser = await puppeteer.launch();24const page = await browser.newPage();25const style = await page.$eval('h1', el => {26  return window.getComputedStyle(el);27});28console.log(style);29const { WebKit } = require('playwright');30const webkit = new WebKit();31const page = await webkit.launch().newPage();32const { computedStyle } = page.mainFrame();33const style = await computedStyle('h1');34console.log(style);35const puppeteer = require('puppeteer');36const browser = await puppeteer.launch();37const page = await browser.newPage();38const style = await page.evaluate(() => {39  const element = document.querySelector('h1');40  return window.getComputedStyle(element);41});42console.log(style);43const { webkit } = require('playwright');44const browser = await webkit.launch();45const page = await browser.newPage();46const style = await page.$eval('h1', el => {47  return window.getComputedStyle(el);48});49console.log(style);Using AI Code Generation
1import { Playwright } from '@playwright/test';2const playwright = new Playwright();3playwright._computeSelector('css=button');4import { chromium } from 'playwright';5const browser = await chromium.launch();6const context = await browser.newContext();7const page = await context.newPage();8const selector = page._computeSelector('css=button');9console.log(selector);10await page.close();11await context.close();12await browser.close();13{14}15{16}17{18}19{LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!
