ui: the ClassicAPI-era templates addons inherit by name

`CreateFrame(): Couldn't find inherited node "DialogBorderOpaqueTemplate"` is where
OpenMapClassic stopped — on its first file, inside Ace3, before a line of its own code ran.
It is not that addon's problem: `BackdropTemplate` is named **unguarded** by Ace3 itself
(`AceGUIContainer-Frame.lua:179` and `:206`, `AceGUIContainer-DropDownGroup.lua:128`), so
every Ace3 addon on this install hits it.

`assets/ui` does not grow, so this file carries its reason on that wall's own list: there is
no stock 1.12 file to migrate from, because 1.12 has neither template. They are the same kind
of surface as `script/compat/`'s verbs and live in XML only because `inherits=` is resolved by
the loader and cannot be answered from Lua.

**`BackdropTemplate` is correctly empty.** 9.0 moved the backdrop off the C side and invented
`BackdropTemplateMixin` to put it back; 1.12 still has `SetBackdrop`/`GetBackdrop`/
`SetBackdropColor`/`SetBackdropBorderColor` as real frame methods, so a frame inheriting the
template already answers all four. The mixin table exists for the
`BackdropTemplateMixin and "BackdropTemplate" or nil` idiom and for `Mixin()`, its rows
forwarding to the stock methods. **No getter rows**: a forwarding `GetBackdropColor` would
call itself once `Mixin()` had written it onto the frame, and the stock one already answers.

The dialog border is one `<Backdrop>` over this client's own dialog art — the shape every
stock 1.12 dialog draws, and the same block `GameMenuFrame.xml` uses — rather than a
transcription of Era's nine `SharedUIPanelTemplates.xml` textures. The opaque variant differs
only in background alpha, which is the one thing the two names disagree about. `enableMouse`
stays off: it is a decoration over a frame that handles its own input, and a border that ate
clicks would make an Ace options window unusable.

Movement: openmap `AceConfigDialog:573` → `:586`, now wanting `SetNormalFontObject`.

Full chain green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SgstFWtn1RxEJ5kVrpgYwn
This commit is contained in:
2026-11-01 14:45:49 -07:00
co-authored by Claude Opus 5
parent e731a77a42
commit 164eb7e624
3 changed files with 104 additions and 0 deletions
@@ -1974,6 +1974,13 @@ fn assets_ui_does_not_grow() {
// falls through into `attempt to call local 'handledata'`. There is no stock file to
// migrate — AIO is the realm's, not Blizzard's. The file's own header has the trace.
"AIOHandlers.lua",
// Not a window either: the ClassicAPI-era FrameXML templates addons inherit by name,
// which have no stock 1.12 file to migrate from because 1.12 has no such templates. They
// live in XML rather than `script/compat/` only because `inherits=` is resolved by the
// loader and cannot be answered from Lua. Ace3 names two of them **unguarded**, so a
// missing one raises inside the library: `CreateFrame(): Couldn't find inherited node
// "DialogBorderOpaqueTemplate"` is where OpenMapClassic stopped, on its first file.
"CompatTemplates.xml",
"ContainerFrameAdapters.xml",
"GameMenuFrame.xml",
"KeyBindingsPage.xml",