15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org>
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *                     1999 Lars Knoll <knoll@kde.org>
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *                     1999 Antti Koivisto <koivisto@kde.org>
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *                     2000 Dirk Mueller <mueller@kde.org>
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2006 Graham Dennis (graham.dennis@gmail.com)
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2006 Alexey Proskuryakov (ap@nypop.com)
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Google Inc. All rights reserved.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
281e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/FrameView.h"
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h"
317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/MediaTypeNames.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/accessibility/AXObjectCache.h"
339bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/css/FontFaceSet.h"
3481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "core/css/resolver/StyleResolver.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentMarkerController.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/FrameSelection.h"
377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/editing/RenderedPosition.h"
381e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/OverflowEvent.h"
39e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/ResourceFetcher.h"
40a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "core/fetch/ResourceLoadPriorityOptimizer.h"
4110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "core/frame/FrameHost.h"
42d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h"
4309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/Settings.h"
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFrameElement.h"
45f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "core/html/HTMLPlugInElement.h"
4609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/html/parser/TextResourceDecoder.h"
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorInstrumentation.h"
48f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "core/inspector/InspectorTraceEvents.h"
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoader.h"
5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoaderClient.h"
5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Chrome.h"
5253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/ChromeClient.h"
5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/EventHandler.h"
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FocusController.h"
5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FrameTree.h"
56197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/page/Page.h"
5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/scrolling/ScrollingCoordinator.h"
588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "core/rendering/RenderCounter.h"
5953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderEmbeddedObject.h"
6053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderLayer.h"
6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/rendering/RenderListBox.h"
6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderPart.h"
6353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderScrollbar.h"
6453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderScrollbarPart.h"
6553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTheme.h"
6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h"
6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/rendering/RenderWidget.h"
6853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/TextAutosizer.h"
69d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/compositing/CompositedLayerMapping.h"
707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/compositing/CompositedSelectionBound.h"
71d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/compositing/RenderLayerCompositor.h"
7253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/RenderStyle.h"
7393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/rendering/svg/RenderSVGRoot.h"
74323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#include "core/svg/SVGDocumentExtensions.h"
7593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/svg/SVGSVGElement.h"
765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h"
77197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "platform/ScriptForbiddenScope.h"
7809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "platform/TraceEvent.h"
79a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/FontCache.h"
801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/FloatRect.h"
81a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsContext.h"
8209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "platform/graphics/GraphicsLayerDebugInfo.h"
83a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/ScrollAnimator.h"
84a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/ScrollbarTheme.h"
851e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/text/TextStream.h"
86591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/CurrentTime.h"
87591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/TemporaryChange.h"
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
89c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames;
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
93e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)double FrameView::s_currentFrameTimeStamp = 0.0;
94e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)bool FrameView::s_inPaintContents = false;
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The maximum number of updateWidgets iterations that should be done before returning.
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const unsigned maxUpdateWidgetsIterations = 2;
9809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static const double resourcePriorityUpdateDelayAfterScroll = 0.250;
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
100d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)FrameView::FrameView(LocalFrame* frame)
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_frame(frame)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_canHaveScrollbars(true)
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_slowRepaintObjectCount(0)
10409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_hasPendingLayout(false)
10509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_layoutSubtreeRoot(0)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_inSynchronousPostLayout(false)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_postLayoutTasksTimer(this, &FrameView::postLayoutTimerFired)
10851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    , m_updateWidgetsTimer(this, &FrameView::updateWidgetsTimerFired)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isTransparent(false)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_baseBackgroundColor(Color::white)
1117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    , m_mediaType(MediaTypeNames::screen)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_overflowStatusDirty(true)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_viewportRenderer(0)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_wasScrolledByUser(false)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_inProgrammaticScroll(false)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_safeToPropagateScrollToParent(true)
117f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    , m_isTrackingPaintInvalidations(false)
118e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    , m_scrollCorner(nullptr)
11953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    , m_visibleContentScaleFactor(1)
1201e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    , m_inputEventsScaleFactorForEmulation(1)
121bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    , m_layoutSizeFixedToFrameSize(true)
12209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_didScrollTimer(this, &FrameView::didScrollTimerFired)
1239e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    , m_needsUpdateWidgetPositions(false)
1247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    , m_topControlsViewportAdjustment(0)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1268abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ASSERT(m_frame);
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    init();
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (!m_frame->isMainFrame())
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1328abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ScrollableArea::setVerticalScrollElasticity(ScrollElasticityAllowed);
1338abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ScrollableArea::setHorizontalScrollElasticity(ScrollElasticityAllowed);
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
136d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PassRefPtr<FrameView> FrameView::create(LocalFrame* frame)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<FrameView> view = adoptRef(new FrameView(frame));
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    view->show();
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return view.release();
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
143d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PassRefPtr<FrameView> FrameView::create(LocalFrame* frame, const IntSize& initialSize)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<FrameView> view = adoptRef(new FrameView(frame));
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    view->Widget::setFrameRect(IntRect(view->location(), initialSize));
147bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    view->setLayoutSizeInternal(initialSize);
148bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    view->show();
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return view.release();
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FrameView::~FrameView()
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_postLayoutTasksTimer.isActive())
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_postLayoutTasksTimer.stop();
157591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
15809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_didScrollTimer.isActive())
15909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_didScrollTimer.stop();
16009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    removeFromAXObjectCache();
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Custom scrollbars should already be destroyed at this point
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!horizontalScrollbar() || !horizontalScrollbar()->isCustomScrollbar());
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!verticalScrollbar() || !verticalScrollbar()->isCustomScrollbar());
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setHasHorizontalScrollbar(false); // Remove native scrollbars now before we lose the connection to the HostWindow.
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setHasVerticalScrollbar(false);
169591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_scrollCorner);
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ASSERT(m_frame);
1738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ASSERT(m_frame->view() != this || !m_frame->contentRenderer());
174f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    // FIXME: Do we need to do something here for OOPI?
175f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    HTMLFrameOwnerElement* ownerElement = m_frame->deprecatedLocalOwner();
176a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (ownerElement && ownerElement->ownedWidget() == this)
177a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        ownerElement->setWidget(nullptr);
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::reset()
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_hasPendingLayout = false;
18309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_layoutSubtreeRoot = 0;
184f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    m_doFullPaintInvalidation = false;
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_layoutSchedulingEnabled = true;
18609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_inPerformLayout = false;
187f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    m_canInvalidatePaintDuringPerformLayout = false;
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inSynchronousPostLayout = false;
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_layoutCount = 0;
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_nestedLayoutCount = 0;
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_postLayoutTasksTimer.stop();
19251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_updateWidgetsTimer.stop();
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_firstLayout = true;
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_firstLayoutCallbackPending = false;
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_wasScrolledByUser = false;
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_safeToPropagateScrollToParent = true;
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastViewportSize = IntSize();
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastZoomFactor = 1.0f;
199f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    m_isTrackingPaintInvalidations = false;
200f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    m_trackedPaintInvalidationRects.clear();
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastPaintTime = 0;
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_paintBehavior = PaintBehaviorNormal;
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isPainting = false;
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_visuallyNonEmptyCharacterCount = 0;
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_visuallyNonEmptyPixelCount = 0;
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isVisuallyNonEmpty = false;
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_firstVisuallyNonEmptyLayoutCallbackPending = true;
208d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_maintainScrollPositionAnchor = nullptr;
20951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_viewportConstrainedObjects.clear();
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void FrameView::removeFromAXObjectCache()
213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (AXObjectCache* cache = axObjectCache()) {
215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        cache->remove(this);
2167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        cache->childrenChanged(m_frame->pagePopupOwner());
2177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::init()
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    reset();
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_size = LayoutSize();
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Propagate the marginwidth/height and scrolling modes to the view.
227f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    // FIXME: Do we need to do this for OOPI?
228f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    Element* ownerElement = m_frame->deprecatedLocalOwner();
229d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (ownerElement && (isHTMLFrameElement(*ownerElement) || isHTMLIFrameElement(*ownerElement))) {
230e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        HTMLFrameElementBase* frameElt = toHTMLFrameElementBase(ownerElement);
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (frameElt->scrollingMode() == ScrollbarAlwaysOff)
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setCanHaveScrollbars(false);
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
235591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void FrameView::prepareForDetach()
237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
23809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    RELEASE_ASSERT(!isInPerformLayout());
2397757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
240fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    if (ScrollAnimator* scrollAnimator = existingScrollAnimator())
241fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        scrollAnimator->cancelAnimations();
242c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    cancelProgrammaticScrollAnimation();
243fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
244926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    detachCustomScrollbars();
245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // When the view is no longer associated with a frame, it needs to be removed from the ax object cache
246926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // right now, otherwise it won't be able to reach the topDocument()'s axObject cache later.
247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    removeFromAXObjectCache();
248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2498abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (m_frame->page()) {
250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (ScrollingCoordinator* scrollingCoordinator = m_frame->page()->scrollingCoordinator())
251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            scrollingCoordinator->willDestroyScrollableArea(this);
252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::detachCustomScrollbars()
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Scrollbar* horizontalBar = horizontalScrollbar();
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (horizontalBar && horizontalBar->isCustomScrollbar())
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setHasHorizontalScrollbar(false);
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Scrollbar* verticalBar = verticalScrollbar();
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (verticalBar && verticalBar->isCustomScrollbar())
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setHasVerticalScrollbar(false);
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_scrollCorner) {
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollCorner->destroy();
267e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        m_scrollCorner = nullptr;
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::recalculateScrollbarOverlayStyle()
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollbarOverlayStyle oldOverlayStyle = scrollbarOverlayStyle();
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollbarOverlayStyle overlayStyle = ScrollbarOverlayStyleDefault;
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2768abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Color backgroundColor = documentBackgroundColor();
27709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Reduce the background color from RGB to a lightness value
27809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // and determine which scrollbar style to use based on a lightness
27909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // heuristic.
28009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    double hue, saturation, lightness;
28109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    backgroundColor.getHSL(hue, saturation, lightness);
28209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (lightness <= .5)
28309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        overlayStyle = ScrollbarOverlayStyleLight;
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (oldOverlayStyle != overlayStyle)
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setScrollbarOverlayStyle(overlayStyle);
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::clear()
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    reset();
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setScrollbarsSuppressed(true);
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::didFirstLayout() const
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !m_firstLayout;
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::invalidateRect(const IntRect& rect)
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // For querying RenderLayer::compositingState() when invalidating scrollbars.
3037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // FIXME: do all scrollbar invalidations after layout of all frames is complete. It's currently not recursively true.
3047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    DisableCompositingQueryAsserts disabler;
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!parent()) {
306521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (HostWindow* window = hostWindow())
307521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            window->invalidateContentsAndRootView(rect);
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderPart* renderer = m_frame->ownerRenderer();
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!renderer)
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    IntRect paintInvalidationRect = rect;
316f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    paintInvalidationRect.move(renderer->borderLeft() + renderer->paddingLeft(),
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     renderer->borderTop() + renderer->paddingTop());
3185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    renderer->invalidatePaintRectangle(paintInvalidationRect);
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setFrameRect(const IntRect& newRect)
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect oldRect = frameRect();
324d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (newRect == oldRect)
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
327926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Autosized font sizes depend on the width of the viewing area.
328aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    bool autosizerNeedsUpdating = false;
329c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (newRect.width() != oldRect.width() && m_frame->isMainFrame() && m_frame->settings()->textAutosizingEnabled())
330c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        autosizerNeedsUpdating = true;
331926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::setFrameRect(newRect);
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateScrollableAreaSet();
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
336aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    if (autosizerNeedsUpdating) {
337aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        // This needs to be after the call to ScrollView::setFrameRect, because it reads the new width.
338c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (TextAutosizer* textAutosizer = m_frame->document()->textAutosizer())
339aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            textAutosizer->updatePageInfoInAllFrames();
340aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    }
341aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
342926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (RenderView* renderView = this->renderView()) {
343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (renderView->usesCompositing())
344926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->compositor()->frameViewDidChangeSize();
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
34609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
347d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    viewportConstrainedVisibleContentSizeChanged(newRect.width() != oldRect.width(), newRect.height() != oldRect.height());
348323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
349323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (oldRect.size() != newRect.size()
350323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        && m_frame->isMainFrame()
351323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        && m_frame->settings()->pinchVirtualViewportEnabled())
352323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        page()->frameHost().pinchViewport().mainFrameDidChangeSize();
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)Page* FrameView::page() const
356d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
357d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return frame().page();
358d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
359d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3608abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)RenderView* FrameView::renderView() const
3618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
3628abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return frame().contentRenderer();
3638abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
3648abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setCanHaveScrollbars(bool canHaveScrollbars)
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_canHaveScrollbars = canHaveScrollbars;
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::setCanHaveScrollbars(canHaveScrollbars);
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
371d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool FrameView::shouldUseCustomScrollbars(Element*& customScrollbarElement, LocalFrame*& customScrollbarFrame)
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
37309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    customScrollbarElement = 0;
37409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    customScrollbarFrame = 0;
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
376926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (Settings* settings = m_frame->settings()) {
37710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        if (!settings->allowCustomScrollbarInMainFrame() && m_frame->isMainFrame())
37809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return false;
379926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
380926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (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).
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* doc = m_frame->document();
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Try the <body> element first as a scrollbar source.
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* body = doc ? doc->body() : 0;
38609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (body && body->renderer() && body->renderer()->style()->hasPseudoStyle(SCROLLBAR)) {
38709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        customScrollbarElement = body;
38809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return true;
38909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
390591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the <body> didn't have a custom style, then the root element might.
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* docElement = doc ? doc->documentElement() : 0;
39309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (docElement && docElement->renderer() && docElement->renderer()->style()->hasPseudoStyle(SCROLLBAR)) {
39409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        customScrollbarElement = docElement;
39509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return true;
39609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
397591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
398d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // If we have an owning ipage/LocalFrame element, then it can set the custom scrollbar also.
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderPart* frameRenderer = m_frame->ownerRenderer();
40009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (frameRenderer && frameRenderer->style()->hasPseudoStyle(SCROLLBAR)) {
40109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        customScrollbarFrame = m_frame.get();
40209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return true;
40309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
40409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
40509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return false;
40609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
40709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
40809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)PassRefPtr<Scrollbar> FrameView::createScrollbar(ScrollbarOrientation orientation)
40909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
41009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Element* customScrollbarElement = 0;
411d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* customScrollbarFrame = 0;
41209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (shouldUseCustomScrollbars(customScrollbarElement, customScrollbarFrame))
41309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return RenderScrollbar::createCustomScrollbar(this, orientation, customScrollbarElement, customScrollbarFrame);
414591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Nobody set a custom style, so we just use a native scrollbar.
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ScrollView::createScrollbar(orientation);
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setContentsSize(const IntSize& size)
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (size == contentsSize())
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::setContentsSize(size);
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::contentsResized();
426591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
4278abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Page* page = frame().page();
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateScrollableAreaSet();
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
433a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    page->chrome().contentsSizeChanged(m_frame.get(), size);
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
436d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)IntPoint FrameView::clampOffsetAtScale(const IntPoint& offset, float scale) const
437d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
438d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    IntPoint maxScrollExtent(contentsSize().width() - scrollOrigin().x(), contentsSize().height() - scrollOrigin().y());
439d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    FloatSize scaledSize = unscaledVisibleContentSize();
440d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (scale)
441d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        scaledSize.scale(1 / scale);
442d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
443d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    IntPoint clampedOffset = offset;
444d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    clampedOffset = clampedOffset.shrunkTo(maxScrollExtent - expandedIntSize(scaledSize));
445d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    clampedOffset = clampedOffset.expandedTo(-scrollOrigin());
446d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
447d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return clampedOffset;
448d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
449d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::adjustViewSize()
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
452926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
453926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame->view() == this);
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
458926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const IntRect rect = renderView->documentRect();
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const IntSize& size = rect.size();
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::setScrollOrigin(IntPoint(-rect.x(), -rect.y()), !m_frame->document()->printing(), size == contentsSize());
461591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setContentsSize(size);
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FrameView::applyOverflowToViewportAndSetRenderer(RenderObject* o, ScrollbarMode& hMode, ScrollbarMode& vMode)
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Handle the overflow:hidden/scroll case for the body/html elements.  WinIE treats
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // overflow:hidden and overflow:scroll on <body> as applying to the document's
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // scrollbars.  The CSS2.1 draft states that HTML UAs should use the <html> or <body> element and XML/XHTML UAs should
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // use the root element.
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EOverflow overflowX = o->style()->overflowX();
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EOverflow overflowY = o->style()->overflowY();
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (o->isSVGRoot()) {
476d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        // Don't allow overflow to affect <img> and css backgrounds
477d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        if (toRenderSVGRoot(o)->isEmbeddedThroughSVGImage())
478d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            return;
479d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
48010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        // FIXME: evaluate if we can allow overflow for these cases too.
48110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        // Overflow is always hidden when stand-alone SVG documents are embedded.
48210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        if (toRenderSVGRoot(o)->isEmbeddedThroughFrameContainingSVGDocument()) {
48310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            overflowX = OHIDDEN;
48410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            overflowY = OHIDDEN;
48510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        }
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    bool ignoreOverflowHidden = false;
48951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_frame->settings()->ignoreMainFrameOverflowHiddenQuirk() && m_frame->isMainFrame())
49006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        ignoreOverflowHidden = true;
49106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (overflowX) {
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case OHIDDEN:
49406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)            if (!ignoreOverflowHidden)
49506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)                hMode = ScrollbarAlwaysOff;
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case OSCROLL:
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            hMode = ScrollbarAlwaysOn;
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case OAUTO:
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            hMode = ScrollbarAuto;
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Don't set it at all.
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ;
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
507591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     switch (overflowY) {
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case OHIDDEN:
51006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)            if (!ignoreOverflowHidden)
51106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)                vMode = ScrollbarAlwaysOff;
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case OSCROLL:
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            vMode = ScrollbarAlwaysOn;
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case OAUTO:
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            vMode = ScrollbarAuto;
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
52009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            // Don't set it at all.
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ;
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_viewportRenderer = o;
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FrameView::calculateScrollbarModesForLayoutAndSetViewportRenderer(ScrollbarMode& hMode, ScrollbarMode& vMode, ScrollbarModesCalculationStrategy strategy)
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_viewportRenderer = 0;
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
531f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    // FIXME: How do we handle this for OOPI?
532f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    const HTMLFrameOwnerElement* owner = m_frame->deprecatedLocalOwner();
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (owner && (owner->scrollingMode() == ScrollbarAlwaysOff)) {
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hMode = ScrollbarAlwaysOff;
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        vMode = ScrollbarAlwaysOff;
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
537591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    }
538591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_canHaveScrollbars || strategy == RulesFromWebContentOnly) {
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hMode = ScrollbarAuto;
54109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        vMode = ScrollbarAuto;
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hMode = ScrollbarAlwaysOff;
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        vMode = ScrollbarAlwaysOff;
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
546591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
54709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!isSubtreeLayout()) {
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Document* document = m_frame->document();
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Node* body = document->body();
550d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (isHTMLFrameSetElement(body) && body->renderer()) {
55109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            vMode = ScrollbarAlwaysOff;
55209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            hMode = ScrollbarAlwaysOff;
55309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        } else if (Element* viewportElement = document->viewportDefiningElement()) {
55409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            if (RenderObject* viewportRenderer = viewportElement->renderer()) {
55509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                if (viewportRenderer->style())
55609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                    applyOverflowToViewportAndSetRenderer(viewportRenderer, hMode, vMode);
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
55809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        }
559591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    }
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5626f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochvoid FrameView::updateAcceleratedCompositingSettings()
5636f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch{
5646f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (RenderView* renderView = this->renderView())
5656f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        renderView->compositor()->updateAcceleratedCompositingSettings();
5666f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch}
5676f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
568f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid FrameView::recalcOverflowAfterStyleChange()
569f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
570f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    RenderView* renderView = this->renderView();
5717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RELEASE_ASSERT(renderView);
572f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (!renderView->needsOverflowRecalcAfterStyleChange())
573f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return;
574f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
575f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    renderView->recalcOverflowAfterStyleChange();
576f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
577c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    IntRect documentRect = renderView->documentRect();
578c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (scrollOrigin() == -documentRect.location() && contentsSize() == documentRect.size())
579c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return;
580c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
5815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (needsLayout())
5825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return;
583f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
5845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    InUpdateScrollbarsScope inUpdateScrollbarsScope(this);
5855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
5865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    bool shouldHaveHorizontalScrollbar = false;
5875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    bool shouldHaveVerticalScrollbar = false;
588c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    computeScrollbarExistence(shouldHaveHorizontalScrollbar, shouldHaveVerticalScrollbar, documentRect.size());
5895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
5905d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    bool hasHorizontalScrollbar = horizontalScrollbar();
5915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    bool hasVerticalScrollbar = verticalScrollbar();
5925d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (hasHorizontalScrollbar != shouldHaveHorizontalScrollbar
5935d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        || hasVerticalScrollbar != shouldHaveVerticalScrollbar) {
5945d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        setNeedsLayout();
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5965d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
5975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
5985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    adjustViewSize();
5995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    updateScrollbarGeometry();
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
602926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool FrameView::usesCompositedScrolling() const
603926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
604926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
605926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
606926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
6079e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (m_frame->settings() && m_frame->settings()->preferCompositingToLCDTextEnabled())
60810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        return renderView->compositor()->inCompositingMode();
609926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return false;
610926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
611926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
612926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)GraphicsLayer* FrameView::layerForScrolling() const
613926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
614926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
615926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
616926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
617926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return renderView->compositor()->scrollLayer();
618926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
619926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GraphicsLayer* FrameView::layerForHorizontalScrollbar() const
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
622926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
623926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
625926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return renderView->compositor()->layerForHorizontalScrollbar();
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GraphicsLayer* FrameView::layerForVerticalScrollbar() const
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
630926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
631926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
633926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return renderView->compositor()->layerForVerticalScrollbar();
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GraphicsLayer* FrameView::layerForScrollCorner() const
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
638926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
639926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
641926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return renderView->compositor()->layerForScrollCorner();
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isEnclosedInCompositingLayer() const
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
646f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    // FIXME: It's a bug that compositing state isn't always up to date when this is called. crbug.com/366314
647f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    DisableCompositingQueryAsserts disabler;
648f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* frameOwnerRenderer = m_frame->ownerRenderer();
650197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return frameOwnerRenderer && frameOwnerRenderer->enclosingLayer()->enclosingLayerForPaintInvalidationCrossingFrameBoundaries();
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
652591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderObject* FrameView::layoutRoot(bool onlyDuringLayout) const
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
65509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return onlyDuringLayout && layoutPending() ? 0 : m_layoutSubtreeRoot;
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void FrameView::forceLayoutParentViewIfNeeded()
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderPart* ownerRenderer = m_frame->ownerRenderer();
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!ownerRenderer || !ownerRenderer->frame())
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderBox* contentBox = embeddedContentBox();
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!contentBox)
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderSVGRoot* svgRoot = toRenderSVGRoot(contentBox);
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (svgRoot->everHadLayout() && !svgRoot->needsLayout())
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the embedded SVG document appears the first time, the ownerRenderer has already finished
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // layout without knowing about the existence of the embedded SVG document, because RenderReplaced
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // embeddedContentBox() returns 0, as long as the embedded document isn't loaded yet. Before
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // bothering to lay out the SVG document, mark the ownerRenderer needing layout and ask its
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FrameView for a layout. After that the RenderEmbeddedObject (ownerRenderer) carries the
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // correct size, which RenderSVGRoot::computeReplacedLogicalWidth/Height rely on, when laying
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // out for the first time, or when the RenderSVGRoot size has changed dynamically (eg. via <script>).
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<FrameView> frameView = ownerRenderer->frame()->view();
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Mark the owner renderer as needing layout.
6825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    ownerRenderer->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation();
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Synchronously enter layout, to layout the view containing the host object/embed/iframe.
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frameView);
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frameView->layout();
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
689e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void FrameView::performPreLayoutTasks()
690e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
691197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    TRACE_EVENT0("blink", "FrameView::performPreLayoutTasks");
69209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    lifecycle().advanceTo(DocumentLifecycle::InPreLayout);
69309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
694e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // Don't schedule more layouts, we're in one.
695e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    TemporaryChange<bool> changeSchedulingEnabled(m_layoutSchedulingEnabled, false);
696e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
69709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_nestedLayoutCount && !m_inSynchronousPostLayout && m_postLayoutTasksTimer.isActive()) {
698e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        // This is a new top-level layout. If there are any remaining tasks from the previous layout, finish them now.
699e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        m_inSynchronousPostLayout = true;
700e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        performPostLayoutTasks();
701e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        m_inSynchronousPostLayout = false;
702e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
703e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
704e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    Document* document = m_frame->document();
7057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (wasViewportResized())
7067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        document->notifyResizeForViewportUnits();
70709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
70809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Viewport-dependent media queries may cause us to need completely different style information.
70909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!document->styleResolver() || document->styleResolver()->mediaQueryAffectedByViewportChange()) {
710d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        document->styleResolverChanged();
71151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        document->mediaQueryAffectingValueChanged();
71251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
713e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        // FIXME: This instrumentation event is not strictly accurate since cached media query results
714e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        //        do not persist across StyleResolver rebuilds.
715e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        InspectorInstrumentation::mediaQueryResultChanged(document);
716e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    } else {
717e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        document->evaluateMediaQueryList();
718e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
719e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
72007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    document->updateRenderTreeIfNeeded();
72109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    lifecycle().advanceTo(DocumentLifecycle::StyleClean);
722e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
723e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
724e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void FrameView::performLayout(RenderObject* rootForThisLayout, bool inSubtreeLayout)
725e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
726197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    TRACE_EVENT0("blink", "FrameView::performLayout");
72709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
728f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    ScriptForbiddenScope forbidScript;
729f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
73009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT(!isInPerformLayout());
73109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    lifecycle().advanceTo(DocumentLifecycle::InPerformLayout);
73209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
73309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    TemporaryChange<bool> changeInPerformLayout(m_inPerformLayout, true);
73409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
735e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // performLayout is the actual guts of layout().
736e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // FIXME: The 300 other lines in layout() probably belong in other helper functions
737e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // so that a single human could understand what layout() is actually doing.
7381e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
7395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    LayoutState layoutState(*rootForThisLayout);
7405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
741d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    forceLayoutParentViewIfNeeded();
742e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
743d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // FIXME (crbug.com/256657): Do not do two layouts for text autosizing.
744d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    rootForThisLayout->layout();
745d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    gatherDebugLayoutRects(rootForThisLayout);
7468abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
747d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()->updateAllImageResourcePriorities();
748e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
74909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    lifecycle().advanceTo(DocumentLifecycle::AfterPerformLayout);
750e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
751e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
752e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void FrameView::scheduleOrPerformPostLayoutTasks()
753e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
75451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_postLayoutTasksTimer.isActive())
755e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return;
756e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
757e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (!m_inSynchronousPostLayout) {
75809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_inSynchronousPostLayout = true;
75909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // Calls resumeScheduledEvents()
76009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        performPostLayoutTasks();
76109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_inSynchronousPostLayout = false;
762e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
763e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
76409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_postLayoutTasksTimer.isActive() && (needsLayout() || m_inSynchronousPostLayout)) {
765e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        // If we need layout or are already in a synchronous call to postLayoutTasks(),
766e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        // defer widget updates and event dispatch until after we return. postLayoutTasks()
767e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        // can make us need to update again, and we can get stuck in a nasty cycle unless
768e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        // we call it through the timer here.
769d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_postLayoutTasksTimer.startOneShot(0, FROM_HERE);
770d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (needsLayout())
771e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            layout();
772e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
773e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
774e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::layout(bool allowSubtree)
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
777d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // We should never layout a Document which is not in a LocalFrame.
7787757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    ASSERT(m_frame);
7797757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    ASSERT(m_frame->view() == this);
7807757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    ASSERT(m_frame->page());
7817757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
782197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    ScriptForbiddenScope forbidScript;
783197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
78409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (isInPerformLayout() || !m_frame->document()->isActive())
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
787197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    TRACE_EVENT0("blink", "FrameView::layout");
788197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    TRACE_EVENT_SCOPED_SAMPLING_STATE("blink", "Layout");
789926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Protect the view from being deleted during layout (in recalcStyle)
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<FrameView> protector(this);
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
793926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Every scroll that happens during layout is programmatic.
794926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    TemporaryChange<bool> changeInProgrammaticScroll(m_inProgrammaticScroll, true);
795926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_autoSizeInfo)
7977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_autoSizeInfo->autoSizeIfNeeded();
7987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
79909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_hasPendingLayout = false;
80009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    DocumentLifecycle::Scope lifecycleScope(lifecycle(), DocumentLifecycle::LayoutClean);
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
80209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    RELEASE_ASSERT(!isPainting());
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
804f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    TRACE_EVENT_BEGIN1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Layout", "beginData", InspectorLayoutEvent::beginData(this));
805323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.stack"), "CallStack", "stack", InspectorCallStackEvent::currentCallStack());
806f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeline migrates to tracing.
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InspectorInstrumentationCookie cookie = InspectorInstrumentation::willLayout(m_frame.get());
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
80909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!allowSubtree && isSubtreeLayout()) {
81009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_layoutSubtreeRoot->markContainingBlocksForLayout(false);
81109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_layoutSubtreeRoot = 0;
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
814e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    performPreLayoutTasks();
8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
816e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // If there is only one ref to this view left, then its going to be destroyed as soon as we exit,
817e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // so there's no point to continuing to layout
818e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (protector->hasOneRef())
819e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return;
8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
821e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    Document* document = m_frame->document();
82209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    bool inSubtreeLayout = isSubtreeLayout();
823d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RenderObject* rootForThisLayout = inSubtreeLayout ? m_layoutSubtreeRoot : document->renderView();
824e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (!rootForThisLayout) {
825e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        // FIXME: Do we need to set m_size here?
826e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        ASSERT_NOT_REACHED();
827e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return;
828e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FontCachePurgePreventer fontCachePurgePreventer;
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderLayer* layer;
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TemporaryChange<bool> changeSchedulingEnabled(m_layoutSchedulingEnabled, false);
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_nestedLayoutCount++;
83609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!inSubtreeLayout) {
83719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            Document* document = m_frame->document();
83819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            Node* body = document->body();
83919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            if (body && body->renderer()) {
840d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                if (isHTMLFrameSetElement(*body)) {
84119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                    body->renderer()->setChildNeedsLayout();
842d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                } else if (isHTMLBodyElement(*body)) {
84319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                    if (!m_firstLayout && m_size.height() != layoutSize().height() && body->renderer()->enclosingBox()->stretchesToViewport())
84419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                        body->renderer()->setChildNeedsLayout();
84519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                }
84619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            }
84719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        }
8488abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        updateCounters();
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ScrollbarMode hMode;
851591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        ScrollbarMode vMode;
85209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        calculateScrollbarModesForLayoutAndSetViewportRenderer(hMode, vMode);
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
854d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!inSubtreeLayout) {
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Now set our scrollbar state for the layout.
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ScrollbarMode currentHMode = horizontalScrollbarMode();
8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ScrollbarMode currentVMode = verticalScrollbarMode();
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
859d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (m_firstLayout) {
860d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                setScrollbarsSuppressed(true);
861d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
862f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                m_doFullPaintInvalidation = true;
863d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_firstLayout = false;
864d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_firstLayoutCallbackPending = true;
865d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_lastViewportSize = layoutSize(IncludeScrollbars);
866d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_lastZoomFactor = rootForThisLayout->style()->zoom();
867d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
868d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                // Set the initial vMode to AlwaysOn if we're auto.
869d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                if (vMode == ScrollbarAuto)
870d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    setVerticalScrollbarMode(ScrollbarAlwaysOn); // This causes a vertical scrollbar to appear.
871d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                // Set the initial hMode to AlwaysOff if we're auto.
872d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                if (hMode == ScrollbarAuto)
873d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    setHorizontalScrollbarMode(ScrollbarAlwaysOff); // This causes a horizontal scrollbar to disappear.
874d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
875d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                setScrollbarModes(hMode, vMode);
876d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                setScrollbarsSuppressed(false, true);
877d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            } else if (hMode != currentHMode || vMode != currentVMode) {
878d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                setScrollbarModes(hMode, vMode);
8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutSize oldSize = m_size;
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
883bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            m_size = LayoutSize(layoutSize().width(), layoutSize().height());
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
885d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            if (oldSize != m_size && !m_firstLayout) {
886d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                RenderBox* rootRenderer = document->documentElement() ? document->documentElement()->renderBox() : 0;
887d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                RenderBox* bodyRenderer = rootRenderer && document->body() ? document->body()->renderBox() : 0;
888d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                if (bodyRenderer && bodyRenderer->stretchesToViewport())
889d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                    bodyRenderer->setChildNeedsLayout();
890d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                else if (rootRenderer && rootRenderer->stretchesToViewport())
891d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                    rootRenderer->setChildNeedsLayout();
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
893d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
8945d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            // We need to set m_doFullPaintInvalidation before triggering layout as RenderObject::checkForPaintInvalidation
895f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            // checks the boolean to disable local paint invalidations.
896c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            m_doFullPaintInvalidation |= renderView()->shouldDoFullPaintInvalidationForNextLayout();
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8997757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        layer = rootForThisLayout->enclosingLayer();
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
901e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        performLayout(rootForThisLayout, inSubtreeLayout);
90251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
90309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_layoutSubtreeRoot = 0;
904197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // We need to ensure that we mark up all renderers up to the RenderView
905197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // for paint invalidation. This simplifies our code as we just always
906197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // do a full tree walk.
907197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (RenderObject* container = rootForThisLayout->container())
908197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            container->setMayNeedPaintInvalidation(true);
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } // Reset m_layoutSchedulingEnabled to its previous value.
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
911d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!inSubtreeLayout && !toRenderView(rootForThisLayout)->document().printing())
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        adjustViewSize();
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
914c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    layer->updateLayerPositionsAfterLayout();
915c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
9165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    renderView()->compositor()->didLayout();
91753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_layoutCount++;
9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
920f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (AXObjectCache* cache = rootForThisLayout->document().axObjectCache()) {
921f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        const KURL& url = rootForThisLayout->document().url();
922f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        if (url.isValid() && !url.isAboutBlankURL())
923f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            cache->handleLayoutComplete(rootForThisLayout);
924f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    }
9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateAnnotatedRegions();
92653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
927d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(!rootForThisLayout->needsLayout());
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (document->hasListenerType(Document::OVERFLOWCHANGED_LISTENER))
930bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        updateOverflowStatus(layoutSize().width() < contentsWidth(), layoutSize().height() < contentsHeight());
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
932e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    scheduleOrPerformPostLayoutTasks();
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
934f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    TRACE_EVENT_END1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Layout", "endData", InspectorLayoutEvent::endData(rootForThisLayout));
935f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeline migrates to tracing.
9367757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    InspectorInstrumentation::didLayout(cookie, rootForThisLayout);
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_nestedLayoutCount--;
9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_nestedLayoutCount)
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
942197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
943f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // Post-layout assert that nobody was re-marked as needing layout during layout.
944d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    document->renderView()->assertSubtreeIsLaidOut();
945f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)#endif
946f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
9477757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // FIXME: It should be not possible to remove the FrameView from the frame/page during layout
94809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // however m_inPerformLayout is not set for most of this function, so none of our RELEASE_ASSERTS
949d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // in LocalFrame/Page will fire. One of the post-layout tasks is disconnecting the LocalFrame from
9507757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // the page in fast/frames/crash-remove-iframe-during-object-beforeload-2.html
9517757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // necessitating this check here.
9527757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // ASSERT(frame()->page());
9538abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (frame().page())
9548abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        frame().page()->chrome().client().layoutUpdated(m_frame.get());
95553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
95653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
957f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)// The plan is to move to compositor-queried paint invalidation, in which case this
95851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)// method would setNeedsRedraw on the GraphicsLayers with invalidations and
95951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)// let the compositor pick which to actually draw.
96051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)// See http://crbug.com/306706
961197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid FrameView::invalidateTreeIfNeeded()
96251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
9637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(renderView());
9649e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    RenderView& rootForPaintInvalidation = *renderView();
9659e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    ASSERT(!rootForPaintInvalidation.needsLayout());
966aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
9679e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    TRACE_EVENT1("blink", "FrameView::invalidateTree", "root", rootForPaintInvalidation.debugName().ascii());
96851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
9699e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    PaintInvalidationState rootPaintInvalidationState(rootForPaintInvalidation);
97007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
971a372c30a9dc26aa32e51fa7b85e0c47b55479f89Ben Murdoch    if (m_doFullPaintInvalidation)
972a372c30a9dc26aa32e51fa7b85e0c47b55479f89Ben Murdoch        renderView()->compositor()->fullyInvalidatePaint();
973a372c30a9dc26aa32e51fa7b85e0c47b55479f89Ben Murdoch
9749e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    rootForPaintInvalidation.invalidateTreeIfNeeded(rootPaintInvalidationState);
97509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
976f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    // Invalidate the paint of the frameviews scrollbars if needed
97709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (hasVerticalBarDamage())
97809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        invalidateRect(verticalBarDamage());
97909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (hasHorizontalBarDamage())
98009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        invalidateRect(horizontalBarDamage());
98109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    resetScrollbarDamage();
982197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
983a372c30a9dc26aa32e51fa7b85e0c47b55479f89Ben Murdoch
984c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#ifndef NDEBUG
985c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    renderView()->assertSubtreeClearedPaintInvalidationState();
986c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#endif
987e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
988e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (m_frame->selection().isCaretBoundsDirty())
989e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        m_frame->selection().invalidateCaretRect();
99009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
99109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
99209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)DocumentLifecycle& FrameView::lifecycle() const
99309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
99409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return m_frame->document()->lifecycle();
995a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
996a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
997a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void FrameView::gatherDebugLayoutRects(RenderObject* layoutRoot)
998a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
999a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    bool isTracing;
1000a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("blink.debug.layout"), &isTracing);
1001a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!isTracing)
1002a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
1003a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!layoutRoot->enclosingLayer()->hasCompositedLayerMapping())
1004a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
1005197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // For access to compositedLayerMapping().
1006197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    DisableCompositingQueryAsserts disabler;
1007a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    GraphicsLayer* graphicsLayer = layoutRoot->enclosingLayer()->compositedLayerMapping()->mainGraphicsLayer();
1008a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!graphicsLayer)
1009a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
1010a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
101109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    GraphicsLayerDebugInfo& debugInfo = graphicsLayer->debugInfo();
101209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
101309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    debugInfo.currentLayoutRects().clear();
1014a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    for (RenderObject* renderer = layoutRoot; renderer; renderer = renderer->nextInPreOrder()) {
1015a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (renderer->layoutDidGetCalled()) {
1016f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            FloatQuad quad = renderer->localToAbsoluteQuad(FloatQuad(renderer->previousPaintInvalidationRect()));
101709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            LayoutRect rect = quad.enclosingBoundingBox();
101809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            debugInfo.currentLayoutRects().append(rect);
1019a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            renderer->setLayoutDidGetCalled(false);
1020a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        }
1021a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
102251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
102351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderBox* FrameView::embeddedContentBox() const
10255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1026926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
1027926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
10295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1030926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderObject* firstChild = renderView->firstChild();
1031926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!firstChild || !firstChild->isBox())
10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Curently only embedded SVG documents participate in the size-negotiation logic.
1035926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (firstChild->isSVGRoot())
1036926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return toRenderBox(firstChild);
10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
104109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
104209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FrameView::addWidget(RenderWidget* object)
104309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
104409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_widgets.add(object);
104509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
104609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
104709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FrameView::removeWidget(RenderWidget* object)
104809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
104909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_widgets.remove(object);
105009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
105109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
105209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FrameView::updateWidgetPositions()
105309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
1054e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WillBeHeapVector<RefPtrWillBeMember<RenderWidget> > widgets;
105509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    copyToVector(m_widgets, widgets);
105609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
105709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Script or plugins could detach the frame so abort processing if that happens.
105809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
105909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    for (size_t i = 0; i < widgets.size() && renderView(); ++i)
106009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        widgets[i]->updateWidgetPosition();
106109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
106209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    for (size_t i = 0; i < widgets.size() && renderView(); ++i)
106309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        widgets[i]->widgetPositionsUpdated();
106409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
106509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1066a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void FrameView::addWidgetToUpdate(RenderEmbeddedObject& object)
10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1068d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(isInPerformLayout());
10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Tell the DOM element that it needs a widget update.
1070a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    Node* node = object.node();
1071d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(node);
1072d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isHTMLObjectElement(*node) || isHTMLEmbedElement(*node))
1073f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        toHTMLPlugInElement(node)->setNeedsWidgetUpdate(true);
10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1075a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_widgetUpdateSet.add(&object);
10765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1078591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid FrameView::setMediaType(const AtomicString& mediaType)
10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
108051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ASSERT(m_frame->document());
108151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_frame->document()->mediaQueryAffectingValueChanged();
10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mediaType = mediaType;
10835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1085591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochAtomicString FrameView::mediaType() const
10865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // See if we have an override type.
108853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    String overrideType;
1089926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    InspectorInstrumentation::applyEmulatedMedia(m_frame.get(), &overrideType);
10905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!overrideType.isNull())
109109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return AtomicString(overrideType);
10925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_mediaType;
10935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::adjustMediaTypeForPrinting(bool printing)
10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (printing) {
10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_mediaTypeWhenNotPrinting.isNull())
10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_mediaTypeWhenNotPrinting = mediaType();
11007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            setMediaType(MediaTypeNames::print);
11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_mediaTypeWhenNotPrinting.isNull())
11035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setMediaType(m_mediaTypeWhenNotPrinting);
1104591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        m_mediaTypeWhenNotPrinting = nullAtom;
11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::contentsInCompositedLayer() const
11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
1111bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (renderView && renderView->compositingState() == PaintsIntoOwnBacking) {
11121e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        GraphicsLayer* layer = renderView->layer()->compositedLayerMapping()->mainGraphicsLayer();
11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (layer && layer->drawsContent())
11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
11155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
111653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
11175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::addSlowRepaintObject()
11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_slowRepaintObjectCount++) {
11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Page* page = m_frame->page()) {
11245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())
11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                scrollingCoordinator->frameViewHasSlowRepaintObjectsDidChange(this);
11265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::removeSlowRepaintObject()
11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_slowRepaintObjectCount > 0);
11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_slowRepaintObjectCount--;
11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_slowRepaintObjectCount) {
11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Page* page = m_frame->page()) {
11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())
11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                scrollingCoordinator->frameViewHasSlowRepaintObjectsDidChange(this);
11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::addViewportConstrainedObject(RenderObject* object)
11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_viewportConstrainedObjects)
11455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_viewportConstrainedObjects = adoptPtr(new ViewportConstrainedObjectSet);
11465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_viewportConstrainedObjects->contains(object)) {
11485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_viewportConstrainedObjects->add(object);
11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Page* page = m_frame->page()) {
11515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())
11525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                scrollingCoordinator->frameViewFixedObjectsDidChange(this);
11535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
11545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::removeViewportConstrainedObject(RenderObject* object)
11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_viewportConstrainedObjects && m_viewportConstrainedObjects->contains(object)) {
11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_viewportConstrainedObjects->remove(object);
1161d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Page* page = m_frame->page()) {
11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())
11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                scrollingCoordinator->frameViewFixedObjectsDidChange(this);
11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)LayoutRect FrameView::viewportConstrainedVisibleContentRect() const
1170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayoutRect viewportRect = visibleContentRect();
117253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // Ignore overhang. No-op when not using rubber banding.
117353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    viewportRect.setLocation(clampScrollPosition(scrollPosition()));
1174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return viewportRect;
1175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1177d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void FrameView::viewportConstrainedVisibleContentSizeChanged(bool widthChanged, bool heightChanged)
117809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
1179d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (!hasViewportConstrainedObjects())
1180d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return;
1181d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
118209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // If viewport is not enabled, frameRect change will cause layout size change and then layout.
118309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Otherwise, viewport constrained objects need their layout flags set separately to ensure
1184d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // they are positioned correctly. In the virtual-viewport pinch mode frame rect changes wont
1185d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // necessarily cause a layout size change so only take this early-out if we're in old-style
1186d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // pinch.
1187d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (m_frame->settings()
1188d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        && !m_frame->settings()->viewportEnabled()
1189d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        && !m_frame->settings()->pinchVirtualViewportEnabled())
119009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
119109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
119209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ViewportConstrainedObjectSet::const_iterator end = m_viewportConstrainedObjects->end();
119309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    for (ViewportConstrainedObjectSet::const_iterator it = m_viewportConstrainedObjects->begin(); it != end; ++it) {
119409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        RenderObject* renderer = *it;
119509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        RenderStyle* style = renderer->style();
119609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (widthChanged) {
119709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            if (style->width().isFixed() && (style->left().isAuto() || style->right().isAuto()))
119809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                renderer->setNeedsPositionedMovementLayout();
119909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            else
12005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                renderer->setNeedsLayoutAndFullPaintInvalidation();
120109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        }
120209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (heightChanged) {
120309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            if (style->height().isFixed() && (style->top().isAuto() || style->bottom().isAuto()))
120409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                renderer->setNeedsPositionedMovementLayout();
120509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            else
12065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                renderer->setNeedsLayoutAndFullPaintInvalidation();
120709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        }
120809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
120909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
1210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
12115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntSize FrameView::scrollOffsetForFixedPosition() const
12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
121353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return toIntSize(clampScrollPosition(scrollPosition()));
12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)IntPoint FrameView::lastKnownMousePosition() const
12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1218f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return m_frame->eventHandler().lastKnownMousePosition();
12195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12211e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)bool FrameView::shouldSetCursor() const
12221e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
12231e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    Page* page = frame().page();
122410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return page && page->visibilityState() != PageVisibilityStateHidden && page->focusController().isActive() && page->settings().deviceSupportsMouse();
12251e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
12261e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
122707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid FrameView::scrollContentsIfNeededRecursive()
122807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
122907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    scrollContentsIfNeeded();
123007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
12315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    for (Frame* child = m_frame->tree().firstChild(); child; child = child->tree().nextSibling()) {
12325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (!child->isLocalFrame())
12335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            continue;
12345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (FrameView* view = toLocalFrame(child)->view())
123507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            view->scrollContentsIfNeededRecursive();
123607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
123707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
123807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
1239018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdochvoid FrameView::scrollContentsIfNeeded()
124007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
1241018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    bool didScroll = !pendingScrollDelta().isZero();
1242018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    ScrollView::scrollContentsIfNeeded();
1243018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    if (didScroll)
1244018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        updateFixedElementPaintInvalidationRectsAfterScroll();
1245018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch}
12467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1247018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdochstatic LayoutRect paintInvalidationRectIncludingNonCompositingDescendants(const RenderLayer* layer)
1248018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch{
1249018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    LayoutRect paintInvalidationRect = layer->renderer()->previousPaintInvalidationRect();
1250018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch
1251018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    for (const RenderLayer* child = layer->firstChild(); child; child = child->nextSibling()) {
12527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // Don't include paint invalidation rects for composited child layers; they will paint themselves and have a different origin.
1253018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        if (child->compositingState() == PaintsIntoOwnBacking || child->compositingState() == PaintsIntoGroupedBacking)
12547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            continue;
12557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1256018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        paintInvalidationRect.unite(paintInvalidationRectIncludingNonCompositingDescendants(child));
12577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1258018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    return paintInvalidationRect;
125907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
126007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
12619e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)bool FrameView::scrollContentsFastPath(const IntSize& scrollDelta)
12625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1263e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!contentsInCompositedLayer() || hasSlowRepaintObjects())
1264e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return false;
1265197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
12665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_viewportConstrainedObjects || m_viewportConstrainedObjects->isEmpty()) {
12677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        InspectorInstrumentation::didScroll(page());
12685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
12695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1271018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    Region regionToUpdate;
12725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ViewportConstrainedObjectSet::const_iterator end = m_viewportConstrainedObjects->end();
12735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (ViewportConstrainedObjectSet::const_iterator it = m_viewportConstrainedObjects->begin(); it != end; ++it) {
12745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderObject* renderer = *it;
127507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        ASSERT(renderer->style()->hasViewportConstrainedPosition());
12765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(renderer->hasLayer());
12775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderLayer* layer = toRenderBoxModelObject(renderer)->layer();
127853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1279018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        CompositingState state = layer->compositingState();
1280018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        if (state == PaintsIntoOwnBacking || state == PaintsIntoGroupedBacking)
12819e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            continue;
12829e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
12839e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        if (layer->subtreeIsInvisible())
12849bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            continue;
12859bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
12869e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        // If the fixed layer has a blur/drop-shadow filter applied on at least one of its parents, we cannot
12879e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        // scroll using the fast path, otherwise the outsets of the filter will be moved around the page.
12889e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        if (layer->hasAncestorWithFilterOutsets())
12895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
12909bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
1291018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        IntRect updateRect = pixelSnappedIntRect(paintInvalidationRectIncludingNonCompositingDescendants(layer));
1292018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch
1293018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        const RenderLayerModelObject* repaintContainer = layer->renderer()->containerForPaintInvalidation();
1294018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        if (repaintContainer && !repaintContainer->isRenderView()) {
1295018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch            // Invalidate the old and new locations of fixed position elements that are not drawn into the RenderView.
1296018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch            updateRect.moveBy(scrollPosition());
1297018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch            IntRect previousRect = updateRect;
1298018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch            previousRect.move(scrollDelta);
1299018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch            // FIXME: Rather than uniting the rects, we should just issue both invalidations.
1300018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch            updateRect.unite(previousRect);
1301018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch            layer->renderer()->invalidatePaintUsingContainer(repaintContainer, updateRect, InvalidationScroll);
1302018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        } else {
1303018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch            // Coalesce the paint invalidations that will be issued to the renderView.
1304018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch            updateRect = contentsToRootView(updateRect);
1305018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch            if (!updateRect.isEmpty())
1306018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch                regionToUpdate.unite(updateRect);
1307018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        }
13085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    InspectorInstrumentation::didScroll(page());
1311018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch
1312018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    // Invalidate the old and new locations of fixed position elements that are drawn into the RenderView.
1313018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    Vector<IntRect> subRectsToUpdate = regionToUpdate.rects();
1314018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    size_t viewportConstrainedObjectsCount = subRectsToUpdate.size();
1315018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    for (size_t i = 0; i < viewportConstrainedObjectsCount; ++i) {
1316018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        IntRect updateRect = subRectsToUpdate[i];
1317018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        IntRect scrolledRect = updateRect;
1318018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        scrolledRect.move(-scrollDelta);
1319018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        updateRect.unite(scrolledRect);
1320018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        // FIXME: We should be able to issue these invalidations separately and before we actually scroll.
1321018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        renderView()->setBackingNeedsPaintInvalidationInRect(rootViewToContents(updateRect));
1322018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    }
1323018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch
13245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
13255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scrollContentsSlowPath(const IntRect& updateRect)
13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (contentsInCompositedLayer()) {
13305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect updateRect = visibleContentRect();
1331926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(renderView());
13327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        renderView()->invalidatePaintRectangle(updateRect);
13335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (RenderPart* frameRenderer = m_frame->ownerRenderer()) {
13355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isEnclosedInCompositingLayer()) {
13365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutRect rect(frameRenderer->borderLeft() + frameRenderer->paddingLeft(),
13375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            frameRenderer->borderTop() + frameRenderer->paddingTop(),
13385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            visibleWidth(), visibleHeight());
13395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            frameRenderer->invalidatePaintRectangle(rect);
13405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
13415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
13425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::scrollContentsSlowPath(updateRect);
13455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::restoreScrollbar()
13485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setScrollbarsSuppressed(false);
13505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::scrollToFragment(const KURL& url)
13535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If our URL has no ref, then we have no place we need to jump to.
13555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // OTOH If CSS target was set previously, we want to set it to 0, recalc
1356f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    // and possibly paint invalidation because :target pseudo class may have been
13575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // set (see bug 11321).
13585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!url.hasFragmentIdentifier() && !m_frame->document()->cssTarget())
13595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
13605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String fragmentIdentifier = url.fragmentIdentifier();
13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (scrollToAnchor(fragmentIdentifier))
13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
13645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Try again after decoding the ref, based on the document's encoding.
1366c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    if (m_frame->document()->encoding().isValid())
1367c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        return scrollToAnchor(decodeURLEscapeSequences(fragmentIdentifier, m_frame->document()->encoding()));
13685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::scrollToAnchor(const String& name)
13735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame->document());
13755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1376a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (!m_frame->document()->isRenderingReady()) {
13775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_frame->document()->setGotoAnchorNeededAfterStylesheetsLoad(true);
13785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
13795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame->document()->setGotoAnchorNeededAfterStylesheetsLoad(false);
13825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* anchorNode = m_frame->document()->findAnchor(name);
13845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Setting to null will clear the current target.
13865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame->document()->setCSSTarget(anchorNode);
13875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frame->document()->isSVGDocument()) {
1389323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        if (SVGSVGElement* svg = SVGDocumentExtensions::rootElement(*m_frame->document())) {
13905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            svg->setupInitialView(name, anchorNode);
13915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!anchorNode)
13925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return true;
13935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
13945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1395591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
13965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Implement the rule that "" and "top" both mean top of page as in other browsers.
13975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!anchorNode && !(name.isEmpty() || equalIgnoringCase(name, "top")))
13985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
13995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    maintainScrollPositionAtAnchor(anchorNode ? static_cast<Node*>(anchorNode) : m_frame->document());
140153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
140253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // If the anchor accepts keyboard focus, move focus there to aid users relying on keyboard navigation.
1403f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch    // If anchorNode is not focusable, setFocusedElement() will still clear focus, which matches the behavior of other browsers.
1404f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch    if (anchorNode)
1405e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        m_frame->document()->setFocusedElement(anchorNode);
140653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::maintainScrollPositionAtAnchor(Node* anchorNode)
14115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_maintainScrollPositionAnchor = anchorNode;
14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_maintainScrollPositionAnchor)
14145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
14155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We need to update the layout before scrolling, otherwise we could
14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // really mess things up if an anchor scroll comes at a bad moment.
141807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    m_frame->document()->updateRenderTreeIfNeeded();
14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Only do a layout if changes have occurred that make it necessary.
1420926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
1421926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (renderView && renderView->needsLayout())
14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        layout();
14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        scrollToAnchor();
14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scrollElementToRect(Element* element, const IntRect& rect)
14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1429d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // FIXME(http://crbug.com/371896) - This method shouldn't be manually doing
1430d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // coordinate transformations to the PinchViewport.
1431d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    IntRect targetRect(rect);
1432d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame->document()->updateLayoutIgnorePendingStylesheets();
14345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1435d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    bool pinchVirtualViewportEnabled = m_frame->settings()->pinchVirtualViewportEnabled();
1436d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1437d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (pinchVirtualViewportEnabled) {
1438d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        PinchViewport& pinchViewport = m_frame->page()->frameHost().pinchViewport();
1439d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1440d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        IntSize pinchViewportSize = expandedIntSize(pinchViewport.visibleRect().size());
1441d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        targetRect.moveBy(ceiledIntPoint(pinchViewport.visibleRect().location()));
1442d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        targetRect.setSize(pinchViewportSize.shrunkTo(targetRect.size()));
1443d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    }
1444d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect bounds = element->boundingBox();
1446d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    int centeringOffsetX = (targetRect.width() - bounds.width()) / 2;
1447d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    int centeringOffsetY = (targetRect.height() - bounds.height()) / 2;
1448d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1449d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    IntPoint targetOffset(
1450d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        bounds.x() - centeringOffsetX - targetRect.x(),
1451d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        bounds.y() - centeringOffsetY - targetRect.y());
1452d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1453d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    setScrollPosition(targetOffset);
1454d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1455d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (pinchVirtualViewportEnabled) {
1456d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        IntPoint remainder = IntPoint(targetOffset - scrollPosition());
1457d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_frame->page()->frameHost().pinchViewport().move(remainder);
1458d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    }
14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1461c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void FrameView::setScrollPosition(const IntPoint& scrollPoint, ScrollBehavior scrollBehavior)
14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1463c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    cancelProgrammaticScrollAnimation();
14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TemporaryChange<bool> changeInProgrammaticScroll(m_inProgrammaticScroll, true);
1465d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_maintainScrollPositionAnchor = nullptr;
14665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1467926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    IntPoint newScrollPosition = adjustScrollPositionWithinRange(scrollPoint);
1468926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1469926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (newScrollPosition == scrollPosition())
1470926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
1471926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1472c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (scrollBehavior == ScrollBehaviorAuto) {
1473c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        RenderObject* renderer = m_frame->document()->documentElement() ? m_frame->document()->documentElement()->renderer() : 0;
1474c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (renderer)
1475c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            scrollBehavior = renderer->style()->scrollBehavior();
1476c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        else
1477c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            scrollBehavior = ScrollBehaviorInstant;
1478c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1479c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ScrollView::setScrollPosition(newScrollPosition, scrollBehavior);
14805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void FrameView::setScrollPositionNonProgrammatically(const IntPoint& scrollPoint)
14835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
14845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    IntPoint newScrollPosition = adjustScrollPositionWithinRange(scrollPoint);
14855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
14865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (newScrollPosition == scrollPosition())
14875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return;
14885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
14895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    TemporaryChange<bool> changeInProgrammaticScroll(m_inProgrammaticScroll, false);
14905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    notifyScrollPositionChanged(newScrollPosition);
14915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
14925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1493bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)IntSize FrameView::layoutSize(IncludeScrollbarsInRect scrollbarInclusion) const
1494bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
1495bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return scrollbarInclusion == ExcludeScrollbars ? excludeScrollbars(m_layoutSize) : m_layoutSize;
1496bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
1497bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
1498bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void FrameView::setLayoutSize(const IntSize& size)
1499bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
1500bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ASSERT(!layoutSizeFixedToFrameSize());
1501bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
1502bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    setLayoutSizeInternal(size);
1503bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
15045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scrollPositionChanged()
15065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
150709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setWasScrolledByUser(true);
150809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
150909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Document* document = m_frame->document();
151009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    document->enqueueScrollEventForNode(document);
151109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1512f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    m_frame->eventHandler().dispatchFakeMouseMoveEventSoon();
15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
151409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (RenderView* renderView = document->renderView()) {
151507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        if (renderView->usesCompositing())
1516926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->compositor()->frameViewDidScroll();
15175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1518a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
151909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_didScrollTimer.isActive())
152009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_didScrollTimer.stop();
1521d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_didScrollTimer.startOneShot(resourcePriorityUpdateDelayAfterScroll, FROM_HERE);
1522d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1523d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (AXObjectCache* cache = m_frame->document()->existingAXObjectCache())
1524d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        cache->handleScrollPositionChanged(this);
1525d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1526d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frame().loader().saveScrollState();
152709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
152809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
152909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FrameView::didScrollTimerFired(Timer<FrameView>*)
153009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
1531d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (m_frame->document() && m_frame->document()->renderView()) {
153209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()->updateAllImageResourcePriorities();
1533a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
15345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
153607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid FrameView::updateLayersAndCompositingAfterScrollIfNeeded()
15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
153807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // Nothing to do after scrolling if there are no fixed position elements.
153907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (!hasViewportConstrainedObjects())
154007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return;
154107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
154209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    RefPtr<FrameView> protect(this);
154307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
154407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // If there fixed position elements, scrolling may cause compositing layers to change.
154507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // Update widget and layer positions after scrolling, but only if we're not inside of
154607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // layout.
154707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (!m_nestedLayoutCount) {
154809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        updateWidgetPositions();
1549197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (RenderView* renderView = this->renderView())
15505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            renderView->layer()->setNeedsCompositingInputsUpdate();
15515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccibool FrameView::computeCompositedSelectionBounds(LocalFrame& frame, CompositedSelectionBound& start, CompositedSelectionBound& end)
15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    const VisibleSelection &selection = frame.selection().selection();
15577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!selection.isCaretOrRange())
15587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return false;
155907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
15607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    VisiblePosition visibleStart(selection.visibleStart());
15617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    VisiblePosition visibleEnd(selection.visibleEnd());
156207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
15637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RenderedPosition renderedStart(visibleStart);
15647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RenderedPosition renderedEnd(visibleEnd);
156507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
15667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    renderedStart.positionInGraphicsLayerBacking(start);
15672fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)    if (!start.layer)
15682fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)        return false;
15692fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)
15707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    renderedEnd.positionInGraphicsLayerBacking(end);
15712fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)    if (!end.layer)
15722fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)        return false;
157307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
15747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (selection.isCaret()) {
15757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        start.type = end.type = CompositedSelectionBound::Caret;
15767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return true;
15775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
15797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    TextDirection startDir = visibleStart.deepEquivalent().primaryDirection();
15807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    TextDirection endDir = visibleEnd.deepEquivalent().primaryDirection();
15817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    start.type = startDir == RTL ? CompositedSelectionBound::SelectionRight : CompositedSelectionBound::SelectionLeft;
15827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    end.type = endDir == RTL ? CompositedSelectionBound::SelectionLeft : CompositedSelectionBound::SelectionRight;
15837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return true;
15845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1586018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdochstatic void computePaintInvalidationRectsIncludingNonCompositingDescendants(RenderLayer* layer)
1587018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch{
1588018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    // FIXME: boundsRectForPaintInvalidation() has to walk up the parent chain
1589018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    // for every layer to compute the rects. We should make this more efficient.
1590018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    // FIXME: it's wrong to call this when layout is not up-to-date, which we do.
1591018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    layer->renderer()->setPreviousPaintInvalidationRect(layer->renderer()->boundsRectForPaintInvalidation(layer->renderer()->containerForPaintInvalidation()));
1592018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    // FIXME: We are only updating the paint invalidation bounds but not
1593018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    // the positionFromPaintInvalidationContainer. This means that we may
1594018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    // forcing a full invaliation of the new position. Is this really correct?
1595018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch
1596018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    for (RenderLayer* child = layer->firstChild(); child; child = child->nextSibling()) {
1597018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        if (child->compositingState() != PaintsIntoOwnBacking && child->compositingState() != PaintsIntoGroupedBacking)
1598018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch            computePaintInvalidationRectsIncludingNonCompositingDescendants(child);
1599018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    }
1600018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch}
1601018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch
1602018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdochvoid FrameView::updateFixedElementPaintInvalidationRectsAfterScroll()
1603018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch{
1604018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    if (!hasViewportConstrainedObjects())
1605018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        return;
1606018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch
1607018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    // Update the paint invalidation rects for fixed elements after scrolling and invalidation to reflect
1608018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    // the new scroll position.
1609018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    ViewportConstrainedObjectSet::const_iterator end = m_viewportConstrainedObjects->end();
1610018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    for (ViewportConstrainedObjectSet::const_iterator it = m_viewportConstrainedObjects->begin(); it != end; ++it) {
1611018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        RenderObject* renderer = *it;
1612018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        // m_viewportConstrainedObjects should not contain non-viewport constrained objects.
1613018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        ASSERT(renderer->style()->hasViewportConstrainedPosition());
1614018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch
1615018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        // Fixed items should always have layers.
1616018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        ASSERT(renderer->hasLayer());
1617018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch
1618018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        RenderLayer* layer = toRenderBoxModelObject(renderer)->layer();
1619018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch
1620018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        // Don't need to do this for composited fixed items.
1621018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        if (layer->compositingState() == PaintsIntoOwnBacking)
1622018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch            continue;
1623018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch
1624018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        computePaintInvalidationRectsIncludingNonCompositingDescendants(layer);
1625018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    }
1626018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch}
1627018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch
1628197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid FrameView::updateCompositedSelectionBoundsIfNeeded()
1629197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
16307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!RuntimeEnabledFeatures::compositedSelectionUpdateEnabled())
1631197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return;
1632197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1633197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    Page* page = frame().page();
1634197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    ASSERT(page);
1635197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
16367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    CompositedSelectionBound start, end;
1637197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    LocalFrame* frame = toLocalFrame(page->focusController().focusedOrMainFrame());
16387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!frame || !computeCompositedSelectionBounds(*frame, start, end)) {
1639197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        page->chrome().client().clearCompositedSelectionBounds();
1640197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return;
1641197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
1642197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
16437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    page->chrome().client().updateCompositedSelectionBounds(start, end);
1644197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
1645197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1646926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool FrameView::isRubberBandInProgress() const
1647926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1648926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (scrollbarsSuppressed())
1649926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
1650926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1651926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // If the main thread updates the scroll position for this FrameView, we should return
1652926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // ScrollAnimator::isRubberBandInProgress().
1653926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (ScrollAnimator* scrollAnimator = existingScrollAnimator())
1654926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return scrollAnimator->isRubberBandInProgress();
1655926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1656926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return false;
1657926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1658926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
16595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HostWindow* FrameView::hostWindow() const
16605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Page* page = frame().page();
16625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
16635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
166493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return &page->chrome();
16655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1667f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void FrameView::contentRectangleForPaintInvalidation(const IntRect& r)
16685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1669f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ASSERT(paintInvalidationIsAllowed());
16709e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    ASSERT(!m_frame->ownerRenderer());
16715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1672f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    if (m_isTrackingPaintInvalidations) {
1673f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        IntRect paintInvalidationRect = r;
1674f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        paintInvalidationRect.move(-scrollOffset());
1675f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        m_trackedPaintInvalidationRects.append(paintInvalidationRect);
1676f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        // FIXME: http://crbug.com/368518. Eventually, invalidateContentRectangleForPaint
1677323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        // is going away entirely once all layout tests are FCM. In the short
1678f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        // term, no code should be tracking non-composited FrameView paint invalidations.
1679323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        RELEASE_ASSERT_NOT_REACHED();
16805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1682f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ScrollView::contentRectangleForPaintInvalidation(r);
16835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::contentsResized()
16865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
168710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (m_frame->isMainFrame() && m_frame->document()) {
1688c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (TextAutosizer* textAutosizer = m_frame->document()->textAutosizer())
1689aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            textAutosizer->updatePageInfoInAllFrames();
1690aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    }
1691aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
16925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::contentsResized();
16936f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    setNeedsLayout();
16945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1696bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void FrameView::scrollbarExistenceDidChange()
16975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We check to make sure the view is attached to a frame() as this method can
1699d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // be triggered before the view is attached by LocalFrame::createView(...) setting
17005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // various values such as setScrollBarModes(...) for example.  An ASSERT is
17015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // triggered when a view is layout before being attached to a frame().
17028abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!frame().view())
17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
170509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Note that simply having overlay scrollbars is not sufficient to be
170609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // certain that scrollbars' presence does not impact layout. This should
170709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // also check if custom scrollbars (as reported by shouldUseCustomScrollbars)
170809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // are in use as well.
170909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // http://crbug.com/269692
1710bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    bool useOverlayScrollbars = ScrollbarTheme::theme()->usesOverlayScrollbars();
1711bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
1712a372c30a9dc26aa32e51fa7b85e0c47b55479f89Ben Murdoch    // FIXME: this call to layout() could be called within FrameView::layout(), but before performLayout(),
1713a372c30a9dc26aa32e51fa7b85e0c47b55479f89Ben Murdoch    // causing double-layout. See also crbug.com/429242.
1714bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (!useOverlayScrollbars && needsLayout())
17155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        layout();
17165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1717bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (renderView() && renderView()->usesCompositing()) {
1718bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        renderView()->compositor()->frameViewScrollbarsExistenceDidChange();
1719bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
1720bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        if (!useOverlayScrollbars)
1721bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            renderView()->compositor()->frameViewDidChangeSize();
17225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::handleLoadCompleted()
17265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Once loading has completed, allow autoSize one last opportunity to
17285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // reduce the size of the frame.
17299e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (m_autoSizeInfo)
17309e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_autoSizeInfo->autoSizeIfNeeded();
17315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scheduleRelayout()
17345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame->view() == this);
17365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
173709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (isSubtreeLayout()) {
173809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_layoutSubtreeRoot->markContainingBlocksForLayout(false);
173909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_layoutSubtreeRoot = 0;
17405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_layoutSchedulingEnabled)
17425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!needsLayout())
17445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_frame->document()->shouldScheduleLayout())
17465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1747f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "InvalidateLayout", "frame", m_frame.get());
1748323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.stack"), "CallStack", "stack", InspectorCallStackEvent::currentCallStack());
1749f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeline migrates to tracing.
17505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InspectorInstrumentation::didInvalidateLayout(m_frame.get());
175193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
175209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_hasPendingLayout)
17535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
175409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_hasPendingLayout = true;
17556f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
1756d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    page()->animator().scheduleVisualUpdate();
17576f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    lifecycle().ensureStateAtMost(DocumentLifecycle::StyleClean);
17585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool isObjectAncestorContainerOf(RenderObject* ancestor, RenderObject* descendant)
17615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (RenderObject* r = descendant; r; r = r->container()) {
17635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (r == ancestor)
17645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
17655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
17675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scheduleRelayoutOfSubtree(RenderObject* relayoutRoot)
17705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame->view() == this);
17725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17736f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    // FIXME: Should this call shouldScheduleLayout instead?
17746f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (!m_frame->document()->isActive())
17756f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return;
17766f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
1777926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
1778926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (renderView && renderView->needsLayout()) {
17795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (relayoutRoot)
17805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            relayoutRoot->markContainingBlocksForLayout(false);
17815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (layoutPending() || !m_layoutSchedulingEnabled) {
178509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (m_layoutSubtreeRoot != relayoutRoot) {
178609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            if (isObjectAncestorContainerOf(m_layoutSubtreeRoot, relayoutRoot)) {
17875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Keep the current root
178809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                relayoutRoot->markContainingBlocksForLayout(false, m_layoutSubtreeRoot);
178909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                ASSERT(!m_layoutSubtreeRoot->container() || !m_layoutSubtreeRoot->container()->needsLayout());
179009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            } else if (isSubtreeLayout() && isObjectAncestorContainerOf(relayoutRoot, m_layoutSubtreeRoot)) {
17915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Re-root at relayoutRoot
179209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                m_layoutSubtreeRoot->markContainingBlocksForLayout(false, relayoutRoot);
179309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                m_layoutSubtreeRoot = relayoutRoot;
179409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                ASSERT(!m_layoutSubtreeRoot->container() || !m_layoutSubtreeRoot->container()->needsLayout());
17955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else {
17965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Just do a full relayout
179709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                if (isSubtreeLayout())
179809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                    m_layoutSubtreeRoot->markContainingBlocksForLayout(false);
179909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                m_layoutSubtreeRoot = 0;
18005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                relayoutRoot->markContainingBlocksForLayout(false);
18015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
18025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
18035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else if (m_layoutSchedulingEnabled) {
180409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_layoutSubtreeRoot = relayoutRoot;
180509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ASSERT(!m_layoutSubtreeRoot->container() || !m_layoutSubtreeRoot->container()->needsLayout());
180609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_hasPendingLayout = true;
18076f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
1808d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        page()->animator().scheduleVisualUpdate();
18096f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        lifecycle().ensureStateAtMost(DocumentLifecycle::StyleClean);
18105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1811f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "InvalidateLayout", "frame", m_frame.get());
1812323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.stack"), "CallStack", "stack", InspectorCallStackEvent::currentCallStack());
1813f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeline migrates to tracing.
1814f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    InspectorInstrumentation::didInvalidateLayout(m_frame.get());
18155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::layoutPending() const
18185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1819a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    // FIXME: This should check Document::lifecycle instead.
182009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return m_hasPendingLayout;
182109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
182209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
182309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool FrameView::isInPerformLayout() const
182409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
182509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT(m_inPerformLayout == (lifecycle().state() == DocumentLifecycle::InPerformLayout));
182609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return m_inPerformLayout;
18275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::needsLayout() const
18305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This can return true in cases where the document does not have a body yet.
18325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Document::shouldScheduleLayout takes care of preventing us from scheduling
18335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // layout in that case.
18345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1835926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
18365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return layoutPending()
1837926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        || (renderView && renderView->needsLayout())
183809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        || isSubtreeLayout();
18395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setNeedsLayout()
18425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1843926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (RenderView* renderView = this->renderView())
18443c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        renderView->setNeedsLayout();
18455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isTransparent() const
18485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_isTransparent;
18505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setTransparent(bool isTransparent)
18535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isTransparent = isTransparent;
1855d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    DisableCompositingQueryAsserts disabler;
185651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (renderView() && renderView()->layer()->hasCompositedLayerMapping())
18571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        renderView()->layer()->compositedLayerMapping()->updateContentsOpaque();
18585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1860926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool FrameView::hasOpaqueBackground() const
1861926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1862926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return !m_isTransparent && !m_baseBackgroundColor.hasAlpha();
1863926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1864926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
18655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Color FrameView::baseBackgroundColor() const
18665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_baseBackgroundColor;
18685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18708abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void FrameView::setBaseBackgroundColor(const Color& backgroundColor)
18715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
187209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_baseBackgroundColor = backgroundColor;
18735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
187451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (renderView() && renderView()->layer()->hasCompositedLayerMapping()) {
1875e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        CompositedLayerMapping* compositedLayerMapping = renderView()->layer()->compositedLayerMapping();
18761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        compositedLayerMapping->updateContentsOpaque();
18771e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (compositedLayerMapping->mainGraphicsLayer())
18781e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            compositedLayerMapping->mainGraphicsLayer()->setNeedsDisplay();
187902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    }
18805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    recalculateScrollbarOverlayStyle();
18815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void FrameView::updateBackgroundRecursively(const Color& backgroundColor, bool transparent)
18845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    for (Frame* frame = m_frame.get(); frame; frame = frame->tree().traverseNext(m_frame.get())) {
18865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (!frame->isLocalFrame())
18875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            continue;
18885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (FrameView* view = toLocalFrame(frame)->view()) {
18895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            view->setTransparent(transparent);
18905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            view->setBaseBackgroundColor(backgroundColor);
18915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
18925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scrollToAnchor()
18965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1897f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    RefPtrWillBeRawPtr<Node> anchorNode = m_maintainScrollPositionAnchor;
18985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!anchorNode)
18995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
19005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!anchorNode->renderer())
19025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
19035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect rect;
19055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (anchorNode != m_frame->document())
19065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rect = anchorNode->boundingBox();
19075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19082fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)    RefPtrWillBeRawPtr<LocalFrame> boundaryFrame = m_frame->document()->findUnsafeParentScrollPropagationBoundary();
19092fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)
19102fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)    if (boundaryFrame)
19112fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)        boundaryFrame->view()->setSafeToPropagateScrollToParent(false);
19122fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)
19135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Scroll nested layers and frames to reveal the anchor.
19145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Align to the top and to the closest side (this matches other browsers).
19155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    anchorNode->renderer()->scrollRectToVisible(rect, ScrollAlignment::alignToEdgeIfNeeded, ScrollAlignment::alignTopAlways);
19165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19172fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)    if (boundaryFrame)
19182fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)        boundaryFrame->view()->setSafeToPropagateScrollToParent(true);
19192fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)
1920926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (AXObjectCache* cache = m_frame->document()->existingAXObjectCache())
1921926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        cache->handleScrolledToAnchor(anchorNode.get());
19225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // scrollRectToVisible can call into setScrollPosition(), which resets m_maintainScrollPositionAnchor.
19245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_maintainScrollPositionAnchor = anchorNode;
19255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::updateWidgets()
19285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1929d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // This is always called from updateWidgetsTimerFired.
1930d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // m_updateWidgetsTimer should only be scheduled if we have widgets to update.
1931d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Thus I believe we can stop checking isEmpty here, and just ASSERT isEmpty:
1932d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(!m_widgetUpdateSet.isEmpty());
1933a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_nestedLayoutCount > 1 || m_widgetUpdateSet.isEmpty())
19345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
1935591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
1936a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // Need to swap because script will run inside the below loop and invalidate the iterator.
1937a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EmbeddedObjectSet objects;
1938a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    objects.swap(m_widgetUpdateSet);
19395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1940a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    for (EmbeddedObjectSet::iterator it = objects.begin(); it != objects.end(); ++it) {
1941a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        RenderEmbeddedObject& object = **it;
1942a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        HTMLPlugInElement* element = toHTMLPlugInElement(object.node());
19435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1944a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        // The object may have already been destroyed (thus node cleared),
1945a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        // but FrameView holds a manual ref, so it won't have been deleted.
1946a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (!element)
1947a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            continue;
19485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1949a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        // No need to update if it's already crashed or known to be missing.
1950a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (object.showsUnavailablePluginIndicator())
1951a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            continue;
19525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1953a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (element->needsWidgetUpdate())
1954a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            element->updateWidget();
1955a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        object.updateWidgetPosition();
1956a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1957a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        // Prevent plugins from causing infinite updates of themselves.
1958a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        // FIXME: Do we really need to prevent this?
1959a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_widgetUpdateSet.remove(&object);
1960926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1961591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
1962a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return m_widgetUpdateSet.isEmpty();
19635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
196551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void FrameView::updateWidgetsTimerFired(Timer<FrameView>*)
19665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1967d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(!isInPerformLayout());
196851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    RefPtr<FrameView> protect(this);
196951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_updateWidgetsTimer.stop();
197051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    for (unsigned i = 0; i < maxUpdateWidgetsIterations; ++i) {
197151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (updateWidgets())
197251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            return;
197351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
197451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
19755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
197651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void FrameView::flushAnyPendingPostLayoutTasks()
197751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
1978d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(!isInPerformLayout());
197951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_postLayoutTasksTimer.isActive())
198051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        performPostLayoutTasks();
198151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_updateWidgetsTimer.isActive())
198251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        updateWidgetsTimerFired(0);
19835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1985d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void FrameView::scheduleUpdateWidgetsIfNecessary()
1986d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1987d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(!isInPerformLayout());
1988d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_updateWidgetsTimer.isActive() || m_widgetUpdateSet.isEmpty())
1989d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1990d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_updateWidgetsTimer.startOneShot(0, FROM_HERE);
1991d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1992d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
19935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::performPostLayoutTasks()
19945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1995d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // FIXME: We can reach here, even when the page is not active!
1996d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // http/tests/inspector/elements/html-link-import.html and many other
1997d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // tests hit that case.
1998d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // We should ASSERT(isActive()); or at least return early if we can!
1999d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(!isInPerformLayout()); // Always before or after performLayout(), part of the highest-level layout() call.
2000197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    TRACE_EVENT0("blink", "FrameView::performPostLayoutTasks");
200181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    RefPtr<FrameView> protect(this);
200281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
20035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_postLayoutTasksTimer.stop();
20045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20058abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    m_frame->selection().setCaretRectNeedsUpdate();
20065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2007d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
2008d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // Hits in compositing/overflow/do-not-repaint-if-scrolling-composited-layers.html
2009d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        DisableCompositingQueryAsserts disabler;
2010d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_frame->selection().updateAppearance();
2011d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2012d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2013d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(m_frame->document());
20145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_nestedLayoutCount <= 1) {
2015d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (m_firstLayoutCallbackPending)
20165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_firstLayoutCallbackPending = false;
20175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Ensure that we always send this eventually.
2019f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        if (!m_frame->document()->parsing() && m_frame->loader().stateMachine()->committedFirstRealDocumentLoad())
20205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_isVisuallyNonEmpty = true;
20215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If the layout was done with pending sheets, we are not in fact visually non-empty yet.
20235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_isVisuallyNonEmpty && !m_frame->document()->didLayoutWithPendingStylesheets() && m_firstVisuallyNonEmptyLayoutCallbackPending) {
20245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_firstVisuallyNonEmptyLayoutCallbackPending = false;
20251e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            // FIXME: This callback is probably not needed, but is currently used
20261e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            // by android for setting the background color.
2027f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            m_frame->loader().client()->dispatchDidFirstVisuallyNonEmptyLayout();
20285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
20295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
20305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2031d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    FontFaceSet::didLayout(*m_frame->document());
20325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
203309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    updateWidgetPositions();
203409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
203509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Plugins could have torn down the page inside updateWidgetPositions().
203609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!renderView())
203709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
203853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2039d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    scheduleUpdateWidgetsIfNecessary();
20405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (Page* page = m_frame->page()) {
20425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())
204319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            scrollingCoordinator->notifyLayoutUpdated();
20445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
20455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    scrollToAnchor();
20475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2048e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    sendResizeEventIfNeeded();
2049e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
2050e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
20517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccibool FrameView::wasViewportResized()
20527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
20537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(m_frame);
20547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RenderView* renderView = this->renderView();
20557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!renderView)
20567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return false;
20577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return (layoutSize(IncludeScrollbars) != m_lastViewportSize || renderView->style()->zoom() != m_lastZoomFactor);
20587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
20597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2060e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void FrameView::sendResizeEventIfNeeded()
2061e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
2062e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    ASSERT(m_frame);
2063e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
2064e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    RenderView* renderView = this->renderView();
20659bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!renderView || renderView->document().printing())
2066e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return;
2067e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
20687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!wasViewportResized())
2069e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return;
2070e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
20717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_lastViewportSize = layoutSize(IncludeScrollbars);
20727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_lastZoomFactor = renderView->style()->zoom();
20737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
207451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_frame->document()->enqueueResizeEvent();
2075e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
207610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (m_frame->isMainFrame())
20771e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        InspectorInstrumentation::didResizeMainFrame(m_frame->page());
20785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::postLayoutTimerFired(Timer<FrameView>*)
20815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    performPostLayoutTasks();
20835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void FrameView::updateCounters()
20868abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
20878abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    RenderView* view = renderView();
20888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!view->hasRenderCounters())
20898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return;
20908abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
20918abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    for (RenderObject* renderer = view; renderer; renderer = renderer->nextInPreOrder()) {
20928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (!renderer->isCounter())
20938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            continue;
20948abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
20958abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        toRenderCounter(renderer)->updateCounter();
20968abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    }
20978abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
20988abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
20995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateOverflowStatus(bool horizontalOverflow, bool verticalOverflow)
21005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_viewportRenderer)
21025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2103591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
21045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_overflowStatusDirty) {
21055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_horizontalOverflow = horizontalOverflow;
21065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_verticalOverflow = verticalOverflow;
21075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_overflowStatusDirty = false;
21085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
21095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2110591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
21115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool horizontalOverflowChanged = (m_horizontalOverflow != horizontalOverflow);
21125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool verticalOverflowChanged = (m_verticalOverflow != verticalOverflow);
2113591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
21145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (horizontalOverflowChanged || verticalOverflowChanged) {
21155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_horizontalOverflow = horizontalOverflow;
21165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_verticalOverflow = verticalOverflow;
2117591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
2118a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        RefPtrWillBeRawPtr<OverflowEvent> event = OverflowEvent::create(horizontalOverflowChanged, horizontalOverflow, verticalOverflowChanged, verticalOverflow);
21191e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        event->setTarget(m_viewportRenderer->node());
212051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_frame->document()->enqueueAnimationFrameEvent(event.release());
21215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2122591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
21235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2125d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)IntRect FrameView::windowClipRect(IncludeScrollbarsInRect scrollbarInclusion) const
21265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame->view() == this);
21285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Set our clip rect to be our contents.
2130d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    IntRect clipRect = contentsToWindow(visibleContentRect(scrollbarInclusion));
2131f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    if (!m_frame->deprecatedLocalOwner())
21325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return clipRect;
21335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Take our owner element and get its clip rect.
2135f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    // FIXME: Do we need to do this for remote frames?
2136f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    HTMLFrameOwnerElement* ownerElement = m_frame->deprecatedLocalOwner();
21378abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FrameView* parentView = ownerElement->document().view();
21385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (parentView)
2139d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        clipRect.intersect(parentView->windowClipRectForFrameOwner(ownerElement));
21405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return clipRect;
21415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2143d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)IntRect FrameView::windowClipRectForFrameOwner(const HTMLFrameOwnerElement* ownerElement) const
21445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The renderer can sometimes be null when style="display:none" interacts
21465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // with external content and plugins.
21475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!ownerElement->renderer())
21485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return windowClipRect();
21495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If we have no layer, just return our window clip rect.
21515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const RenderLayer* enclosingLayer = ownerElement->renderer()->enclosingLayer();
21525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!enclosingLayer)
21535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return windowClipRect();
21545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2155d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // FIXME: childrenClipRect relies on compositingState, which is not necessarily up to date.
2156d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // https://code.google.com/p/chromium/issues/detail?id=343769
2157d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    DisableCompositingQueryAsserts disabler;
2158d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
21595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Apply the clip from the layer.
2160d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    IntRect clipRect = contentsToWindow(pixelSnappedIntRect(enclosingLayer->clipper().childrenClipRect()));
21615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return intersection(clipRect, windowClipRect());
21625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isActive() const
21655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21668abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Page* page = frame().page();
21673c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    return page && page->focusController().isActive();
21685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::scrollTo(const IntSize& newOffset)
21715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutSize offset = scrollOffset();
21735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::scrollTo(newOffset);
217407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (offset != scrollOffset()) {
217507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        updateLayersAndCompositingAfterScrollIfNeeded();
21765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        scrollPositionChanged();
217707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
2178f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame().loader().client()->didChangeScrollOffset();
21795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::invalidateScrollbarRect(Scrollbar* scrollbar, const IntRect& rect)
21825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Add in our offset within the FrameView.
21845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect dirtyRect = rect;
21855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dirtyRect.moveBy(scrollbar->location());
218609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
2187c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (isInPerformLayout())
2188c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        addScrollbarDamage(scrollbar, rect);
2189c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    else
219009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        invalidateRect(dirtyRect);
21915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::getTickmarks(Vector<IntRect>& tickmarks) const
21945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
219543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (!m_tickmarks.isEmpty())
219643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        tickmarks = m_tickmarks;
219743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    else
219843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        tickmarks = frame().document()->markers().renderedRectsForMarkers(DocumentMarker::TextMatch);
21995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect FrameView::windowResizerRect() const
22025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
22038abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Page* page = frame().page();
22045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
22055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return IntRect();
220693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return page->chrome().windowResizerRect();
22075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
220953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void FrameView::setVisibleContentScaleFactor(float visibleContentScaleFactor)
2210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
221153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (m_visibleContentScaleFactor == visibleContentScaleFactor)
221253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return;
2213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
221453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_visibleContentScaleFactor = visibleContentScaleFactor;
221553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    updateScrollbars(scrollOffset());
2216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
221819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void FrameView::setInputEventsTransformForEmulation(const IntSize& offset, float contentScaleFactor)
22191e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
222019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    m_inputEventsOffsetForEmulation = offset;
22211e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    m_inputEventsScaleFactorForEmulation = contentScaleFactor;
22221e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
22231e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
222419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)IntSize FrameView::inputEventsOffsetForEmulation() const
222519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles){
222619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    return m_inputEventsOffsetForEmulation;
222719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)}
222819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
22291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)float FrameView::inputEventsScaleFactor() const
22301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
223110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    float pageScale = m_frame->settings()->pinchVirtualViewportEnabled()
223210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        ? m_frame->page()->frameHost().pinchViewport().scale()
223310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        : visibleContentScaleFactor();
223410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return pageScale * m_inputEventsScaleFactorForEmulation;
22351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
22361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
22375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::scrollbarsCanBeActive() const
22385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
22395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frame->view() != this)
22405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
22415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
224253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return !!m_frame->document();
22435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect FrameView::scrollableAreaBoundingBox() const
22465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
22478abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    RenderPart* ownerRenderer = frame().ownerRenderer();
2248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!ownerRenderer)
2249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return frameRect();
2250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return ownerRenderer->absoluteContentQuad().enclosingBoundingBox();
22525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2254a372c30a9dc26aa32e51fa7b85e0c47b55479f89Ben Murdoch
2255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool FrameView::isScrollable()
22565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2257a372c30a9dc26aa32e51fa7b85e0c47b55479f89Ben Murdoch    return scrollingReasons() == Scrollable;
2258a372c30a9dc26aa32e51fa7b85e0c47b55479f89Ben Murdoch}
2259a372c30a9dc26aa32e51fa7b85e0c47b55479f89Ben Murdoch
2260a372c30a9dc26aa32e51fa7b85e0c47b55479f89Ben MurdochFrameView::ScrollingReasons FrameView::scrollingReasons()
2261a372c30a9dc26aa32e51fa7b85e0c47b55479f89Ben Murdoch{
22625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Check for:
2263926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // 1) If there an actual overflow.
2264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // 2) display:none or visibility:hidden set to self or inherited.
2265926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // 3) overflow{-x,-y}: hidden;
2266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // 4) scrolling: no;
22675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2268926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Covers #1
226953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    IntSize contentsSize = this->contentsSize();
22705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntSize visibleContentSize = visibleContentRect().size();
227153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if ((contentsSize.height() <= visibleContentSize.height() && contentsSize.width() <= visibleContentSize.width()))
2272a372c30a9dc26aa32e51fa7b85e0c47b55479f89Ben Murdoch        return NotScrollableNoOverflow;
22735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2274926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Covers #2.
2275f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    // FIXME: Do we need to fix this for OOPI?
2276f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    HTMLFrameOwnerElement* owner = m_frame->deprecatedLocalOwner();
2277926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (owner && (!owner->renderer() || !owner->renderer()->visibleToHitTesting()))
2278a372c30a9dc26aa32e51fa7b85e0c47b55479f89Ben Murdoch        return NotScrollableNotVisible;
2279926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2280926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Cover #3 and #4.
22815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollbarMode horizontalMode;
22825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollbarMode verticalMode;
228309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    calculateScrollbarModesForLayoutAndSetViewportRenderer(horizontalMode, verticalMode, RulesFromWebContentOnly);
2284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (horizontalMode == ScrollbarAlwaysOff && verticalMode == ScrollbarAlwaysOff)
2285a372c30a9dc26aa32e51fa7b85e0c47b55479f89Ben Murdoch        return NotScrollableExplicitlyDisabled;
2286926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2287a372c30a9dc26aa32e51fa7b85e0c47b55479f89Ben Murdoch    return Scrollable;
2288926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2290926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void FrameView::updateScrollableAreaSet()
2291926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // That ensures that only inner frames are cached.
2293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    FrameView* parentFrameView = this->parentFrameView();
2294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!parentFrameView)
2295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
2296926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2297926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!isScrollable()) {
2298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        parentFrameView->removeScrollableArea(this);
22995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
23005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
23015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2302926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    parentFrameView->addScrollableArea(this);
23035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::shouldSuspendScrollAnimations() const
23065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2307f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return m_frame->loader().state() != FrameStateComplete;
23085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
231010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid FrameView::scrollbarStyleChanged()
23115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
231210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // FIXME: Why does this only apply to the main frame?
231310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (!m_frame->isMainFrame())
23145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
231510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    ScrollView::scrollbarStyleChanged();
23165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::notifyPageThatContentAreaWillPaint() const
23195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
23205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = m_frame->page();
23215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
23225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
23235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    contentAreaWillPaint();
23255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_scrollableAreas)
23275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
23285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (HashSet<ScrollableArea*>::const_iterator it = m_scrollableAreas->begin(), end = m_scrollableAreas->end(); it != end; ++it) {
23305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ScrollableArea* scrollableArea = *it;
23315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!scrollableArea->scrollbarsCanBeActive())
23335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
23345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        scrollableArea->contentAreaWillPaint();
23365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
23375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::scrollAnimatorEnabled() const
23405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2341d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return m_frame->settings() && m_frame->settings()->scrollAnimatorEnabled();
23425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateAnnotatedRegions()
23455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
23465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* document = m_frame->document();
23475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!document->hasAnnotatedRegions())
23485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
23495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<AnnotatedRegionValue> newRegions;
23505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    document->renderBox()->collectAnnotatedRegions(newRegions);
23515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (newRegions == document->annotatedRegions())
23525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
23535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    document->setAnnotatedRegions(newRegions);
2354e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (Page* page = m_frame->page())
2355e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        page->chrome().client().annotatedRegionsChanged();
23565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateScrollCorner()
23595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
23605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<RenderStyle> cornerStyle;
23615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect cornerRect = scrollCornerRect();
23625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    Document* doc = m_frame->document();
23635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
23645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (doc && !cornerRect.isEmpty()) {
23655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Try the <body> element first as a scroll corner source.
23665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        if (Element* body = doc->body()) {
23675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            if (RenderObject* renderer = body->renderer())
23685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                cornerStyle = renderer->getUncachedPseudoStyle(PseudoStyleRequest(SCROLLBAR_CORNER), renderer->style());
23695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2370591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
23715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!cornerStyle) {
23725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // If the <body> didn't have a custom style, then the root element might.
23735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            if (Element* docElement = doc->documentElement()) {
23745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                if (RenderObject* renderer = docElement->renderer())
23755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                    cornerStyle = renderer->getUncachedPseudoStyle(PseudoStyleRequest(SCROLLBAR_CORNER), renderer->style());
23765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
23775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2378591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
23795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!cornerStyle) {
2380d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // If we have an owning ipage/LocalFrame element, then it can set the custom scrollbar also.
23815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (RenderPart* renderer = m_frame->ownerRenderer())
2382926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                cornerStyle = renderer->getUncachedPseudoStyle(PseudoStyleRequest(SCROLLBAR_CORNER), renderer->style());
23835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
23845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
23855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (cornerStyle) {
23875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_scrollCorner)
23885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            m_scrollCorner = RenderScrollbarPart::createAnonymous(doc);
23895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollCorner->setStyle(cornerStyle.release());
23905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        invalidateScrollCorner(cornerRect);
23915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else if (m_scrollCorner) {
23925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollCorner->destroy();
2393e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        m_scrollCorner = nullptr;
23945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
23955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::updateScrollCorner();
23975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::paintScrollCorner(GraphicsContext* context, const IntRect& cornerRect)
24005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_scrollCorner) {
240210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        bool needsBackgorund = m_frame->isMainFrame();
24035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (needsBackgorund)
24045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            context->fillRect(cornerRect, baseBackgroundColor());
24055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollCorner->paintIntoRect(context, cornerRect.location(), cornerRect);
24065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
24075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
24085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::paintScrollCorner(context, cornerRect);
24105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::paintScrollbar(GraphicsContext* context, Scrollbar* bar, const IntRect& rect)
24135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
241410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    bool needsBackgorund = bar->isCustomScrollbar() && m_frame->isMainFrame();
24155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (needsBackgorund) {
24165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect toFill = bar->frameRect();
24175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        toFill.intersect(rect);
24185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        context->fillRect(toFill, baseBackgroundColor());
24195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
24205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::paintScrollbar(context, bar, rect);
24225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24248abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)Color FrameView::documentBackgroundColor() const
24255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // <https://bugs.webkit.org/show_bug.cgi?id=59540> We blend the background color of
24275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the document and the body against the base background color of the frame view.
24285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Background images are unfortunately impractical to include.
24295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
243009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Color result = baseBackgroundColor();
24318abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!frame().document())
243209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return result;
24335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24348abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Element* htmlElement = frame().document()->documentElement();
24358abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Element* bodyElement = frame().document()->body();
24365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We take the aggregate of the base background color
24385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the <html> background color, and the <body>
24395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // background color to find the document color. The
24405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // addition of the base background color is not
24415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // technically part of the document background, but it
24425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // otherwise poses problems when the aggregate is not
24435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // fully opaque.
244409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (htmlElement && htmlElement->renderer())
244509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        result = result.blend(htmlElement->renderer()->style()->visitedDependentColor(CSSPropertyBackgroundColor));
244609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (bodyElement && bodyElement->renderer())
244709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        result = result.blend(bodyElement->renderer()->style()->visitedDependentColor(CSSPropertyBackgroundColor));
244809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
244909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return result;
24505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::hasCustomScrollbars() const
24535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const HashSet<RefPtr<Widget> >* viewChildren = children();
24555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HashSet<RefPtr<Widget> >::const_iterator end = viewChildren->end();
24565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (HashSet<RefPtr<Widget> >::const_iterator current = viewChildren->begin(); current != end; ++current) {
24575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Widget* widget = current->get();
24585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (widget->isFrameView()) {
2459926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (toFrameView(widget)->hasCustomScrollbars())
24605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return true;
24615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (widget->isScrollbar()) {
24625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Scrollbar* scrollbar = static_cast<Scrollbar*>(widget);
24635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (scrollbar->isCustomScrollbar())
24645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return true;
24655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
24665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
24675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
24695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FrameView* FrameView::parentFrameView() const
24725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2473926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!parent())
2474926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
2475926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
24765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    Frame* parentFrame = m_frame->tree().parent();
24775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (parentFrame && parentFrame->isLocalFrame())
24785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return toLocalFrame(parentFrame)->view();
24795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
24815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::wasScrolledByUser() const
24845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_wasScrolledByUser;
24865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setWasScrolledByUser(bool wasScrolledByUser)
24895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_inProgrammaticScroll)
24915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2492d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_maintainScrollPositionAnchor = nullptr;
24935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_wasScrolledByUser = wasScrolledByUser;
24945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::paintContents(GraphicsContext* p, const IntRect& rect)
24975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* document = m_frame->document();
24995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
25015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool fillWithRed;
25025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (document->printing())
25035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fillWithRed = false; // Printing, don't fill with red (can't remember why).
2504f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    else if (m_frame->owner())
25055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fillWithRed = false; // Subframe, don't fill with red.
25065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (isTransparent())
25075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fillWithRed = false; // Transparent, don't fill with red.
25085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (m_paintBehavior & PaintBehaviorSelectionOnly)
25095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fillWithRed = false; // Selections are transparent, don't fill with red.
25105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (m_nodeToDraw)
25115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fillWithRed = false; // Element images are transparent, don't fill with red.
25125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
25135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fillWithRed = true;
25145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
25155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (fillWithRed)
25165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        p->fillRect(rect, Color(0xFF, 0, 0));
25175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
25185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2519926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
2520926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView) {
2521a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        WTF_LOG_ERROR("called FrameView::paint with nil renderer");
25225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
25235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
25245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2525e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    RELEASE_ASSERT(!needsLayout());
2526e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document->lifecycle().state() >= DocumentLifecycle::CompositingClean);
25275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2528f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Paint", "data", InspectorPaintEvent::data(renderView, rect, 0));
2529323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.stack"), "CallStack", "stack", InspectorCallStackEvent::currentCallStack());
2530f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeline migrates to tracing.
2531a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    InspectorInstrumentation::willPaint(renderView, 0);
253253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2533e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    bool isTopLevelPainter = !s_inPaintContents;
2534e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    s_inPaintContents = true;
25355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FontCachePurgePreventer fontCachePurgePreventer;
25375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PaintBehavior oldPaintBehavior = m_paintBehavior;
2539591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
25405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FrameView* parentView = parentFrameView()) {
25415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parentView->paintBehavior() & PaintBehaviorFlattenCompositingLayers)
25425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_paintBehavior |= PaintBehaviorFlattenCompositingLayers;
25435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2544591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
25455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_paintBehavior == PaintBehaviorNormal)
2546d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        document->markers().invalidateRenderedRectsForMarkersInRect(rect);
25475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (document->printing())
25495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_paintBehavior |= PaintBehaviorFlattenCompositingLayers;
25505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_isPainting);
25525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isPainting = true;
25535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // m_nodeToDraw is used to draw only one element (and its descendants)
255507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    RenderObject* renderer = m_nodeToDraw ? m_nodeToDraw->renderer() : 0;
2556926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderLayer* rootLayer = renderView->layer();
25575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2558197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
25599bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    renderView->assertSubtreeIsLaidOut();
256010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    RenderObject::SetLayoutNeededForbiddenScope forbidSetNeedsLayout(*rootLayer->renderer());
25615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
25625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2563197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    rootLayer->paint(p, rect, m_paintBehavior, renderer);
25645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (rootLayer->containsDirtyOverlayScrollbars())
256607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        rootLayer->paintOverlayScrollbars(p, rect, m_paintBehavior, renderer);
25675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isPainting = false;
25695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_paintBehavior = oldPaintBehavior;
25715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastPaintTime = currentTime();
25725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Regions may have changed as a result of the visibility/z-index of element changing.
25745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (document->annotatedRegionsDirty())
25755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateAnnotatedRegions();
25765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2577e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (isTopLevelPainter) {
25787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // Everything that happens after paintContents completions is considered
2579e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        // to be part of the next frame.
2580e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        s_currentFrameTimeStamp = currentTime();
2581e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        s_inPaintContents = false;
2582e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
25835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
258451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    InspectorInstrumentation::didPaint(renderView, 0, p, rect);
25855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setPaintBehavior(PaintBehavior behavior)
25885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_paintBehavior = behavior;
25905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PaintBehavior FrameView::paintBehavior() const
25935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_paintBehavior;
25955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isPainting() const
25985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_isPainting;
26005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
26015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::setNodeToDraw(Node* node)
26035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
26045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_nodeToDraw = node;
26055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
26065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::paintOverhangAreas(GraphicsContext* context, const IntRect& horizontalOverhangArea, const IntRect& verticalOverhangArea, const IntRect& dirtyRect)
26085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
26095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frame->document()->printing())
26105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
26115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
261210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (m_frame->isMainFrame()) {
26138abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (m_frame->page()->chrome().client().paintCustomOverhangArea(context, horizontalOverhangArea, verticalOverhangArea, dirtyRect))
26145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
26155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
26165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::paintOverhangAreas(context, horizontalOverhangArea, verticalOverhangArea, dirtyRect);
26185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
26195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26209e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void FrameView::updateWidgetPositionsIfNeeded()
26219e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles){
26229e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (!m_needsUpdateWidgetPositions)
26239e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        return;
26249e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
26259e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    m_needsUpdateWidgetPositions = false;
26269e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
26279e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    updateWidgetPositions();
26289e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)}
26299e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
2630d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void FrameView::updateLayoutAndStyleForPainting()
2631d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2632d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Updating layout can run script, which can tear down the FrameView.
2633d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RefPtr<FrameView> protector(this);
2634d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2635d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    updateLayoutAndStyleIfNeededRecursive();
2636a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
26379e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    updateWidgetPositionsIfNeeded();
26389e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
2639018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    if (RenderView* view = renderView()) {
2640197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "UpdateLayerTree", "frame", m_frame.get());
2641197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeline migrates to tracing.
2642197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        InspectorInstrumentation::willUpdateLayerTree(m_frame.get());
26435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
2644a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        view->compositor()->updateIfNeededRecursive();
26455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
2646197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (view->compositor()->inCompositingMode() && m_frame->isLocalRoot())
26475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            m_frame->page()->scrollingCoordinator()->updateAfterCompositingChangeIfNeeded();
26485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
2649197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        updateCompositedSelectionBoundsIfNeeded();
2650197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
2651197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        InspectorInstrumentation::didUpdateLayerTree(m_frame.get());
265207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
26537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        invalidateTreeIfNeededRecursive();
2654018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    }
26557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2656018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    scrollContentsIfNeededRecursive();
2657c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ASSERT(lifecycle().state() == DocumentLifecycle::PaintInvalidationClean);
2658d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2659d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
26605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::updateLayoutAndStyleIfNeededRecursive()
26615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
26625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We have to crawl our entire tree looking for any FrameViews that need
26635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // layout and make sure they are up to date.
26645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Mac actually tests for intersection with the dirty region and tries not to
26655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // update layout for frames that are outside the dirty region.  Not only does this seem
26665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // pointless (since those frames will have set a zero timer to layout anyway), but
26675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // it is also incorrect, since if two frames overlap, the first could be excluded from the dirty
26685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // region but then become included later by the second frame adding rects to the dirty region
26695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // when it lays out.
26705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
267107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    m_frame->document()->updateRenderTreeIfNeeded();
26725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (needsLayout())
26745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        layout();
26755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
267609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // FIXME: Calling layout() shouldn't trigger scripe execution or have any
267709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // observable effects on the frame tree but we're not quite there yet.
26785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<RefPtr<FrameView> > frameViews;
26795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    for (Frame* child = m_frame->tree().firstChild(); child; child = child->tree().nextSibling()) {
26805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (!child->isLocalFrame())
26815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            continue;
26825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (FrameView* view = toLocalFrame(child)->view())
268309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            frameViews.append(view);
268409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
26855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Vector<RefPtr<FrameView> >::iterator end = frameViews.end();
26875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (Vector<RefPtr<FrameView> >::iterator it = frameViews.begin(); it != end; ++it)
26885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        (*it)->updateLayoutAndStyleIfNeededRecursive();
26895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
269010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // When an <iframe> gets composited, it triggers an extra style recalc in its containing FrameView.
269110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // To avoid pushing an invalid tree for display, we have to check for this case and do another
269210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // style recalc. The extra style recalc needs to happen after our child <iframes> were updated.
269310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // FIXME: We shouldn't be triggering an extra style recalc in the first place.
2694f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    if (m_frame->document()->hasSVGFilterElementsRequiringLayerUpdate()) {
269510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        m_frame->document()->updateRenderTreeIfNeeded();
269610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
269710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        if (needsLayout())
269810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            layout();
269910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    }
270010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
270110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // These asserts ensure that parent frames are clean, when child frames finished updating layout and style.
27025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!needsLayout());
2703f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ASSERT(!m_frame->document()->hasSVGFilterElementsRequiringLayerUpdate());
2704197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
2705d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    m_frame->document()->renderView()->assertRendererLaidOut();
270610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#endif
270710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
27085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2710197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid FrameView::invalidateTreeIfNeededRecursive()
2711197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
2712197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // FIXME: We should be more aggressive at cutting tree traversals.
2713c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    lifecycle().advanceTo(DocumentLifecycle::InPaintInvalidation);
2714197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    invalidateTreeIfNeeded();
2715c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    lifecycle().advanceTo(DocumentLifecycle::PaintInvalidationClean);
2716197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
2717197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    for (Frame* child = m_frame->tree().firstChild(); child; child = child->tree().nextSibling()) {
2718197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (!child->isLocalFrame())
2719197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            continue;
2720197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
2721197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        toLocalFrame(child)->view()->invalidateTreeIfNeededRecursive();
2722197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
2723a372c30a9dc26aa32e51fa7b85e0c47b55479f89Ben Murdoch
2724a372c30a9dc26aa32e51fa7b85e0c47b55479f89Ben Murdoch    m_doFullPaintInvalidation = false;
2725197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
2726197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
27279e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void FrameView::enableAutoSizeMode(const IntSize& minSize, const IntSize& maxSize)
27285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
27299e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (!m_autoSizeInfo)
27309e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_autoSizeInfo = adoptPtr(new FrameViewAutoSizeInfo(this));
27315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27329e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    m_autoSizeInfo->configureAutoSizeMode(minSize, maxSize);
27335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::forceLayout(bool allowSubtree)
27365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
27375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    layout(allowSubtree);
27385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
274009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FrameView::forceLayoutForPagination(const FloatSize& pageSize, const FloatSize& originalPageSize, float maximumShrinkFactor)
27415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
27425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Dumping externalRepresentation(m_frame->renderer()).ascii() is a good trick to see
27435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the state of things before and after the layout
2744926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (RenderView* renderView = this->renderView()) {
2745926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        float pageLogicalWidth = renderView->style()->isHorizontalWritingMode() ? pageSize.width() : pageSize.height();
2746926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        float pageLogicalHeight = renderView->style()->isHorizontalWritingMode() ? pageSize.height() : pageSize.width();
27475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit flooredPageLogicalWidth = static_cast<LayoutUnit>(pageLogicalWidth);
27495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit flooredPageLogicalHeight = static_cast<LayoutUnit>(pageLogicalHeight);
2750926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        renderView->setLogicalWidth(flooredPageLogicalWidth);
2751926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        renderView->setPageLogicalHeight(flooredPageLogicalHeight);
27525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        renderView->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation();
27535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        forceLayout();
27545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If we don't fit in the given page width, we'll lay out again. If we don't fit in the
27565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // page width when shrunk, we will lay out at maximum shrink and clip extra content.
27575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // FIXME: We are assuming a shrink-to-fit printing implementation.  A cropping
27585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // implementation should not do this!
2759926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        bool horizontalWritingMode = renderView->style()->isHorizontalWritingMode();
2760926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const LayoutRect& documentRect = renderView->documentRect();
27615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit docLogicalWidth = horizontalWritingMode ? documentRect.width() : documentRect.height();
27625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (docLogicalWidth > pageLogicalWidth) {
276343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            FloatSize expectedPageSize(std::min<float>(documentRect.width().toFloat(), pageSize.width() * maximumShrinkFactor), std::min<float>(documentRect.height().toFloat(), pageSize.height() * maximumShrinkFactor));
276443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            FloatSize maxPageSize = m_frame->resizePageRectsKeepingRatio(FloatSize(originalPageSize.width(), originalPageSize.height()), expectedPageSize);
27655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            pageLogicalWidth = horizontalWritingMode ? maxPageSize.width() : maxPageSize.height();
27665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            pageLogicalHeight = horizontalWritingMode ? maxPageSize.height() : maxPageSize.width();
27675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            flooredPageLogicalWidth = static_cast<LayoutUnit>(pageLogicalWidth);
27695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            flooredPageLogicalHeight = static_cast<LayoutUnit>(pageLogicalHeight);
2770926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->setLogicalWidth(flooredPageLogicalWidth);
2771926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->setPageLogicalHeight(flooredPageLogicalHeight);
27725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            renderView->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation();
27735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            forceLayout();
27745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2775926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            const LayoutRect& updatedDocumentRect = renderView->documentRect();
27765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutUnit docLogicalHeight = horizontalWritingMode ? updatedDocumentRect.height() : updatedDocumentRect.width();
27775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutUnit docLogicalTop = horizontalWritingMode ? updatedDocumentRect.y() : updatedDocumentRect.x();
27785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutUnit docLogicalRight = horizontalWritingMode ? updatedDocumentRect.maxX() : updatedDocumentRect.maxY();
27795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutUnit clippedLogicalLeft = 0;
2780926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (!renderView->style()->isLeftToRightDirection())
27815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                clippedLogicalLeft = docLogicalRight - pageLogicalWidth;
27825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutRect overflow(clippedLogicalLeft, docLogicalTop, pageLogicalWidth, docLogicalHeight);
27835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!horizontalWritingMode)
27855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                overflow = overflow.transposedRect();
2786926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->clearLayoutOverflow();
2787926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderView->addLayoutOverflow(overflow); // This is how we clip in case we overflow again.
27885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
27895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
27905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
279109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    adjustViewSize();
27925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2794f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuIntRect FrameView::convertFromRenderer(const RenderObject& renderer, const IntRect& rendererRect) const
27955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2796f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    IntRect rect = pixelSnappedIntRect(enclosingLayoutRect(renderer.localToAbsoluteQuad(FloatRect(rendererRect)).boundingBox()));
27975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Convert from page ("absolute") to FrameView coordinates.
279953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    rect.moveBy(-scrollPosition());
28005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return rect;
28025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
28035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2804f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuIntRect FrameView::convertToRenderer(const RenderObject& renderer, const IntRect& viewRect) const
28055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
28065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect rect = viewRect;
2807591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
28085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Convert from FrameView coords into page ("absolute") coordinates.
280953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    rect.moveBy(scrollPosition());
28105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: we don't have a way to map an absolute rect down to a local quad, so just
28125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // move the rect for now.
2813f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    rect.setLocation(roundedIntPoint(renderer.absoluteToLocal(rect.location(), UseTransforms)));
28145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return rect;
28155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
28165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2817f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuIntPoint FrameView::convertFromRenderer(const RenderObject& renderer, const IntPoint& rendererPoint) const
28185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2819f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    IntPoint point = roundedIntPoint(renderer.localToAbsolute(rendererPoint, UseTransforms));
28205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Convert from page ("absolute") to FrameView coordinates.
282253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    point.moveBy(-scrollPosition());
28235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return point;
28245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
28255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2826f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuIntPoint FrameView::convertToRenderer(const RenderObject& renderer, const IntPoint& viewPoint) const
28275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
28285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint point = viewPoint;
28295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Convert from FrameView coords into page ("absolute") coordinates.
283153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    point += IntSize(scrollX(), scrollY());
28325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2833f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return roundedIntPoint(renderer.absoluteToLocal(point, UseTransforms));
28345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
28355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect FrameView::convertToContainingView(const IntRect& localRect) const
28375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
28381e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (const ScrollView* parentScrollView = toScrollView(parent())) {
28395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parentScrollView->isFrameView()) {
2840926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            const FrameView* parentView = toFrameView(parentScrollView);
28415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Get our renderer in the parent view
28425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RenderPart* renderer = m_frame->ownerRenderer();
28435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!renderer)
28445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return localRect;
2845591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
28465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            IntRect rect(localRect);
28475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Add borders and padding??
28485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            rect.move(renderer->borderLeft() + renderer->paddingLeft(),
28491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)                renderer->borderTop() + renderer->paddingTop());
2850f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return parentView->convertFromRenderer(*renderer, rect);
28515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2852591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
28535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Widget::convertToContainingView(localRect);
28545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2855591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
28565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return localRect;
28575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
28585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect FrameView::convertFromContainingView(const IntRect& parentRect) const
28605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
28611e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (const ScrollView* parentScrollView = toScrollView(parent())) {
28625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parentScrollView->isFrameView()) {
2863926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            const FrameView* parentView = toFrameView(parentScrollView);
28645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Get our renderer in the parent view
28665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RenderPart* renderer = m_frame->ownerRenderer();
28675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!renderer)
28685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return parentRect;
28695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2870f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            IntRect rect = parentView->convertToRenderer(*renderer, parentRect);
28715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Subtract borders and padding
28725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            rect.move(-renderer->borderLeft() - renderer->paddingLeft(),
28735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                      -renderer->borderTop() - renderer->paddingTop());
28745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return rect;
28755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2876591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
28775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Widget::convertFromContainingView(parentRect);
28785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2879591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
28805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return parentRect;
28815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
28825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint FrameView::convertToContainingView(const IntPoint& localPoint) const
28845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
28851e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (const ScrollView* parentScrollView = toScrollView(parent())) {
28865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parentScrollView->isFrameView()) {
2887926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            const FrameView* parentView = toFrameView(parentScrollView);
28885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Get our renderer in the parent view
28905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RenderPart* renderer = m_frame->ownerRenderer();
28915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!renderer)
28925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return localPoint;
2893591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
28945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            IntPoint point(localPoint);
28955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Add borders and padding
28975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            point.move(renderer->borderLeft() + renderer->paddingLeft(),
28985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       renderer->borderTop() + renderer->paddingTop());
2899f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return parentView->convertFromRenderer(*renderer, point);
29005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2901591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
29025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Widget::convertToContainingView(localPoint);
29035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2904591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
29055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return localPoint;
29065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint FrameView::convertFromContainingView(const IntPoint& parentPoint) const
29095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (const ScrollView* parentScrollView = toScrollView(parent())) {
29115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parentScrollView->isFrameView()) {
2912926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            const FrameView* parentView = toFrameView(parentScrollView);
29135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Get our renderer in the parent view
29155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RenderPart* renderer = m_frame->ownerRenderer();
29165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!renderer)
29175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return parentPoint;
29185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2919f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            IntPoint point = parentView->convertToRenderer(*renderer, parentPoint);
29205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Subtract borders and padding
29215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            point.move(-renderer->borderLeft() - renderer->paddingLeft(),
29225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       -renderer->borderTop() - renderer->paddingTop());
29235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return point;
29245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2925591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
29265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Widget::convertFromContainingView(parentPoint);
29275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2928591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
29295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return parentPoint;
29305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2932f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void FrameView::setTracksPaintInvalidations(bool trackPaintInvalidations)
29335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2934f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    if (trackPaintInvalidations == m_isTrackingPaintInvalidations)
29355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
29365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    for (Frame* frame = m_frame->tree().top(); frame; frame = frame->tree().traverseNext()) {
29385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (!frame->isLocalFrame())
29395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            continue;
29405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (RenderView* renderView = toLocalFrame(frame)->contentRenderer())
2941e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            renderView->compositor()->setTracksPaintInvalidations(trackPaintInvalidations);
29425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
29435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2944aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("blink.invalidation"),
2945f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        "FrameView::setTracksPaintInvalidations", "enabled", trackPaintInvalidations);
2946aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
2947f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    resetTrackedPaintInvalidations();
2948f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    m_isTrackingPaintInvalidations = trackPaintInvalidations;
29495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2951f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void FrameView::resetTrackedPaintInvalidations()
29525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2953f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    m_trackedPaintInvalidationRects.clear();
2954926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (RenderView* renderView = this->renderView())
2955e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        renderView->compositor()->resetTrackedPaintInvalidationRects();
29565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2958f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)String FrameView::trackedPaintInvalidationRectsAsText() const
29595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TextStream ts;
2961f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    if (!m_trackedPaintInvalidationRects.isEmpty()) {
29625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ts << "(repaint rects\n";
2963f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        for (size_t i = 0; i < m_trackedPaintInvalidationRects.size(); ++i)
2964f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            ts << "  (rect " << m_trackedPaintInvalidationRects[i].x() << " " << m_trackedPaintInvalidationRects[i].y() << " " << m_trackedPaintInvalidationRects[i].width() << " " << m_trackedPaintInvalidationRects[i].height() << ")\n";
29655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ts << ")\n";
29665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
29675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ts.release();
29685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2970f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid FrameView::addResizerArea(RenderBox& resizerBox)
297181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){
297281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (!m_resizerAreas)
297381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        m_resizerAreas = adoptPtr(new ResizerAreaSet);
2974f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    m_resizerAreas->add(&resizerBox);
297581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)}
297681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
2977f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid FrameView::removeResizerArea(RenderBox& resizerBox)
297881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){
297981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (!m_resizerAreas)
298081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        return;
298181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
2982f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    ResizerAreaSet::iterator it = m_resizerAreas->find(&resizerBox);
298381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (it != m_resizerAreas->end())
298481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        m_resizerAreas->remove(it);
298581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)}
298681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
2987d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void FrameView::addScrollableArea(ScrollableArea* scrollableArea)
29885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2989bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ASSERT(scrollableArea);
29905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_scrollableAreas)
29915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollableAreas = adoptPtr(new ScrollableAreaSet);
2992d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    m_scrollableAreas->add(scrollableArea);
29935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2995d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void FrameView::removeScrollableArea(ScrollableArea* scrollableArea)
29965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_scrollableAreas)
2998d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return;
2999d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    m_scrollableAreas->remove(scrollableArea);
30005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3002197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid FrameView::setParent(Widget* widget)
3003197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
3004197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    ScrollView::setParent(widget);
3005197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    updateScrollableAreaSet();
3006197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
3007197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
30085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameView::removeChild(Widget* widget)
30095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
30105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (widget->isFrameView())
3011926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        removeScrollableArea(toFrameView(widget));
30125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollView::removeChild(widget);
30145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::wheelEvent(const PlatformWheelEvent& wheelEvent)
30175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
301810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    bool allowScrolling = userInputScrollable(HorizontalScrollbar) || userInputScrollable(VerticalScrollbar);
301910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
3020926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Note that to allow for rubber-band over-scroll behavior, even non-scrollable views
3021926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // should handle wheel events.
302206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#if !USE(RUBBER_BANDING)
3023926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!isScrollable())
302410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        allowScrolling = false;
3025926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
3026926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
302710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (allowScrolling && ScrollableArea::handleWheelEvent(wheelEvent))
302810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        return true;
30295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
303010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // If the frame didn't handle the event, give the pinch-zoom viewport a chance to
303110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // process the scroll event.
303210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (m_frame->settings()->pinchVirtualViewportEnabled() && m_frame->isMainFrame())
303310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        return page()->frameHost().pinchViewport().handleWheelEvent(wheelEvent);
303410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
303510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return false;
30365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isVerticalDocument() const
30395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3040926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
3041926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
30425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
30435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3044926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return renderView->style()->isHorizontalWritingMode();
30455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameView::isFlippedDocument() const
30485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3049926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* renderView = this->renderView();
3050926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderView)
30515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
30525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3053926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return renderView->style()->isFlippedBlocksWritingMode();
30545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccibool FrameView::scrollbarsDisabled() const
30577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
30587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!m_frame->settings() || !m_frame->settings()->pinchVirtualViewportEnabled())
30597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return false;
30607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
30617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return m_frame->isMainFrame() && ScrollbarTheme::theme()->usesOverlayScrollbars();
30627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
30637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
30645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)AXObjectCache* FrameView::axObjectCache() const
30655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
30668abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (frame().document())
30678abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return frame().document()->existingAXObjectCache();
30685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
30695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3070591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
3071f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void FrameView::setCursor(const Cursor& cursor)
3072f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){
3073f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    Page* page = frame().page();
307410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (!page || !page->settings().deviceSupportsMouse())
3075f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return;
3076f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    page->chrome().setCursor(cursor);
3077f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)}
3078f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
3079bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void FrameView::frameRectsChanged()
3080bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
3081bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (layoutSizeFixedToFrameSize())
3082bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        setLayoutSizeInternal(frameRect().size());
3083bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
3084bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ScrollView::frameRectsChanged();
3085bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
3086bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
3087bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void FrameView::setLayoutSizeInternal(const IntSize& size)
3088bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
3089bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (m_layoutSize == size)
3090bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return;
3091bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
3092bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    m_layoutSize = size;
3093bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    contentsResized();
3094bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
3095bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
309651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void FrameView::didAddScrollbar(Scrollbar* scrollbar, ScrollbarOrientation orientation)
309751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
309851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ScrollableArea::didAddScrollbar(scrollbar, orientation);
309951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (AXObjectCache* cache = axObjectCache())
310051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        cache->handleScrollbarUpdate(this);
310151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
310251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
310351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void FrameView::willRemoveScrollbar(Scrollbar* scrollbar, ScrollbarOrientation orientation)
310451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
310551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ScrollableArea::willRemoveScrollbar(scrollbar, orientation);
310651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (AXObjectCache* cache = axObjectCache()) {
310751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        cache->remove(scrollbar);
310851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        cache->handleScrollbarUpdate(this);
310951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
311051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
311151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
31127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid FrameView::setTopControlsViewportAdjustment(float adjustment)
31137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
31147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_topControlsViewportAdjustment = adjustment;
31157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
31167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
31177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciIntPoint FrameView::maximumScrollPosition() const
31187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
31197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    FloatSize visibleContentSizeF = unscaledVisibleContentSize(ExcludeScrollbars);
31207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    visibleContentSizeF.expand(0, -m_topControlsViewportAdjustment);
31217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    visibleContentSizeF.scale(1 / visibleContentScaleFactor());
31227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    IntSize visibleSize = expandedIntSize(visibleContentSizeF);
31237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
31247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    IntPoint maximumOffset(
31257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        contentsWidth() - visibleSize.width() - scrollOrigin().x(),
31267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        contentsHeight() - visibleSize.height() - scrollOrigin().y());
31277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    maximumOffset.clampNegativeToZero();
31287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return maximumOffset;
31297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
31307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
3131c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
3132