bool MediaElementSession::canControlControlsManager(const HTMLMediaElement& element) const { if (!element.hasAudio()) { LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No audio"); return false; } if (element.muted()) { LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: Muted"); return false; } if (element.ended()) { LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: Ended"); return false; } if (element.document().activeDOMObjectsAreSuspended()) { LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: activeDOMObjectsAreSuspended()"); return false; } if (!playbackPermitted(element)) { LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: Playback not permitted"); return false; } if (element.isVideo()) { if (!element.renderer()) { LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No renderer"); return false; } if (!element.hasVideo()) { LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No video"); return false; } if (isElementLargeEnoughForMainContent(element)) { LOG(Media, "MediaElementSession::canControlControlsManager - returning TRUE: Is main content"); return true; } } if (m_restrictions & RequireUserGestureToControlControlsManager && !ScriptController::processingUserGestureForMedia()) { LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No user gesture"); return false; } LOG(Media, "MediaElementSession::canControlControlsManager - returning TRUE: All criteria met"); return true; }
static bool isMainContent(const HTMLMediaElement& element) { if (!element.hasAudio() || !element.hasVideo()) return false; // Elements which have not yet been laid out, or which are not yet in the DOM, cannot be main content. RenderBox* renderer = downcast<RenderBox>(element.renderer()); if (!renderer) return false; if (!isElementLargeEnoughForMainContent(element)) return false; // Elements which are hidden by style, or have been scrolled out of view, cannot be main content. // But elements which have audio & video and are already playing should not stop playing because // they are scrolled off the page. if (renderer->style().visibility() != VISIBLE || (renderer->visibleInViewportState() != RenderElement::VisibleInViewport && !element.isPlaying()) ) { return false; } // Main content elements must be in the main frame. Document& document = element.document(); if (!document.frame() || !document.frame()->isMainFrame()) return false; MainFrame& mainFrame = document.frame()->mainFrame(); if (!mainFrame.view() || !mainFrame.view()->renderView()) return false; RenderView& mainRenderView = *mainFrame.view()->renderView(); // Hit test the area of the main frame where the element appears, to determine if the element is being obscured. IntRect rectRelativeToView = element.clientRect(); ScrollPosition scrollPosition = mainFrame.view()->documentScrollPositionRelativeToViewOrigin(); IntRect rectRelativeToTopDocument(rectRelativeToView.location() + scrollPosition, rectRelativeToView.size()); HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::AllowChildFrameContent | HitTestRequest::IgnoreClipping | HitTestRequest::DisallowUserAgentShadowContent); HitTestResult result(rectRelativeToTopDocument.center()); // Elements which are obscured by other elements cannot be main content. mainRenderView.hitTest(request, result); result.setToNonUserAgentShadowAncestor(); Element* hitElement = result.innerElement(); if (hitElement != &element) return false; return true; }
bool MediaElementSession::canControlControlsManager(const HTMLMediaElement& element) const { if (!element.hasAudio()) return false; if (!playbackPermitted(element)) return false; RenderBox* renderer = downcast<RenderBox>(element.renderer()); if (!renderer) return false; if (isElementLargeEnoughForMainContent(element)) return true; if (ScriptController::processingUserGestureForMedia()) return true; return false; }
bool MediaElementSession::canControlControlsManager() const { if (m_element.isFullscreen()) { LOG(Media, "MediaElementSession::canControlControlsManager - returning TRUE: Is fullscreen"); return true; } if (!m_element.hasAudio()) { LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No audio"); return false; } if (m_element.ended()) { LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: Ended"); return false; } if (m_element.document().activeDOMObjectsAreSuspended()) { LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: activeDOMObjectsAreSuspended()"); return false; } if (!playbackPermitted(m_element)) { LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: Playback not permitted"); return false; } if (!hasBehaviorRestriction(RequireUserGestureToControlControlsManager) || ScriptController::processingUserGestureForMedia()) { LOG(Media, "MediaElementSession::canControlControlsManager - returning TRUE: No user gesture required"); return true; } if (hasBehaviorRestriction(RequirePlaybackToControlControlsManager) && !m_element.isPlaying()) { LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: Needs to be playing"); return false; } if (m_element.muted()) { LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: Muted"); return false; } if (m_element.isVideo()) { if (!m_element.renderer()) { LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No renderer"); return false; } if (m_element.document().isMediaDocument()) { LOG(Media, "MediaElementSession::canControlControlsManager - returning TRUE: Is media document"); return true; } if (!m_element.hasVideo()) { LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No video"); return false; } if (isElementLargeEnoughForMainContent(m_element)) { LOG(Media, "MediaElementSession::canControlControlsManager - returning TRUE: Is main content"); return true; } } LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No user gesture"); return false; }