Commit Graph

945 Commits

Author SHA1 Message Date
Olli Pettay
78afb13bbd Bug 1472428 - HTMLMediaElement should use IsInComposedDoc, r=cpearce 2018-07-03 18:13:17 +03:00
Chris Pearce
e602bac9f7 Bug 1463919 - Tests for prompting for permission to autoplay. r=jya,mconley
Test that a video which tries to autoplay via either a play() call or via
an autoplay attribute:
* Plays when it has a pre-existing "allow" autoplay-media permission.
* Is blocked when it has a pre-existing "block" autoplay-media permission.
* Plays when it doesn't have a pre-existing autoplay-media permission and
"allow" is pressed on the door hanger.
* Is blocked when it doesn't have a pre-existing autoplay-media permission and
"block" is pressed on the door hanger.

MozReview-Commit-ID: CpftV6RQbtU
2018-06-25 15:35:33 +12:00
Chris Pearce
0025ac09cd Bug 1463919 - Check AutoplayPolicy before activating attribute based autoplay. r=jya
When autoplay is requested by setting the "autoplay" attribute, we should
check whether autoplay is allowed in HTMLMediaElement::CheckAutoplayDataReady()
and if not we should prompt for user consent.

This ensures that <video ... autoplay/> will prompt for consent when used on
a page without a pre-existing allow/block permission.


MozReview-Commit-ID: 77pJR2Ybn2i
2018-06-29 15:10:14 +12:00
Chris Pearce
17f4d00876 Bug 1463919 - Move ask autoplay permission check into AutoplayPolicy. r=jya
MozReview-Commit-ID: KJcVI6gtGXw
2018-06-26 14:16:13 +12:00
Chris Pearce
9efd9a949a Bug 1463919 - Have HTMLMediaElement ask for autoplay permission when playback otherwise blocked. r=jya
MozReview-Commit-ID: Ejv0UKBjSVf
2018-06-22 10:14:33 +12:00
Chris Pearce
f4340f5298 Bug 1471800 - Ensure HTMLMediaElement doesn't play its MediaDecoder in a readyState update after it's OwnerDoc has been removed from its DocShell. r=jya
It's possible that if the HTMLMediaElement is loading while we're loading a new
document into a docshell, that the HTMLMediaElement can reach readyState
HAVE_FUTURE_DATA just after its OwnerDoc is removed from the docshell. If the
HTMLMediaElement wasn't paused, then it may start playing due to the readyState
change in HTMLMediaElement::ChangeReadyState().

For years we've had hard to reproduce issues where media started playing after
we've closed the tab; I bet this was the cause!

When we detect that the document has been removed from its DocShell,
HTMLMediaElement::NotifyOwnerDocumentActivityChanged() is called, and that
suspends the MediaDecoder just in case we need to resurrect the media element,
for example if the tab comes out of the BF cache. When we suspend we set
mPausedForInactiveDocumentOrChannel=true, and all other calls to
MediaDecoder::Play() are guarded by checks on
mPausedForInactiveDocumentOrChannel.

So we should also guard the MediaDecoder::Play() call in ChangeReadyState()
with a check on mPausedForInactiveDocumentOrChannel too.

MozReview-Commit-ID: GfmZasT9jdr
2018-06-28 15:54:36 +12:00
Cosmin Sabou
9c9d1dee27 Backed out changeset 97499b2f5612 (bug 1471800) as requested by cpearce. 2018-06-28 13:53:42 +03:00
Chris Pearce
761b6cb04e Bug 1471800 - Ensure HTMLMediaElement doesn't play its MediaDecoder in a readyState update after it's OwnerDoc has been removed from its DocShell. r=jya
It's possible that if the HTMLMediaElement is loading while we're loading a new
document into a docshell, that the HTMLMediaElement can reach readyState
HAVE_FUTURE_DATA just after its OwnerDoc is removed from the docshell. If the
HTMLMediaElement wasn't paused, then it may start playing due to the readyState
change in HTMLMediaElement::ChangeReadyState().

For years we've had hard to reproduce issues where media started playing after
we've closed the tab; I bet this was the cause!

