diff options
author | Patrick Scott <phanna@android.com> | 2011-01-18 16:38:47 -0500 |
---|---|---|
committer | Patrick Scott <phanna@android.com> | 2011-01-18 16:41:45 -0500 |
commit | b24f58947b87db91609cdd581b7e0c8e3ac5b27a (patch) | |
tree | 22077829b1820fe715300485d23b8087445f58b1 /WebCore | |
parent | 3eee7f647df0557a7c476e21afb08031736aac8c (diff) | |
download | external_webkit-b24f58947b87db91609cdd581b7e0c8e3ac5b27a.zip external_webkit-b24f58947b87db91609cdd581b7e0c8e3ac5b27a.tar.gz external_webkit-b24f58947b87db91609cdd581b7e0c8e3ac5b27a.tar.bz2 |
Fix some sites not responding.
Enter compositing for iframes after all layout tasks have completed. Remember
the state of overflow scroll similar to RenderLayer so that it doesn't change
while updating the compositing state.
Return false in requiresAcceleratedCompositing if the iframe is hidden. I verified
that this fails on Safari and have submitted a bug.
Bug: 3325187
Change-Id: I20a9e1a595d14518f4c7a3e01fc1c4fa9035262c
Diffstat (limited to 'WebCore')
-rw-r--r-- | WebCore/page/FrameView.cpp | 57 | ||||
-rw-r--r-- | WebCore/page/FrameView.h | 7 | ||||
-rw-r--r-- | WebCore/rendering/RenderIFrame.cpp | 7 |
3 files changed, 39 insertions, 32 deletions
diff --git a/WebCore/page/FrameView.cpp b/WebCore/page/FrameView.cpp index 3154a67..5314a32 100644 --- a/WebCore/page/FrameView.cpp +++ b/WebCore/page/FrameView.cpp @@ -143,6 +143,9 @@ FrameView::FrameView(Frame* frame) , m_deferSetNeedsLayouts(0) , m_setNeedsLayoutWasDeferred(false) , m_scrollCorner(0) +#if ENABLE(ANDROID_OVERFLOW_SCROLL) + , m_hasOverflowScroll(false) +#endif { init(); } @@ -553,11 +556,6 @@ void FrameView::updateCompositingLayers() RenderView* view = m_frame->contentRenderer(); if (!view) return; -#if ENABLE(ANDROID_OVERFLOW_SCROLL) - // Enter compositing mode for child frames that have layout dimensions. - if (hasOverflowScroll()) - enterCompositingMode(); -#endif // This call will make sure the cached hasAcceleratedCompositing is updated from the pref view->compositor()->cacheAcceleratedCompositingFlags(); @@ -571,31 +569,6 @@ void FrameView::setNeedsOneShotDrawingSynchronization() page->chrome()->client()->setNeedsOneShotDrawingSynchronization(); } -#if ENABLE(ANDROID_OVERFLOW_SCROLL) -bool FrameView::hasOverflowScroll() const -{ -#ifndef ANDROID_FLATTEN_IFRAME - RenderObject* ownerRenderer = m_frame->ownerRenderer(); - if (!ownerRenderer || !ownerRenderer->isRenderIFrame()) - return false; - RenderLayer* layer = ownerRenderer->enclosingLayer(); - // Make sure the layer has visible content or descendants. - if (!layer->hasVisibleContent() && !layer->hasVisibleDescendant()) - return false; - // If either layout dimension is 0, return false. - if (!layoutWidth() || !layoutHeight()) - return false; - ScrollbarMode h, v; - scrollbarModes(h, v); - if (h == ScrollbarAlwaysOff || v == ScrollbarAlwaysOff) - return false; - if (contentsWidth() <= layoutWidth() && contentsHeight() <= layoutHeight()) - return false; - return true; -#endif - return false; -} -#endif #endif // USE(ACCELERATED_COMPOSITING) bool FrameView::hasCompositedContent() const @@ -955,6 +928,30 @@ void FrameView::layout(bool allowSubtree) InspectorInstrumentation::didLayout(cookie); m_nestedLayoutCount--; +#if ENABLE(ANDROID_OVERFLOW_SCROLL) && !defined(ANDROID_FLATTEN_IFRAME) + // Reset to false each time we layout in case the overflow status changed. + bool hasOverflowScroll = false; + RenderObject* ownerRenderer = m_frame->ownerRenderer(); + if (ownerRenderer && ownerRenderer->isRenderIFrame()) { + RenderLayer* layer = ownerRenderer->enclosingLayer(); + if (layer) { + // Some sites use tiny iframes for loading so don't composite those. + if (canHaveScrollbars() && layoutWidth() > 1 && layoutHeight() > 1) + hasOverflowScroll = layoutWidth() < contentsWidth() || layoutHeight() < contentsHeight(); + } + } + if (RenderView* view = m_frame->contentRenderer()) { + if (hasOverflowScroll != m_hasOverflowScroll) { + if (hasOverflowScroll) + enterCompositingMode(); + else + // We are leaving overflow mode so we need to update the layer + // tree in case that is the reason we were composited. + view->compositor()->scheduleCompositingLayerUpdate(); + } + } + m_hasOverflowScroll = hasOverflowScroll; +#endif } void FrameView::addWidgetToUpdate(RenderEmbeddedObject* object) diff --git a/WebCore/page/FrameView.h b/WebCore/page/FrameView.h index d56b1ef..1b5b322 100644 --- a/WebCore/page/FrameView.h +++ b/WebCore/page/FrameView.h @@ -103,9 +103,9 @@ public: // Called when changes to the GraphicsLayer hierarchy have to be synchronized with // content rendered via the normal painting path. void setNeedsOneShotDrawingSynchronization(); -#if ENABLE(ANDROID_OVERFLOW_SCROLL) - bool hasOverflowScroll() const; #endif +#if ENABLE(ANDROID_OVERFLOW_SCROLL) + bool hasOverflowScroll() const { return m_hasOverflowScroll; } #endif bool hasCompositedContent() const; @@ -390,6 +390,9 @@ private: static double s_initialDeferredRepaintDelayDuringLoading; static double s_maxDeferredRepaintDelayDuringLoading; static double s_deferredRepaintDelayIncrementDuringLoading; +#if ENABLE(ANDROID_OVERFLOW_SCROLL) + bool m_hasOverflowScroll; +#endif }; } // namespace WebCore diff --git a/WebCore/rendering/RenderIFrame.cpp b/WebCore/rendering/RenderIFrame.cpp index a2cf66c..36d2449 100644 --- a/WebCore/rendering/RenderIFrame.cpp +++ b/WebCore/rendering/RenderIFrame.cpp @@ -266,6 +266,13 @@ bool RenderIFrame::requiresAcceleratedCompositing() const if (!node() || !node()->hasTagName(iframeTag)) return false; +#if PLATFORM(ANDROID) + // XXX: Bug submitted to webkit.org + // https://bugs.webkit.org/show_bug.cgi?id=52655 + if (style()->visibility() != VISIBLE) + return false; +#endif + // If the contents of the iframe are composited, then we have to be as well. HTMLIFrameElement* element = static_cast<HTMLIFrameElement*>(node()); if (Document* contentDocument = element->contentDocument()) { |