Changeset 202749 in webkit
- Timestamp:
- Jul 1, 2016 1:31:18 PM (8 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r202747 r202749 1 2016-07-01 Eric Carlson <eric.carlson@apple.com> 2 3 HTMLMediaElement::resume() may cause JavaScript execution 4 https://bugs.webkit.org/show_bug.cgi?id=159327 5 <rdar://problem/27131641> 6 7 Reviewed by Jer Noble. 8 9 HTMLMediaElement::updatePlayState can cause an element to begin playing and enter fullscreen, 10 which can result in a call to the media controls and JavaScript execution. Javascript is not 11 allowed allowed to run when a page resumes, so make the call to updatePlayState asynchronous. 12 13 No new tests, I wasn't able to create a test that triggers the crash. 14 15 * html/HTMLMediaElement.cpp: 16 (WebCore::HTMLMediaElement::scheduleDelayedAction): Support UpdatePlayState. 17 (WebCore::HTMLMediaElement::pendingActionTimerFired): Ditto. 18 (WebCore::HTMLMediaElement::setReadyState): UpdateMediaState -> UpdateState. 19 (WebCore::HTMLMediaElement::playInternal): Don't call updateMediaController, it is called 20 by updatePlayState. 21 (WebCore::HTMLMediaElement::setMuted): UpdateMediaState -> UpdateState. 22 (WebCore::HTMLMediaElement::mediaPlayerTimeChanged): Ditto. 23 (WebCore::HTMLMediaElement::mediaEngineWasUpdated): Update media state asynchronously. 24 (WebCore::HTMLMediaElement::updatePlayState): Add parameter to allow update to happen 25 asynchronously. 26 (WebCore::HTMLMediaElement::setPlaying): UpdateMediaState -> UpdateState. 27 (WebCore::HTMLMediaElement::setPausedInternal): Update media state asynchronously. 28 (WebCore::HTMLMediaElement::mediaPlayerCurrentPlaybackTargetIsWirelessChanged): 29 UpdateMediaState -> UpdateState. 30 (WebCore::HTMLMediaElement::removeEventListener): Ditto. 31 (WebCore::HTMLMediaElement::enqueuePlaybackTargetAvailabilityChangedEvent): Ditto. 32 (WebCore::HTMLMediaElement::updateMediaState): UpdateMediaState -> UpdateState 33 * html/HTMLMediaElement.h: 34 * html/HTMLMediaElementEnums.h: Add UpdatePlayState. 35 1 36 2016-07-01 Brady Eidson <beidson@apple.com> 2 37 -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r202427 r202749 893 893 setFlags(m_pendingActionFlags, MediaEngineUpdated); 894 894 895 if (actionType & UpdatePlayState) 896 setFlags(m_pendingActionFlags, UpdatePlayState); 897 895 898 m_pendingActionTimer.startOneShot(0); 896 899 } … … 980 983 if (pendingActions & MediaEngineUpdated) 981 984 mediaEngineWasUpdated(); 985 986 if (pendingActions & UpdatePlayState) 987 updatePlayState(); 982 988 } 983 989 … … 2270 2276 2271 2277 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 2272 updateMediaState(Update MediaState::Asynchronously);2278 updateMediaState(UpdateState::Asynchronously); 2273 2279 #endif 2274 2280 … … 3127 3133 m_autoplaying = false; 3128 3134 updatePlayState(); 3129 updateMediaController(); 3135 3130 3136 return true; 3131 3137 } … … 3359 3365 3360 3366 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 3361 updateMediaState(Update MediaState::Asynchronously);3367 updateMediaState(UpdateState::Asynchronously); 3362 3368 #endif 3363 3369 } … … 4419 4425 } 4420 4426 4421 updatePlayState( );4427 updatePlayState(UpdateState::Asynchronously); 4422 4428 endProcessingMediaPlayerCallback(); 4423 4429 } … … 4595 4601 4596 4602 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 4597 updateMediaState(Update MediaState::Asynchronously);4603 updateMediaState(UpdateState::Asynchronously); 4598 4604 #endif 4599 4605 } … … 4829 4835 } 4830 4836 4831 void HTMLMediaElement::updatePlayState() 4832 { 4837 void HTMLMediaElement::updatePlayState(UpdateState updateState) 4838 { 4839 if (updateState == UpdateState::Asynchronously) { 4840 scheduleDelayedAction(UpdatePlayState); 4841 return; 4842 } 4843 4833 4844 if (!m_player) 4834 4845 return; … … 4923 4934 4924 4935 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 4925 updateMediaState(Update MediaState::Asynchronously);4936 updateMediaState(UpdateState::Asynchronously); 4926 4937 #endif 4927 4938 } … … 4930 4941 { 4931 4942 m_pausedInternal = b; 4932 updatePlayState( );4943 updatePlayState(UpdateState::Asynchronously); 4933 4944 } 4934 4945 … … 5222 5233 if (m_isPlayingToWirelessTarget) 5223 5234 m_mediaSession->setCanProduceAudio(true); 5224 updateMediaState(Update MediaState::Asynchronously);5235 updateMediaState(UpdateState::Asynchronously); 5225 5236 } 5226 5237 … … 5267 5278 m_hasPlaybackTargetAvailabilityListeners = false; 5268 5279 m_mediaSession->setHasPlaybackTargetAvailabilityListeners(*this, false); 5269 updateMediaState(Update MediaState::Asynchronously);5280 updateMediaState(UpdateState::Asynchronously); 5270 5281 } 5271 5282 … … 5280 5291 event->setTarget(this); 5281 5292 m_asyncEventQueue.enqueueEvent(WTFMove(event)); 5282 updateMediaState(Update MediaState::Asynchronously);5293 updateMediaState(UpdateState::Asynchronously); 5283 5294 } 5284 5295 … … 6845 6856 6846 6857 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 6847 void HTMLMediaElement::updateMediaState(Update MediaState updateState)6848 { 6849 if (updateState == Update MediaState::Asynchronously) {6858 void HTMLMediaElement::updateMediaState(UpdateState updateState) 6859 { 6860 if (updateState == UpdateState::Asynchronously) { 6850 6861 scheduleDelayedAction(CheckMediaState); 6851 6862 return; -
trunk/Source/WebCore/html/HTMLMediaElement.h
r202183 r202749 691 691 void endProcessingMediaPlayerCallback() { ASSERT(m_processingMediaPlayerCallback); --m_processingMediaPlayerCallback; } 692 692 693 enum class UpdateState { Asynchronously, Synchronously }; 694 695 void updatePlayState(UpdateState updateState = UpdateState::Synchronously); 693 696 void updateVolume(); 694 void updatePlayState();695 697 void setPlaying(bool); 696 698 bool potentiallyPlaying() const; … … 771 773 void resumeFromDocumentSuspension() final; 772 774 773 enum class UpdateMediaState { Asynchronously, Synchronously }; 774 void updateMediaState(UpdateMediaState updateState = UpdateMediaState::Synchronously); 775 void updateMediaState(UpdateState updateState = UpdateState::Synchronously); 775 776 bool hasPlaybackTargetAvailabilityListeners() const { return m_hasPlaybackTargetAvailabilityListeners; } 776 777 #endif -
trunk/Source/WebCore/html/HTMLMediaElementEnums.h
r199126 r202749 43 43 CheckMediaState = 1 << 5, 44 44 MediaEngineUpdated = 1 << 6, 45 UpdatePlayState = 1 << 7, 45 46 46 EveryDelayedAction = LoadMediaResource | ConfigureTextTracks | TextTrackChangesNotification | ConfigureTextTrackDisplay | CheckPlaybackTargetCompatablity | CheckMediaState ,47 EveryDelayedAction = LoadMediaResource | ConfigureTextTracks | TextTrackChangesNotification | ConfigureTextTrackDisplay | CheckPlaybackTargetCompatablity | CheckMediaState | UpdatePlayState, 47 48 }; 48 49
Note: See TracChangeset
for help on using the changeset viewer.