@@ -214,6 +214,53 @@ describe('Test gl plot side effects', function() {
214214 . catch ( failTest )
215215 . then ( done ) ;
216216 } ) ;
217+
218+ it ( '@gl should fire *plotly_webglcontextlost* when on webgl context lost' , function ( done ) {
219+ var _mock = Lib . extendDeep ( { } , require ( '@mocks/gl2d_12.json' ) ) ;
220+
221+ function _trigger ( name ) {
222+ var ev = new window . WebGLContextEvent ( 'webglcontextlost' ) ;
223+ var canvas = gd . querySelector ( '.gl-canvas-' + name ) ;
224+ canvas . dispatchEvent ( ev ) ;
225+ }
226+
227+ Plotly . plot ( gd , _mock ) . then ( function ( ) {
228+ return new Promise ( function ( resolve , reject ) {
229+ gd . once ( 'plotly_webglcontextlost' , resolve ) ;
230+ setTimeout ( reject , 10 ) ;
231+ _trigger ( 'context' ) ;
232+ } ) ;
233+ } )
234+ . then ( function ( eventData ) {
235+ expect ( ( eventData || { } ) . event ) . toBeDefined ( ) ;
236+ expect ( ( eventData || { } ) . layer ) . toBe ( 'contextLayer' ) ;
237+ } )
238+ . then ( function ( ) {
239+ return new Promise ( function ( resolve , reject ) {
240+ gd . once ( 'plotly_webglcontextlost' , resolve ) ;
241+ setTimeout ( reject , 10 ) ;
242+ _trigger ( 'focus' ) ;
243+ } ) ;
244+ } )
245+ . then ( function ( eventData ) {
246+ expect ( ( eventData || { } ) . event ) . toBeDefined ( ) ;
247+ expect ( ( eventData || { } ) . layer ) . toBe ( 'focusLayer' ) ;
248+ } )
249+ . then ( function ( ) {
250+ return new Promise ( function ( resolve , reject ) {
251+ gd . once ( 'plotly_webglcontextlost' , reject ) ;
252+ setTimeout ( resolve , 10 ) ;
253+ _trigger ( 'pick' ) ;
254+ } ) ;
255+ } )
256+ . then ( function ( eventData ) {
257+ // should add event listener on pick canvas which
258+ // isn't used for scattergl traces
259+ expect ( eventData ) . toBeUndefined ( ) ;
260+ } )
261+ . catch ( failTest )
262+ . then ( done ) ;
263+ } ) ;
217264} ) ;
218265
219266describe ( 'Test gl2d plots' , function ( ) {
0 commit comments