+2011-09-27 Simon Fraser <simon.fraser@apple.com>
+
+ Clean up how FrameView accesses the RenderView
+ https://bugs.webkit.org/show_bug.cgi?id=68914
+
+ Reviewed by Sam Weinig.
+
+ Clean up how FrameView accesses the content renderer of its
+ frame. Previously, this was done in several different ways,
+ only some of which did null-checking.
+
+ Use an inline method to avoid having to expose Frame
+ in the header.
+
+ Standardize the terminology to use 'root' for this RenderView.
+
+ * page/FrameView.cpp:
+ (WebCore::rootRenderer):
+ (WebCore::FrameView::setFrameRect):
+ (WebCore::FrameView::adjustViewSize):
+ (WebCore::FrameView::updateCompositingLayers):
+ (WebCore::FrameView::clearBackingStores):
+ (WebCore::FrameView::restoreBackingStores):
+ (WebCore::FrameView::layerForHorizontalScrollbar):
+ (WebCore::FrameView::layerForVerticalScrollbar):
+ (WebCore::FrameView::layerForScrollCorner):
+ (WebCore::FrameView::layerForOverhangAreas):
+ (WebCore::FrameView::syncCompositingStateForThisFrame):
+ (WebCore::FrameView::hasCompositedContent):
+ (WebCore::FrameView::enterCompositingMode):
+ (WebCore::FrameView::isSoftwareRenderable):
+ (WebCore::FrameView::didMoveOnscreen):
+ (WebCore::FrameView::willMoveOffscreen):
+ (WebCore::FrameView::layout):
+ (WebCore::FrameView::embeddedContentBox):
+ (WebCore::FrameView::contentsInCompositedLayer):
+ (WebCore::FrameView::scrollContentsFastPath):
+ (WebCore::FrameView::scrollContentsSlowPath):
+ (WebCore::FrameView::maintainScrollPositionAtAnchor):
+ (WebCore::FrameView::scrollPositionChanged):
+ (WebCore::FrameView::repaintFixedElementsAfterScrolling):
+ (WebCore::FrameView::visibleContentsResized):
+ (WebCore::FrameView::scheduleRelayoutOfSubtree):
+ (WebCore::FrameView::needsLayout):
+ (WebCore::FrameView::setNeedsLayout):
+ (WebCore::FrameView::performPostLayoutTasks):
+ (WebCore::FrameView::updateControlTints):
+ (WebCore::FrameView::paintContents):
+ (WebCore::FrameView::forceLayoutForPagination):
+ (WebCore::FrameView::adjustPageHeightDeprecated):
+ (WebCore::FrameView::isVerticalDocument):
+ (WebCore::FrameView::isFlippedDocument):
+
2011-09-27 Dominic Mazzoni <dmazzoni@google.com>
AXObjectCache cleared unnecessarily when non-top Document is detached.
// The maximum number of updateWidgets iterations that should be done before returning.
static const unsigned maxUpdateWidgetsIterations = 2;
+static inline RenderView* rootRenderer(const FrameView* view)
+{
+ return view->frame() ? view->frame()->contentRenderer() : 0;
+}
+
FrameView::FrameView(Frame* frame)
: m_frame(frame)
, m_canHaveScrollbars(true)
ScrollView::setFrameRect(newRect);
#if USE(ACCELERATED_COMPOSITING)
- if (RenderView* root = m_frame->contentRenderer()) {
+ if (RenderView* root = rootRenderer(this)) {
if (root->usesCompositing())
root->compositor()->frameViewDidChangeSize();
}
void FrameView::adjustViewSize()
{
- ASSERT(m_frame->view() == this);
- RenderView* root = m_frame->contentRenderer();
+ RenderView* root = rootRenderer(this);
if (!root)
return;
+ ASSERT(m_frame->view() == this);
+
const LayoutRect& rect = root->documentRect();
const LayoutSize& size = rect.size();
ScrollView::setScrollOrigin(LayoutPoint(-rect.x(), -rect.y()), !m_frame->document()->printing(), size == contentsSize());
#if USE(ACCELERATED_COMPOSITING)
void FrameView::updateCompositingLayers()
{
- RenderView* view = m_frame->contentRenderer();
- if (!view)
+ RenderView* root = rootRenderer(this);
+ if (!root)
return;
// This call will make sure the cached hasAcceleratedCompositing is updated from the pref
- view->compositor()->cacheAcceleratedCompositingFlags();
- view->compositor()->updateCompositingLayers(CompositingUpdateAfterLayoutOrStyleChange);
+ root->compositor()->cacheAcceleratedCompositingFlags();
+ root->compositor()->updateCompositingLayers(CompositingUpdateAfterLayoutOrStyleChange);
#if ENABLE(FULLSCREEN_API)
Document* document = m_frame->document();
if (isDocumentRunningFullScreenAnimation(document))
- view->compositor()->updateCompositingLayers(CompositingUpdateAfterLayoutOrStyleChange, document->fullScreenRenderer()->layer());
+ root->compositor()->updateCompositingLayers(CompositingUpdateAfterLayoutOrStyleChange, document->fullScreenRenderer()->layer());
#endif
}
void FrameView::clearBackingStores()
{
- RenderView* root = m_frame->contentRenderer();
+ RenderView* root = rootRenderer(this);
if (!root)
return;
void FrameView::restoreBackingStores()
{
- RenderView* root = m_frame->contentRenderer();
+ RenderView* root = rootRenderer(this);
if (!root)
return;
GraphicsLayer* FrameView::layerForHorizontalScrollbar() const
{
- RenderView* view = m_frame->contentRenderer();
- if (!view)
+ RenderView* root = rootRenderer(this);
+ if (!root)
return 0;
- return view->compositor()->layerForHorizontalScrollbar();
+ return root->compositor()->layerForHorizontalScrollbar();
}
GraphicsLayer* FrameView::layerForVerticalScrollbar() const
{
- RenderView* view = m_frame->contentRenderer();
- if (!view)
+ RenderView* root = rootRenderer(this);
+ if (!root)
return 0;
- return view->compositor()->layerForVerticalScrollbar();
+ return root->compositor()->layerForVerticalScrollbar();
}
GraphicsLayer* FrameView::layerForScrollCorner() const
{
- RenderView* view = m_frame->contentRenderer();
- if (!view)
+ RenderView* root = rootRenderer(this);
+ if (!root)
return 0;
- return view->compositor()->layerForScrollCorner();
+ return root->compositor()->layerForScrollCorner();
}
#if PLATFORM(CHROMIUM) && ENABLE(RUBBER_BANDING)
GraphicsLayer* FrameView::layerForOverhangAreas() const
{
- RenderView* view = m_frame->contentRenderer();
+ RenderView* root = rootRenderer(this);
if (!view)
return 0;
return view->compositor()->layerForOverhangAreas();
bool FrameView::syncCompositingStateForThisFrame(Frame* rootFrameForSync)
{
- ASSERT(m_frame->view() == this);
- RenderView* view = m_frame->contentRenderer();
- if (!view)
+ RenderView* root = rootRenderer(this);
+ if (!root)
return true; // We don't want to keep trying to update layers if we have no renderer.
+ ASSERT(m_frame->view() == this);
+
// If we sync compositing layers when a layout is pending, we may cause painting of compositing
// layer content to occur before layout has happened, which will cause paintContents() to bail.
if (needsLayout())
return false;
- view->compositor()->flushPendingLayerChanges(rootFrameForSync == m_frame);
+ root->compositor()->flushPendingLayerChanges(rootFrameForSync == m_frame);
#if ENABLE(FULLSCREEN_API)
// The fullScreenRenderer's graphicsLayer has been re-parented, and the above recursive syncCompositingState
bool FrameView::hasCompositedContent() const
{
#if USE(ACCELERATED_COMPOSITING)
- if (RenderView* view = m_frame->contentRenderer())
- return view->compositor()->inCompositingMode();
+ if (RenderView* root = rootRenderer(this))
+ return root->compositor()->inCompositingMode();
#endif
return false;
}
void FrameView::enterCompositingMode()
{
#if USE(ACCELERATED_COMPOSITING)
- if (RenderView* view = m_frame->contentRenderer()) {
- view->compositor()->enableCompositingMode();
+ if (RenderView* root = rootRenderer(this)) {
+ root->compositor()->enableCompositingMode();
if (!needsLayout())
- view->compositor()->scheduleCompositingLayerUpdate();
+ root->compositor()->scheduleCompositingLayerUpdate();
}
#endif
}
bool FrameView::isSoftwareRenderable() const
{
#if USE(ACCELERATED_COMPOSITING)
- RenderView* view = m_frame->contentRenderer();
- if (!view)
+ RenderView* root = rootRenderer(this);
+ if (!root)
return true;
- return !view->compositor()->has3DContent();
+ return !root->compositor()->has3DContent();
#else
return true;
#endif
void FrameView::didMoveOnscreen()
{
- RenderView* view = m_frame->contentRenderer();
- if (view)
- view->didMoveOnscreen();
+ RenderView* root = rootRenderer(this);
+ if (root)
+ root->didMoveOnscreen();
scrollAnimator()->contentAreaDidShow();
}
void FrameView::willMoveOffscreen()
{
- RenderView* view = m_frame->contentRenderer();
- if (view)
- view->willMoveOffscreen();
+ RenderView* root = rootRenderer(this);
+ if (root)
+ root->willMoveOffscreen();
scrollAnimator()->contentAreaDidHide();
}
if (!m_hasPendingPostLayoutTasks) {
if (!m_inSynchronousPostLayout) {
- if (inSubframeLayoutWithFrameFlattening)
- m_frame->contentRenderer()->updateWidgetPositions();
- else {
+ if (inSubframeLayoutWithFrameFlattening) {
+ if (RenderView* root = rootRenderer(this))
+ root->updateWidgetPositions();
+ } else {
m_inSynchronousPostLayout = true;
// Calls resumeScheduledEvents()
performPostLayoutTasks();
RenderBox* FrameView::embeddedContentBox() const
{
#if ENABLE(SVG)
- RenderView* contentRenderer = m_frame->contentRenderer();
- if (!contentRenderer)
+ RenderView* root = rootRenderer(this);
+ if (!root)
return 0;
- RenderObject* rootChild = contentRenderer->firstChild();
+ RenderObject* rootChild = root->firstChild();
if (!rootChild || !rootChild->isBox())
return 0;
bool FrameView::contentsInCompositedLayer() const
{
#if USE(ACCELERATED_COMPOSITING)
- RenderView* root = m_frame->contentRenderer();
+ RenderView* root = rootRenderer(this);
if (root && root->layer()->isComposited()) {
GraphicsLayer* layer = root->layer()->backing()->graphicsLayer();
if (layer && layer->drawsContent())
const size_t fixedObjectThreshold = 5;
RenderBlock::PositionedObjectsListHashSet* positionedObjects = 0;
- if (RenderView* root = m_frame->contentRenderer())
+ if (RenderView* root = rootRenderer(this))
positionedObjects = root->positionedObjects();
if (!positionedObjects || positionedObjects->isEmpty()) {
#if USE(ACCELERATED_COMPOSITING)
if (isCompositedContentLayer) {
updateRect = windowToContents(updateRect);
- RenderView* root = m_frame->contentRenderer();
+ RenderView* root = rootRenderer(this);
ASSERT(root);
root->layer()->setBackingNeedsRepaintInRect(updateRect);
continue;
{
#if USE(ACCELERATED_COMPOSITING)
if (contentsInCompositedLayer()) {
- RenderView* root = m_frame->contentRenderer();
+ RenderView* root = rootRenderer(this);
ASSERT(root);
root->layer()->setBackingNeedsRepaintInRect(visibleContentRect());
}
// really mess things up if an anchor scroll comes at a bad moment.
m_frame->document()->updateStyleIfNeeded();
// Only do a layout if changes have occurred that make it necessary.
- if (m_frame->contentRenderer() && m_frame->contentRenderer()->needsLayout())
+ RenderView* root = rootRenderer(this);
+ if (root && root->needsLayout())
layout();
else
scrollToAnchor();
frame()->eventHandler()->sendScrollEvent();
#if USE(ACCELERATED_COMPOSITING)
- if (RenderView* root = m_frame->contentRenderer()) {
+ if (RenderView* root = rootRenderer(this)) {
if (root->usesCompositing())
root->compositor()->frameViewDidScroll(scrollPosition());
}
// For fixed position elements, update widget positions and compositing layers after scrolling,
// but only if we're not inside of layout.
if (!m_nestedLayoutCount && hasFixedObjects()) {
- if (RenderView* root = m_frame->contentRenderer()) {
+ if (RenderView* root = rootRenderer(this)) {
root->updateWidgetPositions();
root->layer()->updateLayerPositionsAfterScroll();
#if USE(ACCELERATED_COMPOSITING)
layout();
#if USE(ACCELERATED_COMPOSITING)
- if (RenderView* root = m_frame->contentRenderer()) {
+ if (RenderView* root = rootRenderer(this)) {
if (root->usesCompositing())
root->compositor()->frameViewDidChangeSize();
}
{
ASSERT(m_frame->view() == this);
- if (m_frame->contentRenderer() && m_frame->contentRenderer()->needsLayout()) {
+ RenderView* root = rootRenderer(this);
+ if (root && root->needsLayout()) {
if (relayoutRoot)
relayoutRoot->markContainingBlocksForLayout(false);
return;
// layout in that case.
if (!m_frame)
return false;
- RenderView* root = m_frame->contentRenderer();
+
+ RenderView* root = rootRenderer(this);
return layoutPending()
|| (root && root->needsLayout())
|| m_layoutRoot
m_setNeedsLayoutWasDeferred = true;
return;
}
- RenderView* root = m_frame->contentRenderer();
- if (root)
+
+ if (RenderView* root = rootRenderer(this))
root->setNeedsLayout(true);
}
m_frame->loader()->client()->dispatchDidLayout();
- RenderView* root = m_frame->contentRenderer();
-
+ RenderView* root = rootRenderer(this);
root->updateWidgetPositions();
for (unsigned i = 0; i < maxUpdateWidgetsIterations; i++) {
if (!m_frame || m_frame->document()->url().isEmpty())
return;
- if ((m_frame->contentRenderer() && m_frame->contentRenderer()->theme()->supportsControlTints()) || hasCustomScrollbars())
+ RenderView* root = rootRenderer(this);
+ if ((root && root->theme()->supportsControlTints()) || hasCustomScrollbars())
paintControlTints();
}
if (isTopLevelPainter)
sCurrentPaintTimeStamp = currentTime();
- RenderView* contentRenderer = frame()->contentRenderer();
- if (!contentRenderer) {
+ RenderView* root = rootRenderer(this);
+ if (!root) {
LOG_ERROR("called FrameView::paint with nil renderer");
return;
}
// m_nodeToDraw is used to draw only one element (and its descendants)
RenderObject* eltRenderer = m_nodeToDraw ? m_nodeToDraw->renderer() : 0;
- RenderLayer* rootLayer = contentRenderer->layer();
+ RenderLayer* rootLayer = root->layer();
rootLayer->paint(p, rect, m_paintBehavior, eltRenderer);
{
// Dumping externalRepresentation(m_frame->renderer()).ascii() is a good trick to see
// the state of things before and after the layout
- RenderView *root = toRenderView(m_frame->document()->renderer());
- if (root) {
+ if (RenderView* root = rootRenderer(this)) {
float pageLogicalWidth = root->style()->isHorizontalWritingMode() ? pageSize.width() : pageSize.height();
float pageLogicalHeight = root->style()->isHorizontalWritingMode() ? pageSize.height() : pageSize.width();
void FrameView::adjustPageHeightDeprecated(float *newBottom, float oldTop, float oldBottom, float /*bottomLimit*/)
{
- RenderView* root = m_frame->contentRenderer();
- if (root) {
+ if (RenderView* root = rootRenderer(this)) {
// Use a context with painting disabled.
GraphicsContext context((PlatformGraphicsContext*)0);
root->setTruncatedAt((int)floorf(oldBottom));
bool FrameView::isVerticalDocument() const
{
- if (!m_frame)
- return true;
- Document* doc = m_frame->document();
- if (!doc)
- return true;
- RenderObject* renderView = doc->renderer();
- if (!renderView)
+ RenderView* root = rootRenderer(this);
+ if (!root)
return true;
- return renderView->style()->isHorizontalWritingMode();
+
+ return root->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)
+ RenderView* root = rootRenderer(this);
+ if (!root)
return false;
- return renderView->style()->isFlippedBlocksWritingMode();
+
+ return root->style()->isFlippedBlocksWritingMode();
}
void FrameView::notifyWidgetsInAllFrames(WidgetNotification notification)