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