📄 rendermedia.cpp
字号:
} void RenderMedia::updateFromElement(){ updateControls();} void RenderMedia::updateControls(){ HTMLMediaElement* media = mediaElement(); if (!media->controls() || !media->inActiveDocument()) { if (m_controlsShadowRoot) { m_controlsShadowRoot->detach(); m_panel = 0; m_muteButton = 0; m_playButton = 0; m_timelineContainer = 0; m_timeline = 0; m_seekBackButton = 0; m_seekForwardButton = 0; m_currentTimeDisplay = 0; m_timeRemainingDisplay = 0; m_fullscreenButton = 0; m_controlsShadowRoot = 0; } m_opacityAnimationTo = 1.0f; m_opacityAnimationTimer.stop(); m_timeUpdateTimer.stop(); return; } if (!m_controlsShadowRoot) { createControlsShadowRoot(); createPanel(); createMuteButton(); createPlayButton(); createTimelineContainer(); createTimeline(); createSeekBackButton(); createSeekForwardButton(); createCurrentTimeDisplay(); createTimeRemainingDisplay(); createFullscreenButton(); } if (media->canPlay()) { if (m_timeUpdateTimer.isActive()) m_timeUpdateTimer.stop(); } else if (style()->visibility() == VISIBLE && m_timeline && m_timeline->renderer() && m_timeline->renderer()->style()->display() != NONE ) { m_timeUpdateTimer.startRepeating(cTimeUpdateRepeatDelay); } m_previousVisible = style()->visibility(); if (m_muteButton) m_muteButton->update(); if (m_playButton) m_playButton->update(); if (m_timeline) m_timeline->update(); if (m_seekBackButton) m_seekBackButton->update(); if (m_seekForwardButton) m_seekForwardButton->update(); if (m_fullscreenButton) m_fullscreenButton->update(); updateTimeDisplay(); updateControlVisibility();}void RenderMedia::timeUpdateTimerFired(Timer<RenderMedia>*){ if (m_timeline) m_timeline->update(false); updateTimeDisplay();} String RenderMedia::formatTime(float time){ if (!isfinite(time)) time = 0; int seconds = (int)fabsf(time); int hours = seconds / (60 * 60); int minutes = (seconds / 60) % 60; seconds %= 60; if (hours) { if (hours > 9) return String::format("%s%02d:%02d:%02d", (time < 0 ? "-" : ""), hours, minutes, seconds); else return String::format("%s%01d:%02d:%02d", (time < 0 ? "-" : ""), hours, minutes, seconds); } else return String::format("%s%02d:%02d", (time < 0 ? "-" : ""), minutes, seconds);}void RenderMedia::updateTimeDisplay(){ if (!m_currentTimeDisplay || !m_currentTimeDisplay->renderer() || m_currentTimeDisplay->renderer()->style()->display() == NONE || style()->visibility() != VISIBLE) return; float now = mediaElement()->currentTime(); float duration = mediaElement()->duration(); String timeString = formatTime(now); ExceptionCode ec; m_currentTimeDisplay->setInnerText(timeString, ec); timeString = formatTime(now - duration); m_timeRemainingDisplay->setInnerText(timeString, ec);}void RenderMedia::updateControlVisibility() { if (!m_panel || !m_panel->renderer()) return; // Don't fade for audio controls. HTMLMediaElement* media = mediaElement(); if (!media->hasVideo()) return; // do fading manually, css animations don't work well with shadow trees bool visible = style()->visibility() == VISIBLE && (m_mouseOver || media->canPlay()); if (visible == (m_opacityAnimationTo > 0)) return; if (style()->visibility() != m_previousVisible) { // don't fade gradually if it the element has just changed visibility m_previousVisible = style()->visibility(); m_opacityAnimationTo = m_previousVisible == VISIBLE ? 1.0f : 0; changeOpacity(m_panel.get(), m_opacityAnimationTo); return; } if (visible) { m_opacityAnimationFrom = m_panel->renderer()->style()->opacity(); m_opacityAnimationTo = 1.0f; } else { m_opacityAnimationFrom = m_panel->renderer()->style()->opacity(); m_opacityAnimationTo = 0; } m_opacityAnimationStartTime = currentTime(); m_opacityAnimationTimer.startRepeating(cOpacityAnimationRepeatDelay);} void RenderMedia::changeOpacity(HTMLElement* e, float opacity) { if (!e || !e->renderer() || !e->renderer()->style()) return; RefPtr<RenderStyle> s = RenderStyle::clone(e->renderer()->style()); s->setOpacity(opacity); // z-index can't be auto if opacity is used s->setZIndex(0); e->renderer()->setStyle(s.release());} void RenderMedia::opacityAnimationTimerFired(Timer<RenderMedia>*){ double time = currentTime() - m_opacityAnimationStartTime; if (time >= cOpacityAnimationDuration) { time = cOpacityAnimationDuration; m_opacityAnimationTimer.stop(); } float opacity = narrowPrecisionToFloat(m_opacityAnimationFrom + (m_opacityAnimationTo - m_opacityAnimationFrom) * time / cOpacityAnimationDuration); changeOpacity(m_panel.get(), opacity);}void RenderMedia::forwardEvent(Event* event){ if (event->isMouseEvent() && m_controlsShadowRoot) { MouseEvent* mouseEvent = static_cast<MouseEvent*>(event); IntPoint point(mouseEvent->pageX(), mouseEvent->pageY()); if (m_muteButton && m_muteButton->hitTest(point)) m_muteButton->defaultEventHandler(event); if (m_playButton && m_playButton->hitTest(point)) m_playButton->defaultEventHandler(event); if (m_seekBackButton && m_seekBackButton->hitTest(point)) m_seekBackButton->defaultEventHandler(event); if (m_seekForwardButton && m_seekForwardButton->hitTest(point)) m_seekForwardButton->defaultEventHandler(event); if (m_timeline && m_timeline->hitTest(point)) m_timeline->defaultEventHandler(event); if (m_fullscreenButton && m_fullscreenButton->hitTest(point)) m_fullscreenButton->defaultEventHandler(event); if (event->type() == eventNames().mouseoverEvent) { m_mouseOver = true; updateControlVisibility(); } if (event->type() == eventNames().mouseoutEvent) { // When the scrollbar thumb captures mouse events, we should treat the mouse as still being over our renderer if the new target is a descendant Node* mouseOverNode = mouseEvent->relatedTarget() ? mouseEvent->relatedTarget()->toNode() : 0; RenderObject* mouseOverRenderer = mouseOverNode ? mouseOverNode->renderer() : 0; m_mouseOver = mouseOverRenderer && mouseOverRenderer->isDescendantOf(this); updateControlVisibility(); } }}int RenderMedia::lowestPosition(bool includeOverflowInterior, bool includeSelf) const{ int bottom = RenderReplaced::lowestPosition(includeOverflowInterior, includeSelf); if (!m_controlsShadowRoot || !m_controlsShadowRoot->renderer()) return bottom; return max(bottom, m_controlsShadowRoot->renderBox()->y() + m_controlsShadowRoot->renderBox()->lowestPosition(includeOverflowInterior, includeSelf));}int RenderMedia::rightmostPosition(bool includeOverflowInterior, bool includeSelf) const{ int right = RenderReplaced::rightmostPosition(includeOverflowInterior, includeSelf); if (!m_controlsShadowRoot || !m_controlsShadowRoot->renderer()) return right; return max(right, m_controlsShadowRoot->renderBox()->x() + m_controlsShadowRoot->renderBox()->rightmostPosition(includeOverflowInterior, includeSelf));}int RenderMedia::leftmostPosition(bool includeOverflowInterior, bool includeSelf) const{ int left = RenderReplaced::leftmostPosition(includeOverflowInterior, includeSelf); if (!m_controlsShadowRoot || !m_controlsShadowRoot->renderer()) return left; return min(left, m_controlsShadowRoot->renderBox()->x() + m_controlsShadowRoot->renderBox()->leftmostPosition(includeOverflowInterior, includeSelf));}} // namespace WebCore#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -