OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 #include "core/html/track/CueTimeline.h" | 6 #include "core/html/track/CueTimeline.h" |
7 | 7 |
8 #include "core/events/Event.h" | 8 #include "core/events/Event.h" |
9 #include "core/html/HTMLMediaElement.h" | 9 #include "core/html/HTMLMediaElement.h" |
10 #include "core/html/HTMLTrackElement.h" | 10 #include "core/html/HTMLTrackElement.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 | 55 |
56 void CueTimeline::removeCue(TextTrack*, PassRefPtrWillBeRawPtr<TextTrackCue> cue
) | 56 void CueTimeline::removeCue(TextTrack*, PassRefPtrWillBeRawPtr<TextTrackCue> cue
) |
57 { | 57 { |
58 // Negative duration cues need to be treated in the interval tree as | 58 // Negative duration cues need to be treated in the interval tree as |
59 // zero-length cues. | 59 // zero-length cues. |
60 double endTime = std::max(cue->startTime(), cue->endTime()); | 60 double endTime = std::max(cue->startTime(), cue->endTime()); |
61 | 61 |
62 CueInterval interval = m_cueTree.createInterval(cue->startTime(), endTime, c
ue.get()); | 62 CueInterval interval = m_cueTree.createInterval(cue->startTime(), endTime, c
ue.get()); |
63 m_cueTree.remove(interval); | 63 m_cueTree.remove(interval); |
64 | 64 |
65 // Since the cue will be removed from the media element and likely the | |
66 // TextTrack might also be destructed, notifying the region of the cue | |
67 // removal shouldn't be done. | |
68 cue->notifyRegionWhenRemovingDisplayTree(false); | |
69 | |
70 size_t index = m_currentlyActiveCues.find(interval); | 65 size_t index = m_currentlyActiveCues.find(interval); |
71 if (index != kNotFound) { | 66 if (index != kNotFound) { |
72 m_currentlyActiveCues.remove(index); | 67 m_currentlyActiveCues.remove(index); |
73 cue->setIsActive(false); | 68 cue->setIsActive(false); |
| 69 // Since the cue will be removed from the media element and likely the |
| 70 // TextTrack might also be destructed, notifying the region of the cue |
| 71 // removal shouldn't be done. |
| 72 cue->removeDisplayTree(TextTrackCue::DontNotifyRegion); |
74 } | 73 } |
75 cue->removeDisplayTree(); | |
76 updateActiveCues(mediaElement().currentTime()); | 74 updateActiveCues(mediaElement().currentTime()); |
77 | |
78 cue->notifyRegionWhenRemovingDisplayTree(true); | |
79 } | 75 } |
80 | 76 |
81 static bool trackIndexCompare(TextTrack* a, TextTrack* b) | 77 static bool trackIndexCompare(TextTrack* a, TextTrack* b) |
82 { | 78 { |
83 return a->trackIndex() - b->trackIndex() < 0; | 79 return a->trackIndex() - b->trackIndex() < 0; |
84 } | 80 } |
85 | 81 |
86 static bool eventTimeCueCompare(const std::pair<double, TextTrackCue*>& a, const
std::pair<double, TextTrackCue*>& b) | 82 static bool eventTimeCueCompare(const std::pair<double, TextTrackCue*>& a, const
std::pair<double, TextTrackCue*>& b) |
87 { | 83 { |
88 // 12 - Sort the tasks in events in ascending time order (tasks with earlier | 84 // 12 - Sort the tasks in events in ascending time order (tasks with earlier |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 } | 308 } |
313 } | 309 } |
314 | 310 |
315 // 16 - Set the text track cue active flag of all the cues in the current | 311 // 16 - Set the text track cue active flag of all the cues in the current |
316 // cues, and unset the text track cue active flag of all the cues in the | 312 // cues, and unset the text track cue active flag of all the cues in the |
317 // other cues. | 313 // other cues. |
318 for (size_t i = 0; i < currentCuesSize; ++i) | 314 for (size_t i = 0; i < currentCuesSize; ++i) |
319 currentCues[i].data()->setIsActive(true); | 315 currentCues[i].data()->setIsActive(true); |
320 | 316 |
321 for (size_t i = 0; i < previousCuesSize; ++i) { | 317 for (size_t i = 0; i < previousCuesSize; ++i) { |
322 if (!currentCues.contains(previousCues[i])) | 318 if (!currentCues.contains(previousCues[i])) { |
323 previousCues[i].data()->setIsActive(false); | 319 TextTrackCue* cue = previousCues[i].data(); |
| 320 cue->setIsActive(false); |
| 321 cue->removeDisplayTree(); |
| 322 } |
324 } | 323 } |
325 | 324 |
326 // Update the current active cues. | 325 // Update the current active cues. |
327 m_currentlyActiveCues = currentCues; | 326 m_currentlyActiveCues = currentCues; |
328 | 327 |
329 if (activeSetChanged) | 328 if (activeSetChanged) |
330 mediaElement.updateTextTrackDisplay(); | 329 mediaElement.updateTextTrackDisplay(); |
331 } | 330 } |
332 | 331 |
333 void CueTimeline::beginIgnoringUpdateRequests() | 332 void CueTimeline::beginIgnoringUpdateRequests() |
334 { | 333 { |
335 ++m_ignoreUpdate; | 334 ++m_ignoreUpdate; |
336 } | 335 } |
337 | 336 |
338 void CueTimeline::endIgnoringUpdateRequests() | 337 void CueTimeline::endIgnoringUpdateRequests() |
339 { | 338 { |
340 ASSERT(m_ignoreUpdate); | 339 ASSERT(m_ignoreUpdate); |
341 --m_ignoreUpdate; | 340 --m_ignoreUpdate; |
342 if (!m_ignoreUpdate && mediaElement().inActiveDocument()) | 341 if (!m_ignoreUpdate && mediaElement().inActiveDocument()) |
343 updateActiveCues(mediaElement().currentTime()); | 342 updateActiveCues(mediaElement().currentTime()); |
344 } | 343 } |
345 | 344 |
346 DEFINE_TRACE(CueTimeline) | 345 DEFINE_TRACE(CueTimeline) |
347 { | 346 { |
348 visitor->trace(m_mediaElement); | 347 visitor->trace(m_mediaElement); |
349 } | 348 } |
350 | 349 |
351 } // namespace blink | 350 } // namespace blink |
OLD | NEW |