WoWInterface

WoWInterface (https://www.wowinterface.com/forums/index.php)
-   Legion Beta archived threads (https://www.wowinterface.com/forums/forumdisplay.php?f=177)
-   -   Client crash bug with HybridScrollFrames (https://www.wowinterface.com/forums/showthread.php?t=53476)

Gello 05-21-16 04:22 PM

Client crash bug with HybridScrollFrames
 
Reposting from official forum:

It seems parenting a frame that contains a HybridScrollFrame to the PetJournal and back to UIParent causes all sorts of weirdness: scrollchild boundries not working, textures not writing, ARTWORK-layer fontstrings going behind BACKGROUND-layer textures on mouseover, HIGHLIGHT-layer textures not following the mouse, and then a client crash.

To reproduce, create the three files named in bold in a folder under AddOns called HybridTest:

HybridTest.toc
Code:

## Interface: 70000
## Title: HybridTest
## Notes: Testing for weird behavior and client crashes with HybridScrollFrames
HybridTest.xml
HybridTest.lua

HybridTest.xml
Code:

<Ui>

  <!-- template for HybridScrollFrame buttons -->
  <Button name="HybridTestButtonTemplate" virtual="true">
    <Size x="200" y="44"/>
    <Layers>
      <!-- background layer: a black listbutton texture -->
      <Layer level="BACKGROUND">
        <Texture file="Interface\Buttons\ListButtons">
          <TexCoords left="0" right="0.82421875" top="0.00390625" bottom="0.18359375"/>
        </Texture>
      </Layer>
      <!-- artwork layer: a single fontstring (Name) to write data -->
      <Layer level="ARTWORK">
        <FontString parentKey="Name" inherits="GameFontHighlight" justifyH="LEFT">
          <Size x="190" y="20"/>
          <Anchors>
            <Anchor point="LEFT" x="5" y="0"/>
          </Anchors>
        </FontString>
      </Layer>
      <!-- highlight layer: a listbutton highlight to further show weird effects -->
      <Layer level="HIGHLIGHT">
        <Texture file="Interface\Buttons\ListButtons">
          <TexCoords left="0" right="0.82421875" top="0.19140625" bottom="0.37109375"/>
        </Texture>
      </Layer>
    </Layers>
    <Frames>
      <!-- this button is anchored *outside* the above button and will reliably cause a client crash -->
      <Button parentKey="Button" inherits="ItemButtonTemplate">
        <Size x="36" y="36"/>
        <Anchors>
          <Anchor point="RIGHT" relativePoint="LEFT" x="-2" y="0"/>
        </Anchors>
      </Button>
    </Frames>
  </Button>

  <!-- frame has a tooltip-like backdrop and contains a basic HybridScrollFrame -->
  <Frame name="HybridTestFrame" parent="UIParent">
    <Size x="274" y="400"/>
    <Anchors>
      <Anchor point="CENTER"/>
    </Anchors>
    <Backdrop bgFile="Interface\Tooltips\UI-Tooltip-Background" edgeFile="Interface\Tooltips\UI-Tooltip-Border" tile="true">
      <EdgeSize val="16"/>
      <TileSize val="16"/>
      <BackgroundInsets left="3" right="3" top="3" bottom="3"/>
      <Color r="0" g="0" b="0"/>
    </Backdrop>
    <Frames>
      <ScrollFrame parentKey="ScrollFrame" name="HybridTestScrollFrame" inherits="HybridScrollFrameTemplate">
        <Size x="264" y="390"/>
        <Anchors>
          <Anchor point="TOPLEFT" x="5" y="-5"/>
        </Anchors>
        <Frames>
          <Slider parentKey="ScrollBar" name="HybridTestScrollBar" inherits="HybridScrollBarTrimTemplate">
            <Anchors>
              <Anchor point="TOPRIGHT" x="0" y="-16"/>
              <Anchor point="BOTTOMRIGHT" x="0" y="16"/>
            </Anchors>
          </Slider>
        </Frames>
      </ScrollFrame>
    </Frames>
    <Scripts>
      <OnLoad>
        self:RegisterEvent("PLAYER_LOGIN")
        self:RegisterEvent("ADDON_LOADED")
      </OnLoad>
      <OnEvent>
        self:OnEvent(event,...)
      </OnEvent>
    </Scripts>
  </Frame>

</Ui>

HybridTest.lua
Code:

--[[

  To reproduce:
  - Log in with this addon running. You should see a list with icons in the middle of the screen.
  - Open the Pet Journal. This causes the frame to parent to the PetJournal.
  - Close the Pet Journal. This returns the frame to UIParent.

  Issues:
  - The buttons in the scrollframe don't respect the scrollchild when it's back on UIParent. Buttons show off the bottom of the scrollframe.
  - Mouseover of the frame (despite no mouseover events other than the highlight) will cause the ARTWORK-layer fontstrings to drop behind the BACKGROUND-layer texture. These fontstrings will obey the scrollchild boundries while this is happening.
  - The highlight won't reliably follow the mouse.
  - The icon textures aren't updating reliably with the text.

  To crash the client:
  - Scroll up and down. Within a few seconds of doing this the client will crash. It's taken between 1 and 15 seconds of scrolling to crash.

]]

local frame = HybridTestFrame

-- create fake data
frame.data = {}
local icons = GetMacroIcons()
for i=1,25 do
  tinsert(frame.data,{"Test Data #"..i,icons[random(#icons)]})
end
icons = nil -- no longer need these

-- event handler
function frame:OnEvent(event,...)
  if event=="PLAYER_LOGIN" then
    -- setup scrollframe
    local scrollFrame = self.ScrollFrame
    scrollFrame.update = self.UpdateList
    HybridScrollFrame_CreateButtons(scrollFrame,"HybridTestButtonTemplate",40,0)
    frame:UpdateList()
  elseif event=="ADDON_LOADED" and select(1,...)=="Blizzard_Collections" then
    -- when journal shows: move frame to journal
    PetJournal:HookScript("OnShow",function(self)
      frame:SetParent(PetJournal)
      frame:SetFrameLevel(PetJournal:GetFrameLevel()+10) -- optional; just to make frame not blend with rest
      frame:SetPoint("CENTER")
    end)
    -- when journal hides: move frame back to UIParent
    PetJournal:HookScript("OnHide",function(self)
      frame:SetParent(UIParent)
      frame:SetPoint("CENTER")
    end)
  end
end

-- update function for the scrollframe
function frame:UpdateList()
  local numData = #frame.data
  local scrollFrame = frame.ScrollFrame
  local offset = HybridScrollFrame_GetOffset(scrollFrame)
  local buttons = scrollFrame.buttons
  for i=1,#buttons do
    local index = i + offset
    local button = buttons[i]
    if index<=numData then
      button.Name:SetText(frame.data[index][1])
      button.Button.icon:SetTexture(frame.data[index][2])
      button:Show()
    else
      button:Hide()
    end
  end
  HybridScrollFrame_Update(scrollFrame, scrollFrame.buttonHeight*numData, scrollFrame.buttonHeight)
end

As it says in the comments:

To reproduce:
- Log in with this addon running. You should see a list with icons in the middle of the screen.
- Open the Pet Journal. This causes the frame to parent to the PetJournal.
- Close the Pet Journal. This returns the frame to UIParent.

Issues:
- The buttons in the scrollframe don't respect the scrollchild when it's back on UIParent. Buttons show off the bottom of the scrollframe.
- Mouseover of the frame (despite no mouseover events other than the highlight) will cause the ARTWORK-layer fontstrings to drop behind the BACKGROUND-layer texture. These fontstrings will obey the scrollchild boundries while this is happening.
- The highlight won't reliably follow the mouse.
- The icon textures aren't updating reliably with the text.

To crash the client:
- Scroll up and down. Within a few seconds of doing this the client will crash. It's taken between 1 and 15 seconds of scrolling to crash.


All times are GMT -6. The time now is 11:40 PM.

vBulletin © 2024, Jelsoft Enterprises Ltd
© 2004 - 2022 MMOUI