Questie

Questie

116M Downloads

[TBC] Raid frames taint

Spyroh opened this issue ยท 11 comments

commented

Hello.

I have noticed that Questie (6.3.15) is tainting Blizzard's Raid Frames. This summarized taint log is generated with only Questie loaded and no other addons:

Global variable IsQuestWatched tainted by Questie - Interface\AddOns\Questie\Modules\Tracker\QuestieTracker.lua:2137 HookBaseTracker()

Execution tainted by Questie while reading IsQuestWatched - Interface\FrameXML\QuestLogFrame.lua:213 QuestLog_Update()

An action was blocked in combat because of taint from Questie - CompactRaidFrame1:ClearAllPoints()

An action was blocked in combat because of taint from Questie - CompactRaidFrame1:SetPoint()

Global variable UIDROPDOWNMENU_MENU_LEVEL tainted by Questie - Interface\FrameXML\UIDropDownMenu.lua:40

Execution tainted by Questie while reading UIDROPDOWNMENU_MENU_LEVEL - Interface\FrameXML\UIDropDownMenu.lua:50

Complete taint log: taint.log

This screenshot is taken with only Questie + one small script to see taints on-the-fly as they happen:
Questie_Taint

This is the code I use to see taints on-the-fly:

local Taints = CreateFrame("Frame")
Taints:RegisterEvent("ADDON_ACTION_BLOCKED")
Taints:RegisterEvent("ADDON_ACTION_FORBIDDEN")
Taints:SetScript("OnEvent", function(_, Event, IsTainted, Function)
  print(Event..":", IsTainted, "::", Function)
end)

How to reproduce the problem easily:

  1. Disable all addons except Questie.
  2. Enable raid frames while on party.
  3. Load the code to see taints on the fly (it's a short code so it can even fit in a /run macro).
  4. Get in combat.
  5. Invite somebody to party (a macro with /invite Name would be the easiest way to repeatedly test it).

The invite can also be done before you get in combat, as long as the other player joins the party while you are in combat. Any units trying to appear/disappear from the raid frames in combat will trigger the taint, this can be players joining/leaving the party or party members summoning/sacrificing pets like Mages or Warlocks.

Macro version of the code to see taints on-the-fly:

/run local Taints=CreateFrame("Frame") Taints:RegisterEvent("ADDON_ACTION_BLOCKED") Taints:RegisterEvent("ADDON_ACTION_FORBIDDEN") Taints:SetScript("OnEvent",function(_,Event,IsTainted,Function) print(Event..":",IsTainted,"::",Function) end)

It's an important issue specially from a healing perspective, since it's preventing the raid frames from showing/hiding units when the player is in combat, and generally making them malfunction in different ways (units ending stacked on top of other units, seeing units that are no longer in the party, not seeing units that have joined, etc).

At first I thought it was the typical taint stemming from DropDowns, but looks like is coming from overwriting the API function IsQuestWatched() on Questie\Modules\Tracker\QuestieTracker.lua:2125 (the comment on top has nailed it ๐Ÿ˜†):

-- this is probably bad
IsQuestWatched = function(index)
    local questId = select(8, GetQuestLogTitle(index));
    if questId == 0 then
        -- When an objective progresses in TBC "index" is the questId, but when a quest is manually added to the quest watch
        -- (e.g. shift clicking it in the quest log) "index" is the questLogIndex.
        questId = index;
    end
    if "0" == GetCVar("autoQuestWatch") then
        return Questie.db.char.TrackedQuests[questId or -1]
    else
        return questId and QuestiePlayer.currentQuestlog[questId] and (not Questie.db.char.AutoUntrackedQuests[questId])
    end
end

GetNumQuestWatches = function()
    return 0
end
commented

@Spyroh @Wilzn
Have you experienced this after Questie v6.6.0 ?

commented

@Spyroh @Wilzn Have you experienced this after Questie v6.6.0 ?

Yeah I still get taints from Questie, I have my "taint notifier" always on, so I always see it when something happens.

I have seen that some pro Arena players have noticed this too, they disable Questie when doing Arena/BG's or have adapted by creating separate unitframes for the pets (which aren't shown when the raid frames are tainted if they are summoned in combat).

commented

Please reopen a new one if this still happens.

commented

+1 on the issue. My exp is that pet raid frames stack on eachother very often.

commented

Any update on this?

commented

You can follow the issue here: https://github.com/Stanzilla/WoWUIBugs/issues?q=is%3Aissue+is%3Aopen+taint
Blizzard hasn't done anything on the taint issue for over a year so i wouldn't hold my breath.

commented

You can follow the issue here: https://github.com/Stanzilla/WoWUIBugs/issues?q=is%3Aissue+is%3Aopen+taint
Blizzard hasn't done anything on the taint issue for over a year so i wouldn't hold my breath.

I don't think this taint has any relation with WorldMapFrame.pinPools/MapCanvasDataProviderMixin or UIDropDownMenu. It's probably just Questie overwriting API functions. Even in the source code there is a "this is probably bad" comment just before the overwrite because the dev knew that the execution path would get tainted when Blizzard's code calls that function.

UIDropDownMenu problems are solved by just using a DropDown Library (which Questie is already doing by using LibUIDropDownMenu).

commented

Something similiar with this issue?

#2958

commented

The problem is we need to override the function IsQuestWatched in order to be able to track more than 5 quests. We can't hook the function in any way because we need to modify the return value.

Disabling the tracker hooks should help with this, but will also limit the functionality of Questie.

commented

I have tried disabling the tracker module and doing /reload (so I can use the rest of Questie while having fully functional raid frames at the same time), but the raid frames are still tainted. This time the taintLog 1 is not as clear as the previous one:

Global variable SLASH_ACECONSOLE_QUESTIE1 tainted by Questie - Interface\AddOns\Questie\Libs\AceConsole-3.0\AceConsole-3.0.lua:99 RegisterChatCommand()

Execution tainted by Questie while reading SLASH_ACECONSOLE_QUESTIE1 - Interface\FrameXML\ChatFrame.lua:2596 ChatFrame_ImportListToHash()

Global variable UIDROPDOWNMENU_MENU_LEVEL tainted by Questie - Interface\FrameXML\UIDropDownMenu.lua:40

Execution tainted by Questie while reading UIDROPDOWNMENU_MENU_LEVEL - Interface\FrameXML\UIDropDownMenu.lua:50

An action was blocked in combat because of taint from Questie - CompactRaidFrame1:ClearAllPoints()

An action was blocked in combat because of taint from Questie - CompactRaidFrame1:SetPoint()

Doesn't look that clear this time. Looks like the typical DropDown taint, which is weird, isn't Questie using LibUIDropDownMenu to be free of those taints?

Seems like the taint comes from a different module now and the taintLog 1 is not being as detailed as the previous time and is catching stuff the isn't really the source of the problem (a classic thing with taints).

taintLog 2 says:

Execution tainted by Questie while reading QuestieConfigFrame - Interface\FrameXML\UIParent.lua:2724 old_CloseSpecialWindows()

Questie taints Blizz's UI from different modules I guess.

commented

Yes, Questie is using LibUIDropDownMenu, but the lib had problems in the past and we try to keep the dependencies updated.

There are other API function we override in Questie, to achieve certain functionality. Solving taint issues is a real pain because the Blizzard UI breaks so easily and the API is very restricted at some points...

We are discussing possible actions in the team, but since we are very limited in time, we would appreciate more contributions like yours or even in form of PRs. Debugging certain problems and sharing insights really helps us to solve issues.