1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful, 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details. 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB. If not, write to 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA. 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderView.h" 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h" 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Element.h" 26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "FloatQuad.h" 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h" 30e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include "HTMLFrameOwnerElement.h" 318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "HitTestResult.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderLayer.h" 338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "RenderSelectionInfo.h" 348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "RenderWidget.h" 35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "RenderWidgetProtector.h" 368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "TransformState.h" 378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if USE(ACCELERATED_COMPOSITING) 398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "RenderLayerCompositor.h" 408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4284ebbd1fa3feaf3979b8f4576ae6434cd8812013Shimeng (Simon) Wang#if defined(ANDROID_LAYOUT) || defined(ANDROID_FIXED_ELEMENTS) 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h" 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderView::RenderView(Node* node, FrameView* view) 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : RenderBlock(node) 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_frameView(view) 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_selectionStart(0) 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_selectionEnd(0) 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_selectionStartPos(-1) 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_selectionEndPos(-1) 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_maximalOutlineSize(0) 56f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch , m_pageLogicalHeight(0) 57f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch , m_pageLogicalHeightChanged(false) 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_layoutState(0) 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_layoutStateDisableCount(0) 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Clear our anonymous bit, set because RenderObject assumes 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // any renderer with document as the node is anonymous. 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setIsAnonymous(false); 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // init RenderObject attributes 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setInline(false); 67635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 68bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_minPreferredLogicalWidth = 0; 69bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_maxPreferredLogicalWidth = 0; 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 71bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen setPreferredLogicalWidthsDirty(true, false); 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setPositioned(true); // to 0,0 :) 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderView::~RenderView() 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 80bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid RenderView::computeLogicalHeight() 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!printing() && m_frameView) 83bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen setLogicalHeight(viewLogicalHeight()); 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 86bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid RenderView::computeLogicalWidth() 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!printing() && m_frameView) 89e1a0cd8247467a70fed9f6099fc9c65ec35ae23eKristian Monsen setLogicalWidth(viewLogicalWidth()); 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_LAYOUT 9123e9dd818a876304304944c844be7625f63383c4Shimeng (Simon) Wang setVisibleWidth(m_frameView->textWrapWidth()); 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 95bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid RenderView::computePreferredLogicalWidths() 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 97bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen ASSERT(preferredLogicalWidthsDirty()); 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 99bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen RenderBlock::computePreferredLogicalWidths(); 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 101bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_maxPreferredLogicalWidth = m_minPreferredLogicalWidth; 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 104e14391e94c850b8bd03680c23b38978db68687a8John Reckbool RenderView::isChildAllowed(RenderObject* child, RenderStyle*) const 105e14391e94c850b8bd03680c23b38978db68687a8John Reck{ 106e14391e94c850b8bd03680c23b38978db68687a8John Reck return child->isBox(); 107e14391e94c850b8bd03680c23b38978db68687a8John Reck} 108e14391e94c850b8bd03680c23b38978db68687a8John Reck 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderView::layout() 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11168513a70bcd92384395513322f1b801e7bf9c729Steve Block if (!document()->paginated()) 112f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch setPageLogicalHeight(0); 11368513a70bcd92384395513322f1b801e7bf9c729Steve Block 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (printing()) 1152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = logicalWidth(); 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Use calcWidth/Height to get the new width/height, since this will take the full page zoom factor into account. 118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool relayoutChildren = !printing() && (!m_frameView || width() != viewWidth() || height() != viewHeight()); 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (relayoutChildren) { 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setChildNeedsLayout(true, false); 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RenderObject* child = firstChild(); child; child = child->nextSibling()) { 122bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (child->style()->logicalHeight().isPercent() || child->style()->logicalMinHeight().isPercent() || child->style()->logicalMaxHeight().isPercent()) 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project child->setChildNeedsLayout(true, false); 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!m_layoutState); 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LayoutState state; 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: May be better to push a clip and avoid issuing offscreen repaints. 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project state.m_clipped = false; 131f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch state.m_pageLogicalHeight = m_pageLogicalHeight; 132f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch state.m_pageLogicalHeightChanged = m_pageLogicalHeightChanged; 133f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_pageLogicalHeightChanged = false; 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_layoutState = &state; 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (needsLayout()) 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderBlock::layout(); 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(layoutDelta() == IntSize()); 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_layoutStateDisableCount == 0); 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_layoutState == &state); 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_layoutState = 0; 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setNeedsLayout(false); 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid RenderView::mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool fixed, bool useTransforms, TransformState& transformState) const 147635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // If a container was specified, and was not 0 or the RenderView, 149635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // then we should have found it by now. 150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT_UNUSED(repaintContainer, !repaintContainer || repaintContainer == this); 151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (useTransforms && shouldUseTransformFromContainer(0)) { 15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch TransformationMatrix t; 15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch getTransformFromContainer(0, IntSize(), t); 15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch transformState.applyTransform(t); 15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 158635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (fixed && m_frameView) 1592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block transformState.move(m_frameView->scrollOffsetForFixedPosition()); 1608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 161635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid RenderView::mapAbsoluteToLocalPoint(bool fixed, bool useTransforms, TransformState& transformState) const 1638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 1648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (fixed && m_frameView) 1652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block transformState.move(-m_frameView->scrollOffsetForFixedPosition()); 16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (useTransforms && shouldUseTransformFromContainer(0)) { 16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch TransformationMatrix t; 16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch getTransformFromContainer(0, IntSize(), t); 17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch transformState.applyTransform(t); 17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderView::paint(PaintInfo& paintInfo, int tx, int ty) 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we ever require layout but receive a paint anyway, something has gone horribly wrong. 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!needsLayout()); 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project paintObject(paintInfo, tx, ty); 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenstatic inline bool isComposited(RenderObject* object) 18206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 18306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return object->hasLayer() && toRenderBoxModelObject(object)->layer()->isComposited(); 18406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 18506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 186635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic inline bool rendererObscuresBackground(RenderObject* object) 187635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 18806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return object && object->style()->visibility() == VISIBLE 18906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen && object->style()->opacity() == 1 19006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen && !object->style()->hasTransform() 19106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen && !isComposited(object); 192635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 193635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 194635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid RenderView::paintBoxDecorations(PaintInfo& paintInfo, int, int) 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check to see if we are enclosed by a layer that requires complex painting rules. If so, we cannot blit 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // when scrolling, and we need to use slow repaints. Examples of layers that require this are transparent layers, 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // layers with reflections, or transformed layers. 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: This needs to be dynamic. We should be able to go back to blitting if we ever stop being inside 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // a transform, transparency layer, etc. 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Element* elt; 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (elt = document()->ownerElement(); view() && elt && elt->renderer(); elt = elt->document()->ownerElement()) { 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderLayer* layer = elt->renderer()->enclosingLayer(); 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (layer->requiresSlowRepaints()) { 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project frameView()->setUseSlowRepaints(); 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#if USE(ACCELERATED_COMPOSITING) 2106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (RenderLayer* compositingLayer = layer->enclosingCompositingLayer()) { 2116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!compositingLayer->backing()->paintingGoesToWindow()) { 2126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen frameView()->setUseSlowRepaints(); 2136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen break; 2146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 2156c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 2166c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#endif 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (document()->ownerElement() || !view()) 22006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return; 22106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 22206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen bool rootFillsViewport = false; 22306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen Node* documentElement = document()->documentElement(); 22406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (RenderObject* rootRenderer = documentElement ? documentElement->renderer() : 0) { 22506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // The document element's renderer is currently forced to be a block, but may not always be. 22606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen RenderBox* rootBox = rootRenderer->isBox() ? toRenderBox(rootRenderer) : 0; 22706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen rootFillsViewport = rootBox && !rootBox->x() && !rootBox->y() && rootBox->width() >= width() && rootBox->height() >= height(); 22806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 2292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch float pageScaleFactor = 1; 2312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (Frame* frame = m_frameView->frame()) 2322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch pageScaleFactor = frame->pageScaleFactor(); 2332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 234635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // If painting will entirely fill the view, no need to fill the background. 2352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (rootFillsViewport && rendererObscuresBackground(firstChild()) && pageScaleFactor >= 1) 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 238635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // This code typically only executes if the root element's visibility has been set to hidden, 2392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // if there is a transform on the <html>, or if there is a page scale factor less than 1. 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Only fill with the base background color (typically white) if we're the root document, 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // since iframes/frames with no background in the child document should show the parent's background. 2425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (frameView()->isTransparent()) // FIXME: This needs to be dynamic. We should be able to go back to blitting if we ever stop being transparent. 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project frameView()->setUseSlowRepaints(); // The parent must show behind the child. 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else { 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Color baseColor = frameView()->baseBackgroundColor(); 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (baseColor.alpha() > 0) { 247f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch CompositeOperator previousOperator = paintInfo.context->compositeOperation(); 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project paintInfo.context->setCompositeOperation(CompositeCopy); 249643ca7872b450ea4efacab6188849e5aac2ba161Steve Block paintInfo.context->fillRect(paintInfo.rect, baseColor, style()->colorSpace()); 250f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch paintInfo.context->setCompositeOperation(previousOperator); 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project paintInfo.context->clearRect(paintInfo.rect); 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool RenderView::shouldRepaint(const IntRect& r) const 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (printing() || r.width() == 0 || r.height() == 0) 2598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return false; 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frameView) 2628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return false; 2638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return true; 2658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 2668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderView::repaintViewRectangle(const IntRect& ur, bool immediate) 2688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 2698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!shouldRepaint(ur)) 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We always just invalidate the root view, since we could be an iframe that is clipped out 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // or even invisible. 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Element* elt = document()->ownerElement(); 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!elt) 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frameView->repaintContentRectangle(ur, immediate); 277635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project else if (RenderBox* obj = elt->renderBox()) { 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IntRect vr = viewRect(); 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IntRect r = intersection(ur, vr); 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Subtract out the contentsX and contentsY offsets to get our coords within the viewing 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // rectangle. 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project r.move(-vr.x(), -vr.y()); 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Hardcoded offsets here are not good. 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project r.move(obj->borderLeft() + obj->paddingLeft(), 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project obj->borderTop() + obj->paddingTop()); 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project obj->repaintRectangle(r, immediate); 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderView::repaintRectangleInViewAndCompositedLayers(const IntRect& ur, bool immediate) 2938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 2948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!shouldRepaint(ur)) 2958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 2968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintViewRectangle(ur, immediate); 2988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if USE(ACCELERATED_COMPOSITING) 3008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (compositor()->inCompositingMode()) 3018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian compositor()->repaintCompositedLayersAbsoluteRect(ur); 3028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 3038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 3048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderView::computeRectForRepaint(RenderBoxModelObject* repaintContainer, IntRect& rect, bool fixed) 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 307635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // If a container was specified, and was not 0 or the RenderView, 308635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // then we should have found it by now. 309635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT_UNUSED(repaintContainer, !repaintContainer || repaintContainer == this); 310635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (printing()) 3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (style()->isFlippedBlocksWritingMode()) { 3156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner // We have to flip by hand since the view's logical height has not been determined. We 3166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner // can use the viewport width and height. 3176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (style()->isHorizontalWritingMode()) 3182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block rect.setY(viewHeight() - rect.maxY()); 3196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner else 3202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block rect.setX(viewWidth() - rect.maxX()); 3216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner } 3226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (fixed && m_frameView) 3242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block rect.move(m_frameView->scrollXForFixedPosition(), m_frameView->scrollYForFixedPosition()); 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Apply our transform if we have one (because of full page zooming). 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_layer && m_layer->transform()) 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rect = m_layer->transform()->mapRect(rect); 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid RenderView::absoluteRects(Vector<IntRect>& rects, int tx, int ty) 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rects.append(IntRect(tx, ty, m_layer->width(), m_layer->height())); 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid RenderView::absoluteQuads(Vector<FloatQuad>& quads) 337635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 338635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project quads.append(FloatRect(0, 0, m_layer->width(), m_layer->height())); 339635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 340635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 341635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic RenderObject* rendererAfterPosition(RenderObject* object, unsigned offset) 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!object) 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* child = object->childAt(offset); 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return child ? child : object->nextInPreOrderAfterChildren(); 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 350635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectIntRect RenderView::selectionBounds(bool clipToVisibleContent) const 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian document()->updateStyleIfNeeded(); 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian typedef HashMap<RenderObject*, RenderSelectionInfo*> SelectionMap; 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SelectionMap selectedObjects; 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* os = m_selectionStart; 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* stop = rendererAfterPosition(m_selectionEnd, m_selectionEndPos); 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (os && os != stop) { 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ((os->canBeSelectionLeaf() || os == m_selectionStart || os == m_selectionEnd) && os->selectionState() != SelectionNone) { 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Blocks are responsible for painting line gaps and margin gaps. They must be examined as well. 3628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian selectedObjects.set(os, new RenderSelectionInfo(os, clipToVisibleContent)); 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderBlock* cb = os->containingBlock(); 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (cb && !cb->isRenderView()) { 3658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderSelectionInfo* blockInfo = selectedObjects.get(cb); 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (blockInfo) 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 3688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian selectedObjects.set(cb, new RenderSelectionInfo(cb, clipToVisibleContent)); 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cb = cb->containingBlock(); 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project os = os->nextInPreOrder(); 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Now create a single bounding box rect that encloses the whole selection. 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IntRect selRect; 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SelectionMap::iterator end = selectedObjects.end(); 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (SelectionMap::iterator i = selectedObjects.begin(); i != end; ++i) { 3808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderSelectionInfo* info = i->second; 381643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // RenderSelectionInfo::rect() is in the coordinates of the repaintContainer, so map to page coordinates. 382643ca7872b450ea4efacab6188849e5aac2ba161Steve Block IntRect currRect = info->rect(); 383643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (RenderBoxModelObject* repaintContainer = info->repaintContainer()) { 384643ca7872b450ea4efacab6188849e5aac2ba161Steve Block FloatQuad absQuad = repaintContainer->localToAbsoluteQuad(FloatRect(currRect)); 385643ca7872b450ea4efacab6188849e5aac2ba161Steve Block currRect = absQuad.enclosingBoundingBox(); 386643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 387643ca7872b450ea4efacab6188849e5aac2ba161Steve Block selRect.unite(currRect); 3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete info; 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return selRect; 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if USE(ACCELERATED_COMPOSITING) 3948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian// Compositing layer dimensions take outline size into account, so we have to recompute layer 3958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian// bounds when it changes. 3968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian// FIXME: This is ugly; it would be nice to have a better way to do this. 3978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderView::setMaximalOutlineSize(int o) 3988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 3998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (o != m_maximalOutlineSize) { 4008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_maximalOutlineSize = o; 4018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 4020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // maximalOutlineSize affects compositing layer dimensions. 4030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch compositor()->setCompositingLayersNeedRebuild(); // FIXME: this really just needs to be a geometry update. 4048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 4058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 4068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 4078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 4085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid RenderView::setSelection(RenderObject* start, int startPos, RenderObject* end, int endPos, SelectionRepaintMode blockRepaintMode) 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Make sure both our start and end objects are defined. 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check www.msnbc.com and try clicking around to find the case where this happened. 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ((start && !end) || (end && !start)) 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Just return if the selection hasn't changed. 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_selectionStart == start && m_selectionStartPos == startPos && 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_selectionEnd == end && m_selectionEndPos == endPos) 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Record the old selected objects. These will be used later 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // when we compare against the new selected objects. 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int oldStartPos = m_selectionStartPos; 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int oldEndPos = m_selectionEndPos; 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Objects each have a single selection rect to examine. 4268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian typedef HashMap<RenderObject*, RenderSelectionInfo*> SelectedObjectMap; 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SelectedObjectMap oldSelectedObjects; 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SelectedObjectMap newSelectedObjects; 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Blocks contain selected objects and fill gaps between them, either on the left, right, or in between lines and blocks. 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // In order to get the repaint rect right, we have to examine left, middle, and right rects individually, since otherwise 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the union of those rects might remain the same even when changes have occurred. 4338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian typedef HashMap<RenderBlock*, RenderBlockSelectionInfo*> SelectedBlockMap; 4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SelectedBlockMap oldSelectedBlocks; 4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SelectedBlockMap newSelectedBlocks; 4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* os = m_selectionStart; 4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* stop = rendererAfterPosition(m_selectionEnd, m_selectionEndPos); 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (os && os != stop) { 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ((os->canBeSelectionLeaf() || os == m_selectionStart || os == m_selectionEnd) && os->selectionState() != SelectionNone) { 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Blocks are responsible for painting line gaps and margin gaps. They must be examined as well. 4428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian oldSelectedObjects.set(os, new RenderSelectionInfo(os, true)); 443967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (blockRepaintMode == RepaintNewXOROld) { 444967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch RenderBlock* cb = os->containingBlock(); 445967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch while (cb && !cb->isRenderView()) { 446967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch RenderBlockSelectionInfo* blockInfo = oldSelectedBlocks.get(cb); 447967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (blockInfo) 448967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch break; 449967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch oldSelectedBlocks.set(cb, new RenderBlockSelectionInfo(cb)); 450967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch cb = cb->containingBlock(); 451967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch } 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project os = os->nextInPreOrder(); 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Now clear the selection. 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SelectedObjectMap::iterator oldObjectsEnd = oldSelectedObjects.end(); 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (SelectedObjectMap::iterator i = oldSelectedObjects.begin(); i != oldObjectsEnd; ++i) 4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project i->first->setSelectionState(SelectionNone); 4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // set selection start and end 4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_selectionStart = start; 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_selectionStartPos = startPos; 4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_selectionEnd = end; 4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_selectionEndPos = endPos; 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Update the selection status of all objects between m_selectionStart and m_selectionEnd 4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (start && start == end) 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project start->setSelectionState(SelectionBoth); 4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else { 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (start) 4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project start->setSelectionState(SelectionStart); 4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (end) 4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project end->setSelectionState(SelectionEnd); 4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* o = start; 4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project stop = rendererAfterPosition(end, endPos); 4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (o && o != stop) { 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (o != start && o != end && o->canBeSelectionLeaf()) 4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o->setSelectionState(SelectionInside); 4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->nextInPreOrder(); 4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 488643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_layer->clearBlockSelectionGapsBounds(); 4895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Now that the selection state has been updated for the new objects, walk them again and 4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // put them in the new objects list. 4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = start; 4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (o && o != stop) { 4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ((o->canBeSelectionLeaf() || o == start || o == end) && o->selectionState() != SelectionNone) { 4958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian newSelectedObjects.set(o, new RenderSelectionInfo(o, true)); 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderBlock* cb = o->containingBlock(); 4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (cb && !cb->isRenderView()) { 4988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderBlockSelectionInfo* blockInfo = newSelectedBlocks.get(cb); 4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (blockInfo) 5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 501643ca7872b450ea4efacab6188849e5aac2ba161Steve Block newSelectedBlocks.set(cb, new RenderBlockSelectionInfo(cb)); 5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cb = cb->containingBlock(); 5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->nextInPreOrder(); 5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frameView) { 5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We built the maps, but we aren't going to use them. 5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We need to delete the values, otherwise they'll all leak! 5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project deleteAllValues(oldSelectedObjects); 5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project deleteAllValues(newSelectedObjects); 5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project deleteAllValues(oldSelectedBlocks); 5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project deleteAllValues(newSelectedBlocks); 5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 519231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_frameView->beginDeferredRepaints(); 520231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Have any of the old selected objects changed compared to the new selection? 5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (SelectedObjectMap::iterator i = oldSelectedObjects.begin(); i != oldObjectsEnd; ++i) { 5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* obj = i->first; 5248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderSelectionInfo* newInfo = newSelectedObjects.get(obj); 5258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderSelectionInfo* oldInfo = i->second; 5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!newInfo || oldInfo->rect() != newInfo->rect() || oldInfo->state() != newInfo->state() || 5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (m_selectionStart == obj && oldStartPos != m_selectionStartPos) || 5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (m_selectionEnd == obj && oldEndPos != m_selectionEndPos)) { 5298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian oldInfo->repaint(); 5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newInfo) { 5318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian newInfo->repaint(); 5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newSelectedObjects.remove(obj); 5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete newInfo; 5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete oldInfo; 5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Any new objects that remain were not found in the old objects dict, and so they need to be updated. 5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SelectedObjectMap::iterator newObjectsEnd = newSelectedObjects.end(); 5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (SelectedObjectMap::iterator i = newSelectedObjects.begin(); i != newObjectsEnd; ++i) { 5428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderSelectionInfo* newInfo = i->second; 5438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian newInfo->repaint(); 5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete newInfo; 5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Have any of the old blocks changed? 5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SelectedBlockMap::iterator oldBlocksEnd = oldSelectedBlocks.end(); 5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (SelectedBlockMap::iterator i = oldSelectedBlocks.begin(); i != oldBlocksEnd; ++i) { 5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderBlock* block = i->first; 5518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderBlockSelectionInfo* newInfo = newSelectedBlocks.get(block); 5528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderBlockSelectionInfo* oldInfo = i->second; 5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!newInfo || oldInfo->rects() != newInfo->rects() || oldInfo->state() != newInfo->state()) { 554967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch oldInfo->repaint(); 5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newInfo) { 5568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian newInfo->repaint(); 5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newSelectedBlocks.remove(block); 5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete newInfo; 5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete oldInfo; 5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Any new blocks that remain were not found in the old blocks dict, and so they need to be updated. 5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SelectedBlockMap::iterator newBlocksEnd = newSelectedBlocks.end(); 5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (SelectedBlockMap::iterator i = newSelectedBlocks.begin(); i != newBlocksEnd; ++i) { 5678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderBlockSelectionInfo* newInfo = i->second; 5688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian newInfo->repaint(); 5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete newInfo; 5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 571231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 572231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_frameView->endDeferredRepaints(); 5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderView::clearSelection() 5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 577643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_layer->repaintBlockSelectionGaps(); 5785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian setSelection(0, -1, 0, -1, RepaintNewMinusOld); 5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderView::selectionStartEnd(int& startPos, int& endPos) const 5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project startPos = m_selectionStartPos; 5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project endPos = m_selectionEndPos; 5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderView::printing() const 5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return document()->printing(); 5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 592f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochsize_t RenderView::getRetainedWidgets(Vector<RenderWidget*>& renderWidgets) 5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 594dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block size_t size = m_widgets.size(); 595dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 596dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block renderWidgets.reserveCapacity(size); 597dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 598dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RenderWidgetSet::const_iterator end = m_widgets.end(); 599dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (RenderWidgetSet::const_iterator it = m_widgets.begin(); it != end; ++it) { 600dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block renderWidgets.uncheckedAppend(*it); 601dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block (*it)->ref(); 602dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 603dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 604f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return size; 605f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 606f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 607f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid RenderView::releaseWidgets(Vector<RenderWidget*>& renderWidgets) 608f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 609f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch size_t size = renderWidgets.size(); 610f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 611f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch for (size_t i = 0; i < size; ++i) 612f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch renderWidgets[i]->deref(renderArena()); 613f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 614f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 615f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid RenderView::updateWidgetPositions() 616f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 617f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // updateWidgetPosition() can possibly cause layout to be re-entered (via plug-ins running 618f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // scripts in response to NPP_SetWindow, for example), so we need to keep the Widgets 619f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // alive during enumeration. 620f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 621f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Vector<RenderWidget*> renderWidgets; 622f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch size_t size = getRetainedWidgets(renderWidgets); 623f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 624dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (size_t i = 0; i < size; ++i) 625dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block renderWidgets[i]->updateWidgetPosition(); 626dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 627dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (size_t i = 0; i < size; ++i) 628dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block renderWidgets[i]->widgetPositionsUpdated(); 629dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 630f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch releaseWidgets(renderWidgets); 6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderView::addWidget(RenderWidget* o) 6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_widgets.add(o); 6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderView::removeWidget(RenderWidget* o) 6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_widgets.remove(o); 6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 643f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid RenderView::notifyWidgets(WidgetNotification notification) 644f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 645f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Vector<RenderWidget*> renderWidgets; 646f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch size_t size = getRetainedWidgets(renderWidgets); 647f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 648f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch for (size_t i = 0; i < size; ++i) 649f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch renderWidgets[i]->notifyWidget(notification); 650f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 651f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch releaseWidgets(renderWidgets); 652f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 653f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect RenderView::viewRect() const 6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (printing()) 657635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return IntRect(0, 0, width(), height()); 6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frameView) 6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_frameView->visibleContentRect(); 6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return IntRect(); 6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 663f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochint RenderView::docTop() const 6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block IntRect overflowRect(0, minYLayoutOverflow(), 0, maxYLayoutOverflow() - minYLayoutOverflow()); 666f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch flipForWritingMode(overflowRect); 667f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (hasTransform()) 668f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch overflowRect = layer()->currentTransform().mapRect(overflowRect); 669f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return overflowRect.y(); 670f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 672f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochint RenderView::docBottom() const 673f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 674f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch IntRect overflowRect(layoutOverflowRect()); 675f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch flipForWritingMode(overflowRect); 676f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (hasTransform()) 677f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch overflowRect = layer()->currentTransform().mapRect(overflowRect); 6782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return overflowRect.maxY(); 6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6814a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdochint RenderView::docLeft() const 6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 683f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch IntRect overflowRect(layoutOverflowRect()); 684f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch flipForWritingMode(overflowRect); 685f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (hasTransform()) 686f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch overflowRect = layer()->currentTransform().mapRect(overflowRect); 687f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return overflowRect.x(); 6884a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch} 6894a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch 690f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochint RenderView::docRight() const 6914a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch{ 692f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch IntRect overflowRect(layoutOverflowRect()); 693f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch flipForWritingMode(overflowRect); 694f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (hasTransform()) 695f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch overflowRect = layer()->currentTransform().mapRect(overflowRect); 6962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return overflowRect.maxX(); 6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint RenderView::viewHeight() const 7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int height = 0; 702635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!printing() && m_frameView) { 703635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project height = m_frameView->layoutHeight(); 704635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project height = m_frameView->useFixedLayout() ? ceilf(style()->effectiveZoom() * float(height)) : height; 705635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return height; 7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint RenderView::viewWidth() const 7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int width = 0; 712635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!printing() && m_frameView) { 713635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project width = m_frameView->layoutWidth(); 714635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project width = m_frameView->useFixedLayout() ? ceilf(style()->effectiveZoom() * float(width)) : width; 715635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return width; 7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianfloat RenderView::zoomFactor() const 7208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 72168513a70bcd92384395513322f1b801e7bf9c729Steve Block Frame* frame = m_frameView->frame(); 72268513a70bcd92384395513322f1b801e7bf9c729Steve Block return frame ? frame->pageZoomFactor() : 1; 7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderView::pushLayoutState(RenderObject* root) 7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_layoutStateDisableCount == 0); 7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_layoutState == 0); 7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_layoutState = new (renderArena()) LayoutState(root); 7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 733d0825bca7fe65beaee391d30da42e937db621564Steve Blockbool RenderView::shouldDisableLayoutStateForSubtree(RenderObject* renderer) const 734d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 735d0825bca7fe65beaee391d30da42e937db621564Steve Block RenderObject* o = renderer; 736d0825bca7fe65beaee391d30da42e937db621564Steve Block while (o) { 737d0825bca7fe65beaee391d30da42e937db621564Steve Block if (o->hasColumns() || o->hasTransform() || o->hasReflection()) 738d0825bca7fe65beaee391d30da42e937db621564Steve Block return true; 739d0825bca7fe65beaee391d30da42e937db621564Steve Block o = o->container(); 740d0825bca7fe65beaee391d30da42e937db621564Steve Block } 741d0825bca7fe65beaee391d30da42e937db621564Steve Block return false; 742d0825bca7fe65beaee391d30da42e937db621564Steve Block} 743d0825bca7fe65beaee391d30da42e937db621564Steve Block 7448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderView::updateHitTestResult(HitTestResult& result, const IntPoint& point) 7458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 7468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (result.innerNode()) 7478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 7488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 7498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Node* node = document()->documentElement(); 7508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (node) { 7518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result.setInnerNode(node); 7528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!result.innerNonSharedNode()) 7538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result.setInnerNonSharedNode(node); 7548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result.setLocalPoint(point); 7558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 7568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 7578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 75868513a70bcd92384395513322f1b801e7bf9c729Steve Block// FIXME: This function is obsolete and only used by embedded WebViews inside AppKit NSViews. 75968513a70bcd92384395513322f1b801e7bf9c729Steve Block// Do not add callers of this function! 76068513a70bcd92384395513322f1b801e7bf9c729Steve Block// The idea here is to take into account what object is moving the pagination point, and 76168513a70bcd92384395513322f1b801e7bf9c729Steve Block// thus choose the best place to chop it. 76268513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid RenderView::setBestTruncatedAt(int y, RenderBoxModelObject* forRenderer, bool forcedBreak) 76368513a70bcd92384395513322f1b801e7bf9c729Steve Block{ 76468513a70bcd92384395513322f1b801e7bf9c729Steve Block // Nobody else can set a page break once we have a forced break. 76568513a70bcd92384395513322f1b801e7bf9c729Steve Block if (m_legacyPrinting.m_forcedPageBreak) 76668513a70bcd92384395513322f1b801e7bf9c729Steve Block return; 76768513a70bcd92384395513322f1b801e7bf9c729Steve Block 76868513a70bcd92384395513322f1b801e7bf9c729Steve Block // Forced breaks always win over unforced breaks. 76968513a70bcd92384395513322f1b801e7bf9c729Steve Block if (forcedBreak) { 77068513a70bcd92384395513322f1b801e7bf9c729Steve Block m_legacyPrinting.m_forcedPageBreak = true; 77168513a70bcd92384395513322f1b801e7bf9c729Steve Block m_legacyPrinting.m_bestTruncatedAt = y; 77268513a70bcd92384395513322f1b801e7bf9c729Steve Block return; 77368513a70bcd92384395513322f1b801e7bf9c729Steve Block } 77468513a70bcd92384395513322f1b801e7bf9c729Steve Block 77568513a70bcd92384395513322f1b801e7bf9c729Steve Block // Prefer the widest object that tries to move the pagination point 77668513a70bcd92384395513322f1b801e7bf9c729Steve Block IntRect boundingBox = forRenderer->borderBoundingBox(); 77768513a70bcd92384395513322f1b801e7bf9c729Steve Block if (boundingBox.width() > m_legacyPrinting.m_truncatorWidth) { 77868513a70bcd92384395513322f1b801e7bf9c729Steve Block m_legacyPrinting.m_truncatorWidth = boundingBox.width(); 77968513a70bcd92384395513322f1b801e7bf9c729Steve Block m_legacyPrinting.m_bestTruncatedAt = y; 78068513a70bcd92384395513322f1b801e7bf9c729Steve Block } 78168513a70bcd92384395513322f1b801e7bf9c729Steve Block} 78268513a70bcd92384395513322f1b801e7bf9c729Steve Block 7838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if USE(ACCELERATED_COMPOSITING) 7848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool RenderView::usesCompositing() const 7858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 7868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return m_compositor && m_compositor->inCompositingMode(); 7878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 7888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 7898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianRenderLayerCompositor* RenderView::compositor() 7908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 7918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!m_compositor) 7928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_compositor.set(new RenderLayerCompositor(this)); 7938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 7948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return m_compositor.get(); 7958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 7968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 7978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 7988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderView::didMoveOnscreen() 7998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 8008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if USE(ACCELERATED_COMPOSITING) 8018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_compositor) 8028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_compositor->didMoveOnscreen(); 8038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 8048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 8058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 8068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderView::willMoveOffscreen() 8078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 8088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if USE(ACCELERATED_COMPOSITING) 8098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_compositor) 8108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_compositor->willMoveOffscreen(); 8118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 8128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 8138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 815