32 #define NOT_ATTACHED_ERROR \ 33 JsError::DOMException(InvalidStateError, \ 34 "The video has been detached from the MediaPlayer") 35 #define CHECK_ATTACHED() \ 39 return NOT_ATTACHED_ERROR 42 const std::string&
name,
52 clock_(&util::Clock::Instance),
53 default_playback_rate_(1) {
60 HTMLMediaElement::~HTMLMediaElement() {
69 tracer->
Trace(&media_source_);
76 Element::RemoveAttribute(attr);
95 if (!media_keys && !media_source_)
99 const std::string key_system = media_keys ? media_keys->key_system :
"";
123 if (!support.supported)
125 else if (!support.smooth)
142 : std::vector<media::BufferedRange>{});
148 if (std::isfinite(duration))
149 ranges.emplace_back(0, duration);
154 return media_source_ ? media_source_->url : src_;
163 media_source_->CloseMediaSource();
164 media_source_.reset();
165 }
else if (!src_.empty()) {
182 "Error attaching to MediaPlayer");
184 media_source_->OpenMediaSource(
this,
player_);
191 "Given src= URL is unsupported");
218 if (!std::isfinite(rate)) {
227 return default_playback_rate_;
231 if (!std::isfinite(rate)) {
235 default_playback_rate_ = rate;
255 if (volume < 0 || volume > 1) {
259 "The volume provided (%f) is outside the range [0, 1].", volume));
320 ScheduleEvent<events::Event>(EventType::LoadedMetaData);
324 ScheduleEvent<events::Event>(EventType::LoadedData);
328 ScheduleEvent<events::Event>(EventType::CanPlay);
332 ScheduleEvent<events::Event>(EventType::CanPlayThrough);
338 ScheduleEvent<events::Event>(EventType::Waiting);
341 ScheduleEvent<events::Event>(EventType::ReadyStateChange);
344 void HTMLMediaElement::OnPlaybackStateChanged(
348 ScheduleEvent<events::Event>(EventType::Emptied);
351 ScheduleEvent<events::Event>(EventType::Pause);
354 ScheduleEvent<events::Event>(EventType::Waiting);
357 ScheduleEvent<events::Event>(EventType::Playing);
360 ScheduleEvent<events::Event>(EventType::Ended);
374 ScheduleEvent<events::Event>(EventType::Seeked);
377 void HTMLMediaElement::OnPlaybackRateChanged(
double old_rate,
double new_rate) {
378 ScheduleEvent<events::Event>(EventType::RateChange);
381 void HTMLMediaElement::OnError(
const std::string&
error) {
388 ScheduleEvent<events::Event>(EventType::Error);
391 void HTMLMediaElement::OnPlay() {
392 ScheduleEvent<events::Event>(EventType::Play);
395 void HTMLMediaElement::OnSeeking() {
396 ScheduleEvent<events::Event>(EventType::Seeking);
399 void HTMLMediaElement::OnWaitingForKey() {
400 ScheduleEvent<events::Event>(EventType::WaitingForKey);
438 AddGenericProperty(
"defaultPlaybackRate",
453 NotImplemented(
"crossOrigin");
454 NotImplemented(
"networkState");
455 NotImplemented(
"preload");
456 NotImplemented(
"getStartDate");
457 NotImplemented(
"playable");
458 NotImplemented(
"mediaGroup");
459 NotImplemented(
"controller");
460 NotImplemented(
"controls");
std::string StringPrintf(const char *format,...)
void Trace(memory::HeapTracer *tracer) const override
void Trace(const Traceable *ptr)
static Promise Rejected(const js::JsError &error)
T value_or(U &&default_value) const &
static JsError TypeError(const std::string &message)
static JsError DOMException(ExceptionCode code)
static Promise Resolved()
void AddListenerField(EventType type, Listener *on_field)