WebGLContext::SetDimensions has an early success exit path when the dimensions are unchanged. However it wasn't checking that the gl pointer was non-null. Thus, after a failed WebGL context creation, such a SetDimensions call could incorrectly "succeed", only to crash when dereferencing the gl pointer.
WebGLContext::SetDimensions has early return paths in cases where the WebGL context does not need to get recreated. A bug made that be recorded as WebGL creation failures, giving "WebGL-" in crash reports. This patch fixes that.
WebGLProgram has a data member,
nsTArray<WebGLShader*> mAttachedShaders;
and bug 648705 showed that the pointers in this array were sometimes dangling, leading to invalid writes at non-null addresses.
This patch makes these pointers be refptrs, so that they will keep alive the WebGLShaders they point to. So the mAttachedShaders member becomes
nsTArray<nsRefPtr<WebGLShader> > mAttachedShaders;
The basic idea is that whenever a layer transaction updates the window, we clear out the invalidation state for the canvas rendering context,
using a DidTransactionCallback registered on the layer(s) for the canvas, which calls MakeContextClean.
The DidTransactionCallbacks are directed to the user data attached to the Layer, which holds a strong reference to the canvas element. This
ensures that the element lives as long as the layer. Layers are destroyed when the presentation is torn down (including if the frame is destroyed),
so we can't have a leak here. The reference to the canvas element is only strong because the layer might briefly outlive the frame (the layer
won't be destroyed until the next paint of the window).
This patch moves responsibility for calling CanvasLayer::Updated and nsFrame::MarkLayersActive from the canvas context to nsHTMLCanvasElement::InvalidateFrame.
We call Updated on the retained CanvasLayer, if there is one; any other CanvasLayers created for this canvas would only be used once, and have Updated
called on them in BuildLayer when created.
The rectangle parameter is currently not used --- all callers always pass the full canvas bounds. In the long term,
we probably won't want this parameter since all implementations should be doing accelerated drawing direct to buffers
with no intermediate copies, hence there will be no need to optimize the size of those copies. Plus, performance-sensitive
testcases tend to paint most or all of the canvas on every frame anyway.