@@ -828,10 +828,6 @@ void HTMLMediaElement::parseAttribute(const QualifiedName& name, const AtomStrin
828
828
}
829
829
else
830
830
HTMLElement::parseAttribute (name, value);
831
-
832
- // Changing the "muted" attribue could affect ":muted"
833
- if (name == mutedAttr)
834
- invalidateStyle ();
835
831
}
836
832
837
833
void HTMLMediaElement::finishParsingChildren ()
@@ -2605,7 +2601,8 @@ void HTMLMediaElement::setNetworkState(MediaPlayer::NetworkState state)
2605
2601
if (state == MediaPlayer::NetworkState::Empty) {
2606
2602
// Just update the cached state and leave, we can't do anything.
2607
2603
m_networkState = NETWORK_EMPTY;
2608
- invalidateStyle ();
2604
+ updateBufferingState ();
2605
+ updateStalledState ();
2609
2606
return ;
2610
2607
}
2611
2608
@@ -2635,7 +2632,8 @@ void HTMLMediaElement::setNetworkState(MediaPlayer::NetworkState state)
2635
2632
m_completelyLoaded = true ;
2636
2633
}
2637
2634
2638
- invalidateStyle ();
2635
+ updateBufferingState ();
2636
+ updateStalledState ();
2639
2637
}
2640
2638
2641
2639
void HTMLMediaElement::changeNetworkStateFromLoadingToIdle ()
@@ -2918,7 +2916,8 @@ void HTMLMediaElement::setReadyState(MediaPlayer::ReadyState state)
2918
2916
updateMediaController ();
2919
2917
updateActiveTextTrackCues (currentMediaTime ());
2920
2918
2921
- invalidateStyle ();
2919
+ updateBufferingState ();
2920
+ updateStalledState ();
2922
2921
}
2923
2922
2924
2923
#if ENABLE(LEGACY_ENCRYPTED_MEDIA)
@@ -3270,13 +3269,13 @@ void HTMLMediaElement::progressEventTimerFired()
3270
3269
m_previousProgressTime = time;
3271
3270
if (m_sentStalledEvent) {
3272
3271
m_sentStalledEvent = false ;
3273
- invalidateStyle ();
3272
+ updateStalledState ();
3274
3273
}
3275
3274
updateRenderer ();
3276
3275
} else if (timedelta > 3_s && !m_sentStalledEvent) {
3277
3276
scheduleEvent (eventNames ().stalledEvent );
3278
3277
m_sentStalledEvent = true ;
3279
- invalidateStyle ();
3278
+ updateStalledState ();
3280
3279
setShouldDelayLoadEvent (false );
3281
3280
}
3282
3281
});
@@ -3796,8 +3795,8 @@ void HTMLMediaElement::setPaused(bool paused)
3796
3795
{ CSSSelector::PseudoClassPlaying, !paused },
3797
3796
});
3798
3797
m_paused = paused;
3799
- // FIXME: Use PseudoClassChangeInvalidation for :buffering/:stalling and remove the line below.
3800
- invalidateStyle ();
3798
+ updateBufferingState ();
3799
+ updateStalledState ();
3801
3800
}
3802
3801
3803
3802
double HTMLMediaElement::defaultPlaybackRate () const
@@ -4280,7 +4279,7 @@ void HTMLMediaElement::setVolumeLocked(bool locked)
4280
4279
m_volumeLocked = locked;
4281
4280
}
4282
4281
4283
- bool HTMLMediaElement::buffering () const
4282
+ void HTMLMediaElement::updateBufferingState ()
4284
4283
{
4285
4284
// CSS Selectors Level 4; Editor's Draft, 2 July 2021
4286
4285
// <https://drafts.csswg.org/selectors/>
@@ -4291,10 +4290,14 @@ bool HTMLMediaElement::buffering() const
4291
4290
// but has not yet obtained enough data to resume playback. (Note that the element is still considered
4292
4291
// to be “playing” when it is “buffering”. Whenever :buffering matches an element, :playing also
4293
4292
// matches the element.)
4294
- return !paused () && m_networkState == NETWORK_LOADING && m_readyState <= HAVE_CURRENT_DATA;
4293
+ bool buffering = !paused () && m_networkState == NETWORK_LOADING && m_readyState <= HAVE_CURRENT_DATA;
4294
+ if (m_buffering != buffering) {
4295
+ Style::PseudoClassChangeInvalidation styleInvalidation (*this , CSSSelector::PseudoClassBuffering, buffering);
4296
+ m_buffering = buffering;
4297
+ }
4295
4298
}
4296
4299
4297
- bool HTMLMediaElement::stalled () const
4300
+ void HTMLMediaElement::updateStalledState ()
4298
4301
{
4299
4302
// CSS Selectors Level 4; Editor's Draft, 2 July 2021
4300
4303
// <https://drafts.csswg.org/selectors/>
@@ -4306,7 +4309,11 @@ bool HTMLMediaElement::stalled() const
4306
4309
// stall timeout. [HTML] (Note that, like with the :buffering pseudo-class, the element is still
4307
4310
// considered to be “playing” when it is “stalled”. Whenever :stalled matches an element, :playing
4308
4311
// also matches the element.)
4309
- return !paused () && m_networkState == NETWORK_LOADING && m_readyState <= HAVE_CURRENT_DATA && m_sentStalledEvent;
4312
+ bool stalled = !paused () && m_networkState == NETWORK_LOADING && m_readyState <= HAVE_CURRENT_DATA && m_sentStalledEvent;
4313
+ if (m_stalled != stalled) {
4314
+ Style::PseudoClassChangeInvalidation styleInvalidation (*this , CSSSelector::PseudoClassStalled, stalled);
4315
+ m_stalled = stalled;
4316
+ }
4310
4317
}
4311
4318
4312
4319
#if USE(AUDIO_SESSION) && PLATFORM(MAC)
0 commit comments