software/hoardy-web/./extension/page/popup.template

Passively capture, archive, and hoard your web browsing history, including the contents of the pages you visit, for later offline viewing, mirroring, and/or indexing. Your own personal private Wayback Machine that can also archive HTTP POST requests and responses, as well as most other HTTP-level data.

Files

Raw Source

Contents

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Hoardy-Web: Settings</title>
    <link rel="shortcut icon" type="$iconMIME$" href="../icon/$iconFile$">
    <link rel="stylesheet" href="main.css?v=$version$">
    <style>
body {
    min-width: 300px;
    line-height: 160%;
}

input[type="button"], .help-btn {
    vertical-align: top;
}

.help-tip {
    left: 10%;
    right: 10%;
}

h1 {
    font-size: 110%;
    margin: 0;
    margin-top: 5px;
    display: flex;
}

h2 {
    font-size: 100%;
    margin: 0;
    margin-top: 5px;
    display: flex;
}

h1 code,
h2 code {
    margin: auto 0.5ch;
}

h1 span.right,
h2 span.right {
    display: flex;
}

h1 input[type="button"],
h2 input[type="button"] {
    margin-left: 0.5em;
}

#version {
    font-size: 70%;
    vertical-align: top;
}

.smaller,
.pure-text input[type="button"] {
    font-size: 80%;
}

.stats {
    margin-left: 1em;
}

.stats .help-root > div {
    display: flex;
}

.stats .help-root > div > span:nth-child(2) {
    padding-left: 1em;
    margin: 0 1em 0 auto;
}

.stats .help-root > div > span:nth-child(3) {
    min-width: 10em;
    text-align: right;
}

.opts, .subopts {
    padding-left: 0.6em;
}

div.target {
    padding: 0.5em;
}

span.target,
input.target {
    display: inline-block;
    padding: 1em;
}

#showAll {
    font-size: 100%;
    width: 99%;
    margin: 5px auto 0 auto;
}

