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