Index: Source/core/dom/FullscreenElementStack.cpp |
diff --git a/Source/core/dom/FullscreenElementStack.cpp b/Source/core/dom/FullscreenElementStack.cpp |
index 03f1982866201014a82f54c660e3f7cd74725317..ab4442f516af5a292468e6e6a8bc54bc1cdb109f 100644 |
--- a/Source/core/dom/FullscreenElementStack.cpp |
+++ b/Source/core/dom/FullscreenElementStack.cpp |
@@ -119,9 +119,6 @@ void FullscreenElementStack::documentWasDetached() |
{ |
m_fullScreenChangeEventTargetQueue.clear(); |
m_fullScreenErrorEventTargetQueue.clear(); |
- |
- if (m_fullScreenRenderer) |
- setFullScreenRenderer(0); |
} |
void FullscreenElementStack::documentWasDisposed() |
@@ -264,6 +261,13 @@ void FullscreenElementStack::webkitCancelFullScreen() |
Vector<RefPtr<Element> > replacementFullscreenElementStack; |
replacementFullscreenElementStack.append(fullscreenElementFrom(document()->topDocument())); |
FullscreenElementStack* topFullscreenElementStack = from(document()->topDocument()); |
+ Vector<RefPtr<Element> >::iterator end = topFullscreenElementStack->m_fullScreenElementStack.end(); |
+ // FIXME: This will remove a modal full screen dialog from the top layer. Do |
+ // we care about this case? Really we shouldn't have separate vectors for |
+ // full screen element stack and top layer. |
+ for (Vector<RefPtr<Element> >::iterator iter = topFullscreenElementStack->m_fullScreenElementStack.begin(); iter + 1 < end; ++iter) { |
+ topFullscreenElementStack->document()->removeFromTopLayer(iter->get()); |
+ } |
topFullscreenElementStack->m_fullScreenElementStack.swap(replacementFullscreenElementStack); |
topFullscreenElementStack->webkitExitFullscreen(); |
} |
@@ -358,25 +362,8 @@ void FullscreenElementStack::webkitWillEnterFullScreenForElement(Element* elemen |
ASSERT(document()->settings()); // If we're active we must have settings. |
ASSERT(document()->settings()->fullScreenEnabled()); |
- if (m_fullScreenRenderer) |
- m_fullScreenRenderer->unwrapRenderer(); |
- |
m_fullScreenElement = element; |
- |
- // Create a placeholder block for a the full-screen element, to keep the page from reflowing |
- // when the element is removed from the normal flow. Only do this for a RenderBox, as only |
- // a box will have a frameRect. The placeholder will be created in setFullScreenRenderer() |
- // during layout. |
- RenderObject* renderer = m_fullScreenElement->renderer(); |
- bool shouldCreatePlaceholder = renderer && renderer->isBox(); |
- if (shouldCreatePlaceholder) { |
- m_savedPlaceholderFrameRect = toRenderBox(renderer)->frameRect(); |
- m_savedPlaceholderRenderStyle = RenderStyle::clone(renderer->style()); |
- } |
- |
- if (m_fullScreenElement != document()->documentElement()) |
- RenderFullScreen::wrapRenderer(renderer, renderer ? renderer->parent() : 0, document()); |
- |
+ document()->addToTopLayer(element); |
m_fullScreenElement->setContainsFullScreenElementOnAncestorsCrossingFrameBoundaries(true); |
document()->recalcStyle(Force); |
@@ -403,6 +390,7 @@ void FullscreenElementStack::webkitWillExitFullScreenForElement(Element*) |
if (!document()->isActive()) |
return; |
+ document()->removeFromTopLayer(m_fullScreenElement.get()); |
m_fullScreenElement->willStopBeingFullscreenElement(); |
} |
@@ -418,9 +406,6 @@ void FullscreenElementStack::webkitDidExitFullScreenForElement(Element*) |
m_areKeysEnabledInFullScreen = false; |
- if (m_fullScreenRenderer) |
- m_fullScreenRenderer->unwrapRenderer(); |
- |
m_fullScreenElement = 0; |
document()->setNeedsStyleRecalc(); |
@@ -433,30 +418,6 @@ void FullscreenElementStack::webkitDidExitFullScreenForElement(Element*) |
from(exitingDocument)->m_fullScreenChangeDelayTimer.startOneShot(0); |
} |
-void FullscreenElementStack::setFullScreenRenderer(RenderFullScreen* renderer) |
-{ |
- if (renderer == m_fullScreenRenderer) |
- return; |
- |
- if (renderer && m_savedPlaceholderRenderStyle) { |
- renderer->createPlaceholder(m_savedPlaceholderRenderStyle.release(), m_savedPlaceholderFrameRect); |
- } else if (renderer && m_fullScreenRenderer && m_fullScreenRenderer->placeholder()) { |
- RenderBlock* placeholder = m_fullScreenRenderer->placeholder(); |
- renderer->createPlaceholder(RenderStyle::clone(placeholder->style()), placeholder->frameRect()); |
- } |
- |
- if (m_fullScreenRenderer) |
- m_fullScreenRenderer->destroy(); |
- ASSERT(!m_fullScreenRenderer); |
- |
- m_fullScreenRenderer = renderer; |
-} |
- |
-void FullscreenElementStack::fullScreenRendererDestroyed() |
-{ |
- m_fullScreenRenderer = 0; |
-} |
- |
void FullscreenElementStack::fullScreenChangeDelayTimerFired(Timer<FullscreenElementStack>*) |
{ |
// Since we dispatch events in this function, it's possible that the |
@@ -528,6 +489,9 @@ void FullscreenElementStack::removeFullScreenElementOfSubtree(Node* node, bool a |
void FullscreenElementStack::clearFullscreenElementStack() |
{ |
+ Vector<RefPtr<Element> >::iterator end = m_fullScreenElementStack.end(); |
+ for (Vector<RefPtr<Element> >::iterator iter = m_fullScreenElementStack.begin(); iter != end; ++iter) |
+ document()->removeFromTopLayer(iter->get()); |
m_fullScreenElementStack.clear(); |
} |
@@ -536,11 +500,14 @@ void FullscreenElementStack::popFullscreenElementStack() |
if (m_fullScreenElementStack.isEmpty()) |
return; |
+ RefPtr<Element> element = m_fullScreenElementStack.last(); |
m_fullScreenElementStack.removeLast(); |
+ document()->removeFromTopLayer(element.get()); |
} |
void FullscreenElementStack::pushFullscreenElementStack(Element* element) |
{ |
+ document()->addToTopLayer(element); |
m_fullScreenElementStack.append(element); |
} |