2018-05-06
Firefox turns out to need some degree of 'autoplay' support
When I wrote some notes about Firefox's current media autoplay settings, I said, about the central function in Firefox that decides whether or not media can autoplay:
Since I don't want videos to ever autoplay, [...] I may someday try making the entire function just immediately return false.
I did this experiment and I can now report that the result is a
failure. Completely disabling IsMediaElementAllowedToPlay()
from
AutoplayPolicy.cpp,
ie making it always return false
, results in a Firefox that won't
play video at all. It won't play YouTube videos, which doesn't entirely
surprise me, but it also won't even play directly loaded .mp4
files.
The videos load, but clicking on the appropriate 'play' button or
control does nothing and the video never starts going.
I wasn't entirely surprised about this for YouTube, because I assume that YouTube is wrapping the raw video in a JavaScript player that controls a bunch of things, inserts ads, and so on. With a surrounding JS player it's presumably ultimately the JS player that is telling Firefox to start playing the video when you click on a control, and this is pretty close to JavaScript telling Firefox to start playing a video when the page loads. As a result, it makes sense that a lot of Firefox's autoplay algorithm is about figuring out if you've interacted with a page; Firefox is presumably trying to figure out if you've probably actually clicked on a 'play this video' button or the like.
The situation with bare .mp4
files surprises me a little bit,
because there's no website JavaScript to obscure the situation.
Firefox is presumably putting up the player controls itself, so it
can know for sure whether or not you clicked on the 'play' button.
Based on some quick spelunking in the Firefox source code, it appears
that Firefox handles this through some chrome-level JavaScript code
that calls the media's .play()
method. This is the same fundamental
call that website JavaScript code uses, so I suppose it's not all
that surprising that it goes through the same autoplay checks; they
appear to be implemented directly in the .play()
handling code
and apply to anything that calls it, regardless of where from or
why.
This leaves me less surprised about the name and behavior of the
media.autoplay.enabled
preference and the other stuff involved
here. Given that Firefox needs there to be some 'autoplay', clearly
it could never be the case that setting media.autoplay.enabled
to
false
disabled everything here, because then video (and probably
audio) would never play. That's clearly not what people want.