gecko-dev/dom/media/AutoplayPolicy.h
alwu d7a75adbdb Bug 1489278 - part1 : show doorhanger when create AudioContext r=padenot
In the ideal situation, sites should create AudioContext only when sites are going to produce
sound, so we would show doorhanger to ask users whether they want to allow autoplay.

We delay the AudioContext's state transition from `suspended` to `running` until
(1) user click 'Allow' button in doorhanger
(2) user interact with sites, and then AudioContext calls resume() again

Differential Revision: https://phabricator.services.mozilla.com/D5610

--HG--
extra : moz-landing-system : lando
2018-09-13 16:51:07 +00:00

61 lines
2.1 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#if !defined(AutoplayPolicy_h_)
#define AutoplayPolicy_h_
#include "mozilla/NotNull.h"
class nsIDocument;
namespace mozilla {
class AutoplayPermissionManager;
namespace dom {
class HTMLMediaElement;
class AudioContext;
/**
* AutoplayPolicy is used to manage autoplay logic for all kinds of media,
* including MediaElement, Web Audio and Web Speech.
*
* Autoplay could be disable by setting the pref "media.autoplay.default"
* to anything but nsIAutoplay::Allowed. Once user disables autoplay, media
* could only be played if one of following conditions is true.
* 1) Owner document is activated by user gestures
* We restrict user gestures to "mouse click", "keyboard press" and "touch".
* 2) Muted media content or video without audio content.
* 3) Document's origin has the "autoplay-media" permission.
*/
class AutoplayPolicy
{
public:
// Returns whether a given media element is allowed to play.
static bool IsAllowedToPlay(const HTMLMediaElement& aElement);
// Returns whether a given AudioContext is allowed to play.
static bool IsAllowedToPlay(const AudioContext& aContext);
// Returns true if a given media element would be allowed to play
// if block autoplay was enabled. If this returns false, it means we would
// either block or ask for permission.
// Note: this is for telemetry purposes, and doesn't check the prefs
// which enable/disable block autoplay. Do not use for blocking logic!
static bool WouldBeAllowedToPlayIfAutoplayDisabled(const HTMLMediaElement& aElement);
// Returns the AutoplayPermissionManager that a given document must request on
// for autoplay permission.
static already_AddRefed<AutoplayPermissionManager> RequestFor(
const nsIDocument& aDocument);
};
} // namespace dom
} // namespace mozilla
#endif