When we detect that the document has been removed from its DocShell,
HTMLMediaElement::NotifyOwnerDocumentActivityChanged() is called, and that
suspends the MediaDecoder just in case we need to resurrect the media element,
for example if the tab comes out of the BF cache. When we suspend we set
mPausedForInactiveDocumentOrChannel=true, and all other calls to
MediaDecoder::Play() are guarded by checks on
mPausedForInactiveDocumentOrChannel.

So we should also guard the MediaDecoder::Play() call in ChangeReadyState()
with a check on mPausedForInactiveDocumentOrChannel too.

MozReview-Commit-ID: GfmZasT9jdr
2018-06-28 15:54:36 +12:00
Emilio Cobos Álvarez
5a7334431a Bug 1471013: Make MozAutoplayMediaBlocked chrome-only. r=smaug
Summary: MozReview-Commit-ID: JVLMpCeMkAs

Reviewers: smaug

Tags: #secure-revision

Bug #: 1471013

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

MozReview-Commit-ID: 2he7tHFbZ8t
2018-06-27 11:24:17 +02:00
Jeff Gilbert
70a22b2878 Bug 1470325 - s/FooBinding/Foo_Binding/g - r=qdot
MozReview-Commit-ID: JtTcLL5OPF0
2018-06-26 17:05:01 -07:00
Emilio Cobos Álvarez
0348c342b8 Bug 1470930: Use enums for passing arguments for event dispatch. r=smaug
MozReview-Commit-ID: DsNuF7GAflJ
2018-06-26 18:22:06 +02:00
Margareta Eliza Balazs
e3449ea5a3 Merge mozilla-central to inbound. a=merge CLOSED TREE 2018-06-26 12:24:32 +03:00
Chris Peterson
f7ceeaf5cf Bug 1469769 - Part 6: Replace non-failing NS_NOTREACHED with MOZ_ASSERT_UNREACHABLE. r=froydnj
This patch is an automatic replacement of s/NS_NOTREACHED/MOZ_ASSERT_UNREACHABLE/. Reindenting long lines and whitespace fixups follow in patch 6b.

MozReview-Commit-ID: 5UQVHElSpCr
2018-06-17 22:43:11 -07:00
Chris Pearce
fd68a38fe1 Bug 1470346 - Gesture activate all documents in tab, even across origins, upon user interaction. r=smaug
Sometimes when video is playing, a preroll ad plays, and that may be in a cross
origin iframe. If autoplay media is disabled, we require a user gesture in a
document before playback in that document is permitted, and we require each
origin to be gesture activated separately. So in the cross origin preroll video
add case, then the user will have to click once to unblock playback for the
cross origin ad, and then once the preroll ad finishes, the user will have to
click again to activate playback of the same origin content video.

This is a bad user experience.

So we should instead make gesture activation propagate up the doc tree
irrespective of crossing origins.  This way, when the user clicks to activate,
all documents in that tab are also also effectively gesture activated, and so
can autoplay.

MozReview-Commit-ID: 1HZQ5zkubR
2018-06-22 11:52:20 +12:00
Bryce Van Dyk
3760dd6471 Bug 1450845 - MediaDecoderStateMachine now ignores SeekToNextFrame if already seeking. r=jya
SeekToNextFrame is handled differently than other seeks by the
MediaDecoderStateMachine, and should not take place while other seeks already
are. Bug 1410225 implemented some changes in HTMLMediaElement to prevent this,
but it's still possible to move to a seeking state in the MDSM and accept
SeekToNextFrame (as in this bug).

This changeset changes the MDSM to reject SeekToNextFrame if a seek is already
happening. Since the MDSM now does this the changes from bug 1410225 can be
removed.

This has the functional change of the promise from SeekToNextFrame being
rejected if the seek in not performed due to another seek. Previously the
promise would succeed when the other seek completed. This seems sensible as the
next frame seek does not actually take place.

MozReview-Commit-ID: HD9WRFq3LZV
2018-06-06 15:17:30 -04:00
Chris Pearce
0041d0ec9d Bug 1467350 - Make HTMLMediaElement::mPaused Watchable and update Wakelock status via a watcher. r=jya
We currently observe changes to HTMLMediaElement::mPaused via a hand-rolled
wrapper class. We can use use mozilla::Watchable<> and avoid rolling our
own equivalent here.

