diff --git a/content/canvas/src/CanvasRenderingContext2D.cpp b/content/canvas/src/CanvasRenderingContext2D.cpp index e53340116c97..3c053e8ebe35 100644 --- a/content/canvas/src/CanvasRenderingContext2D.cpp +++ b/content/canvas/src/CanvasRenderingContext2D.cpp @@ -1447,7 +1447,7 @@ CanvasRenderingContext2D::CreatePattern(const HTMLImageOrCanvasOrVideoElement& e } else if (element.IsHTMLImageElement()) { htmlElement = &element.GetAsHTMLImageElement(); } else { - htmlElement = element.GetAsHTMLVideoElement(); + htmlElement = &element.GetAsHTMLVideoElement(); } // The canvas spec says that createPattern should use the first frame @@ -2940,7 +2940,7 @@ CanvasRenderingContext2D::DrawImage(const HTMLImageOrCanvasOrVideoElement& image HTMLImageElement* img = &image.GetAsHTMLImageElement(); element = img; } else { - HTMLVideoElement* video = image.GetAsHTMLVideoElement(); + HTMLVideoElement* video = &image.GetAsHTMLVideoElement(); element = video; } diff --git a/content/html/content/public/HTMLVideoElement.h b/content/html/content/public/HTMLVideoElement.h index e3ff9c817faa..3902f3e44822 100644 --- a/content/html/content/public/HTMLVideoElement.h +++ b/content/html/content/public/HTMLVideoElement.h @@ -59,6 +59,59 @@ public: virtual nsXPCClassInfo* GetClassInfo(); virtual nsIDOMNode* AsDOMNode() { return this; } + + // WebIDL + + uint32_t Width() const + { + return GetIntAttr(nsGkAtoms::width, 0); + } + + void SetWidth(uint32_t aValue, ErrorResult& aRv) + { + SetHTMLIntAttr(nsGkAtoms::width, aValue, aRv); + } + + uint32_t Height() const + { + return GetIntAttr(nsGkAtoms::height, 0); + } + + void SetHeight(uint32_t aValue, ErrorResult& aRv) + { + SetHTMLIntAttr(nsGkAtoms::height, aValue, aRv); + } + + uint32_t VideoWidth() const + { + return mMediaSize.width == -1 ? 0 : mMediaSize.width; + } + + uint32_t VideoHeight() const + { + return mMediaSize.height == -1 ? 0 : mMediaSize.height; + } + + // XPCOM GetPoster is OK + void SetPoster(const nsAString& aValue, ErrorResult& aRv) + { + SetHTMLAttr(nsGkAtoms::poster, aValue, aRv); + } + + uint32_t MozParsedFrames() const; + + uint32_t MozDecodedFrames() const; + + uint32_t MozPresentedFrames() const; + + uint32_t MozPaintedFrames(); + + double MozFrameDelay(); + + bool MozHasAudio() const; + +protected: + virtual JSObject* WrapNode(JSContext* aCx, JSObject* aScope) MOZ_OVERRIDE; }; } // namespace dom diff --git a/content/html/content/src/HTMLVideoElement.cpp b/content/html/content/src/HTMLVideoElement.cpp index ce808d85c31f..09f83f565000 100644 --- a/content/html/content/src/HTMLVideoElement.cpp +++ b/content/html/content/src/HTMLVideoElement.cpp @@ -9,6 +9,7 @@ #include "nsIDOMHTMLVideoElement.h" #include "nsIDOMHTMLSourceElement.h" #include "mozilla/dom/HTMLVideoElement.h" +#include "mozilla/dom/HTMLVideoElementBinding.h" #include "nsGenericHTMLElement.h" #include "nsGkAtoms.h" #include "nsSize.h" @@ -57,20 +58,21 @@ NS_IMPL_INT_ATTR(HTMLVideoElement, Height, height) /* readonly attribute unsigned long videoWidth; */ NS_IMETHODIMP HTMLVideoElement::GetVideoWidth(uint32_t *aVideoWidth) { - *aVideoWidth = mMediaSize.width == -1 ? 0 : mMediaSize.width; + *aVideoWidth = VideoWidth(); return NS_OK; } /* readonly attribute unsigned long videoHeight; */ NS_IMETHODIMP HTMLVideoElement::GetVideoHeight(uint32_t *aVideoHeight) { - *aVideoHeight = mMediaSize.height == -1 ? 0 : mMediaSize.height; + *aVideoHeight = VideoHeight(); return NS_OK; } HTMLVideoElement::HTMLVideoElement(already_AddRefed aNodeInfo) : HTMLMediaElement(aNodeInfo) { + SetIsDOMBinding(); } HTMLVideoElement::~HTMLVideoElement() @@ -155,49 +157,84 @@ nsresult HTMLVideoElement::SetAcceptHeader(nsIHttpChannel* aChannel) NS_IMPL_URI_ATTR(HTMLVideoElement, Poster, poster) +uint32_t HTMLVideoElement::MozParsedFrames() const +{ + MOZ_ASSERT(NS_IsMainThread(), "Should be on main thread."); + return mDecoder ? mDecoder->GetFrameStatistics().GetParsedFrames() : 0; +} + NS_IMETHODIMP HTMLVideoElement::GetMozParsedFrames(uint32_t *aMozParsedFrames) { - NS_ASSERTION(NS_IsMainThread(), "Should be on main thread."); - *aMozParsedFrames = mDecoder ? mDecoder->GetFrameStatistics().GetParsedFrames() : 0; + *aMozParsedFrames = MozParsedFrames(); return NS_OK; } +uint32_t HTMLVideoElement::MozDecodedFrames() const +{ + MOZ_ASSERT(NS_IsMainThread(), "Should be on main thread."); + return mDecoder ? mDecoder->GetFrameStatistics().GetDecodedFrames() : 0; +} + NS_IMETHODIMP HTMLVideoElement::GetMozDecodedFrames(uint32_t *aMozDecodedFrames) { - NS_ASSERTION(NS_IsMainThread(), "Should be on main thread."); - *aMozDecodedFrames = mDecoder ? mDecoder->GetFrameStatistics().GetDecodedFrames() : 0; + *aMozDecodedFrames = MozDecodedFrames(); return NS_OK; } +uint32_t HTMLVideoElement::MozPresentedFrames() const +{ + MOZ_ASSERT(NS_IsMainThread(), "Should be on main thread."); + return mDecoder ? mDecoder->GetFrameStatistics().GetPresentedFrames() : 0; +} + NS_IMETHODIMP HTMLVideoElement::GetMozPresentedFrames(uint32_t *aMozPresentedFrames) { - NS_ASSERTION(NS_IsMainThread(), "Should be on main thread."); - *aMozPresentedFrames = mDecoder ? mDecoder->GetFrameStatistics().GetPresentedFrames() : 0; + *aMozPresentedFrames = MozPresentedFrames(); return NS_OK; } +uint32_t HTMLVideoElement::MozPaintedFrames() +{ + MOZ_ASSERT(NS_IsMainThread(), "Should be on main thread."); + layers::ImageContainer* container = GetImageContainer(); + return container ? container->GetPaintCount() : 0; +} + NS_IMETHODIMP HTMLVideoElement::GetMozPaintedFrames(uint32_t *aMozPaintedFrames) { - NS_ASSERTION(NS_IsMainThread(), "Should be on main thread."); - layers::ImageContainer* container = GetImageContainer(); - *aMozPaintedFrames = container ? container->GetPaintCount() : 0; + *aMozPaintedFrames = MozPaintedFrames(); return NS_OK; } +double HTMLVideoElement::MozFrameDelay() +{ + MOZ_ASSERT(NS_IsMainThread(), "Should be on main thread."); + VideoFrameContainer* container = GetVideoFrameContainer(); + return container ? container->GetFrameDelay() : 0; +} + NS_IMETHODIMP HTMLVideoElement::GetMozFrameDelay(double *aMozFrameDelay) { - NS_ASSERTION(NS_IsMainThread(), "Should be on main thread."); - VideoFrameContainer* container = GetVideoFrameContainer(); - *aMozFrameDelay = container ? container->GetFrameDelay() : 0; + *aMozFrameDelay = MozFrameDelay(); return NS_OK; } - /* readonly attribute bool mozHasAudio */ +bool HTMLVideoElement::MozHasAudio() const +{ + MOZ_ASSERT(NS_IsMainThread(), "Should be on main thread."); + return mHasAudio; +} + NS_IMETHODIMP HTMLVideoElement::GetMozHasAudio(bool *aHasAudio) { - NS_ASSERTION(NS_IsMainThread(), "Should be on main thread."); - *aHasAudio = mHasAudio; + *aHasAudio = MozHasAudio(); return NS_OK; } +JSObject* +HTMLVideoElement::WrapNode(JSContext* aCx, JSObject* aScope) +{ + return HTMLVideoElementBinding::Wrap(aCx, aScope, this); +} + } // namespace dom } // namespace mozilla diff --git a/dom/bindings/Bindings.conf b/dom/bindings/Bindings.conf index d8f377ea3ca4..8a22e83d599a 100644 --- a/dom/bindings/Bindings.conf +++ b/dom/bindings/Bindings.conf @@ -1338,7 +1338,6 @@ addExternalIface('DOMStringList') addExternalIface('File') addExternalIface('HitRegionOptions', nativeType='nsISupports') addExternalIface('HTMLCanvasElement', nativeType='mozilla::dom::HTMLCanvasElement') -addExternalIface('HTMLVideoElement', nativeType='mozilla::dom::HTMLVideoElement') addExternalIface('imgINotificationObserver', nativeType='imgINotificationObserver') addExternalIface('imgIRequest', nativeType='imgIRequest', notflattened=True) addExternalIface('LockedFile') diff --git a/dom/webidl/CanvasRenderingContext2D.webidl b/dom/webidl/CanvasRenderingContext2D.webidl index 8711b330a837..9a29fcb10a0b 100644 --- a/dom/webidl/CanvasRenderingContext2D.webidl +++ b/dom/webidl/CanvasRenderingContext2D.webidl @@ -15,7 +15,6 @@ interface CanvasGradient; interface CanvasPattern; interface HitRegionOptions; interface HTMLCanvasElement; -interface HTMLVideoElement; interface TextMetrics; interface Window; diff --git a/dom/webidl/HTMLVideoElement.webidl b/dom/webidl/HTMLVideoElement.webidl new file mode 100644 index 000000000000..a6c34fb49ba0 --- /dev/null +++ b/dom/webidl/HTMLVideoElement.webidl @@ -0,0 +1,47 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + * + * The origin of this IDL file is + * http://www.whatwg.org/specs/web-apps/current-work/#the-video-element + * + * © Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and + * Opera Software ASA. You are granted a license to use, reproduce + * and create derivative works of this document. + */ + +interface HTMLVideoElement : HTMLMediaElement { + [SetterThrows] + attribute unsigned long width; + [SetterThrows] + attribute unsigned long height; + readonly attribute unsigned long videoWidth; + readonly attribute unsigned long videoHeight; + [SetterThrows] + attribute DOMString poster; +}; + +partial interface HTMLVideoElement { + // A count of the number of video frames that have demuxed from the media + // resource. If we were playing perfectly, we'd be able to paint this many + // frames. + readonly attribute unsigned long mozParsedFrames; + + // A count of the number of frames that have been decoded. We may drop + // frames if the decode is taking too much time. + readonly attribute unsigned long mozDecodedFrames; + + // A count of the number of frames that have been presented to the rendering + // pipeline. We may drop frames if they arrive late at the renderer. + readonly attribute unsigned long mozPresentedFrames; + + // Number of presented frames which were painted on screen. + readonly attribute unsigned long mozPaintedFrames; + + // Time which the last painted video frame was late by, in seconds. + readonly attribute double mozFrameDelay; + + // True if the video has an audio track available. + readonly attribute boolean mozHasAudio; +}; diff --git a/dom/webidl/WebIDL.mk b/dom/webidl/WebIDL.mk index 7bd1be0c616c..3f992fc9b7b7 100644 --- a/dom/webidl/WebIDL.mk +++ b/dom/webidl/WebIDL.mk @@ -128,6 +128,7 @@ webidl_files = \ HTMLTimeElement.webidl \ HTMLTitleElement.webidl \ HTMLUListElement.webidl \ + HTMLVideoElement.webidl \ IDBVersionChangeEvent.webidl \ ImageData.webidl \ InspectorUtils.webidl \