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