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"
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/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"
3393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/animation/DocumentTimeline.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/FontLoader.h"
3581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "core/css/resolver/StyleResolver.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentMarkerController.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/OverflowEvent.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/FrameSelection.h"
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFrameElement.h"
40e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/html/HTMLHtmlElement.h"
4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLPlugInImageElement.h"
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorInstrumentation.h"
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoader.h"
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoaderClient.h"
4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/TextResourceDecoder.h"
463464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch#include "core/loader/cache/ResourceFetcher.h"
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Chrome.h"
4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/ChromeClient.h"
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/EventHandler.h"
5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FocusController.h"
5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Frame.h"
5253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FrameActionScheduler.h"
5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FrameTree.h"
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Settings.h"
5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/animation/AnimationController.h"
5653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/scrolling/ScrollingCoordinator.h"
5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/ScrollAnimator.h"
5853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/FloatRect.h"
5953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/FontCache.h"
6053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/GraphicsContext.h"
6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/text/TextStream.h"
6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderEmbeddedObject.h"
6353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderLayer.h"
6453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderLayerBacking.h"
6553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderLayerCompositor.h"
6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderLazyBlock.h"
6753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderPart.h"
6853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderScrollbar.h"
6953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderScrollbarPart.h"
7053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTheme.h"
7153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h"
7253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/TextAutosizer.h"
7353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/RenderStyle.h"
7493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/rendering/svg/RenderSVGRoot.h"
7593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/svg/SVGDocument.h"
7693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/svg/SVGSVGElement.h"
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
78591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/CurrentTime.h"
79591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/TemporaryChange.h"
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/chromium/TraceEvent.h"
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames;
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double FrameView::sCurrentPaintTimeStamp = 0.0;
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// REPAINT_THROTTLING now chooses default values for throttling parameters.
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Should be removed when applications start using runtime configuration.
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(REPAINT_THROTTLING)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Normal delay
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double FrameView::s_normalDeferredRepaintDelay = 0.016;
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Negative value would mean that first few repaints happen without a delay
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double FrameView::s_initialDeferredRepaintDelayDuringLoading = 0;
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The delay grows on each repaint to this maximum value
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double FrameView::s_maxDeferredRepaintDelayDuringLoading = 2.5;
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// On each repaint the delay increses by this amount
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double FrameView::s_deferredRepaintDelayIncrementDuringLoading = 0.5;
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: Repaint throttling could be good to have on all platform.
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The balance between CPU use and repaint frequency will need some tuning for desktop.
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// More hooks may be needed to reset the delay on things like GIF and CSS animations.
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double FrameView::s_normalDeferredRepaintDelay = 0;
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double FrameView::s_initialDeferredRepaintDelayDuringLoading = 0;
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double FrameView::s_maxDeferredRepaintDelayDuringLoading = 0;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double FrameView::s_deferredRepaintDelayIncrementDuringLoading = 0;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The maximum number of updateWidgets iterations that should be done before returning.
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const unsigned maxUpdateWidgetsIterations = 2;
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static RenderLayer::UpdateLayerPositionsFlags updateLayerPositionFlags(RenderLayer* layer, bool isRelayoutingSubtree, bool didFullRepaint)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderLayer::UpdateLayerPositionsFlags flags = RenderLayer::defaultFlags;
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (didFullRepaint) {
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        flags &= ~RenderLayer::CheckForRepaint;
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        flags |= RenderLayer::NeedsFullRepaintInBacking;
120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isRelayoutingSubtree && layer->isPaginated())
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        flags |= RenderLayer::UpdatePagination;
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return flags;
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Pagination::Mode paginationModeForRenderStyle(RenderStyle* style)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EOverflow overflow = style->overflowY();
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (overflow != OPAGEDX && overflow != OPAGEDY)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Pagination::Unpaginated;
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isHorizontalWritingMode = style->isHorizontalWritingMode();
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TextDirection textDirection = style->direction();
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WritingMode writingMode = style->writingMode();
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // paged-x always corresponds to LeftToRightPaginated or RightToLeftPaginated. If the WritingMode
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // is horizontal, then we use TextDirection to choose between those options. If the WritingMode
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // is vertical, then the direction of the verticality dictates the choice.
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (overflow == OPAGEDX) {
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ((isHorizontalWritingMode && textDirection == LTR) || writingMode == LeftToRightWritingMode)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return Pagination::LeftToRightPaginated;
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Pagination::RightToLeftPaginated;
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // paged-y always corresponds to TopToBottomPaginated or BottomToTopPaginated. If the WritingMode
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // is horizontal, then the direction of the horizontality dictates the choice. If the WritingMode
147591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    // is vertical, then we use TextDirection to choose between those options.
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (writingMode == TopToBottomWritingMode || (!isHorizontalWritingMode && textDirection == RTL))
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Pagination::TopToBottomPaginated;
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Pagination::BottomToTopPaginated;
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FrameView::FrameView(Frame* frame)
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_frame(frame)
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_canHaveScrollbars(true)
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_slowRepaintObjectCount(0)
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_layoutTimer(this, &FrameView::layoutTimerFired)
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_layoutRoot(0)
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_inSynchronousPostLayout(false)
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_postLayoutTasksTimer(this, &FrameView::postLayoutTimerFired)
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isTransparent(false)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_baseBackgroundColor(Color::white)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_mediaType("screen")
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_actionScheduler(adoptPtr(new FrameActionScheduler))
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_overflowStatusDirty(true)
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_viewportRenderer(0)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_wasScrolledByUser(false)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_inProgrammaticScroll(false)
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_safeToPropagateScrollToParent(true)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_deferredRepaintTimer(this, &FrameView::deferredRepaintTimerFired)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_disableRepaints(0)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isTrackingRepaints(false)
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_shouldUpdateWhileOffscreen(true)
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_deferSetNeedsLayouts(0)
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_setNeedsLayoutWasDeferred(false)
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_scrollCorner(0)
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_shouldAutoSize(false)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_inAutoSize(false)
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_didRunAutosize(false)
180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_hasSoftwareFilters(false)
18153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    , m_visibleContentScaleFactor(1)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    init();
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Can m_frame ever be null here?
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_frame)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = m_frame->page();
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frame == page->mainFrame()) {
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ScrollableArea::setVerticalScrollElasticity(ScrollElasticityAllowed);
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ScrollableArea::setHorizontalScrollElasticity(ScrollElasticityAllowed);
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<FrameView> FrameView::create(Frame* frame)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<FrameView> view = adoptRef(new FrameView(frame));
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    view->show();
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return view.release();
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<FrameView> FrameView::create(Frame* frame, const IntSize& initialSize)
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<FrameView> view = adoptRef(new FrameView(frame));
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    view->Widget::setFrameRect(IntRect(view->location(), initialSize));
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    view->show();
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return view.release();
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FrameView::~FrameView()
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_postLayoutTasksTimer.isActive()) {
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_postLayoutTasksTimer.stop();
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_actionScheduler->clear();
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
220591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    removeFromAXObjectCache();
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resetScrollbars();
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Custom scrollbars should already be destroyed at this point
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!horizontalScrollbar() || !horizontalScrollbar()->isCustomScrollbar());
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!verticalScrollbar() || !verticalScrollbar()->isCustomScrollbar());
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setHasHorizontalScrollbar(false); // Remove native scrollbars now before we lose the connection to the HostWindow.
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setHasVerticalScrollbar(false);
230591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_scrollCorner);
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_actionScheduler->isEmpty());
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frame) {
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(m_frame->view() != this || !m_frame->contentRenderer());
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderPart* renderer = m_frame->ownerRenderer();
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (renderer && renderer->widget() == this)
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            renderer->setWidget(0);
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::reset()
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_cannotBlitToWindow = false;
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isOverlapped = false;
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_contentIsOpaque = false;
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_borderX = 30;
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_borderY = 30;
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_layoutTimer.stop();
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_layoutRoot = 0;
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_delayedLayout = false;
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_doFullRepaint = true;
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_layoutSchedulingEnabled = true;
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inLayout = false;
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_doingPreLayoutStyleUpdate = false;
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inSynchronousPostLayout = false;
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_layoutCount = 0;
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_nestedLayoutCount = 0;
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_postLayoutTasksTimer.stop();
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_firstLayout = true;
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_firstLayoutCallbackPending = false;
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_wasScrolledByUser = false;
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_safeToPropagateScrollToParent = true;
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastViewportSize = IntSize();
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastZoomFactor = 1.0f;
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deferringRepaints = 0;
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_repaintCount = 0;
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_repaintRects.clear();
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deferredRepaintDelay = s_initialDeferredRepaintDelayDuringLoading;
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deferredRepaintTimer.stop();
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isTrackingRepaints = false;
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_trackedRepaintRects.clear();
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastPaintTime = 0;
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_paintBehavior = PaintBehaviorNormal;
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isPainting = false;
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_visuallyNonEmptyCharacterCount = 0;
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_visuallyNonEmptyPixelCount = 0;
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isVisuallyNonEmpty = false;
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_firstVisuallyNonEmptyLayoutCallbackPending = true;
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_maintainScrollPositionAnchor = 0;
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_disableRepaints = 0;
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void FrameView::removeFromAXObjectCache()
285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
286926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (AXObjectCache* cache = axObjectCache())
287926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        cache->remove(this);
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::clearFrame()
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2927757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    RELEASE_ASSERT(!isInLayout());
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame = 0;
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::resetScrollbars()
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Reset the document's scrollbars back to our defaults before we yield the floor.
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_firstLayout = true;
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setScrollbarsSuppressed(true);
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_canHaveScrollbars)
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setScrollbarModes(ScrollbarAuto, ScrollbarAuto);
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setScrollbarModes(ScrollbarAlwaysOff, ScrollbarAlwaysOff);
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setScrollbarsSuppressed(false);
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::init()
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    reset();
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_margins = LayoutSize(-1, -1); // undefined
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_size = LayoutSize();
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Propagate the marginwidth/height and scrolling modes to the view.
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* ownerElement = m_frame ? m_frame->ownerElement() : 0;
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ownerElement && (ownerElement->hasTagName(frameTag) || ownerElement->hasTagName(iframeTag))) {
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        HTMLFrameElementBase* frameElt = static_cast<HTMLFrameElementBase*>(ownerElement);
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (frameElt->scrollingMode() == ScrollbarAlwaysOff)
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setCanHaveScrollbars(false);
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit marginWidth = frameElt->marginWidth();
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit marginHeight = frameElt->marginHeight();
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (marginWidth != -1)
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setMarginWidth(marginWidth);
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (marginHeight != -1)
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setMarginHeight(marginHeight);
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
329591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
330926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void FrameView::prepareForDetach()
331926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
3327757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    RELEASE_ASSERT(!isInLayout());
3337757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
334fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    if (ScrollAnimator* scrollAnimator = existingScrollAnimator())
335fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        scrollAnimator->cancelAnimations();
336fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    detachCustomScrollbars();
338926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // When the view is no longer associated with a frame, it needs to be removed from the ax object cache
339926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // right now, otherwise it won't be able to reach the topDocument()'s axObject cache later.
340926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    removeFromAXObjectCache();
341926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
342926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_frame && m_frame->page()) {
343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (ScrollingCoordinator* scrollingCoordinator = m_frame->page()->scrollingCoordinator())
344926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            scrollingCoordinator->willDestroyScrollableArea(this);
345926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
346926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::detachCustomScrollbars()
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Scrollbar* horizontalBar = horizontalScrollbar();
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (horizontalBar && horizontalBar->isCustomScrollbar())
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setHasHorizontalScrollbar(false);
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Scrollbar* verticalBar = verticalScrollbar();
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (verticalBar && verticalBar->isCustomScrollbar())
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setHasVerticalScrollbar(false);
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_scrollCorner) {
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollCorner->destroy();
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollCorner = 0;
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::recalculateScrollbarOverlayStyle()
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollbarOverlayStyle oldOverlayStyle = scrollbarOverlayStyle();
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollbarOverlayStyle overlayStyle = ScrollbarOverlayStyleDefault;
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    StyleColor backgroundColor = documentBackgroundColor();
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (backgroundColor.isValid()) {
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Reduce the background color from RGB to a lightness value
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // and determine which scrollbar style to use based on a lightness
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // heuristic.
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        double hue, saturation, lightness;
37583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        backgroundColor.color().getHSL(hue, saturation, lightness);
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (lightness <= .5)
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            overlayStyle = ScrollbarOverlayStyleLight;
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (oldOverlayStyle != overlayStyle)
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setScrollbarOverlayStyle(overlayStyle);
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::clear()
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setCanBlitOnScroll(true);
387591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    reset();
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frame) {
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (RenderPart* renderer = m_frame->ownerRenderer())
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            renderer->viewCleared();
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
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)    if (!m_frame)
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderPart* renderer = m_frame->ownerRenderer();
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!renderer)
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect repaintRect = rect;
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    repaintRect.move(renderer->borderLeft() + renderer->paddingLeft(),
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     renderer->borderTop() + renderer->paddingTop());
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    renderer->repaintRectangle(repaintRect);
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setFrameRect(const IntRect& newRect)
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect oldRect = frameRect();
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (newRect == oldRect)
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
430926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Autosized font sizes depend on the width of the viewing area.
431926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (newRect.width() != oldRect.width()) {
432926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        Page* page = m_frame ? m_frame->page() : 0;
433926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (page && page->mainFrame() == m_frame && page->settings()->textAutosizingEnabled()) {
434926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            for (Frame* frame = page->mainFrame(); frame; frame = frame->tree()->traverseNext())
435926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                m_frame->document()->textAutosizer()->recalculateMultipliers();
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)
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setMarginWidth(LayoutUnit w)
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // make it update the rendering area when set
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_margins.setWidth(w);
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setMarginHeight(LayoutUnit h)
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // make it update the rendering area when set
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_margins.setHeight(h);
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setCanHaveScrollbars(bool canHaveScrollbars)
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_canHaveScrollbars = canHaveScrollbars;
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::setCanHaveScrollbars(canHaveScrollbars);
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateCanHaveScrollbars()
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollbarMode hMode;
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollbarMode vMode;
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    scrollbarModes(hMode, vMode);
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hMode == ScrollbarAlwaysOff && vMode == ScrollbarAlwaysOff)
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setCanHaveScrollbars(false);
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setCanHaveScrollbars(true);
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<Scrollbar> FrameView::createScrollbar(ScrollbarOrientation orientation)
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
489926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (Settings* settings = m_frame->settings()) {
490926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!settings->allowCustomScrollbarInMainFrame() && m_frame->page() && m_frame->page()->mainFrame() == m_frame)
491926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return ScrollView::createScrollbar(orientation);
492926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
493926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (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).
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* doc = m_frame->document();
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Try the <body> element first as a scrollbar source.
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* body = doc ? doc->body() : 0;
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (body && body->renderer() && body->renderer()->style()->hasPseudoStyle(SCROLLBAR))
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return RenderScrollbar::createCustomScrollbar(this, orientation, body);
501591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the <body> didn't have a custom style, then the root element might.
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* docElement = doc ? doc->documentElement() : 0;
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (docElement && docElement->renderer() && docElement->renderer()->style()->hasPseudoStyle(SCROLLBAR))
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return RenderScrollbar::createCustomScrollbar(this, orientation, docElement);
506591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If we have an owning iframe/frame element, then it can set the custom scrollbar also.
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderPart* frameRenderer = m_frame->ownerRenderer();
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (frameRenderer && frameRenderer->style()->hasPseudoStyle(SCROLLBAR))
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return RenderScrollbar::createCustomScrollbar(this, orientation, 0, m_frame.get());
511591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Nobody set a custom style, so we just use a native scrollbar.
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ScrollView::createScrollbar(orientation);
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setContentsSize(const IntSize& size)
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (size == contentsSize())
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deferSetNeedsLayouts++;
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::setContentsSize(size);
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::contentsResized();
525591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = frame() ? frame()->page() : 0;
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateScrollableAreaSet();
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    page->chrome().contentsSizeChanged(frame(), size); // Notify only.
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deferSetNeedsLayouts--;
535591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_deferSetNeedsLayouts)
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_setNeedsLayoutWasDeferred = false; // FIXME: Find a way to make the deferred layout actually happen.
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::adjustViewSize()
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
542926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
543926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame->view() == this);
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
548926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const IntRect rect = renderView->documentRect();
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const IntSize& size = rect.size();
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::setScrollOrigin(IntPoint(-rect.x(), -rect.y()), !m_frame->document()->printing(), size == contentsSize());
551591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setContentsSize(size);
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::applyOverflowToViewport(RenderObject* o, ScrollbarMode& hMode, ScrollbarMode& vMode)
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Handle the overflow:hidden/scroll case for the body/html elements.  WinIE treats
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // overflow:hidden and overflow:scroll on <body> as applying to the document's
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // scrollbars.  The CSS2.1 draft states that HTML UAs should use the <html> or <body> element and XML/XHTML UAs should
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // use the root element.
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EOverflow overflowX = o->style()->overflowX();
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EOverflow overflowY = o->style()->overflowY();
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (o->isSVGRoot()) {
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // overflow is ignored in stand-alone SVG documents.
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!toRenderSVGRoot(o)->isEmbeddedThroughFrameContainingSVGDocument())
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        overflowX = OHIDDEN;
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        overflowY = OHIDDEN;
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5738f89d18ff7550615970addc63a8c46172e9f0d63Alexandre Elias    bool ignoreOverflowHidden = false;
5748f89d18ff7550615970addc63a8c46172e9f0d63Alexandre Elias    if (m_frame->page()->settings()->ignoreMainFrameOverflowHiddenQuirk() && m_frame->page()->mainFrame() == m_frame)
5758f89d18ff7550615970addc63a8c46172e9f0d63Alexandre Elias        ignoreOverflowHidden = true;
5768f89d18ff7550615970addc63a8c46172e9f0d63Alexandre Elias
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (overflowX) {
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case OHIDDEN:
5798f89d18ff7550615970addc63a8c46172e9f0d63Alexandre Elias            if (!ignoreOverflowHidden)
5808f89d18ff7550615970addc63a8c46172e9f0d63Alexandre Elias                hMode = ScrollbarAlwaysOff;
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case OSCROLL:
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            hMode = ScrollbarAlwaysOn;
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case OAUTO:
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            hMode = ScrollbarAuto;
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Don't set it at all.
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ;
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
592591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     switch (overflowY) {
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case OHIDDEN:
5958f89d18ff7550615970addc63a8c46172e9f0d63Alexandre Elias            if (!ignoreOverflowHidden)
5968f89d18ff7550615970addc63a8c46172e9f0d63Alexandre Elias                vMode = ScrollbarAlwaysOff;
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case OSCROLL:
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            vMode = ScrollbarAlwaysOn;
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case OAUTO:
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            vMode = ScrollbarAuto;
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Don't set it at all. Values of OPAGEDX and OPAGEDY are handled by applyPaginationToViewPort().
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ;
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_viewportRenderer = o;
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::applyPaginationToViewport()
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* document = m_frame->document();
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* documentElement = document->documentElement();
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* documentRenderer = documentElement ? documentElement->renderer() : 0;
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* documentOrBodyRenderer = documentRenderer;
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* body = document->body();
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (body && body->renderer()) {
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (body->hasTagName(bodyTag))
621e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            documentOrBodyRenderer = documentRenderer->style()->overflowX() == OVISIBLE && isHTMLHtmlElement(documentElement) ? body->renderer() : documentRenderer;
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Pagination pagination;
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!documentOrBodyRenderer) {
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setPagination(pagination);
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EOverflow overflowY = documentOrBodyRenderer->style()->overflowY();
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (overflowY == OPAGEDX || overflowY == OPAGEDY) {
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        pagination.mode = WebCore::paginationModeForRenderStyle(documentOrBodyRenderer->style());
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        pagination.gap = static_cast<unsigned>(documentOrBodyRenderer->style()->columnGap());
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setPagination(pagination);
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::calculateScrollbarModesForLayout(ScrollbarMode& hMode, ScrollbarMode& vMode, ScrollbarModesCalculationStrategy strategy)
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_viewportRenderer = 0;
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const HTMLFrameOwnerElement* owner = m_frame->ownerElement();
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (owner && (owner->scrollingMode() == ScrollbarAlwaysOff)) {
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hMode = ScrollbarAlwaysOff;
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        vMode = ScrollbarAlwaysOff;
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
649591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    }
650591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_canHaveScrollbars || strategy == RulesFromWebContentOnly) {
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hMode = ScrollbarAuto;
653926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Seamless documents begin with heights of 0; we special case that here
654926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // to correctly render documents that don't need scrollbars.
655926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        IntSize fullVisibleSize = visibleContentRect(IncludeScrollbars).size();
656926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        bool isSeamlessDocument = frame() && frame()->document() && frame()->document()->shouldDisplaySeamlesslyWithParent();
657926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        vMode = (isSeamlessDocument && !fullVisibleSize.height()) ? ScrollbarAlwaysOff : ScrollbarAuto;
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hMode = ScrollbarAlwaysOff;
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        vMode = ScrollbarAlwaysOff;
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
662591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_layoutRoot) {
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Document* document = m_frame->document();
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Node* documentElement = document->documentElement();
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderObject* rootRenderer = documentElement ? documentElement->renderer() : 0;
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Node* body = document->body();
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (body && body->renderer()) {
66993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            if (body->hasTagName(framesetTag)) {
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                vMode = ScrollbarAlwaysOff;
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                hMode = ScrollbarAlwaysOff;
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else if (body->hasTagName(bodyTag)) {
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // It's sufficient to just check the X overflow,
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // since it's illegal to have visible in only one direction.
675e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                RenderObject* o = rootRenderer->style()->overflowX() == OVISIBLE && isHTMLHtmlElement(document->documentElement()) ? body->renderer() : rootRenderer;
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                applyOverflowToViewport(o, hMode, vMode);
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (rootRenderer)
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            applyOverflowToViewport(rootRenderer, hMode, vMode);
680591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    }
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateCompositingLayersAfterStyleChange()
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
685926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
686926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If we expect to update compositing after an incipient layout, don't do so here.
690926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_doingPreLayoutStyleUpdate || layoutPending() || renderView->needsLayout())
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This call will make sure the cached hasAcceleratedCompositing is updated from the pref
694926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    renderView->compositor()->cacheAcceleratedCompositingFlags();
695521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
696521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // Sometimes we will change a property (for example, z-index) that will not
697521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // cause a layout, but will require us to update compositing state. We only
698521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // need to do this if a layout is not already scheduled.
699521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (!needsLayout())
700521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        renderView->compositor()->updateCompositingRequirementsState();
701521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
702926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    renderView->compositor()->updateCompositingLayers(CompositingUpdateAfterStyleChange);
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateCompositingLayersAfterLayout()
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
707926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
708926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This call will make sure the cached hasAcceleratedCompositing is updated from the pref
712926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    renderView->compositor()->cacheAcceleratedCompositingFlags();
7135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    renderView->compositor()->updateCompositingRequirementsState();
714926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    renderView->compositor()->updateCompositingLayers(CompositingUpdateAfterLayout);
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
717926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool FrameView::usesCompositedScrolling() const
718926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
719926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
720926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
721926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
722926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_frame->settings() && m_frame->settings()->compositedScrollingForFramesEnabled())
723926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return renderView->compositor()->inForcedCompositingMode();
724926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return false;
725926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
726926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
727926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)GraphicsLayer* FrameView::layerForScrolling() const
728926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
729926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
730926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
731926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
732926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return renderView->compositor()->scrollLayer();
733926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
734926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GraphicsLayer* FrameView::layerForHorizontalScrollbar() const
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
737926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
738926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
740926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return renderView->compositor()->layerForHorizontalScrollbar();
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GraphicsLayer* FrameView::layerForVerticalScrollbar() const
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
745926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
746926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
748926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return renderView->compositor()->layerForVerticalScrollbar();
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GraphicsLayer* FrameView::layerForScrollCorner() const
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
753926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
754926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
756926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return renderView->compositor()->layerForScrollCorner();
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(RUBBER_BANDING)
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GraphicsLayer* FrameView::layerForOverhangAreas() const
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
762926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
763926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
764926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
765926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return renderView->compositor()->layerForOverhangAreas();
766926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
76753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#endif // ENABLE(RUBBER_BANDING)
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::hasCompositedContent() const
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
771926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (RenderView* renderView = this->renderView())
772926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return renderView->compositor()->inCompositingMode();
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isEnclosedInCompositingLayer() const
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* frameOwnerRenderer = m_frame->ownerRenderer();
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (frameOwnerRenderer && frameOwnerRenderer->containerForRepaint())
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FrameView* parentView = parentFrameView())
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return parentView->isEnclosedInCompositingLayer();
78453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
787591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isSoftwareRenderable() const
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
790926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
791926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return !renderView || !renderView->compositor()->has3DContent();
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderObject* FrameView::layoutRoot(bool onlyDuringLayout) const
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return onlyDuringLayout && layoutPending() ? 0 : m_layoutRoot;
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline void collectFrameViewChildren(FrameView* frameView, Vector<RefPtr<FrameView> >& frameViews)
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const HashSet<RefPtr<Widget> >* viewChildren = frameView->children();
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(viewChildren);
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const HashSet<RefPtr<Widget> >::iterator end = viewChildren->end();
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (HashSet<RefPtr<Widget> >::iterator current = viewChildren->begin(); current != end; ++current) {
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Widget* widget = (*current).get();
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (widget->isFrameView())
808926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            frameViews.append(toFrameView(widget));
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void FrameView::forceLayoutParentViewIfNeeded()
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderPart* ownerRenderer = m_frame->ownerRenderer();
8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!ownerRenderer || !ownerRenderer->frame())
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderBox* contentBox = embeddedContentBox();
8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!contentBox)
8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderSVGRoot* svgRoot = toRenderSVGRoot(contentBox);
8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (svgRoot->everHadLayout() && !svgRoot->needsLayout())
8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the embedded SVG document appears the first time, the ownerRenderer has already finished
8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // layout without knowing about the existence of the embedded SVG document, because RenderReplaced
8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // embeddedContentBox() returns 0, as long as the embedded document isn't loaded yet. Before
8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // bothering to lay out the SVG document, mark the ownerRenderer needing layout and ask its
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FrameView for a layout. After that the RenderEmbeddedObject (ownerRenderer) carries the
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // correct size, which RenderSVGRoot::computeReplacedLogicalWidth/Height rely on, when laying
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // out for the first time, or when the RenderSVGRoot size has changed dynamically (eg. via <script>).
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<FrameView> frameView = ownerRenderer->frame()->view();
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Mark the owner renderer as needing layout.
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ownerRenderer->setNeedsLayoutAndPrefWidthsRecalc();
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Synchronously enter layout, to layout the view containing the host object/embed/iframe.
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frameView);
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frameView->layout();
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::layout(bool allowSubtree)
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8457757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // We should never layout a Document which is not in a Frame.
8467757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    ASSERT(m_frame);
8477757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    ASSERT(m_frame->view() == this);
8487757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    ASSERT(m_frame->page());
8497757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_inLayout)
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
853926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    TRACE_EVENT0("webkit", "FrameView::layout");
854e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "Layout");
855926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Protect the view from being deleted during layout (in recalcStyle)
8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<FrameView> protector(this);
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
859926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Every scroll that happens during layout is programmatic.
860926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    TemporaryChange<bool> changeInProgrammaticScroll(m_inProgrammaticScroll, true);
861926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_layoutTimer.stop();
8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_delayedLayout = false;
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_setNeedsLayoutWasDeferred = false;
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // we shouldn't enter layout() while painting
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!isPainting());
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isPainting())
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InspectorInstrumentationCookie cookie = InspectorInstrumentation::willLayout(m_frame.get());
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!allowSubtree && m_layoutRoot) {
8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_layoutRoot->markContainingBlocksForLayout(false);
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_layoutRoot = 0;
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* document = m_frame->document();
8797757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    bool inSubtreeLayout = false;
8807757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    RenderObject* rootForThisLayout = 0;
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TemporaryChange<bool> changeSchedulingEnabled(m_layoutSchedulingEnabled, false);
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
88593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        if (!m_nestedLayoutCount && !m_inSynchronousPostLayout && m_postLayoutTasksTimer.isActive() && !frame()->document()->shouldDisplaySeamlesslyWithParent()) {
8867757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            // This is a new top-level layout. If there are any remaining tasks from the previous layout, finish them now.
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_inSynchronousPostLayout = true;
8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            performPostLayoutTasks();
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_inSynchronousPostLayout = false;
8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
892e6d4491e48613634a83c1957c72759da80987961Ben Murdoch        // Viewport-dependent media queries may cause us to need completely different style information.
893e6d4491e48613634a83c1957c72759da80987961Ben Murdoch        if (!document->styleResolverIfExists() || document->styleResolverIfExists()->affectedByViewportChange()) {
894e6d4491e48613634a83c1957c72759da80987961Ben Murdoch            document->styleResolverChanged(DeferRecalcStyle);
895e6d4491e48613634a83c1957c72759da80987961Ben Murdoch            // FIXME: This instrumentation event is not strictly accurate since cached media query results
896e6d4491e48613634a83c1957c72759da80987961Ben Murdoch            //        do not persist across StyleResolver rebuilds.
897e6d4491e48613634a83c1957c72759da80987961Ben Murdoch            InspectorInstrumentation::mediaQueryResultChanged(document);
898e6d4491e48613634a83c1957c72759da80987961Ben Murdoch        } else {
899e6d4491e48613634a83c1957c72759da80987961Ben Murdoch            document->evaluateMediaQueryList();
900e6d4491e48613634a83c1957c72759da80987961Ben Murdoch        }
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If there is any pagination to apply, it will affect the RenderView's style, so we should
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // take care of that now.
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        applyPaginationToViewport();
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Always ensure our style info is up-to-date. This can happen in situations where
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // the layout beats any sort of style recalc update that needs to occur.
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TemporaryChange<bool> changeDoingPreLayoutStyleUpdate(m_doingPreLayoutStyleUpdate, true);
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        document->updateStyleIfNeeded();
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9117757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        inSubtreeLayout = m_layoutRoot;
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
913591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        // If there is only one ref to this view left, then its going to be destroyed as soon as we exit,
9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // so there's no point to continuing to layout
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (protector->hasOneRef())
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9187757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        rootForThisLayout = inSubtreeLayout ? m_layoutRoot : document->renderer();
9197757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        if (!rootForThisLayout) {
9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // FIXME: Do we need to set m_size here?
9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } // Reset m_layoutSchedulingEnabled to its previous value.
9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The only reason the scoping was closed here is allow fontCachePurgePreventer
9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // to outlive the change and reset of m_layoutSchedulingEnabled.
9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FontCachePurgePreventer fontCachePurgePreventer;
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderLayer* layer;
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TemporaryChange<bool> changeSchedulingEnabled(m_layoutSchedulingEnabled, false);
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_nestedLayoutCount++;
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        autoSizeIfEnabled();
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ScrollbarMode hMode;
937591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        ScrollbarMode vMode;
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        calculateScrollbarModesForLayout(hMode, vMode);
9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9407757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        m_doFullRepaint = !inSubtreeLayout && (m_firstLayout || toRenderView(rootForThisLayout)->printing());
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9427757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        if (!inSubtreeLayout) {
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Now set our scrollbar state for the layout.
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ScrollbarMode currentHMode = horizontalScrollbarMode();
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ScrollbarMode currentVMode = verticalScrollbarMode();
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (m_firstLayout || (hMode != currentHMode || vMode != currentVMode)) {
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (m_firstLayout) {
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    setScrollbarsSuppressed(true);
9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    m_firstLayout = false;
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    m_firstLayoutCallbackPending = true;
953591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    m_lastViewportSize = layoutSize(IncludeScrollbars);
9547757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch                    m_lastZoomFactor = rootForThisLayout->style()->zoom();
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    // Set the initial vMode to AlwaysOn if we're auto.
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    if (vMode == ScrollbarAuto)
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        setVerticalScrollbarMode(ScrollbarAlwaysOn); // This causes a vertical scrollbar to appear.
9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    // Set the initial hMode to AlwaysOff if we're auto.
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    if (hMode == ScrollbarAuto)
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        setHorizontalScrollbarMode(ScrollbarAlwaysOff); // This causes a horizontal scrollbar to disappear.
9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    setScrollbarModes(hMode, vMode);
9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    setScrollbarsSuppressed(false, true);
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                } else
9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    setScrollbarModes(hMode, vMode);
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutSize oldSize = m_size;
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_size = LayoutSize(layoutWidth(), layoutHeight());
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (oldSize != m_size) {
9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_doFullRepaint = true;
9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (!m_firstLayout) {
9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    RenderBox* rootRenderer = document->documentElement() ? document->documentElement()->renderBox() : 0;
9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    RenderBox* bodyRenderer = rootRenderer && document->body() ? document->body()->renderBox() : 0;
9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    if (bodyRenderer && bodyRenderer->stretchesToViewport())
979d24c94b5090b6aa121f0f82325c9379004dc3196Ben Murdoch                        bodyRenderer->setChildNeedsLayout();
9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    else if (rootRenderer && rootRenderer->stretchesToViewport())
981d24c94b5090b6aa121f0f82325c9379004dc3196Ben Murdoch                        rootRenderer->setChildNeedsLayout();
9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9867757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        layer = rootForThisLayout->enclosingLayer();
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_actionScheduler->pause();
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            bool disableLayoutState = false;
9927757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            if (inSubtreeLayout) {
9937757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch                RenderView* view = rootForThisLayout->view();
9947757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch                disableLayoutState = view->shouldDisableLayoutStateForSubtree(rootForThisLayout);
9957757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch                view->pushLayoutState(rootForThisLayout);
9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
9977757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            LayoutStateDisabler layoutStateDisabler(disableLayoutState ? rootForThisLayout->view() : 0);
9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_inLayout = true;
10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            beginDeferredRepaints();
10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            forceLayoutParentViewIfNeeded();
10027757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            rootForThisLayout->layout();
100353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
10047757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            bool autosized = document->textAutosizer()->processSubtree(rootForThisLayout);
10057757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            if (autosized && rootForThisLayout->needsLayout()) {
1006591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                TRACE_EVENT0("webkit", "2nd layout due to Text Autosizing");
10077757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch                rootForThisLayout->layout();
1008591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            }
100953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
10105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            endDeferredRepaints();
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_inLayout = false;
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10137757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            if (inSubtreeLayout)
10147757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch                rootForThisLayout->view()->popLayoutState(rootForThisLayout);
10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
10165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_layoutRoot = 0;
10175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } // Reset m_layoutSchedulingEnabled to its previous value.
10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1019926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool neededFullRepaint = m_doFullRepaint;
1020926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
10217757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    if (!inSubtreeLayout && !toRenderView(rootForThisLayout)->printing())
10225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        adjustViewSize();
10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1024926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_doFullRepaint = neededFullRepaint;
1025926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
10265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Now update the positions of all layers.
10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    beginDeferredRepaints();
10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_doFullRepaint)
10297757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        rootForThisLayout->view()->repaint(); // FIXME: This isn't really right, since the RenderView doesn't fully encompass the visibleContentRect(). It just happens
10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                 // to work out most of the time, since first layouts and printing don't have you scrolled anywhere.
10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10327757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    layer->updateLayerPositionsAfterLayout(renderView()->layer(), updateLayerPositionFlags(layer, inSubtreeLayout, m_doFullRepaint));
1033926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    endDeferredRepaints();
10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateCompositingLayersAfterLayout();
103753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_layoutCount++;
10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10407757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    if (AXObjectCache* cache = rootForThisLayout->document()->existingAXObjectCache())
10417757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        cache->postNotification(rootForThisLayout, AXObjectCache::AXLayoutComplete, true);
10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateAnnotatedRegions();
104353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
104453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    layoutLazyBlocks();
10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10467757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    ASSERT(!rootForThisLayout->needsLayout());
10475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateCanBlitOnScrollRecursively();
10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (document->hasListenerType(Document::OVERFLOWCHANGED_LISTENER))
10517757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        updateOverflowStatus(layoutWidth() < contentsWidth(), layoutHeight() < contentsHeight());
10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_postLayoutTasksTimer.isActive()) {
10545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_inSynchronousPostLayout) {
105593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            if (frame()->document()->shouldDisplaySeamlesslyWithParent()) {
1056926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                if (RenderView* renderView = this->renderView())
1057926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    renderView->updateWidgetPositions();
10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else {
10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_inSynchronousPostLayout = true;
10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Calls resumeScheduledEvents()
10615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                performPostLayoutTasks();
10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_inSynchronousPostLayout = false;
10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
106593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
106693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        if (!m_postLayoutTasksTimer.isActive() && (needsLayout() || m_inSynchronousPostLayout || frame()->document()->shouldDisplaySeamlesslyWithParent())) {
106793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            // If we need layout or are already in a synchronous call to postLayoutTasks(),
10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // defer widget updates and event dispatch until after we return. postLayoutTasks()
10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // can make us need to update again, and we can get stuck in a nasty cycle unless
10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // we call it through the timer here.
10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_postLayoutTasksTimer.startOneShot(0);
10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (needsLayout()) {
10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_actionScheduler->pause();
10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                layout();
10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
10765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_actionScheduler->resume();
10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10817757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    InspectorInstrumentation::didLayout(cookie, rootForThisLayout);
10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_nestedLayoutCount--;
10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_nestedLayoutCount)
10855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
10865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1087f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)#ifndef NDEBUG
1088f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // Post-layout assert that nobody was re-marked as needing layout during layout.
1089f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    for (RenderObject* renderer = document->renderer(); renderer; renderer = renderer->nextInPreOrder())
1090f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        ASSERT(!renderer->needsLayout());
1091f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)#endif
1092f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
10937757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // FIXME: It should be not possible to remove the FrameView from the frame/page during layout
10947757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // however m_inLayout is not set for most of this function, so none of our RELEASE_ASSERTS
10957757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // in Frame/Page will fire. One of the post-layout tasks is disconnecting the Frame from
10967757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // the page in fast/frames/crash-remove-iframe-during-object-beforeload-2.html
10977757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // necessitating this check here.
10987757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    ASSERT(frame());
10997757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // ASSERT(frame()->page());
11007757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    if (frame() && frame()->page())
11017757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        frame()->page()->chrome().client()->layoutUpdated(frame());
11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
110453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void FrameView::layoutLazyBlocks()
110553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
110653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // FIXME: This infinite recursion protection would seem to break plugins
110753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // doing things that require lazy blocks to layout.
110853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (m_nestedLayoutCount != 1)
110953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return;
111053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
111153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!renderView()->firstLazyBlock())
111253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return;
111353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
111453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // First mark all lazy blocks as needing layout and perform another layout.
111553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    for (RenderLazyBlock* block = renderView()->firstLazyBlock(); block; block = block->next())
111653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        block->markForNestedLayout();
111753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
111853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    layout();
111953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
112053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // FIXME: This is pretty awful if you start nesting lazy blocks, we should
112153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // signal to the nested blocks to avoid doing work until the second pass.
112253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
112353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // Next walk all lazy blocks and find nested ones, these need another layout
112453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // since the first one would not have placed them correctly inside the viewport.
112553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    for (RenderLazyBlock* block = renderView()->firstLazyBlock(); block; block = block->next()) {
112653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (!block->isNested())
112753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            continue;
1128d24c94b5090b6aa121f0f82325c9379004dc3196Ben Murdoch        block->setNeedsLayout();
112953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        layout();
113053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
113153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
113253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderBox* FrameView::embeddedContentBox() const
11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
1136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderObject* firstChild = renderView->firstChild();
1140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!firstChild || !firstChild->isBox())
11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
11425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Curently only embedded SVG documents participate in the size-negotiation logic.
1144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (firstChild->isSVGRoot())
1145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return toRenderBox(firstChild);
11465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
11485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void FrameView::addWidgetToUpdate(RenderObject* object)
11515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_widgetUpdateSet)
1153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_widgetUpdateSet = adoptPtr(new RenderObjectSet);
11545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Tell the DOM element that it needs a widget update.
11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* node = object->node();
11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (node->hasTagName(objectTag) || node->hasTagName(embedTag)) {
1158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        HTMLPlugInImageElement* pluginElement = toHTMLPlugInImageElement(node);
11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        pluginElement->setNeedsWidgetUpdate(true);
11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_widgetUpdateSet->add(object);
11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void FrameView::removeWidgetToUpdate(RenderObject* object)
11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_widgetUpdateSet)
11685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_widgetUpdateSet->remove(object);
11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1173591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid FrameView::setMediaType(const AtomicString& mediaType)
11745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mediaType = mediaType;
11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1178591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochAtomicString FrameView::mediaType() const
11795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // See if we have an override type.
118153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    String overrideType;
1182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    InspectorInstrumentation::applyEmulatedMedia(m_frame.get(), &overrideType);
11835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!overrideType.isNull())
11845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return overrideType;
11855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_mediaType;
11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::adjustMediaTypeForPrinting(bool printing)
11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (printing) {
11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_mediaTypeWhenNotPrinting.isNull())
11925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_mediaTypeWhenNotPrinting = mediaType();
11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setMediaType("print");
11945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
11955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_mediaTypeWhenNotPrinting.isNull())
11965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setMediaType(m_mediaTypeWhenNotPrinting);
1197591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        m_mediaTypeWhenNotPrinting = nullAtom;
11985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::useSlowRepaints(bool considerOverlap) const
12025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
120353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool mustBeSlow = m_slowRepaintObjectCount > 0;
12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
120553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (contentsInCompositedLayer())
12065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return mustBeSlow;
12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The chromium compositor does not support scrolling a non-composited frame within a composited page through
12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the fast scrolling path, so force slow scrolling in that case.
12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frame->ownerElement() && !hasCompositedContent() && m_frame->page() && m_frame->page()->mainFrame()->view()->hasCompositedContent())
12115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isOverlapped = m_isOverlapped && considerOverlap;
12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (mustBeSlow || m_cannotBlitToWindow || isOverlapped || !m_contentIsOpaque)
12165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FrameView* parentView = parentFrameView())
12195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return parentView->useSlowRepaints(considerOverlap);
12205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
12225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::useSlowRepaintsIfNotOverlapped() const
12255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return useSlowRepaints(false);
12275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateCanBlitOnScrollRecursively()
12305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (Frame* frame = m_frame.get(); frame; frame = frame->tree()->traverseNext(m_frame.get())) {
12325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (FrameView* view = frame->view())
12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            view->setCanBlitOnScroll(!view->useSlowRepaints());
12345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::contentsInCompositedLayer() const
12385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
1240926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (renderView && renderView->isComposited()) {
1241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        GraphicsLayer* layer = renderView->layer()->backing()->graphicsLayer();
12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (layer && layer->drawsContent())
12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
12445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
124553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
12465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setCannotBlitToWindow()
12505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_cannotBlitToWindow = true;
12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateCanBlitOnScrollRecursively();
12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::addSlowRepaintObject()
12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_slowRepaintObjectCount++) {
12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateCanBlitOnScrollRecursively();
12595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Page* page = m_frame->page()) {
12615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())
12625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                scrollingCoordinator->frameViewHasSlowRepaintObjectsDidChange(this);
12635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
12645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::removeSlowRepaintObject()
12685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_slowRepaintObjectCount > 0);
12705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_slowRepaintObjectCount--;
12715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_slowRepaintObjectCount) {
12725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateCanBlitOnScrollRecursively();
12735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Page* page = m_frame->page()) {
12755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())
12765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                scrollingCoordinator->frameViewHasSlowRepaintObjectsDidChange(this);
12775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
12785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::addViewportConstrainedObject(RenderObject* object)
12825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_viewportConstrainedObjects)
12845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_viewportConstrainedObjects = adoptPtr(new ViewportConstrainedObjectSet);
12855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_viewportConstrainedObjects->contains(object)) {
12875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_viewportConstrainedObjects->add(object);
12885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Page* page = m_frame->page()) {
12905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())
12915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                scrollingCoordinator->frameViewFixedObjectsDidChange(this);
12925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
12935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::removeViewportConstrainedObject(RenderObject* object)
12975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_viewportConstrainedObjects && m_viewportConstrainedObjects->contains(object)) {
12995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_viewportConstrainedObjects->remove(object);
13005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Page* page = m_frame->page()) {
13015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())
13025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                scrollingCoordinator->frameViewFixedObjectsDidChange(this);
13035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
13045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // FIXME: In addFixedObject() we only call this if there's a platform widget,
13065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // why isn't the same check being made here?
13075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateCanBlitOnScrollRecursively();
13085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1311926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)LayoutRect FrameView::viewportConstrainedVisibleContentRect() const
1312926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1313926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayoutRect viewportRect = visibleContentRect();
131453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // Ignore overhang. No-op when not using rubber banding.
131553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    viewportRect.setLocation(clampScrollPosition(scrollPosition()));
1316926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return viewportRect;
1317926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1318926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1319926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
13205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntSize FrameView::scrollOffsetForFixedPosition() const
13215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
132253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return toIntSize(clampScrollPosition(scrollPosition()));
13235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1325926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)IntPoint FrameView::lastKnownMousePosition() const
13265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1327926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_frame ? m_frame->eventHandler()->lastKnownMousePosition() : IntPoint();
13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect)
13315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_viewportConstrainedObjects || m_viewportConstrainedObjects->isEmpty()) {
13335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hostWindow()->scroll(scrollDelta, rectToScroll, clipRect);
13345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
13355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const bool isCompositedContentLayer = contentsInCompositedLayer();
13385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Get the rects of the fixed objects visible in the rectToScroll
13405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Region regionToUpdate;
13415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ViewportConstrainedObjectSet::const_iterator end = m_viewportConstrainedObjects->end();
13425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (ViewportConstrainedObjectSet::const_iterator it = m_viewportConstrainedObjects->begin(); it != end; ++it) {
13435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderObject* renderer = *it;
13445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!renderer->style()->hasViewportConstrainedPosition())
13455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
134653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
13475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (renderer->isComposited())
13485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
1349591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
13505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Fixed items should always have layers.
13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(renderer->hasLayer());
13525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderLayer* layer = toRenderBoxModelObject(renderer)->layer();
135353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
135453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (layer->viewportConstrainedNotCompositedReason() == RenderLayer::NotCompositedForBoundsOutOfView
135553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            || layer->viewportConstrainedNotCompositedReason() == RenderLayer::NotCompositedForNoVisibleContent) {
135653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            // Don't invalidate for invisible fixed layers.
135753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            continue;
135853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
135953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
13605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (layer->hasAncestorWithFilterOutsets()) {
1361591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            // If the fixed layer has a blur/drop-shadow filter applied on at least one of its parents, we cannot
13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // scroll using the fast path, otherwise the outsets of the filter will be moved around the page.
13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
13645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect updateRect = pixelSnappedIntRect(layer->repaintRectIncludingNonCompositingDescendants());
13665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateRect = contentsToRootView(updateRect);
13675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!isCompositedContentLayer && clipsRepaints())
13685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            updateRect.intersect(rectToScroll);
13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!updateRect.isEmpty())
13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            regionToUpdate.unite(updateRect);
13715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 1) scroll
13745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    hostWindow()->scroll(scrollDelta, rectToScroll, clipRect);
13755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 2) update the area of fixed objects that has been invalidated
13775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<IntRect> subRectsToUpdate = regionToUpdate.rects();
13785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t viewportConstrainedObjectsCount = subRectsToUpdate.size();
13795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < viewportConstrainedObjectsCount; ++i) {
13805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect updateRect = subRectsToUpdate[i];
13815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect scrolledRect = updateRect;
13825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        scrolledRect.move(scrollDelta);
13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateRect.unite(scrolledRect);
13845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isCompositedContentLayer) {
13855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            updateRect = rootViewToContents(updateRect);
1386926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            ASSERT(renderView());
1387926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView()->layer()->setBackingNeedsRepaintInRect(updateRect);
13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
13895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
13905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (clipsRepaints())
13915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            updateRect.intersect(rectToScroll);
139253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        hostWindow()->invalidateContentsAndRootView(updateRect);
13935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
13965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scrollContentsSlowPath(const IntRect& updateRect)
13995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (contentsInCompositedLayer()) {
14015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect updateRect = visibleContentRect();
1402926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(renderView());
1403926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        renderView()->layer()->setBackingNeedsRepaintInRect(updateRect);
14045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (RenderPart* frameRenderer = m_frame->ownerRenderer()) {
14065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isEnclosedInCompositingLayer()) {
14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutRect rect(frameRenderer->borderLeft() + frameRenderer->paddingLeft(),
14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            frameRenderer->borderTop() + frameRenderer->paddingTop(),
14095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            visibleWidth(), visibleHeight());
14105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            frameRenderer->repaintRectangle(rect);
14115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::scrollContentsSlowPath(updateRect);
14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Note that this gets called at painting time.
14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setIsOverlapped(bool isOverlapped)
14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isOverlapped == m_isOverlapped)
14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isOverlapped = isOverlapped;
14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateCanBlitOnScrollRecursively();
14265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isOverlappedIncludingAncestors() const
14295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isOverlapped())
14315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
14325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FrameView* parentView = parentFrameView()) {
14345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parentView->isOverlapped())
14355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setContentIsOpaque(bool contentIsOpaque)
14425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (contentIsOpaque == m_contentIsOpaque)
14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_contentIsOpaque = contentIsOpaque;
14475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateCanBlitOnScrollRecursively();
14485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::restoreScrollbar()
14515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setScrollbarsSuppressed(false);
14535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::scrollToFragment(const KURL& url)
14565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If our URL has no ref, then we have no place we need to jump to.
14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // OTOH If CSS target was set previously, we want to set it to 0, recalc
14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // and possibly repaint because :target pseudo class may have been
14605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // set (see bug 11321).
14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!url.hasFragmentIdentifier() && !m_frame->document()->cssTarget())
14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
14635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String fragmentIdentifier = url.fragmentIdentifier();
14655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (scrollToAnchor(fragmentIdentifier))
14665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Try again after decoding the ref, based on the document's encoding.
14695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (TextResourceDecoder* decoder = m_frame->document()->decoder())
14705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return scrollToAnchor(decodeURLEscapeSequences(fragmentIdentifier, decoder->encoding()));
14715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
14735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::scrollToAnchor(const String& name)
14765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame->document());
14785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_frame->document()->haveStylesheetsLoaded()) {
14805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_frame->document()->setGotoAnchorNeededAfterStylesheetsLoad(true);
14815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
14825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame->document()->setGotoAnchorNeededAfterStylesheetsLoad(false);
14855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* anchorNode = m_frame->document()->findAnchor(name);
14875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Setting to null will clear the current target.
14895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame->document()->setCSSTarget(anchorNode);
14905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frame->document()->isSVGDocument()) {
1492926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (SVGSVGElement* svg = toSVGDocument(m_frame->document())->rootElement()) {
14935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            svg->setupInitialView(name, anchorNode);
14945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!anchorNode)
14955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return true;
14965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
14975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1498591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
14995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Implement the rule that "" and "top" both mean top of page as in other browsers.
15005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!anchorNode && !(name.isEmpty() || equalIgnoringCase(name, "top")))
15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
15025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    maintainScrollPositionAtAnchor(anchorNode ? static_cast<Node*>(anchorNode) : m_frame->document());
150453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
150553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // If the anchor accepts keyboard focus, move focus there to aid users relying on keyboard navigation.
150653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (anchorNode && anchorNode->isFocusable())
1507e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        m_frame->document()->setFocusedElement(anchorNode);
150853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
15095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::maintainScrollPositionAtAnchor(Node* anchorNode)
15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_maintainScrollPositionAnchor = anchorNode;
15155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_maintainScrollPositionAnchor)
15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
15175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We need to update the layout before scrolling, otherwise we could
15195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // really mess things up if an anchor scroll comes at a bad moment.
15205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame->document()->updateStyleIfNeeded();
15215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Only do a layout if changes have occurred that make it necessary.
1522926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
1523926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (renderView && renderView->needsLayout())
15245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        layout();
15255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
15265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        scrollToAnchor();
15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scrollElementToRect(Element* element, const IntRect& rect)
15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame->document()->updateLayoutIgnorePendingStylesheets();
15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect bounds = element->boundingBox();
15345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int centeringOffsetX = (rect.width() - bounds.width()) / 2;
15355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int centeringOffsetY = (rect.height() - bounds.height()) / 2;
15365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setScrollPosition(IntPoint(bounds.x() - centeringOffsetX - rect.x(), bounds.y() - centeringOffsetY - rect.y()));
15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setScrollPosition(const IntPoint& scrollPoint)
15405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TemporaryChange<bool> changeInProgrammaticScroll(m_inProgrammaticScroll, true);
15425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_maintainScrollPositionAnchor = 0;
15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1544926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    IntPoint newScrollPosition = adjustScrollPositionWithinRange(scrollPoint);
1545926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1546926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (newScrollPosition == scrollPosition())
1547926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
1548926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1549591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    Page* page = m_frame->page();
1550591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (page && RuntimeEnabledFeatures::programmaticScrollNotificationsEnabled())
155193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        page->chrome().client()->didProgrammaticallyScroll(m_frame.get(), newScrollPosition);
155253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1553926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (requestScrollPositionUpdate(newScrollPosition))
15545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1556926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ScrollView::setScrollPosition(newScrollPosition);
15575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void FrameView::setScrollPositionNonProgrammatically(const IntPoint& scrollPoint)
15605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
15615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    IntPoint newScrollPosition = adjustScrollPositionWithinRange(scrollPoint);
15625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
15635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (newScrollPosition == scrollPosition())
15645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return;
15655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
15665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    TemporaryChange<bool> changeInProgrammaticScroll(m_inProgrammaticScroll, false);
15675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    notifyScrollPositionChanged(newScrollPosition);
15685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
15695267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setViewportConstrainedObjectsNeedLayout()
15715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!hasViewportConstrainedObjects())
15735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ViewportConstrainedObjectSet::const_iterator end = m_viewportConstrainedObjects->end();
15765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (ViewportConstrainedObjectSet::const_iterator it = m_viewportConstrainedObjects->begin(); it != end; ++it) {
15775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderObject* renderer = *it;
1578d24c94b5090b6aa121f0f82325c9379004dc3196Ben Murdoch        renderer->setNeedsLayout();
15795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scrollPositionChanged()
15845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frame()->eventHandler()->sendScrollEvent();
15865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frame()->eventHandler()->dispatchFakeMouseMoveEventSoon();
15875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1588926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (RenderView* renderView = this->renderView()) {
1589926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (renderView->usesCompositing())
1590926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->compositor()->frameViewDidScroll();
159153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
159253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        renderView->markLazyBlocksForLayout();
15935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::repaintFixedElementsAfterScrolling()
15975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For fixed position elements, update widget positions and compositing layers after scrolling,
15995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // but only if we're not inside of layout.
16005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_nestedLayoutCount && hasViewportConstrainedObjects()) {
1601926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (RenderView* renderView = this->renderView()) {
1602926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->updateWidgetPositions();
1603926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->layer()->updateLayerPositionsAfterDocumentScroll();
16045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
16055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateFixedElementsAfterScrolling()
16095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_nestedLayoutCount <= 1 && hasViewportConstrainedObjects()) {
1611926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (RenderView* renderView = this->renderView())
1612926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->compositor()->updateCompositingLayers(CompositingUpdateOnScroll);
16135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::shouldRubberBandInDirection(ScrollDirection direction) const
16175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = frame() ? frame()->page() : 0;
16195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
16205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ScrollView::shouldRubberBandInDirection(direction);
162193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return page->chrome().client()->shouldRubberBandInDirection(direction);
16225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1624926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool FrameView::isRubberBandInProgress() const
1625926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1626926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (scrollbarsSuppressed())
1627926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
1628926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1629926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // If the main thread updates the scroll position for this FrameView, we should return
1630926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // ScrollAnimator::isRubberBandInProgress().
1631926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (ScrollAnimator* scrollAnimator = existingScrollAnimator())
1632926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return scrollAnimator->isRubberBandInProgress();
1633926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1634926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return false;
1635926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1636926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
16375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::requestScrollPositionUpdate(const IntPoint& position)
16385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
16405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HostWindow* FrameView::hostWindow() const
16435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = frame() ? frame()->page() : 0;
16455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
16465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
164793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return &page->chrome();
16485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const unsigned cRepaintRectUnionThreshold = 25;
16515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
165253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void FrameView::repaintContentRectangle(const IntRect& r)
16535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_frame->ownerElement());
16555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_isTrackingRepaints) {
16575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect repaintRect = r;
16585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        repaintRect.move(-scrollOffset());
16595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_trackedRepaintRects.append(repaintRect);
16605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double delay = m_deferringRepaints ? 0 : adjustedDeferredRepaintDelay();
166353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (m_deferringRepaints || m_deferredRepaintTimer.isActive() || delay) {
16645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect paintRect = r;
16655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (clipsRepaints() && !paintsEntireContents())
16665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            paintRect.intersect(visibleContentRect());
16675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (paintRect.isEmpty())
16685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
16695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_repaintCount == cRepaintRectUnionThreshold) {
16705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            IntRect unionedRect;
16715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (unsigned i = 0; i < cRepaintRectUnionThreshold; ++i)
16725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                unionedRect.unite(pixelSnappedIntRect(m_repaintRects[i]));
16735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_repaintRects.clear();
16745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_repaintRects.append(unionedRect);
16755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
16765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_repaintCount < cRepaintRectUnionThreshold)
16775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_repaintRects.append(paintRect);
16785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
16795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_repaintRects[0].unite(paintRect);
16805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_repaintCount++;
16815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_deferringRepaints)
16835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            startDeferredRepaintTimer(delay);
16845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
16865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1687591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
168853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!shouldUpdate())
16895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
16905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
169153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ScrollView::repaintContentRectangle(r);
16925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::contentsResized()
16955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::contentsResized();
16975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setNeedsLayout();
16985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::visibleContentsResized()
17015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We check to make sure the view is attached to a frame() as this method can
17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // be triggered before the view is attached by Frame::createView(...) setting
17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // various values such as setScrollBarModes(...) for example.  An ASSERT is
17055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // triggered when a view is layout before being attached to a frame().
17065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame()->view())
17075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1709926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!useFixedLayout() && needsLayout())
17105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        layout();
17115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1712926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (RenderView* renderView = this->renderView()) {
1713926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (renderView->usesCompositing())
1714926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->compositor()->frameViewDidChangeSize();
17155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::beginDeferredRepaints()
17195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = m_frame->page();
17215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (page->mainFrame() != m_frame) {
17225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        page->mainFrame()->view()->beginDeferredRepaints();
17235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deferringRepaints++;
17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::endDeferredRepaints()
17305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = m_frame->page();
17325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (page->mainFrame() != m_frame) {
17335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        page->mainFrame()->view()->endDeferredRepaints();
17345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_deferringRepaints > 0);
17385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (--m_deferringRepaints)
17405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_deferredRepaintTimer.isActive())
17435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (double delay = adjustedDeferredRepaintDelay()) {
17465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        startDeferredRepaintTimer(delay);
17475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1749591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
17505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    doDeferredRepaints();
17515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::startDeferredRepaintTimer(double delay)
17545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_deferredRepaintTimer.isActive())
17565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_disableRepaints)
17595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deferredRepaintTimer.startOneShot(delay);
17625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::handleLoadCompleted()
17655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Once loading has completed, allow autoSize one last opportunity to
17675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // reduce the size of the frame.
17685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    autoSizeIfEnabled();
17695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (shouldUseLoadTimeDeferredRepaintDelay())
17705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deferredRepaintDelay = s_normalDeferredRepaintDelay;
17725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    flushDeferredRepaints();
17735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::flushDeferredRepaints()
17765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_deferredRepaintTimer.isActive())
17785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deferredRepaintTimer.stop();
17805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    doDeferredRepaints();
17815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::doDeferredRepaints()
17845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_disableRepaints)
17865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_deferringRepaints);
17895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!shouldUpdate()) {
17905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_repaintRects.clear();
17915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_repaintCount = 0;
17925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned size = m_repaintRects.size();
17955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 0; i < size; i++) {
179653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        ScrollView::repaintContentRectangle(pixelSnappedIntRect(m_repaintRects[i]));
17975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_repaintRects.clear();
17995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_repaintCount = 0;
1800591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
18015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateDeferredRepaintDelayAfterRepaint();
18025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::shouldUseLoadTimeDeferredRepaintDelay() const
18055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Don't defer after the initial load of the page has been completed.
18075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frame->tree()->top()->loader()->isComplete())
18085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
18095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* document = m_frame->document();
18105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!document)
18115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
18125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (document->parsing())
18135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
18143464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    if (document->fetcher()->requestCount())
18155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
18165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
18175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateDeferredRepaintDelayAfterRepaint()
18205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!shouldUseLoadTimeDeferredRepaintDelay()) {
18225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_deferredRepaintDelay = s_normalDeferredRepaintDelay;
18235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
18245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double incrementedRepaintDelay = m_deferredRepaintDelay + s_deferredRepaintDelayIncrementDuringLoading;
18265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deferredRepaintDelay = std::min(incrementedRepaintDelay, s_maxDeferredRepaintDelayDuringLoading);
18275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::resetDeferredRepaintDelay()
18305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deferredRepaintDelay = 0;
18325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_deferredRepaintTimer.isActive()) {
18335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_deferredRepaintTimer.stop();
18345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_deferringRepaints)
18355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            doDeferredRepaints();
18365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double FrameView::adjustedDeferredRepaintDelay() const
18405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_deferringRepaints);
18425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_deferredRepaintDelay)
18435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
18445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double timeSinceLastPaint = currentTime() - m_lastPaintTime;
18455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return max(0., m_deferredRepaintDelay - timeSinceLastPaint);
18465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1847591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
18485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::deferredRepaintTimerFired(Timer<FrameView>*)
18495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    doDeferredRepaints();
18515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::beginDisableRepaints()
18545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_disableRepaints++;
18565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::endDisableRepaints()
18595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_disableRepaints > 0);
18615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_disableRepaints--;
18625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::layoutTimerFired(Timer<FrameView>*)
18655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    layout();
18675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scheduleRelayout()
18705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame->view() == this);
18725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_layoutRoot) {
18745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_layoutRoot->markContainingBlocksForLayout(false);
18755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_layoutRoot = 0;
18765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_layoutSchedulingEnabled)
18785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
18795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!needsLayout())
18805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
18815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_frame->document()->shouldScheduleLayout())
18825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
18835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InspectorInstrumentation::didInvalidateLayout(m_frame.get());
188493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
188593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // When frame seamless is enabled, the contents of the frame could affect the layout of the parent frames.
18865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Also invalidate parent frame starting from the owner element of this frame.
188793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (m_frame->ownerRenderer() && frame()->document()->shouldDisplaySeamlesslyWithParent())
1888d24c94b5090b6aa121f0f82325c9379004dc3196Ben Murdoch        m_frame->ownerRenderer()->setNeedsLayout(MarkContainingBlockChain);
18895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int delay = m_frame->document()->minimumLayoutDelay();
18915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_layoutTimer.isActive() && m_delayedLayout && !delay)
18925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unscheduleRelayout();
18935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_layoutTimer.isActive())
18945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
18955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_delayedLayout = delay != 0;
18975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_layoutTimer.startOneShot(delay * 0.001);
18985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool isObjectAncestorContainerOf(RenderObject* ancestor, RenderObject* descendant)
19015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (RenderObject* r = descendant; r; r = r->container()) {
19035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (r == ancestor)
19045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
19055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
19065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
19075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scheduleRelayoutOfSubtree(RenderObject* relayoutRoot)
19105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame->view() == this);
19125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1913926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
1914926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (renderView && renderView->needsLayout()) {
19155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (relayoutRoot)
19165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            relayoutRoot->markContainingBlocksForLayout(false);
19175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
19185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
19195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (layoutPending() || !m_layoutSchedulingEnabled) {
19215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_layoutRoot != relayoutRoot) {
19225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (isObjectAncestorContainerOf(m_layoutRoot, relayoutRoot)) {
19235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Keep the current root
19245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                relayoutRoot->markContainingBlocksForLayout(false, m_layoutRoot);
19255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ASSERT(!m_layoutRoot->container() || !m_layoutRoot->container()->needsLayout());
19265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else if (m_layoutRoot && isObjectAncestorContainerOf(relayoutRoot, m_layoutRoot)) {
19275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Re-root at relayoutRoot
19285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_layoutRoot->markContainingBlocksForLayout(false, relayoutRoot);
19295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_layoutRoot = relayoutRoot;
19305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ASSERT(!m_layoutRoot->container() || !m_layoutRoot->container()->needsLayout());
19315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                InspectorInstrumentation::didInvalidateLayout(m_frame.get());
19325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else {
19335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Just do a full relayout
19345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (m_layoutRoot)
19355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    m_layoutRoot->markContainingBlocksForLayout(false);
19365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_layoutRoot = 0;
19375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                relayoutRoot->markContainingBlocksForLayout(false);
19385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                InspectorInstrumentation::didInvalidateLayout(m_frame.get());
19395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
19405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
19415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else if (m_layoutSchedulingEnabled) {
19425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int delay = m_frame->document()->minimumLayoutDelay();
19435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_layoutRoot = relayoutRoot;
19445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!m_layoutRoot->container() || !m_layoutRoot->container()->needsLayout());
19455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        InspectorInstrumentation::didInvalidateLayout(m_frame.get());
19465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_delayedLayout = delay != 0;
19475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_layoutTimer.startOneShot(delay * 0.001);
19485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
19495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::layoutPending() const
19525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_layoutTimer.isActive();
19545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::needsLayout() const
19575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This can return true in cases where the document does not have a body yet.
19595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Document::shouldScheduleLayout takes care of preventing us from scheduling
19605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // layout in that case.
19615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_frame)
19625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
19635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1964926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
19655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return layoutPending()
1966926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        || (renderView && renderView->needsLayout())
19675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || m_layoutRoot
19685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || (m_deferSetNeedsLayouts && m_setNeedsLayoutWasDeferred);
19695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setNeedsLayout()
19725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_deferSetNeedsLayouts) {
19745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_setNeedsLayoutWasDeferred = true;
19755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
19765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
19775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1978926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (RenderView* renderView = this->renderView())
1979d24c94b5090b6aa121f0f82325c9379004dc3196Ben Murdoch        renderView->setNeedsLayout();
19805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::unscheduleRelayout()
19835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_layoutTimer.isActive())
19855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
19865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_layoutTimer.stop();
19885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_delayedLayout = false;
19895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::serviceScriptedAnimations(double monotonicAnimationStartTime)
19925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1993e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    for (RefPtr<Frame> frame = m_frame; frame; frame = frame->tree()->traverseNext()) {
19945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        frame->view()->serviceScrollAnimations();
1995e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        if (!RuntimeEnabledFeatures::webAnimationsCSSEnabled())
1996e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            frame->animation()->serviceAnimations();
199793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        if (RuntimeEnabledFeatures::webAnimationsEnabled())
199881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)            frame->document()->timeline()->serviceAnimations(monotonicAnimationStartTime);
19995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
20005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<RefPtr<Document> > documents;
20025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (Frame* frame = m_frame.get(); frame; frame = frame->tree()->traverseNext())
20035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        documents.append(frame->document());
20045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < documents.size(); ++i)
20065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        documents[i]->serviceScriptedAnimations(monotonicAnimationStartTime);
20075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isTransparent() const
20105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_isTransparent;
20125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setTransparent(bool isTransparent)
20155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isTransparent = isTransparent;
20175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (renderView() && renderView()->layer()->backing())
20185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        renderView()->layer()->backing()->updateContentsOpaque();
20195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2021926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool FrameView::hasOpaqueBackground() const
2022926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2023926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return !m_isTransparent && !m_baseBackgroundColor.hasAlpha();
2024926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2025926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
20265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Color FrameView::baseBackgroundColor() const
20275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_baseBackgroundColor;
20295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
203183750176c3ee2cea66c8a9751271026a5901be3aBen Murdochvoid FrameView::setBaseBackgroundColor(const StyleColor& backgroundColor)
20325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!backgroundColor.isValid())
20345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_baseBackgroundColor = Color::white;
20355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
203683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        m_baseBackgroundColor = backgroundColor.color();
20375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
203802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    if (RenderLayerBacking* backing = renderView() ? renderView()->layer()->backing() : 0) {
203902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        backing->updateContentsOpaque();
204002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        if (backing->graphicsLayer())
204102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch            backing->graphicsLayer()->setNeedsDisplay();
204202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    }
20435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    recalculateScrollbarOverlayStyle();
20445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
204683750176c3ee2cea66c8a9751271026a5901be3aBen Murdochvoid FrameView::updateBackgroundRecursively(const StyleColor& backgroundColor, bool transparent)
20475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (Frame* frame = m_frame.get(); frame; frame = frame->tree()->traverseNext(m_frame.get())) {
20495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (FrameView* view = frame->view()) {
20505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            view->setTransparent(transparent);
20515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            view->setBaseBackgroundColor(backgroundColor);
20525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
20535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
20545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::shouldUpdateWhileOffscreen() const
20575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_shouldUpdateWhileOffscreen;
20595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setShouldUpdateWhileOffscreen(bool shouldUpdateWhileOffscreen)
20625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_shouldUpdateWhileOffscreen = shouldUpdateWhileOffscreen;
20645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
206653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool FrameView::shouldUpdate() const
20675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
206853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (isOffscreen() && !shouldUpdateWhileOffscreen())
20695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
20705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
20715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scheduleEvent(PassRefPtr<Event> event, PassRefPtr<Node> eventTarget)
20745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_actionScheduler->scheduleEvent(event, eventTarget);
20765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::pauseScheduledEvents()
20795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_actionScheduler->pause();
20815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::resumeScheduledEvents()
20845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_actionScheduler->resume();
20865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scrollToAnchor()
20895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<Node> anchorNode = m_maintainScrollPositionAnchor;
20915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!anchorNode)
20925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
20935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!anchorNode->renderer())
20955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
20965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect rect;
20985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (anchorNode != m_frame->document())
20995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rect = anchorNode->boundingBox();
21005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Scroll nested layers and frames to reveal the anchor.
21025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Align to the top and to the closest side (this matches other browsers).
21035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    anchorNode->renderer()->scrollRectToVisible(rect, ScrollAlignment::alignToEdgeIfNeeded, ScrollAlignment::alignTopAlways);
21045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (AXObjectCache* cache = m_frame->document()->existingAXObjectCache())
2106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        cache->handleScrolledToAnchor(anchorNode.get());
21075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // scrollRectToVisible can call into setScrollPosition(), which resets m_maintainScrollPositionAnchor.
21095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_maintainScrollPositionAnchor = anchorNode;
21105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void FrameView::updateWidget(RenderObject* object)
21135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!object->node() || object->node()->isElementNode());
21155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    Element* ownerElement = toElement(object->node());
21165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The object may have already been destroyed (thus node cleared),
21175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // but FrameView holds a manual ref, so it won't have been deleted.
21185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_widgetUpdateSet->contains(object));
21195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!ownerElement)
21205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return;
21215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (object->isEmbeddedObject()) {
2123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        RenderEmbeddedObject* embeddedObject = static_cast<RenderEmbeddedObject*>(object);
2124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // No need to update if it's already crashed or known to be missing.
2125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (embeddedObject->showsUnavailablePluginIndicator())
21265267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            return;
2127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // FIXME: This could turn into a real virtual dispatch if we defined
2129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // updateWidget(PluginCreationOption) on HTMLElement.
2130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (ownerElement->hasTagName(objectTag) || ownerElement->hasTagName(embedTag) || ownerElement->hasTagName(appletTag)) {
21315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            HTMLPlugInImageElement* pluginElement = toHTMLPlugInImageElement(ownerElement);
2132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (pluginElement->needsWidgetUpdate())
2133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                pluginElement->updateWidget(CreateAnyWidgetType);
213453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        } else
2135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            ASSERT_NOT_REACHED();
21365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Caution: it's possible the object was destroyed again, since loading a
2138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // plugin may run any arbitrary JavaScript.
2139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        embeddedObject->updateWidgetPosition();
2140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
21415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::updateWidgets()
21445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_nestedLayoutCount > 1 || !m_widgetUpdateSet || m_widgetUpdateSet->isEmpty())
21465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
2147591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
21485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t size = m_widgetUpdateSet->size();
21495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Vector<RenderObject*> objects;
2151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    objects.reserveInitialCapacity(size);
21525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderObjectSet::const_iterator end = m_widgetUpdateSet->end();
2154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (RenderObjectSet::const_iterator it = m_widgetUpdateSet->begin(); it != end; ++it) {
2155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        RenderObject* object = *it;
2156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        objects.uncheckedAppend(object);
2157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (object->isEmbeddedObject()) {
2158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            RenderEmbeddedObject* embeddedObject = static_cast<RenderEmbeddedObject*>(object);
2159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            embeddedObject->ref();
2160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
21615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
21625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < size; ++i) {
2164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        RenderObject* object = objects[i];
21655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        updateWidget(object);
21665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_widgetUpdateSet->remove(object);
21675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
21685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (size_t i = 0; i < size; ++i) {
2170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        RenderObject* object = objects[i];
2171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (object->isEmbeddedObject()) {
2172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            RenderEmbeddedObject* embeddedObject = static_cast<RenderEmbeddedObject*>(object);
2173f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            embeddedObject->deref();
2174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
2175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
2176591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
21775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_widgetUpdateSet->isEmpty();
21785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::flushAnyPendingPostLayoutTasks()
21815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_postLayoutTasksTimer.isActive())
21835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
21845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    performPostLayoutTasks();
21865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::performPostLayoutTasks()
21895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
219081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // updateWidgets() call below can blow us away from underneath.
219181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    RefPtr<FrameView> protect(this);
219281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
21935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_postLayoutTasksTimer.stop();
21945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame->selection()->setCaretRectNeedsUpdate();
21965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame->selection()->updateAppearance();
21975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutMilestones milestonesOfInterest = 0;
21995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutMilestones milestonesAchieved = 0;
22005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = m_frame->page();
22015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (page)
22025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        milestonesOfInterest = page->layoutMilestones();
22035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_nestedLayoutCount <= 1) {
22055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_firstLayoutCallbackPending) {
22065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_firstLayoutCallbackPending = false;
22075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_frame->loader()->didFirstLayout();
22085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (milestonesOfInterest & DidFirstLayout)
22095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                milestonesAchieved |= DidFirstLayout;
22105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (page) {
22115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (page->mainFrame() == m_frame)
22125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    page->startCountingRelevantRepaintedObjects();
22135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
22145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
22155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Ensure that we always send this eventually.
22175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_frame->document()->parsing() && m_frame->loader()->stateMachine()->committedFirstRealDocumentLoad())
22185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_isVisuallyNonEmpty = true;
22195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If the layout was done with pending sheets, we are not in fact visually non-empty yet.
22215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_isVisuallyNonEmpty && !m_frame->document()->didLayoutWithPendingStylesheets() && m_firstVisuallyNonEmptyLayoutCallbackPending) {
22225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_firstVisuallyNonEmptyLayoutCallbackPending = false;
22235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (milestonesOfInterest & DidFirstVisuallyNonEmptyLayout)
22245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                milestonesAchieved |= DidFirstVisuallyNonEmptyLayout;
22255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
22265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
22275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame->loader()->didLayout(milestonesAchieved);
2229591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    m_frame->document()->fontloader()->didLayout();
22305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
2232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (renderView)
2233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        renderView->updateWidgetPositions();
223453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
22355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 0; i < maxUpdateWidgetsIterations; i++) {
22365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (updateWidgets())
22375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
22385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
22395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (page) {
22415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())
22425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            scrollingCoordinator->frameViewLayoutUpdated(this);
22435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
22445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    scrollToAnchor();
22465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_actionScheduler->resume();
22485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2249521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // Refetch render view since it can be destroyed by updateWidget() call above.
2250521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    renderView = this->renderView();
2251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (renderView && !renderView->printing()) {
2252591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        IntSize currentSize = layoutSize(IncludeScrollbars);
2253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        float currentZoomFactor = renderView->style()->zoom();
22545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool resized = !m_firstLayout && (currentSize != m_lastViewportSize || currentZoomFactor != m_lastZoomFactor);
22555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_lastViewportSize = currentSize;
22565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_lastZoomFactor = currentZoomFactor;
22575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (resized) {
22585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_frame->eventHandler()->sendResizeEvent();
225953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            if (page && page->mainFrame() == m_frame)
226053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                InspectorInstrumentation::didResizeMainFrame(page);
22615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
22625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
22635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::postLayoutTimerFired(Timer<FrameView>*)
22665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
22675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    performPostLayoutTasks();
22685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::autoSizeIfEnabled()
22715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
22725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_shouldAutoSize)
22735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
22745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_inAutoSize)
22765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
22775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TemporaryChange<bool> changeInAutoSize(m_inAutoSize, true);
22795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* document = frame()->document();
22815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!document)
22825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
22835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderView* documentView = document->renderView();
22855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* documentElement = document->documentElement();
22865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!documentView || !documentElement)
22875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
22885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
228953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    RenderBox* documentRenderBox = documentElement->renderBox();
229053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!documentRenderBox)
229153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return;
229253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
22935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If this is the first time we run autosize, start from small height and
22945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // allow it to grow.
22955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_didRunAutosize)
22965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        resize(frameRect().width(), m_minAutoSize.height());
22975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntSize size = frameRect().size();
22995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Do the resizing twice. The first time is basically a rough calculation using the preferred width
23015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // which may result in a height change during the second iteration.
23025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (int i = 0; i < 2; i++) {
23035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Update various sizes including contentsSize, scrollHeight, etc.
23045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        document->updateLayoutIgnorePendingStylesheets();
23055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int width = documentView->minPreferredLogicalWidth();
230653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        int height = documentRenderBox->scrollHeight();
23075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntSize newSize(width, height);
23085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Check to see if a scrollbar is needed for a given dimension and
23105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // if so, increase the other dimension to account for the scrollbar.
23115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Since the dimensions are only for the view rectangle, once a
23125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // dimension exceeds the maximum, there is no need to increase it further.
23135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (newSize.width() > m_maxAutoSize.width()) {
23145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RefPtr<Scrollbar> localHorizontalScrollbar = horizontalScrollbar();
23155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!localHorizontalScrollbar)
23165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                localHorizontalScrollbar = createScrollbar(HorizontalScrollbar);
23175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!localHorizontalScrollbar->isOverlayScrollbar())
23185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                newSize.setHeight(newSize.height() + localHorizontalScrollbar->height());
23195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Don't bother checking for a vertical scrollbar because the width is at
23215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // already greater the maximum.
23225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (newSize.height() > m_maxAutoSize.height()) {
23235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RefPtr<Scrollbar> localVerticalScrollbar = verticalScrollbar();
23245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!localVerticalScrollbar)
23255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                localVerticalScrollbar = createScrollbar(VerticalScrollbar);
23265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!localVerticalScrollbar->isOverlayScrollbar())
23275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                newSize.setWidth(newSize.width() + localVerticalScrollbar->width());
23285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Don't bother checking for a horizontal scrollbar because the height is
23305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // already greater the maximum.
23315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
23325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Ensure the size is at least the min bounds.
23345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        newSize = newSize.expandedTo(m_minAutoSize);
23355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Bound the dimensions by the max bounds and determine what scrollbars to show.
23375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ScrollbarMode horizonalScrollbarMode = ScrollbarAlwaysOff;
23385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (newSize.width() > m_maxAutoSize.width()) {
23395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            newSize.setWidth(m_maxAutoSize.width());
23405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            horizonalScrollbarMode = ScrollbarAlwaysOn;
23415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
23425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ScrollbarMode verticalScrollbarMode = ScrollbarAlwaysOff;
23435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (newSize.height() > m_maxAutoSize.height()) {
23445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            newSize.setHeight(m_maxAutoSize.height());
23455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            verticalScrollbarMode = ScrollbarAlwaysOn;
23465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
23475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (newSize == size)
23495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
23505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // While loading only allow the size to increase (to avoid twitching during intermediate smaller states)
23525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // unless autoresize has just been turned on or the maximum size is smaller than the current size.
23535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_didRunAutosize && size.height() <= m_maxAutoSize.height() && size.width() <= m_maxAutoSize.width()
23545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            && !frame()->loader()->isComplete() && (newSize.height() < size.height() || newSize.width() < size.width()))
23555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
23565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        resize(newSize.width(), newSize.height());
23585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Force the scrollbar state to avoid the scrollbar code adding them and causing them to be needed. For example,
23595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // a vertical scrollbar may cause text to wrap and thus increase the height (which is the only reason the scollbar is needed).
23605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setVerticalScrollbarLock(false);
23615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setHorizontalScrollbarLock(false);
23625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setScrollbarModes(horizonalScrollbarMode, verticalScrollbarMode, true, true);
23635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
23645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_didRunAutosize = true;
23655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateOverflowStatus(bool horizontalOverflow, bool verticalOverflow)
23685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
23695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_viewportRenderer)
23705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2371591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
23725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_overflowStatusDirty) {
23735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_horizontalOverflow = horizontalOverflow;
23745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_verticalOverflow = verticalOverflow;
23755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_overflowStatusDirty = false;
23765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
23775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2378591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
23795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool horizontalOverflowChanged = (m_horizontalOverflow != horizontalOverflow);
23805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool verticalOverflowChanged = (m_verticalOverflow != verticalOverflow);
2381591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
23825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (horizontalOverflowChanged || verticalOverflowChanged) {
23835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_horizontalOverflow = horizontalOverflow;
23845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_verticalOverflow = verticalOverflow;
2385591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
23865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_actionScheduler->scheduleEvent(OverflowEvent::create(horizontalOverflowChanged, horizontalOverflow,
23875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            verticalOverflowChanged, verticalOverflow),
23885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_viewportRenderer->node());
23895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2390591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
23915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const Pagination& FrameView::pagination() const
23945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
23955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_pagination != Pagination())
23965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_pagination;
23975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Page* page = m_frame->page()) {
23995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (page->mainFrame() == m_frame)
24005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return page->pagination();
24015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
24025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_pagination;
24045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setPagination(const Pagination& pagination)
24075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_pagination == pagination)
24095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
24105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pagination = pagination;
24125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frame)
24145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_frame->document()->styleResolverChanged(DeferRecalcStyle);
24155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect FrameView::windowClipRect(bool clipToContents) const
24185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame->view() == this);
24205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (paintsEntireContents())
24225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return IntRect(IntPoint(), contentsSize());
24235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Set our clip rect to be our contents.
2425926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    IntRect clipRect = contentsToWindow(visibleContentRect(clipToContents ? ExcludeScrollbars : IncludeScrollbars));
24265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_frame || !m_frame->ownerElement())
24275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return clipRect;
24285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Take our owner element and get its clip rect.
24305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLFrameOwnerElement* ownerElement = m_frame->ownerElement();
24315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* parentView = ownerElement->document()->view();
24325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (parentView)
24335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        clipRect.intersect(parentView->windowClipRectForFrameOwner(ownerElement, true));
24345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return clipRect;
24355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect FrameView::windowClipRectForFrameOwner(const HTMLFrameOwnerElement* ownerElement, bool clipToLayerContents) const
24385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The renderer can sometimes be null when style="display:none" interacts
24405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // with external content and plugins.
24415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!ownerElement->renderer())
24425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return windowClipRect();
24435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If we have no layer, just return our window clip rect.
24455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const RenderLayer* enclosingLayer = ownerElement->renderer()->enclosingLayer();
24465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!enclosingLayer)
24475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return windowClipRect();
24485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Apply the clip from the layer.
24505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect clipRect;
24515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (clipToLayerContents)
24525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        clipRect = pixelSnappedIntRect(enclosingLayer->childrenClipRect());
24535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
24545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        clipRect = pixelSnappedIntRect(enclosingLayer->selfClipRect());
2455591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    clipRect = contentsToWindow(clipRect);
24565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return intersection(clipRect, windowClipRect());
24575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isActive() const
24605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = frame()->page();
2462d24c94b5090b6aa121f0f82325c9379004dc3196Ben Murdoch    return page && page->focusController().isActive();
24635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scrollTo(const IntSize& newOffset)
24665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutSize offset = scrollOffset();
24685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::scrollTo(newOffset);
24695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (offset != scrollOffset())
24705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        scrollPositionChanged();
24715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frame()->loader()->client()->didChangeScrollOffset();
24725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::invalidateScrollbarRect(Scrollbar* scrollbar, const IntRect& rect)
24755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Add in our offset within the FrameView.
24775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect dirtyRect = rect;
24785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dirtyRect.moveBy(scrollbar->location());
24795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    invalidateRect(dirtyRect);
24805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::getTickmarks(Vector<IntRect>& tickmarks) const
24835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    tickmarks = frame()->document()->markers()->renderedRectsForMarkers(DocumentMarker::TextMatch);
24855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect FrameView::windowResizerRect() const
24885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = frame() ? frame()->page() : 0;
24905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
24915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return IntRect();
249293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return page->chrome().windowResizerRect();
24935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
249553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void FrameView::setVisibleContentScaleFactor(float visibleContentScaleFactor)
2496926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
249753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (m_visibleContentScaleFactor == visibleContentScaleFactor)
249853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return;
2499926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
250053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_visibleContentScaleFactor = visibleContentScaleFactor;
250153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    updateScrollbars(scrollOffset());
2502926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2503926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
25045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::scrollbarsCanBeActive() const
25055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_frame)
25075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
25085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frame->view() != this)
25105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
25115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
251253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return !!m_frame->document();
25135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ScrollableArea* FrameView::enclosingScrollableArea() const
25165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Walk up the frame tree and look for a scrollable parent frame or RenderLayer.
25185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
25195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect FrameView::scrollableAreaBoundingBox() const
25225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2523926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderPart* ownerRenderer = frame()->ownerRenderer();
2524926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!ownerRenderer)
2525926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return frameRect();
2526926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2527926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return ownerRenderer->absoluteContentQuad().enclosingBoundingBox();
25285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2530926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool FrameView::isScrollable()
25315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Check for:
2533926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // 1) If there an actual overflow.
2534926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // 2) display:none or visibility:hidden set to self or inherited.
2535926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // 3) overflow{-x,-y}: hidden;
2536926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // 4) scrolling: no;
25375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2538926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Covers #1
253953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    IntSize contentsSize = this->contentsSize();
25405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntSize visibleContentSize = visibleContentRect().size();
254153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if ((contentsSize.height() <= visibleContentSize.height() && contentsSize.width() <= visibleContentSize.width()))
2542926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
25435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2544926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Covers #2.
2545926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    HTMLFrameOwnerElement* owner = m_frame->ownerElement();
2546926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (owner && (!owner->renderer() || !owner->renderer()->visibleToHitTesting()))
2547926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
2548926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2549926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Cover #3 and #4.
25505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollbarMode horizontalMode;
25515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollbarMode verticalMode;
25525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    calculateScrollbarModesForLayout(horizontalMode, verticalMode, RulesFromWebContentOnly);
2553926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (horizontalMode == ScrollbarAlwaysOff && verticalMode == ScrollbarAlwaysOff)
2554926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
2555926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2556926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return true;
2557926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2558926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2559926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void FrameView::updateScrollableAreaSet()
2560926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2561926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // That ensures that only inner frames are cached.
2562926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    FrameView* parentFrameView = this->parentFrameView();
2563926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!parentFrameView)
2564926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
2565926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2566926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!isScrollable()) {
2567926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        parentFrameView->removeScrollableArea(this);
25685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
25695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
25705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2571926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    parentFrameView->addScrollableArea(this);
25725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::shouldSuspendScrollAnimations() const
25755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_frame->loader()->state() != FrameStateComplete;
25775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scrollbarStyleChanged(int newStyle, bool forceUpdate)
25805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = m_frame->page();
25825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
25835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
25845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (page->mainFrame() != m_frame)
25855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
25865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (forceUpdate)
25885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ScrollView::scrollbarStyleChanged(newStyle, forceUpdate);
25895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setAnimatorsAreActive()
25925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = m_frame->page();
25945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
25955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
25965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ScrollAnimator* scrollAnimator = existingScrollAnimator())
25985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        scrollAnimator->setIsActive();
25995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_scrollableAreas)
26015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
26025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (HashSet<ScrollableArea*>::const_iterator it = m_scrollableAreas->begin(), end = m_scrollableAreas->end(); it != end; ++it) {
26045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ScrollableArea* scrollableArea = *it;
26055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(scrollableArea->scrollbarsCanBeActive());
26075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        scrollableArea->scrollAnimator()->setIsActive();
26085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
26095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
26105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::notifyPageThatContentAreaWillPaint() const
26125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
26135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = m_frame->page();
26145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
26155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
26165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    contentAreaWillPaint();
26185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_scrollableAreas)
26205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
26215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (HashSet<ScrollableArea*>::const_iterator it = m_scrollableAreas->begin(), end = m_scrollableAreas->end(); it != end; ++it) {
26235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ScrollableArea* scrollableArea = *it;
26245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!scrollableArea->scrollbarsCanBeActive())
26265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
26275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        scrollableArea->contentAreaWillPaint();
26295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
26305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
26315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::scrollAnimatorEnabled() const
26335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
26345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Page* page = m_frame->page())
26355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return page->settings()->scrollAnimatorEnabled();
26365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
26375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
26385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateAnnotatedRegions()
26405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
26415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* document = m_frame->document();
26425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!document->hasAnnotatedRegions())
26435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
26445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<AnnotatedRegionValue> newRegions;
26455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    document->renderBox()->collectAnnotatedRegions(newRegions);
26465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (newRegions == document->annotatedRegions())
26475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
26485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    document->setAnnotatedRegions(newRegions);
26495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = m_frame->page();
26505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
26515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
265293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    page->chrome().client()->annotatedRegionsChanged();
26535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
26545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateScrollCorner()
26565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
26575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<RenderStyle> cornerStyle;
26585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect cornerRect = scrollCornerRect();
26595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    Document* doc = m_frame->document();
26605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
26615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (doc && !cornerRect.isEmpty()) {
26625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Try the <body> element first as a scroll corner source.
26635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        if (Element* body = doc->body()) {
26645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            if (RenderObject* renderer = body->renderer())
26655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                cornerStyle = renderer->getUncachedPseudoStyle(PseudoStyleRequest(SCROLLBAR_CORNER), renderer->style());
26665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2667591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
26685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!cornerStyle) {
26695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // If the <body> didn't have a custom style, then the root element might.
26705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            if (Element* docElement = doc->documentElement()) {
26715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                if (RenderObject* renderer = docElement->renderer())
26725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                    cornerStyle = renderer->getUncachedPseudoStyle(PseudoStyleRequest(SCROLLBAR_CORNER), renderer->style());
26735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
26745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2675591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
26765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!cornerStyle) {
26775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // If we have an owning iframe/frame element, then it can set the custom scrollbar also.
26785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (RenderPart* renderer = m_frame->ownerRenderer())
2679926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                cornerStyle = renderer->getUncachedPseudoStyle(PseudoStyleRequest(SCROLLBAR_CORNER), renderer->style());
26805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
26815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
26825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (cornerStyle) {
26845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_scrollCorner)
26855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            m_scrollCorner = RenderScrollbarPart::createAnonymous(doc);
26865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollCorner->setStyle(cornerStyle.release());
26875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        invalidateScrollCorner(cornerRect);
26885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else if (m_scrollCorner) {
26895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollCorner->destroy();
26905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollCorner = 0;
26915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
26925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::updateScrollCorner();
26945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
26955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::paintScrollCorner(GraphicsContext* context, const IntRect& cornerRect)
26975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
26985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (context->updatingControlTints()) {
26995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateScrollCorner();
27005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
27015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
27025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_scrollCorner) {
27045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool needsBackgorund = m_frame->page() && m_frame->page()->mainFrame() == m_frame;
27055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (needsBackgorund)
27065267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            context->fillRect(cornerRect, baseBackgroundColor());
27075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollCorner->paintIntoRect(context, cornerRect.location(), cornerRect);
27085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
27095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
27105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::paintScrollCorner(context, cornerRect);
27125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::paintScrollbar(GraphicsContext* context, Scrollbar* bar, const IntRect& rect)
27155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
27165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool needsBackgorund = bar->isCustomScrollbar() && (m_frame->page() && m_frame->page()->mainFrame() == m_frame);
27175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (needsBackgorund) {
27185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect toFill = bar->frameRect();
27195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        toFill.intersect(rect);
27205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        context->fillRect(toFill, baseBackgroundColor());
27215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
27225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::paintScrollbar(context, bar, rect);
27245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
272683750176c3ee2cea66c8a9751271026a5901be3aBen MurdochStyleColor FrameView::documentBackgroundColor() const
27275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
27285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // <https://bugs.webkit.org/show_bug.cgi?id=59540> We blend the background color of
27295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the document and the body against the base background color of the frame view.
27305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Background images are unfortunately impractical to include.
27315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Return invalid Color objects whenever there is insufficient information.
27335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame()->document())
27345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Color();
27355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* htmlElement = frame()->document()->documentElement();
27375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* bodyElement = frame()->document()->body();
27385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Start with invalid colors.
274083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    StyleColor htmlBackgroundColor;
274183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    StyleColor bodyBackgroundColor;
27425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (htmlElement && htmlElement->renderer())
274383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        htmlBackgroundColor = htmlElement->renderer()->resolveStyleColor(CSSPropertyBackgroundColor);
27445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (bodyElement && bodyElement->renderer())
274583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        bodyBackgroundColor = bodyElement->renderer()->resolveStyleColor(CSSPropertyBackgroundColor);
27465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!bodyBackgroundColor.isValid()) {
27485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!htmlBackgroundColor.isValid())
274983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch            return StyleColor();
275083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        return baseBackgroundColor().blend(htmlBackgroundColor.color());
27515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
27525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!htmlBackgroundColor.isValid())
275483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        return baseBackgroundColor().blend(bodyBackgroundColor.color());
27555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We take the aggregate of the base background color
27575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the <html> background color, and the <body>
27585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // background color to find the document color. The
27595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // addition of the base background color is not
27605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // technically part of the document background, but it
27615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // otherwise poses problems when the aggregate is not
27625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // fully opaque.
276383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    return baseBackgroundColor().blend(htmlBackgroundColor.color()).blend(bodyBackgroundColor.color());
27645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::hasCustomScrollbars() const
27675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
27685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const HashSet<RefPtr<Widget> >* viewChildren = children();
27695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HashSet<RefPtr<Widget> >::const_iterator end = viewChildren->end();
27705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (HashSet<RefPtr<Widget> >::const_iterator current = viewChildren->begin(); current != end; ++current) {
27715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Widget* widget = current->get();
27725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (widget->isFrameView()) {
2773926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (toFrameView(widget)->hasCustomScrollbars())
27745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return true;
27755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (widget->isScrollbar()) {
27765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Scrollbar* scrollbar = static_cast<Scrollbar*>(widget);
27775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (scrollbar->isCustomScrollbar())
27785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return true;
27795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
27805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
27815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
27835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FrameView* FrameView::parentFrameView() const
27865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2787926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!parent())
2788926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
2789926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
27905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Frame* parentFrame = m_frame->tree()->parent())
27915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return parentFrame->view();
27925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
27945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateControlTints()
27975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
27985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This is called when control tints are changed from aqua/graphite to clear and vice versa.
27995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We do a "fake" paint, and when the theme gets a paint call, it can then do an invalidate.
28005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This is only done if the theme supports control tinting. It's up to the theme and platform
28015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // to define when controls get the tint and to call this function when that changes.
2802591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
28035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Optimize the common case where we bring a window to the front while it's still empty.
28045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_frame || m_frame->document()->url().isEmpty())
28055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
28065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2807926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
2808926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if ((renderView && renderView->theme()->supportsControlTints()) || hasCustomScrollbars())
28095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        paintControlTints();
28105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
28115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::paintControlTints()
28135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
28145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (needsLayout())
28155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        layout();
281653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // FIXME: The use of paint seems like overkill: crbug.com/236892
281753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext context(0); // NULL canvas to get a non-painting context.
28185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setUpdatingControlTints(true);
281953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    paint(&context, frameRect());
28205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
28215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::wasScrolledByUser() const
28235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
28245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_wasScrolledByUser;
28255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
28265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setWasScrolledByUser(bool wasScrolledByUser)
28285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
28295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_inProgrammaticScroll)
28305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
28315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_maintainScrollPositionAnchor = 0;
28325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_wasScrolledByUser = wasScrolledByUser;
28335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
28345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::paintContents(GraphicsContext* p, const IntRect& rect)
28365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
28375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
28385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
28395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* document = m_frame->document();
28415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
28435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool fillWithRed;
28445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (document->printing())
28455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fillWithRed = false; // Printing, don't fill with red (can't remember why).
28465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (m_frame->ownerElement())
28475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fillWithRed = false; // Subframe, don't fill with red.
28485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (isTransparent())
28495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fillWithRed = false; // Transparent, don't fill with red.
28505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (m_paintBehavior & PaintBehaviorSelectionOnly)
28515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fillWithRed = false; // Selections are transparent, don't fill with red.
28525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (m_nodeToDraw)
28535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fillWithRed = false; // Element images are transparent, don't fill with red.
28545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
28555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fillWithRed = true;
28565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
28575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (fillWithRed)
28585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        p->fillRect(rect, Color(0xFF, 0, 0));
28595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
28605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2861926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
2862926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView) {
28635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LOG_ERROR("called FrameView::paint with nil renderer");
28645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
28655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
28665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!needsLayout());
28685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (needsLayout())
28695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
28705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
287153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    InspectorInstrumentation::willPaint(renderView);
287253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
28735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isTopLevelPainter = !sCurrentPaintTimeStamp;
28745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isTopLevelPainter)
28755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        sCurrentPaintTimeStamp = currentTime();
28765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FontCachePurgePreventer fontCachePurgePreventer;
28785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PaintBehavior oldPaintBehavior = m_paintBehavior;
2880591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
28815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FrameView* parentView = parentFrameView()) {
28825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parentView->paintBehavior() & PaintBehaviorFlattenCompositingLayers)
28835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_paintBehavior |= PaintBehaviorFlattenCompositingLayers;
28845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2885591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
28865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_paintBehavior == PaintBehaviorNormal)
28875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        document->markers()->invalidateRenderedRectsForMarkersInRect(rect);
28885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (document->printing())
28905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_paintBehavior |= PaintBehaviorFlattenCompositingLayers;
28915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_isPainting);
28935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isPainting = true;
28945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // m_nodeToDraw is used to draw only one element (and its descendants)
28965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* eltRenderer = m_nodeToDraw ? m_nodeToDraw->renderer() : 0;
2897926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderLayer* rootLayer = renderView->layer();
28985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
29005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject::SetLayoutNeededForbiddenScope forbidSetNeedsLayout(rootLayer->renderer());
29015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
29025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rootLayer->paint(p, rect, m_paintBehavior, eltRenderer);
29045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (rootLayer->containsDirtyOverlayScrollbars())
29065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rootLayer->paintOverlayScrollbars(p, rect, m_paintBehavior, eltRenderer);
29075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isPainting = false;
29095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_paintBehavior = oldPaintBehavior;
29115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastPaintTime = currentTime();
29125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Regions may have changed as a result of the visibility/z-index of element changing.
29145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (document->annotatedRegionsDirty())
29155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateAnnotatedRegions();
29165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isTopLevelPainter)
29185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        sCurrentPaintTimeStamp = 0;
29195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
292053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    InspectorInstrumentation::didPaint(renderView, p, rect);
29215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setPaintBehavior(PaintBehavior behavior)
29245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_paintBehavior = behavior;
29265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PaintBehavior FrameView::paintBehavior() const
29295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_paintBehavior;
29315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isPainting() const
29345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_isPainting;
29365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setNodeToDraw(Node* node)
29395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_nodeToDraw = node;
29415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::paintOverhangAreas(GraphicsContext* context, const IntRect& horizontalOverhangArea, const IntRect& verticalOverhangArea, const IntRect& dirtyRect)
29445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (context->paintingDisabled())
29465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
29475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frame->document()->printing())
29495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
29505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = m_frame->page();
29525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (page->mainFrame() == m_frame) {
295393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        if (page->chrome().client()->paintCustomOverhangArea(context, horizontalOverhangArea, verticalOverhangArea, dirtyRect))
29545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
29555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
29565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::paintOverhangAreas(context, horizontalOverhangArea, verticalOverhangArea, dirtyRect);
29585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateLayoutAndStyleIfNeededRecursive()
29615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We have to crawl our entire tree looking for any FrameViews that need
29635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // layout and make sure they are up to date.
29645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Mac actually tests for intersection with the dirty region and tries not to
29655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // update layout for frames that are outside the dirty region.  Not only does this seem
29665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // pointless (since those frames will have set a zero timer to layout anyway), but
29675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // it is also incorrect, since if two frames overlap, the first could be excluded from the dirty
29685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // region but then become included later by the second frame adding rects to the dirty region
29695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // when it lays out.
29705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame->document()->updateStyleIfNeeded();
29725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (needsLayout())
29745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        layout();
29755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Grab a copy of the children() set, as it may be mutated by the following updateLayoutAndStyleIfNeededRecursive
29775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // calls, as they can potentially re-enter a layout of the parent frame view, which may add/remove scrollbars
29785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // and thus mutates the children() set.
29795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<RefPtr<FrameView> > frameViews;
29805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    collectFrameViewChildren(this, frameViews);
29815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Vector<RefPtr<FrameView> >::iterator end = frameViews.end();
29835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (Vector<RefPtr<FrameView> >::iterator it = frameViews.begin(); it != end; ++it)
29845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        (*it)->updateLayoutAndStyleIfNeededRecursive();
29855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // updateLayoutAndStyleIfNeededRecursive is called when we need to make sure style and layout are up-to-date before
29875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // painting, so we need to flush out any deferred repaints too.
29885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    flushDeferredRepaints();
29895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
299093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // When seamless is on, child frame can mark parent frame dirty. In such case, child frame
29915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // needs to call layout on parent frame recursively.
29925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This assert ensures that parent frames are clean, when child frames finished updating layout and style.
29935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!needsLayout());
29945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::enableAutoSizeMode(bool enable, const IntSize& minSize, const IntSize& maxSize)
29975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!enable || !minSize.isEmpty());
29995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(minSize.width() <= maxSize.width());
30005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(minSize.height() <= maxSize.height());
30015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_shouldAutoSize == enable && m_minAutoSize == minSize && m_maxAutoSize == maxSize)
30035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
30045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_shouldAutoSize = enable;
30065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_minAutoSize = minSize;
30075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_maxAutoSize = maxSize;
30085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_didRunAutosize = false;
30095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setNeedsLayout();
30115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    scheduleRelayout();
30125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_shouldAutoSize)
30135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
30145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Since autosize mode forces the scrollbar mode, change them to being auto.
30165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setVerticalScrollbarLock(false);
30175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setHorizontalScrollbarLock(false);
30185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setScrollbarModes(ScrollbarAuto, ScrollbarAuto);
30195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::forceLayout(bool allowSubtree)
30225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
30235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    layout(allowSubtree);
30245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::forceLayoutForPagination(const FloatSize& pageSize, const FloatSize& originalPageSize, float maximumShrinkFactor, AdjustViewSizeOrNot shouldAdjustViewSize)
30275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
30285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Dumping externalRepresentation(m_frame->renderer()).ascii() is a good trick to see
30295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the state of things before and after the layout
3030926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (RenderView* renderView = this->renderView()) {
3031926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        float pageLogicalWidth = renderView->style()->isHorizontalWritingMode() ? pageSize.width() : pageSize.height();
3032926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        float pageLogicalHeight = renderView->style()->isHorizontalWritingMode() ? pageSize.height() : pageSize.width();
30335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit flooredPageLogicalWidth = static_cast<LayoutUnit>(pageLogicalWidth);
30355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit flooredPageLogicalHeight = static_cast<LayoutUnit>(pageLogicalHeight);
3036926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        renderView->setLogicalWidth(flooredPageLogicalWidth);
3037926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        renderView->setPageLogicalHeight(flooredPageLogicalHeight);
3038926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        renderView->setNeedsLayoutAndPrefWidthsRecalc();
30395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        forceLayout();
30405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If we don't fit in the given page width, we'll lay out again. If we don't fit in the
30425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // page width when shrunk, we will lay out at maximum shrink and clip extra content.
30435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // FIXME: We are assuming a shrink-to-fit printing implementation.  A cropping
30445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // implementation should not do this!
3045926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        bool horizontalWritingMode = renderView->style()->isHorizontalWritingMode();
3046926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const LayoutRect& documentRect = renderView->documentRect();
30475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit docLogicalWidth = horizontalWritingMode ? documentRect.width() : documentRect.height();
30485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (docLogicalWidth > pageLogicalWidth) {
30495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int expectedPageWidth = std::min<float>(documentRect.width(), pageSize.width() * maximumShrinkFactor);
30505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int expectedPageHeight = std::min<float>(documentRect.height(), pageSize.height() * maximumShrinkFactor);
30515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            FloatSize maxPageSize = m_frame->resizePageRectsKeepingRatio(FloatSize(originalPageSize.width(), originalPageSize.height()), FloatSize(expectedPageWidth, expectedPageHeight));
30525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            pageLogicalWidth = horizontalWritingMode ? maxPageSize.width() : maxPageSize.height();
30535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            pageLogicalHeight = horizontalWritingMode ? maxPageSize.height() : maxPageSize.width();
30545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            flooredPageLogicalWidth = static_cast<LayoutUnit>(pageLogicalWidth);
30565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            flooredPageLogicalHeight = static_cast<LayoutUnit>(pageLogicalHeight);
3057926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->setLogicalWidth(flooredPageLogicalWidth);
3058926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->setPageLogicalHeight(flooredPageLogicalHeight);
3059926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->setNeedsLayoutAndPrefWidthsRecalc();
30605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            forceLayout();
30615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3062926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            const LayoutRect& updatedDocumentRect = renderView->documentRect();
30635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutUnit docLogicalHeight = horizontalWritingMode ? updatedDocumentRect.height() : updatedDocumentRect.width();
30645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutUnit docLogicalTop = horizontalWritingMode ? updatedDocumentRect.y() : updatedDocumentRect.x();
30655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutUnit docLogicalRight = horizontalWritingMode ? updatedDocumentRect.maxX() : updatedDocumentRect.maxY();
30665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutUnit clippedLogicalLeft = 0;
3067926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (!renderView->style()->isLeftToRightDirection())
30685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                clippedLogicalLeft = docLogicalRight - pageLogicalWidth;
30695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutRect overflow(clippedLogicalLeft, docLogicalTop, pageLogicalWidth, docLogicalHeight);
30705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!horizontalWritingMode)
30725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                overflow = overflow.transposedRect();
3073926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->clearLayoutOverflow();
3074926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->addLayoutOverflow(overflow); // This is how we clip in case we overflow again.
30755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
30765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
30775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (shouldAdjustViewSize)
30795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        adjustViewSize();
30805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect FrameView::convertFromRenderer(const RenderObject* renderer, const IntRect& rendererRect) const
30835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3084926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    IntRect rect = pixelSnappedIntRect(enclosingLayoutRect(renderer->localToAbsoluteQuad(FloatRect(rendererRect)).boundingBox()));
30855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Convert from page ("absolute") to FrameView coordinates.
308753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    rect.moveBy(-scrollPosition());
30885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return rect;
30905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect FrameView::convertToRenderer(const RenderObject* renderer, const IntRect& viewRect) const
30935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
30945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect rect = viewRect;
3095591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
30965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Convert from FrameView coords into page ("absolute") coordinates.
309753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    rect.moveBy(scrollPosition());
30985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: we don't have a way to map an absolute rect down to a local quad, so just
31005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // move the rect for now.
3101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    rect.setLocation(roundedIntPoint(renderer->absoluteToLocal(rect.location(), UseTransforms)));
31025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return rect;
31035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
31045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint FrameView::convertFromRenderer(const RenderObject* renderer, const IntPoint& rendererPoint) const
31065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    IntPoint point = roundedIntPoint(renderer->localToAbsolute(rendererPoint, UseTransforms));
31085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Convert from page ("absolute") to FrameView coordinates.
311053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    point.moveBy(-scrollPosition());
31115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return point;
31125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
31135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint FrameView::convertToRenderer(const RenderObject* renderer, const IntPoint& viewPoint) const
31155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
31165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint point = viewPoint;
31175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Convert from FrameView coords into page ("absolute") coordinates.
311953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    point += IntSize(scrollX(), scrollY());
31205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return roundedIntPoint(renderer->absoluteToLocal(point, UseTransforms));
31225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
31235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect FrameView::convertToContainingView(const IntRect& localRect) const
31255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
31265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (const ScrollView* parentScrollView = parent()) {
31275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parentScrollView->isFrameView()) {
3128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            const FrameView* parentView = toFrameView(parentScrollView);
31295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Get our renderer in the parent view
31305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RenderPart* renderer = m_frame->ownerRenderer();
31315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!renderer)
31325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return localRect;
3133591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
31345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            IntRect rect(localRect);
31355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Add borders and padding??
31365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            rect.move(renderer->borderLeft() + renderer->paddingLeft(),
31375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                      renderer->borderTop() + renderer->paddingTop());
31385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return parentView->convertFromRenderer(renderer, rect);
31395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3140591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
31415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Widget::convertToContainingView(localRect);
31425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3143591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
31445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return localRect;
31455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
31465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect FrameView::convertFromContainingView(const IntRect& parentRect) const
31485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
31495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (const ScrollView* parentScrollView = parent()) {
31505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parentScrollView->isFrameView()) {
3151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            const FrameView* parentView = toFrameView(parentScrollView);
31525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Get our renderer in the parent view
31545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RenderPart* renderer = m_frame->ownerRenderer();
31555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!renderer)
31565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return parentRect;
31575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            IntRect rect = parentView->convertToRenderer(renderer, parentRect);
31595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Subtract borders and padding
31605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            rect.move(-renderer->borderLeft() - renderer->paddingLeft(),
31615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                      -renderer->borderTop() - renderer->paddingTop());
31625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return rect;
31635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3164591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
31655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Widget::convertFromContainingView(parentRect);
31665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3167591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
31685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return parentRect;
31695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
31705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint FrameView::convertToContainingView(const IntPoint& localPoint) const
31725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
31735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (const ScrollView* parentScrollView = parent()) {
31745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parentScrollView->isFrameView()) {
3175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            const FrameView* parentView = toFrameView(parentScrollView);
31765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Get our renderer in the parent view
31785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RenderPart* renderer = m_frame->ownerRenderer();
31795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!renderer)
31805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return localPoint;
3181591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
31825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            IntPoint point(localPoint);
31835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Add borders and padding
31855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            point.move(renderer->borderLeft() + renderer->paddingLeft(),
31865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       renderer->borderTop() + renderer->paddingTop());
31875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return parentView->convertFromRenderer(renderer, point);
31885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3189591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
31905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Widget::convertToContainingView(localPoint);
31915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3192591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
31935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return localPoint;
31945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
31955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint FrameView::convertFromContainingView(const IntPoint& parentPoint) const
31975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
31985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (const ScrollView* parentScrollView = parent()) {
31995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parentScrollView->isFrameView()) {
3200926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            const FrameView* parentView = toFrameView(parentScrollView);
32015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Get our renderer in the parent view
32035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RenderPart* renderer = m_frame->ownerRenderer();
32045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!renderer)
32055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return parentPoint;
32065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            IntPoint point = parentView->convertToRenderer(renderer, parentPoint);
32085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Subtract borders and padding
32095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            point.move(-renderer->borderLeft() - renderer->paddingLeft(),
32105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       -renderer->borderTop() - renderer->paddingTop());
32115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return point;
32125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3213591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
32145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Widget::convertFromContainingView(parentPoint);
32155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3216591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
32175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return parentPoint;
32185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Normal delay
32215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setRepaintThrottlingDeferredRepaintDelay(double p)
32225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    s_normalDeferredRepaintDelay = p;
32245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Negative value would mean that first few repaints happen without a delay
32275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setRepaintThrottlingnInitialDeferredRepaintDelayDuringLoading(double p)
32285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    s_initialDeferredRepaintDelayDuringLoading = p;
32305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The delay grows on each repaint to this maximum value
32335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setRepaintThrottlingMaxDeferredRepaintDelayDuringLoading(double p)
32345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    s_maxDeferredRepaintDelayDuringLoading = p;
32365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// On each repaint the delay increases by this amount
32395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setRepaintThrottlingDeferredRepaintDelayIncrementDuringLoading(double p)
32405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    s_deferredRepaintDelayIncrementDuringLoading = p;
32425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setTracksRepaints(bool trackRepaints)
32455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (trackRepaints == m_isTrackingRepaints)
32475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
32485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (Frame* frame = m_frame->tree()->top(); frame; frame = frame->tree()->traverseNext()) {
32505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (RenderView* renderView = frame->contentRenderer())
32515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            renderView->compositor()->setTracksRepaints(trackRepaints);
32525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
32535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resetTrackedRepaints();
32555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isTrackingRepaints = trackRepaints;
32565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::resetTrackedRepaints()
32595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_trackedRepaintRects.clear();
3261926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (RenderView* renderView = this->renderView())
3262926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        renderView->compositor()->resetTrackedRepaintRects();
32635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String FrameView::trackedRepaintRectsAsText() const
32665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TextStream ts;
32685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_trackedRepaintRects.isEmpty()) {
32695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ts << "(repaint rects\n";
32705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (size_t i = 0; i < m_trackedRepaintRects.size(); ++i)
32715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ts << "  (rect " << m_trackedRepaintRects[i].x() << " " << m_trackedRepaintRects[i].y() << " " << m_trackedRepaintRects[i].width() << " " << m_trackedRepaintRects[i].height() << ")\n";
32725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ts << ")\n";
32735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
32745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ts.release();
32755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
327781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)void FrameView::addResizerArea(RenderLayer* resizerLayer)
327881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){
327981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (!m_resizerAreas)
328081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        m_resizerAreas = adoptPtr(new ResizerAreaSet);
328181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    m_resizerAreas->add(resizerLayer);
328281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)}
328381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
328481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)void FrameView::removeResizerArea(RenderLayer* resizerLayer)
328581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){
328681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (!m_resizerAreas)
328781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        return;
328881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
328981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    ResizerAreaSet::iterator it = m_resizerAreas->find(resizerLayer);
329081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (it != m_resizerAreas->end())
329181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        m_resizerAreas->remove(it);
329281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)}
329381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
3294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool FrameView::addScrollableArea(ScrollableArea* scrollableArea)
32955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_scrollableAreas)
32975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollableAreas = adoptPtr(new ScrollableAreaSet);
3298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_scrollableAreas->add(scrollableArea).isNewEntry;
32995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
33005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3301926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool FrameView::removeScrollableArea(ScrollableArea* scrollableArea)
33025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
33035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_scrollableAreas)
3304926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
3305926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3306926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ScrollableAreaSet::iterator it = m_scrollableAreas->find(scrollableArea);
3307926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (it == m_scrollableAreas->end())
3308926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
3309926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3310926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_scrollableAreas->remove(it);
3311926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return true;
33125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
33135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::containsScrollableArea(ScrollableArea* scrollableArea) const
33155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
33165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_scrollableAreas)
33175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
33185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_scrollableAreas->contains(scrollableArea);
33195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
33205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::removeChild(Widget* widget)
33225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
33235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (widget->isFrameView())
3324926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        removeScrollableArea(toFrameView(widget));
33255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::removeChild(widget);
33275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
33285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::wheelEvent(const PlatformWheelEvent& wheelEvent)
33305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3331926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Note that to allow for rubber-band over-scroll behavior, even non-scrollable views
3332926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // should handle wheel events.
3333926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#if !ENABLE(RUBBER_BANDING)
3334926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!isScrollable())
3335926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
3336926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
3337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
33385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We don't allow mouse wheeling to happen in a ScrollView that has had its scrollbars explicitly disabled.
33395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!canHaveScrollbars())
33405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
33415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ScrollableArea::handleWheelEvent(wheelEvent);
33435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
33445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isVerticalDocument() const
33475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3348926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
3349926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
33505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
33515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3352926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return renderView->style()->isHorizontalWritingMode();
33535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
33545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isFlippedDocument() const
33565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3357926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
3358926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
33595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
33605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3361926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return renderView->style()->isFlippedBlocksWritingMode();
33625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
33635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)AXObjectCache* FrameView::axObjectCache() const
33655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3366926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (frame() && frame()->document())
3367926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return frame()->document()->existingAXObjectCache();
33685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
33695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3370591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
33715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
3372