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