This also paves the way for using state watching on other observable state
in HTMLMediaElement.

MozReview-Commit-ID: 4lBlJiV15iG
2018-05-21 14:19:47 +12:00
Chris Pearce
795d5b7dc3 Bug 1464922 - Remove HTMLMediaElement::mAttemptPlayUponLoadedMetadata. r=bryce
We don't need to track this state anymore, as we don't need to delay calling
MediaDecoder::Play() or delay firing the "playing" event anymore.

MozReview-Commit-ID: E3B9l6ep7FP
2018-05-29 08:09:26 +12:00
Chris Pearce
23c6964245 Bug 1464922 - Don't allow media without audio tracks to autoplay. r=bryce
I don't think we should allow media without audio tracks to autoplay because:
* It means play() before loaded metadata behaves differently than play()
called after loaded metadata.
* With the current impl we dispatch the "play" event and then the "pause"
event when we decide we should block, which may confuse some sites' controls.
* Delaying running the play() algorithm until we've loaded metadata would add
significant complexity, and may break sites.
* Chrome doesn't have this provision, meaning the complexity required to
support it will not result in much benefit to us.

MozReview-Commit-ID: FSVlDJAOisw
2018-05-28 22:09:14 +12:00
Andreas Pehrson
aa5764e73b Bug 1453127 - Ensure TrackID uniqueness for captured MediaDecoder. r=jya 2018-05-29 10:21:51 +02:00
Andreas Pehrson
8addfac774 Bug 1453127 - Make sure decoder-captured tracks end when changing src. r=jya 2018-05-29 10:13:14 +02:00
Andrea Marchesini
7b734cdb0d Bug 1466023 - Separate FontTableURI and BlobURL, r=qdot
This patch splits FontTableURI and BlobURL in 2 classes:
FontTableURIProtocolHandler and BlobURLProtocolHandler
both under mozilla::dom.

It also removes a memory reporter because that report is already covered by the
BlobURL one.
2018-06-02 15:51:42 +02:00
Emilio Cobos Álvarez
6100dee429 Bug 1466168: Remove mozilla::Forward in favor of std::forward. r=froydnj
Same approach as the other bug, mostly replacing automatically by removing
'using mozilla::Forward;' and then:

  s/mozilla::Forward/std::forward/
  s/Forward</std::forward</

The only file that required manual fixup was TestTreeTraversal.cpp, which had
a class called TestNodeForward with template parameters :)

