Fingerprint Pro Internals
Collector s86

Storage removal quirk

whether setItem and removeItem throw, an old WebKit behaviour

Group: Storage · signal map · run it live

// s86 — sig_s86_removeItem
// module cm, stage3, codes 0 -1
//
// measures
//   window.localStorage.removeItem("test") window.localStorage.setItem("test") window.onafterprint
//   window.PointerEvent window.visualViewport navigator.maxTouchPoints window.localStorage
//   navigator.mediaCapabilities navigator.vendor.indexOf("Apple") window.ApplePayError
//   window.Counter window.CSSPrimitiveValue
// engine
//   ArrayBuffer Object.getOwnPropertyNames() Object.getPrototypeOf() Uint32Array Uint8Array
// reported value
//   boolean null
// probes
//   "1" "function" "openDatabase"
// compares against
//   == "function" === "string" === 0 >= 4 in "ApplePayError" in "CSSPrimitiveValue" in "Counter"
//   in "PointerEvent" in "RGBColor" in "WebKitMediaKeys" in "maxTouchPoints" in "mediaCapabilities"
//   in "onafterprint" in "visualViewport"
// decides on
//   !fn25() || h_s86_onafterprint()
//   fn25: fn9(["ApplePayError" in window, "CSSPrimitiveValue" in window, "Counter" in window, navigator.vendor.indexOf("Apple") === 0, "RGBColor" in window, "WebKitMediaK…
//   h_s86_onafterprint: fn36(["maxTouchPoints" in navigator, "mediaCapabilities" in navigator, "PointerEvent" in window, "visualViewport" in window, "onafterprint" in window]) >= 4
//   readVaultedProp: typeof v316 == "function"
//   resolveNameByHash: typeof arg801 === "string"
//   resolveNameByHash: fn48(v928) === arg801
//
// 1 owned helper inlined below.
// shared with other collectors, see agent.clean.js:
//   asUint8Array:6496 crc32OfBytes:4943 fn25:712 fn36:1793 fn48:3370 fn9:252 readVaultedProp:1674
//   resolveNameByHash:7015 stringToBytes:7901

// agent.clean.js:1697
function h_s86_onafterprint() {
  return (
    fn36([
      "maxTouchPoints" in navigator,
      "mediaCapabilities" in navigator,
      "PointerEvent" in window,
      "visualViewport" in window,
      "onafterprint" in window,
    ]) >= 4
  );
}

// agent.clean.js:3182
function sig_s86_removeItem() {
  if (!fn25() || h_s86_onafterprint()) {
    return { s: -1, v: null };
  }
  const v486 = readVaultedProp(window, "openDatabase"),
    v487 = window.localStorage;
  try {
    v486(null, null, null, null);
  } catch (v488) {
    return { s: 0, v: true };
  }
  try {
    v487.setItem("test", "1");
    v487.removeItem("test");
    return { s: 0, v: false };
  } catch (v489) {
    return { s: 0, v: true };
  }
}