Fix: quest objectives stop updating until /reload - #1912
Merged
EllesmereGaming merged 2 commits intoSep 2, 2026
Merged
Conversation
The "All Objectives" master header is hidden by default, and it was kept hidden by an OnShow script that re-hid it every time Blizzard showed it. ObjectiveTrackerFrameMixin:Update() calls Header:Show() immediately before the container layout, so that script ran inside the update chain and tainted the rest of the pass. ScenarioObjectiveTracker lays out first and its LayoutContents reads player auras via ShouldShowMawBuffs, which hard errors under taint; the pass unwound before DirtiableMixin cleared self.dirty, so MarkDirty never scheduled another one and the tracker stopped updating until /reload. Suppress the header with alpha instead, the way POI buttons already are. The header's shown state has no effect on layout, so this is visually identical, and it puts no addon code in Blizzard's update chain.
The OnShow fight re-read the setting on every Blizzard Header:Show(), so it self-healed across a profile switch. The alpha suppression is a one-shot, and _EQT_RefreshAll never called it: switching to a profile that hides the header left it drawn outside the background (ApplyBackground re-anchors the BG top to the header's bottom edge), and switching the other way left the collapse-all button mouse-disabled until /reload.
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.
Bug: reported by @shinny on 9.0.7 - quest objective progress randomly stops updating and stays stuck until /reload (a fishing count frozen at 7/13, a summon bar frozen at 7%). The accompanying error is Blizzard_ScenarioObjectiveTracker.lua:187 in LayoutContents, reached from ObjectiveTrackerContainer:Update via DirtiableMixin.
Issue: the "All Objectives" master header is hidden by default, and it was held down by a HookScript("OnShow", ...) that re-hid it whenever Blizzard showed it. ObjectiveTrackerFrameMixin:Update calls self.Header:Show() immediately before it runs the container layout, and because our hook had just hidden the header that Show() fired OnShow on every single pass. Our script therefore executed inside Blizzard's update chain and tainted the rest of it.
Root cause: ScenarioObjectiveTracker is uiOrder 1, so its LayoutContents was the very next thing to run. Line 187 is ShouldShowMawBuffs(), which reads C_UnitAuras.GetAuraDataByIndex("player", 1, "MAW") - flagged RequiresUnitAuraAccess, so it hard-errors under taint. The freeze is permanent because DirtiableMixin's callback is
method(self); self.dirty = nil: the throw skips the clear, self.dirty stays true, and MarkDirty only schedules a passif not self.dirty. Nothing ever queues another one. Taint injected in the tail of a pass cannot do this, since every MarkDirty during a pass is swallowed by that same flag - only code running before the first module lays out matters, and this hook was the only such site.Fix: suppress the header with alpha instead of fighting Show(), matching ApplyPOISuppression already in the file - SetAlpha(0) plus EnableMouse(false) on the MinimizeButton so an invisible collapse-all is not clickable. The header's shown state has no effect on layout (the container spaces the first module by topModulePadding alone and never reads the header's rect), so this is visually identical with no addon code left in Blizzard's update chain. EnsureAccentDivider now treats an alpha-0 header as not rendered, and _EQT_RefreshAll re-applies the suppression on a profile swap, which the old always-live hook had been covering for free. As a side effect this also removes a latent combat block: Hide() on the tracker's header routed through EditMode's protected path, while SetAlpha is the same combat-safe route HardHide already uses.