Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2011 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 20 matching lines...) Expand all Loading... | |
| 31 #include "bindings/v8/ExceptionStatePlaceholder.h" | 31 #include "bindings/v8/ExceptionStatePlaceholder.h" |
| 32 #include "core/dom/ExceptionCode.h" | 32 #include "core/dom/ExceptionCode.h" |
| 33 #include "core/events/GenericEventQueue.h" | 33 #include "core/events/GenericEventQueue.h" |
| 34 #include "core/html/HTMLMediaElement.h" | 34 #include "core/html/HTMLMediaElement.h" |
| 35 #include "core/html/TimeRanges.h" | 35 #include "core/html/TimeRanges.h" |
| 36 #include "platform/Clock.h" | 36 #include "platform/Clock.h" |
| 37 #include "wtf/CurrentTime.h" | 37 #include "wtf/CurrentTime.h" |
| 38 #include "wtf/StdLibExtras.h" | 38 #include "wtf/StdLibExtras.h" |
| 39 #include "wtf/text/AtomicString.h" | 39 #include "wtf/text/AtomicString.h" |
| 40 | 40 |
| 41 using namespace WebCore; | |
| 42 using namespace std; | 41 using namespace std; |
| 43 | 42 |
| 43 namespace WebCore { | |
| 44 | |
| 44 PassRefPtrWillBeRawPtr<MediaController> MediaController::create(ExecutionContext * context) | 45 PassRefPtrWillBeRawPtr<MediaController> MediaController::create(ExecutionContext * context) |
| 45 { | 46 { |
| 46 return adoptRefWillBeRefCountedGarbageCollected(new MediaController(context) ); | 47 return adoptRefWillBeRefCountedGarbageCollected(new MediaController(context) ); |
| 47 } | 48 } |
| 48 | 49 |
| 49 MediaController::MediaController(ExecutionContext* context) | 50 MediaController::MediaController(ExecutionContext* context) |
| 50 : m_paused(false) | 51 : m_paused(false) |
| 51 , m_defaultPlaybackRate(1) | 52 , m_defaultPlaybackRate(1) |
| 52 , m_volume(1) | 53 , m_volume(1) |
| 53 , m_position(MediaPlayer::invalidTime()) | 54 , m_position(MediaPlayer::invalidTime()) |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 66 | 67 |
| 67 MediaController::~MediaController() | 68 MediaController::~MediaController() |
| 68 { | 69 { |
| 69 } | 70 } |
| 70 | 71 |
| 71 void MediaController::addMediaElement(HTMLMediaElement* element) | 72 void MediaController::addMediaElement(HTMLMediaElement* element) |
| 72 { | 73 { |
| 73 ASSERT(element); | 74 ASSERT(element); |
| 74 ASSERT(!m_mediaElements.contains(element)); | 75 ASSERT(!m_mediaElements.contains(element)); |
| 75 | 76 |
| 76 m_mediaElements.append(element); | 77 m_mediaElements.appendOrMoveToLast(element); |
|
Mads Ager (chromium)
2014/06/06 08:49:08
You can just use add here. There is an assert abov
sof
2014/06/06 12:36:59
Done.
| |
| 77 bringElementUpToSpeed(element); | 78 bringElementUpToSpeed(element); |
| 78 } | 79 } |
| 79 | 80 |
| 80 void MediaController::removeMediaElement(HTMLMediaElement* element) | 81 void MediaController::removeMediaElement(HTMLMediaElement* element) |
| 81 { | 82 { |
| 82 ASSERT(element); | 83 ASSERT(element); |
| 83 ASSERT(m_mediaElements.contains(element)); | 84 ASSERT(m_mediaElements.contains(element)); |
| 84 m_mediaElements.remove(m_mediaElements.find(element)); | 85 m_mediaElements.remove(m_mediaElements.find(element)); |
| 85 } | 86 } |
| 86 | 87 |
| 87 PassRefPtr<TimeRanges> MediaController::buffered() const | 88 PassRefPtr<TimeRanges> MediaController::buffered() const |
| 88 { | 89 { |
| 89 if (m_mediaElements.isEmpty()) | 90 if (m_mediaElements.isEmpty()) |
| 90 return TimeRanges::create(); | 91 return TimeRanges::create(); |
| 91 | 92 |
| 92 // The buffered attribute must return a new static normalized TimeRanges obj ect that represents | 93 // The buffered attribute must return a new static normalized TimeRanges obj ect that represents |
| 93 // the intersection of the ranges of the media resources of the slaved media elements that the | 94 // the intersection of the ranges of the media resources of the slaved media elements that the |
| 94 // user agent has buffered, at the time the attribute is evaluated. | 95 // user agent has buffered, at the time the attribute is evaluated. |
| 95 RefPtr<TimeRanges> bufferedRanges = m_mediaElements.first()->buffered(); | 96 MediaElementSequence::const_iterator it = m_mediaElements.begin(); |
| 96 for (size_t index = 1; index < m_mediaElements.size(); ++index) | 97 RefPtr<TimeRanges> bufferedRanges = (*it)->buffered(); |
| 97 bufferedRanges->intersectWith(m_mediaElements[index]->buffered().get()); | 98 for (++it; it != m_mediaElements.end(); ++it) |
| 99 bufferedRanges->intersectWith((*it)->buffered().get()); | |
| 98 return bufferedRanges; | 100 return bufferedRanges; |
| 99 } | 101 } |
| 100 | 102 |
| 101 PassRefPtr<TimeRanges> MediaController::seekable() const | 103 PassRefPtr<TimeRanges> MediaController::seekable() const |
| 102 { | 104 { |
| 103 if (m_mediaElements.isEmpty()) | 105 if (m_mediaElements.isEmpty()) |
| 104 return TimeRanges::create(); | 106 return TimeRanges::create(); |
| 105 | 107 |
| 106 // The seekable attribute must return a new static normalized TimeRanges obj ect that represents | 108 // The seekable attribute must return a new static normalized TimeRanges obj ect that represents |
| 107 // the intersection of the ranges of the media resources of the slaved media elements that the | 109 // the intersection of the ranges of the media resources of the slaved media elements that the |
| 108 // user agent is able to seek to, at the time the attribute is evaluated. | 110 // user agent is able to seek to, at the time the attribute is evaluated. |
| 109 RefPtr<TimeRanges> seekableRanges = m_mediaElements.first()->seekable(); | 111 MediaElementSequence::const_iterator it = m_mediaElements.begin(); |
| 110 for (size_t index = 1; index < m_mediaElements.size(); ++index) | 112 RefPtr<TimeRanges> seekableRanges = (*it)->seekable(); |
| 111 seekableRanges->intersectWith(m_mediaElements[index]->seekable().get()); | 113 for (++it; it != m_mediaElements.end(); ++it) |
| 114 seekableRanges->intersectWith((*it)->seekable().get()); | |
| 112 return seekableRanges; | 115 return seekableRanges; |
| 113 } | 116 } |
| 114 | 117 |
| 115 PassRefPtr<TimeRanges> MediaController::played() | 118 PassRefPtr<TimeRanges> MediaController::played() |
| 116 { | 119 { |
| 117 if (m_mediaElements.isEmpty()) | 120 if (m_mediaElements.isEmpty()) |
| 118 return TimeRanges::create(); | 121 return TimeRanges::create(); |
| 119 | 122 |
| 120 // The played attribute must return a new static normalized TimeRanges objec t that represents | 123 // The played attribute must return a new static normalized TimeRanges objec t that represents |
| 121 // the union of the ranges of the media resources of the slaved media elemen ts that the | 124 // the union of the ranges of the media resources of the slaved media elemen ts that the |
| 122 // user agent has so far rendered, at the time the attribute is evaluated. | 125 // user agent has so far rendered, at the time the attribute is evaluated. |
| 123 RefPtr<TimeRanges> playedRanges = m_mediaElements.first()->played(); | 126 MediaElementSequence::const_iterator it = m_mediaElements.begin(); |
| 124 for (size_t index = 1; index < m_mediaElements.size(); ++index) | 127 RefPtr<TimeRanges> playedRanges = (*it)->played(); |
| 125 playedRanges->unionWith(m_mediaElements[index]->played().get()); | 128 for (++it; it != m_mediaElements.end(); ++it) |
| 129 playedRanges->unionWith((*it)->played().get()); | |
| 126 return playedRanges; | 130 return playedRanges; |
| 127 } | 131 } |
| 128 | 132 |
| 129 double MediaController::duration() const | 133 double MediaController::duration() const |
| 130 { | 134 { |
| 131 // FIXME: Investigate caching the maximum duration and only updating the cac hed value | 135 // FIXME: Investigate caching the maximum duration and only updating the cac hed value |
| 132 // when the slaved media elements' durations change. | 136 // when the slaved media elements' durations change. |
| 133 double maxDuration = 0; | 137 double maxDuration = 0; |
| 134 for (size_t index = 0; index < m_mediaElements.size(); ++index) { | 138 for (MediaElementSequence::const_iterator it = m_mediaElements.begin(); it ! = m_mediaElements.end(); ++it) { |
| 135 double duration = m_mediaElements[index]->duration(); | 139 double duration = (*it)->duration(); |
| 136 if (std::isnan(duration)) | 140 if (std::isnan(duration)) |
| 137 continue; | 141 continue; |
| 138 maxDuration = max(maxDuration, duration); | 142 maxDuration = max(maxDuration, duration); |
| 139 } | 143 } |
| 140 return maxDuration; | 144 return maxDuration; |
| 141 } | 145 } |
| 142 | 146 |
| 143 double MediaController::currentTime() const | 147 double MediaController::currentTime() const |
| 144 { | 148 { |
| 145 if (m_mediaElements.isEmpty()) | 149 if (m_mediaElements.isEmpty()) |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 163 | 167 |
| 164 // If the new playback position is greater than the media controller duratio n, then set it | 168 // If the new playback position is greater than the media controller duratio n, then set it |
| 165 // to the media controller duration. | 169 // to the media controller duration. |
| 166 time = min(time, duration()); | 170 time = min(time, duration()); |
| 167 | 171 |
| 168 // Set the media controller position to the new playback position. | 172 // Set the media controller position to the new playback position. |
| 169 m_position = time; | 173 m_position = time; |
| 170 m_clock->setCurrentTime(time); | 174 m_clock->setCurrentTime(time); |
| 171 | 175 |
| 172 // Seek each slaved media element to the new playback position relative to t he media element timeline. | 176 // Seek each slaved media element to the new playback position relative to t he media element timeline. |
| 173 for (size_t index = 0; index < m_mediaElements.size(); ++index) | 177 for (MediaElementSequence::const_iterator it = m_mediaElements.begin(); it ! = m_mediaElements.end(); ++it) |
| 174 m_mediaElements[index]->seek(time, exceptionState); | 178 (*it)->seek(time, exceptionState); |
| 175 | 179 |
| 176 scheduleTimeupdateEvent(); | 180 scheduleTimeupdateEvent(); |
| 177 } | 181 } |
| 178 | 182 |
| 179 void MediaController::unpause() | 183 void MediaController::unpause() |
| 180 { | 184 { |
| 181 // When the unpause() method is invoked, if the MediaController is a paused media controller, | 185 // When the unpause() method is invoked, if the MediaController is a paused media controller, |
| 182 if (!m_paused) | 186 if (!m_paused) |
| 183 return; | 187 return; |
| 184 | 188 |
| 185 // the user agent must change the MediaController into a playing media contr oller, | 189 // the user agent must change the MediaController into a playing media contr oller, |
| 186 m_paused = false; | 190 m_paused = false; |
| 187 // queue a task to fire a simple event named play at the MediaController, | 191 // queue a task to fire a simple event named play at the MediaController, |
| 188 scheduleEvent(EventTypeNames::play); | 192 scheduleEvent(EventTypeNames::play); |
| 189 // and then report the controller state of the MediaController. | 193 // and then report the controller state of the MediaController. |
| 190 reportControllerState(); | 194 reportControllerState(); |
| 191 } | 195 } |
| 192 | 196 |
| 193 void MediaController::play() | 197 void MediaController::play() |
| 194 { | 198 { |
| 195 // When the play() method is invoked, the user agent must invoke the play me thod of each | 199 // When the play() method is invoked, the user agent must invoke the play me thod of each |
| 196 // slaved media element in turn, | 200 // slaved media element in turn, |
| 197 for (size_t index = 0; index < m_mediaElements.size(); ++index) | 201 for (MediaElementSequence::const_iterator it = m_mediaElements.begin(); it ! = m_mediaElements.end(); ++it) |
| 198 m_mediaElements[index]->play(); | 202 (*it)->play(); |
| 199 | 203 |
| 200 // and then invoke the unpause method of the MediaController. | 204 // and then invoke the unpause method of the MediaController. |
| 201 unpause(); | 205 unpause(); |
| 202 } | 206 } |
| 203 | 207 |
| 204 void MediaController::pause() | 208 void MediaController::pause() |
| 205 { | 209 { |
| 206 // When the pause() method is invoked, if the MediaController is a playing m edia controller, | 210 // When the pause() method is invoked, if the MediaController is a playing m edia controller, |
| 207 if (m_paused) | 211 if (m_paused) |
| 208 return; | 212 return; |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 235 | 239 |
| 236 void MediaController::setPlaybackRate(double rate) | 240 void MediaController::setPlaybackRate(double rate) |
| 237 { | 241 { |
| 238 if (m_clock->playRate() == rate) | 242 if (m_clock->playRate() == rate) |
| 239 return; | 243 return; |
| 240 | 244 |
| 241 // The playbackRate attribute, on setting, must set the MediaController's me dia controller | 245 // The playbackRate attribute, on setting, must set the MediaController's me dia controller |
| 242 // playback rate to the new value, | 246 // playback rate to the new value, |
| 243 m_clock->setPlayRate(rate); | 247 m_clock->setPlayRate(rate); |
| 244 | 248 |
| 245 for (size_t index = 0; index < m_mediaElements.size(); ++index) | 249 for (MediaElementSequence::const_iterator it = m_mediaElements.begin(); it ! = m_mediaElements.end(); ++it) |
| 246 m_mediaElements[index]->updatePlaybackRate(); | 250 (*it)->updatePlaybackRate(); |
| 247 | 251 |
| 248 // then queue a task to fire a simple event named ratechange at the MediaCon troller. | 252 // then queue a task to fire a simple event named ratechange at the MediaCon troller. |
| 249 scheduleEvent(EventTypeNames::ratechange); | 253 scheduleEvent(EventTypeNames::ratechange); |
| 250 } | 254 } |
| 251 | 255 |
| 252 void MediaController::setVolume(double level, ExceptionState& exceptionState) | 256 void MediaController::setVolume(double level, ExceptionState& exceptionState) |
| 253 { | 257 { |
| 254 if (m_volume == level) | 258 if (m_volume == level) |
| 255 return; | 259 return; |
| 256 | 260 |
| 257 // If the new value is outside the range 0.0 to 1.0 inclusive, then, on sett ing, an | 261 // If the new value is outside the range 0.0 to 1.0 inclusive, then, on sett ing, an |
| 258 // IndexSizeError exception must be raised instead. | 262 // IndexSizeError exception must be raised instead. |
| 259 if (level < 0 || level > 1) { | 263 if (level < 0 || level > 1) { |
| 260 exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::inde xOutsideRange("volume", level, 0.0, ExceptionMessages::InclusiveBound, 1.0, Exce ptionMessages::InclusiveBound)); | 264 exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::inde xOutsideRange("volume", level, 0.0, ExceptionMessages::InclusiveBound, 1.0, Exce ptionMessages::InclusiveBound)); |
| 261 return; | 265 return; |
| 262 } | 266 } |
| 263 | 267 |
| 264 // The volume attribute, on setting, if the new value is in the range 0.0 to 1.0 inclusive, | 268 // The volume attribute, on setting, if the new value is in the range 0.0 to 1.0 inclusive, |
| 265 // must set the MediaController's media controller volume multiplier to the new value | 269 // must set the MediaController's media controller volume multiplier to the new value |
| 266 m_volume = level; | 270 m_volume = level; |
| 267 | 271 |
| 268 // and queue a task to fire a simple event named volumechange at the MediaCo ntroller. | 272 // and queue a task to fire a simple event named volumechange at the MediaCo ntroller. |
| 269 scheduleEvent(EventTypeNames::volumechange); | 273 scheduleEvent(EventTypeNames::volumechange); |
| 270 | 274 |
| 271 for (size_t index = 0; index < m_mediaElements.size(); ++index) | 275 for (MediaElementSequence::const_iterator it = m_mediaElements.begin(); it ! = m_mediaElements.end(); ++it) |
| 272 m_mediaElements[index]->updateVolume(); | 276 (*it)->updateVolume(); |
| 273 } | 277 } |
| 274 | 278 |
| 275 void MediaController::setMuted(bool flag) | 279 void MediaController::setMuted(bool flag) |
| 276 { | 280 { |
| 277 if (m_muted == flag) | 281 if (m_muted == flag) |
| 278 return; | 282 return; |
| 279 | 283 |
| 280 // The muted attribute, on setting, must set the MediaController's media con troller mute override | 284 // The muted attribute, on setting, must set the MediaController's media con troller mute override |
| 281 // to the new value | 285 // to the new value |
| 282 m_muted = flag; | 286 m_muted = flag; |
| 283 | 287 |
| 284 // and queue a task to fire a simple event named volumechange at the MediaCo ntroller. | 288 // and queue a task to fire a simple event named volumechange at the MediaCo ntroller. |
| 285 scheduleEvent(EventTypeNames::volumechange); | 289 scheduleEvent(EventTypeNames::volumechange); |
| 286 | 290 |
| 287 for (size_t index = 0; index < m_mediaElements.size(); ++index) | 291 for (MediaElementSequence::const_iterator it = m_mediaElements.begin(); it ! = m_mediaElements.end(); ++it) |
| 288 m_mediaElements[index]->updateVolume(); | 292 (*it)->updateVolume(); |
| 289 } | 293 } |
| 290 | 294 |
| 291 static const AtomicString& playbackStateWaiting() | 295 static const AtomicString& playbackStateWaiting() |
| 292 { | 296 { |
| 293 DEFINE_STATIC_LOCAL(AtomicString, waiting, ("waiting", AtomicString::Constru ctFromLiteral)); | 297 DEFINE_STATIC_LOCAL(AtomicString, waiting, ("waiting", AtomicString::Constru ctFromLiteral)); |
| 294 return waiting; | 298 return waiting; |
| 295 } | 299 } |
| 296 | 300 |
| 297 static const AtomicString& playbackStatePlaying() | 301 static const AtomicString& playbackStatePlaying() |
| 298 { | 302 { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 350 { | 354 { |
| 351 ReadyState oldReadyState = m_readyState; | 355 ReadyState oldReadyState = m_readyState; |
| 352 ReadyState newReadyState; | 356 ReadyState newReadyState; |
| 353 | 357 |
| 354 if (m_mediaElements.isEmpty()) { | 358 if (m_mediaElements.isEmpty()) { |
| 355 // If the MediaController has no slaved media elements, let new readines s state be 0. | 359 // If the MediaController has no slaved media elements, let new readines s state be 0. |
| 356 newReadyState = HTMLMediaElement::HAVE_NOTHING; | 360 newReadyState = HTMLMediaElement::HAVE_NOTHING; |
| 357 } else { | 361 } else { |
| 358 // Otherwise, let it have the lowest value of the readyState IDL attribu tes of all of its | 362 // Otherwise, let it have the lowest value of the readyState IDL attribu tes of all of its |
| 359 // slaved media elements. | 363 // slaved media elements. |
| 360 newReadyState = m_mediaElements.first()->readyState(); | 364 MediaElementSequence::const_iterator it = m_mediaElements.begin(); |
| 361 for (size_t index = 1; index < m_mediaElements.size(); ++index) | 365 newReadyState = (*it)->readyState(); |
| 362 newReadyState = min(newReadyState, m_mediaElements[index]->readyStat e()); | 366 for (++it; it != m_mediaElements.end(); ++it) |
| 367 newReadyState = min(newReadyState, (*it)->readyState()); | |
| 363 } | 368 } |
| 364 | 369 |
| 365 if (newReadyState == oldReadyState) | 370 if (newReadyState == oldReadyState) |
| 366 return; | 371 return; |
| 367 | 372 |
| 368 // If the MediaController's most recently reported readiness state is greate r than new readiness | 373 // If the MediaController's most recently reported readiness state is greate r than new readiness |
| 369 // state then queue a task to fire a simple event at the MediaController obj ect, whose name is the | 374 // state then queue a task to fire a simple event at the MediaController obj ect, whose name is the |
| 370 // event name corresponding to the value of new readiness state given in the table below. [omitted] | 375 // event name corresponding to the value of new readiness state given in the table below. [omitted] |
| 371 if (oldReadyState > newReadyState) { | 376 if (oldReadyState > newReadyState) { |
| 372 scheduleEvent(eventNameForReadyState(newReadyState)); | 377 scheduleEvent(eventNameForReadyState(newReadyState)); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 460 scheduleEvent(eventName); | 465 scheduleEvent(eventName); |
| 461 | 466 |
| 462 // Let the MediaController's most recently reported playback state be new pl ayback state. | 467 // Let the MediaController's most recently reported playback state be new pl ayback state. |
| 463 m_playbackState = newPlaybackState; | 468 m_playbackState = newPlaybackState; |
| 464 | 469 |
| 465 updateMediaElements(); | 470 updateMediaElements(); |
| 466 } | 471 } |
| 467 | 472 |
| 468 void MediaController::updateMediaElements() | 473 void MediaController::updateMediaElements() |
| 469 { | 474 { |
| 470 for (size_t index = 0; index < m_mediaElements.size(); ++index) | 475 for (MediaElementSequence::const_iterator it = m_mediaElements.begin(); it ! = m_mediaElements.end(); ++it) |
| 471 m_mediaElements[index]->updatePlayState(); | 476 (*it)->updatePlayState(); |
| 472 } | 477 } |
| 473 | 478 |
| 474 void MediaController::bringElementUpToSpeed(HTMLMediaElement* element) | 479 void MediaController::bringElementUpToSpeed(HTMLMediaElement* element) |
| 475 { | 480 { |
| 476 ASSERT(element); | 481 ASSERT(element); |
| 477 ASSERT(m_mediaElements.contains(element)); | 482 ASSERT(m_mediaElements.contains(element)); |
| 478 | 483 |
| 479 // When the user agent is to bring a media element up to speed with its new media controller, | 484 // When the user agent is to bring a media element up to speed with its new media controller, |
| 480 // it must seek that media element to the MediaController's media controller position relative | 485 // it must seek that media element to the MediaController's media controller position relative |
| 481 // to the media element's timeline. | 486 // to the media element's timeline. |
| 482 element->seek(currentTime(), IGNORE_EXCEPTION); | 487 element->seek(currentTime(), IGNORE_EXCEPTION); |
| 483 } | 488 } |
| 484 | 489 |
| 485 bool MediaController::isRestrained() const | 490 bool MediaController::isRestrained() const |
| 486 { | 491 { |
| 487 ASSERT(!m_mediaElements.isEmpty()); | 492 ASSERT(!m_mediaElements.isEmpty()); |
| 488 | 493 |
| 489 // A MediaController is a restrained media controller if the MediaController is a playing media | 494 // A MediaController is a restrained media controller if the MediaController is a playing media |
| 490 // controller, | 495 // controller, |
| 491 if (m_paused) | 496 if (m_paused) |
| 492 return false; | 497 return false; |
| 493 | 498 |
| 494 bool anyAutoplayingAndPaused = false; | 499 bool anyAutoplayingAndPaused = false; |
| 495 bool allPaused = true; | 500 bool allPaused = true; |
| 496 for (size_t index = 0; index < m_mediaElements.size(); ++index) { | 501 for (MediaElementSequence::const_iterator it = m_mediaElements.begin(); it ! = m_mediaElements.end(); ++it) { |
| 497 HTMLMediaElement* element = m_mediaElements[index]; | 502 HTMLMediaElement* element = *it; |
| 498 | 503 |
| 499 // and none of its slaved media elements are blocked media elements, | 504 // and none of its slaved media elements are blocked media elements, |
| 500 if (element->isBlocked()) | 505 if (element->isBlocked()) |
| 501 return false; | 506 return false; |
| 502 | 507 |
| 503 if (element->isAutoplaying() && element->paused()) | 508 if (element->isAutoplaying() && element->paused()) |
| 504 anyAutoplayingAndPaused = true; | 509 anyAutoplayingAndPaused = true; |
| 505 | 510 |
| 506 if (!element->paused()) | 511 if (!element->paused()) |
| 507 allPaused = false; | 512 allPaused = false; |
| 508 } | 513 } |
| 509 | 514 |
| 510 // but either at least one of its slaved media elements whose autoplaying fl ag is true still has | 515 // but either at least one of its slaved media elements whose autoplaying fl ag is true still has |
| 511 // its paused attribute set to true, or, all of its slaved media elements ha ve their paused | 516 // its paused attribute set to true, or, all of its slaved media elements ha ve their paused |
| 512 // attribute set to true. | 517 // attribute set to true. |
| 513 return anyAutoplayingAndPaused || allPaused; | 518 return anyAutoplayingAndPaused || allPaused; |
| 514 } | 519 } |
| 515 | 520 |
| 516 bool MediaController::isBlocked() const | 521 bool MediaController::isBlocked() const |
| 517 { | 522 { |
| 518 ASSERT(!m_mediaElements.isEmpty()); | 523 ASSERT(!m_mediaElements.isEmpty()); |
| 519 | 524 |
| 520 // A MediaController is a blocked media controller if the MediaController is a paused media | 525 // A MediaController is a blocked media controller if the MediaController is a paused media |
| 521 // controller, | 526 // controller, |
| 522 if (m_paused) | 527 if (m_paused) |
| 523 return true; | 528 return true; |
| 524 | 529 |
| 525 bool allPaused = true; | 530 bool allPaused = true; |
| 526 for (size_t index = 0; index < m_mediaElements.size(); ++index) { | 531 for (MediaElementSequence::const_iterator it = m_mediaElements.begin(); it ! = m_mediaElements.end(); ++it) { |
| 527 HTMLMediaElement* element = m_mediaElements[index]; | 532 HTMLMediaElement* element = *it; |
| 528 | 533 |
| 529 // or if any of its slaved media elements are blocked media elements, | 534 // or if any of its slaved media elements are blocked media elements, |
| 530 if (element->isBlocked()) | 535 if (element->isBlocked()) |
| 531 return true; | 536 return true; |
| 532 | 537 |
| 533 // or if any of its slaved media elements whose autoplaying flag is true still have their | 538 // or if any of its slaved media elements whose autoplaying flag is true still have their |
| 534 // paused attribute set to true, | 539 // paused attribute set to true, |
| 535 if (element->isAutoplaying() && element->paused()) | 540 if (element->isAutoplaying() && element->paused()) |
| 536 return true; | 541 return true; |
| 537 | 542 |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 548 // If the ... media controller playback rate is positive or zero | 553 // If the ... media controller playback rate is positive or zero |
| 549 if (m_clock->playRate() < 0) | 554 if (m_clock->playRate() < 0) |
| 550 return false; | 555 return false; |
| 551 | 556 |
| 552 // [and] all of the MediaController's slaved media elements have ended playb ack ... let new | 557 // [and] all of the MediaController's slaved media elements have ended playb ack ... let new |
| 553 // playback state be ended. | 558 // playback state be ended. |
| 554 if (m_mediaElements.isEmpty()) | 559 if (m_mediaElements.isEmpty()) |
| 555 return false; | 560 return false; |
| 556 | 561 |
| 557 bool allHaveEnded = true; | 562 bool allHaveEnded = true; |
| 558 for (size_t index = 0; index < m_mediaElements.size(); ++index) { | 563 for (MediaElementSequence::const_iterator it = m_mediaElements.begin(); it ! = m_mediaElements.end(); ++it) { |
| 559 if (!m_mediaElements[index]->ended()) | 564 if (!(*it)->ended()) |
| 560 allHaveEnded = false; | 565 allHaveEnded = false; |
| 561 } | 566 } |
| 562 return allHaveEnded; | 567 return allHaveEnded; |
| 563 } | 568 } |
| 564 | 569 |
| 565 void MediaController::scheduleEvent(const AtomicString& eventName) | 570 void MediaController::scheduleEvent(const AtomicString& eventName) |
| 566 { | 571 { |
| 567 m_pendingEventsQueue->enqueueEvent(Event::createCancelable(eventName)); | 572 m_pendingEventsQueue->enqueueEvent(Event::createCancelable(eventName)); |
| 568 } | 573 } |
| 569 | 574 |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 598 { | 603 { |
| 599 double now = WTF::currentTime(); | 604 double now = WTF::currentTime(); |
| 600 double timedelta = now - m_previousTimeupdateTime; | 605 double timedelta = now - m_previousTimeupdateTime; |
| 601 | 606 |
| 602 if (timedelta < maxTimeupdateEventFrequency) | 607 if (timedelta < maxTimeupdateEventFrequency) |
| 603 return; | 608 return; |
| 604 | 609 |
| 605 scheduleEvent(EventTypeNames::timeupdate); | 610 scheduleEvent(EventTypeNames::timeupdate); |
| 606 m_previousTimeupdateTime = now; | 611 m_previousTimeupdateTime = now; |
| 607 } | 612 } |
| 613 | |
| 614 void MediaController::trace(Visitor* visitor) | |
| 615 { | |
| 616 visitor->trace(m_mediaElements); | |
| 617 EventTargetWithInlineData::trace(visitor); | |
| 618 } | |
| 619 | |
| 620 } | |
| OLD | NEW |