Fingerprint Pro Internals
Collector s69

Frame URL chain

hashes the location and referrer of every window up the parent chain

Group: Page and document · signal map · run it live

// s69 — sig_s69_subtle
// module cm, request, codes 1 0
//
// measures
//   window.crypto.subtle navigator.msLaunchUri navigator.msSaveBlob window.MSStream
//   window.msWriteProfilerMark btoa() navigator.msPointerEnabled window.MSCSSMatrix
//   window.msIndexedDB window.msSetImmediate navigator.msMaxTouchPoints window
// engine
//   String.fromCharCode.apply() Math.min() Promise.all() Math.ceil() ArrayBuffer Uint8Array
//   undefined
// reported value
//   call value
// probes
//   "&" "-" "Error" "Permission denied" "SHA-256" "SecurityError" "TypeError" "_" "fragment"
//   "object" "path" "query" "stripped"
// compares against
//   != "object" !== "Error" !== "Permission denied" !== "TypeError" === "" === "SecurityError"
//   === "query" >= 3 >= 4 in "MSCSSMatrix" in "MSStream" in "msIndexedDB" in "msLaunchUri"
//   in "msMaxTouchPoints" in "msPointerEnabled" in "msSaveBlob" in "msSetImmediate"
//   in "msWriteProfilerMark"
// decides on
//   href === undefined || referrer === undefined
//   !parent || parent === v822
//   h_s69_fn2(v823)
//   h_s69_fn2: !arg660 || typeof arg660 != "object"
//   h_s69_fn2: !(!fn49() && !fn100() || v791.name !== "Error" && v791.name !== "TypeError" || v791.message !== "Permission denied") || v791.name === "SecurityError"
//   fn49: fn9(["MSCSSMatrix" in window, "msSetImmediate" in window, "msIndexedDB" in window, "msMaxTouchPoints" in navigator, "msPointerEnabled" in navigator]) >= 4
//   fn100: fn9(["msWriteProfilerMark" in window, "MSStream" in window, "msLaunchUri" in navigator, "msSaveBlob" in navigator]) >= 3 && !fn49()
//   h_s69_subtle: h_s69_fn3(arg610)
//   h_s69_subtle: arg610[arg611] && v687
//   h_s69_subtle: arg612 === ""
//   h_s69_subtle: arg611 === "query"
//   h_s69_fn3: !(arg678 && h_s69_pathList.some(arg679 => arg678[arg679]))
//
// 5 owned helpers inlined below.
// shared with other collectors, see agent.clean.js:
//   asUint8Array:6496 base64Encode:8766 fn100:5463 fn111:5918 fn20:578 fn30:1580 fn49:3373 fn9:252
//   stringToBytes:7901

// agent.clean.js:3487
const h_s69_pathList = ["path", "query", "fragment"];

// agent.clean.js:4854
async function h_s69_subtle(arg609, arg610) {
  if (h_s69_fn3(arg610)) {
    return arg609;
  }
  const v686 = fn20(arg609);
  await Promise.all(
    h_s69_pathList.map(async (arg611) => {
      const v687 = v686[arg611];
      var v688;
      if (arg610[arg611] && v687) {
        v686[arg611] = await (async function (arg612) {
          if (arg612 === "") {
            return "";
          }
          const subtle = window.crypto?.subtle;
          return subtle?.digest
            ? base64Encode(await subtle.digest("SHA-256", stringToBytes(arg612)))
                .replace(/=/g, "")
                .replace(/\+/g, "-")
                .replace(/\//g, "_")
            : "stripped";
        })(arg611 === "query" ? ((v688 = v687), v688.split("&").sort().join("&")) : v687);
      }
    }),
  );
  return fn30(v686);
}

// agent.clean.js:5420
async function h_s69_fn(arg642, arg643) {
  return Promise.all(
    arg642.map(async (arg644) => {
      const [v751, v752] = await Promise.all([
        h_s69_subtle(arg644.l, arg643),
        h_s69_subtle(arg644.f, arg643),
      ]);
      return { l: v751, f: v752 };
    }),
  );
}

// agent.clean.js:5657
function h_s69_fn2(arg660) {
  if (!arg660 || typeof arg660 != "object") {
    return false;
  }
  const v791 = arg660;
  return (
    !(
      (!fn49() && !fn100()) ||
      (v791.name !== "Error" && v791.name !== "TypeError") ||
      v791.message !== "Permission denied"
    ) || v791.name === "SecurityError"
  );
}

// agent.clean.js:5805
function h_s69_fn3(arg678) {
  return !(arg678 && h_s69_pathList.some((arg679) => arg678[arg679]));
}

// agent.clean.js:5886
async function sig_s69_subtle({ urlHashing: arg695 }) {
  const v820 = (function (arg696) {
    const v821 = [];
    let v822 = arg696;
    for (;;) {
      try {
        const href = v822.location?.href,
          referrer = v822.document?.referrer;
        if (href === undefined || referrer === undefined) {
          return { s: 1, v: v821 };
        }
        v821.push({ l: href, f: referrer });
        const parent = v822.parent;
        if (!parent || parent === v822) {
          return { s: 0, v: v821 };
        }
        v822 = parent;
      } catch (v823) {
        if (h_s69_fn2(v823)) {
          return { s: 1, v: v821 };
        }
        throw v823;
      }
    }
  })(window);
  return { ...v820, v: await h_s69_fn(v820.v, arg695) };
}