15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org>
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *                     1999 Lars Knoll <knoll@kde.org>
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *                     1999 Antti Koivisto <koivisto@kde.org>
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *                     2000 Dirk Mueller <mueller@kde.org>
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2006 Graham Dennis (graham.dennis@gmail.com)
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2006 Alexey Proskuryakov (ap@nypop.com)
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Google Inc. All rights reserved.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
281e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/FrameView.h"
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "HTMLNames.h"
3181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "RuntimeEnabledFeatures.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/accessibility/AXObjectCache.h"
3351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/animation/DocumentAnimations.h"
349bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/css/FontFaceSet.h"
3581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "core/css/resolver/StyleResolver.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentMarkerController.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/FrameSelection.h"
381e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/OverflowEvent.h"
39e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/ResourceFetcher.h"
40a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "core/fetch/ResourceLoadPriorityOptimizer.h"
418abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "core/fetch/TextResourceDecoder.h"
42e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)#include "core/frame/Frame.h"
43e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)#include "core/frame/GraphicsLayerDebugInfo.h"
44e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)#include "core/frame/Settings.h"
45e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)#include "core/frame/animation/AnimationController.h"
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFrameElement.h"
47e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/html/HTMLHtmlElement.h"
48f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "core/html/HTMLPlugInElement.h"
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorInstrumentation.h"
5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoader.h"
5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoaderClient.h"
5253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Chrome.h"
5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/ChromeClient.h"
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/EventHandler.h"
5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FocusController.h"
5653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FrameTree.h"
5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/scrolling/ScrollingCoordinator.h"
581e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/rendering/CompositedLayerMapping.h"
598abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "core/rendering/LayoutIndicator.h"
608abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "core/rendering/RenderCounter.h"
6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderEmbeddedObject.h"
6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderLayer.h"
6353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderLayerCompositor.h"
6453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderPart.h"
6553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderScrollbar.h"
6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderScrollbarPart.h"
6753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTheme.h"
6853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h"
6953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/TextAutosizer.h"
7053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/RenderStyle.h"
7193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/rendering/svg/RenderSVGRoot.h"
7293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/svg/SVGDocument.h"
7393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/svg/SVGSVGElement.h"
74e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)#include "platform/TraceEvent.h"
75a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/FontCache.h"
761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/FloatRect.h"
77a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsContext.h"
78a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/ScrollAnimator.h"
79a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/ScrollbarTheme.h"
801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/text/TextStream.h"
81591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/CurrentTime.h"
82591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/TemporaryChange.h"
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames;
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
88e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)double FrameView::s_currentFrameTimeStamp = 0.0;
89e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)bool FrameView::s_inPaintContents = false;
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// REPAINT_THROTTLING now chooses default values for throttling parameters.
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Should be removed when applications start using runtime configuration.
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(REPAINT_THROTTLING)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Normal delay
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double FrameView::s_normalDeferredRepaintDelay = 0.016;
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Negative value would mean that first few repaints happen without a delay
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double FrameView::s_initialDeferredRepaintDelayDuringLoading = 0;
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The delay grows on each repaint to this maximum value
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double FrameView::s_maxDeferredRepaintDelayDuringLoading = 2.5;
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// On each repaint the delay increses by this amount
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double FrameView::s_deferredRepaintDelayIncrementDuringLoading = 0.5;
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: Repaint throttling could be good to have on all platform.
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The balance between CPU use and repaint frequency will need some tuning for desktop.
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// More hooks may be needed to reset the delay on things like GIF and CSS animations.
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double FrameView::s_normalDeferredRepaintDelay = 0;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double FrameView::s_initialDeferredRepaintDelayDuringLoading = 0;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double FrameView::s_maxDeferredRepaintDelayDuringLoading = 0;
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double FrameView::s_deferredRepaintDelayIncrementDuringLoading = 0;
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The maximum number of updateWidgets iterations that should be done before returning.
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const unsigned maxUpdateWidgetsIterations = 2;
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static RenderLayer::UpdateLayerPositionsFlags updateLayerPositionFlags(RenderLayer* layer, bool isRelayoutingSubtree, bool didFullRepaint)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderLayer::UpdateLayerPositionsFlags flags = RenderLayer::defaultFlags;
119a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (didFullRepaint) {
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        flags &= ~RenderLayer::CheckForRepaint;
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        flags |= RenderLayer::NeedsFullRepaintInBacking;
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isRelayoutingSubtree && layer->isPaginated())
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        flags |= RenderLayer::UpdatePagination;
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return flags;
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Pagination::Mode paginationModeForRenderStyle(RenderStyle* style)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EOverflow overflow = style->overflowY();
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (overflow != OPAGEDX && overflow != OPAGEDY)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Pagination::Unpaginated;
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isHorizontalWritingMode = style->isHorizontalWritingMode();
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TextDirection textDirection = style->direction();
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WritingMode writingMode = style->writingMode();
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // paged-x always corresponds to LeftToRightPaginated or RightToLeftPaginated. If the WritingMode
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // is horizontal, then we use TextDirection to choose between those options. If the WritingMode
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // is vertical, then the direction of the verticality dictates the choice.
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (overflow == OPAGEDX) {
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ((isHorizontalWritingMode && textDirection == LTR) || writingMode == LeftToRightWritingMode)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return Pagination::LeftToRightPaginated;
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Pagination::RightToLeftPaginated;
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // paged-y always corresponds to TopToBottomPaginated or BottomToTopPaginated. If the WritingMode
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // is horizontal, then the direction of the horizontality dictates the choice. If the WritingMode
150591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    // is vertical, then we use TextDirection to choose between those options.
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (writingMode == TopToBottomWritingMode || (!isHorizontalWritingMode && textDirection == RTL))
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Pagination::TopToBottomPaginated;
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Pagination::BottomToTopPaginated;
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)FrameView::DeferredRepaintScope::DeferredRepaintScope(FrameView& view)
1571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    : m_view(&view)
1581e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
1591e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    m_view->beginDeferredRepaints();
1601e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
1611e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1621e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)FrameView::DeferredRepaintScope::~DeferredRepaintScope()
1631e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
1641e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    m_view->endDeferredRepaints();
1651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
1661e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FrameView::FrameView(Frame* frame)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_frame(frame)
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_canHaveScrollbars(true)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_slowRepaintObjectCount(0)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_layoutTimer(this, &FrameView::layoutTimerFired)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_layoutRoot(0)
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_inSynchronousPostLayout(false)
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_postLayoutTasksTimer(this, &FrameView::postLayoutTimerFired)
17551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    , m_updateWidgetsTimer(this, &FrameView::updateWidgetsTimerFired)
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isTransparent(false)
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_baseBackgroundColor(Color::white)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_mediaType("screen")
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_overflowStatusDirty(true)
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_viewportRenderer(0)
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_wasScrolledByUser(false)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_inProgrammaticScroll(false)
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_safeToPropagateScrollToParent(true)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_deferredRepaintTimer(this, &FrameView::deferredRepaintTimerFired)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isTrackingRepaints(false)
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_shouldUpdateWhileOffscreen(true)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_scrollCorner(0)
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_shouldAutoSize(false)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_inAutoSize(false)
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_didRunAutosize(false)
191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_hasSoftwareFilters(false)
19253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    , m_visibleContentScaleFactor(1)
1931e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    , m_inputEventsScaleFactorForEmulation(1)
1948abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    , m_partialLayout()
195bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    , m_layoutSizeFixedToFrameSize(true)
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1978abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ASSERT(m_frame);
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    init();
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2008abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!isMainFrame())
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2038abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ScrollableArea::setVerticalScrollElasticity(ScrollElasticityAllowed);
2048abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ScrollableArea::setHorizontalScrollElasticity(ScrollElasticityAllowed);
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<FrameView> FrameView::create(Frame* frame)
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<FrameView> view = adoptRef(new FrameView(frame));
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    view->show();
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return view.release();
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<FrameView> FrameView::create(Frame* frame, const IntSize& initialSize)
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<FrameView> view = adoptRef(new FrameView(frame));
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    view->Widget::setFrameRect(IntRect(view->location(), initialSize));
218bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    view->setLayoutSizeInternal(initialSize);
219bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    view->show();
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return view.release();
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FrameView::~FrameView()
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
22651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_postLayoutTasksTimer.isActive())
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_postLayoutTasksTimer.stop();
228591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    removeFromAXObjectCache();
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resetScrollbars();
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Custom scrollbars should already be destroyed at this point
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!horizontalScrollbar() || !horizontalScrollbar()->isCustomScrollbar());
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!verticalScrollbar() || !verticalScrollbar()->isCustomScrollbar());
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setHasHorizontalScrollbar(false); // Remove native scrollbars now before we lose the connection to the HostWindow.
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setHasVerticalScrollbar(false);
238591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_scrollCorner);
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2418abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ASSERT(m_frame);
2428abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ASSERT(m_frame->view() != this || !m_frame->contentRenderer());
2438abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    RenderPart* renderer = m_frame->ownerRenderer();
2448abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (renderer && renderer->widget() == this)
2458abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        renderer->setWidget(0);
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::reset()
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_cannotBlitToWindow = false;
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isOverlapped = false;
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_contentIsOpaque = false;
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_borderX = 30;
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_borderY = 30;
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_layoutTimer.stop();
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_layoutRoot = 0;
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_delayedLayout = false;
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_doFullRepaint = true;
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_layoutSchedulingEnabled = true;
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inLayout = false;
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_doingPreLayoutStyleUpdate = false;
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inSynchronousPostLayout = false;
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_layoutCount = 0;
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_nestedLayoutCount = 0;
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_postLayoutTasksTimer.stop();
26651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_updateWidgetsTimer.stop();
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_firstLayout = true;
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_firstLayoutCallbackPending = false;
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_wasScrolledByUser = false;
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_safeToPropagateScrollToParent = true;
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastViewportSize = IntSize();
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastZoomFactor = 1.0f;
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deferringRepaints = 0;
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_repaintCount = 0;
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_repaintRects.clear();
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deferredRepaintDelay = s_initialDeferredRepaintDelayDuringLoading;
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deferredRepaintTimer.stop();
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isTrackingRepaints = false;
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_trackedRepaintRects.clear();
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastPaintTime = 0;
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_paintBehavior = PaintBehaviorNormal;
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isPainting = false;
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_visuallyNonEmptyCharacterCount = 0;
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_visuallyNonEmptyPixelCount = 0;
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isVisuallyNonEmpty = false;
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_firstVisuallyNonEmptyLayoutCallbackPending = true;
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_maintainScrollPositionAnchor = 0;
2888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    m_partialLayout.reset();
28951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_viewportConstrainedObjects.clear();
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void FrameView::removeFromAXObjectCache()
293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (AXObjectCache* cache = axObjectCache())
295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        cache->remove(this);
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::resetScrollbars()
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Reset the document's scrollbars back to our defaults before we yield the floor.
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_firstLayout = true;
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setScrollbarsSuppressed(true);
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_canHaveScrollbars)
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setScrollbarModes(ScrollbarAuto, ScrollbarAuto);
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setScrollbarModes(ScrollbarAlwaysOff, ScrollbarAlwaysOff);
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setScrollbarsSuppressed(false);
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::init()
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    reset();
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_margins = LayoutSize(-1, -1); // undefined
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_size = LayoutSize();
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Propagate the marginwidth/height and scrolling modes to the view.
3188abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Element* ownerElement = m_frame->ownerElement();
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ownerElement && (ownerElement->hasTagName(frameTag) || ownerElement->hasTagName(iframeTag))) {
320e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        HTMLFrameElementBase* frameElt = toHTMLFrameElementBase(ownerElement);
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (frameElt->scrollingMode() == ScrollbarAlwaysOff)
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setCanHaveScrollbars(false);
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit marginWidth = frameElt->marginWidth();
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit marginHeight = frameElt->marginHeight();
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (marginWidth != -1)
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setMarginWidth(marginWidth);
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (marginHeight != -1)
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setMarginHeight(marginHeight);
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
331591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
332926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void FrameView::prepareForDetach()
333926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
3347757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    RELEASE_ASSERT(!isInLayout());
3357757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
336fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    if (ScrollAnimator* scrollAnimator = existingScrollAnimator())
337fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        scrollAnimator->cancelAnimations();
338fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
339926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    detachCustomScrollbars();
340926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // When the view is no longer associated with a frame, it needs to be removed from the ax object cache
341926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // right now, otherwise it won't be able to reach the topDocument()'s axObject cache later.
342926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    removeFromAXObjectCache();
343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3448abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (m_frame->page()) {
345926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (ScrollingCoordinator* scrollingCoordinator = m_frame->page()->scrollingCoordinator())
346926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            scrollingCoordinator->willDestroyScrollableArea(this);
347926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
348926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::detachCustomScrollbars()
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Scrollbar* horizontalBar = horizontalScrollbar();
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (horizontalBar && horizontalBar->isCustomScrollbar())
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setHasHorizontalScrollbar(false);
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Scrollbar* verticalBar = verticalScrollbar();
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (verticalBar && verticalBar->isCustomScrollbar())
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setHasVerticalScrollbar(false);
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_scrollCorner) {
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollCorner->destroy();
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollCorner = 0;
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::recalculateScrollbarOverlayStyle()
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollbarOverlayStyle oldOverlayStyle = scrollbarOverlayStyle();
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollbarOverlayStyle overlayStyle = ScrollbarOverlayStyleDefault;
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3718abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Color backgroundColor = documentBackgroundColor();
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (backgroundColor.isValid()) {
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Reduce the background color from RGB to a lightness value
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // and determine which scrollbar style to use based on a lightness
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // heuristic.
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        double hue, saturation, lightness;
3778abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        backgroundColor.getHSL(hue, saturation, lightness);
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (lightness <= .5)
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            overlayStyle = ScrollbarOverlayStyleLight;
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (oldOverlayStyle != overlayStyle)
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setScrollbarOverlayStyle(overlayStyle);
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::clear()
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setCanBlitOnScroll(true);
389591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    reset();
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (RenderPart* renderer = m_frame->ownerRenderer())
3938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        renderer->viewCleared();
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setScrollbarsSuppressed(true);
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::didFirstLayout() const
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !m_firstLayout;
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::invalidateRect(const IntRect& rect)
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!parent()) {
406521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (HostWindow* window = hostWindow())
407521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            window->invalidateContentsAndRootView(rect);
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderPart* renderer = m_frame->ownerRenderer();
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!renderer)
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect repaintRect = rect;
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    repaintRect.move(renderer->borderLeft() + renderer->paddingLeft(),
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     renderer->borderTop() + renderer->paddingTop());
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    renderer->repaintRectangle(repaintRect);
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setFrameRect(const IntRect& newRect)
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect oldRect = frameRect();
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (newRect == oldRect)
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
427926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Autosized font sizes depend on the width of the viewing area.
428926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (newRect.width() != oldRect.width()) {
4298abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        Page* page = m_frame->page();
4308abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (isMainFrame() && page->settings().textAutosizingEnabled()) {
431a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            TextAutosizer* textAutosizer = m_frame->document()->textAutosizer();
432a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            if (textAutosizer) {
433a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                for (Frame* frame = page->mainFrame(); frame; frame = frame->tree().traverseNext())
434a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                    textAutosizer->recalculateMultipliers();
435a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            }
436926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
437926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
438926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::setFrameRect(newRect);
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateScrollableAreaSet();
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
443926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (RenderView* renderView = this->renderView()) {
444926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (renderView->usesCompositing())
445926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->compositor()->frameViewDidChangeSize();
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::scheduleAnimation()
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4511fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    if (HostWindow* window = hostWindow()) {
4521fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        window->scheduleAnimation();
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)RenderView* FrameView::renderView() const
4598abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
4608abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return frame().contentRenderer();
4618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
4628abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setMarginWidth(LayoutUnit w)
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // make it update the rendering area when set
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_margins.setWidth(w);
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setMarginHeight(LayoutUnit h)
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // make it update the rendering area when set
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_margins.setHeight(h);
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setCanHaveScrollbars(bool canHaveScrollbars)
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_canHaveScrollbars = canHaveScrollbars;
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::setCanHaveScrollbars(canHaveScrollbars);
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateCanHaveScrollbars()
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollbarMode hMode;
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollbarMode vMode;
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    scrollbarModes(hMode, vMode);
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hMode == ScrollbarAlwaysOff && vMode == ScrollbarAlwaysOff)
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setCanHaveScrollbars(false);
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setCanHaveScrollbars(true);
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49277e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)bool FrameView::shouldUseCustomScrollbars(Element*& customScrollbarElement, Frame*& customScrollbarFrame)
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
49477e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)    customScrollbarElement = 0;
49577e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)    customScrollbarFrame = 0;
49677e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)
497926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (Settings* settings = m_frame->settings()) {
4988abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (!settings->allowCustomScrollbarInMainFrame() && isMainFrame())
49977e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)            return false;
500926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
501926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: We need to update the scrollbar dynamically as documents change (or as doc elements and bodies get discovered that have custom styles).
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* doc = m_frame->document();
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Try the <body> element first as a scrollbar source.
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* body = doc ? doc->body() : 0;
50777e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)    if (body && body->renderer() && body->renderer()->style()->hasPseudoStyle(SCROLLBAR)) {
50877e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)        customScrollbarElement = body;
50977e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)        return true;
51077e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)    }
511591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the <body> didn't have a custom style, then the root element might.
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* docElement = doc ? doc->documentElement() : 0;
51477e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)    if (docElement && docElement->renderer() && docElement->renderer()->style()->hasPseudoStyle(SCROLLBAR)) {
51577e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)        customScrollbarElement = docElement;
51677e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)        return true;
51777e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)    }
518591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
5191e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    // If we have an owning ipage/Frame element, then it can set the custom scrollbar also.
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderPart* frameRenderer = m_frame->ownerRenderer();
52177e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)    if (frameRenderer && frameRenderer->style()->hasPseudoStyle(SCROLLBAR)) {
52277e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)        customScrollbarFrame = m_frame.get();
52377e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)        return true;
52477e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)    }
52577e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)
52677e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)    return false;
52777e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)}
52877e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)
52977e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)PassRefPtr<Scrollbar> FrameView::createScrollbar(ScrollbarOrientation orientation)
53077e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles){
53177e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)    Element* customScrollbarElement = 0;
53277e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)    Frame* customScrollbarFrame = 0;
53377e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)    if (shouldUseCustomScrollbars(customScrollbarElement, customScrollbarFrame))
53477e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)        return RenderScrollbar::createCustomScrollbar(this, orientation, customScrollbarElement, customScrollbarFrame);
535591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Nobody set a custom style, so we just use a native scrollbar.
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ScrollView::createScrollbar(orientation);
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setContentsSize(const IntSize& size)
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (size == contentsSize())
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::setContentsSize(size);
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::contentsResized();
547591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
5488abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Page* page = frame().page();
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateScrollableAreaSet();
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
554a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    page->chrome().contentsSizeChanged(m_frame.get(), size);
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::adjustViewSize()
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
559926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
560926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame->view() == this);
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
565926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const IntRect rect = renderView->documentRect();
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const IntSize& size = rect.size();
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::setScrollOrigin(IntPoint(-rect.x(), -rect.y()), !m_frame->document()->printing(), size == contentsSize());
568591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setContentsSize(size);
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::applyOverflowToViewport(RenderObject* o, ScrollbarMode& hMode, ScrollbarMode& vMode)
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Handle the overflow:hidden/scroll case for the body/html elements.  WinIE treats
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // overflow:hidden and overflow:scroll on <body> as applying to the document's
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // scrollbars.  The CSS2.1 draft states that HTML UAs should use the <html> or <body> element and XML/XHTML UAs should
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // use the root element.
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EOverflow overflowX = o->style()->overflowX();
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EOverflow overflowY = o->style()->overflowY();
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (o->isSVGRoot()) {
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // overflow is ignored in stand-alone SVG documents.
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!toRenderSVGRoot(o)->isEmbeddedThroughFrameContainingSVGDocument())
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        overflowX = OHIDDEN;
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        overflowY = OHIDDEN;
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    bool ignoreOverflowHidden = false;
59151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_frame->settings()->ignoreMainFrameOverflowHiddenQuirk() && m_frame->isMainFrame())
59206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        ignoreOverflowHidden = true;
59306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (overflowX) {
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case OHIDDEN:
59606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)            if (!ignoreOverflowHidden)
59706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)                hMode = ScrollbarAlwaysOff;
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case OSCROLL:
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            hMode = ScrollbarAlwaysOn;
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case OAUTO:
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            hMode = ScrollbarAuto;
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Don't set it at all.
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ;
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
609591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     switch (overflowY) {
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case OHIDDEN:
61206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)            if (!ignoreOverflowHidden)
61306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)                vMode = ScrollbarAlwaysOff;
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case OSCROLL:
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            vMode = ScrollbarAlwaysOn;
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case OAUTO:
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            vMode = ScrollbarAuto;
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Don't set it at all. Values of OPAGEDX and OPAGEDY are handled by applyPaginationToViewPort().
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ;
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_viewportRenderer = o;
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::applyPaginationToViewport()
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* document = m_frame->document();
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* documentElement = document->documentElement();
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* documentRenderer = documentElement ? documentElement->renderer() : 0;
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* documentOrBodyRenderer = documentRenderer;
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* body = document->body();
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (body && body->renderer()) {
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (body->hasTagName(bodyTag))
638e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            documentOrBodyRenderer = documentRenderer->style()->overflowX() == OVISIBLE && isHTMLHtmlElement(documentElement) ? body->renderer() : documentRenderer;
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Pagination pagination;
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!documentOrBodyRenderer) {
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setPagination(pagination);
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EOverflow overflowY = documentOrBodyRenderer->style()->overflowY();
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (overflowY == OPAGEDX || overflowY == OPAGEDY) {
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        pagination.mode = WebCore::paginationModeForRenderStyle(documentOrBodyRenderer->style());
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        pagination.gap = static_cast<unsigned>(documentOrBodyRenderer->style()->columnGap());
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setPagination(pagination);
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::calculateScrollbarModesForLayout(ScrollbarMode& hMode, ScrollbarMode& vMode, ScrollbarModesCalculationStrategy strategy)
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_viewportRenderer = 0;
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const HTMLFrameOwnerElement* owner = m_frame->ownerElement();
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (owner && (owner->scrollingMode() == ScrollbarAlwaysOff)) {
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hMode = ScrollbarAlwaysOff;
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        vMode = ScrollbarAlwaysOff;
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
666591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    }
667591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_canHaveScrollbars || strategy == RulesFromWebContentOnly) {
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hMode = ScrollbarAuto;
670926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Seamless documents begin with heights of 0; we special case that here
671926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // to correctly render documents that don't need scrollbars.
672926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        IntSize fullVisibleSize = visibleContentRect(IncludeScrollbars).size();
6738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        bool isSeamlessDocument = frame().document() && frame().document()->shouldDisplaySeamlesslyWithParent();
674926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        vMode = (isSeamlessDocument && !fullVisibleSize.height()) ? ScrollbarAlwaysOff : ScrollbarAuto;
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hMode = ScrollbarAlwaysOff;
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        vMode = ScrollbarAlwaysOff;
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
679591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_layoutRoot) {
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Document* document = m_frame->document();
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Node* documentElement = document->documentElement();
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderObject* rootRenderer = documentElement ? documentElement->renderer() : 0;
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Node* body = document->body();
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (body && body->renderer()) {
68693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            if (body->hasTagName(framesetTag)) {
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                vMode = ScrollbarAlwaysOff;
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                hMode = ScrollbarAlwaysOff;
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else if (body->hasTagName(bodyTag)) {
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // It's sufficient to just check the X overflow,
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // since it's illegal to have visible in only one direction.
692e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                RenderObject* o = rootRenderer->style()->overflowX() == OVISIBLE && isHTMLHtmlElement(document->documentElement()) ? body->renderer() : rootRenderer;
6938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)                if (o->style())
6948abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)                    applyOverflowToViewport(o, hMode, vMode);
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (rootRenderer)
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            applyOverflowToViewport(rootRenderer, hMode, vMode);
698591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    }
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateCompositingLayersAfterStyleChange()
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
703e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    TRACE_EVENT0("webkit", "FrameView::updateCompositingLayersAfterStyleChange");
704926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
705926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If we expect to update compositing after an incipient layout, don't do so here.
709926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_doingPreLayoutStyleUpdate || layoutPending() || renderView->needsLayout())
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This call will make sure the cached hasAcceleratedCompositing is updated from the pref
713926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    renderView->compositor()->cacheAcceleratedCompositingFlags();
714521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
715521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // Sometimes we will change a property (for example, z-index) that will not
716521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // cause a layout, but will require us to update compositing state. We only
717521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // need to do this if a layout is not already scheduled.
718521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (!needsLayout())
719521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        renderView->compositor()->updateCompositingRequirementsState();
720521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
721926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    renderView->compositor()->updateCompositingLayers(CompositingUpdateAfterStyleChange);
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateCompositingLayersAfterLayout()
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
726e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    TRACE_EVENT0("webkit", "FrameView::updateCompositingLayersAfterLayout");
727926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
728926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This call will make sure the cached hasAcceleratedCompositing is updated from the pref
732926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    renderView->compositor()->cacheAcceleratedCompositingFlags();
7335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    renderView->compositor()->updateCompositingRequirementsState();
734926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    renderView->compositor()->updateCompositingLayers(CompositingUpdateAfterLayout);
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
737926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool FrameView::usesCompositedScrolling() const
738926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
739926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
740926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
741926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
742926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_frame->settings() && m_frame->settings()->compositedScrollingForFramesEnabled())
743926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return renderView->compositor()->inForcedCompositingMode();
744926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return false;
745926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
746926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
747926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)GraphicsLayer* FrameView::layerForScrolling() const
748926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
749926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
750926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
751926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
752926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return renderView->compositor()->scrollLayer();
753926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
754926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GraphicsLayer* FrameView::layerForHorizontalScrollbar() const
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
757926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
758926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
760926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return renderView->compositor()->layerForHorizontalScrollbar();
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GraphicsLayer* FrameView::layerForVerticalScrollbar() const
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
765926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
766926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
768926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return renderView->compositor()->layerForVerticalScrollbar();
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GraphicsLayer* FrameView::layerForScrollCorner() const
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
773926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
774926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
776926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return renderView->compositor()->layerForScrollCorner();
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::hasCompositedContent() const
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
781926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (RenderView* renderView = this->renderView())
782926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return renderView->compositor()->inCompositingMode();
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isEnclosedInCompositingLayer() const
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* frameOwnerRenderer = m_frame->ownerRenderer();
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (frameOwnerRenderer && frameOwnerRenderer->containerForRepaint())
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FrameView* parentView = parentFrameView())
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return parentView->isEnclosedInCompositingLayer();
79453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
797591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isSoftwareRenderable() const
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
800926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
801926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return !renderView || !renderView->compositor()->has3DContent();
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderObject* FrameView::layoutRoot(bool onlyDuringLayout) const
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return onlyDuringLayout && layoutPending() ? 0 : m_layoutRoot;
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline void collectFrameViewChildren(FrameView* frameView, Vector<RefPtr<FrameView> >& frameViews)
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const HashSet<RefPtr<Widget> >* viewChildren = frameView->children();
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(viewChildren);
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const HashSet<RefPtr<Widget> >::iterator end = viewChildren->end();
8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (HashSet<RefPtr<Widget> >::iterator current = viewChildren->begin(); current != end; ++current) {
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Widget* widget = (*current).get();
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (widget->isFrameView())
818926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            frameViews.append(toFrameView(widget));
8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void FrameView::forceLayoutParentViewIfNeeded()
8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderPart* ownerRenderer = m_frame->ownerRenderer();
8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!ownerRenderer || !ownerRenderer->frame())
8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderBox* contentBox = embeddedContentBox();
8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!contentBox)
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderSVGRoot* svgRoot = toRenderSVGRoot(contentBox);
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (svgRoot->everHadLayout() && !svgRoot->needsLayout())
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the embedded SVG document appears the first time, the ownerRenderer has already finished
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // layout without knowing about the existence of the embedded SVG document, because RenderReplaced
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // embeddedContentBox() returns 0, as long as the embedded document isn't loaded yet. Before
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // bothering to lay out the SVG document, mark the ownerRenderer needing layout and ask its
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FrameView for a layout. After that the RenderEmbeddedObject (ownerRenderer) carries the
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // correct size, which RenderSVGRoot::computeReplacedLogicalWidth/Height rely on, when laying
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // out for the first time, or when the RenderSVGRoot size has changed dynamically (eg. via <script>).
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<FrameView> frameView = ownerRenderer->frame()->view();
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Mark the owner renderer as needing layout.
8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ownerRenderer->setNeedsLayoutAndPrefWidthsRecalc();
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Synchronously enter layout, to layout the view containing the host object/embed/iframe.
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frameView);
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frameView->layout();
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
853e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void FrameView::performPreLayoutTasks()
854e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
855e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // Don't schedule more layouts, we're in one.
856e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    TemporaryChange<bool> changeSchedulingEnabled(m_layoutSchedulingEnabled, false);
857e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
8588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!m_nestedLayoutCount && !m_inSynchronousPostLayout && m_postLayoutTasksTimer.isActive() && !frame().document()->shouldDisplaySeamlesslyWithParent()) {
859e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        // This is a new top-level layout. If there are any remaining tasks from the previous layout, finish them now.
860e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        m_inSynchronousPostLayout = true;
861e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        performPostLayoutTasks();
862e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        m_inSynchronousPostLayout = false;
863e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
864e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
865e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // Viewport-dependent media queries may cause us to need completely different style information.
866e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    Document* document = m_frame->document();
867a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!document->styleResolver() || document->styleResolver()->affectedByViewportChange()) {
868e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        document->styleResolverChanged(RecalcStyleDeferred);
86951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        document->mediaQueryAffectingValueChanged();
87051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
871e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        // FIXME: This instrumentation event is not strictly accurate since cached media query results
872e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        //        do not persist across StyleResolver rebuilds.
873e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        InspectorInstrumentation::mediaQueryResultChanged(document);
874e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    } else {
875e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        document->evaluateMediaQueryList();
876e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
877e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
878e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // If there is any pagination to apply, it will affect the RenderView's style, so we should
879e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // take care of that now.
880e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    applyPaginationToViewport();
881e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
882e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // Always ensure our style info is up-to-date. This can happen in situations where
883e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // the layout beats any sort of style recalc update that needs to occur.
884e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    TemporaryChange<bool> changeDoingPreLayoutStyleUpdate(m_doingPreLayoutStyleUpdate, true);
885e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    document->updateStyleIfNeeded();
886e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
887e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
888e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void FrameView::performLayout(RenderObject* rootForThisLayout, bool inSubtreeLayout)
889e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
890e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // performLayout is the actual guts of layout().
891e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // FIXME: The 300 other lines in layout() probably belong in other helper functions
892e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // so that a single human could understand what layout() is actually doing.
8931e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    FrameView::DeferredRepaintScope deferRepaints(*this);
8941e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
8958abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    {
8968abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        bool disableLayoutState = false;
8978abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (inSubtreeLayout) {
8988abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            RenderView* view = rootForThisLayout->view();
8998abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            disableLayoutState = view->shouldDisableLayoutStateForSubtree(rootForThisLayout);
9008abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            view->pushLayoutState(rootForThisLayout);
9018abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        }
9028abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        LayoutStateDisabler layoutStateDisabler(disableLayoutState ? rootForThisLayout->view() : 0);
903e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
9048abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        m_inLayout = true;
905e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
9068abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        forceLayoutParentViewIfNeeded();
9078abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
9088abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        // Text Autosizing requires two-pass layout which is incompatible with partial layout.
9098abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        // If enabled, only do partial layout for the second layout.
9108abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        // FIXME (crbug.com/256657): Do not do two layouts for text autosizing.
9118abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        PartialLayoutDisabler partialLayoutDisabler(partialLayout(), m_frame->settings() && m_frame->settings()->textAutosizingEnabled());
912e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
9138abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        LayoutIndicator layoutIndicator;
9148abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        rootForThisLayout->layout();
915a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        gatherDebugLayoutRects(rootForThisLayout);
916a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
917a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        ResourceLoadPriorityOptimizer modifier;
918a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        rootForThisLayout->didLayout(modifier);
9198abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    }
920e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
921a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TextAutosizer* textAutosizer = frame().document()->textAutosizer();
922a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    bool autosized = textAutosizer && textAutosizer->processSubtree(rootForThisLayout);
923e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (autosized && rootForThisLayout->needsLayout()) {
924e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        TRACE_EVENT0("webkit", "2nd layout due to Text Autosizing");
9258abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        LayoutIndicator layoutIndicator;
926e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        rootForThisLayout->layout();
927a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        gatherDebugLayoutRects(rootForThisLayout);
928a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
929a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        ResourceLoadPriorityOptimizer modifier;
930a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        rootForThisLayout->didLayout(modifier);
931e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
932e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
933e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    m_inLayout = false;
934e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
935e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (inSubtreeLayout)
936e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        rootForThisLayout->view()->popLayoutState(rootForThisLayout);
937e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
938e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
939e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void FrameView::scheduleOrPerformPostLayoutTasks()
940e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
94151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_postLayoutTasksTimer.isActive())
942e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return;
943e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
9448abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    // Partial layouts should not happen with synchronous post layouts.
9458abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ASSERT(!(m_inSynchronousPostLayout && partialLayout().isStopping()));
9468abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
947e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (!m_inSynchronousPostLayout) {
9488abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (frame().document()->shouldDisplaySeamlesslyWithParent()) {
949e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            if (RenderView* renderView = this->renderView())
950e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                renderView->updateWidgetPositions();
951e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        } else {
952e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            m_inSynchronousPostLayout = true;
953e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            // Calls resumeScheduledEvents()
954e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            performPostLayoutTasks();
955e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            m_inSynchronousPostLayout = false;
956e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        }
957e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
958e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
9598abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!m_postLayoutTasksTimer.isActive() && (needsLayout() || m_inSynchronousPostLayout || frame().document()->shouldDisplaySeamlesslyWithParent())) {
960e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        // If we need layout or are already in a synchronous call to postLayoutTasks(),
961e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        // defer widget updates and event dispatch until after we return. postLayoutTasks()
962e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        // can make us need to update again, and we can get stuck in a nasty cycle unless
963e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        // we call it through the timer here.
964e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        m_postLayoutTasksTimer.startOneShot(0);
96551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (!partialLayout().isStopping() && needsLayout())
966e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            layout();
967e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
968e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
969e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::layout(bool allowSubtree)
9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9727757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // We should never layout a Document which is not in a Frame.
9737757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    ASSERT(m_frame);
9747757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    ASSERT(m_frame->view() == this);
9757757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    ASSERT(m_frame->page());
9767757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_inLayout)
9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
980f21500f839d2ad369a2bd176fb90f26895a9a097Ben Murdoch    if (!m_frame->document()->isActive())
981f21500f839d2ad369a2bd176fb90f26895a9a097Ben Murdoch        return;
982f21500f839d2ad369a2bd176fb90f26895a9a097Ben Murdoch
9838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ASSERT(!partialLayout().isStopping());
9848abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
985926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    TRACE_EVENT0("webkit", "FrameView::layout");
986e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "Layout");
987926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Protect the view from being deleted during layout (in recalcStyle)
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<FrameView> protector(this);
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
991926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Every scroll that happens during layout is programmatic.
992926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    TemporaryChange<bool> changeInProgrammaticScroll(m_inProgrammaticScroll, true);
993926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
9945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_layoutTimer.stop();
9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_delayedLayout = false;
9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // we shouldn't enter layout() while painting
9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!isPainting());
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isPainting())
10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1002a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // Store the current maximal outline size to use when computing the old/new
1003a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // outline rects for repainting.
1004a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    renderView()->setOldMaximalOutlineSize(renderView()->maximalOutlineSize());
1005a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InspectorInstrumentationCookie cookie = InspectorInstrumentation::willLayout(m_frame.get());
10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!allowSubtree && m_layoutRoot) {
10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_layoutRoot->markContainingBlocksForLayout(false);
10105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_layoutRoot = 0;
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1013e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    performPreLayoutTasks();
10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1015e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // If there is only one ref to this view left, then its going to be destroyed as soon as we exit,
1016e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // so there's no point to continuing to layout
1017e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (protector->hasOneRef())
1018e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return;
10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1020e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    Document* document = m_frame->document();
1021e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    bool inSubtreeLayout = m_layoutRoot;
1022e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    RenderObject* rootForThisLayout = inSubtreeLayout ? m_layoutRoot : document->renderer();
1023e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (!rootForThisLayout) {
1024e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        // FIXME: Do we need to set m_size here?
1025e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        ASSERT_NOT_REACHED();
1026e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return;
1027e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10298abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    bool isPartialLayout = partialLayout().isPartialLayout();
10308abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FontCachePurgePreventer fontCachePurgePreventer;
10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderLayer* layer;
10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TemporaryChange<bool> changeSchedulingEnabled(m_layoutSchedulingEnabled, false);
10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_nestedLayoutCount++;
103719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        if (!m_layoutRoot) {
103819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            Document* document = m_frame->document();
103919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            Node* body = document->body();
104019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            if (body && body->renderer()) {
104119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                if (body->hasTagName(framesetTag)) {
104219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                    body->renderer()->setChildNeedsLayout();
104319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                } else if (body->hasTagName(bodyTag)) {
104419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                    if (!m_firstLayout && m_size.height() != layoutSize().height() && body->renderer()->enclosingBox()->stretchesToViewport())
104519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                        body->renderer()->setChildNeedsLayout();
104619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                }
104719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            }
104819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        }
10498abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        updateCounters();
10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        autoSizeIfEnabled();
10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ScrollbarMode hMode;
1053591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        ScrollbarMode vMode;
10545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        calculateScrollbarModesForLayout(hMode, vMode);
10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10569bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        m_doFullRepaint = !inSubtreeLayout && !isPartialLayout && (m_firstLayout || toRenderView(rootForThisLayout)->document().printing());
10575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (!inSubtreeLayout && !isPartialLayout) {
10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Now set our scrollbar state for the layout.
10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ScrollbarMode currentHMode = horizontalScrollbarMode();
10615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ScrollbarMode currentVMode = verticalScrollbarMode();
10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (m_firstLayout || (hMode != currentHMode || vMode != currentVMode)) {
10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (m_firstLayout) {
10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    setScrollbarsSuppressed(true);
10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    m_firstLayout = false;
10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    m_firstLayoutCallbackPending = true;
1069591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    m_lastViewportSize = layoutSize(IncludeScrollbars);
10707757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch                    m_lastZoomFactor = rootForThisLayout->style()->zoom();
10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    // Set the initial vMode to AlwaysOn if we're auto.
10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    if (vMode == ScrollbarAuto)
10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        setVerticalScrollbarMode(ScrollbarAlwaysOn); // This causes a vertical scrollbar to appear.
10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    // Set the initial hMode to AlwaysOff if we're auto.
10765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    if (hMode == ScrollbarAuto)
10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        setHorizontalScrollbarMode(ScrollbarAlwaysOff); // This causes a horizontal scrollbar to disappear.
10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    setScrollbarModes(hMode, vMode);
10805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    setScrollbarsSuppressed(false, true);
10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                } else
10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    setScrollbarModes(hMode, vMode);
10835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutSize oldSize = m_size;
10865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1087bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            m_size = LayoutSize(layoutSize().width(), layoutSize().height());
10885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (oldSize != m_size) {
10905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_doFullRepaint = true;
10915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (!m_firstLayout) {
10925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    RenderBox* rootRenderer = document->documentElement() ? document->documentElement()->renderBox() : 0;
10935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    RenderBox* bodyRenderer = rootRenderer && document->body() ? document->body()->renderBox() : 0;
10945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    if (bodyRenderer && bodyRenderer->stretchesToViewport())
10953c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch                        bodyRenderer->setChildNeedsLayout();
10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    else if (rootRenderer && rootRenderer->stretchesToViewport())
10973c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch                        rootRenderer->setChildNeedsLayout();
10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11027757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        layer = rootForThisLayout->enclosingLayer();
11035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1104e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        performLayout(rootForThisLayout, inSubtreeLayout);
110551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
11065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_layoutRoot = 0;
11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } // Reset m_layoutSchedulingEnabled to its previous value.
11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool neededFullRepaint = m_doFullRepaint;
1110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
11119bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!inSubtreeLayout && !isPartialLayout && !toRenderView(rootForThisLayout)->document().printing())
11125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        adjustViewSize();
11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_doFullRepaint = neededFullRepaint;
1115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
11161e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    {
11171e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        // FIXME: Can this scope just encompass this entire function?
11181e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        FrameView::DeferredRepaintScope deferRepaints(*this);
11191e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1120a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (RuntimeEnabledFeatures::repaintAfterLayoutEnabled()) {
1121a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            if (m_doFullRepaint)
1122a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                renderView()->setShouldDoFullRepaintAfterLayout(true);
1123a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1124a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            if (m_doFullRepaint || !partialLayout().isStopping())
1125a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                repaintTree(rootForThisLayout);
1126a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1127a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        } else if (m_doFullRepaint) {
11281e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            // FIXME: This isn't really right, since the RenderView doesn't fully encompass
11291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            // the visibleContentRect(). It just happens to work out most of the time,
11301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            // since first layouts and printing don't have you scrolled anywhere.
1131a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            renderView()->repaint();
11321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        }
11331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        layer->updateLayerPositionsAfterLayout(renderView()->layer(), updateLayerPositionFlags(layer, inSubtreeLayout, m_doFullRepaint));
11341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    }
11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateCompositingLayersAfterLayout();
113653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_layoutCount++;
11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11398abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (AXObjectCache* cache = rootForThisLayout->document().existingAXObjectCache())
11407757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        cache->postNotification(rootForThisLayout, AXObjectCache::AXLayoutComplete, true);
11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateAnnotatedRegions();
114253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
11438abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ASSERT(partialLayout().isStopping() || !rootForThisLayout->needsLayout());
11445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateCanBlitOnScrollRecursively();
11465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (document->hasListenerType(Document::OVERFLOWCHANGED_LISTENER))
1148bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        updateOverflowStatus(layoutSize().width() < contentsWidth(), layoutSize().height() < contentsHeight());
11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1150e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    scheduleOrPerformPostLayoutTasks();
11515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11527757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    InspectorInstrumentation::didLayout(cookie, rootForThisLayout);
11535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_nestedLayoutCount--;
11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_nestedLayoutCount)
11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (partialLayout().isStopping())
11598abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return;
11608abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
1161f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)#ifndef NDEBUG
1162f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // Post-layout assert that nobody was re-marked as needing layout during layout.
11639bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    document->renderer()->assertSubtreeIsLaidOut();
1164f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)#endif
1165f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
11667757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // FIXME: It should be not possible to remove the FrameView from the frame/page during layout
11677757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // however m_inLayout is not set for most of this function, so none of our RELEASE_ASSERTS
11687757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // in Frame/Page will fire. One of the post-layout tasks is disconnecting the Frame from
11697757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // the page in fast/frames/crash-remove-iframe-during-object-beforeload-2.html
11707757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // necessitating this check here.
11717757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // ASSERT(frame()->page());
11728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (frame().page())
11738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        frame().page()->chrome().client().layoutUpdated(m_frame.get());
117453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
117553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
117651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)// The plan is to move to compositor-queried repainting, in which case this
117751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)// method would setNeedsRedraw on the GraphicsLayers with invalidations and
117851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)// let the compositor pick which to actually draw.
117951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)// See http://crbug.com/306706
118051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void FrameView::repaintTree(RenderObject* root)
118151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
118251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ASSERT(RuntimeEnabledFeatures::repaintAfterLayoutEnabled());
118351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ASSERT(!root->needsLayout());
118451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
118551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    for (RenderObject* renderer = root; renderer; renderer = renderer->nextInPreOrder()) {
1186a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        const LayoutRect& oldRepaintRect = renderer->oldRepaintRect();
1187a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        const LayoutRect& newRepaintRect = renderer->newRepaintRect();
1188a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1189a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        LayoutRect oldOutlineRect = oldRepaintRect;
1190a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        oldOutlineRect.inflate(renderView()->oldMaximalOutlineSize());
1191a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1192a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        LayoutRect newOutlineRect = newRepaintRect;
1193a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        newOutlineRect.inflate(renderView()->maximalOutlineSize());
1194a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1195a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        // FIXME: Currently renderers with layers will get repainted when we call updateLayerPositionsAfterLayout.
1196a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        // That call should be broken apart to position the layers be done before
1197a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        // the repaintTree call so this will repaint everything.
1198a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        bool didFullRepaint = false;
1199a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (!renderer->hasLayer()) {
1200a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            if (!renderer->layoutDidGetCalled()) {
1201a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                if (renderer->shouldDoFullRepaintAfterLayout()) {
1202a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                    renderer->repaint();
1203a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                    didFullRepaint = true;
1204a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                }
120551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
1206a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            } else {
1207a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                didFullRepaint = renderer->repaintAfterLayoutIfNeeded(renderer->containerForRepaint(), renderer->shouldDoFullRepaintAfterLayout(),
1208a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                    oldRepaintRect, oldOutlineRect, &newRepaintRect, &newOutlineRect);
1209a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            }
121051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        }
1211a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (!didFullRepaint && renderer->shouldRepaintOverflowIfNeeded())
1212a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            renderer->repaintOverflow();
121351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        renderer->clearRepaintRects();
121451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
1215a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    renderView()->setOldMaximalOutlineSize(0);
1216a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1217a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1218a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void FrameView::gatherDebugLayoutRects(RenderObject* layoutRoot)
1219a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1220a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    bool isTracing;
1221a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("blink.debug.layout"), &isTracing);
1222a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!isTracing)
1223a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
1224a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!layoutRoot->enclosingLayer()->hasCompositedLayerMapping())
1225a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
1226a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    GraphicsLayer* graphicsLayer = layoutRoot->enclosingLayer()->compositedLayerMapping()->mainGraphicsLayer();
1227a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!graphicsLayer)
1228a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
1229a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1230a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    GraphicsLayerDebugInfo* debugInfo = new GraphicsLayerDebugInfo();
1231a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    for (RenderObject* renderer = layoutRoot; renderer; renderer = renderer->nextInPreOrder()) {
1232a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (renderer->layoutDidGetCalled()) {
1233a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            LayoutRect rect = renderer->newRepaintRect();
1234a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            debugInfo->m_currentLayoutRects.append(rect);
1235a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            renderer->setLayoutDidGetCalled(false);
1236a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        }
1237a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
1238a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1239a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    graphicsLayer->setDebugInfo(debugInfo);
124051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
124151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
1242a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderBox* FrameView::embeddedContentBox() const
12445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
1246926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
12485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderObject* firstChild = renderView->firstChild();
1250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!firstChild || !firstChild->isBox())
12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Curently only embedded SVG documents participate in the size-negotiation logic.
1254926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (firstChild->isSVGRoot())
1255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return toRenderBox(firstChild);
12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1260a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void FrameView::addWidgetToUpdate(RenderEmbeddedObject& object)
12615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Tell the DOM element that it needs a widget update.
1263a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    Node* node = object.node();
1264f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (node->hasTagName(objectTag) || node->hasTagName(embedTag))
1265f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        toHTMLPlugInElement(node)->setNeedsWidgetUpdate(true);
12665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1267a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_widgetUpdateSet.add(&object);
12685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1270591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid FrameView::setMediaType(const AtomicString& mediaType)
12715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
127251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ASSERT(m_frame->document());
127351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_frame->document()->mediaQueryAffectingValueChanged();
12745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mediaType = mediaType;
12755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1277591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochAtomicString FrameView::mediaType() const
12785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // See if we have an override type.
128053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    String overrideType;
1281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    InspectorInstrumentation::applyEmulatedMedia(m_frame.get(), &overrideType);
12825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!overrideType.isNull())
12835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return overrideType;
12845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_mediaType;
12855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::adjustMediaTypeForPrinting(bool printing)
12885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (printing) {
12905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_mediaTypeWhenNotPrinting.isNull())
12915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_mediaTypeWhenNotPrinting = mediaType();
12925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setMediaType("print");
12935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
12945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_mediaTypeWhenNotPrinting.isNull())
12955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setMediaType(m_mediaTypeWhenNotPrinting);
1296591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        m_mediaTypeWhenNotPrinting = nullAtom;
12975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::useSlowRepaints(bool considerOverlap) const
13015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
130253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool mustBeSlow = m_slowRepaintObjectCount > 0;
13035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
130453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (contentsInCompositedLayer())
13055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return mustBeSlow;
13065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The chromium compositor does not support scrolling a non-composited frame within a composited page through
13085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the fast scrolling path, so force slow scrolling in that case.
13095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frame->ownerElement() && !hasCompositedContent() && m_frame->page() && m_frame->page()->mainFrame()->view()->hasCompositedContent())
13105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
13115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isOverlapped = m_isOverlapped && considerOverlap;
13135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (mustBeSlow || m_cannotBlitToWindow || isOverlapped || !m_contentIsOpaque)
13155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
13165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FrameView* parentView = parentFrameView())
13185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return parentView->useSlowRepaints(considerOverlap);
13195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
13215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::useSlowRepaintsIfNotOverlapped() const
13245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return useSlowRepaints(false);
13265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateCanBlitOnScrollRecursively()
13295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1330f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    for (Frame* frame = m_frame.get(); frame; frame = frame->tree().traverseNext(m_frame.get())) {
13315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (FrameView* view = frame->view())
13325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            view->setCanBlitOnScroll(!view->useSlowRepaints());
13335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::contentsInCompositedLayer() const
13375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1338926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
1339bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (renderView && renderView->compositingState() == PaintsIntoOwnBacking) {
13401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        GraphicsLayer* layer = renderView->layer()->compositedLayerMapping()->mainGraphicsLayer();
13415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (layer && layer->drawsContent())
13425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
13435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
134453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
13455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
13465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setCannotBlitToWindow()
13495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_cannotBlitToWindow = true;
13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateCanBlitOnScrollRecursively();
13525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::addSlowRepaintObject()
13555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_slowRepaintObjectCount++) {
13575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateCanBlitOnScrollRecursively();
13585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Page* page = m_frame->page()) {
13605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())
13615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                scrollingCoordinator->frameViewHasSlowRepaintObjectsDidChange(this);
13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::removeSlowRepaintObject()
13675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_slowRepaintObjectCount > 0);
13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_slowRepaintObjectCount--;
13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_slowRepaintObjectCount) {
13715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateCanBlitOnScrollRecursively();
13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Page* page = m_frame->page()) {
13745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())
13755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                scrollingCoordinator->frameViewHasSlowRepaintObjectsDidChange(this);
13765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
13775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::addViewportConstrainedObject(RenderObject* object)
13815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_viewportConstrainedObjects)
13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_viewportConstrainedObjects = adoptPtr(new ViewportConstrainedObjectSet);
13845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_viewportConstrainedObjects->contains(object)) {
13865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_viewportConstrainedObjects->add(object);
13875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Page* page = m_frame->page()) {
13895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())
13905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                scrollingCoordinator->frameViewFixedObjectsDidChange(this);
13915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
13925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::removeViewportConstrainedObject(RenderObject* object)
13965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_viewportConstrainedObjects && m_viewportConstrainedObjects->contains(object)) {
13985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_viewportConstrainedObjects->remove(object);
13995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Page* page = m_frame->page()) {
14005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())
14015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                scrollingCoordinator->frameViewFixedObjectsDidChange(this);
14025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
14035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // FIXME: In addFixedObject() we only call this if there's a platform widget,
14055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // why isn't the same check being made here?
14065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateCanBlitOnScrollRecursively();
14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1410926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)LayoutRect FrameView::viewportConstrainedVisibleContentRect() const
1411926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1412926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayoutRect viewportRect = visibleContentRect();
141353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // Ignore overhang. No-op when not using rubber banding.
141453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    viewportRect.setLocation(clampScrollPosition(scrollPosition()));
1415926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return viewportRect;
1416926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1417926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1418926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntSize FrameView::scrollOffsetForFixedPosition() const
14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
142153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return toIntSize(clampScrollPosition(scrollPosition()));
14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1424926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)IntPoint FrameView::lastKnownMousePosition() const
14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1426f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return m_frame->eventHandler().lastKnownMousePosition();
14275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)bool FrameView::shouldSetCursor() const
14301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
14311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    Page* page = frame().page();
14321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return page && page->visibilityState() != PageVisibilityStateHidden && page->focusController().isActive();
14331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
14341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
14355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect)
14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_viewportConstrainedObjects || m_viewportConstrainedObjects->isEmpty()) {
14385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hostWindow()->scroll(scrollDelta, rectToScroll, clipRect);
14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
14405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const bool isCompositedContentLayer = contentsInCompositedLayer();
14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Get the rects of the fixed objects visible in the rectToScroll
14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Region regionToUpdate;
14465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ViewportConstrainedObjectSet::const_iterator end = m_viewportConstrainedObjects->end();
14475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (ViewportConstrainedObjectSet::const_iterator it = m_viewportConstrainedObjects->begin(); it != end; ++it) {
14485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderObject* renderer = *it;
14495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!renderer->style()->hasViewportConstrainedPosition())
14505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
145153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
14525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Fixed items should always have layers.
14535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(renderer->hasLayer());
14545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderLayer* layer = toRenderBoxModelObject(renderer)->layer();
145553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1456bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        // Layers that paint into their ancestor or into a grouped backing will still need
1457bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        // to apply a repaint invalidation. If the layer paints into its own backing, then
1458bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        // it does not need repainting just to scroll.
1459bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        if (layer->compositingState() == PaintsIntoOwnBacking)
14609bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            continue;
14619bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
146253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (layer->viewportConstrainedNotCompositedReason() == RenderLayer::NotCompositedForBoundsOutOfView
146353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            || layer->viewportConstrainedNotCompositedReason() == RenderLayer::NotCompositedForNoVisibleContent) {
146453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            // Don't invalidate for invisible fixed layers.
146553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            continue;
146653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
146753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (layer->hasAncestorWithFilterOutsets()) {
1469591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            // If the fixed layer has a blur/drop-shadow filter applied on at least one of its parents, we cannot
14705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // scroll using the fast path, otherwise the outsets of the filter will be moved around the page.
14715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
14725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
14739bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
14741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        IntRect updateRect = pixelSnappedIntRect(layer->repainter().repaintRectIncludingNonCompositingDescendants());
14759bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
14769bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        RenderLayer* enclosingCompositingLayer = layer->enclosingCompositingLayer(false);
14779bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        if (enclosingCompositingLayer && !enclosingCompositingLayer->renderer()->isRenderView()) {
14789bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            // If the fixed-position layer is contained by a composited layer that is not its containing block,
14799bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            // then we have to invlidate that enclosing layer, not the RenderView.
14809bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            updateRect.moveBy(scrollPosition());
14819bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            IntRect previousRect = updateRect;
14829bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            previousRect.move(scrollDelta);
14839bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            updateRect.unite(previousRect);
1484bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            enclosingCompositingLayer->repainter().setBackingNeedsRepaintInRect(updateRect);
14859bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        } else {
14869bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            // Coalesce the repaints that will be issued to the renderView.
14879bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            updateRect = contentsToRootView(updateRect);
14889bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            if (!isCompositedContentLayer && clipsRepaints())
14899bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                updateRect.intersect(rectToScroll);
14909bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            if (!updateRect.isEmpty())
14919bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                regionToUpdate.unite(updateRect);
14929bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        }
14935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 1) scroll
14965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    hostWindow()->scroll(scrollDelta, rectToScroll, clipRect);
14975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 2) update the area of fixed objects that has been invalidated
14995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<IntRect> subRectsToUpdate = regionToUpdate.rects();
15005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t viewportConstrainedObjectsCount = subRectsToUpdate.size();
15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < viewportConstrainedObjectsCount; ++i) {
15025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect updateRect = subRectsToUpdate[i];
15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect scrolledRect = updateRect;
15045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        scrolledRect.move(scrollDelta);
15055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateRect.unite(scrolledRect);
15065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isCompositedContentLayer) {
15075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            updateRect = rootViewToContents(updateRect);
1508926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            ASSERT(renderView());
1509bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            renderView()->layer()->repainter().setBackingNeedsRepaintInRect(updateRect);
15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
15115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
15125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (clipsRepaints())
15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            updateRect.intersect(rectToScroll);
151453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        hostWindow()->invalidateContentsAndRootView(updateRect);
15155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
15185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scrollContentsSlowPath(const IntRect& updateRect)
15215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (contentsInCompositedLayer()) {
15235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect updateRect = visibleContentRect();
1524926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(renderView());
1525bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        renderView()->layer()->repainter().setBackingNeedsRepaintInRect(updateRect);
15265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (RenderPart* frameRenderer = m_frame->ownerRenderer()) {
15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isEnclosedInCompositingLayer()) {
15295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutRect rect(frameRenderer->borderLeft() + frameRenderer->paddingLeft(),
15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            frameRenderer->borderTop() + frameRenderer->paddingTop(),
15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            visibleWidth(), visibleHeight());
15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            frameRenderer->repaintRectangle(rect);
15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
15345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
15355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::scrollContentsSlowPath(updateRect);
15385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Note that this gets called at painting time.
15415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setIsOverlapped(bool isOverlapped)
15425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isOverlapped == m_isOverlapped)
15445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
15455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isOverlapped = isOverlapped;
15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateCanBlitOnScrollRecursively();
15485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isOverlappedIncludingAncestors() const
15515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isOverlapped())
15535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
15545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FrameView* parentView = parentFrameView()) {
15565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parentView->isOverlapped())
15575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
15585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
15615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setContentIsOpaque(bool contentIsOpaque)
15645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (contentIsOpaque == m_contentIsOpaque)
15665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
15675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_contentIsOpaque = contentIsOpaque;
15695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateCanBlitOnScrollRecursively();
15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::restoreScrollbar()
15735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setScrollbarsSuppressed(false);
15755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::scrollToFragment(const KURL& url)
15785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If our URL has no ref, then we have no place we need to jump to.
15805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // OTOH If CSS target was set previously, we want to set it to 0, recalc
15815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // and possibly repaint because :target pseudo class may have been
15825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // set (see bug 11321).
15835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!url.hasFragmentIdentifier() && !m_frame->document()->cssTarget())
15845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
15855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String fragmentIdentifier = url.fragmentIdentifier();
15875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (scrollToAnchor(fragmentIdentifier))
15885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
15895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Try again after decoding the ref, based on the document's encoding.
1591c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    if (m_frame->document()->encoding().isValid())
1592c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        return scrollToAnchor(decodeURLEscapeSequences(fragmentIdentifier, m_frame->document()->encoding()));
15935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
15955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::scrollToAnchor(const String& name)
15985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame->document());
16005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_frame->document()->haveStylesheetsLoaded()) {
16025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_frame->document()->setGotoAnchorNeededAfterStylesheetsLoad(true);
16035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
16045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame->document()->setGotoAnchorNeededAfterStylesheetsLoad(false);
16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* anchorNode = m_frame->document()->findAnchor(name);
16095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Setting to null will clear the current target.
16115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame->document()->setCSSTarget(anchorNode);
16125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frame->document()->isSVGDocument()) {
1614926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (SVGSVGElement* svg = toSVGDocument(m_frame->document())->rootElement()) {
16155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            svg->setupInitialView(name, anchorNode);
16165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!anchorNode)
16175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return true;
16185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
16195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1620591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
16215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Implement the rule that "" and "top" both mean top of page as in other browsers.
16225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!anchorNode && !(name.isEmpty() || equalIgnoringCase(name, "top")))
16235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
16245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    maintainScrollPositionAtAnchor(anchorNode ? static_cast<Node*>(anchorNode) : m_frame->document());
162653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
162753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // If the anchor accepts keyboard focus, move focus there to aid users relying on keyboard navigation.
162853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (anchorNode && anchorNode->isFocusable())
1629e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        m_frame->document()->setFocusedElement(anchorNode);
163053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
16315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
16325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::maintainScrollPositionAtAnchor(Node* anchorNode)
16355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_maintainScrollPositionAnchor = anchorNode;
16375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_maintainScrollPositionAnchor)
16385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
16395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We need to update the layout before scrolling, otherwise we could
16415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // really mess things up if an anchor scroll comes at a bad moment.
16425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame->document()->updateStyleIfNeeded();
16435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Only do a layout if changes have occurred that make it necessary.
1644926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
1645926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (renderView && renderView->needsLayout())
16465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        layout();
16475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
16485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        scrollToAnchor();
16495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scrollElementToRect(Element* element, const IntRect& rect)
16525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame->document()->updateLayoutIgnorePendingStylesheets();
16545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect bounds = element->boundingBox();
16565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int centeringOffsetX = (rect.width() - bounds.width()) / 2;
16575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int centeringOffsetY = (rect.height() - bounds.height()) / 2;
16585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setScrollPosition(IntPoint(bounds.x() - centeringOffsetX - rect.x(), bounds.y() - centeringOffsetY - rect.y()));
16595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setScrollPosition(const IntPoint& scrollPoint)
16625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TemporaryChange<bool> changeInProgrammaticScroll(m_inProgrammaticScroll, true);
16645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_maintainScrollPositionAnchor = 0;
16655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1666926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    IntPoint newScrollPosition = adjustScrollPositionWithinRange(scrollPoint);
1667926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1668926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (newScrollPosition == scrollPosition())
1669926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
1670926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1671926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ScrollView::setScrollPosition(newScrollPosition);
16725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void FrameView::setScrollPositionNonProgrammatically(const IntPoint& scrollPoint)
16755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
16765267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    IntPoint newScrollPosition = adjustScrollPositionWithinRange(scrollPoint);
16775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
16785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (newScrollPosition == scrollPosition())
16795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return;
16805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
16815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    TemporaryChange<bool> changeInProgrammaticScroll(m_inProgrammaticScroll, false);
16825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    notifyScrollPositionChanged(newScrollPosition);
16835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
16845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
16855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setViewportConstrainedObjectsNeedLayout()
16865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!hasViewportConstrainedObjects())
16885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
16895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ViewportConstrainedObjectSet::const_iterator end = m_viewportConstrainedObjects->end();
16915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (ViewportConstrainedObjectSet::const_iterator it = m_viewportConstrainedObjects->begin(); it != end; ++it) {
16925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderObject* renderer = *it;
16933c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        renderer->setNeedsLayout();
16945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1697bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)IntSize FrameView::layoutSize(IncludeScrollbarsInRect scrollbarInclusion) const
1698bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
1699bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return scrollbarInclusion == ExcludeScrollbars ? excludeScrollbars(m_layoutSize) : m_layoutSize;
1700bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
1701bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
1702bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void FrameView::setLayoutSize(const IntSize& size)
1703bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
1704bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ASSERT(!layoutSizeFixedToFrameSize());
1705bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
1706bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    setLayoutSizeInternal(size);
1707bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
17085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scrollPositionChanged()
17105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1711e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    setWasScrolledByUser(true);
1712e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)
1713e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    Document* document = m_frame->document();
1714e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    document->enqueueScrollEventForNode(document);
1715e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)
1716f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    m_frame->eventHandler().dispatchFakeMouseMoveEventSoon();
17175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1718e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (RenderView* renderView = document->renderView()) {
1719926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (renderView->usesCompositing())
1720926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->compositor()->frameViewDidScroll();
17215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1722a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1723a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_frame->document() && m_frame->document()->renderer()) {
1724a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        ResourceLoadPriorityOptimizer modifier;
1725a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_frame->document()->renderer()->didScroll(modifier);
1726a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::repaintFixedElementsAfterScrolling()
17305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For fixed position elements, update widget positions and compositing layers after scrolling,
17325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // but only if we're not inside of layout.
17335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_nestedLayoutCount && hasViewportConstrainedObjects()) {
1734926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (RenderView* renderView = this->renderView()) {
1735926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->updateWidgetPositions();
1736926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->layer()->updateLayerPositionsAfterDocumentScroll();
17375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
17385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateFixedElementsAfterScrolling()
17425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_nestedLayoutCount <= 1 && hasViewportConstrainedObjects()) {
1744926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (RenderView* renderView = this->renderView())
1745926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->compositor()->updateCompositingLayers(CompositingUpdateOnScroll);
17465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::shouldRubberBandInDirection(ScrollDirection direction) const
17505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17518abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Page* page = frame().page();
17525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
17535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ScrollView::shouldRubberBandInDirection(direction);
1754e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return page->chrome().client().shouldRubberBandInDirection(direction);
17555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1757926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool FrameView::isRubberBandInProgress() const
1758926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1759926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (scrollbarsSuppressed())
1760926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
1761926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1762926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // If the main thread updates the scroll position for this FrameView, we should return
1763926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // ScrollAnimator::isRubberBandInProgress().
1764926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (ScrollAnimator* scrollAnimator = existingScrollAnimator())
1765926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return scrollAnimator->isRubberBandInProgress();
1766926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1767926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return false;
1768926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1769926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
17705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HostWindow* FrameView::hostWindow() const
17715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Page* page = frame().page();
17735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
17745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
177593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return &page->chrome();
17765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const unsigned cRepaintRectUnionThreshold = 25;
17795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
178053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void FrameView::repaintContentRectangle(const IntRect& r)
17815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_frame->ownerElement());
17835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_isTrackingRepaints) {
17855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect repaintRect = r;
17865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        repaintRect.move(-scrollOffset());
17875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_trackedRepaintRects.append(repaintRect);
17885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double delay = m_deferringRepaints ? 0 : adjustedDeferredRepaintDelay();
179153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (m_deferringRepaints || m_deferredRepaintTimer.isActive() || delay) {
17925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect paintRect = r;
17935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (clipsRepaints() && !paintsEntireContents())
17945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            paintRect.intersect(visibleContentRect());
17955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (paintRect.isEmpty())
17965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
17975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_repaintCount == cRepaintRectUnionThreshold) {
17985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            IntRect unionedRect;
17995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (unsigned i = 0; i < cRepaintRectUnionThreshold; ++i)
18005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                unionedRect.unite(pixelSnappedIntRect(m_repaintRects[i]));
18015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_repaintRects.clear();
18025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_repaintRects.append(unionedRect);
18035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
18045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_repaintCount < cRepaintRectUnionThreshold)
18055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_repaintRects.append(paintRect);
18065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
18075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_repaintRects[0].unite(paintRect);
18085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_repaintCount++;
18095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_deferringRepaints)
18115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            startDeferredRepaintTimer(delay);
18125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
18145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1815591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
181653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!shouldUpdate())
18175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
18185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
181953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ScrollView::repaintContentRectangle(r);
18205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::contentsResized()
18235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::contentsResized();
18255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setNeedsLayout();
18265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1828bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void FrameView::scrollbarExistenceDidChange()
18295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We check to make sure the view is attached to a frame() as this method can
18315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // be triggered before the view is attached by Frame::createView(...) setting
18325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // various values such as setScrollBarModes(...) for example.  An ASSERT is
18335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // triggered when a view is layout before being attached to a frame().
18348abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!frame().view())
18355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
18365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
183777e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)    // Note that simply having overlay scrollbars is not sufficient to be
183877e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)    // certain that scrollbars' presence does not impact layout. This should
183977e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)    // also check if custom scrollbars (as reported by shouldUseCustomScrollbars)
184077e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)    // are in use as well.
184177e14d17900500683cd1ec2d19ba0d6e760fc132Torne (Richard Coles)    // http://crbug.com/269692
1842bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    bool useOverlayScrollbars = ScrollbarTheme::theme()->usesOverlayScrollbars();
1843bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
1844bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (!useOverlayScrollbars && needsLayout())
18455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        layout();
18465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1847bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (renderView() && renderView()->usesCompositing()) {
1848bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        renderView()->compositor()->frameViewScrollbarsExistenceDidChange();
1849bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
1850bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        if (!useOverlayScrollbars)
1851bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            renderView()->compositor()->frameViewDidChangeSize();
18525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::beginDeferredRepaints()
18565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = m_frame->page();
18588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ASSERT(page);
18598abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
18608abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!isMainFrame()) {
18615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        page->mainFrame()->view()->beginDeferredRepaints();
18625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
18635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deferringRepaints++;
18665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::endDeferredRepaints()
18695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = m_frame->page();
18718abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ASSERT(page);
18728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
18738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!isMainFrame()) {
18745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        page->mainFrame()->view()->endDeferredRepaints();
18755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
18765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_deferringRepaints > 0);
18795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (--m_deferringRepaints)
18815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
18825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_deferredRepaintTimer.isActive())
18845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
18855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (double delay = adjustedDeferredRepaintDelay()) {
18875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        startDeferredRepaintTimer(delay);
18885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
18895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1890591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
18915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    doDeferredRepaints();
18925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::startDeferredRepaintTimer(double delay)
18955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_deferredRepaintTimer.isActive())
18975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
18985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deferredRepaintTimer.startOneShot(delay);
19005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::handleLoadCompleted()
19035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Once loading has completed, allow autoSize one last opportunity to
19055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // reduce the size of the frame.
19065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    autoSizeIfEnabled();
19075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (shouldUseLoadTimeDeferredRepaintDelay())
19085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
19095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deferredRepaintDelay = s_normalDeferredRepaintDelay;
19105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    flushDeferredRepaints();
19115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::flushDeferredRepaints()
19145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_deferredRepaintTimer.isActive())
19165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
19175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deferredRepaintTimer.stop();
19185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    doDeferredRepaints();
19195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::doDeferredRepaints()
19225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_deferringRepaints);
19245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!shouldUpdate()) {
19255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_repaintRects.clear();
19265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_repaintCount = 0;
19275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
19285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
19295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned size = m_repaintRects.size();
19305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 0; i < size; i++) {
193153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        ScrollView::repaintContentRectangle(pixelSnappedIntRect(m_repaintRects[i]));
19325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
19335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_repaintRects.clear();
19345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_repaintCount = 0;
1935591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
19365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateDeferredRepaintDelayAfterRepaint();
19375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::shouldUseLoadTimeDeferredRepaintDelay() const
19405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Don't defer after the initial load of the page has been completed.
1942f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (m_frame->tree().top()->document()->loadEventFinished())
19435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
19445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* document = m_frame->document();
19455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!document)
19465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
19475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (document->parsing())
19485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
19493464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    if (document->fetcher()->requestCount())
19505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
19515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
19525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateDeferredRepaintDelayAfterRepaint()
19555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!shouldUseLoadTimeDeferredRepaintDelay()) {
19575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_deferredRepaintDelay = s_normalDeferredRepaintDelay;
19585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
19595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
19605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double incrementedRepaintDelay = m_deferredRepaintDelay + s_deferredRepaintDelayIncrementDuringLoading;
19615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deferredRepaintDelay = std::min(incrementedRepaintDelay, s_maxDeferredRepaintDelayDuringLoading);
19625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::resetDeferredRepaintDelay()
19655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deferredRepaintDelay = 0;
19675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_deferredRepaintTimer.isActive()) {
19685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_deferredRepaintTimer.stop();
19695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_deferringRepaints)
19705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            doDeferredRepaints();
19715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
19725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double FrameView::adjustedDeferredRepaintDelay() const
19755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_deferringRepaints);
19775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_deferredRepaintDelay)
19785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
19795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double timeSinceLastPaint = currentTime() - m_lastPaintTime;
19805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return max(0., m_deferredRepaintDelay - timeSinceLastPaint);
19815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1982591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
19835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::deferredRepaintTimerFired(Timer<FrameView>*)
19845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    doDeferredRepaints();
19865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::layoutTimerFired(Timer<FrameView>*)
19895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    layout();
19915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scheduleRelayout()
19945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame->view() == this);
19965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_layoutRoot) {
19985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_layoutRoot->markContainingBlocksForLayout(false);
19995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_layoutRoot = 0;
20005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
20015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_layoutSchedulingEnabled)
20025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
20035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!needsLayout())
20045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
20055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_frame->document()->shouldScheduleLayout())
20065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
20075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InspectorInstrumentation::didInvalidateLayout(m_frame.get());
200893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
200993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // When frame seamless is enabled, the contents of the frame could affect the layout of the parent frames.
20105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Also invalidate parent frame starting from the owner element of this frame.
20118abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (m_frame->ownerRenderer() && m_frame->document()->shouldDisplaySeamlesslyWithParent())
2012e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        m_frame->ownerRenderer()->setNeedsLayout();
20135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int delay = m_frame->document()->minimumLayoutDelay();
20155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_layoutTimer.isActive() && m_delayedLayout && !delay)
20165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unscheduleRelayout();
20175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_layoutTimer.isActive())
20185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
20195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_delayedLayout = delay != 0;
20215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_layoutTimer.startOneShot(delay * 0.001);
20225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool isObjectAncestorContainerOf(RenderObject* ancestor, RenderObject* descendant)
20255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (RenderObject* r = descendant; r; r = r->container()) {
20275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (r == ancestor)
20285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
20295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
20305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
20315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scheduleRelayoutOfSubtree(RenderObject* relayoutRoot)
20345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame->view() == this);
20365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2037926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
2038926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (renderView && renderView->needsLayout()) {
20395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (relayoutRoot)
20405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            relayoutRoot->markContainingBlocksForLayout(false);
20415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
20425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
20435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (layoutPending() || !m_layoutSchedulingEnabled) {
20455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_layoutRoot != relayoutRoot) {
20465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (isObjectAncestorContainerOf(m_layoutRoot, relayoutRoot)) {
20475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Keep the current root
20485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                relayoutRoot->markContainingBlocksForLayout(false, m_layoutRoot);
20495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ASSERT(!m_layoutRoot->container() || !m_layoutRoot->container()->needsLayout());
20505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else if (m_layoutRoot && isObjectAncestorContainerOf(relayoutRoot, m_layoutRoot)) {
20515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Re-root at relayoutRoot
20525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_layoutRoot->markContainingBlocksForLayout(false, relayoutRoot);
20535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_layoutRoot = relayoutRoot;
20545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ASSERT(!m_layoutRoot->container() || !m_layoutRoot->container()->needsLayout());
20555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                InspectorInstrumentation::didInvalidateLayout(m_frame.get());
20565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else {
20575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Just do a full relayout
20585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (m_layoutRoot)
20595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    m_layoutRoot->markContainingBlocksForLayout(false);
20605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_layoutRoot = 0;
20615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                relayoutRoot->markContainingBlocksForLayout(false);
20625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                InspectorInstrumentation::didInvalidateLayout(m_frame.get());
20635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
20645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
20655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else if (m_layoutSchedulingEnabled) {
20665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int delay = m_frame->document()->minimumLayoutDelay();
20675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_layoutRoot = relayoutRoot;
20685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!m_layoutRoot->container() || !m_layoutRoot->container()->needsLayout());
20695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        InspectorInstrumentation::didInvalidateLayout(m_frame.get());
20705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_delayedLayout = delay != 0;
20715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_layoutTimer.startOneShot(delay * 0.001);
20725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
20735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::layoutPending() const
20765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_layoutTimer.isActive();
20785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::needsLayout() const
20815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This can return true in cases where the document does not have a body yet.
20835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Document::shouldScheduleLayout takes care of preventing us from scheduling
20845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // layout in that case.
20855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2086926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
20875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return layoutPending()
2088926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        || (renderView && renderView->needsLayout())
2089a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        || m_layoutRoot;
20905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setNeedsLayout()
20935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2094926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (RenderView* renderView = this->renderView())
20953c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        renderView->setNeedsLayout();
20965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::unscheduleRelayout()
20995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_layoutTimer.isActive())
21015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
21025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_layoutTimer.stop();
21045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_delayedLayout = false;
21055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::serviceScriptedAnimations(double monotonicAnimationStartTime)
21085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2109f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    for (RefPtr<Frame> frame = m_frame; frame; frame = frame->tree().traverseNext()) {
21105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        frame->view()->serviceScrollAnimations();
2111e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        if (!RuntimeEnabledFeatures::webAnimationsCSSEnabled())
2112bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            frame->animation().serviceAnimations();
211351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
211451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        DocumentAnimations::serviceOnAnimationFrame(*frame->document(), monotonicAnimationStartTime);
21155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
21165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<RefPtr<Document> > documents;
2118f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    for (Frame* frame = m_frame.get(); frame; frame = frame->tree().traverseNext())
21195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        documents.append(frame->document());
21205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < documents.size(); ++i)
21225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        documents[i]->serviceScriptedAnimations(monotonicAnimationStartTime);
21235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isTransparent() const
21265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_isTransparent;
21285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setTransparent(bool isTransparent)
21315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isTransparent = isTransparent;
213351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (renderView() && renderView()->layer()->hasCompositedLayerMapping())
21341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        renderView()->layer()->compositedLayerMapping()->updateContentsOpaque();
21355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool FrameView::hasOpaqueBackground() const
2138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return !m_isTransparent && !m_baseBackgroundColor.hasAlpha();
2140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
21425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Color FrameView::baseBackgroundColor() const
21435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_baseBackgroundColor;
21455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21478abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void FrameView::setBaseBackgroundColor(const Color& backgroundColor)
21485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!backgroundColor.isValid())
21505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_baseBackgroundColor = Color::white;
21515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
21528abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        m_baseBackgroundColor = backgroundColor;
21535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
215451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (renderView() && renderView()->layer()->hasCompositedLayerMapping()) {
215551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        CompositedLayerMappingPtr compositedLayerMapping = renderView()->layer()->compositedLayerMapping();
21561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        compositedLayerMapping->updateContentsOpaque();
21571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (compositedLayerMapping->mainGraphicsLayer())
21581e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            compositedLayerMapping->mainGraphicsLayer()->setNeedsDisplay();
215902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    }
21605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    recalculateScrollbarOverlayStyle();
21615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21638abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void FrameView::updateBackgroundRecursively(const Color& backgroundColor, bool transparent)
21645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2165f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    for (Frame* frame = m_frame.get(); frame; frame = frame->tree().traverseNext(m_frame.get())) {
21665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (FrameView* view = frame->view()) {
21675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            view->setTransparent(transparent);
21685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            view->setBaseBackgroundColor(backgroundColor);
21695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
21705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
21715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::shouldUpdateWhileOffscreen() const
21745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_shouldUpdateWhileOffscreen;
21765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setShouldUpdateWhileOffscreen(bool shouldUpdateWhileOffscreen)
21795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_shouldUpdateWhileOffscreen = shouldUpdateWhileOffscreen;
21815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
218353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool FrameView::shouldUpdate() const
21845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
218553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (isOffscreen() && !shouldUpdateWhileOffscreen())
21865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
21875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
21885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scrollToAnchor()
21915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<Node> anchorNode = m_maintainScrollPositionAnchor;
21935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!anchorNode)
21945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
21955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!anchorNode->renderer())
21975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
21985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect rect;
22005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (anchorNode != m_frame->document())
22015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rect = anchorNode->boundingBox();
22025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Scroll nested layers and frames to reveal the anchor.
22045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Align to the top and to the closest side (this matches other browsers).
22055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    anchorNode->renderer()->scrollRectToVisible(rect, ScrollAlignment::alignToEdgeIfNeeded, ScrollAlignment::alignTopAlways);
22065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2207926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (AXObjectCache* cache = m_frame->document()->existingAXObjectCache())
2208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        cache->handleScrolledToAnchor(anchorNode.get());
22095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // scrollRectToVisible can call into setScrollPosition(), which resets m_maintainScrollPositionAnchor.
22115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_maintainScrollPositionAnchor = anchorNode;
22125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::updateWidgets()
22155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2216a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_nestedLayoutCount > 1 || m_widgetUpdateSet.isEmpty())
22175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
2218591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
2219a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // Need to swap because script will run inside the below loop and invalidate the iterator.
2220a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EmbeddedObjectSet objects;
2221a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    objects.swap(m_widgetUpdateSet);
22225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2223a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    for (EmbeddedObjectSet::iterator it = objects.begin(); it != objects.end(); ++it) {
2224a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        RenderEmbeddedObject& object = **it;
2225a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        HTMLPlugInElement* element = toHTMLPlugInElement(object.node());
22265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2227a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        // The object may have already been destroyed (thus node cleared),
2228a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        // but FrameView holds a manual ref, so it won't have been deleted.
2229a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (!element)
2230a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            continue;
22315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2232a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        // No need to update if it's already crashed or known to be missing.
2233a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (object.showsUnavailablePluginIndicator())
2234a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            continue;
22355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2236a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (element->needsWidgetUpdate())
2237a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            element->updateWidget();
2238a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        object.updateWidgetPosition();
2239a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
2240a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        // Prevent plugins from causing infinite updates of themselves.
2241a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        // FIXME: Do we really need to prevent this?
2242a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_widgetUpdateSet.remove(&object);
2243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
2244591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
2245a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return m_widgetUpdateSet.isEmpty();
22465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
224851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void FrameView::updateWidgetsTimerFired(Timer<FrameView>*)
22495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
225051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    RefPtr<FrameView> protect(this);
225151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_updateWidgetsTimer.stop();
225251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    for (unsigned i = 0; i < maxUpdateWidgetsIterations; ++i) {
225351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (updateWidgets())
225451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            return;
225551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
225651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
22575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
225851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void FrameView::flushAnyPendingPostLayoutTasks()
225951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
226051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_postLayoutTasksTimer.isActive())
226151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        performPostLayoutTasks();
226251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_updateWidgetsTimer.isActive())
226351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        updateWidgetsTimerFired(0);
22645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::performPostLayoutTasks()
22675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2268e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    TRACE_EVENT0("webkit", "FrameView::performPostLayoutTasks");
226981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    RefPtr<FrameView> protect(this);
227081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
22715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_postLayoutTasksTimer.stop();
22725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    m_frame->selection().setCaretRectNeedsUpdate();
22748abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    m_frame->selection().updateAppearance();
22755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_nestedLayoutCount <= 1) {
22775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_firstLayoutCallbackPending) {
22785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_firstLayoutCallbackPending = false;
2279f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            m_frame->loader().didFirstLayout();
22805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
22815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Ensure that we always send this eventually.
2283f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        if (!m_frame->document()->parsing() && m_frame->loader().stateMachine()->committedFirstRealDocumentLoad())
22845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_isVisuallyNonEmpty = true;
22855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If the layout was done with pending sheets, we are not in fact visually non-empty yet.
22875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_isVisuallyNonEmpty && !m_frame->document()->didLayoutWithPendingStylesheets() && m_firstVisuallyNonEmptyLayoutCallbackPending) {
22885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_firstVisuallyNonEmptyLayoutCallbackPending = false;
22891e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            // FIXME: This callback is probably not needed, but is currently used
22901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            // by android for setting the background color.
2291f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            m_frame->loader().client()->dispatchDidFirstVisuallyNonEmptyLayout();
22925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
22935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
22945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2295f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    FontFaceSet::didLayout(m_frame->document());
22965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2297926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
2298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (renderView)
2299926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        renderView->updateWidgetPositions();
230053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2301a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!m_updateWidgetsTimer.isActive())
2302a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_updateWidgetsTimer.startOneShot(0);
23035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23041e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (Page* page = m_frame->page()) {
23055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())
230619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            scrollingCoordinator->notifyLayoutUpdated();
23075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
23085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    scrollToAnchor();
23105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2311e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    sendResizeEventIfNeeded();
2312e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
2313e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
2314e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void FrameView::sendResizeEventIfNeeded()
2315e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
2316e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    ASSERT(m_frame);
2317e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
2318e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    RenderView* renderView = this->renderView();
23199bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!renderView || renderView->document().printing())
2320e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return;
2321e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
2322e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    IntSize currentSize = layoutSize(IncludeScrollbars);
2323e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    float currentZoomFactor = renderView->style()->zoom();
2324e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
2325e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    bool shouldSendResizeEvent = currentSize != m_lastViewportSize || currentZoomFactor != m_lastZoomFactor;
2326e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
2327e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    m_lastViewportSize = currentSize;
2328e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    m_lastZoomFactor = currentZoomFactor;
2329e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
2330e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (!shouldSendResizeEvent)
2331e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return;
2332e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
233351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_frame->document()->enqueueResizeEvent();
2334e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
23358abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (isMainFrame())
23361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        InspectorInstrumentation::didResizeMainFrame(m_frame->page());
23375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::postLayoutTimerFired(Timer<FrameView>*)
23405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
23415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    performPostLayoutTasks();
23425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23448abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void FrameView::updateCounters()
23458abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
23468abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    RenderView* view = renderView();
23478abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!view->hasRenderCounters())
23488abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return;
23498abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
23508abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    for (RenderObject* renderer = view; renderer; renderer = renderer->nextInPreOrder()) {
23518abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (!renderer->isCounter())
23528abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            continue;
23538abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
23548abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        toRenderCounter(renderer)->updateCounter();
23558abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    }
23568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
23578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
23585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::autoSizeIfEnabled()
23595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
23605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_shouldAutoSize)
23615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
23625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_inAutoSize)
23645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
23655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TemporaryChange<bool> changeInAutoSize(m_inAutoSize, true);
23675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23688abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Document* document = frame().document();
23695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!document)
23705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
23715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderView* documentView = document->renderView();
23735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* documentElement = document->documentElement();
23745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!documentView || !documentElement)
23755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
23765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
237753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    RenderBox* documentRenderBox = documentElement->renderBox();
237853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!documentRenderBox)
237953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return;
238053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
23815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If this is the first time we run autosize, start from small height and
23825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // allow it to grow.
23835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_didRunAutosize)
23845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        resize(frameRect().width(), m_minAutoSize.height());
23855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntSize size = frameRect().size();
23875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Do the resizing twice. The first time is basically a rough calculation using the preferred width
23895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // which may result in a height change during the second iteration.
23905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (int i = 0; i < 2; i++) {
23915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Update various sizes including contentsSize, scrollHeight, etc.
23925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        document->updateLayoutIgnorePendingStylesheets();
23935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int width = documentView->minPreferredLogicalWidth();
239453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        int height = documentRenderBox->scrollHeight();
23955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntSize newSize(width, height);
23965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Check to see if a scrollbar is needed for a given dimension and
23985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // if so, increase the other dimension to account for the scrollbar.
23995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Since the dimensions are only for the view rectangle, once a
24005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // dimension exceeds the maximum, there is no need to increase it further.
24015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (newSize.width() > m_maxAutoSize.width()) {
24025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RefPtr<Scrollbar> localHorizontalScrollbar = horizontalScrollbar();
24035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!localHorizontalScrollbar)
24045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                localHorizontalScrollbar = createScrollbar(HorizontalScrollbar);
24055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!localHorizontalScrollbar->isOverlayScrollbar())
24065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                newSize.setHeight(newSize.height() + localHorizontalScrollbar->height());
24075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Don't bother checking for a vertical scrollbar because the width is at
24095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // already greater the maximum.
24105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (newSize.height() > m_maxAutoSize.height()) {
24115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RefPtr<Scrollbar> localVerticalScrollbar = verticalScrollbar();
24125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!localVerticalScrollbar)
24135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                localVerticalScrollbar = createScrollbar(VerticalScrollbar);
24145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!localVerticalScrollbar->isOverlayScrollbar())
24155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                newSize.setWidth(newSize.width() + localVerticalScrollbar->width());
24165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Don't bother checking for a horizontal scrollbar because the height is
24185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // already greater the maximum.
24195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
24205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Ensure the size is at least the min bounds.
24225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        newSize = newSize.expandedTo(m_minAutoSize);
24235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Bound the dimensions by the max bounds and determine what scrollbars to show.
24255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ScrollbarMode horizonalScrollbarMode = ScrollbarAlwaysOff;
24265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (newSize.width() > m_maxAutoSize.width()) {
24275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            newSize.setWidth(m_maxAutoSize.width());
24285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            horizonalScrollbarMode = ScrollbarAlwaysOn;
24295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
24305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ScrollbarMode verticalScrollbarMode = ScrollbarAlwaysOff;
24315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (newSize.height() > m_maxAutoSize.height()) {
24325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            newSize.setHeight(m_maxAutoSize.height());
24335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            verticalScrollbarMode = ScrollbarAlwaysOn;
24345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
24355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (newSize == size)
24375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
24385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // While loading only allow the size to increase (to avoid twitching during intermediate smaller states)
24405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // unless autoresize has just been turned on or the maximum size is smaller than the current size.
24415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_didRunAutosize && size.height() <= m_maxAutoSize.height() && size.width() <= m_maxAutoSize.width()
24428abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            && !m_frame->document()->loadEventFinished() && (newSize.height() < size.height() || newSize.width() < size.width()))
24435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
24445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        resize(newSize.width(), newSize.height());
24465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Force the scrollbar state to avoid the scrollbar code adding them and causing them to be needed. For example,
24475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // a vertical scrollbar may cause text to wrap and thus increase the height (which is the only reason the scollbar is needed).
24485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setVerticalScrollbarLock(false);
24495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setHorizontalScrollbarLock(false);
24505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setScrollbarModes(horizonalScrollbarMode, verticalScrollbarMode, true, true);
24515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
24525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_didRunAutosize = true;
24535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateOverflowStatus(bool horizontalOverflow, bool verticalOverflow)
24565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_viewportRenderer)
24585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2459591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
24605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_overflowStatusDirty) {
24615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_horizontalOverflow = horizontalOverflow;
24625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_verticalOverflow = verticalOverflow;
24635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_overflowStatusDirty = false;
24645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
24655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2466591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
24675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool horizontalOverflowChanged = (m_horizontalOverflow != horizontalOverflow);
24685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool verticalOverflowChanged = (m_verticalOverflow != verticalOverflow);
2469591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
24705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (horizontalOverflowChanged || verticalOverflowChanged) {
24715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_horizontalOverflow = horizontalOverflow;
24725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_verticalOverflow = verticalOverflow;
2473591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
24741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        RefPtr<OverflowEvent> event = OverflowEvent::create(horizontalOverflowChanged, horizontalOverflow, verticalOverflowChanged, verticalOverflow);
24751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        event->setTarget(m_viewportRenderer->node());
247651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_frame->document()->enqueueAnimationFrameEvent(event.release());
24775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2478591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
24795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const Pagination& FrameView::pagination() const
24825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_pagination != Pagination())
24845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_pagination;
24855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24868abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (isMainFrame())
24878abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return m_frame->page()->pagination();
24885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_pagination;
24905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setPagination(const Pagination& pagination)
24935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_pagination == pagination)
24955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
24965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pagination = pagination;
24985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24998abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    m_frame->document()->styleResolverChanged(RecalcStyleDeferred);
25005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect FrameView::windowClipRect(bool clipToContents) const
25035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame->view() == this);
25055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (paintsEntireContents())
25075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return IntRect(IntPoint(), contentsSize());
25085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Set our clip rect to be our contents.
2510926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    IntRect clipRect = contentsToWindow(visibleContentRect(clipToContents ? ExcludeScrollbars : IncludeScrollbars));
25118abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!m_frame->ownerElement())
25125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return clipRect;
25135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Take our owner element and get its clip rect.
25155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLFrameOwnerElement* ownerElement = m_frame->ownerElement();
25168abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FrameView* parentView = ownerElement->document().view();
25175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (parentView)
25185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        clipRect.intersect(parentView->windowClipRectForFrameOwner(ownerElement, true));
25195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return clipRect;
25205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect FrameView::windowClipRectForFrameOwner(const HTMLFrameOwnerElement* ownerElement, bool clipToLayerContents) const
25235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The renderer can sometimes be null when style="display:none" interacts
25255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // with external content and plugins.
25265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!ownerElement->renderer())
25275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return windowClipRect();
25285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If we have no layer, just return our window clip rect.
25305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const RenderLayer* enclosingLayer = ownerElement->renderer()->enclosingLayer();
25315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!enclosingLayer)
25325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return windowClipRect();
25335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Apply the clip from the layer.
25355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect clipRect;
25365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (clipToLayerContents)
25375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        clipRect = pixelSnappedIntRect(enclosingLayer->childrenClipRect());
25385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
25395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        clipRect = pixelSnappedIntRect(enclosingLayer->selfClipRect());
2540591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    clipRect = contentsToWindow(clipRect);
25415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return intersection(clipRect, windowClipRect());
25425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isActive() const
25455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25468abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Page* page = frame().page();
25473c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    return page && page->focusController().isActive();
25485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scrollTo(const IntSize& newOffset)
25515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutSize offset = scrollOffset();
25535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::scrollTo(newOffset);
25545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (offset != scrollOffset())
25555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        scrollPositionChanged();
2556f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame().loader().client()->didChangeScrollOffset();
25575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::invalidateScrollbarRect(Scrollbar* scrollbar, const IntRect& rect)
25605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Add in our offset within the FrameView.
25625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect dirtyRect = rect;
25635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dirtyRect.moveBy(scrollbar->location());
25645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    invalidateRect(dirtyRect);
25655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::getTickmarks(Vector<IntRect>& tickmarks) const
25685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25698abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    tickmarks = frame().document()->markers()->renderedRectsForMarkers(DocumentMarker::TextMatch);
25705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect FrameView::windowResizerRect() const
25735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25748abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Page* page = frame().page();
25755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
25765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return IntRect();
257793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return page->chrome().windowResizerRect();
25785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
258053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void FrameView::setVisibleContentScaleFactor(float visibleContentScaleFactor)
2581926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
258253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (m_visibleContentScaleFactor == visibleContentScaleFactor)
258353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return;
2584926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
258553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_visibleContentScaleFactor = visibleContentScaleFactor;
258653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    updateScrollbars(scrollOffset());
2587926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2588926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
258919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void FrameView::setInputEventsTransformForEmulation(const IntSize& offset, float contentScaleFactor)
25901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
259119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    m_inputEventsOffsetForEmulation = offset;
25921e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    m_inputEventsScaleFactorForEmulation = contentScaleFactor;
25931e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
25941e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
259519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)IntSize FrameView::inputEventsOffsetForEmulation() const
259619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles){
259719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    return m_inputEventsOffsetForEmulation;
259819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)}
259919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
26001e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)float FrameView::inputEventsScaleFactor() const
26011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
26021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return visibleContentScaleFactor() * m_inputEventsScaleFactorForEmulation;
26031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
26041e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
26055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::scrollbarsCanBeActive() const
26065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
26075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frame->view() != this)
26085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
26095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
261053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return !!m_frame->document();
26115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
26125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ScrollableArea* FrameView::enclosingScrollableArea() const
26145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
26155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Walk up the frame tree and look for a scrollable parent frame or RenderLayer.
26165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
26175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
26185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect FrameView::scrollableAreaBoundingBox() const
26205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
26218abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    RenderPart* ownerRenderer = frame().ownerRenderer();
2622926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!ownerRenderer)
2623926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return frameRect();
2624926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2625926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return ownerRenderer->absoluteContentQuad().enclosingBoundingBox();
26265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
26275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2628926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool FrameView::isScrollable()
26295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
26305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Check for:
2631926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // 1) If there an actual overflow.
2632926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // 2) display:none or visibility:hidden set to self or inherited.
2633926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // 3) overflow{-x,-y}: hidden;
2634926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // 4) scrolling: no;
26355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2636926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Covers #1
263753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    IntSize contentsSize = this->contentsSize();
26385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntSize visibleContentSize = visibleContentRect().size();
263953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if ((contentsSize.height() <= visibleContentSize.height() && contentsSize.width() <= visibleContentSize.width()))
2640926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
26415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2642926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Covers #2.
2643926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    HTMLFrameOwnerElement* owner = m_frame->ownerElement();
2644926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (owner && (!owner->renderer() || !owner->renderer()->visibleToHitTesting()))
2645926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
2646926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2647926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Cover #3 and #4.
26485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollbarMode horizontalMode;
26495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollbarMode verticalMode;
26505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    calculateScrollbarModesForLayout(horizontalMode, verticalMode, RulesFromWebContentOnly);
2651926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (horizontalMode == ScrollbarAlwaysOff && verticalMode == ScrollbarAlwaysOff)
2652926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
2653926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2654926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return true;
2655926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2656926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2657926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void FrameView::updateScrollableAreaSet()
2658926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2659926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // That ensures that only inner frames are cached.
2660926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    FrameView* parentFrameView = this->parentFrameView();
2661926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!parentFrameView)
2662926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
2663926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2664926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!isScrollable()) {
2665926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        parentFrameView->removeScrollableArea(this);
26665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
26675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
26685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2669926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    parentFrameView->addScrollableArea(this);
26705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
26715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::shouldSuspendScrollAnimations() const
26735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2674f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return m_frame->loader().state() != FrameStateComplete;
26755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
26765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scrollbarStyleChanged(int newStyle, bool forceUpdate)
26785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
26798abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!isMainFrame())
26805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
26815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (forceUpdate)
26835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ScrollView::scrollbarStyleChanged(newStyle, forceUpdate);
26845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
26855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setAnimatorsAreActive()
26875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
26885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = m_frame->page();
26895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
26905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
26915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ScrollAnimator* scrollAnimator = existingScrollAnimator())
26935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        scrollAnimator->setIsActive();
26945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_scrollableAreas)
26965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
26975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (HashSet<ScrollableArea*>::const_iterator it = m_scrollableAreas->begin(), end = m_scrollableAreas->end(); it != end; ++it) {
26995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ScrollableArea* scrollableArea = *it;
27005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(scrollableArea->scrollbarsCanBeActive());
27025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        scrollableArea->scrollAnimator()->setIsActive();
27035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
27045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::notifyPageThatContentAreaWillPaint() const
27075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
27085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = m_frame->page();
27095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
27105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
27115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    contentAreaWillPaint();
27135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_scrollableAreas)
27155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
27165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (HashSet<ScrollableArea*>::const_iterator it = m_scrollableAreas->begin(), end = m_scrollableAreas->end(); it != end; ++it) {
27185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ScrollableArea* scrollableArea = *it;
27195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!scrollableArea->scrollbarsCanBeActive())
27215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
27225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        scrollableArea->contentAreaWillPaint();
27245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
27255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::scrollAnimatorEnabled() const
27285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
27291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (m_frame->settings())
27301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return m_frame->settings()->scrollAnimatorEnabled();
27315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
27325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateAnnotatedRegions()
27355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
27365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* document = m_frame->document();
27375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!document->hasAnnotatedRegions())
27385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
27395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<AnnotatedRegionValue> newRegions;
27405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    document->renderBox()->collectAnnotatedRegions(newRegions);
27415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (newRegions == document->annotatedRegions())
27425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
27435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    document->setAnnotatedRegions(newRegions);
2744e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (Page* page = m_frame->page())
2745e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        page->chrome().client().annotatedRegionsChanged();
27465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateScrollCorner()
27495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
27505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<RenderStyle> cornerStyle;
27515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect cornerRect = scrollCornerRect();
27525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    Document* doc = m_frame->document();
27535267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
27545267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (doc && !cornerRect.isEmpty()) {
27555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Try the <body> element first as a scroll corner source.
27565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        if (Element* body = doc->body()) {
27575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            if (RenderObject* renderer = body->renderer())
27585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                cornerStyle = renderer->getUncachedPseudoStyle(PseudoStyleRequest(SCROLLBAR_CORNER), renderer->style());
27595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2760591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
27615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!cornerStyle) {
27625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // If the <body> didn't have a custom style, then the root element might.
27635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            if (Element* docElement = doc->documentElement()) {
27645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                if (RenderObject* renderer = docElement->renderer())
27655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                    cornerStyle = renderer->getUncachedPseudoStyle(PseudoStyleRequest(SCROLLBAR_CORNER), renderer->style());
27665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
27675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2768591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
27695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!cornerStyle) {
27701e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            // If we have an owning ipage/Frame element, then it can set the custom scrollbar also.
27715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (RenderPart* renderer = m_frame->ownerRenderer())
2772926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                cornerStyle = renderer->getUncachedPseudoStyle(PseudoStyleRequest(SCROLLBAR_CORNER), renderer->style());
27735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
27745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
27755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (cornerStyle) {
27775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_scrollCorner)
27785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            m_scrollCorner = RenderScrollbarPart::createAnonymous(doc);
27795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollCorner->setStyle(cornerStyle.release());
27805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        invalidateScrollCorner(cornerRect);
27815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else if (m_scrollCorner) {
27825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollCorner->destroy();
27835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollCorner = 0;
27845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
27855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::updateScrollCorner();
27875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::paintScrollCorner(GraphicsContext* context, const IntRect& cornerRect)
27905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
27915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (context->updatingControlTints()) {
27925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateScrollCorner();
27935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
27945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
27955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_scrollCorner) {
27978abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        bool needsBackgorund = isMainFrame();
27985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (needsBackgorund)
27995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            context->fillRect(cornerRect, baseBackgroundColor());
28005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollCorner->paintIntoRect(context, cornerRect.location(), cornerRect);
28015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
28025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
28035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::paintScrollCorner(context, cornerRect);
28055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
28065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::paintScrollbar(GraphicsContext* context, Scrollbar* bar, const IntRect& rect)
28085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
28098abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    bool needsBackgorund = bar->isCustomScrollbar() && isMainFrame();
28105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (needsBackgorund) {
28115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect toFill = bar->frameRect();
28125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        toFill.intersect(rect);
28135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        context->fillRect(toFill, baseBackgroundColor());
28145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
28155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::paintScrollbar(context, bar, rect);
28175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
28185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28198abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)Color FrameView::documentBackgroundColor() const
28205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
28215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // <https://bugs.webkit.org/show_bug.cgi?id=59540> We blend the background color of
28225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the document and the body against the base background color of the frame view.
28235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Background images are unfortunately impractical to include.
28245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Return invalid Color objects whenever there is insufficient information.
28268abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!frame().document())
28275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Color();
28285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28298abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Element* htmlElement = frame().document()->documentElement();
28308abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Element* bodyElement = frame().document()->body();
28315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Start with invalid colors.
28338abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Color htmlBackgroundColor;
28348abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Color bodyBackgroundColor;
28355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (htmlElement && htmlElement->renderer())
28368abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        htmlBackgroundColor = htmlElement->renderer()->style()->visitedDependentColor(CSSPropertyBackgroundColor);
28375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (bodyElement && bodyElement->renderer())
28388abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        bodyBackgroundColor = bodyElement->renderer()->style()->visitedDependentColor(CSSPropertyBackgroundColor);
28395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!bodyBackgroundColor.isValid()) {
28415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!htmlBackgroundColor.isValid())
28428abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            return Color();
28438abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return baseBackgroundColor().blend(htmlBackgroundColor);
28445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
28455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!htmlBackgroundColor.isValid())
28478abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return baseBackgroundColor().blend(bodyBackgroundColor);
28485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We take the aggregate of the base background color
28505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the <html> background color, and the <body>
28515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // background color to find the document color. The
28525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // addition of the base background color is not
28535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // technically part of the document background, but it
28545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // otherwise poses problems when the aggregate is not
28555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // fully opaque.
28568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return baseBackgroundColor().blend(htmlBackgroundColor).blend(bodyBackgroundColor);
28575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
28585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::hasCustomScrollbars() const
28605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
28615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const HashSet<RefPtr<Widget> >* viewChildren = children();
28625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HashSet<RefPtr<Widget> >::const_iterator end = viewChildren->end();
28635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (HashSet<RefPtr<Widget> >::const_iterator current = viewChildren->begin(); current != end; ++current) {
28645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Widget* widget = current->get();
28655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (widget->isFrameView()) {
2866926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (toFrameView(widget)->hasCustomScrollbars())
28675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return true;
28685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (widget->isScrollbar()) {
28695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Scrollbar* scrollbar = static_cast<Scrollbar*>(widget);
28705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (scrollbar->isCustomScrollbar())
28715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return true;
28725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
28735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
28745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
28765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
28775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FrameView* FrameView::parentFrameView() const
28795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2880926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!parent())
2881926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
2882926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2883f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (Frame* parentFrame = m_frame->tree().parent())
28845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return parentFrame->view();
28855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
28875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
28885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateControlTints()
28905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
28915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This is called when control tints are changed from aqua/graphite to clear and vice versa.
28925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We do a "fake" paint, and when the theme gets a paint call, it can then do an invalidate.
28935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This is only done if the theme supports control tinting. It's up to the theme and platform
28945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // to define when controls get the tint and to call this function when that changes.
2895591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
28965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Optimize the common case where we bring a window to the front while it's still empty.
28978abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (m_frame->document()->url().isEmpty())
28985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
28995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2900c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    if (RenderTheme::theme().supportsControlTints() || hasCustomScrollbars())
29015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        paintControlTints();
29025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::paintControlTints()
29055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (needsLayout())
29075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        layout();
290853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // FIXME: The use of paint seems like overkill: crbug.com/236892
290953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext context(0); // NULL canvas to get a non-painting context.
29105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setUpdatingControlTints(true);
291153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    paint(&context, frameRect());
29125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::wasScrolledByUser() const
29155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_wasScrolledByUser;
29175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setWasScrolledByUser(bool wasScrolledByUser)
29205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_inProgrammaticScroll)
29225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
29235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_maintainScrollPositionAnchor = 0;
29245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_wasScrolledByUser = wasScrolledByUser;
29255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::paintContents(GraphicsContext* p, const IntRect& rect)
29285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* document = m_frame->document();
29305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
29325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool fillWithRed;
29335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (document->printing())
29345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fillWithRed = false; // Printing, don't fill with red (can't remember why).
29355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (m_frame->ownerElement())
29365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fillWithRed = false; // Subframe, don't fill with red.
29375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (isTransparent())
29385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fillWithRed = false; // Transparent, don't fill with red.
29395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (m_paintBehavior & PaintBehaviorSelectionOnly)
29405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fillWithRed = false; // Selections are transparent, don't fill with red.
29415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (m_nodeToDraw)
29425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fillWithRed = false; // Element images are transparent, don't fill with red.
29435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
29445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fillWithRed = true;
29455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
29465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (fillWithRed)
29475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        p->fillRect(rect, Color(0xFF, 0, 0));
29485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
29495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2950926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
2951926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView) {
2952a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        WTF_LOG_ERROR("called FrameView::paint with nil renderer");
29535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
29545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
29555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!needsLayout());
29575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (needsLayout())
29585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
29595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2960a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    InspectorInstrumentation::willPaint(renderView, 0);
296153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2962e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    bool isTopLevelPainter = !s_inPaintContents;
2963e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    s_inPaintContents = true;
29645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FontCachePurgePreventer fontCachePurgePreventer;
29665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PaintBehavior oldPaintBehavior = m_paintBehavior;
2968591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
29695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FrameView* parentView = parentFrameView()) {
29705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parentView->paintBehavior() & PaintBehaviorFlattenCompositingLayers)
29715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_paintBehavior |= PaintBehaviorFlattenCompositingLayers;
29725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2973591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
29745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_paintBehavior == PaintBehaviorNormal)
29755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        document->markers()->invalidateRenderedRectsForMarkersInRect(rect);
29765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (document->printing())
29785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_paintBehavior |= PaintBehaviorFlattenCompositingLayers;
29795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_isPainting);
29815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isPainting = true;
29825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // m_nodeToDraw is used to draw only one element (and its descendants)
29845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* eltRenderer = m_nodeToDraw ? m_nodeToDraw->renderer() : 0;
2985926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderLayer* rootLayer = renderView->layer();
29865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
29889bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    renderView->assertSubtreeIsLaidOut();
29895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject::SetLayoutNeededForbiddenScope forbidSetNeedsLayout(rootLayer->renderer());
29905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
29915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
299206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    RenderObject* enclosingLayerRenderer = eltRenderer->enclosingLayer() ? eltRenderer->enclosingLayer()->renderer() : eltRenderer;
299306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    rootLayer->paint(p, rect, m_paintBehavior, enclosingLayerRenderer);
29945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (rootLayer->containsDirtyOverlayScrollbars())
29965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rootLayer->paintOverlayScrollbars(p, rect, m_paintBehavior, eltRenderer);
29975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isPainting = false;
29995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_paintBehavior = oldPaintBehavior;
30015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastPaintTime = currentTime();
30025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Regions may have changed as a result of the visibility/z-index of element changing.
30045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (document->annotatedRegionsDirty())
30055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateAnnotatedRegions();
30065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3007e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (isTopLevelPainter) {
3008e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        // Everythin that happens after paintContents completions is considered
3009e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        // to be part of the next frame.
3010e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        s_currentFrameTimeStamp = currentTime();
3011e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        s_inPaintContents = false;
3012e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
30135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
301451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    InspectorInstrumentation::didPaint(renderView, 0, p, rect);
30155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setPaintBehavior(PaintBehavior behavior)
30185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
30195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_paintBehavior = behavior;
30205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PaintBehavior FrameView::paintBehavior() const
30235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
30245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_paintBehavior;
30255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isPainting() const
30285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
30295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_isPainting;
30305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setNodeToDraw(Node* node)
30335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
30345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_nodeToDraw = node;
30355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::paintOverhangAreas(GraphicsContext* context, const IntRect& horizontalOverhangArea, const IntRect& verticalOverhangArea, const IntRect& dirtyRect)
30385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
30395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (context->paintingDisabled())
30405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
30415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frame->document()->printing())
30435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
30445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30458abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (isMainFrame()) {
30468abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (m_frame->page()->chrome().client().paintCustomOverhangArea(context, horizontalOverhangArea, verticalOverhangArea, dirtyRect))
30475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
30485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
30495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::paintOverhangAreas(context, horizontalOverhangArea, verticalOverhangArea, dirtyRect);
30515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateLayoutAndStyleIfNeededRecursive()
30545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
30555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We have to crawl our entire tree looking for any FrameViews that need
30565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // layout and make sure they are up to date.
30575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Mac actually tests for intersection with the dirty region and tries not to
30585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // update layout for frames that are outside the dirty region.  Not only does this seem
30595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // pointless (since those frames will have set a zero timer to layout anyway), but
30605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // it is also incorrect, since if two frames overlap, the first could be excluded from the dirty
30615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // region but then become included later by the second frame adding rects to the dirty region
30625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // when it lays out.
30635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame->document()->updateStyleIfNeeded();
30655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (needsLayout())
30675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        layout();
30685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Grab a copy of the children() set, as it may be mutated by the following updateLayoutAndStyleIfNeededRecursive
30705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // calls, as they can potentially re-enter a layout of the parent frame view, which may add/remove scrollbars
30715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // and thus mutates the children() set.
30725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<RefPtr<FrameView> > frameViews;
30735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    collectFrameViewChildren(this, frameViews);
30745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Vector<RefPtr<FrameView> >::iterator end = frameViews.end();
30765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (Vector<RefPtr<FrameView> >::iterator it = frameViews.begin(); it != end; ++it)
30775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        (*it)->updateLayoutAndStyleIfNeededRecursive();
30785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // updateLayoutAndStyleIfNeededRecursive is called when we need to make sure style and layout are up-to-date before
30805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // painting, so we need to flush out any deferred repaints too.
30815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    flushDeferredRepaints();
30825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
308393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // When seamless is on, child frame can mark parent frame dirty. In such case, child frame
30845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // needs to call layout on parent frame recursively.
30855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This assert ensures that parent frames are clean, when child frames finished updating layout and style.
30865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!needsLayout());
30875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::enableAutoSizeMode(bool enable, const IntSize& minSize, const IntSize& maxSize)
30905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
30915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!enable || !minSize.isEmpty());
30925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(minSize.width() <= maxSize.width());
30935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(minSize.height() <= maxSize.height());
30945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_shouldAutoSize == enable && m_minAutoSize == minSize && m_maxAutoSize == maxSize)
30965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
30975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3098bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
30995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_shouldAutoSize = enable;
31005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_minAutoSize = minSize;
31015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_maxAutoSize = maxSize;
31025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_didRunAutosize = false;
31035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3104bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    setLayoutSizeFixedToFrameSize(enable);
31055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setNeedsLayout();
31065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    scheduleRelayout();
31075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_shouldAutoSize)
31085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
31095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Since autosize mode forces the scrollbar mode, change them to being auto.
31115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setVerticalScrollbarLock(false);
31125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setHorizontalScrollbarLock(false);
31135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setScrollbarModes(ScrollbarAuto, ScrollbarAuto);
31145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
31155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::forceLayout(bool allowSubtree)
31175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
31185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    layout(allowSubtree);
31195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
31205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::forceLayoutForPagination(const FloatSize& pageSize, const FloatSize& originalPageSize, float maximumShrinkFactor, AdjustViewSizeOrNot shouldAdjustViewSize)
31225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
31235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Dumping externalRepresentation(m_frame->renderer()).ascii() is a good trick to see
31245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the state of things before and after the layout
3125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (RenderView* renderView = this->renderView()) {
3126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        float pageLogicalWidth = renderView->style()->isHorizontalWritingMode() ? pageSize.width() : pageSize.height();
3127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        float pageLogicalHeight = renderView->style()->isHorizontalWritingMode() ? pageSize.height() : pageSize.width();
31285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit flooredPageLogicalWidth = static_cast<LayoutUnit>(pageLogicalWidth);
31305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit flooredPageLogicalHeight = static_cast<LayoutUnit>(pageLogicalHeight);
3131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        renderView->setLogicalWidth(flooredPageLogicalWidth);
3132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        renderView->setPageLogicalHeight(flooredPageLogicalHeight);
3133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        renderView->setNeedsLayoutAndPrefWidthsRecalc();
31345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        forceLayout();
31355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If we don't fit in the given page width, we'll lay out again. If we don't fit in the
31375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // page width when shrunk, we will lay out at maximum shrink and clip extra content.
31385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // FIXME: We are assuming a shrink-to-fit printing implementation.  A cropping
31395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // implementation should not do this!
3140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        bool horizontalWritingMode = renderView->style()->isHorizontalWritingMode();
3141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const LayoutRect& documentRect = renderView->documentRect();
31425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit docLogicalWidth = horizontalWritingMode ? documentRect.width() : documentRect.height();
31435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (docLogicalWidth > pageLogicalWidth) {
31445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int expectedPageWidth = std::min<float>(documentRect.width(), pageSize.width() * maximumShrinkFactor);
31455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int expectedPageHeight = std::min<float>(documentRect.height(), pageSize.height() * maximumShrinkFactor);
31465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            FloatSize maxPageSize = m_frame->resizePageRectsKeepingRatio(FloatSize(originalPageSize.width(), originalPageSize.height()), FloatSize(expectedPageWidth, expectedPageHeight));
31475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            pageLogicalWidth = horizontalWritingMode ? maxPageSize.width() : maxPageSize.height();
31485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            pageLogicalHeight = horizontalWritingMode ? maxPageSize.height() : maxPageSize.width();
31495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            flooredPageLogicalWidth = static_cast<LayoutUnit>(pageLogicalWidth);
31515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            flooredPageLogicalHeight = static_cast<LayoutUnit>(pageLogicalHeight);
3152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->setLogicalWidth(flooredPageLogicalWidth);
3153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->setPageLogicalHeight(flooredPageLogicalHeight);
3154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->setNeedsLayoutAndPrefWidthsRecalc();
31555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            forceLayout();
31565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            const LayoutRect& updatedDocumentRect = renderView->documentRect();
31585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutUnit docLogicalHeight = horizontalWritingMode ? updatedDocumentRect.height() : updatedDocumentRect.width();
31595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutUnit docLogicalTop = horizontalWritingMode ? updatedDocumentRect.y() : updatedDocumentRect.x();
31605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutUnit docLogicalRight = horizontalWritingMode ? updatedDocumentRect.maxX() : updatedDocumentRect.maxY();
31615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutUnit clippedLogicalLeft = 0;
3162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (!renderView->style()->isLeftToRightDirection())
31635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                clippedLogicalLeft = docLogicalRight - pageLogicalWidth;
31645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutRect overflow(clippedLogicalLeft, docLogicalTop, pageLogicalWidth, docLogicalHeight);
31655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!horizontalWritingMode)
31675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                overflow = overflow.transposedRect();
3168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->clearLayoutOverflow();
3169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->addLayoutOverflow(overflow); // This is how we clip in case we overflow again.
31705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
31715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
31725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (shouldAdjustViewSize)
31745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        adjustViewSize();
31755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
31765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect FrameView::convertFromRenderer(const RenderObject* renderer, const IntRect& rendererRect) const
31785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    IntRect rect = pixelSnappedIntRect(enclosingLayoutRect(renderer->localToAbsoluteQuad(FloatRect(rendererRect)).boundingBox()));
31805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Convert from page ("absolute") to FrameView coordinates.
318253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    rect.moveBy(-scrollPosition());
31835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return rect;
31855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
31865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect FrameView::convertToRenderer(const RenderObject* renderer, const IntRect& viewRect) const
31885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
31895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect rect = viewRect;
3190591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
31915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Convert from FrameView coords into page ("absolute") coordinates.
319253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    rect.moveBy(scrollPosition());
31935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: we don't have a way to map an absolute rect down to a local quad, so just
31955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // move the rect for now.
3196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    rect.setLocation(roundedIntPoint(renderer->absoluteToLocal(rect.location(), UseTransforms)));
31975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return rect;
31985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
31995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint FrameView::convertFromRenderer(const RenderObject* renderer, const IntPoint& rendererPoint) const
32015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3202926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    IntPoint point = roundedIntPoint(renderer->localToAbsolute(rendererPoint, UseTransforms));
32035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Convert from page ("absolute") to FrameView coordinates.
320553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    point.moveBy(-scrollPosition());
32065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return point;
32075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint FrameView::convertToRenderer(const RenderObject* renderer, const IntPoint& viewPoint) const
32105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint point = viewPoint;
32125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Convert from FrameView coords into page ("absolute") coordinates.
321453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    point += IntSize(scrollX(), scrollY());
32155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return roundedIntPoint(renderer->absoluteToLocal(point, UseTransforms));
32175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect FrameView::convertToContainingView(const IntRect& localRect) const
32205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32211e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (const ScrollView* parentScrollView = toScrollView(parent())) {
32225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parentScrollView->isFrameView()) {
3223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            const FrameView* parentView = toFrameView(parentScrollView);
32245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Get our renderer in the parent view
32255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RenderPart* renderer = m_frame->ownerRenderer();
32265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!renderer)
32275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return localRect;
3228591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
32295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            IntRect rect(localRect);
32305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Add borders and padding??
32315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            rect.move(renderer->borderLeft() + renderer->paddingLeft(),
32321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)                renderer->borderTop() + renderer->paddingTop());
32335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return parentView->convertFromRenderer(renderer, rect);
32345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3235591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
32365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Widget::convertToContainingView(localRect);
32375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3238591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
32395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return localRect;
32405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect FrameView::convertFromContainingView(const IntRect& parentRect) const
32435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (const ScrollView* parentScrollView = toScrollView(parent())) {
32455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parentScrollView->isFrameView()) {
3246926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            const FrameView* parentView = toFrameView(parentScrollView);
32475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Get our renderer in the parent view
32495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RenderPart* renderer = m_frame->ownerRenderer();
32505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!renderer)
32515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return parentRect;
32525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            IntRect rect = parentView->convertToRenderer(renderer, parentRect);
32545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Subtract borders and padding
32555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            rect.move(-renderer->borderLeft() - renderer->paddingLeft(),
32565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                      -renderer->borderTop() - renderer->paddingTop());
32575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return rect;
32585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3259591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
32605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Widget::convertFromContainingView(parentRect);
32615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3262591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
32635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return parentRect;
32645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint FrameView::convertToContainingView(const IntPoint& localPoint) const
32675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (const ScrollView* parentScrollView = toScrollView(parent())) {
32695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parentScrollView->isFrameView()) {
3270926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            const FrameView* parentView = toFrameView(parentScrollView);
32715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Get our renderer in the parent view
32735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RenderPart* renderer = m_frame->ownerRenderer();
32745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!renderer)
32755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return localPoint;
3276591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
32775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            IntPoint point(localPoint);
32785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Add borders and padding
32805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            point.move(renderer->borderLeft() + renderer->paddingLeft(),
32815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       renderer->borderTop() + renderer->paddingTop());
32825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return parentView->convertFromRenderer(renderer, point);
32835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3284591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
32855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Widget::convertToContainingView(localPoint);
32865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3287591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
32885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return localPoint;
32895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint FrameView::convertFromContainingView(const IntPoint& parentPoint) const
32925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32931e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (const ScrollView* parentScrollView = toScrollView(parent())) {
32945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parentScrollView->isFrameView()) {
3295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            const FrameView* parentView = toFrameView(parentScrollView);
32965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Get our renderer in the parent view
32985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RenderPart* renderer = m_frame->ownerRenderer();
32995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!renderer)
33005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return parentPoint;
33015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            IntPoint point = parentView->convertToRenderer(renderer, parentPoint);
33035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Subtract borders and padding
33045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            point.move(-renderer->borderLeft() - renderer->paddingLeft(),
33055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       -renderer->borderTop() - renderer->paddingTop());
33065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return point;
33075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3308591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
33095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Widget::convertFromContainingView(parentPoint);
33105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3311591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
33125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return parentPoint;
33135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
33145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Normal delay
33165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setRepaintThrottlingDeferredRepaintDelay(double p)
33175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
33185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    s_normalDeferredRepaintDelay = p;
33195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
33205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Negative value would mean that first few repaints happen without a delay
33225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setRepaintThrottlingnInitialDeferredRepaintDelayDuringLoading(double p)
33235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
33245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    s_initialDeferredRepaintDelayDuringLoading = p;
33255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
33265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The delay grows on each repaint to this maximum value
33285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setRepaintThrottlingMaxDeferredRepaintDelayDuringLoading(double p)
33295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
33305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    s_maxDeferredRepaintDelayDuringLoading = p;
33315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
33325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// On each repaint the delay increases by this amount
33345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setRepaintThrottlingDeferredRepaintDelayIncrementDuringLoading(double p)
33355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
33365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    s_deferredRepaintDelayIncrementDuringLoading = p;
33375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
33385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setTracksRepaints(bool trackRepaints)
33405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
33415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (trackRepaints == m_isTrackingRepaints)
33425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
33435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3344f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    for (Frame* frame = m_frame->tree().top(); frame; frame = frame->tree().traverseNext()) {
33455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (RenderView* renderView = frame->contentRenderer())
33465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            renderView->compositor()->setTracksRepaints(trackRepaints);
33475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
33485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resetTrackedRepaints();
33505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isTrackingRepaints = trackRepaints;
33515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
33525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::resetTrackedRepaints()
33545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
33555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_trackedRepaintRects.clear();
3356926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (RenderView* renderView = this->renderView())
3357926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        renderView->compositor()->resetTrackedRepaintRects();
33585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
33595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String FrameView::trackedRepaintRectsAsText() const
33615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
33625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TextStream ts;
33635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_trackedRepaintRects.isEmpty()) {
33645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ts << "(repaint rects\n";
33655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (size_t i = 0; i < m_trackedRepaintRects.size(); ++i)
33665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ts << "  (rect " << m_trackedRepaintRects[i].x() << " " << m_trackedRepaintRects[i].y() << " " << m_trackedRepaintRects[i].width() << " " << m_trackedRepaintRects[i].height() << ")\n";
33675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ts << ")\n";
33685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
33695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ts.release();
33705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
33715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33721e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void FrameView::addResizerArea(RenderBox* resizerBox)
337381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){
337481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (!m_resizerAreas)
337581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        m_resizerAreas = adoptPtr(new ResizerAreaSet);
33761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    m_resizerAreas->add(resizerBox);
337781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)}
337881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
33791e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void FrameView::removeResizerArea(RenderBox* resizerBox)
338081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){
338181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (!m_resizerAreas)
338281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        return;
338381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
33841e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ResizerAreaSet::iterator it = m_resizerAreas->find(resizerBox);
338581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (it != m_resizerAreas->end())
338681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        m_resizerAreas->remove(it);
338781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)}
338881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
3389926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool FrameView::addScrollableArea(ScrollableArea* scrollableArea)
33905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3391bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ASSERT(scrollableArea);
33925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_scrollableAreas)
33935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollableAreas = adoptPtr(new ScrollableAreaSet);
3394926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_scrollableAreas->add(scrollableArea).isNewEntry;
33955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
33965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3397926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool FrameView::removeScrollableArea(ScrollableArea* scrollableArea)
33985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
33995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_scrollableAreas)
3400926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
3401926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3402926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ScrollableAreaSet::iterator it = m_scrollableAreas->find(scrollableArea);
3403926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (it == m_scrollableAreas->end())
3404926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
3405926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3406926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_scrollableAreas->remove(it);
3407926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return true;
34085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
34095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3410e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)bool FrameView::containsScrollableArea(const ScrollableArea* scrollableArea) const
34115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3412bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ASSERT(scrollableArea);
3413bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (!m_scrollableAreas || !scrollableArea)
34145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
3415e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return m_scrollableAreas->contains(const_cast<ScrollableArea*>(scrollableArea));
34165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
34175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::removeChild(Widget* widget)
34195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
34205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (widget->isFrameView())
3421926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        removeScrollableArea(toFrameView(widget));
34225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::removeChild(widget);
34245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
34255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::wheelEvent(const PlatformWheelEvent& wheelEvent)
34275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3428926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Note that to allow for rubber-band over-scroll behavior, even non-scrollable views
3429926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // should handle wheel events.
343006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#if !USE(RUBBER_BANDING)
3431926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!isScrollable())
3432926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
3433926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
3434926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
34355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We don't allow mouse wheeling to happen in a ScrollView that has had its scrollbars explicitly disabled.
34365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!canHaveScrollbars())
34375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
34385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ScrollableArea::handleWheelEvent(wheelEvent);
34405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
34415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isVerticalDocument() const
34435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3444926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
3445926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
34465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
34475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3448926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return renderView->style()->isHorizontalWritingMode();
34495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
34505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isFlippedDocument() const
34525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3453926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
3454926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
34555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
34565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3457926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return renderView->style()->isFlippedBlocksWritingMode();
34585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
34595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)AXObjectCache* FrameView::axObjectCache() const
34615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
34628abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (frame().document())
34638abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return frame().document()->existingAXObjectCache();
34645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
34655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3466591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
3467f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void FrameView::setCursor(const Cursor& cursor)
3468f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){
3469f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    Page* page = frame().page();
3470f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (!page)
3471f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return;
3472f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    page->chrome().setCursor(cursor);
3473f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)}
3474f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
34758abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)bool FrameView::isMainFrame() const
34768abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
347751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return m_frame->isMainFrame();
34788abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
34798abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
3480bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void FrameView::frameRectsChanged()
3481bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
3482bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (layoutSizeFixedToFrameSize())
3483bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        setLayoutSizeInternal(frameRect().size());
3484bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
3485bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ScrollView::frameRectsChanged();
3486bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
3487bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
3488bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void FrameView::setLayoutSizeInternal(const IntSize& size)
3489bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
3490bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (m_layoutSize == size)
3491bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return;
3492bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
3493bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    m_layoutSize = size;
3494bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    contentsResized();
3495bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
3496bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
349751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void FrameView::didAddScrollbar(Scrollbar* scrollbar, ScrollbarOrientation orientation)
349851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
349951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ScrollableArea::didAddScrollbar(scrollbar, orientation);
350051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (AXObjectCache* cache = axObjectCache())
350151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        cache->handleScrollbarUpdate(this);
350251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
350351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
350451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void FrameView::willRemoveScrollbar(Scrollbar* scrollbar, ScrollbarOrientation orientation)
350551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
350651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ScrollableArea::willRemoveScrollbar(scrollbar, orientation);
350751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (AXObjectCache* cache = axObjectCache()) {
350851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        cache->remove(scrollbar);
350951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        cache->handleScrollbarUpdate(this);
351051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
351151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
351251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
35135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
3514