summaryrefslogtreecommitdiffstats
path: root/WebCore/page/FrameView.cpp
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2011-05-05 14:36:32 +0100
committerBen Murdoch <benm@google.com>2011-05-10 15:38:30 +0100
commitf05b935882198ccf7d81675736e3aeb089c5113a (patch)
tree4ea0ca838d9ef1b15cf17ddb3928efb427c7e5a1 /WebCore/page/FrameView.cpp
parent60fbdcc62bced8db2cb1fd233cc4d1e4ea17db1b (diff)
downloadexternal_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.cpp149
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