18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(VIDEO) 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLVideoElement.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "Attribute.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSPropertyNames.h" 33e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "Chrome.h" 34e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "ChromeClient.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h" 365e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "ExceptionCode.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLImageLoader.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h" 39643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Page.h" 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderImage.h" 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderVideo.h" 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames; 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 475af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkeinline HTMLVideoElement::HTMLVideoElement(const QualifiedName& tagName, Document* document) 485af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke : HTMLMediaElement(tagName, document) 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(hasTagName(videoTag)); 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 52d0825bca7fe65beaee391d30da42e937db621564Steve Block 535af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkePassRefPtr<HTMLVideoElement> HTMLVideoElement::create(const QualifiedName& tagName, Document* document) 545af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{ 5506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return adoptRef(new HTMLVideoElement(tagName, document)); 565af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke} 575af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool HTMLVideoElement::rendererIsNeeded(RenderStyle* style) 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return HTMLElement::rendererIsNeeded(style); 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if !ENABLE(PLUGIN_PROXY_FOR_VIDEO) 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* HTMLVideoElement::createRenderer(RenderArena* arena, RenderStyle*) 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return new (arena) RenderVideo(this); 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLVideoElement::attach() 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HTMLMediaElement::attach(); 738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if !ENABLE(PLUGIN_PROXY_FOR_VIDEO) 75dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch updateDisplayState(); 76dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch if (shouldDisplayPosterImage()) { 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_imageLoader) 78e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block m_imageLoader = adoptPtr(new HTMLImageLoader(this)); 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_imageLoader->updateFromElement(); 805ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (renderer()) 815ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen toRenderImage(renderer())->imageResource()->setCachedImage(m_imageLoader->image()); 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLVideoElement::detach() 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HTMLMediaElement::detach(); 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 90dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch if (!shouldDisplayPosterImage() && m_imageLoader) 91dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch m_imageLoader.clear(); 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 94e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockvoid HTMLVideoElement::parseMappedAttribute(Attribute* attr) 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const QualifiedName& attrName = attr->name(); 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (attrName == posterAttr) { 99dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch // Force a poster recalc by setting m_displayMode to Unknown directly before calling updateDisplayState. 100dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch HTMLMediaElement::setDisplayMode(Unknown); 101dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch updateDisplayState(); 1028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if !ENABLE(PLUGIN_PROXY_FOR_VIDEO) 103dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch if (shouldDisplayPosterImage()) { 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_imageLoader) 105e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block m_imageLoader = adoptPtr(new HTMLImageLoader(this)); 106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_imageLoader->updateFromElementIgnoringPreviousError(); 107dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch } else { 108dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch if (m_imageLoader) 109dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch m_imageLoader.clear(); 110dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch if (renderer()) 1115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen toRenderImage(renderer())->imageResource()->setCachedImage(0); 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 113dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#endif 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (attrName == widthAttr) 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addCSSLength(attr, CSSPropertyWidth, attr->value()); 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (attrName == heightAttr) 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addCSSLength(attr, CSSPropertyHeight, attr->value()); 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HTMLMediaElement::parseMappedAttribute(attr); 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 122231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool HTMLVideoElement::supportsFullscreen() const 123231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 124231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block Page* page = document() ? document()->page() : 0; 125231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!page) 126231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; 127231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!player() || !player()->supportsFullscreen() || !player()->hasVideo()) 129231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; 130643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 131643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Check with the platform client. 1322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if ENABLE(FULLSCREEN_API) 1332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (page->chrome()->client()->supportsFullScreenForElement(this, false)) 1342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return true; 1352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 1362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 137231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return page->chrome()->client()->supportsFullscreenForNode(this); 138231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 139231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned HTMLVideoElement::videoWidth() const 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!player()) 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return player()->naturalSize().width(); 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned HTMLVideoElement::videoHeight() const 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!player()) 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return player()->naturalSize().height(); 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned HTMLVideoElement::width() const 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool ok; 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned w = getAttribute(widthAttr).string().toUInt(&ok); 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ok ? w : 0; 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned HTMLVideoElement::height() const 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool ok; 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned h = getAttribute(heightAttr).string().toUInt(&ok); 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ok ? h : 0; 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenbool HTMLVideoElement::isURLAttribute(Attribute* attribute) const 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return HTMLMediaElement::isURLAttribute(attribute) 17106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen || attribute->name() == posterAttr; 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst QualifiedName& HTMLVideoElement::imageSourceAttributeName() const 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return posterAttr; 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 179dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvoid HTMLVideoElement::setDisplayMode(DisplayMode mode) 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 181dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch DisplayMode oldMode = displayMode(); 182dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch KURL poster = getNonEmptyURLAttribute(posterAttr); 183dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 184dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch if (!poster.isEmpty()) { 185dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch // We have a poster path, but only show it until the user triggers display by playing or seeking and the 186dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch // media engine has something to display. 187dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch if (mode == Video) { 188dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch if (oldMode != Video && player()) 189dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch player()->prepareForRendering(); 190dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch if (!hasAvailableVideoFrame()) 1912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch mode = PosterWaitingForVideo; 192dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch } 193dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch } else if (oldMode != Video && player()) 194dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch player()->prepareForRendering(); 195dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 196dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch HTMLMediaElement::setDisplayMode(mode); 1978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 198dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch if (player() && player()->canLoadPoster()) 199dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch player()->setPoster(poster); 2008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if !ENABLE(PLUGIN_PROXY_FOR_VIDEO) 202dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch if (renderer() && displayMode() != oldMode) 203d0825bca7fe65beaee391d30da42e937db621564Steve Block renderer()->updateFromElement(); 2048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 207dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvoid HTMLVideoElement::updateDisplayState() 208dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 209dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch if (getNonEmptyURLAttribute(posterAttr).isEmpty()) 210dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch setDisplayMode(Video); 211dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch else if (displayMode() < Poster) 212dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch setDisplayMode(Poster); 213dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 214dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 2150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid HTMLVideoElement::paintCurrentFrameInContext(GraphicsContext* context, const IntRect& destRect) 2160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 2170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch MediaPlayer* player = HTMLMediaElement::player(); 2180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!player) 2190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return; 2200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch player->setVisible(true); // Make player visible or it won't draw. 2220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch player->paintCurrentFrameInContext(context, destRect); 2230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 2240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 225d0825bca7fe65beaee391d30da42e937db621564Steve Blockbool HTMLVideoElement::hasAvailableVideoFrame() const 226d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!player()) 228d0825bca7fe65beaee391d30da42e937db621564Steve Block return false; 229d0825bca7fe65beaee391d30da42e937db621564Steve Block 230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return player()->hasAvailableVideoFrame(); 231d0825bca7fe65beaee391d30da42e937db621564Steve Block} 232d0825bca7fe65beaee391d30da42e937db621564Steve Block 233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid HTMLVideoElement::webkitEnterFullscreen(bool isUserGesture, ExceptionCode& ec) 2345e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (isFullscreen()) 2365e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block return; 2375e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 2385e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block // Generate an exception if this isn't called in response to a user gesture, or if the 2395e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block // element does not support fullscreen. 24081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if ((requireUserGestureForFullScreen() && !isUserGesture) || !supportsFullscreen()) { 2415e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block ec = INVALID_STATE_ERR; 2425e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block return; 2435e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block } 2445e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 2455e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block enterFullscreen(); 2465e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 2475e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 248dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid HTMLVideoElement::webkitExitFullscreen() 2495e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (isFullscreen()) 2515e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block exitFullscreen(); 2525e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 2535e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 2545e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockbool HTMLVideoElement::webkitSupportsFullscreen() 2555e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 2565e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block return supportsFullscreen(); 2575e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 2585e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 2595e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockbool HTMLVideoElement::webkitDisplayingFullscreen() 2605e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 261dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return isFullscreen(); 2625e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 2635e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 264dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid HTMLVideoElement::willMoveToNewOwnerDocument() 265dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_imageLoader) 267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_imageLoader->elementWillMoveToNewOwnerDocument(); 268dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block HTMLMediaElement::willMoveToNewOwnerDocument(); 269dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 2705e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 2712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(MEDIA_STATISTICS) 27281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochunsigned HTMLVideoElement::webkitDecodedFrameCount() const 2732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 2742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!player()) 2752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return 0; 2762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 27781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return player()->decodedFrameCount(); 2782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 2792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 28081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochunsigned HTMLVideoElement::webkitDroppedFrameCount() const 2812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 2822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!player()) 2832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return 0; 2842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 28581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return player()->droppedFrameCount(); 2862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 2872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 2882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 29006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 292