static v8::Handle<v8::Value> labelAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) { TextTrack* imp = V8TextTrack::toNative(info.Holder()); return v8String(imp->label(), info.GetIsolate()); }
void MediaControlClosedCaptionsTrackListElement::rebuildTrackListMenu() { #if ENABLE(VIDEO_TRACK) // Remove any existing content. removeChildren(); m_menuItems.clear(); m_trackListHasChanged = false; if (!mediaController()->hasClosedCaptions()) return; HTMLMediaElement* mediaElement = toParentMediaElement(this); if (!mediaElement) return; TextTrackList* trackList = mediaElement->textTracks(); if (!trackList || !trackList->length()) return; Document* doc = document(); RefPtr<Element> captionsSection = doc->createElement(sectionTag, ASSERT_NO_EXCEPTION); RefPtr<Element> captionsHeader = doc->createElement(h3Tag, ASSERT_NO_EXCEPTION); captionsHeader->appendChild(doc->createTextNode(textTrackClosedCaptionsText())); captionsSection->appendChild(captionsHeader); RefPtr<Element> captionsMenuList = doc->createElement(ulTag, ASSERT_NO_EXCEPTION); RefPtr<Element> subtitlesSection = doc->createElement(sectionTag, ASSERT_NO_EXCEPTION); RefPtr<Element> subtitlesHeader = doc->createElement(h3Tag, ASSERT_NO_EXCEPTION); subtitlesHeader->appendChild(doc->createTextNode(textTrackSubtitlesText())); subtitlesSection->appendChild(subtitlesHeader); RefPtr<Element> subtitlesMenuList = doc->createElement(ulTag, ASSERT_NO_EXCEPTION); RefPtr<Element> trackItem; trackItem = doc->createElement(liTag, ASSERT_NO_EXCEPTION); trackItem->appendChild(doc->createTextNode(textTrackOffText())); trackItem->setAttribute(trackIndexAttributeName(), textTracksOffAttrValue, ASSERT_NO_EXCEPTION); captionsMenuList->appendChild(trackItem); m_menuItems.append(trackItem); trackItem = doc->createElement(liTag, ASSERT_NO_EXCEPTION); trackItem->appendChild(doc->createTextNode(textTrackOffText())); trackItem->setAttribute(trackIndexAttributeName(), textTracksOffAttrValue, ASSERT_NO_EXCEPTION); subtitlesMenuList->appendChild(trackItem); m_menuItems.append(trackItem); bool hasCaptions = false; bool hasSubtitles = false; for (unsigned i = 0, length = trackList->length(); i < length; ++i) { TextTrack* track = trackList->item(i); trackItem = doc->createElement(liTag, ASSERT_NO_EXCEPTION); // Add a custom attribute to the <li> element which will allow // us to easily associate the user tapping here with the // track. Since this list is rebuilt if the tracks change, we // should always be in sync. trackItem->setAttribute(trackIndexAttributeName(), String::number(i), ASSERT_NO_EXCEPTION); AtomicString labelText = track->label(); if (labelText.isNull() || labelText.isEmpty()) labelText = displayNameForLanguageLocale(track->language()); if (labelText.isNull() || labelText.isEmpty()) labelText = textTrackNoLabelText(); trackItem->appendChild(doc->createTextNode(labelText)); if (track->kind() == track->captionsKeyword()) { hasCaptions = true; insertTextTrackMenuItemIntoSortedContainer(trackItem, captionsMenuList); } if (track->kind() == track->subtitlesKeyword()) { hasSubtitles = true; insertTextTrackMenuItemIntoSortedContainer(trackItem, subtitlesMenuList); } m_menuItems.append(trackItem); } captionsSection->appendChild(captionsMenuList); subtitlesSection->appendChild(subtitlesMenuList); if (hasCaptions) appendChild(captionsSection); if (hasSubtitles) appendChild(subtitlesSection); updateDisplay(); #endif }