Bug 1182329 - Allow pages which have camera/microphone permission to autoplay audible media. r=jib draft
authorChris Pearce <cpearce@mozilla.com>
Thu, 08 Feb 2018 16:05:46 +1300
changeset 753705 688b68c29d73f117a2cc376233d664bc9cdb5d52
parent 753704 b600272d00bb410771ae45e967b1053f77d6bdb4
push id98651
push userbmo:cpearce@mozilla.com
push dateSun, 11 Feb 2018 22:22:36 +0000
reviewersjib
bugs1182329
milestone60.0a1
Bug 1182329 - Allow pages which have camera/microphone permission to autoplay audible media. r=jib It seems reasonable to assume that when a page has been granted permission to capture camera/microphone, the user intends it to play audible media. MozReview-Commit-ID: 1RdsPK1vRPt
dom/media/AutoplayPolicy.cpp
--- a/dom/media/AutoplayPolicy.cpp
+++ b/dom/media/AutoplayPolicy.cpp
@@ -5,16 +5,17 @@
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "AutoplayPolicy.h"
 
 #include "mozilla/EventStateManager.h"
 #include "mozilla/Preferences.h"
 #include "mozilla/dom/HTMLMediaElement.h"
 #include "nsIDocument.h"
+#include "MediaManager.h"
 
 namespace mozilla {
 namespace dom {
 
 /* static */ bool
 AutoplayPolicy::IsDocumentAllowedToPlay(nsIDocument* aDoc)
 {
   return aDoc ? aDoc->HasBeenUserActivated() : false;
@@ -22,16 +23,26 @@ AutoplayPolicy::IsDocumentAllowedToPlay(
 
 /* static */ bool
 AutoplayPolicy::IsMediaElementAllowedToPlay(NotNull<HTMLMediaElement*> aElement)
 {
   if (Preferences::GetBool("media.autoplay.enabled")) {
     return true;
   }
 
+  // Pages which have been granted permission to capture WebRTC camera or
+  // microphone are assumed to be trusted, and are allowed to autoplay.
+  MediaManager* manager = MediaManager::GetIfExists();
+  if (manager) {
+    nsCOMPtr<nsPIDOMWindowInner> window = aElement->OwnerDoc()->GetInnerWindow();
+    if (window && manager->IsActivelyCapturingOrHasAPermission(window->WindowID())) {
+      return true;
+    }
+  }
+
   // TODO : this old way would be removed when user-gestures-needed becomes
   // as a default option to block autoplay.
   if (!Preferences::GetBool("media.autoplay.enabled.user-gestures-needed", false)) {
     // If elelement is blessed, it would always be allowed to play().
     return aElement->IsBlessed() ||
            EventStateManager::IsHandlingUserInput();
    }