It seems like canvas' alpha depends on the CSS Background color (tested on Chrome 60 and Firefox 47).
Case 1: Background: black, canvas: red with 10% alpha
body {background-color: #000000} /* or any other parent DOM element */
Setting Canvas Color to red with 10% alpha
gl_FragColor = vec4(1.0, 0.0, 0.0, 0.1);
has this result:
-> I expect red to be 90% darker
I got the same result after puting alpha to 100%:
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
return;
Case 2: Background: white, canvas: red with 10% alpha
-> it looks correct
Case 3: Background: blue, canvas: red with 10% alpha
-> it looks like red part is more than 10%
Is there any Color Blending mode, which I'm not aware of?
(These tests were the same on Firefox and Chrome)