File Details
v1.4.0
- R
- Jun 14, 2026
- 32.33 KB
- 157
- 12.0.7+2
- Retail
File Name
QuestLogCollapse-v1.4.0.zip
Supported Versions
- 12.0.7
- 12.0.1
- 12.0.0
lightweight tag 9dbc8b81a207b6db9322075b1263516135d6fa35 v1.4.0
Author: = <=>
Date: Sun Jun 14 15:00:04 2026 -0400
commit 9dbc8b81a207b6db9322075b1263516135d6fa35
Author: = <=>
Date: Sun Jun 14 15:00:04 2026 -0400
Updated readme and toc files with new verioning and contribution credits
commit 1690731843790ffd16c69bb7196890f08103a661
Author: = <=>
Date: Sun Jun 14 14:47:06 2026 -0400
Switch Defaults in TAINT_BLACKLIST back to false
Unable to reproduce issues documented in previous commit by @artherion77
(likely due to interaction with another addon on their machine.)
commit bbd6f88043ffecee345474b68109b23d90a4a2b4
Author: = <=>
Date: Sun Jun 14 13:10:56 2026 -0400
Revert "Bumping compatibility for 12.0.7"
This reverts commit bf4d895769bad7983313bfa753a8d8fe236c5926.
commit bbd6f88043ffecee345474b68109b23d90a4a2b4
Author: = <=>
Date: Sun Jun 14 13:10:56 2026 -0400
Revert "Bumping compatibility for 12.0.7"
This reverts commit bf4d895769bad7983313bfa753a8d8fe236c5926.
commit bbd6f88043ffecee345474b68109b23d90a4a2b4
Author: = <=>
Date: Sun Jun 14 13:10:56 2026 -0400
Revert "Bumping compatibility for 12.0.7"
This reverts commit bf4d895769bad7983313bfa753a8d8fe236c5926.
commit bbd6f88043ffecee345474b68109b23d90a4a2b4
Author: = <=>
Date: Sun Jun 14 13:10:56 2026 -0400
Revert "Bumping compatibility for 12.0.7"
This reverts commit bf4d895769bad7983313bfa753a8d8fe236c5926.
commit bbd6f88043ffecee345474b68109b23d90a4a2b4
Author: = <=>
Date: Sun Jun 14 13:10:56 2026 -0400
Revert "Bumping compatibility for 12.0.7"
This reverts commit bf4d895769bad7983313bfa753a8d8fe236c5926.
commit bbd6f88043ffecee345474b68109b23d90a4a2b4
Author: = <=>
Date: Sun Jun 14 13:10:56 2026 -0400
Revert "Bumping compatibility for 12.0.7"
This reverts commit bf4d895769bad7983313bfa753a8d8fe236c5926.
commit bbd6f88043ffecee345474b68109b23d90a4a2b4
Author: = <=>
Date: Sun Jun 14 13:10:56 2026 -0400
Revert "Bumping compatibility for 12.0.7"
This reverts commit bf4d895769bad7983313bfa753a8d8fe236c5926.
commit bbd6f88043ffecee345474b68109b23d90a4a2b4
Author: = <=>
Date: Sun Jun 14 13:10:56 2026 -0400
Revert "Bumping compatibility for 12.0.7"
This reverts commit bf4d895769bad7983313bfa753a8d8fe236c5926.
commit bbd6f88043ffecee345474b68109b23d90a4a2b4
Author: = <=>
Date: Sun Jun 14 13:10:56 2026 -0400
Revert "Bumping compatibility for 12.0.7"
This reverts commit bf4d895769bad7983313bfa753a8d8fe236c5926.
commit bf4d895769bad7983313bfa753a8d8fe236c5926
Author: = <=>
Date: Thu Jun 11 09:02:18 2026 -0400
Bumping compatibility for 12.0.7
commit 248a92934700293dcc1a853ebe39f0bf56543ec0
Author: artherion77 <christopher.pohl@gmail.com>
Date: Sun May 10 23:52:47 2026 +0200
feat(config): restructure into 5 Settings subcategories with per-context profiles + first-show fix + blacklist UI gating
Splits the single flat options panel into a parent + 4 subcategories in
the WoW Interface Options left-side tree:
QuestLogCollapse (Basic Options — enable, zone filter, open-world combat profile)
├ Instance Settings (Dungeons, Raids, Scenarios)
├ PvP Settings (Battlegrounds, Arenas)
├ Player Housing (Neighbourhood, Player Housing)
└ Legacy (Garrisons, Class Halls, Quest Tables)
Uses Settings.RegisterCanvasLayoutSubcategory for each child panel.
The flat saved-vars schema is replaced with a per-context profile shape:
each instance type gets its own block (`enabled`, per-tracker collapse
flags, namePlates), so the user can configure dungeons differently from
raids differently from open-world combat. Profiles can be created,
switched, copied, deleted via the Basic Options panel.
## First-show refresh fix
`CreateFrame` returns a frame in shown state, so the first
`Settings.OpenToCategory(subPanel.categoryID)` call hit `Show()` as a
no-op and the OnShow refresh script never fired — checkboxes appeared
empty until a hide/show round-trip via category switching. Fixed by
hiding each panel after construction so the first `Show()` actually
transitions visibility, and by also pointing each panel's `OnRefresh`
(the documented Settings-system callback) at the same refresh function
as a belt-and-braces hook.
## Blacklist UI gating
When a tracker is in the runtime `TAINT_BLACKLIST` (see #27), the
corresponding checkbox in every per-instance container is now:
- Disabled (`cb:Disable()`)
- Gray-labelled with a small orange `*` marker
- Calling `cb:SetMotionScriptsWhileDisabled(true)` so OnEnter/OnLeave
still fire for tooltip
- Tooltip explains why the toggle is inert and that saved-vars values
are left untouched (so removing the blacklist entry restores the
toggle without losing the user's previous setting)
Originally tried "(blacklisted)" as a label suffix but it overflowed the
120px column into adjacent labels — the orange `*` is the smallest
indicator that fits any column without truncation.
This depends on `ns.TAINT_BLACKLIST` being exported from
`QuestLogCollapse.lua`; that one-line export is included in this PR.
## Other QuestLogCollapse.lua changes
- `defaults` gains `filterQuestsByZoneMode = "openworld"` so the new
filter-mode dropdown has a value to read.
- `FilterQuestsByZone` honors `filterQuestsByZoneMode == "openworld"`
by skipping when `IsInInstance()`.
- `FilterQuestsByZone` snapshots the watch list on first run so the
"restore original tracking on disable" feature in the Basic Options
panel can return the user to their pre-filter state.
No game logic changed beyond those three small additions; the rest is
visual / structural restructure.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
commit 94525b3527106304638570555bf17543b80e39ff
Author: artherion77 <christopher.pohl@gmail.com>
Date: Sun May 10 23:47:18 2026 +0200
fix: stop writing custom fields onto Blizzard frames (taint root cause)
Reproducer eliminated by this change: enter combat with the addon
loaded, open the world map immediately. Previously surfaced as
ADDON_ACTION_BLOCKED on Frame:Show called from
Blizzard_ObjectiveTracker.lua:48 via the ObjectiveTrackerManager mixin
chain, with QuestLogCollapse identified as the taint source.
Root cause: ObjectiveTrackerFrame.qlcHooked = true. Writing arbitrary
keys onto a Blizzard-owned frame from addon-tainted Lua marks the
frame's table as tainted; subsequent dispatch through its mixin chain
(Frame:Show, RefreshAll, etc.) then runs with the addon implicitly on
the lookup chain and fails the protected-call check. Same pattern was
present on WorldMapFrame.qlcHooked = true and in two hot-path
fallbacks: tracker.collapsed = true / false in
SafeCollapseTracker / SafeExpandTracker's "Method 2" recovery branch.
Three changes, all the same anti-pattern:
1. Move both hook guards (mapFrameHooked, minimizeButtonHooked) off
the Blizzard frames into file-local booleans.
2. Probe ObjectiveTrackerFrame.Header.MinimizeButton (modern retail) /
HeaderMenu.MinimizeButton (older) / MinimizeButton (intermediate)
instead of hard-coding HeaderMenu. Side effect: the minimize-click
zone-filter trigger actually starts working again — it had been
silently dead since whatever patch renamed HeaderMenu to Header.
3. Drop the Method 2 property-write fallbacks. Same anti-pattern in a
hotter code path; if SetCollapsed errors non-tainfully, leave the
tracker in whatever state SetCollapsed produced rather than tainting
it via tracker.collapsed = X.
`HookScript` itself on a non-protected widget remains safe — it adds
to the script chain, doesn't write a custom field onto the frame's
table.
commit 939d201a6d3b7382bd1f2e424531254e13425cdd
Author: artherion77 <christopher.pohl@gmail.com>
Date: Sun May 10 23:38:38 2026 +0200
chore: remove dead OnEarlyCombat code (PLAYER_ENTER_COMBAT was never registered)
OnEarlyCombat is defined but never called. PLAYER_ENTER_COMBAT was
never RegisterEvent'd on the addon frame, so the function was
unreachable from any event-driven path. The function is referenced
only by the slash-command help text, which was wrong about the actual
collapse mechanism.
The "early detection" / "fallback" framing was the same code path —
PLAYER_REGEN_DISABLED — described twice. Drop the function, the
early-return guard in OnCombatStateChanged that checked for it, and
the slash help / README claims about early detection.
commit 9404fdd2d8cd3b56c7886c3664d1806349cc43a3
Author: artherion77 <christopher.pohl@gmail.com>
Date: Sun May 10 23:35:32 2026 +0200
fix: gate PLAYER_REGEN_DISABLED immediate-collapse path on TAINT_BLACKLIST
The PLAYER_REGEN_DISABLED handler called tracker:SetCollapsed(true)
directly via pcall on each enabled tracker without consulting
TAINT_BLACKLIST. SafeExpandTracker on PLAYER_REGEN_ENABLED honored
the blacklist, so a blacklisted tracker (e.g. Quest after the
preceding commit, or Bonus objectives) would be collapsed on combat
entry but never expanded on combat exit — stuck collapsed forever
after the first open-world fight. The SetCollapsed call also re-
tainted the very widget pool frame dimensions the blacklist exists
to protect.
Wrap the five immediate-collapse blocks in a small driver table and
add the TAINT_BLACKLIST[name] check before each SetCollapsed call,
mirroring SafeCollapseTracker's behavior. Net effect: blacklisted
trackers are silently skipped (with a debug log) on both collapse
and expand paths; the blacklist's stated guarantee is now actually
honored.
Side effect: collapses 5 near-identical pcall blocks into one driver
loop, ~85 lines down to ~22.
commit cfeb13c1a814e706ad172373c23219752eccd70d
Author: artherion77 <christopher.pohl@gmail.com>
Date: Sun May 10 23:34:03 2026 +0200
fix: activate Quest taint blacklist entry for UIWidget tooltip taint
QuestObjectiveTracker:SetCollapsed taints widget pool frame dimensions
when the tracker holds quests with embedded reward / UIWidget content.
Reproducer: track a World Quest in the quest log, then hover any World
Quest pin on the world map. The tooltip embedding the reward icon
fires 38× "attempt to perform arithmetic on a secret number value
(execution tainted by 'QuestLogCollapse')" at Blizzard_GameTooltip/
Mainline/GameTooltip.lua:754 in EmbeddedItemTooltip_UpdateSize. Same
class of widget-pool-width taint as the existing Bonus objectives
entry — different tooltip surface, same root cause.
The "leave until a specific taint error is confirmed" condition in
the previous comment is now met. Activate.
commit 13585679e76813ff07e11036ce2e7eab3c267bdf
Author: artherion77 <christopher.pohl@gmail.com>
Date: Thu May 7 19:37:47 2026 +0200
fix: correct TAINT_BLACKLIST key type and activate all confirmed taint entries
The original TAINT_BLACKLIST used Lua global frame-name strings as keys
(e.g. UIWidgetObjectiveTracker), but SafeCollapseTracker looks up
TAINT_BLACKLIST[name] where name is the human-readable tracker label
(e.g. "UI widgets"). The lookup never matched, making the blacklist a
complete no-op regardless of which entries were uncommented.
Fix:
- Switch to name-string keys that match the labels SafeCollapseTracker receives.
- Activate all five entries confirmed as taint sources:
["UI widgets"] - UIWidgetObjectiveTracker: widget pool frame taint
["Monthly activities"] - MonthlyActivitiesObjectiveTracker: UIWidget status bars
["Adventure map"] - AdventureMapQuestObjectiveTracker: map system taint
["World quest"] - WorldQuestObjectiveTracker: map system taint
["Bonus objectives"] - BonusObjectiveTracker: taints pool widths, fires
LayoutFrame.lua:491 on Area POI tooltips
- Keep ["Quest"] commented: collapseQuests defaults true for dungeons/raids, so
blacklisting it would silently break the core feature; no specific taint error
has been reported to justify the risk.
- Add a comment block explaining the UIWidget pool taint mechanism.
Also enables the collapseAdventureMaps and collapseWorldQuests settings that
were previously non-functional due to the blacklist bug.
Closes #24
commit df27b950dad3dc8564520a8b0d72529eb90016d5
Author: artherion77 <christopher.pohl@gmail.com>
Date: Wed May 6 17:45:13 2026 +0200
fix: remove WorldMapFrame:OnShow hook (deferral was insufficient)
Replaces the previous attempt at this PR (deferring the filter via
C_Timer.After(0, TryRunZoneFilter) inside the OnShow hook). The
deferral was insufficient because the OnShow hook BODY itself executes
synchronously inside ShowUIPanel → RefreshAll → secureexecuterange —
that's where the addon's Lua frame enters the call stack and marks the
chain tainted. Anything reachable after that point hits ADDON_ACTION_
BLOCKED on Frame:SetPassThroughButtons / Button:SetPassThroughButtons
(BonusObjectiveDataProvider:RefreshAllData, WorldQuestDataProvider:
PingQuestID) on every world-map open.
The hook is removed entirely. Filtering still triggers on movement,
spell/ability cast, mount/dismount, tracker minimize click, and
/qlc filterzone. Convenience cost: filter no longer auto-runs on map
open.
If a map-open trigger is wanted back, RegisterEvent("WORLD_MAP_OPEN")
is the candidate. Per Gethe/wow-ui-source: that event is dispatched as
WorldMapFrame's own OnEvent handler (which itself calls OpenWorldMap →
HandleUserActionOpenSelf → ShowUIPanel), so other registered frames
receive it as a sibling OnEvent dispatch rather than nested inside the
protected init chain. Should be tested in isolation before adding back.
Slash help text and README updated to reflect the removed trigger.
commit 945f80f10a9b42addc0177c64bd310571d373893
Author: artherion77 <christopher.pohl@gmail.com>
Date: Wed May 6 16:45:26 2026 +0200
fix: default collapseMonthlyActivities to false
MonthlyActivitiesObjectiveTracker is now in TAINT_BLACKLIST, so it cannot be
collapsed by the addon anyway. Defaulting the setting to false makes the
config UI match the actual runtime behavior and avoids user confusion when the
option appears enabled but has no effect.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
commit f7de767965fea10801187b33aa8f90e57c0a086d
Author: artherion77 <christopher.pohl@gmail.com>
Date: Wed May 6 16:43:03 2026 +0200
fix: remove ObjectiveTrackerFrame.SetCollapsed cascade from ExpandQuestLog
The block iterated ObjectiveTrackerFrame.MODULES and called SetCollapsed(false)
on every module unconditionally, bypassing TAINT_BLACKLIST entirely.
UIWidgetObjectiveTracker and MonthlyActivitiesObjectiveTracker are both in
MODULES; calling SetCollapsed on them triggers UIWidgetManager:ProcessWidget
→ InitPartitions in a tainted execution context, permanently poisoning pooled
StatusBar frame widths with "secret numbers". This causes hundreds repeated
LayoutFrame.lua errors per session until /reload.
Each tracker is already expanded individually via SafeExpandTracker above,
which respects the blacklist, so the cascade block was redundant as well as
harmful.

