tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

file_reflected_attribute_frozenarray.js (2485B)


      1 function checkEquals(value, expected, valueCheckFn = (a, b) => a == b) {
      2  if (!valueCheckFn(value, expected)) {
      3    return `, got ${value}, expected ${expected}`;
      4  }
      5  return undefined;
      6 }
      7 
      8 function checkReflectedAttributeWithFrozenArrayValues(obj, values, valueCheck) {
      9  if (!SimpleTest.isa(obj.reflectedHTMLAttribute, "Array")) {
     10    return `, expected array`;
     11  }
     12  let failure = checkEquals(obj.reflectedHTMLAttribute.length, values.length);
     13  if (!failure) {
     14    for (let [i, v] of obj.reflectedHTMLAttribute.entries()) {
     15      failure = checkEquals(values[i], v, valueCheck);
     16      if (failure) {
     17        break;
     18      }
     19    }
     20  }
     21  return failure;
     22 }
     23 
     24 function checkReflectedAttributeWithFrozenArray(
     25  obj,
     26  values,
     27  suffix,
     28  valueCheck
     29 ) {
     30  let failure = checkReflectedAttributeWithFrozenArrayValues(
     31    obj,
     32    values,
     33    valueCheck
     34  );
     35  ok(
     36    !failure,
     37    `Cached value on object for HTML reflected FrozenArray attribute should contain the right values ${suffix}${
     38      failure || ""
     39    }`
     40  );
     41 }
     42 
     43 function testReflectedAttributeWithFrozenArray(win) {
     44  let testObject = new win.TestReflectedHTMLAttribute();
     45  ok(
     46    testObject instanceof win.TestReflectedHTMLAttribute,
     47    "Got a TestReflectedHTMLAttribute object"
     48  );
     49 
     50  is(
     51    testObject.reflectedHTMLAttribute,
     52    null,
     53    "Initial value for HTML reflected FrozenArray attribute should be null"
     54  );
     55 
     56  let values = [win.document.head];
     57  testObject.setReflectedHTMLAttributeValue(values);
     58  checkReflectedAttributeWithFrozenArray(testObject, values, "after setting");
     59 
     60  values = [win.document.body, win.document.body.firstElementChild];
     61  testObject.setReflectedHTMLAttributeValue(values);
     62  checkReflectedAttributeWithFrozenArray(testObject, values, "after resetting");
     63 
     64  // Use a loop to ensure the JITs optimize the getter access.
     65  let failure;
     66  for (let i = 0; i < 10_000; i++) {
     67    failure = checkReflectedAttributeWithFrozenArrayValues(testObject, values);
     68    if (!failure) {
     69      break;
     70    }
     71    if (i == 9_990) {
     72      values = [win.document.head];
     73      testObject.setReflectedHTMLAttributeValue(values);
     74    }
     75  }
     76  ok(
     77    !failure,
     78    `Shouldn't use the cached value for HTML reflected FrozenArray attribute directly from JITted code${
     79      failure || ""
     80    }`
     81  );
     82 
     83  is(
     84    testObject.reflectedHTMLAttribute,
     85    testObject.reflectedHTMLAttribute,
     86    "Getter for HTML reflected FrozenArray attribute should return the cached value"
     87  );
     88 
     89  return [testObject, values];
     90 }