MozReview-Commit-ID: A88qFG5AccP
2018-06-02 09:33:26 +02:00
Emilio Cobos Álvarez
4b8b5e1717 Bug 1465585: Switch from mozilla::Move to std::move. r=froydnj
This was done automatically replacing:

  s/mozilla::Move/std::move/
  s/ Move(/ std::move(/
  s/(Move(/(std::move(/

Removing the 'using mozilla::Move;' lines.

And then with a few manual fixups, see the bug for the split series..

MozReview-Commit-ID: Jxze3adipUh
2018-06-01 10:45:27 +02:00
Jean-Yves Avenard
bedd0be107 Bug 1451149 - P2. Don't fire the "stalled" event when using MSE. r=bryce
When using a media element with a Media Source, the resource fetching algorithm is to be called in "local" mode:
https://www.w3.org/TR/media-source/#mediasource-attach
"Continue the resource fetch algorithm by running the remaining "Otherwise (mode is local)" steps, with these clarifications"

https://html.spec.whatwg.org/multipage/media.html#concept-media-load-resource
Under the local mode, the steps that would cause the element to fire suspend, stalled or progress can never occur.
We only prevent the stalled event to be fired, many websites rely on the progress event to be fired (such as when the init segment has been parsed). The HTML5 media spec will be amended to clearly indicate that progress is to be fired even with mediasource

MozReview-Commit-ID: DkoQzoV0JzO
2018-05-14 11:32:09 +02:00
Jean-Yves Avenard
0724cef7da Bug 1451149 - P1. Fix HTMLMediaElement style. r=bryce
Partially apply clang-format so that we limit the scope of changes while ensuring consistency in declarations.

MozReview-Commit-ID: Km9sKBbFhKx
2018-05-14 11:11:18 +02:00
Chris Pearce
9aa7fbd19d Bug 1461877 - Ensure we don't dispatch 'playing' when we're about to reject pending play promises. r=bryce
Currently we can end up dispatching a 'playing' event right before we reject
play() promises, and this confuses YouTube's controls, and it doesn't make
sense to dispatch a 'playing' event when we're not playing anyway.

This is because the logic to delay resolving the play() promise until after
we've reached loadedmetadata doesn't prevent the 'playing' event from being
dispatched. We shouldn't dispatch 'playing' until we resolve the play()
promise(s).

MozReview-Commit-ID: 5H4dcObfu4M
2018-05-16 17:27:01 +12:00
Andrea Marchesini
ff35c9433a Bug 1454889 - Remove createObjectURL()'s MediaStream overload, r=valentin 2018-04-24 16:19:51 +02:00
Adrian Wielgosik
93eb294385 Bug 1460940 - Clean up most remaining C++-side uses of nsIDOMDocument. r=bz
MozReview-Commit-ID: LKRnyDPNlle
2018-05-11 19:46:15 +02:00
Andreas Pehrson
2e28b84fec Bug 1458852 - Return real current image in HTMLMediaElement::GetCurrentImage(). r=mattwoodrow
MozReview-Commit-ID: Kjc8mTu1ckF
2018-05-04 18:21:56 +02:00
Narcis Beleuzu
8fd26b0fe8 Backed out changeset 0c5a4939300c (bug 1454889) for causing frequent Leaks (Bug 1378025). a=backout 2018-05-07 12:06:25 +03:00
Dorel Luca
85a9a93e8f Merge mozilla-central to mozilla-inbound 2018-05-03 13:03:06 +03:00
Andrea Marchesini
5b15e1ee6e Bug 1458505 - grapping 'self' in mozilla::MakeScopeExit instead of '&' when needed, in HTMLMediaElement, r=me CLOSED TREE 2018-05-03 08:37:27 +02:00
Andrea Marchesini
8ebf46d6e9 Bug 1458505 - grapping 'self' in mozilla::MakeScopeExit instead of '&' when needed, in DOM code, r=erahm 2018-05-03 08:09:58 +02:00
Jean-Yves Avenard
53beb24533 Bug 1457960 - P1. make MediaDecoder::Seek returns void. r=bryce
MozReview-Commit-ID: 2pbZprnYqcF
2018-04-30 19:58:11 +02:00
Jean-Yves Avenard
652a63235a Bug 1458566 - Make MediaDecoder::Play() return void. r=bryce
MediaDecoder::Play() cannot fail and was always returning NS_OK

MozReview-Commit-ID: 7OgwZQw569Y
2018-05-02 17:27:27 +02:00
Andrea Marchesini
d173a7f829 Bug 1454889 - Remove createObjectURL()'s MediaStream overload, r=valentin 2018-04-24 16:19:51 +02:00
Chris Pearce
e6f6b952fc Bug 1453843 - Remove extraneous play promise reject. r=bryce
We already reject the play promises when we call Pause(), so this extra
reject is unnecessary.

MozReview-Commit-ID: 6LKw7hCwJPH
2018-04-20 17:54:08 +12:00
Chris Pearce
180e126957 Bug 1453843 - Ensure we fire "pause" event when rejecting play() promise. r=bryce
Bug 1435133 introduced a new path where we block autoplay and reject the play()
promise, but we didn't fire a "pause" event. This confuses YouTube's controls.

Additionally, even if we're not in a user generated event handler, we
unilaterally consider the media element blessed if execution reaches here:
https://searchfox.org/mozilla-central/rev/11a2ae294f50049e12515b5821f5a396d951aacb/dom/html/HTMLMediaElement.cpp#4110
We previously rejected before reaching here when not in a user generated event
handler, but now if play() is called before we've reached loadedmetadata, we
reject the promise if we're not in a non-event handler and bail out early, and
so we'll bless even if not in a user generated event handler. Meaning when we
do reach loadedmetadata, we think we were in a user generated event handler
when play() was originally called, and so we won't reject the play promise.

So this patch ensures we dispatch a "pause" event when we reject the play()
promise here. The WHATWG spec says we should do this when pausing anyway.

Note: calling our interal Pause() function when rejecting the play() promise
here breaks YouTube, as if we do that we fire a "timeupdate" event. So I opted
to manually code to fire the event here instead of just calling Pause()
everywhere we want to ensure we're paused.

MozReview-Commit-ID: 1snkiTnPGih
2018-04-20 17:53:37 +12:00
Emilio Cobos Álvarez
a22d605d3a Bug 1454238: Remove nsINode::eMEDIA. r=bz
MozReview-Commit-ID: LPutL6PlrgG
2018-04-20 01:30:12 +02:00
Brindusan Cristian
1bc6e7d860 Merge mozilla-central to autoland. a=merge CLOSED TREE 2018-04-17 13:09:40 +03:00
Chris Pearce
b9c251eb10 Bug 1453176 - Add telemetry to report fulfilment of HTMLMediaElement.play(). r=bryce
We'd like to know the proportion of HTMLMediaElement.play() calls that are
rejected due to autoplay being blocked. There are also other conditions that
cause us to reject the promise returned by HTMLMediaElement.play(), so add
telemetry to report all the identifyable conditions under which play()
succeeds or fails.

MozReview-Commit-ID: AZ67WWXaowN
2018-04-13 20:28:39 +12:00
Nicholas Nethercote
e585e8ddb3 Bug 1448222 - Remove MediaPrefs. r=jya
This patch converts all the prefs in MediaPrefs to the new StaticPrefs system.

Note that the "media.wmf.skip-blacklist" pref was present in both MediaPrefs
and gfxPrefs. The copy in MediaPrefs was never used; this explains why this
patch does not add an entry for it to StaticPrefList.h.

Note also that the patch removes themedia.rust.mp4parser pref, because it's
unused.

MozReview-Commit-ID: IfHP37NbIjY
2018-03-20 09:48:56 +11:00
Boris Zbarsky
d18e4f5af5 Bug 1452741. Stop using the no-arg DOMEventTargetHelper constructor in MediaTrack. r=bkelly
MozReview-Commit-ID: AbE3XJdj4KO
2018-04-11 10:27:00 -04:00
Chris Pearce
cbff3c0a1d Bug 1435134 - Don't play until we've reached metadata. r=bryce
We want to block playback of media which have an audio track, so if play()
is called before the load of the resource has loaded metadata, we need to
delay starting playback and resolving the play promise until we've figured
out whether the media has audio. So if play() is called before we've reached
readyState >= HAVE_METADATA, set a flag, and check that flag when we do
reach HAVE_METADATA and start the play and resolve the promise then.

MozReview-Commit-ID: 1K06NK2kfpw
2018-03-13 16:40:18 +13:00
Andreea Pavel
fa7ef642ca Merge mozilla-inbound to mozilla-central. a=merge 2018-04-06 13:20:21 +03:00
Boris Zbarsky
5b75c1416d Bug 1449631 part 8. Remove nsIDOMEventTarget::GetEventTargetParent. r=smaug
MozReview-Commit-ID: 5wQ2LYrjUxf
2018-04-05 13:42:41 -04:00
Alex Chronopoulos
1d4e155d80 Bug 1387454 - Create a MediaStreamGraph according to the given sample rate. r=padenot
MozReview-Commit-ID: 4YP8oWIVyjy
2018-04-03 20:02:15 +03:00
Boris Zbarsky
152cd3ba6e Bug 1447098 part 1. Rename FromContent on various DOM classes to FromNode. r=mystor
MozReview-Commit-ID: 202nkbmkwfR
2018-03-21 17:39:04 -04:00
Chris Pearce
d10ef7d9bd Bug 1445104 - Format HTMLMediaElement constructor with leading ',' instead of trailing. r=jya
MozReview-Commit-ID: DiRjKmtERGq
2018-03-13 13:41:46 +13:00
Chris Pearce
cf783c6abe Bug 1445104 - Remove HTMLMediaElement::{mStatsShowing,mMediaSecurityVerified} as they're unused. r=jya
MozReview-Commit-ID: LtKw4Hj3M0G
2018-03-13 13:33:42 +13:00