Bug 1268749 part 4 - Hide unprefixed Fullscreen API from content when disabled. r=smaug
MozReview-Commit-ID: KpjNFYYyCWh
--- a/dom/base/nsContentUtils.cpp
+++ b/dom/base/nsContentUtils.cpp
@@ -259,16 +259,17 @@ nsString* nsContentUtils::sShiftText = n
nsString* nsContentUtils::sControlText = nullptr;
nsString* nsContentUtils::sMetaText = nullptr;
nsString* nsContentUtils::sOSText = nullptr;
nsString* nsContentUtils::sAltText = nullptr;
nsString* nsContentUtils::sModifierSeparator = nullptr;
bool nsContentUtils::sInitialized = false;
bool nsContentUtils::sIsFullScreenApiEnabled = false;
+bool nsContentUtils::sIsUnprefixedFullscreenApiEnabled = false;
bool nsContentUtils::sTrustedFullScreenOnly = true;
bool nsContentUtils::sIsCutCopyAllowed = true;
bool nsContentUtils::sIsFrameTimingPrefEnabled = false;
bool nsContentUtils::sIsPerformanceTimingEnabled = false;
bool nsContentUtils::sIsResourceTimingEnabled = false;
bool nsContentUtils::sIsUserTimingLoggingEnabled = false;
bool nsContentUtils::sIsExperimentalAutocompleteEnabled = false;
bool nsContentUtils::sEncodeDecodeURLHash = false;
@@ -534,16 +535,19 @@ nsContentUtils::Init()
sBlockedScriptRunners = new nsTArray< nsCOMPtr<nsIRunnable> >;
Preferences::AddBoolVarCache(&sAllowXULXBL_for_file,
"dom.allow_XUL_XBL_for_file");
Preferences::AddBoolVarCache(&sIsFullScreenApiEnabled,
"full-screen-api.enabled");
+ Preferences::AddBoolVarCache(&sIsUnprefixedFullscreenApiEnabled,
+ "full-screen-api.unprefix.enabled");
+
Preferences::AddBoolVarCache(&sTrustedFullScreenOnly,
"full-screen-api.allow-trusted-requests-only");
Preferences::AddBoolVarCache(&sIsCutCopyAllowed,
"dom.allow_cut_copy", true);
Preferences::AddBoolVarCache(&sIsPerformanceTimingEnabled,
"dom.enable_performance", true);
--- a/dom/base/nsContentUtils.h
+++ b/dom/base/nsContentUtils.h
@@ -1908,16 +1908,22 @@ public:
static bool IsFocusedContent(const nsIContent *aContent);
/**
* Returns true if the DOM full-screen API is enabled.
*/
static bool IsFullScreenApiEnabled();
/**
+ * Returns true if the unprefixed fullscreen API is enabled.
+ */
+ static bool IsUnprefixedFullscreenApiEnabled()
+ { return sIsUnprefixedFullscreenApiEnabled; }
+
+ /**
* Returns true if requests for full-screen are allowed in the current
* context. Requests are only allowed if the user initiated them (like with
* a mouse-click or key press), unless this check has been disabled by
* setting the pref "full-screen-api.allow-trusted-requests-only" to false.
*/
static bool IsRequestFullScreenAllowed();
/**
@@ -2656,16 +2662,17 @@ private:
static uint32_t sRunnersCountAtFirstBlocker;
static uint32_t sScriptBlockerCountWhereRunnersPrevented;
static nsIInterfaceRequestor* sSameOriginChecker;
static bool sIsHandlingKeyBoardEvent;
static bool sAllowXULXBL_for_file;
static bool sIsFullScreenApiEnabled;
+ static bool sIsUnprefixedFullscreenApiEnabled;
static bool sTrustedFullScreenOnly;
static bool sIsCutCopyAllowed;
static uint32_t sHandlingInputTimeout;
static bool sIsPerformanceTimingEnabled;
static bool sIsResourceTimingEnabled;
static bool sIsUserTimingLoggingEnabled;
static bool sIsFrameTimingPrefEnabled;
static bool sIsExperimentalAutocompleteEnabled;
--- a/dom/base/nsDocument.cpp
+++ b/dom/base/nsDocument.cpp
@@ -11675,16 +11675,24 @@ nsresult nsDocument::RemoteFrameFullscre
}
nsresult nsDocument::RemoteFrameFullscreenReverted()
{
RestorePreviousFullScreenState();
return NS_OK;
}
+/* static */ bool
+nsDocument::IsUnprefixedFullscreenEnabled(JSContext* aCx, JSObject* aObject)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return nsContentUtils::IsCallerChrome() ||
+ nsContentUtils::IsUnprefixedFullscreenApiEnabled();
+}
+
static void
ReleaseVRDeviceProxyRef(void *, nsIAtom*, void *aPropertyValue, void *)
{
if (aPropertyValue) {
static_cast<gfx::VRDeviceProxy*>(aPropertyValue)->Release();
}
}
--- a/dom/base/nsDocument.h
+++ b/dom/base/nsDocument.h
@@ -1231,16 +1231,18 @@ public:
// Returns strong references to mBlockedTrackingNodes. (nsIDocument.h)
//
// This array contains nodes that have been blocked to prevent
// user tracking. They most likely have had their nsIChannel
// canceled by the URL classifier (Safebrowsing).
//
already_AddRefed<nsSimpleContentList> BlockedTrackingNodes() const;
+ static bool IsUnprefixedFullscreenEnabled(JSContext* aCx, JSObject* aObject);
+
// Do the "fullscreen element ready check" from the fullscreen spec.
// It returns true if the given element is allowed to go into fullscreen.
bool FullscreenElementReadyCheck(Element* aElement, bool aWasCallerChrome);
// This is called asynchronously by nsIDocument::AsyncRequestFullScreen()
// to move this document into full-screen mode if allowed.
void RequestFullScreen(mozilla::UniquePtr<FullscreenRequest>&& aRequest);
--- a/dom/webidl/Document.webidl
+++ b/dom/webidl/Document.webidl
@@ -219,23 +219,26 @@ partial interface Document {
readonly attribute unsigned long referrerPolicy;
};
// https://fullscreen.spec.whatwg.org/#api
partial interface Document {
// Note: Per spec the 'S' in these two is lowercase, but the "Moz"
// versions hve it uppercase.
+ [Func="nsDocument::IsUnprefixedFullscreenEnabled"]
readonly attribute boolean fullscreenEnabled;
[BinaryName="fullscreenEnabled", Deprecated="PrefixedFullscreenAPI"]
readonly attribute boolean mozFullScreenEnabled;
+ [Func="nsDocument::IsUnprefixedFullscreenEnabled"]
readonly attribute Element? fullscreenElement;
[BinaryName="fullscreenElement", Deprecated="PrefixedFullscreenAPI"]
readonly attribute Element? mozFullScreenElement;
+ [Func="nsDocument::IsUnprefixedFullscreenEnabled"]
void exitFullscreen();
[BinaryName="exitFullscreen", Deprecated="PrefixedFullscreenAPI"]
void mozCancelFullScreen();
// Gecko-specific fullscreen bits
[Deprecated="PrefixedFullscreenAPI"]
readonly attribute boolean mozFullScreen;
};
--- a/dom/webidl/Element.webidl
+++ b/dom/webidl/Element.webidl
@@ -254,13 +254,13 @@ dictionary RequestFullscreenOptions {
};
// https://fullscreen.spec.whatwg.org/#api
partial interface Element {
/**
* The options parameter is non-standard. In Gecko, it can be:
* a RequestFullscreenOptions object
*/
- [Throws, UnsafeInPrerendering]
+ [Throws, UnsafeInPrerendering, Func="nsDocument::IsUnprefixedFullscreenEnabled"]
void requestFullscreen(optional any options);
[Throws, UnsafeInPrerendering, BinaryName="requestFullscreen", Deprecated="PrefixedFullscreenAPI"]
void mozRequestFullScreen(optional any options);
};
--- a/dom/webidl/EventHandler.webidl
+++ b/dom/webidl/EventHandler.webidl
@@ -113,17 +113,19 @@ interface GlobalEventHandlers {
[Pref="dom.w3c_pointer_events.enabled"]
attribute EventHandler onpointerleave;
[Pref="dom.w3c_pointer_events.enabled"]
attribute EventHandler ongotpointercapture;
[Pref="dom.w3c_pointer_events.enabled"]
attribute EventHandler onlostpointercapture;
// Fullscreen events handlers
+ [Func="nsDocument::IsUnprefixedFullscreenEnabled"]
attribute EventHandler onfullscreenchange;
+ [Func="nsDocument::IsUnprefixedFullscreenEnabled"]
attribute EventHandler onfullscreenerror;
attribute EventHandler onmozfullscreenchange;
attribute EventHandler onmozfullscreenerror;
// Mozilla-specific handlers
attribute EventHandler onmozpointerlockchange;
attribute EventHandler onmozpointerlockerror;
};