feat: in-app update notifier + live filter-list refresh - #18
Merged
Merged
Conversation
Two Claude-owned backends (Part 1 of the update/refresh plan); both built
(incremental) and Marionette-validated. Grok's UI for these lands separately
after review.
Update notifier (notify-only; updater stays --disable-updater):
- NeonwolfUpdateCheck.sys.mjs (chrome:// ESM, init'd from the shields panel)
checks the GitHub Releases API ~daily and, if a newer tag exists, sets
neonwolf.update.availableVersion/.url for the UI. No download/apply.
- neonwolf.version.full ("<version>-<release>") baked at build by
neonwolf-patches.py; _isNewer compares version-release segment-wise.
- Prefs seeded in overrides.cfg; gated by neonwolf.update.checkEnabled.
Live filter-list refresh (native-ubo-snfe.patch, task #5):
- UBONetFilter periodically (+ manual neonwolf.shields.lists.refreshNow)
re-fetches lists from LIST_URLS (mirrors fetch-adblock-lists.sh) and rebuilds
the engine in place via the existing serialized rebuild path, BYPASSING
RemoteSettings sync so the dump-only delete hazard can't fire. Bundled dump is
the per-list fallback (a failed fetch never drops a list; engine never goes
empty). No selfie write, so warm starts stay fast. Prefs: autoRefresh,
refreshIntervalHours, refreshNow, lastRefresh.
Validated: chrome:// ESM import works; _isNewer correct; engine still blocks
doubleclick; refreshNow rebuild keeps blocking intact and sets lastRefresh.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…cker, filters import/export
Grok's display-layer batch, Claude-reviewed + fixed + built + Marionette-validated,
completing the frontends for the update-notifier and live-refresh backends.
- Update banner (neonwolf-update-banner.js): reads neonwolf.update.availableVersion/
.url, dismissible; validated showing "Neonwolf <ver> is available".
- Filter-list status panel (neonwolf-shields-lists.*): per-list rows, lastRefresh
time (epoch SECONDS — fixed from Grok's ms assumption), auto-refresh toggle,
Refresh-now button writing neonwolf.shields.lists.refreshNow.
- Element picker (neonwolf-element-picker{,-content}.js): frame-script overlay,
click-to-pick cosmetic rule appended to userFilters. Transport confirmed working
in FF152 (frame script injects/runs). Hardened: preview built via createElement/
textContent (no innerHTML from page DOM); removed attacker-controllable
content.window hook.
- Custom-filters import/export/subscribe: IOUtils used as global (not imported);
nsIFilePicker.open uses the {done} callback shape.
- Registered all new chrome files in jar.mn + browser.xhtml; seeded
dismissedVersion + subscriptions prefs.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part 1 of the update/refresh plan — two Claude-owned backends. Built (incremental) + Marionette-validated in a real browser. Grok's UI (update banner, list-status panel) lands separately after review.
Update notifier (notify-only)
NeonwolfUpdateCheck.sys.mjschecks the GitHub Releases API ~daily and setsneonwolf.update.availableVersion/.urlif a newer build exists. No download/apply; the updater stays compiled out.neonwolf.version.fullbaked at build for the comparison. Gated byneonwolf.update.checkEnabled.Live filter-list refresh (task #5)
UBONetFilterperiodically + on-demand re-fetches the lists from their canonical hosts and rebuilds in place, bypassing RemoteSettings sync so the dump-only delete hazard can't fire. Bundled dump is the per-list fallback — a failed fetch never drops a list, the engine never degrades to empty. Reuses the serialized rebuild machinery from the userFilters work.Validation
chrome:// ESM import works;
_isNewercorrect across release/FF-version bumps; engine still blocks doubleclick (no regression);refreshNowrebuild keeps blocking intact + setslastRefresh; one-shot trigger resets.🤖 Generated with Claude Code