Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/RenderWebGL.js
Original file line number Diff line number Diff line change
Expand Up @@ -968,7 +968,7 @@ class RenderWebGL extends EventEmitter {
* @returns {boolean} True while the WebGL context is lost and nothing can be drawn.
*/
get isContextLost () {
return this._contextLost;
return this._contextLost || this._gl.isContextLost();
}

/**
Expand Down Expand Up @@ -1011,7 +1011,7 @@ class RenderWebGL extends EventEmitter {
}

draw() {
if (!this.dirty || this._contextLost) {
if (!this.dirty || this.isContextLost) {
return;
}
this.dirty = false;
Expand Down
17 changes: 16 additions & 1 deletion test/unit/ContextLossTests.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ const fakeRenderer = () => {
renderer._allDrawables = [];
renderer._drawList = [];
renderer._contextLost = false;
renderer._gl = {};
renderer._gl = {
isContextLost: () => false
};
renderer.dirty = true;
renderer._listeners = {};
renderer.emit = name => {
Expand Down Expand Up @@ -39,6 +41,19 @@ test('losing the context stops drawing and asks the browser to restore it', t =>
t.end();
});

test('a context the browser has lost is not drawn before the lost event arrives', t => {
const renderer = fakeRenderer();
renderer._gl.isContextLost = () => true;
t.equal(renderer.isContextLost, true);

renderer._doExitDrawRegion = () => {
throw new Error('draw must not touch GL while the context is lost');
};
t.doesNotThrow(() => renderer.draw());
t.equal(renderer.dirty, true, 'the frame is still pending');
t.end();
});

test('restoring the context rebuilds renderer resources and tells every skin', t => {
const renderer = fakeRenderer();
renderer._contextLost = true;
Expand Down
Loading