Index: third_party/WebKit/Source/web/FullscreenController.cpp |
diff --git a/third_party/WebKit/Source/web/FullscreenController.cpp b/third_party/WebKit/Source/web/FullscreenController.cpp |
index cb8efeffd7bb3e843c17fa3f5debc2591e0afc5f..43de61c60785182df5bbe64b4ece6678b576d16e 100644 |
--- a/third_party/WebKit/Source/web/FullscreenController.cpp |
+++ b/third_party/WebKit/Source/web/FullscreenController.cpp |
@@ -37,8 +37,6 @@ |
#include "core/frame/PageScaleConstraintsSet.h" |
#include "core/html/HTMLMediaElement.h" |
#include "core/html/HTMLVideoElement.h" |
-#include "core/layout/LayoutFullScreen.h" |
-#include "platform/RuntimeEnabledFeatures.h" |
#include "public/platform/WebLayerTreeView.h" |
#include "public/web/WebFrameClient.h" |
#include "web/WebLocalFrameImpl.h" |
@@ -59,14 +57,7 @@ FullscreenController::FullscreenController(WebViewImpl* webViewImpl) |
m_isCancelingFullscreen(false) {} |
void FullscreenController::didEnterFullscreen() { |
- if (!m_provisionalFullscreenElement) |
- return; |
- |
- Element* element = m_provisionalFullscreenElement.release(); |
- Document& document = element->document(); |
- m_fullscreenFrame = document.frame(); |
- |
- if (!m_fullscreenFrame) |
+ if (m_pendingFullscreenElements.isEmpty()) |
return; |
if (!m_haveEnteredFullscreen) { |
@@ -78,14 +69,22 @@ void FullscreenController::didEnterFullscreen() { |
m_haveEnteredFullscreen = true; |
} |
- Fullscreen::from(document).didEnterFullscreenForElement(element); |
- DCHECK_EQ(Fullscreen::currentFullScreenElementFrom(document), element); |
- |
- if (isHTMLVideoElement(element)) { |
- HTMLVideoElement* videoElement = toHTMLVideoElement(element); |
- if (videoElement->usesOverlayFullscreenVideo() && |
- m_webViewImpl->layerTreeView()) |
- m_webViewImpl->layerTreeView()->setHasTransparentBackground(true); |
+ // TODO(foolip): Unprefixed requests |
+ HeapVector<Member<Element>> pendingFullscreenElements; |
+ pendingFullscreenElements.swap(m_pendingFullscreenElements); |
+ |
+ for (Element* element : pendingFullscreenElements) { |
+ Fullscreen::didEnterFullscreenForElement(*element, |
+ Fullscreen::PrefixedRequest); |
+ |
+ // TODO(foolip): this and the exit stuff has to be synced with animation |
+ // frames tasks too |
+ if (isHTMLVideoElement(element)) { |
+ HTMLVideoElement* videoElement = toHTMLVideoElement(element); |
+ if (videoElement->usesOverlayFullscreenVideo() && |
+ m_webViewImpl->layerTreeView()) |
+ m_webViewImpl->layerTreeView()->setHasTransparentBackground(true); |
+ } |
} |
} |
@@ -97,30 +96,28 @@ void FullscreenController::didExitFullscreen() { |
updatePageScaleConstraints(true); |
if (Document* document = m_fullscreenFrame->document()) { |
- if (Fullscreen* fullscreen = Fullscreen::fromIfExists(*document)) { |
- Element* element = fullscreen->currentFullScreenElement(); |
- if (element) { |
- // When the client exits from full screen we have to call |
- // fullyExitFullscreen to notify the document. While doing that, |
- // suppress notifications back to the client. |
- m_isCancelingFullscreen = true; |
- Fullscreen::fullyExitFullscreen(*document); |
- m_isCancelingFullscreen = false; |
- |
- // If the video used overlay fullscreen mode, the background was made |
- // transparent. Restore the transparency. |
- if (isHTMLVideoElement(element) && m_webViewImpl->layerTreeView()) |
- m_webViewImpl->layerTreeView()->setHasTransparentBackground( |
- m_webViewImpl->isTransparent()); |
- |
- // We need to wait until style and layout are updated in order |
- // to propertly restore scroll offsets since content may not be |
- // overflowing in the same way until they do. |
- if (m_haveEnteredFullscreen) |
- m_needsScrollAndScaleRestore = true; |
- |
- fullscreen->didExitFullscreen(); |
+ if (Element* element = Fullscreen::fullscreenElement(*document)) { |
+ // When the client exits from full screen we have to call |
+ // fullyExitFullscreen to notify the document. While doing that, suppress |
+ // notifications back to the client. |
+ m_isCancelingFullscreen = true; |
+ Fullscreen::fullyExitFullscreen(*document); |
+ m_isCancelingFullscreen = false; |
+ |
+ // If the video used overlay fullscreen mode, the background was made |
+ // transparent. Restore the transparency. |
+ if (isHTMLVideoElement(element) && m_webViewImpl->layerTreeView()) { |
+ m_webViewImpl->layerTreeView()->setHasTransparentBackground( |
+ m_webViewImpl->isTransparent()); |
} |
+ |
+ // We need to wait until style and layout are updated in order |
+ // to propertly restore scroll offsets since content may not be |
+ // overflowing in the same way until they do. |
+ if (m_haveEnteredFullscreen) |
+ m_needsScrollAndScaleRestore = true; |
+ |
+ Fullscreen::didExitFullscreen(*document); |
} |
} |
@@ -129,15 +126,10 @@ void FullscreenController::didExitFullscreen() { |
} |
void FullscreenController::enterFullscreenForElement(Element* element) { |
- // We are already transitioning to fullscreen for a different element. |
- if (m_provisionalFullscreenElement) { |
- m_provisionalFullscreenElement = element; |
- return; |
- } |
+ m_pendingFullscreenElements.append(element); |
// We are already in fullscreen mode. |
if (m_fullscreenFrame) { |
- m_provisionalFullscreenElement = element; |
didEnterFullscreen(); |
return; |
} |
@@ -161,15 +153,23 @@ void FullscreenController::enterFullscreenForElement(Element* element) { |
WebLocalFrameImpl* frame = |
WebLocalFrameImpl::fromFrame(element->document().frame()); |
if (frame && frame->client()) { |
- if (!Fullscreen::from(element->document()).forCrossProcessDescendant()) |
- frame->client()->enterFullscreen(); |
- m_provisionalFullscreenElement = element; |
+ frame->client()->enterFullscreen(); |
+ } else { |
+ // TODO(foolip): now what? |
+ DCHECK(0); |
} |
} |
void FullscreenController::exitFullscreenForElement(Element* element) { |
DCHECK(element); |
+ // TODO(dsinclair): This should not be needed because we addToTopLayer |
+ // in Fullscreen::popFullscreenElementStack but, the WebView code doesn't |
+ // call Fullscreen::requestFullscreen() and, instead, just enters and |
+ // exists itself. This should be unified so there is one way to go |
+ // fullscreen. crbug.com/538158 |
+ element->document().removeFromTopLayer(element); |
+ |
// The client is exiting full screen, so don't send a notification. |
if (m_isCancelingFullscreen) |
return; |
@@ -186,10 +186,9 @@ void FullscreenController::updateSize() { |
updatePageScaleConstraints(false); |
- LayoutFullScreen* layoutObject = |
- Fullscreen::from(*m_fullscreenFrame->document()).fullScreenLayoutObject(); |
- if (layoutObject) |
- layoutObject->updateStyle(); |
+ Document* document = m_fullscreenFrame->document(); |
+ if (Element* fullscreenElement = Fullscreen::fullscreenElement(*document)) |
+ Fullscreen::didUpdateSize(*fullscreenElement); |
} |
void FullscreenController::didUpdateLayout() { |
@@ -235,7 +234,7 @@ void FullscreenController::updatePageScaleConstraints(bool removeConstraints) { |
} |
DEFINE_TRACE(FullscreenController) { |
- visitor->trace(m_provisionalFullscreenElement); |
+ visitor->trace(m_pendingFullscreenElements); |
visitor->trace(m_fullscreenFrame); |
} |