Bug 1187801 part 3 - Add iframe fullscreen flag and stop auto-rollback when this flag presents. r=smaug

--HG--
extra : source : f7801f9c5b8e65862ead640f7b07ad87a40c9345
This commit is contained in:
Xidorn Quan 2015-10-08 17:47:39 +11:00
parent 2d891027c2
commit f6fe1e11ba
3 changed files with 31 additions and 0 deletions

View File

@ -155,6 +155,7 @@
#include "nsHtml5TreeOpExecutor.h"
#include "mozilla/dom/HTMLLinkElement.h"
#include "mozilla/dom/HTMLMediaElement.h"
#include "mozilla/dom/HTMLIFrameElement.h"
#include "mozilla/dom/HTMLImageElement.h"
#include "mozilla/dom/MediaSource.h"
@ -11239,6 +11240,16 @@ nsDocument::RestorePreviousFullScreenState()
nsDocument* theDoc = static_cast<nsDocument*>(doc);
MOZ_ASSERT(!theDoc->mFullScreenStack.IsEmpty(),
"Ancestor of fullscreen document must also be in fullscreen");
if (doc != this) {
Element* top = theDoc->FullScreenStackTop();
if (top->IsHTMLElement(nsGkAtoms::iframe)) {
if (static_cast<HTMLIFrameElement*>(top)->FullscreenFlag()) {
// If this is an iframe, and it explicitly requested
// fullscreen, don't rollback it automatically.
break;
}
}
}
exitDocs.AppendElement(theDoc);
if (theDoc->mFullScreenStack.Length() > 1) {
break;
@ -11361,6 +11372,10 @@ ClearFullscreenStateOnElement(Element* aElement)
aElement->DeleteProperty(nsGkAtoms::vr_state);
// Remove styles from existing top element.
EventStateManager::SetFullScreenState(aElement, false);
// Reset iframe fullscreen flag.
if (aElement->IsHTMLElement(nsGkAtoms::iframe)) {
static_cast<HTMLIFrameElement*>(aElement)->SetFullscreenFlag(false);
}
}
void
@ -11853,6 +11868,10 @@ nsDocument::ApplyFullscreen(const FullscreenRequest& aRequest)
// in this document.
DebugOnly<bool> x = FullScreenStackPush(elem);
NS_ASSERTION(x, "Full-screen state of requesting doc should always change!");
// Set the iframe fullscreen flag.
if (elem->IsHTMLElement(nsGkAtoms::iframe)) {
static_cast<HTMLIFrameElement*>(elem)->SetFullscreenFlag(true);
}
changed.AppendElement(this);
// Propagate up the document hierarchy, setting the full-screen element as

View File

@ -184,6 +184,13 @@ public:
// nsGenericHTMLFrameElement::GetFrameLoader is fine
// nsGenericHTMLFrameElement::GetAppManifestURL is fine
// The fullscreen flag is set to true only when requestFullscreen is
// explicitly called on this <iframe> element. In case this flag is
// set, the fullscreen state of this element will not be reverted
// automatically when its subdocument exits fullscreen.
bool FullscreenFlag() const { return mFullscreenFlag; }
void SetFullscreenFlag(bool aValue) { mFullscreenFlag = aValue; }
protected:
virtual ~HTMLIFrameElement();

View File

@ -113,6 +113,11 @@ protected:
bool mBrowserFrameListenersRegistered;
bool mFrameLoaderCreationDisallowed;
// This flag is only used by <iframe>. See HTMLIFrameElement::
// FullscreenFlag() for details. It is placed here so that we
// do not bloat any struct.
bool mFullscreenFlag = false;
private:
void GetManifestURLByType(nsIAtom *aAppType, nsAString& aOut);
};