* Lua errors are no longer shown by default, but you can set the scriptErrors cvar to 1 to enable them. It is recommended that AddOn authors and testers leave this turned on so you can catch problems in your AddOns. This is implemented by code in the _ERRORMESSAGE() function, so if you already have an improved error message AddOn, this will not affect you.
* Improved UI loading time and memory usage when parsing XML files.
* User Interface Scripting
* New TOC field: LoadManagers - When the game loads, each AddOn listed in this field is loaded in order until one successfully loads. If one of these are loaded, then the AddOn is then loaded on demand.
UIPanel Frame Management:
* The UI panel layout code now uses frame attributes instead of variables to manage layout. This allows well written AddOns to customize the layout without blocking protected panels in combat.
# UIParent Attributes:
* DEFAULT_FRAME_WIDTH - The default width of a single pane UI panel (default 384)
* TOP_OFFSET - The offset from the top of the screen (default -104)
* LEFT_OFFSET - The offset of the left panel from the left side of the screen (default 0)
* RIGHT_OFFSET_BUFFER - The amount of space to leave open on the right side of the screen (default 80)
# UI Panel Attributes (initial values come from the UIPanelWindows table):
* UIPanelLayout-defined - True if the frame has layout attributes defined.
* UIPanelLayout-enabled - True if the frame should be handled by the UI panel layout system.
* UIPanelLayout-area - One of "left", "center", "right"
* UIPanelLayout-width - The effective width of the UI panel, used as an override for frame:GetWidth()
* UIPanelLayout-pushable - If specified as a value greater than 0, this is the priority used when sliding frames to the right when a new frame is opened.
* UIPanelLayout-whileDead - True if the frame can be opened while the player is dead.
# Secure Templates:
* For "item" buttons, name can be an item ID or item link.
* Action buttons will automatically update if their action attribute changes.
* The SecureStateHeaderTemplate now supports a small stack of saved states that can be used in state transition rules via push/pop/swap actions (See the header file for usage information)
* Added a generalized state driver that uses conditional macro syntax. e.g.: RegisterStateDriver(header, "stance", "[stance:1] 1; [stance:2] 2; [stance:3] 3; [stance:4] 4; [stance:5] 5; [stance:6] 6; [stance:7] 7; 0");
# Memory Profiling:
* Script memory is now tracked on a per-addon basis, with functions provided to analyze and query usage.
* The script memory manager has been optimized and the garbage collection tuned so there is no longer any need for a hard cap on the amount of UI memory available.
* NEW - UpdateAddOnMemoryUsage() - Scan through memory profiling data and update the per-addon statistics
* NEW - usedKB = GetAddOnMemoryUse(index or "name") - Returns the total memory used by the specified AddOn. This returns a cached value calculated by UpdateAddOnMemoryUsage().
# CPU Profiling:
* CPU profiling is disabled by default since it has some overhead. CPU profiling is controlled by the scriptProfile cvar, which persists across sessions, and takes effect after a UI reload.
* When profiling is enabled, you can use the following functions to retrieve CPU usage statistics. Times are in seconds with about-a-microsecond precision.
* NEW - time = GetScriptCPUUsage() - Returns the total time used by the scripting system.
* NEW - UpdateAddOnCPUUsage() - Scan through the profiling data and update the per-addon statistics
* NEW - time = GetAddOnCPUUsage(index or \"name\") - Returns the total time used by the specified AddOn. This returns a cached value calculated by UpdateAddOnCPUUsage().
* NEW - time, count = GetFunctionCPUUsage(function[, includeSubroutines]) - Returns the time used and number of times the specified function was called. If 'includeSubroutines' is true or omitted, the time includes both the time spent in the function and subroutines called by the function. If it is false, then time is only the time actually spent by the code in the function itself.
* NEW - time, count = GetFrameCPUUsage(frame[, includeChildren]) - Returns the time used and number of function calls of any of the frame's script handlers. If 'includeChildren' is true or omitted, the time and call count will include the handlers for all of the frame's children as well.
* NEW - time, count = GetEventCPUUsage(["event"]) - Returns the time used and number of times the specified event has been triggered. If 'event' is omitted, the time and count will be totals across all events.
* NEW - ResetCPUUsage() - Reset all CPU profiling statistics to zero.
# General API Functions:
* UPDATED - isSecure, taint = issecurevariable() - Now returns a second value which is the name of the addon that tainted the variable (or the empty string if it was tainted by a macro script), if it is not secure.
* UPDATED: GetCursorInfo() will now return "merchant", index when the cursor holds a merchant item.
* NEW - link = GetSendMailItemLink()
* NEW - loggedIn = IsLoggedIn() - returns false before the PLAYER_LOGIN event, and true during and after the PLAYER_LOGIN event.
* NEW - isFeigned = UnitIsFeignDeath("unit") - returns true if the unit is the player, or in the player's party/raid and is feigning death.
* REMOVED - IsFeignDeath() - Replaced by UnitIsFeignDeath
* UPDATED - SendAddOnMessage("prefix","message"[,"type"][,"target"]) -- now accepts "WHISPER" as the message type
# Frame API Functions:
* NEW - Frame:HookScript("name", function) - Exactly equivalent to hooksecurefunc(), but usable with frame script handlers. (Note that like hooksecurefunc(), this is not intended as a general hooking replacement, but to allow hooking of secure frame handlers.)
GameTooltip API Functions:
* UPDATED - name, unitid = GameTooltip:GetUnit() - Added second 'unitid' return value
* NEW - hasComparison = GameTooltip:SetHyperlinkCompareItem(link, index) - Sets a comparison tooltip to show the index'th comparison item to the item specified as link. Will return a true value if there is an index'th comparison item (index is 1 or 2).