.disabled-collecting .dc,
.disabled-collecting .dc input[type="checkbox"].toggle,
.disabled-stash .ds,
.disabled-archive .da,
.disabled-exportas .dea,
.disabled-submit .dsh,
.disabled-localstorage .dls,
.disabled-auto .dauto,
.disabled-problematic-notify .dpn,
.disabled-limbo-notify .dln {
    color: var(--text-inactive-color);
    --text-background: var(--text-inactive-background);
    --text-border-color: var(--text-inactive-border-color);
    --text-color: var(--text-inactive-color);
    --toggle-dot-background: var(--untoggle-border-color);
    --toggle-border-color: var(--untoggle-border-color);
}
    </style>
  </head>
  <body>
    <div id="body_loading"></div>
    <div id="body_error" style="display: none"></div>
    <div id="body" style="display: none">
    <!-- idBody -->

    <h1>
      Globally
      <input type="button" id="version" data-help="Open the `Changelog` page." value="v?" />
      <input type="button" id="help" class="smaller" data-help="Open the `Help` page." value="Help" />
      <span class="right">
        <input type="button" id="snapshotAll" data-shortcut="snapshotAll" data-help="Take DOM snapshots of all frames of all open tabs for which `Track new reqres` setting is enabled." value="Snapshot" />
        <input type="button" id="forgetHistory" data-help="Forget recent history." value="Forget" />
        <input type="button" id="showState" data-shortcut="showState" data-help="Show the internal state and reqres history logs." value="State" />
      </span>
    </h1>
    <div class="stats">
      <div name="more" id="div-stats.scheduled" data-help="The number of currently scheduled internal actions, including those generated by delayed saving of config and persistent stats, automatic retries of failed archivals, and `Automatic actions for recently closed tabs` below. When this is non-zero, toolbar button's badge has `~` or `.` in it.">
        <span>Scheduled</span>
        <span>
          <input type="button" id="runActions" class="smaller" data-help="Run all scheduled actions immediately." value="Run" />
          <input type="button" id="cancelActions" class="smaller" data-help="Cancel all scheduled actions that can be canceled." value="Cancel" />
        </span>
        <span>
          <span id="stats.scheduled">0</span>
        </span>
      </div>
      <div name="more" id="div-stats.actions" data-help="Names of the currently scheduled internal actions.">
        <span>... actions</span>
        <span>
        </span>
        <span>
          <span id="stats.actions"></span>
        </span>
      </div>
      <div id="div-stats.queued_failed" data-help="At the moment, the number of reqres that are waiting to be archived in the archival queue (and the sum total of all sizes of their dumps). / At the moment, the number of reqres that failed to be archived via one or more of the selected archiving methods (and the sum total of all sizes of their dumps).">
        <span>Queued/Failed</span>
        <span>
          <input type="button" id="retryFailed" data-help="Move all failed to archive reqres to the archival queue and then nudge the archiving sub-process awake. (Archivals that fail because of networking issues will be retried automatically every 60 seconds, others will not.) See the `Help` page for more info." value="Retry" />
        </span>
        <span>
          <span id="stats.queued">0</span>
          (<span id="stats.queued_size">0</span>)
          /
          <span id="stats.failed">0</span>
          (<span id="stats.failed_size">0</span>)
        </span>
      </div>
      <div id="div-stats.collected" data-help="From the last reset, the number of `finished` reqres that were taken for archival (and the sum total of all sizes of their dumps).">
        <span>Collected</span>
        <span>
        </span>
        <span>
          <span id="stats.collected">0</span>
          (<span id="stats.collected_size">0</span>)
        </span>
      </div>
      <div id="div-stats.discarded" data-help="From the last reset, the number of `finished` reqres that were NOT taken for archival and thus discarded from memory (and the sum total of all sizes of their dumps).">
        <span>Discarded</span>
        <span>
        </span>
        <span>
          <span id="stats.discarded">0</span>
          (<span id="stats.discarded_size">0</span>)
        </span>
      </div>
      <div id="div-stats.in_limbo" data-help="At the moment, the number of `finished` reqres that are in `in_limbo` state (and the sum total of all sizes of their dumps).">
        <span>In limbo</span>
        <span>
          <input type="button" id="collectAllInLimbo" data-shortcut="collectAllInLimbo" data-help="Collect all reqres in `in_limbo` state." value="Collect" />
          <input type="button" id="discardAllInLimbo" data-shortcut="discardAllInLimbo" data-help="Discard all reqres in `in_limbo` state." value="Discard" />
        </span>
        <span>
          <span id="stats.in_limbo">0</span>
          (<span id="stats.in_limbo_size">0</span>)
        </span>
      </div>
      <div name="more" id="div-stats.picked" data-help="From the last reset, the number of reqres that satisfied `Pick reqres for archival when they finish` conditions at the moment they `finished`.">
        <span>Picked</span>
        <span>
        </span>
        <span>
          <span id="stats.picked">0</span>
        </span>
      </div>
      <div name="more" id="div-stats.dropped" data-help="From the last reset, the number of reqres that did NOT satisfy `Pick reqres for archival when they finish` conditions at the moment they `finished`.">
        <span>Dropped</span>
        <span>
        </span>
        <span>
          <span id="stats.dropped">0</span>
        </span>
      </div>
      <div id="div-stats.problematic" data-help="At the moment, the number of reqres that satisfied `Mark reqres as 'problematic' when they finish` conditions at the moment they `finished`.">
        <span>Problematic</span>
        <span>
          <input type="button" id="unmarkAllProblematic" data-shortcut="unmarkAllProblematic" data-help="Unmark all `problematic` reqres." value="Unmark" />
        </span>
        <span>
          <span id="stats.problematic">0</span>
        </span>
      </div>
      <div id="div-stats.in_flight" data-help="At the moment, the number of reqres that have not finished yet. See the `Help` page for more info.">
        <span>In flight</span>
        <span>
          <input type="button" id="stopAllInFlight" data-help="Stop tracking progress of all in-flight reqres and either pick or drop them, depending on their completion and `Pick reqres for archival when they finish` options." value="Stop" />
        </span>
        <span>
          <span id="stats.in_flight">0</span>
          +
          <span id="stats.finishing_up">0</span>
        </span>
      </div>
    </div>

    <div name="more" class="opts">
    <ui id="config.collecting" type="boolean" class="prefer-on" data-help="Also known as `Enable this add-on`. Generate a new reqres and start tracking its progress when the browser makes a new `HTTP` request. Disabling this option will stop `Hoardy-Web` from recording any new data. Already tracked reqres will still get tracked until they finish.">Track newly generated requests</ui>
    </div>

    <div name="more" id="internally-options">
    <!-- internallyOptions -->

    <h1>Stashing</h1>
    <div class="stats">
      <div id="div-stats.stashed" data-help="At the moment, the number of reqres that are currently stashed in browser&#039;s local storage and thus will not be lost on reload (and the sum total of all sizes of their dumps).">
        <span>Stashed in LS</span>
        <span>
          <input type="button" id="stashAll" data-help="Stash all `queued`, `in_limbo`, and `failed` reqres into browser&#039;s local storage, regardless of `Stash 'collected' reqres into local storage` and `Stash 'in_limbo' reqres` options." value="Stash" />
        </span>
        <span>
          <span id="stats.stashed">0</span>
          (<span id="stats.stashed_size">0</span>)
        </span>
      </div>
      <div id="div-stats.unstashed" data-help="At the moment, the number of reqres that failed to be stashed to local storage (and the sum total of all sizes of their dumps). Note that this number does not include reqres for which stashing was not even attempted, that number is not tracked at the moment.">
        <span>Failed to Stash</span>
        <span>
          <input type="button" id="retryUnstashed" data-help="Retry stashing of all reqres that failed to be stashed to local storage." value="Retry" />
        </span>
        <span>
          <span id="stats.unstashed">0</span>
          (<span id="stats.unstashed_size">0</span>)
        </span>
      </div>
    </div>
    <div class="opts">
    <ui id="config.stash" type="boolean" class="prefer-on" data-help="Automatically backup stuck `queued` and `failed` to archive reqres into browser&#039;s local storage. With this option enabled `Hoardy-Web` will keep `collected` but not yet archived reqres across browser restarts and extension reloads. See also `Stash 'in_limbo' reqres` options below. See the `Help` page for more info.">Stash <code>collected</code> reqres into local storage</ui>
    </div>

    <h1>Archiving</h1>
    <div class="stats">
      <div id="div-stats.exportedAs" data-help="From the last reset, the number of reqres that were successfully archived by being exported via `saveAs` mechanism as fake-Downloads (and the sum total of all sizes of their dumps).">
        <span>Exported via <code>saveAs</code></span>
        <span>
        </span>
        <span>
          <span id="stats.exportedAs">0</span>
          (<span id="stats.exportedAs_size">0</span>)
        </span>
      </div>
      <div id="div-stats.bundledAs" data-help="At the moment, for all buckets, the total number of dumps that are ready to be exported via `saveAs` but are currently being delayed because of bundling (and the sum total of their sizes).">
        <span>Bundled</span>
        <span>
          <input type="button" id="exportAsAll" data-help="For all buckets, export their bundles immediately." value="Export" />
        </span>
        <span>
          <span id="stats.bundledAs">0</span>
          (<span id="stats.bundledAs_size">0</span>)
        </span>
      </div>
      <div id="div-stats.submittedHTTP" data-help="From the last reset, the number of reqres that were successfully archived by being submitted via HTTP to the archiving server (and the sum total of all sizes of their dumps).">
        <span>Submitted via <code>HTTP</code></span>
        <span>
        </span>
        <span>
          <span id="stats.submittedHTTP">0</span>
          (<span id="stats.submittedHTTP_size">0</span>)
        </span>
      </div>
      <div id="div-stats.saved" data-help="At the moment, the number of reqres that were archived into browser&#039;s local storage (and the sum total of all sizes of their dumps).">
        <span>Saved into LS</span>
        <span>
          <input type="button" id="showSaved" data-help="Show reqres currently saved in browser&#039;s local storage." value="Show" />
        </span>
        <span>
          <span id="stats.saved">0</span>
          (<span id="stats.saved_size">0</span>)
        </span>
      </div>
    </div>

    <div class="opts">
    <ui id="config.archive" type="boolean" class="prefer-on" data-help="Automatically archive `queued` reqres into persistent storage using one or more of the following methods. Enabling more than one of the sub-options will archive the same reqres using all of the enabled methods. (If two identical copies of the same reqres ever reach `hoardy organize`, it will deduplicate them.) Disabling this option will keep `queued` reqres stuck in the archiving queue indefinitely. If `Stash 'collected' reqres into local storage` option above is enabled, restarting the browser or reloading the extension will not loose them, but they will still be taking up your browser&#039;s memory. Which is why you probably shouldn&#039;t disable this option, unless you want to disable this, atomically change some of the following sub-options or the `Bucket` settings below, and then enable this again.">Archive <code>collected</code> reqres by</ui>
    <div id="sub-config.archive" class="subopts da">
    <ui id="config.archiveExportAs" type="boolean" class="c" data-help="Archive `collected` reqres by generating in-browser fake-Downloads with their dumps. If the value of the `Bundle up to MiB` option below is larger than zero, `Hoardy-Web` will export dumps in per-`bucket` bundles. I.e., while processing the archiving queue, it will continue to concatenate dumps belonging to the same `bucket` while the sum of their sizes is smaller than the value of that option and only then export the result. The values of `bucket` can be controlled by the `Bucket` settings below. See the `Help` page for more info.">... {} exporting them via <code>saveAs</code></ui>
    <ui id="config.archiveSubmitHTTP" type="boolean" class="c" data-help="Archive `collected` reqres by submitting their dumps via `HTTP` by `POST`ing them to the archiving server at the URL set in the `Server URL` option. See the `Help` page for more info.">... {} submitting them via <code>HTTP</code></ui>
    <ui id="config.archiveSaveLS" type="boolean" class="c" data-help="Archive `collected` reqres by saving them into browser&#039;s local storage. See the `Help` page for more info.">... {} saving them into local storage</ui>
    </div>
    </div>

    <h1>Stashing and Archiving Options</h1>
    <div class="opts">
    <!-- internallySubOptions -->

    <h2>Export via <code>saveAs</code></h2>
    <div class="subopts da dea">
    <ui id="config.exportAsMaxSize" type="number" class="c" data-help="When exporting, continue to bundle (concatenate) dumps until the resulting bundle contains this much data and only then generate a fake-Download containing the result. Generated bundles can be smaller than this size when the queue gets empty with no reqres still in flight, or when in-flight reqres get too long to finish. Generated exported files can be larger than this size when a single dump is larger than this size, in which case they will be exported as separate files. Set this to zero if you want all dumps to be exported as separate files. Though, doing that will slow down your browser&#039;s UI by a lot and will make it rather annoying, unless you `Pick into limbo` by default.">Bundle up to {} MiB</ui>
    <ui id="config.exportAsTimeout" type="number" class="c" data-help="Delay export via `saveA` (generation of fake-Downloads) for this many seconds when no reqres are in flight, in the hopes that newly `collected` dumps will get respective bundles closer to their maximum sizes. Setting this to a higher value improves efficiency when using compression and lowers annoyance at the UI somewhat at the cost of making it easier to loose yet unexported data.">Delay bundles for {} seconds</ui>
    <ui id="config.exportAsInFlightTimeout" type="number" class="c" data-help="Delay export via `saveAs` (generation of fake-Downloads) for this many seconds when some reqres are still in flight.">With <code>in_flight</code> delay for {} seconds</ui>
    <ui id="config.exportAsHumanReadable" type="boolean" data-help="Generate fake-Downloads with long human-readable filenames. Enabled by default. Disabling this will generate shorter filenames similar to those generated by `hoardy-web-sas` archiving server.">Generate human-readable filenames</ui>
    <ui id="config.gzipExportAs" type="boolean" class="prefer-on" data-help="Try compressing each resulting bundle using GZip (with compression level 9) and use the compressed version as the output if its size is smaller than the size of non-compressed version, use the non-compressed version otherwise. Essentially, with this enabled, `Hoardy-Web` will do what `hoardy-web-sas` archiving server does, except slower, since this is done in JavaScript.">GZip results</ui>
    </div>

    <h2>Submission via <code>HTTP</code></h2>
    <div class="subopts dsh">
    <ui id="config.submitHTTPURLBase" type="string" data-help="URL of the archiving server we are submitting to.">Server URL</ui>
    <div>(Compression is done server-side.)</div>
    </div>

    <h2>Local Storage</h2>
    <div class="subopts dls">
    <ui id="config.preferIndexedDB" type="boolean" data-help="Prefer `IndexedDB` API to `storage.local` API for stashing and saving new reqres, if both are available. `Hoardy-Web` uses less memory and disk IO when loading data back to memory via `IndexedDB` API. On Firefox, this option can not be enabled if `IndexedDB` API is unavailable, which will be the case if you enable `Always use private browsing mode` browser setting, unless you use a very recent non-ESR version of Firefox. Enabling private browsing mode on older Firefox versions will also make all the data stored in `IndexedDB` suddenly unavailable, see the `Help` page for instructions how to fix that situation. On Chromium, at the moment, this option can not be disabled, since `storage.local` API there can not store `Uint8Array`s. Which is why this option is enabled by default on Chromium and disabled by default on Firefox.">Prefer <code>IndexedDB</code> API</ui>
    <ui id="config.gzipLSDumps" type="boolean" class="prefer-on" data-help="Before writing each new dump to local storage, try compressing it with GZip and use the compressed version if its size is smaller than the size of non-compressed version. This applies universally, to both stashing and saving to local storage using any available API. Enabled by default since this saves a lot of disk space when archiving to local storage is enabled (see `Archive 'collected' reqres by &gt; ... saving them into local storage` option above). You might want to disable this if you run `Hoardy-Web` on a system with a slow CPU of if you sometimes temporarily stash (see `Stash 'collected' reqres into local storage` option above and `Stash 'in_limbo' reqres` options below) but almost never archive data to local storage. Since, in the latter case, GZipping everything twice would be a waste of CPU cycles (once when stashing, and then the second time when exporting and/or on the archiving server side).">GZip new dumps</ui>
    </div>

    <!-- internallySubOptions -->
    </div>

    <!-- internallyOptions -->
    </div>

    <div id="this-tab-options">
    <!-- thisTabOptions -->
    <h1>This tab
      <span class="right">
        <input type="button" id="snapshotTab" data-shortcut="snapshotTab" data-help="Take DOM snapshots of all frames of this tab, regardless of `Track newly generated requests` setting." value="Snapshot" />
        <input type="button" id="forgetTabHistory" data-help="For reqres of this tab, forget recent history." value="Forget" />
        <input type="button" id="showTabState" data-shortcut="showTabState" data-help="For reqres of this tab, show the internal state and reqres history logs." value="State" />
      </span>
    </h1>
    <div class="stats">
      <div name="more" id="div-tabstats.collected" data-help="For this tab, the number of `finished` reqres that were taken for archival (and the sum total of all sizes of their dumps).">
        <span>Collected</span>
        <span>
        </span>
        <span>
          <span id="tabstats.collected">0</span>
          (<span id="tabstats.collected_size">0</span>)
        </span>
      </div>
      <div name="more" id="div-tabstats.discarded" data-help="For this tab, the number of `finished` reqres that were NOT taken for archival and thus were discarded from memory (and the sum total of all sizes of their dumps).">
        <span>Discarded</span>
        <span>
        </span>
        <span>
          <span id="tabstats.discarded">0</span>
          (<span id="tabstats.discarded_size">0</span>)
        </span>
      </div>
      <div id="div-tabstats.in_limbo" data-help="For this tab, the number of `finished` reqres that are in `in_limbo` state (and the sum total of all sizes of their dumps).">
        <span>In limbo</span>
        <span>
          <input type="button" id="collectAllTabInLimbo" data-shortcut="collectAllTabInLimbo" data-help="For reqres of this tab, collect all reqres in `in_limbo` state." value="Collect" />
          <input type="button" id="discardAllTabInLimbo" data-shortcut="discardAllTabInLimbo" data-help="For reqres of this tab, discard all reqres in `in_limbo` state." value="Discard" />
        </span>
        <span>
          <span id="tabstats.in_limbo">0</span>
          (<span id="tabstats.in_limbo_size">0</span>)
        </span>
      </div>
      <div name="more" id="div-tabstats.picked" data-help="For this tab, the number of reqres that satisfied `Pick reqres for archival when they finish` conditions at the moment they `finished`.">
        <span>Picked</span>
        <span>
        </span>
        <span>
          <span id="tabstats.picked">0</span>
        </span>
      </div>
      <div name="more" id="div-tabstats.dropped" data-help="For this tab, the number of reqres that did NOT satisfy `Pick reqres for archival when they finish` conditions at the moment they `finished`.">
        <span>Dropped</span>
        <span>
        </span>
        <span>
          <span id="tabstats.dropped">0</span>
        </span>
      </div>
      <div id="div-tabstats.problematic" data-help="For this tab, the number of reqres that satisfied `Mark reqres as 'problematic' when they finish` conditions at the moment they `finished`.">
        <span>Problematic</span>
        <span>
          <input type="button" id="unmarkAllTabProblematic" data-shortcut="unmarkAllTabProblematic" data-help="For reqres of this tab, unmark all `problematic` reqres." value="Unmark" />
        </span>
        <span>
          <span id="tabstats.problematic">0</span>
        </span>
      </div>
      <div id="div-tabstats.in_flight" data-help="For this tab, the number of in-flight reqres that have not `finished` yet. See the `Help` page for more info.">
        <span>In flight</span>
        <span>
          <input type="button" id="stopTabInFlight" data-help="For reqres of this tab, stop tracking progress of all in-flight requests and either collect them for archival or fail them, depending on completion and `Pick reqres for archival when they finish` options." value="Stop" />
        </span>
        <span>
          <span id="tabstats.in_flight">0</span>
          +
          <span id="tabstats.finishing_up">0</span>
        </span>
      </div>
    </div>
    <div class="opts">
    <ui id="tabconfig.collecting" type="boolean" class="prefer-on dc" tabindex=2 data-shortcut="toggleTabConfigTracking" data-help="Track new reqres originating from this tab.">Track new reqres</ui>
    <ui id="tabconfig.limbo" type="boolean" tabindex=3 data-shortcut="toggleTabConfigLimbo" data-help="For this tab, put newly `finished` reqres tab that satisfy `Pick reqres for archival when they finish` settings into limbo until you collect them for archival or discard them manually.">Pick into limbo</ui>
    <ui name="more" id="tabconfig.negLimbo" type="boolean" class="prefer-off" data-help="For this tab, put newly `finished` reqres that do NOT satisfy `Pick reqres for archival when they finish` settings into limbo instead of discarding them immediately. Useful for debugging.">Drop into limbo</ui>
    <ui name="more" id="tabconfig.stashLimbo" type="boolean" class="ds" data-help="For this tab, backup `in_limbo` reqres into browser&#039;s local storage. With this option enabled, `Hoardy-Web` will keep `in_limbo` reqres across browser restarts and extension reloads. This option does nothing if `Stash 'collected' reqres into local storage` is disabled. Enabled by default. See the `Help` page for more info.">Stash <code>in_limbo</code> reqres</ui>
    <ui id="tabconfig.bucket" type="string" data-help="Use this bucket when archiving reqres originating from this tab.">Bucket</ui>
    </div>
    <!-- thisTabOptions -->
    </div>

    <div id="this-tab-children-options">
    <!-- thisTabChildrenOptions -->
    <h1>This tab&#039;s new children</h1>
    <div class="opts">
    <ui id="tabconfig.children.collecting" type="boolean" tabindex=4 class="prefer-on dc" data-shortcut="toggleTabConfigChildrenTracking" data-help="Enable `Track new reqres` option in new tabs spawned from this tab (via middle mouse click, context menu actions).">Enable <code>Track new reqres</code></ui>
    <ui id="tabconfig.children.limbo" type="boolean" tabindex=5 data-shortcut="toggleTabConfigChildrenLimbo" data-help="Enable `Pick into limbo` option in new tabs spawned from this tab (via middle mouse click, context menu actions).">Enable <code>Pick into limbo</code></ui>
    <ui name="more" id="tabconfig.children.negLimbo" type="boolean" class="prefer-off" data-help="Enable `Drop into limbo` option in new tabs spawned from this tab (via middle mouse click, context menu actions).">Enable <code>Drop into limbo</code></ui>
    <ui name="more" id="tabconfig.children.stashLimbo" type="boolean" class="ds" data-help="Enable `Stash 'in_limbo' reqres` option in new tabs spawned from this tab (via middle mouse click, context menu actions).">Enable <code>Stash 'in_limbo' reqres</code></ui>
    <ui id="tabconfig.children.bucket" type="string" data-help="Use this bucket when archiving reqres originating from new tabs opened from this tab (middle mouse click, context menu actions).">Bucket</ui>
    </div>
    <!-- thisTabChildrenOptions -->
    </div>

    <div id="root-tab-options">
    <!-- rootTabOptions -->
    <h1>New root tabs</h1>
    <div class="opts">
    <ui id="config.root.collecting" type="boolean" class="prefer-on dc" tabindex=6 data-help="Enable `Track new reqres` option in new tabs opened via browser&#039;s &quot;New Tab&quot; browser action (new tabs created via the plus sign in the tab bar, `Control+T`, `New Tab` menu item). This setting also gets applied to all open tabs when `Hoardy-Web` is (re)loaded.">Enable <code>Track new reqres</code></ui>
    <ui id="config.root.limbo" type="boolean" tabindex=7 data-help="Enable `Pick into limbo` option in new tabs opened via browser&#039;s &quot;New Tab&quot; action (new tabs created via the plus sign in the tab bar, `Control+T`, `New Tab` menu item). This setting also gets applied to all open tabs when `Hoardy-Web` is (re)loaded.">Enable <code>Pick into limbo</code></ui>
    <ui name="more" id="config.root.negLimbo" type="boolean" class="prefer-off" data-help="Enable `Drop into limbo` option in new tabs opened via browser&#039;s &quot;New Tab&quot; action (new tabs created via the plus sign in the tab bar, `Control+T`, `New Tab` menu item). This setting also gets applied to all open tabs when `Hoardy-Web` is (re)loaded.">Enable <code>Drop into limbo</code></ui>
    <ui name="more" id="config.root.stashLimbo" type="boolean" class="ds" data-help="Enable `Stash 'in_limbo' reqres` option in in new tabs opened via browser&#039;s &quot;New Tab&quot; action (new tabs created via the plus sign in the tab bar, `Control+T`, `New Tab` menu item). This setting also gets applied to all open tabs when `Hoardy-Web` is (re)loaded.">Enable <code>Stash 'in_limbo' reqres</code></ui>
    <ui name="more" id="config.root.bucket" type="string" data-help="Use this bucket when archiving reqres originating from new tabs opened via browser&#039;s &quot;New Tab&quot; browser action (new tabs created via the plus sign in the tab bar, `Control+T`, `New Tab` menu item). This setting also gets applied to all open tabs when `Hoardy-Web` is (re)loaded.">Bucket</ui>
    </div>
    <!-- rootTabOptions -->
    </div>

    <div name="more">
    <!-- bigMore -->

    <div id="background-options">
    <!-- backgroundOptions -->
    <h1>Background tasks</h1>
    <div class="opts">
    <ui id="config.background.collecting" type="boolean" class="prefer-on dc" data-help="Track new reqres originating from browser&#039;s background tasks (excluding those originating from extensions). With the default browser config you probably should not disable this as browsers do link pre-fetching in background, and disabling this will miss that data.">Track new reqres</ui>
    <ui id="config.background.limbo" type="boolean" data-help="For reqres originating from browser&#039;s background tasks (excluding those originating from extensions), put newly `finished` reqres tab that satisfy `Pick reqres for archival when they finish` settings into limbo until you collect them for archival or discard them manually.">Pick into limbo</ui>
    <ui id="config.background.negLimbo" type="boolean" class="prefer-off" data-help="For reqres originating from browser&#039;s background tasks (excluding those originating from extensions), put newly `finished` reqres tab that do NOT satisfy `Pick reqres for archival when they finish` settings into limbo instead of discarding them immediately. Useful for debugging.">Drop into limbo</ui>
    <ui id="config.background.stashLimbo" type="boolean" class="ds" data-help="For reqres originating from browser&#039;s background tasks (excluding those originating from extensions), backup `in_limbo` reqres into browser&#039;s local storage. This option does nothing if `Stash 'collected' reqres into local storage` is disabled. Enabled by default. See the `Help` page for more info.">Stash <code>in_limbo</code> reqres</ui>
    <ui id="config.background.bucket" type="string" data-help="Use this bucket when archiving reqres originating from browser&#039;s background tasks (excluding those originating from extensions).">Bucket</ui>
    </div>
    <!-- backgroundOptions -->
    </div>

    <div id="extension-options">
    <!-- extensionOptions -->
    <h1>Extensions</h1>
    <div class="opts">
    <ui id="config.extension.collecting" type="boolean" class="dc" data-help="Track new reqres originating from browser extensions.">Track new reqres</ui>
    <ui id="config.extension.limbo" type="boolean" data-help="For reqres originating from browser&#039;s extensions/add-ons, put newly `finished` reqres tab that satisfy `Pick reqres for archival when they finish` settings into limbo until you collect them for archival or discard them manually.">Pick into limbo</ui>
    <ui id="config.extension.negLimbo" type="boolean" class="prefer-off" data-help="For reqres originating from browser&#039;s extensions/add-ons, put newly `finished` reqres tab that do NOT satisfy `Pick reqres for archival when they finish` settings into limbo instead of discarding them immediately. Useful for debugging.">Drop into limbo</ui>
    <ui id="config.extension.stashLimbo" type="boolean" class="ds" data-help="For reqres originating from browser&#039;s extensions/add-ons, backup `in_limbo` reqres into browser&#039;s local storage. This option does nothing if `Stash 'collected' reqres into local storage` is disabled. Enabled by default. See the `Help` page for more info.">Stash <code>in_limbo</code> reqres</ui>
    <ui id="config.extension.bucket" type="string" data-help="Use this bucket when archiving reqres originating from browser extensions.">Bucket</ui>
    </div>
    <!-- extensionOptions -->
    </div>

    <div id="pick-options">
    <!-- pickOptions -->
    <h1>Pick reqres for archival when they finish</h1>
    <div class="opts">
    <ui id="config.archivePartialRequest" type="boolean" class="prefer-on c" data-help="Pick a newly `finished` reqres for archival even when its request body is incomplete. Enabled by default, and you probably want to keep this enabled. See the &quot;Quirks and Bugs&quot; section of the `Help` page for details.">... {} with partial POST form data</ui>
    <ui id="config.archiveCanceled" type="boolean" class="prefer-off c" data-help="Pick a newly `finished` reqres for archival even when it was canceled before it was even sent (this usually means the `HTTP` request in question was blocked by another extension like `uBlock Origin`). Disabled by default because such archived reqres carry no information except that the browser tried to do a request at specified time.">... {} in <code>canceled</code> state</ui>
    <ui id="config.archiveNoResponse" type="boolean" class="prefer-off c" data-help="Pick a newly `finished` reqres for archival even when it got no response (i.e. the request in question was interrupted before request headers were received, this usually means a networking issue). Disabled by default because such archived reqres carry no information except that the browser tried to do a request at specified time.">... {} in <code>no_response</code> state</ui>
    <ui id="config.archiveIncompleteResponse" type="boolean" class="prefer-off c" data-help="Pick a newly `finished` reqres for archival even when its response body is incomplete (e.g. response body was interrupted in the middle by a networking issue). Disabled by default because simply reloading the page and not dealing with partial files is usually a better option.">... {} in <code>incomplete</code> or <code>incomplete_fc</code> state</ui>
    <ui id="config.archive1xxCodes" type="boolean" class="prefer-on c" data-help="Pick a newly `finished` reqres for archival even when its `HTTP` response status code is `1xx`. Enabled by default.">... {} with <code>1xx</code> status codes</ui>
    <ui id="config.archive3xxCodes" type="boolean" class="prefer-on c" data-help="Pick a newly `finished` reqres for archival even when its `HTTP` response status code is `3xx`. Enabled by default.">... {} with <code>3xx</code> status codes</ui>
    <ui id="config.archiveTransientCodes" type="boolean" class="prefer-on c" data-help="Pick a newly `finished` reqres for archival even when its `HTTP` response status code is a transient error. Enabled by default.">... {} with transient server errors</ui>
    <ui id="config.archivePermanentCodes" type="boolean" class="prefer-on c" data-help="Pick a newly `finished` reqres for archival even when its `HTTP` response status code is a permanent error. Enabled by default.">... {} with permanent server errors</ui>
    <ui id="config.archiveWithErrors" type="boolean" class="prefer-on c" data-help="Pick a newly `finished` reqres for archival even when `Hoardy-Web` encountered (non-trivial) errors while collecting it. Enabled by default because very few errors mean the data is invalid. E.g., network errors for requests aborted by other extensions, as well as parsing and rendering-related errors reported by the browser can usually be ignored.">... {} with reqres errors</ui>
    </div>
    <!-- pickOptions -->
    </div>

    <div id="problematic-options">
    <!-- problematicOptions -->
    <h1>Mark reqres as <code>problematic</code> when they finish</h1>
    <div class="opts">
    <ui id="config.markProblematicPartialRequest" type="boolean" class="c" data-help="Marke a newly `finished` reqres as `problematic` when its request body is incomplete. Enabled by default. See the &quot;Quirks and Bugs&quot; section of the `Help` page for details.">... {} with partial POST form data</ui>
    <ui id="config.markProblematicCanceled" type="boolean" class="prefer-off c" data-help="Mark a newly `finished` reqres as `problematic` when it was canceled before it was even sent (this usually means the `HTTP` request in question was blocked by another extension like `uBlock Origin`). Disabled by default.">... {} in <code>canceled</code> state</ui>
    <ui id="config.markProblematicNoResponse" type="boolean" class="prefer-on c" data-help="Mark a newly `finished` reqres as `problematic` when it got no response (i.e. the request in question was interrupted before request headers were received; this usually means a networking issue). Enabled by default.">... {} in <code>no_response</code> state</ui>
    <ui id="config.markProblematicIncomplete" type="boolean" class="prefer-on c" data-help="Mark a newly `finished` reqres as `problematic` when its response body is incomplete (e.g. response body was interrupted in the middle by a networking issue). Enabled by default.">... {} in <code>incomplete</code> state</ui>
    <ui id="config.markProblematicIncompleteFC" type="boolean" class="prefer-off c" data-help="Mark a newly `finished` reqres as `problematic` when it was loaded from browser&#039;s cache but its response data was not given to the extension (this only happens on Firefox-based browsers). Disabled by default because this usually means that one of the previously `collected` reqres had this response data archived already, if had not, you can reload the page with browser&#039;s cache disabled via `Contrlol+F5`.">... {} in <code>incomplete_fc</code> state</ui>
    <ui id="config.markProblematicTransientCodes" type="boolean" class="prefer-on c" data-help="Mark a newly `finished` reqres as `problematic` when its `HTTP` response status code is a transient error. Enabled by default because this usually means that, to be properly archived, the page needs to be reloaded later.">... {} with transient server errors</ui>
    <ui id="config.markProblematicPermanentCodes" type="boolean" class="c" data-help="Mark a newly `finished` reqres as `problematic` when its `HTTP` response status code is a permanent error. Disabled by default because this usually means that reloading the page won&#039;t help.">... {} with permanent server errors</ui>
    <ui id="config.markProblematicWithImportantErrors" type="boolean" class="prefer-on c" data-help="Mark a newly `finished` reqres as `problematic` when it had important collection errors. Currently, only errors generated by `Hoardy-Web` itself (when it failed to collect the data from the browser for various reasons), are considered important. Enabled by default.">... {} with important reqres errors</ui>
    <ui id="config.markProblematicPickedWithErrors" type="boolean" class="prefer-on c" data-help="Mark a newly `finished` reqres as `problematic` when `Hoardy-Web` encountered (non-trivial) errors while collecting it and `Pick reqres for archival when they finish` settings picked it for archival. Enabled by default.">... {} with reqres errors and get <code>picked</code></ui>
    <ui id="config.markProblematicDroppedWithErrors" type="boolean" class="c" data-help="Mark a newly `finished` reqres as `problematic` when `Hoardy-Web` encountered (non-trivial) errors while collecting it and `Pick reqres for archival when they finish` settings did NOT pick it for archival. Disabled by default because with this enabled all reqres blocked by ad-blocking extension like `uBlock Origin` will be marked as `problematic`.">... {} with reqres errors and get <code>dropped</code></ui>
    </div>
    <!-- problematicOptions -->
    </div>

    <div id="closed-auto-options">
    <!-- closedAutoOptions -->
    <h1>Automatic actions for recently closed tabs</h1>
    <div class="opts">
    <ui id="config.autoUnmarkProblematic" type="boolean" data-help="For a recently closed tab, automatically forget about `problematic` reqres.">Auto-unmark <code>problematic</code> reqres</ui>
    <ui id="config.autoPopInLimboCollect" type="boolean" data-help="For a recently closed tab, automatically collect `in_limbo` reqres.">Auto-collect <code>in_limbo</code> reqres</ui>
    <ui id="config.autoPopInLimboDiscard" type="boolean" class="prefer-off" data-help="For a recently closed tab, automatically discard `in_limbo` reqres.">Auto-discard <code>in_limbo</code> reqres</ui>
    <ui id="config.autoTimeout" type="number" class="dauto c" data-help="Perform automatic actions after this many seconds after the target tab is closed.">... after {} seconds</ui>
    </div>
    <!-- closedAutoOptions -->
    </div>

    <div id="history-options">
    <!-- historyOptions -->
    <h1>History</h1>
    <div class="opts">
    <ui id="config.history" type="number" class="c" data-help="Remember at most this many `collected` and `discarded` reqres in the log.">Remember at most {} elements</ui>
    </div>
    <!-- historyOptions -->
    </div>

    <!-- bigMore -->
    </div>

    <div id="notification-options">
    <!-- notificationOptions -->
    <h1>Generate desktop notifications about</h1>
    <div class="opts">
    <ui id="config.problematicNotify" type="boolean" class="c" tabindex=8 data-help="Complain when a new `problematic` reqres appears.">... {} new <code>problematic</code> reqres</ui>
    <div name="more">
    <!-- notifyMore -->
    <ui id="config.problematicNotifyNumber" type="number" class="dpn c" data-help="Show no more than this many latest METHOD + URL lines in the generated `problematic` reqres notification.">... ... but no more than {} lines</ui>
    <ui id="config.limboNotify" type="boolean" class="c" data-help="Complain when too much stuff is being held in limbo. You can safely disable this or set the following sub-options to absurdly high values if `Stash 'collected' reqres into local storage` and all `Stash 'in_limbo' reqres` options are set.">... {} too much stuff in <code>in_limbo</code> state</ui>
    <ui id="config.limboMaxNumber" type="number" class="dln c" data-help="Start complaining when more than this number of reqres are in `in_limbo` state.">... ... after {} elements</ui>
    <ui id="config.limboMaxSize" type="number" class="dln c" data-help="Start complaining when the total size of all dumps in `in_limbo` state is larger than this many Megabytes.">... ... or {} MiB</ui>
    <ui id="config.autoNotify" type="boolean" class="c" data-help="Generate a notification when an automatic action was performed in background.">... {} automatic actions</ui>
    <ui id="config.archiveStuckNotify" type="boolean" class="prefer-on c" data-help="Complain when the archival queue is not empty but both `Archive 'collected' reqres by` and `Stash 'collected' reqres into local storage` options are disabled.">... {} unstashed stuck archival queue</ui>
    <ui id="config.archiveFailedNotify" type="boolean" class="prefer-on c" data-help="Complain when some reqres fail to be stashed or archived to persistent storage (browser&#039;s local storage, the archival server, etc).">... {} archival errors</ui>
    <ui id="config.archiveDoneNotify" type="boolean" class="c" data-help="Generate an &quot;All OK&quot; notification when the archival queue becomes empty the very first time or after a previous archival failure. This exists mostly for on-boarding new users.">... {} newly empty archival queue</ui>
    <ui id="config.hintNotify" type="boolean" class="c" data-help="Generate notifications about various non-obvious things `Hoardy-Web` or your browser does.">... {} UI hints</ui>
    <ui id="config.invisibleUINotify" type="boolean" class="c" data-help="Generate notifications about actions with effects that are probably invisible in the UI. This only has an effect if `Hoardy-Web` runs on a mobile browser like Fenix/Fennec/Mull/etc, where the browser has to deal with a limited screen estate and so the use of `Hoardy-Web`&#039;s setting menu could get really confusing, as the browser will not switch to tabs newly spawned from there.">... {} actions invisible in the UI</ui>
    <!-- notifyMore -->
    </div>
    </div>
    <!-- notificationOptions -->
    </div>

    <div name="more">
    <!-- uiMore -->

    <div id="ui-options">
    <h1>User Interface and Accessibility</h1>
    <div class="opts">
    <ui id="config.verbose" type="boolean" data-help="Produce more verbose desktop notifications. Enabled by default for on-boarding new users. You can safely disable this if you are aware that almost anything `Hoardy-Web` dose can be changed by one of its settings, and/or if long notifications annoy you by taking a lot of screen area and/or speech time of you TTS engine.">Verbose notifications</ui>
    <ui id="config.spawnNewTabs" type="boolean" data-help="Open the other pages of this extension in newly created tabs instead of reusing the current window. This is enabled by default and can not disabled when `Hoardy-Web` runs on a desktop browser. This is disabled by default when `Hoardy-Web` runs on a mobile browser.">Spawn internal pages in new tabs</ui>
    <ui id="config.colorblind" type="boolean" data-help="Use bluish colors instead of greenish where possible.">Colorblind mode</ui>
    <ui id="config.pureText" type="boolean" data-help="Do not use emojis in UI labels. Makes screen readers happier.">Pure text labels</ui>
    </div>
    </div>

    <div id="firefox-workarounds">
    <h1>Workarounds for Firefox bugs</h1>
    <div class="opts">
    <ui id="config.workaroundFirefoxFirstRequest" type="boolean" data-help="Cancel and restart the very first non-background request Firefox makes. See the &quot;Quirks and Bugs&quot; section of the `Help` page for details.">Restart the very first request</ui>
    </div>
    </div>

    <div id="chromium-workarounds">
    <h1>Workarounds for Chromium bugs</h1>
    <div class="opts">
    <ui id="config.workaroundChromiumDebugTimeout" type="number" class="c" data-help="Wait this many seconds for Chromium to generate new debugging or webRequest events before giving up and forcefully finishing all unmatched in-flight reqres. See the &quot;Quirks and Bugs&quot; section of the `Help` page for details. Make this larger if your system is slow in general or if `Hoardy-Web` generates duplicated reqres for the same fetched URL.">Delay reqres for {} seconds</ui>
    <ui id="config.workaroundChromiumResetRootTab" type="boolean" class="prefer-on" data-help="Reset new tabs opened via browser&#039;s &quot;New Tab&quot; browser action (new tabs created via the plus sign in the tab bar, `Control+T`, `New Tab` menu item) to the URL below. You can disable this, but then `Hoardy-Web` will proceed trying to collect the first page the browser loads there, which will probably fail.">Reset new root tabs</ui>
    <ui id="config.workaroundChromiumResetRootTabURL" type="string" data-help="URL of the first page in a new tab. Setting this to `about:blank` is highly recommended.">... ... to URL</ui>
    </div>
    </div>

    <div id="debugging-options">
    <h1>Debugging</h1>
    <div class="stats">
      <div name="more" id="div-stats.errored" data-help="At the moment, the number of reqres for which `Hoardy-Web` produced internal errors. Basically, the number of reqres that hit bugs in `Hoardy-Web`.">
        <span>Errored</span>
        <span>
          <input type="button" id="forgetErrored" class="smaller" data-help="Forget about all these reqres." value="Forget" />
        </span>
        <span>
          <span id="stats.errored">0</span>
          (<span id="stats.errored_size">0</span>)
        </span>
      </div>
    </div>
    <div class="opts">
    <ui id="config.ephemeral" type="boolean" class="prefer-off" data-help="Make all changes to settings in this popup ephemeral from this point on. Restarting the browser or reloading the extension will reset config to the last state when this setting was off.">Ephemeral settings</ui>
    <ui id="config.debugging" type="boolean" class="prefer-off" data-help="Report lots of data into extension&#039;s debugging log (in Firefox: about:debugging; in Chromium: extension inspector). This will make things very slow and will eat lots of memory. Do not enable unless you know what you are doing.">Verbose debugging log (SLOW!)</ui>
    <ui id="config.dumping" type="boolean" class="prefer-off" data-help="Dump raw CBOR reqres dumps into extension&#039;s debugging log. Makes things even slower and eats even more memory. Do not enable unless you know what you are doing.">Dump raw CBORs into the log</ui>
    <ui id="config.snapshotAny" type="boolean" class="prefer-off" data-help="Try capturing DOM snapshots for tabs and frames with all URLs, including `about:`, `data:`, `file:`, and extension pages. If you enable this, expect to see a lot of snapshot capture errors.">Capture snapshots of all URLs</ui>
    <ui id="config.discardAll" type="boolean" class="prefer-off" data-help="Automatically discard all reqres instead of archiving them. Useful for debugging most of the machinery of `Hoardy-Web` without actually archiving anything. Do not enable unless you know what you are doing.">Discard all reqres just before archival</ui>
    </div>
    <h2>Destructive actions</h2>
    <div class="flex"><span class="center">
      <input type="button" id="resetConfig" data-help="Reset all config options to their default values." value="Reset config!" />
      <input type="button" id="resetPersistentStats" data-help="Reset all persistent `collected`, `discarded`, `picked`, and `dropped` stats to zero." value="Reset stats!" />
    </span></div>
    </div>

    <!-- uiMore -->
    </div>

    <div class="flex">
      <input type="button" id="showAll" tabindex=1 value="Show all" />
    </div>

    <!-- idBody -->
    </div>

    $for(libScript)$<script src="../lib/$libScript$"></script>$endfor$
    <script src="popup.js"></script>
  </body>
</html>