v1.3.2
Added
data-i18n-ariaattribute support inlocalizeHtmlso any HTML element carryingdata-i18n-aria="key"has itsaria-labelpopulated from_localesat init timeramEstimateTooltipi18n key (was referenced frompopup.html/sidepanel.htmlbut never defined; users previously always saw the hardcoded English fallback)- i18n hooks on the privacy policy "Your data" section and footer (
privacyYourDataTitle,privacyYourDataText,privacyFooterText,privacyFooterLink). Those blocks were added in 1.3.1 as hardcoded English and skipped the existingdata-i18npass on the rest of the page
Changed
- Sessions section overhaul.
- Delete confirm UX no longer uses the awkward red "Sure?" text. The trash icon now morphs into a check mark with a red filled background and a soft pulsing halo; clicking the check confirms, auto-reverts after 3s.
- Newly saved sessions slide in from above with a brief tinted highlight and a subtle scale bounce - only the new card animates, not every existing one.
- Deleting a session plays a short slide-out + collapse animation before the row disappears, instead of snapping out.
- Action buttons (Open / Replace / Trash) sit at 70% opacity at rest and go to 100% on hover - they're visible without hovering now, so users on touch/no-hover devices can find them.
- Removed the redundant inline "Session saved!" feedback below the input on success - the toast already confirms it. Errors still inline for visibility.
- Added new i18n key
confirmDeleteTitle("Click again to confirm delete") translated into all 57 locales for the trash button's tooltip in confirming state. - Removed the now-dead
confirm("Sure?") i18n key from all 57 locales. - Added a
checkicon toicons.jsfor the confirm state.
- Changelog now only opens on major version bumps (e.g.
1.x.x → 2.x.x). Previously it also opened on minor bumps (1.2.x → 1.3.x). The "What's new" link in Settings still takes you to the changelog anytime. - Changelog page content reframed as a short "Polish & Fixes" section for 1.3.2; previously showed v1.3.1-specific items verbatim
- Sleeping-tab text contrast bumped from
opacity: 0.45to0.55in light mode so suspended titles clear WCAG AA (they scraped the bottom before); dark mode unchanged - Whitelist list now caps at
max-height: 140pxwith internal scroll - a long whitelist no longer stretches the Settings panel whatsNewBtntext now uses thewhatsNewi18n key (matching the 1.3.1 intent), notchangelogWhatsNew- those keys are distinct and had different capitalization- Locale files pretty-printed via
json.dump(indent=2)for formatting consistency across all 57 locales (non-en locales were already pretty-printed;ennow matches)
Fixed
- Tab list recovers from transient load errors. The
catchbranch inpopup.js#loadAllreplaced the#tabListDOM but didn't reset_tabListSig. If the next poll returned the same tabs, the signature-dedupe guard would short-circuit the re-render and leave the "Failed to load" state stuck on screen._tabListSigis now reset to''in the catch path. - Icon-only toolbar buttons now expose accessible names.
#btnCloseDuplicates,#btnSearchToggle, and#btnExportTabsin bothpopup.htmlandsidepanel.htmlonly carried atitleattribute; added explicitaria-label(plusdata-i18n-ariaso it localizes) so screen readers announce them reliably. - Locale cleanup backport. The 1.3.1 release stripped 23 orphaned keys from
en/messages.jsononly. The other 56 locales still shipped with the deadchangelogA11y*,changelogAnimations*,changelogBugFixes,changelogChangelog*,changelogFormCheck*,changelogLiveStats*,changelogReviewPrompt*,changelogSessionOptions*,changelogSessionRestore*,changelogWhitelistDupes*,changelogWhitelistVal*,failedToSuspend, andsuspendThiskeys. Cleaned in this release. - Two more dead i18n keys removed from every locale:
statRamSaved(replaced bystatLifetimeRamin 1.3.1) andprivacyShortTitle(the privacy policy no longer uses a separate heading for the TL;DR block). PluschangelogNewFeaturesandchangelogImprovementswhich aren't referenced by the simplified 1.3.2 changelog page. faviconFallbackhostname regex hardened from.replace('www.', '')(unanchored literal, technically could matchwww.mid-hostname) to.replace(/^www\./, '')tabListSignaturevariable-shadow cleanup - innervar t = tabs[i]was shadowing the outert()i18n helper inside the same function's scope; renamed totabfor clarity. No behavior change, lint hygiene.- Safety guard in changelog-open branch: if
drowzy_lastChangelogVersionis unexpectedly empty on anupdateevent (shouldn't happen but belt-and-suspenders), we now silently update the stored version instead of comparing against an empty string and opening the tab. - Share-stats URL uses canonical slug. The "Share" button in Stats was copying
https://chromewebstore.google.com/detail/drowzy/oijfnkaakdamnijjgehjpfmclhigmapa- Chrome Web Store redirects that to the real listing, but fixed to use the canonicaldrowzy-tab-suspender-memoslug so the pasted link doesn't look like an unrelated shortener. - Whitelist input clears its error state on success. If the user tried an invalid domain (red border + toast), then within 1.5s tried a valid domain, the red border lingered until the original fade-timer fired even though the add had succeeded. The success path now explicitly removes
.input-error. docs/privacy-policy.htmlre-synced with the in-extension copy. The "Your data" section and footer were missing thedata-i18nhooks added to the extension'sprivacy-policy.html; the GitHub Pages mirror is now byte-identical to the extension copy.- "What's new" link showed double version (
v1.3.1 v1.3.2) in non-English locales. 56 of 57 locales had the previous version baked into the translated string (e.g.dewas"Neu in v1.3.1"), andpopup.jswas appendingv$CURRENT$on top - producing concatenations like"Neu in v1.3.1 v1.3.2". Fixed by switchingwhatsNewto a$VERSION$chrome.i18n placeholder so each locale puts the version in the correct grammatical position natively, then passing the live manifest version as the substitution. Removeddata-i18n="whatsNew"frompopup.html/sidepanel.htmlsolocalizeHtmldoesn't render the literal placeholder beforeattachListenerssubstitutes it. - Full localization parity across all 57 locales. Twelve i18n keys (
changelogVersionLabel,copiedStats,privacyFooterLink,privacyFooterText,privacyPermHost,privacyPermScripting,privacyPermSidePanel,privacyYourDataText,privacyYourDataTitle,ramEstimateTooltip,shareStats,statLifetimeRam) had been added toenover 1.3.1 / 1.3.2 but never translated to the other 56 locales - non-English users were silently falling back to English text on those strings. Added native translations for all 12 keys × 56 locales (672 strings). Every locale now has all 156 keys. - Reconciled three privacy permission strings (
privacyPermHost,privacyPermScripting,privacyPermSidePanel) where theen/messages.jsonvalue was older verbose text disagreeing with the concise text inprivacy-policy.html's static fallback.localizeHtmlwas overwriting the rendered text with the older copy, causing a flash of wrong content. Theenvalues now match the HTML fallbacks exactly. - Reconciled six more privacy strings (
privacyTitle,privacyPermissionsIntro,privacyPermTabs,privacyPermStorage,privacyPermAlarms,privacyPermContextMenus) with the same drift pattern - theenvalues were stale (e.g."tabs - listing, suspending, and restoring browser tabs"redundantly included the permission name and dash that's already rendered separately by the<code>element). Updatedento the HTML's concise form and re-translated all six keys across the 56 non-English locales (336 fresh translations). Caught by a deeper localization audit that compares static HTML fallback text against the correspondingeni18n value.
Verifying this build
This release attaches the exact .zip uploaded to the Chrome Web Store. To verify it hasn't been tampered with:
sha256: 54d29d4e5f14043f7b0522350b076a15147044e637e45723c9252acb6a6c5770
You can reproduce the build yourself by checking out v1.3.2 and zipping the extension files (everything except .git/, .github/, *.md, docs/).