Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(24)

Side by Side Diff: third_party/WebKit/Source/core/html/HTMLMediaElement.cpp

Issue 1079323002: Support text track selection in video controls (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase and lgtm nits Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved. 2 * Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 , m_userGestureRequiredForPlay(false) 406 , m_userGestureRequiredForPlay(false)
407 , m_playing(false) 407 , m_playing(false)
408 , m_shouldDelayLoadEvent(false) 408 , m_shouldDelayLoadEvent(false)
409 , m_haveFiredLoadedData(false) 409 , m_haveFiredLoadedData(false)
410 , m_autoplaying(true) 410 , m_autoplaying(true)
411 , m_muted(false) 411 , m_muted(false)
412 , m_paused(true) 412 , m_paused(true)
413 , m_seeking(false) 413 , m_seeking(false)
414 , m_sentStalledEvent(false) 414 , m_sentStalledEvent(false)
415 , m_sentEndEvent(false) 415 , m_sentEndEvent(false)
416 , m_closedCaptionsVisible(false)
417 , m_ignorePreloadNone(false) 416 , m_ignorePreloadNone(false)
417 , m_textTracksVisible(false)
418 , m_shouldPerformAutomaticTrackSelection(true)
418 , m_tracksAreReady(true) 419 , m_tracksAreReady(true)
419 , m_processingPreferenceChange(false) 420 , m_processingPreferenceChange(false)
420 , m_remoteRoutesAvailable(false) 421 , m_remoteRoutesAvailable(false)
421 , m_playingRemotely(false) 422 , m_playingRemotely(false)
422 , m_inOverlayFullscreenVideo(false) 423 , m_inOverlayFullscreenVideo(false)
423 , m_audioTracks(AudioTrackList::create(*this)) 424 , m_audioTracks(AudioTrackList::create(*this))
424 , m_videoTracks(VideoTrackList::create(*this)) 425 , m_videoTracks(VideoTrackList::create(*this))
425 , m_textTracks(nullptr) 426 , m_textTracks(nullptr)
426 , m_playPromiseResolveTask(CancellableTaskFactory::create(this, &HTMLMediaEl ement::resolvePlayPromises)) 427 , m_playPromiseResolveTask(CancellableTaskFactory::create(this, &HTMLMediaEl ement::resolvePlayPromises))
427 , m_playPromiseRejectTask(CancellableTaskFactory::create(this, &HTMLMediaEle ment::rejectPlayPromises)) 428 , m_playPromiseRejectTask(CancellableTaskFactory::create(this, &HTMLMediaEle ment::rejectPlayPromises))
(...skipping 796 matching lines...) Expand 10 before | Expand all | Expand 10 after
1224 // Mark this track as "configured" so configureTextTracks won't change the m ode again. 1225 // Mark this track as "configured" so configureTextTracks won't change the m ode again.
1225 if (track->trackType() == TextTrack::TrackElement) 1226 if (track->trackType() == TextTrack::TrackElement)
1226 track->setHasBeenConfigured(true); 1227 track->setHasBeenConfigured(true);
1227 1228
1228 configureTextTrackDisplay(); 1229 configureTextTrackDisplay();
1229 1230
1230 ASSERT(textTracks()->contains(track)); 1231 ASSERT(textTracks()->contains(track));
1231 textTracks()->scheduleChangeEvent(); 1232 textTracks()->scheduleChangeEvent();
1232 } 1233 }
1233 1234
1235 void HTMLMediaElement::disableAutomaticTextTrackSelection()
1236 {
1237 m_shouldPerformAutomaticTrackSelection = false;
1238 }
1239
1234 bool HTMLMediaElement::isSafeToLoadURL(const KURL& url, InvalidURLAction actionI fInvalid) 1240 bool HTMLMediaElement::isSafeToLoadURL(const KURL& url, InvalidURLAction actionI fInvalid)
1235 { 1241 {
1236 if (!url.isValid()) { 1242 if (!url.isValid()) {
1237 WTF_LOG(Media, "HTMLMediaElement::isSafeToLoadURL(%p, %s) -> FALSE becau se url is invalid", this, urlForLoggingMedia(url).utf8().data()); 1243 WTF_LOG(Media, "HTMLMediaElement::isSafeToLoadURL(%p, %s) -> FALSE becau se url is invalid", this, urlForLoggingMedia(url).utf8().data());
1238 return false; 1244 return false;
1239 } 1245 }
1240 1246
1241 LocalFrame* frame = document().frame(); 1247 LocalFrame* frame = document().frame();
1242 if (!frame || !document().getSecurityOrigin()->canDisplay(url)) { 1248 if (!frame || !document().getSecurityOrigin()->canDisplay(url)) {
1243 if (actionIfInvalid == Complain) 1249 if (actionIfInvalid == Complain)
(...skipping 1336 matching lines...) Expand 10 before | Expand all | Expand 10 after
2580 size_t index = m_textTracksWhenResourceSelectionBegan.find(textTrack); 2586 size_t index = m_textTracksWhenResourceSelectionBegan.find(textTrack);
2581 if (index != kNotFound) 2587 if (index != kNotFound)
2582 m_textTracksWhenResourceSelectionBegan.remove(index); 2588 m_textTracksWhenResourceSelectionBegan.remove(index);
2583 } 2589 }
2584 2590
2585 void HTMLMediaElement::honorUserPreferencesForAutomaticTextTrackSelection() 2591 void HTMLMediaElement::honorUserPreferencesForAutomaticTextTrackSelection()
2586 { 2592 {
2587 if (!m_textTracks || !m_textTracks->length()) 2593 if (!m_textTracks || !m_textTracks->length())
2588 return; 2594 return;
2589 2595
2596 if (!m_shouldPerformAutomaticTrackSelection)
2597 return;
2598
2590 AutomaticTrackSelection::Configuration configuration; 2599 AutomaticTrackSelection::Configuration configuration;
2591 if (m_processingPreferenceChange) 2600 if (m_processingPreferenceChange)
2592 configuration.disableCurrentlyEnabledTracks = true; 2601 configuration.disableCurrentlyEnabledTracks = true;
2593 if (m_closedCaptionsVisible) 2602 if (m_textTracksVisible)
2594 configuration.forceEnableSubtitleOrCaptionTrack = true; 2603 configuration.forceEnableSubtitleOrCaptionTrack = true;
2595 2604
2596 Settings* settings = document().settings(); 2605 Settings* settings = document().settings();
2597 if (settings) 2606 if (settings)
2598 configuration.textTrackKindUserPreference = settings->textTrackKindUserP reference(); 2607 configuration.textTrackKindUserPreference = settings->textTrackKindUserP reference();
2599 2608
2600 AutomaticTrackSelection trackSelection(configuration); 2609 AutomaticTrackSelection trackSelection(configuration);
2601 trackSelection.perform(*m_textTracks); 2610 trackSelection.perform(*m_textTracks);
2602 2611
2603 textTracksChanged(); 2612 textTracksChanged();
(...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after
3253 continue; 3262 continue;
3254 3263
3255 if (track->kind() == TextTrack::captionsKeyword() 3264 if (track->kind() == TextTrack::captionsKeyword()
3256 || track->kind() == TextTrack::subtitlesKeyword()) 3265 || track->kind() == TextTrack::subtitlesKeyword())
3257 return true; 3266 return true;
3258 } 3267 }
3259 } 3268 }
3260 return false; 3269 return false;
3261 } 3270 }
3262 3271
3263 bool HTMLMediaElement::closedCaptionsVisible() const 3272 bool HTMLMediaElement::textTracksVisible() const
3264 { 3273 {
3265 return m_closedCaptionsVisible; 3274 return m_textTracksVisible;
3266 } 3275 }
3267 3276
3268 static void assertShadowRootChildren(ShadowRoot& shadowRoot) 3277 static void assertShadowRootChildren(ShadowRoot& shadowRoot)
3269 { 3278 {
3270 #if ENABLE(ASSERT) 3279 #if ENABLE(ASSERT)
3271 // There can be up to two children, either or both of the text 3280 // There can be up to two children, either or both of the text
3272 // track container and media controls. If both are present, the 3281 // track container and media controls. If both are present, the
3273 // text track container must be the first child. 3282 // text track container must be the first child.
3274 unsigned numberOfChildren = shadowRoot.countChildren(); 3283 unsigned numberOfChildren = shadowRoot.countChildren();
3275 ASSERT(numberOfChildren <= 2); 3284 ASSERT(numberOfChildren <= 2);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
3311 ensureTextTrackContainer().updateDisplay(*this, TextTrackContainer::DidNotSt artExposingControls); 3320 ensureTextTrackContainer().updateDisplay(*this, TextTrackContainer::DidNotSt artExposingControls);
3312 } 3321 }
3313 3322
3314 void HTMLMediaElement::mediaControlsDidBecomeVisible() 3323 void HTMLMediaElement::mediaControlsDidBecomeVisible()
3315 { 3324 {
3316 WTF_LOG(Media, "HTMLMediaElement::mediaControlsDidBecomeVisible(%p)", this); 3325 WTF_LOG(Media, "HTMLMediaElement::mediaControlsDidBecomeVisible(%p)", this);
3317 3326
3318 // When the user agent starts exposing a user interface for a video element, 3327 // When the user agent starts exposing a user interface for a video element,
3319 // the user agent should run the rules for updating the text track rendering 3328 // the user agent should run the rules for updating the text track rendering
3320 // of each of the text tracks in the video element's list of text tracks ... 3329 // of each of the text tracks in the video element's list of text tracks ...
3321 if (isHTMLVideoElement() && closedCaptionsVisible()) 3330 if (isHTMLVideoElement() && textTracksVisible())
3322 ensureTextTrackContainer().updateDisplay(*this, TextTrackContainer::DidS tartExposingControls); 3331 ensureTextTrackContainer().updateDisplay(*this, TextTrackContainer::DidS tartExposingControls);
3323 } 3332 }
3324 3333
3325 void HTMLMediaElement::setClosedCaptionsVisible(bool closedCaptionVisible)
3326 {
3327 WTF_LOG(Media, "HTMLMediaElement::setClosedCaptionsVisible(%p, %s)", this, b oolString(closedCaptionVisible));
3328
3329 if (!hasClosedCaptions())
3330 return;
3331
3332 m_closedCaptionsVisible = closedCaptionVisible;
3333
3334 markCaptionAndSubtitleTracksAsUnconfigured();
3335 m_processingPreferenceChange = true;
3336 honorUserPreferencesForAutomaticTextTrackSelection();
3337 m_processingPreferenceChange = false;
3338
3339 // As track visibility changed while m_processingPreferenceChange was set,
3340 // there was no call to updateTextTrackDisplay(). This call is not in the
3341 // spec, see the note in configureTextTrackDisplay().
3342 updateTextTrackDisplay();
3343 }
3344
3345 void HTMLMediaElement::setTextTrackKindUserPreferenceForAllMediaElements(Documen t* document) 3334 void HTMLMediaElement::setTextTrackKindUserPreferenceForAllMediaElements(Documen t* document)
3346 { 3335 {
3347 auto it = documentToElementSetMap().find(document); 3336 auto it = documentToElementSetMap().find(document);
3348 if (it == documentToElementSetMap().end()) 3337 if (it == documentToElementSetMap().end())
3349 return; 3338 return;
3350 ASSERT(it->value); 3339 ASSERT(it->value);
3351 WeakMediaElementSet& elements = *it->value; 3340 WeakMediaElementSet& elements = *it->value;
3352 for (const auto& element : elements) 3341 for (const auto& element : elements)
3353 element->automaticTrackSelectionForUpdatedUserPreference(); 3342 element->automaticTrackSelectionForUpdatedUserPreference();
3354 } 3343 }
3355 3344
3356 void HTMLMediaElement::automaticTrackSelectionForUpdatedUserPreference() 3345 void HTMLMediaElement::automaticTrackSelectionForUpdatedUserPreference()
3357 { 3346 {
3358 if (!m_textTracks || !m_textTracks->length()) 3347 if (!m_textTracks || !m_textTracks->length())
3359 return; 3348 return;
3360 3349
3361 markCaptionAndSubtitleTracksAsUnconfigured(); 3350 markCaptionAndSubtitleTracksAsUnconfigured();
3362 m_processingPreferenceChange = true; 3351 m_processingPreferenceChange = true;
3363 m_closedCaptionsVisible = false; 3352 m_textTracksVisible = false;
3364 honorUserPreferencesForAutomaticTextTrackSelection(); 3353 honorUserPreferencesForAutomaticTextTrackSelection();
3365 m_processingPreferenceChange = false; 3354 m_processingPreferenceChange = false;
3366 3355
3367 // If a track is set to 'showing' post performing automatic track selection, 3356 // If a track is set to 'showing' post performing automatic track selection,
3368 // set closed captions state to visible to update the CC button and display the track. 3357 // set text tracks state to visible to update the CC button and display the track.
3369 m_closedCaptionsVisible = m_textTracks->hasShowingTracks(); 3358 m_textTracksVisible = m_textTracks->hasShowingTracks();
3370 updateTextTrackDisplay(); 3359 updateTextTrackDisplay();
3371 } 3360 }
3372 3361
3373 void HTMLMediaElement::markCaptionAndSubtitleTracksAsUnconfigured() 3362 void HTMLMediaElement::markCaptionAndSubtitleTracksAsUnconfigured()
3374 { 3363 {
3375 if (!m_textTracks) 3364 if (!m_textTracks)
3376 return; 3365 return;
3377 3366
3378 // Mark all tracks as not "configured" so that 3367 // Mark all tracks as not "configured" so that
3379 // honorUserPreferencesForAutomaticTextTrackSelection() will reconsider 3368 // honorUserPreferencesForAutomaticTextTrackSelection() will reconsider
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
3484 3473
3485 void HTMLMediaElement::configureTextTrackDisplay() 3474 void HTMLMediaElement::configureTextTrackDisplay()
3486 { 3475 {
3487 ASSERT(m_textTracks); 3476 ASSERT(m_textTracks);
3488 WTF_LOG(Media, "HTMLMediaElement::configureTextTrackDisplay(%p)", this); 3477 WTF_LOG(Media, "HTMLMediaElement::configureTextTrackDisplay(%p)", this);
3489 3478
3490 if (m_processingPreferenceChange) 3479 if (m_processingPreferenceChange)
3491 return; 3480 return;
3492 3481
3493 bool haveVisibleTextTrack = m_textTracks->hasShowingTracks(); 3482 bool haveVisibleTextTrack = m_textTracks->hasShowingTracks();
3494 m_closedCaptionsVisible = haveVisibleTextTrack; 3483 m_textTracksVisible = haveVisibleTextTrack;
3495 3484
3496 if (!haveVisibleTextTrack && !mediaControls()) 3485 if (!haveVisibleTextTrack && !mediaControls())
3497 return; 3486 return;
3498 3487
3499 if (mediaControls()) 3488 if (mediaControls())
3500 mediaControls()->changedClosedCaptionsVisibility(); 3489 mediaControls()->changedClosedCaptionsVisibility();
3501 3490
3502 cueTimeline().updateActiveCues(currentTime()); 3491 cueTimeline().updateActiveCues(currentTime());
3503 3492
3504 // Note: The "time marches on" algorithm (updateActiveCues) runs the "rules 3493 // Note: The "time marches on" algorithm (updateActiveCues) runs the "rules
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after
3852 3841
3853 IntRect HTMLMediaElement::AutoplayHelperClientImpl::absoluteBoundingBoxRect() co nst 3842 IntRect HTMLMediaElement::AutoplayHelperClientImpl::absoluteBoundingBoxRect() co nst
3854 { 3843 {
3855 IntRect result; 3844 IntRect result;
3856 if (LayoutObject* object = m_element->layoutObject()) 3845 if (LayoutObject* object = m_element->layoutObject())
3857 result = object->absoluteBoundingBoxRect(); 3846 result = object->absoluteBoundingBoxRect();
3858 return result; 3847 return result;
3859 } 3848 }
3860 3849
3861 } // namespace blink 3850 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698