phetsims / rutherford-scattering

"Rutherford Scattering" is an educational simulation in HTML5, by PhET Interactive Simulations.
GNU General Public License v3.0
2 stars 3 forks source link

Projector mode crashes sim #141

Closed jbphet closed 6 years ago

jbphet commented 6 years ago

I'm testing sims for support of projector mode, see https://github.com/phetsims/chipper/issues/693, and I found that setting projector mode using either the colorProfile=projector or by setting it using the options dialog causes the sim to crash. Here is a stack trace:

assert.js:31 enabling assert
Node.js?bust=1532467243526:1361 Uncaught RangeError: Maximum call stack size exceeded
    at RadioButtonGroupMember.invalidateChildBounds (Node.js?bust=1532467243526:1361)
    at AlignBox.invalidateChildBounds (Node.js?bust=1532467243526:1368)
    at IconCanvasNode.invalidateBounds (Node.js?bust=1532467243526:1353)
    at IconCanvasNode.onTransformChange (Node.js?bust=1532467243526:2331)
    at Transform3.trigger0 (Events.js?bust=1532467243526:245)
    at Transform3.invalidate (Transform3.js?bust=1532467243526:106)
    at Transform3.prependTranslation (Transform3.js?bust=1532467243526:144)
    at IconCanvasNode.prependTranslation (Node.js?bust=1532467243526:2275)
    at IconCanvasNode.translate (Node.js?bust=1532467243526:1939)
    at IconCanvasNode.setCenterX (Node.js?bust=1532467243526:2549)
invalidateChildBounds @ Node.js?bust=1532467243526:1361
invalidateChildBounds @ Node.js?bust=1532467243526:1368
invalidateBounds @ Node.js?bust=1532467243526:1353
onTransformChange @ Node.js?bust=1532467243526:2331
trigger0 @ Events.js?bust=1532467243526:245
invalidate @ Transform3.js?bust=1532467243526:106
prependTranslation @ Transform3.js?bust=1532467243526:144
prependTranslation @ Node.js?bust=1532467243526:2275
translate @ Node.js?bust=1532467243526:1939
setCenterX @ Node.js?bust=1532467243526:2549
set centerX @ Node.js?bust=1532467243526:2552
updateProperty @ AlignBox.js?bust=1532467243526:575
updateLayout @ AlignBox.js?bust=1532467243526:605
invalidateAlignment @ AlignBox.js?bust=1532467243526:122
trigger0 @ Events.js?bust=1532467243526:239
validateBounds @ Node.js?bust=1532467243526:1219
getBounds @ Node.js?bust=1532467243526:1605
getCenterY @ Node.js?bust=1532467243526:2596
get centerY @ Node.js?bust=1532467243526:2598
updateProperty @ AlignBox.js?bust=1532467243526:570
updateLayout @ AlignBox.js?bust=1532467243526:618
invalidateAlignment @ AlignBox.js?bust=1532467243526:122
trigger0 @ Events.js?bust=1532467243526:239
validateBounds @ Node.js?bust=1532467243526:1219
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
validateBounds @ Node.js?bust=1532467243526:1228
phet-steele commented 6 years ago

@jbphet @jessegreenberg looks like this is the same thing as #120.

jessegreenberg commented 6 years ago

Thanks @phet-steele, you are right it is the exact same issue. Introduced becausecreateRadioButtons in RutherfordAtomScreenView was returning a radio button group wrapped in another Node, so the Node returned can never be disposed.

jessegreenberg commented 6 years ago

Fixed in the above commit. I also added more documentation to createRadioButtons and renamed the button group to indicate the type more strongly so this hopefully wont happen again.