OLD | NEW |
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 3165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3176 } | 3176 } |
3177 } | 3177 } |
3178 return false; | 3178 return false; |
3179 } | 3179 } |
3180 | 3180 |
3181 bool HTMLMediaElement::closedCaptionsVisible() const | 3181 bool HTMLMediaElement::closedCaptionsVisible() const |
3182 { | 3182 { |
3183 return m_closedCaptionsVisible; | 3183 return m_closedCaptionsVisible; |
3184 } | 3184 } |
3185 | 3185 |
| 3186 static void assertShadowRootChildren(ShadowRoot& shadowRoot) |
| 3187 { |
| 3188 #if ENABLE(ASSERT) |
| 3189 // There can be up to two children, either or both of the text |
| 3190 // track container and media controls. If both are present, the |
| 3191 // text track container must be the first child. |
| 3192 unsigned numberOfChildren = shadowRoot.countChildren(); |
| 3193 ASSERT(numberOfChildren <= 2); |
| 3194 Node* firstChild = shadowRoot.firstChild(); |
| 3195 Node* lastChild = shadowRoot.lastChild(); |
| 3196 if (numberOfChildren == 1) { |
| 3197 ASSERT(firstChild->isTextTrackContainer() || firstChild->isMediaControls
()); |
| 3198 } else if (numberOfChildren == 2) { |
| 3199 ASSERT(firstChild->isTextTrackContainer()); |
| 3200 ASSERT(lastChild->isMediaControls()); |
| 3201 } |
| 3202 #endif |
| 3203 } |
| 3204 |
3186 TextTrackContainer& HTMLMediaElement::ensureTextTrackContainer() | 3205 TextTrackContainer& HTMLMediaElement::ensureTextTrackContainer() |
3187 { | 3206 { |
3188 ensureMediaControls(); | 3207 ShadowRoot& shadowRoot = ensureClosedShadowRoot(); |
3189 return *mediaControls()->textTrackContainer(); | 3208 assertShadowRootChildren(shadowRoot); |
| 3209 |
| 3210 Node* firstChild = shadowRoot.firstChild(); |
| 3211 if (firstChild && firstChild->isTextTrackContainer()) |
| 3212 return toTextTrackContainer(*firstChild); |
| 3213 |
| 3214 RefPtrWillBeRawPtr<TextTrackContainer> textTrackContainer = TextTrackContain
er::create(document()); |
| 3215 |
| 3216 // The text track container should be inserted before the media controls, |
| 3217 // so that they are rendered behind them. |
| 3218 shadowRoot.insertBefore(textTrackContainer, firstChild); |
| 3219 |
| 3220 assertShadowRootChildren(shadowRoot); |
| 3221 |
| 3222 return *textTrackContainer; |
3190 } | 3223 } |
3191 | 3224 |
3192 void HTMLMediaElement::updateTextTrackDisplay() | 3225 void HTMLMediaElement::updateTextTrackDisplay() |
3193 { | 3226 { |
3194 WTF_LOG(Media, "HTMLMediaElement::updateTextTrackDisplay(%p)", this); | 3227 WTF_LOG(Media, "HTMLMediaElement::updateTextTrackDisplay(%p)", this); |
3195 | 3228 |
3196 ensureTextTrackContainer().updateDisplay(*this); | 3229 ensureTextTrackContainer().updateDisplay(*this); |
3197 } | 3230 } |
3198 | 3231 |
3199 void HTMLMediaElement::setClosedCaptionsVisible(bool closedCaptionVisible) | 3232 void HTMLMediaElement::setClosedCaptionsVisible(bool closedCaptionVisible) |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3262 | 3295 |
3263 WTF_LOG(Media, "HTMLMediaElement::setShouldDelayLoadEvent(%p, %s)", this, bo
olString(shouldDelay)); | 3296 WTF_LOG(Media, "HTMLMediaElement::setShouldDelayLoadEvent(%p, %s)", this, bo
olString(shouldDelay)); |
3264 | 3297 |
3265 m_shouldDelayLoadEvent = shouldDelay; | 3298 m_shouldDelayLoadEvent = shouldDelay; |
3266 if (shouldDelay) | 3299 if (shouldDelay) |
3267 document().incrementLoadEventDelayCount(); | 3300 document().incrementLoadEventDelayCount(); |
3268 else | 3301 else |
3269 document().decrementLoadEventDelayCount(); | 3302 document().decrementLoadEventDelayCount(); |
3270 } | 3303 } |
3271 | 3304 |
3272 | |
3273 MediaControls* HTMLMediaElement::mediaControls() const | 3305 MediaControls* HTMLMediaElement::mediaControls() const |
3274 { | 3306 { |
3275 if (ShadowRoot* shadowRoot = closedShadowRoot()) { | 3307 if (ShadowRoot* shadowRoot = closedShadowRoot()) { |
3276 // Note that |shadowRoot->firstChild()| may be null. | 3308 Node* lastChild = shadowRoot->lastChild(); |
3277 return toMediaControls(shadowRoot->firstChild()); | 3309 if (lastChild && lastChild->isMediaControls()) |
| 3310 return toMediaControls(lastChild); |
3278 } | 3311 } |
3279 | 3312 |
3280 return nullptr; | 3313 return nullptr; |
3281 } | 3314 } |
3282 | 3315 |
3283 void HTMLMediaElement::ensureMediaControls() | 3316 void HTMLMediaElement::ensureMediaControls() |
3284 { | 3317 { |
3285 if (mediaControls()) | 3318 if (mediaControls()) |
3286 return; | 3319 return; |
3287 | 3320 |
3288 RefPtrWillBeRawPtr<MediaControls> mediaControls = MediaControls::create(*thi
s); | 3321 RefPtrWillBeRawPtr<MediaControls> mediaControls = MediaControls::create(*thi
s); |
3289 | 3322 |
3290 mediaControls->reset(); | 3323 mediaControls->reset(); |
3291 if (isFullscreen()) | 3324 if (isFullscreen()) |
3292 mediaControls->enteredFullscreen(); | 3325 mediaControls->enteredFullscreen(); |
3293 | 3326 |
3294 ensureClosedShadowRoot().appendChild(mediaControls); | 3327 ShadowRoot& shadowRoot = ensureClosedShadowRoot(); |
| 3328 assertShadowRootChildren(shadowRoot); |
| 3329 |
| 3330 // The media controls should be inserted after the text track container, |
| 3331 // so that they are rendered in front of captions and subtitles. |
| 3332 shadowRoot.appendChild(mediaControls); |
| 3333 |
| 3334 assertShadowRootChildren(shadowRoot); |
3295 | 3335 |
3296 if (!shouldShowControls() || !inDocument()) | 3336 if (!shouldShowControls() || !inDocument()) |
3297 mediaControls->hide(); | 3337 mediaControls->hide(); |
3298 } | 3338 } |
3299 | 3339 |
3300 void HTMLMediaElement::configureMediaControls() | 3340 void HTMLMediaElement::configureMediaControls() |
3301 { | 3341 { |
3302 if (!inDocument()) { | 3342 if (!inDocument()) { |
3303 if (mediaControls()) | 3343 if (mediaControls()) |
3304 mediaControls()->hide(); | 3344 mediaControls()->hide(); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3340 && m_haveVisibleTextTrack == haveVisibleTextTrack) { | 3380 && m_haveVisibleTextTrack == haveVisibleTextTrack) { |
3341 cueTimeline().updateActiveCues(currentTime()); | 3381 cueTimeline().updateActiveCues(currentTime()); |
3342 return; | 3382 return; |
3343 } | 3383 } |
3344 m_haveVisibleTextTrack = haveVisibleTextTrack; | 3384 m_haveVisibleTextTrack = haveVisibleTextTrack; |
3345 m_closedCaptionsVisible = m_haveVisibleTextTrack; | 3385 m_closedCaptionsVisible = m_haveVisibleTextTrack; |
3346 | 3386 |
3347 if (!m_haveVisibleTextTrack && !mediaControls()) | 3387 if (!m_haveVisibleTextTrack && !mediaControls()) |
3348 return; | 3388 return; |
3349 | 3389 |
3350 ensureMediaControls(); | 3390 if (mediaControls()) |
3351 mediaControls()->changedClosedCaptionsVisibility(); | 3391 mediaControls()->changedClosedCaptionsVisibility(); |
3352 | 3392 |
3353 cueTimeline().updateActiveCues(currentTime()); | 3393 cueTimeline().updateActiveCues(currentTime()); |
3354 | 3394 |
3355 // Note: The "time marches on" algorithm (updateActiveCues) runs the "rules | 3395 // Note: The "time marches on" algorithm (updateActiveCues) runs the "rules |
3356 // for updating the text track rendering" (updateTextTrackDisplay) only for | 3396 // for updating the text track rendering" (updateTextTrackDisplay) only for |
3357 // "affected tracks", i.e. tracks where the the active cues have changed. | 3397 // "affected tracks", i.e. tracks where the the active cues have changed. |
3358 // This misses cues in tracks that changed mode between hidden and showing. | 3398 // This misses cues in tracks that changed mode between hidden and showing. |
3359 // This appears to be a spec bug, which we work around here: | 3399 // This appears to be a spec bug, which we work around here: |
3360 // https://www.w3.org/Bugs/Public/show_bug.cgi?id=28236 | 3400 // https://www.w3.org/Bugs/Public/show_bug.cgi?id=28236 |
3361 updateTextTrackDisplay(); | 3401 updateTextTrackDisplay(); |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3610 | 3650 |
3611 #if ENABLE(WEB_AUDIO) | 3651 #if ENABLE(WEB_AUDIO) |
3612 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) | 3652 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) |
3613 { | 3653 { |
3614 if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider()) | 3654 if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider()) |
3615 audioSourceProvider()->setClient(nullptr); | 3655 audioSourceProvider()->setClient(nullptr); |
3616 } | 3656 } |
3617 #endif | 3657 #endif |
3618 | 3658 |
3619 } | 3659 } |
OLD | NEW |