diff options
author | Ben Murdoch <benm@google.com> | 2011-05-05 14:36:32 +0100 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2011-05-10 15:38:30 +0100 |
commit | f05b935882198ccf7d81675736e3aeb089c5113a (patch) | |
tree | 4ea0ca838d9ef1b15cf17ddb3928efb427c7e5a1 /WebCore/page/FrameView.cpp | |
parent | 60fbdcc62bced8db2cb1fd233cc4d1e4ea17db1b (diff) | |
download | external_webkit-f05b935882198ccf7d81675736e3aeb089c5113a.zip external_webkit-f05b935882198ccf7d81675736e3aeb089c5113a.tar.gz external_webkit-f05b935882198ccf7d81675736e3aeb089c5113a.tar.bz2 |
Merge WebKit at r74534: Initial merge by git.
Change-Id: I6ccd1154fa1b19c2ec2a66878eb675738735f1eb
Diffstat (limited to 'WebCore/page/FrameView.cpp')
-rw-r--r-- | WebCore/page/FrameView.cpp | 149 |
1 files changed, 101 insertions, 48 deletions
diff --git a/WebCore/page/FrameView.cpp b/WebCore/page/FrameView.cpp index 3517688..cc4c181 100644 --- a/WebCore/page/FrameView.cpp +++ b/WebCore/page/FrameView.cpp @@ -447,15 +447,10 @@ void FrameView::adjustViewSize() if (!root) return; - int prevScrollOriginX = scrollOriginX(); - ScrollView::setScrollOriginX(-root->leftLayoutOverflow()); - IntSize size = IntSize(root->rightLayoutOverflow() - root->leftLayoutOverflow(), root->bottomLayoutOverflow()); - // Take care of the case when contents remain but the RenderView's direction has changed. - // In which case, we need to update scroller position, for example, from leftmost to - // rightmost when direction changes from left-to-right to right-to-left. - bool directionChanged = (!prevScrollOriginX || !scrollOriginX()) && (scrollOriginX() != prevScrollOriginX); - if (size == contentsSize() && directionChanged) - ScrollView::updateScrollbars(); + IntSize size = IntSize(root->docWidth(), root->docHeight()); + + ScrollView::setScrollOrigin(IntPoint(-root->docLeft(), -root->docTop()), size == contentsSize()); + setContentsSize(size); } @@ -500,6 +495,13 @@ void FrameView::applyOverflowToViewport(RenderObject* o, ScrollbarMode& hMode, S void FrameView::calculateScrollbarModesForLayout(ScrollbarMode& hMode, ScrollbarMode& vMode) { + const HTMLFrameOwnerElement* owner = m_frame->ownerElement(); + if (owner && (owner->scrollingMode() == ScrollbarAlwaysOff)) { + hMode = ScrollbarAlwaysOff; + vMode = ScrollbarAlwaysOff; + return; + } + if (m_canHaveScrollbars) { hMode = ScrollbarAuto; vMode = ScrollbarAuto; @@ -515,7 +517,6 @@ void FrameView::calculateScrollbarModesForLayout(ScrollbarMode& hMode, Scrollbar Node* body = document->body(); if (body && body->renderer()) { if (body->hasTagName(framesetTag) && m_frame->settings() && !m_frame->settings()->frameFlatteningEnabled()) { - body->renderer()->setChildNeedsLayout(true); vMode = ScrollbarAlwaysOff; hMode = ScrollbarAlwaysOff; } else if (body->hasTagName(bodyTag)) { @@ -526,27 +527,15 @@ void FrameView::calculateScrollbarModesForLayout(ScrollbarMode& hMode, Scrollbar } } else if (rootRenderer) { #if ENABLE(SVG) - if (documentElement->isSVGElement()) { - if (!m_firstLayout && (m_size.width() != layoutWidth() || m_size.height() != layoutHeight())) - rootRenderer->setChildNeedsLayout(true); - } else + if (!documentElement->isSVGElement()) applyOverflowToViewport(rootRenderer, hMode, vMode); #else applyOverflowToViewport(rootRenderer, hMode, vMode); #endif } -#ifdef INSTRUMENT_LAYOUT_SCHEDULING - if (m_firstLayout && !document->ownerElement()) - printf("Elapsed time before first layout: %d\n", document->elapsedTime()); -#endif - } - - HTMLFrameOwnerElement* owner = m_frame->ownerElement(); - if (owner && (owner->scrollingMode() == ScrollbarAlwaysOff)) { - hMode = ScrollbarAlwaysOff; - vMode = ScrollbarAlwaysOff; - } + } } + #if USE(ACCELERATED_COMPOSITING) void FrameView::updateCompositingLayers() @@ -776,9 +765,35 @@ void FrameView::layout(bool allowSubtree) m_nestedLayoutCount++; - ScrollbarMode hMode; - ScrollbarMode vMode; + if (!m_layoutRoot) { + Document* document = m_frame->document(); + Node* documentElement = document->documentElement(); + RenderObject* rootRenderer = documentElement ? documentElement->renderer() : 0; + Node* body = document->body(); + if (body && body->renderer()) { + if (body->hasTagName(framesetTag) && m_frame->settings() && !m_frame->settings()->frameFlatteningEnabled()) { + body->renderer()->setChildNeedsLayout(true); + } else if (body->hasTagName(bodyTag)) { + if (!m_firstLayout && m_size.height() != layoutHeight() && body->renderer()->enclosingBox()->stretchesToViewport()) + body->renderer()->setChildNeedsLayout(true); + } + } else if (rootRenderer) { +#if ENABLE(SVG) + if (documentElement->isSVGElement()) { + if (!m_firstLayout && (m_size.width() != layoutWidth() || m_size.height() != layoutHeight())) + rootRenderer->setChildNeedsLayout(true); + } +#endif + } + +#ifdef INSTRUMENT_LAYOUT_SCHEDULING + if (m_firstLayout && !document->ownerElement()) + printf("Elapsed time before first layout: %d\n", document->elapsedTime()); +#endif + } + ScrollbarMode hMode; + ScrollbarMode vMode; calculateScrollbarModesForLayout(hMode, vMode); m_doFullRepaint = !subtree && (m_firstLayout || toRenderView(root)->printing()); @@ -1272,11 +1287,8 @@ bool FrameView::scrollToAnchor(const String& name) if (anchorNode && anchorNode->hasTagName(SVGNames::viewTag)) { RefPtr<SVGViewElement> viewElement = anchorNode->hasTagName(SVGNames::viewTag) ? static_cast<SVGViewElement*>(anchorNode) : 0; if (viewElement.get()) { - SVGElement* element = SVGLocatable::nearestViewportElement(viewElement.get()); - if (element->hasTagName(SVGNames::svgTag)) { - RefPtr<SVGSVGElement> svg = static_cast<SVGSVGElement*>(element); - svg->inheritViewAttributes(viewElement.get()); - } + RefPtr<SVGSVGElement> svg = static_cast<SVGSVGElement*>(SVGLocatable::nearestViewportElement(viewElement.get())); + svg->inheritViewAttributes(viewElement.get()); } } } @@ -2193,13 +2205,6 @@ void FrameView::paintContents(GraphicsContext* p, const IntRect& rect) } #endif - ASSERT(!m_isPainting); - - m_isPainting = true; - - // m_nodeToDraw is used to draw only one element (and its descendants) - RenderObject* eltRenderer = m_nodeToDraw ? m_nodeToDraw->renderer() : 0; - PaintBehavior oldPaintBehavior = m_paintBehavior; if (m_paintBehavior == PaintBehaviorNormal) document->markers()->invalidateRenderedRectsForMarkersInRect(rect); @@ -2207,11 +2212,25 @@ void FrameView::paintContents(GraphicsContext* p, const IntRect& rect) if (document->printing()) m_paintBehavior |= PaintBehaviorFlattenCompositingLayers; + bool flatteningPaint = m_paintBehavior & PaintBehaviorFlattenCompositingLayers; + bool isRootFrame = !document->ownerElement(); + if (flatteningPaint && isRootFrame) + notifyWidgetsInAllFrames(WillPaintFlattened); + + ASSERT(!m_isPainting); + m_isPainting = true; + + // m_nodeToDraw is used to draw only one element (and its descendants) + RenderObject* eltRenderer = m_nodeToDraw ? m_nodeToDraw->renderer() : 0; + contentRenderer->layer()->paint(p, rect, m_paintBehavior, eltRenderer); - - m_paintBehavior = oldPaintBehavior; - + m_isPainting = false; + + if (flatteningPaint && isRootFrame) + notifyWidgetsInAllFrames(DidPaintFlattened); + + m_paintBehavior = oldPaintBehavior; m_lastPaintTime = currentTime(); #if ENABLE(DASHBOARD_SUPPORT) @@ -2296,7 +2315,7 @@ void FrameView::forceLayoutForPagination(const FloatSize& pageSize, float maximu if (root) { int pageW = ceilf(pageSize.width()); root->setWidth(pageW); - root->setPageHeight(pageSize.height()); + root->setPageLogicalHeight(pageSize.height()); root->setNeedsLayoutAndPrefWidthsRecalc(); forceLayout(); @@ -2304,15 +2323,15 @@ void FrameView::forceLayoutForPagination(const FloatSize& pageSize, float maximu // page width when shrunk, we will lay out at maximum shrink and clip extra content. // FIXME: We are assuming a shrink-to-fit printing implementation. A cropping // implementation should not do this! - int rightmostPos = root->rightmostPosition(); - if (rightmostPos > pageSize.width()) { - pageW = std::min<int>(rightmostPos, ceilf(pageSize.width() * maximumShrinkFactor)); + int docWidth = root->docWidth(); + if (docWidth > pageSize.width()) { + pageW = std::min<int>(docWidth, ceilf(pageSize.width() * maximumShrinkFactor)); if (pageSize.height()) - root->setPageHeight(pageW / pageSize.width() * pageSize.height()); + root->setPageLogicalHeight(pageW / pageSize.width() * pageSize.height()); root->setWidth(pageW); root->setNeedsLayoutAndPrefWidthsRecalc(); forceLayout(); - int docHeight = root->bottomLayoutOverflow(); + int docHeight = root->docHeight(); root->clearLayoutOverflow(); root->addLayoutOverflow(IntRect(0, 0, pageW, docHeight)); // This is how we clip in case we overflow again. } @@ -2502,4 +2521,38 @@ void FrameView::setRepaintThrottlingDeferredRepaintDelayIncrementDuringLoading(d s_deferredRepaintDelayIncrementDuringLoading = p; } +bool FrameView::isVerticalDocument() const +{ + if (!m_frame) + return true; + Document* doc = m_frame->document(); + if (!doc) + return true; + RenderObject* renderView = doc->renderer(); + if (!renderView) + return true; + return renderView->style()->isHorizontalWritingMode(); +} + +bool FrameView::isFlippedDocument() const +{ + if (!m_frame) + return false; + Document* doc = m_frame->document(); + if (!doc) + return false; + RenderObject* renderView = doc->renderer(); + if (!renderView) + return false; + return renderView->style()->isFlippedBlocksWritingMode(); +} + +void FrameView::notifyWidgetsInAllFrames(WidgetNotification notification) +{ + for (Frame* frame = m_frame.get(); frame; frame = frame->tree()->traverseNext(m_frame.get())) { + if (RenderView* root = frame->contentRenderer()) + root->notifyWidgets(notification); + } +} + } // namespace WebCore |