bug 739542 - Disable screen timeout when playing HTML5 <video> (webm, H.264) r=doublec
--- a/content/html/content/public/nsHTMLMediaElement.h
+++ b/content/html/content/public/nsHTMLMediaElement.h
@@ -17,16 +17,17 @@
#include "nsILoadGroup.h"
#include "nsIObserver.h"
#include "nsAudioStream.h"
#include "VideoFrameContainer.h"
#include "mozilla/CORSMode.h"
#include "nsDOMMediaStream.h"
#include "mozilla/Mutex.h"
#include "nsTimeRanges.h"
+#include "nsIDOMWakeLock.h"
// Define to output information on decoding and painting framerate
/* #define DEBUG_FRAME_RATE 1 */
typedef uint16_t nsMediaNetworkState;
typedef uint16_t nsMediaReadyState;
namespace mozilla {
@@ -383,16 +384,29 @@ public:
NS_ASSERTION(mSrcStream, "Don't call this when not playing a stream");
return mSrcStream->GetStream();
}
protected:
class MediaLoadListener;
class StreamListener;
+ class WakeLockBoolWrapper {
+ public:
+ WakeLockBoolWrapper(bool val = false) : mValue(val), mOuter(NULL), mWakeLock(NULL) {}
+ void SetOuter(nsHTMLMediaElement* outer) { mOuter = outer; }
+ operator bool() { return mValue; }
+ WakeLockBoolWrapper& operator=(bool val);
+ bool operator !() const { return !mValue; }
+ private:
+ bool mValue;
+ nsHTMLMediaElement* mOuter;
+ nsCOMPtr<nsIDOMMozWakeLock> mWakeLock;
+ };
+
/**
* Logs a warning message to the web console to report various failures.
* aMsg is the localized message identifier, aParams is the parameters to
* be substituted into the localized message, and aParamCount is the number
* of parameters in aParams.
*/
void ReportLoadError(const char* aMsg,
const PRUnichar** aParams = nullptr,
@@ -809,17 +823,17 @@ protected:
bool mAutoplaying;
// Indicates whether |autoplay| will actually autoplay based on the pref
// media.autoplay.enabled
bool mAutoplayEnabled;
// Playback of the video is paused either due to calling the
// 'Pause' method, or playback not yet having started.
- bool mPaused;
+ WakeLockBoolWrapper mPaused;
// True if the sound is muted.
bool mMuted;
// True if the sound is being captured.
bool mAudioCaptured;
// If TRUE then the media element was actively playing before the currently
--- a/content/html/content/src/nsHTMLMediaElement.cpp
+++ b/content/html/content/src/nsHTMLMediaElement.cpp
@@ -65,16 +65,17 @@
#include "nsDOMMediaStream.h"
#include "nsIScriptError.h"
#include "nsHostObjectProtocolHandler.h"
#include "nsCSSParser.h"
#include "nsIMediaList.h"
#include "ImageContainer.h"
+#include "nsIPowerManagerService.h"
#ifdef MOZ_OGG
#include "nsOggDecoder.h"
#endif
#ifdef MOZ_WAVE
#include "nsWaveDecoder.h"
#endif
#ifdef MOZ_WEBM
@@ -1742,16 +1743,18 @@ nsHTMLMediaElement::nsHTMLMediaElement(a
if (!gMediaElementLog) {
gMediaElementLog = PR_NewLogModule("nsMediaElement");
}
if (!gMediaElementEventsLog) {
gMediaElementEventsLog = PR_NewLogModule("nsMediaElementEvents");
}
#endif
+ mPaused.SetOuter(this);
+
RegisterFreezableElement();
NotifyOwnerDocumentActivityChanged();
}
nsHTMLMediaElement::~nsHTMLMediaElement()
{
NS_ASSERTION(!mHasSelfReference,
"How can we be destroyed if we're still holding a self reference?");
@@ -1864,16 +1867,33 @@ NS_IMETHODIMP nsHTMLMediaElement::Play()
// We changed mPaused and mAutoplaying which can affect AddRemoveSelfReference
// and our preload status.
AddRemoveSelfReference();
UpdatePreloadAction();
return NS_OK;
}
+nsHTMLMediaElement::WakeLockBoolWrapper& nsHTMLMediaElement::WakeLockBoolWrapper::operator=(bool val) {
+ if (mValue == val)
+ return *this;
+ if (!mWakeLock && !val && mOuter) {
+ nsCOMPtr<nsIPowerManagerService> pmService =
+ do_GetService(POWERMANAGERSERVICE_CONTRACTID);
+ NS_ENSURE_TRUE(pmService, *this);
+
+ pmService->NewWakeLock(NS_LITERAL_STRING("Playing_media"), mOuter->OwnerDoc()->GetWindow(), getter_AddRefs(mWakeLock));
+ } else if (mWakeLock && val) {
+ mWakeLock->Unlock();
+ mWakeLock = NULL;
+ }
+ mValue = val;
+ return *this;
+}
+
bool nsHTMLMediaElement::ParseAttribute(int32_t aNamespaceID,
nsIAtom* aAttribute,
const nsAString& aValue,
nsAttrValue& aResult)
{
// Mappings from 'preload' attribute strings to an enumeration.
static const nsAttrValue::EnumTable kPreloadTable[] = {
{ "", nsHTMLMediaElement::PRELOAD_ATTR_EMPTY },