bool TextTrackCue::operator==(const TextTrackCue& cue) const { if (cueType() != cue.cueType()) return false; if (m_endTime != cue.endTime()) return false; if (m_startTime != cue.startTime()) return false; if (m_content != cue.text()) return false; if (m_settings != cue.cueSettings()) return false; if (m_id != cue.id()) return false; if (m_textPosition != cue.position()) return false; if (m_linePosition != cue.line()) return false; if (m_cueSize != cue.size()) return false; if (align() != cue.align()) return false; return true; }
bool TextTrackCue::isEqual(const TextTrackCue& cue, CueMatchRules match) const { if (cueType() != cue.cueType()) return false; if (match != IgnoreDuration && m_endTime != cue.endTime()) return false; if (m_startTime != cue.startTime()) return false; if (m_content != cue.text()) return false; if (m_settings != cue.cueSettings()) return false; if (m_id != cue.id()) return false; if (m_textPosition != cue.position()) return false; if (m_linePosition != cue.line()) return false; if (m_cueSize != cue.size()) return false; if (align() != cue.align()) return false; return true; }
void MediaControlRootElement::updateTextTrackDisplay() { if (!m_textDisplayContainer) createTextTrackDisplay(); CueList activeCues = toParentMediaElement(m_textDisplayContainer)->currentlyActiveCues(); m_textTrackDisplay->removeChildren(); bool nothingToDisplay = true; for (size_t i = 0; i < activeCues.size(); ++i) { TextTrackCue* cue = activeCues[i].data(); ASSERT(cue->isActive()); if (!cue->track() || cue->track()->mode() != TextTrack::SHOWING) continue; String cueText = cue->text(); if (!cueText.isEmpty()) { if (!nothingToDisplay) m_textTrackDisplay->appendChild(document()->createElement(HTMLNames::brTag, false), ASSERT_NO_EXCEPTION); m_textTrackDisplay->appendChild(document()->createTextNode(cueText), ASSERT_NO_EXCEPTION); nothingToDisplay = false; } } if (!nothingToDisplay) m_textDisplayContainer->show(); else m_textDisplayContainer->hide(); }
void MediaControlTextTrackContainerElement::updateDisplay() { if (!mediaController()->closedCaptionsVisible()) removeChildren(); HTMLMediaElement* mediaElement = parentMediaElement(this); // 1. If the media element is an audio element, or is another playback // mechanism with no rendering area, abort these steps. There is nothing to // render. if (!mediaElement || !mediaElement->isVideo()) return; // 2. Let video be the media element or other playback mechanism. HTMLVideoElement* video = toHTMLVideoElement(mediaElement); // 3. Let output be an empty list of absolutely positioned CSS block boxes. Vector<RefPtr<HTMLDivElement>> output; // 4. If the user agent is exposing a user interface for video, add to // output one or more completely transparent positioned CSS block boxes that // cover the same region as the user interface. // 5. If the last time these rules were run, the user agent was not exposing // a user interface for video, but now it is, let reset be true. Otherwise, // let reset be false. // There is nothing to be done explicitly for 4th and 5th steps, as // everything is handled through CSS. The caption box is on top of the // controls box, in a container set with the -webkit-box display property. // 6. Let tracks be the subset of video's list of text tracks that have as // their rules for updating the text track rendering these rules for // updating the display of WebVTT text tracks, and whose text track mode is // showing or showing by default. // 7. Let cues be an empty list of text track cues. // 8. For each track track in tracks, append to cues all the cues from // track's list of cues that have their text track cue active flag set. CueList activeCues = video->currentlyActiveCues(); // 9. If reset is false, then, for each text track cue cue in cues: if cue's // text track cue display state has a set of CSS boxes, then add those boxes // to output, and remove cue from cues. // There is nothing explicitly to be done here, as all the caching occurs // within the TextTrackCue instance itself. If parameters of the cue change, // the display tree is cleared. // 10. For each text track cue cue in cues that has not yet had // corresponding CSS boxes added to output, in text track cue order, run the // following substeps: for (size_t i = 0; i < activeCues.size(); ++i) { TextTrackCue* cue = activeCues[i].data(); ASSERT(cue->isActive()); if (!cue->track() || !cue->track()->isRendered() || !cue->isActive() || cue->text().isEmpty()) continue; RefPtr<TextTrackCueBox> displayBox = cue->getDisplayTree(m_videoDisplaySize.size()); if (displayBox->hasChildNodes() && !contains(displayBox.get())) { // Note: the display tree of a cue is removed when the active flag of the cue is unset. appendChild(displayBox, ASSERT_NO_EXCEPTION, AttachNow); cue->setFontSize(m_fontSize, m_videoDisplaySize.size(), m_fontSizeIsImportant); } } // 11. Return output. if (hasChildNodes()) { show(); if (mediaElement->requiresTextTrackRepresentation()) { if (!m_textTrackRepresentation) m_textTrackRepresentation = TextTrackRepresentation::create(this); mediaElement->setTextTrackRepresentation(m_textTrackRepresentation.get()); if (Page* page = document().page()) m_textTrackRepresentation->setContentScale(page->deviceScaleFactor()); m_textTrackRepresentation->update(); setInlineStyleProperty(CSSPropertyWidth, m_videoDisplaySize.size().width(), CSSPrimitiveValue::CSS_PX); setInlineStyleProperty(CSSPropertyHeight, m_videoDisplaySize.size().height(), CSSPrimitiveValue::CSS_PX); } } else { hide(); clearTextTrackRepresentation(); } }