RenderObject.cpp revision cad810f21b803229eb11403f9209855525a25d57
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (C) 1999 Antti Koivisto (koivisto@kde.org) 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (C) 2000 Dirk Mueller (mueller@kde.org) 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com) 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 7643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2009 Google Inc. All rights reserved. 8231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version. 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful, 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details. 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB. If not, write to 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderObject.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "AXObjectCache.h" 31d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "Chrome.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSStyleSelector.h" 33ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include "DashArray.h" 344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "EditingBoundary.h" 35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "FloatQuad.h" 368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "Frame.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h" 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h" 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HitTestResult.h" 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h" 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderArena.h" 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderCounter.h" 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderFlexibleBox.h" 455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "RenderImage.h" 465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "RenderImageResourceStyleImage.h" 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderInline.h" 48545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "RenderLayer.h" 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderListItem.h" 50643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "RenderRuby.h" 51643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "RenderRubyText.h" 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderTableCell.h" 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderTableCol.h" 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderTableRow.h" 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderTheme.h" 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderView.h" 578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "TransformState.h" 58231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "htmlediting.h" 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <algorithm> 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_LAYOUT 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h" 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <stdio.h> 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/RefCountedLeakCounter.h> 658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include <wtf/UnusedParam.h> 668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if USE(ACCELERATED_COMPOSITING) 688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "RenderLayerCompositor.h" 698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 71635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML) 72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WMLNames.h" 73635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 75d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(SVG) 7621939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "RenderSVGResourceContainer.h" 77d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "SVGRenderSupport.h" 78d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 79d0825bca7fe65beaee391d30da42e937db621564Steve Block 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace std; 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames; 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void* baseOfRenderObjectBeingDeleted; 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::s_affectsParentBlock = false; 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid* RenderObject::operator new(size_t sz, RenderArena* renderArena) throw() 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return renderArena->allocate(sz); 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::operator delete(void* ptr, size_t sz) 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(baseOfRenderObjectBeingDeleted == ptr); 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Stash size where destroy can find it. 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *(size_t *)ptr = sz; 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::createObject(Node* node, RenderStyle* style) 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Document* doc = node->document(); 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderArena* arena = doc->renderArena(); 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Minimal support for content properties replacing an entire element. 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Works only if we have exactly one piece of content and it's a URL. 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Otherwise acts as if we didn't support this feature. 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ContentData* contentData = style->contentData(); 1148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (contentData && !contentData->next() && contentData->isImage() && doc != node) { 1155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen RenderImage* image = new (arena) RenderImage(node); 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project image->setStyle(style); 1178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (StyleImage* styleImage = contentData->image()) 1185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen image->setImageResource(RenderImageResourceStyleImage::create(styleImage)); 1195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen else 1205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen image->setImageResource(RenderImageResource::create()); 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return image; 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 124643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (node->hasTagName(rubyTag)) { 125643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (style->display() == INLINE) 126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderRubyAsInline(node); 127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block else if (style->display() == BLOCK) 128643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderRubyAsBlock(node); 129643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 130643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // treat <rt> as ruby text ONLY if it still has its default treatment of block 131643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (node->hasTagName(rtTag) && style->display() == BLOCK) 132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return new (arena) RenderRubyText(node); 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (style->display()) { 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NONE: 136643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case INLINE: 138643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderInline(node); 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BLOCK: 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case INLINE_BLOCK: 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case RUN_IN: 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case COMPACT: 143643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderBlock(node); 144643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case LIST_ITEM: 145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderListItem(node); 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE: 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case INLINE_TABLE: 148643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderTable(node); 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_ROW_GROUP: 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_HEADER_GROUP: 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_FOOTER_GROUP: 152643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderTableSection(node); 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_ROW: 154643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderTableRow(node); 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_COLUMN_GROUP: 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_COLUMN: 157643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderTableCol(node); 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_CELL: 159643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderTableCell(node); 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_CAPTION: 161231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS) 162231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // As per the section 17.1 of the spec WAP-239-WCSS-20011026-a.pdf, 163231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // the marquee box inherits and extends the characteristics of the 164231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // principal block box ([CSS2] section 9.2.1). 165231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block case WAP_MARQUEE: 166231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 167643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderBlock(node); 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BOX: 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case INLINE_BOX: 170643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderFlexibleBox(node); 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 173643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic WTF::RefCountedLeakCounter renderObjectCounter("RenderObject"); 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject::RenderObject(Node* node) 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : CachedResourceClient() 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_style(0) 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_node(node) 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_parent(0) 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_previous(0) 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_next(0) 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasAXObject(false) 189635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_setNeedsLayoutForbidden(false) 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_needsLayout(false) 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_needsPositionedMovementLayout(false) 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_normalChildNeedsLayout(false) 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_posChildNeedsLayout(false) 195bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen , m_preferredLogicalWidthsDirty(false) 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_floating(false) 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_positioned(false) 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_relPositioned(false) 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_paintBackground(false) 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_isAnonymous(node == node->document()) 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_isText(false) 202635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_isBox(false) 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_inline(true) 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_replaced(false) 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_isDragging(false) 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasLayer(false) 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasOverflowClip(false) 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasTransform(false) 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasReflection(false) 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasOverrideSize(false) 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasCounterNodeMap(false) 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_everHadLayout(false) 2138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian , m_childrenInline(false) 214bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen , m_marginBeforeQuirk(false) 215bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen , m_marginAfterQuirk(false) 2168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian , m_hasMarkupTruncation(false) 2178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian , m_selectionState(SelectionNone) 2188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian , m_hasColumns(false) 2198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian , m_cellWidthChanged(false) 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project renderObjectCounter.increment(); 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(node); 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject::~RenderObject() 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 229545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch ASSERT(!node() || documentBeingDestroyed() || !frame()->view() || frame()->view()->layoutRoot() != this); 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!m_hasAXObject); 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project renderObjectCounter.decrement(); 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochRenderTheme* RenderObject::theme() const 2370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 2380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(document()->page()); 2390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return document()->page()->theme(); 2410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 2420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::isDescendantOf(const RenderObject* obj) const 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (const RenderObject* r = this; r; r = r->m_parent) { 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (r == obj) 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::isBody() const 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return node() && node()->hasTagName(bodyTag); 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::isHR() const 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return node() && node()->hasTagName(hrTag); 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerbool RenderObject::isLegend() const 2636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 2646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return node() && (node()->hasTagName(legendTag) 2656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#if ENABLE(WML) 2666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner || node()->hasTagName(WMLNames::insertedLegendTag) 2676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#endif 2686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner ); 2696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 2706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::isHTMLMarquee() const 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return node() && node()->renderer() == this && node()->hasTagName(marqueeTag); 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::addChild(RenderObject* newChild, RenderObject* beforeChild) 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObjectChildList* children = virtualChildren(); 2798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(children); 2808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!children) 2818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool needsTable = false; 2848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 285dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (newChild->isTableCol() && newChild->style()->display() == TABLE_COLUMN_GROUP) 2868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian needsTable = !isTable(); 2878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if (newChild->isRenderBlock() && newChild->style()->display() == TABLE_CAPTION) 2888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian needsTable = !isTable(); 2898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if (newChild->isTableSection()) 2908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian needsTable = !isTable(); 2918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if (newChild->isTableRow()) 2928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian needsTable = !isTableSection(); 2938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if (newChild->isTableCell()) { 2948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian needsTable = !isTableRow(); 2958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // I'm not 100% sure this is the best way to fix this, but without this 2968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // change we recurse infinitely when trying to render the CSS2 test page: 2978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // http://www.bath.ac.uk/%7Epy8ieh/internet/eviltests/htmlbodyheadrendering2.html. 2988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // See Radar 2925291. 2998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (needsTable && isTableCell() && !children->firstChild() && !newChild->isTableCell()) 3008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian needsTable = false; 3018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (needsTable) { 3048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderTable* table; 3058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* afterChild = beforeChild ? beforeChild->previousSibling() : children->lastChild(); 3068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (afterChild && afterChild->isAnonymous() && afterChild->isTable()) 3070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch table = toRenderTable(afterChild); 3088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else { 3098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian table = new (renderArena()) RenderTable(document() /* is anonymous */); 3108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RefPtr<RenderStyle> newStyle = RenderStyle::create(); 3118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian newStyle->inheritFrom(style()); 3128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian newStyle->setDisplay(TABLE); 3138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian table->setStyle(newStyle.release()); 3148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian addChild(table, beforeChild); 3158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian table->addChild(newChild); 3178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } else { 3188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Just add it... 3198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian children->insertChildNode(this, newChild, beforeChild); 3208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 321cad810f21b803229eb11403f9209855525a25d57Steve Block RenderCounter::rendererSubtreeAttached(newChild); 3228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (newChild->isText() && newChild->style()->textTransform() == CAPITALIZE) { 3238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RefPtr<StringImpl> textToTransform = toRenderText(newChild)->originalText(); 3248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (textToTransform) 3258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderText(newChild)->setText(textToTransform.release(), true); 3268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::removeChild(RenderObject* oldChild) 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObjectChildList* children = virtualChildren(); 3328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(children); 3338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!children) 3348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // We do this here instead of in removeChildNode, since the only extremely low-level uses of remove/appendChildNode 3378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // cannot affect the positioned object list, and the floating object list is irrelevant (since the list gets cleared on 3388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // layout anyway). 3398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (oldChild->isFloatingOrPositioned()) 3408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderBox(oldChild)->removeFloatingOrPositionedChildFromBlockLists(); 3418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian children->removeChildNode(this, oldChild); 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::nextInPreOrder() const 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (RenderObject* o = firstChild()) 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o; 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nextInPreOrderAfterChildren(); 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::nextInPreOrderAfterChildren() const 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* o; 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!(o = nextSibling())) { 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = parent(); 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (o && !o->nextSibling()) 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->parent(); 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (o) 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->nextSibling(); 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o; 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::nextInPreOrder(RenderObject* stayWithin) const 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (RenderObject* o = firstChild()) 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o; 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nextInPreOrderAfterChildren(stayWithin); 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::nextInPreOrderAfterChildren(RenderObject* stayWithin) const 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (this == stayWithin) 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 380d0825bca7fe65beaee391d30da42e937db621564Steve Block const RenderObject* current = this; 381d0825bca7fe65beaee391d30da42e937db621564Steve Block RenderObject* next; 382d0825bca7fe65beaee391d30da42e937db621564Steve Block while (!(next = current->nextSibling())) { 383d0825bca7fe65beaee391d30da42e937db621564Steve Block current = current->parent(); 384d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!current || current == stayWithin) 385d0825bca7fe65beaee391d30da42e937db621564Steve Block return 0; 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 387d0825bca7fe65beaee391d30da42e937db621564Steve Block return next; 3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::previousInPreOrder() const 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (RenderObject* o = previousSibling()) { 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (o->lastChild()) 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->lastChild(); 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o; 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return parent(); 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::childAt(unsigned index) const 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* child = firstChild(); 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned i = 0; child && i < index; i++) 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project child = child->nextSibling(); 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return child; 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::firstLeafChild() const 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* r = firstChild(); 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (r) { 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* n = 0; 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project n = r->firstChild(); 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!n) 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project r = n; 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return r; 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::lastLeafChild() const 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* r = lastChild(); 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (r) { 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* n = 0; 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project n = r->lastChild(); 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!n) 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project r = n; 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return r; 4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void addLayers(RenderObject* obj, RenderLayer* parentLayer, RenderObject*& newObject, 4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderLayer*& beforeChild) 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (obj->hasLayer()) { 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!beforeChild && newObject) { 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We need to figure out the layer that follows newObject. We only do 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // this the first time we find a child layer, and then we update the 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // pointer values for newObject and beforeChild used by everyone else. 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project beforeChild = newObject->parent()->findNextLayer(parentLayer, newObject); 4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newObject = 0; 4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian parentLayer->addChild(toRenderBoxModelObject(obj)->layer(), beforeChild); 4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RenderObject* curr = obj->firstChild(); curr; curr = curr->nextSibling()) 4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addLayers(curr, parentLayer, newObject, beforeChild); 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::addLayers(RenderLayer* parentLayer, RenderObject* newObject) 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!parentLayer) 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* object = newObject; 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderLayer* beforeChild = 0; 4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCore::addLayers(this, parentLayer, object, beforeChild); 4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::removeLayers(RenderLayer* parentLayer) 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!parentLayer) 4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hasLayer()) { 4708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian parentLayer->removeChild(toRenderBoxModelObject(this)->layer()); 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling()) 4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr->removeLayers(parentLayer); 4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::moveLayers(RenderLayer* oldParent, RenderLayer* newParent) 4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!newParent) 4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hasLayer()) { 4848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderLayer* layer = toRenderBoxModelObject(this)->layer(); 4855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ASSERT(oldParent == layer->parent()); 4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (oldParent) 487635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project oldParent->removeChild(layer); 488635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project newParent->addChild(layer); 4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling()) 4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr->moveLayers(oldParent, newParent); 4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderLayer* RenderObject::findNextLayer(RenderLayer* parentLayer, RenderObject* startPoint, 4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool checkParent) 4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Error check the parent layer passed in. If it's null, we can't find anything. 5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!parentLayer) 5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Step 1: If our layer is a child of the desired parent, then return our layer. 5048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderLayer* ourLayer = hasLayer() ? toRenderBoxModelObject(this)->layer() : 0; 5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ourLayer && ourLayer->parent() == parentLayer) 5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ourLayer; 5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Step 2: If we don't have a layer, or our layer is the desired parent, then descend 5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // into our siblings trying to find the next layer whose parent is the desired parent. 5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!ourLayer || ourLayer == parentLayer) { 5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RenderObject* curr = startPoint ? startPoint->nextSibling() : firstChild(); 5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr; curr = curr->nextSibling()) { 5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderLayer* nextLayer = curr->findNextLayer(parentLayer, 0, false); 5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (nextLayer) 5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nextLayer; 5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Step 3: If our layer is the desired parent layer, then we're finished. We didn't 5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // find anything. 5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (parentLayer == ourLayer) 5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Step 4: If |checkParent| is set, climb up to our parent and check its siblings that 5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // follow us to see if we can locate a layer. 5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (checkParent && parent()) 5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return parent()->findNextLayer(parentLayer, this, true); 5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderLayer* RenderObject::enclosingLayer() const 5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const RenderObject* curr = this; 5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (curr) { 5368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderLayer* layer = curr->hasLayer() ? toRenderBoxModelObject(curr)->layer() : 0; 5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (layer) 5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return layer; 5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr = curr->parent(); 5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 544635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectRenderBox* RenderObject::enclosingBox() const 5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 546635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project RenderObject* curr = const_cast<RenderObject*>(this); 547635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project while (curr) { 548635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (curr->isBox()) 549635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return toRenderBox(curr); 5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr = curr->parent(); 5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 553635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT_NOT_REACHED(); 554635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return 0; 5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 557e458d70a0d18538346f41b503114c9ebe6b2ce12Leon ClarkeRenderBoxModelObject* RenderObject::enclosingBoxModelObject() const 558e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{ 559e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke RenderObject* curr = const_cast<RenderObject*>(this); 560e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke while (curr) { 561e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (curr->isBoxModelObject()) 562e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return toRenderBoxModelObject(curr); 563e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke curr = curr->parent(); 564e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke } 565e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 566e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke ASSERT_NOT_REACHED(); 567e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return 0; 568e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke} 569e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 570635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectRenderBlock* RenderObject::firstLineBlock() const 5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 572635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return 0; 5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 575bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid RenderObject::setPreferredLogicalWidthsDirty(bool b, bool markParents) 5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 577bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen bool alreadyDirty = m_preferredLogicalWidthsDirty; 578bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_preferredLogicalWidthsDirty = b; 5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (b && !alreadyDirty && markParents && (isText() || (style()->position() != FixedPosition && style()->position() != AbsolutePosition))) 580bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen invalidateContainerPreferredLogicalWidths(); 5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 583bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid RenderObject::invalidateContainerPreferredLogicalWidths() 5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // In order to avoid pathological behavior when inlines are deeply nested, we do include them 5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // in the chain that we mark dirty (even though they're kind of irrelevant). 5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* o = isTableCell() ? containingBlock() : container(); 588bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen while (o && !o->m_preferredLogicalWidthsDirty) { 5898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Don't invalidate the outermost object of an unrooted subtree. That object will be 5908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // invalidated when the subtree is added to the document. 5918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* container = o->isTableCell() ? o->containingBlock() : o->container(); 5928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!container && !o->isRenderView()) 5938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 5948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 595bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen o->m_preferredLogicalWidthsDirty = true; 5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (o->style()->position() == FixedPosition || o->style()->position() == AbsolutePosition) 5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // A positioned object has no effect on the min/max width of its containing block ever. 5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We can optimize this case and not go up any further. 5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 6008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian o = container; 6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::setLayerNeedsFullRepaint() 6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(hasLayer()); 6078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderBoxModelObject(this)->layer()->setNeedsFullRepaint(true); 6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderBlock* RenderObject::containingBlock() const 6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isTableCell()) { 6130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch const RenderTableCell* cell = toRenderTableCell(this); 6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (parent() && cell->section()) 6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return cell->table(); 6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isRenderView()) 6208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return const_cast<RenderView*>(toRenderView(this)); 6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* o = parent(); 6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!isText() && m_style->position() == FixedPosition) { 6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (o && !o->isRenderView() && !(o->hasTransform() && o->isRenderBlock())) 6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->parent(); 6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (!isText() && m_style->position() == AbsolutePosition) { 6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (o && (o->style()->position() == StaticPosition || (o->isInline() && !o->isReplaced())) && !o->isRenderView() && !(o->hasTransform() && o->isRenderBlock())) { 6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For relpositioned inlines, we return the nearest enclosing block. We don't try 6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // to return the inline itself. This allows us to avoid having a positioned objects 6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // list in all RenderInlines and lets us return a strongly-typed RenderBlock* result 6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // from this method. The container() method can actually be used to obtain the 6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // inline directly. 6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (o->style()->position() == RelativePosition && o->isInline() && !o->isReplaced()) 6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o->containingBlock(); 635231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(SVG) 636231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (o->isSVGForeignObject()) //foreignObject is the containing block for contents inside it 637231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block break; 638231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 639231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->parent(); 6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (o && ((o->isInline() && !o->isReplaced()) || o->isTableRow() || o->isTableSection() 6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project || o->isTableCol() || o->isFrameSet() || o->isMedia() 6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG) 6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project || o->isSVGContainer() || o->isSVGRoot() 6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project )) 6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->parent(); 6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!o || !o->isRenderBlock()) 653643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; // This can still happen in case of an orphaned tree 6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return toRenderBlock(o); 6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool mustRepaintFillLayers(const RenderObject* renderer, const FillLayer* layer) 6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Nobody will use multiple layers without wanting fancy positioning. 6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (layer->next()) 6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Make sure we have a valid image. 6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project StyleImage* img = layer->image(); 6660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!img || !img->canRender(renderer->style()->effectiveZoom())) 6670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return false; 6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!layer->xPosition().isZero() || !layer->yPosition().isZero()) 6700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return true; 6710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 672231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (layer->size().type == SizeLength) { 673231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (layer->size().size.width().isPercent() || layer->size().size.height().isPercent()) 6740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return true; 675231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } else if (layer->size().type == Contain || layer->size().type == Cover || img->usesImageContainerSize()) 6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::mustRepaintBackgroundOrBorder() const 6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hasMask() && mustRepaintFillLayers(this, style()->maskLayers())) 6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we don't have a background/border/mask, then nothing to do. 6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!hasBoxDecorations()) 6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (mustRepaintFillLayers(this, style()->backgroundLayers())) 6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Our fill layers are ok. Let's check border. 6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (style()->hasBorder()) { 6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Border images are not ok. 6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project StyleImage* borderImage = style()->borderImage().image(); 6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool shouldPaintBorderImage = borderImage && borderImage->canRender(style()->effectiveZoom()); 6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the image hasn't loaded, we're still using the normal border style. 7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (shouldPaintBorderImage && borderImage->isLoaded()) 7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::drawLineForBoxSide(GraphicsContext* graphicsContext, int x1, int y1, int x2, int y2, 708dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block BoxSide s, Color c, EBorderStyle style, 7098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int adjbw1, int adjbw2) 7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int width = (s == BSTop || s == BSBottom ? y2 - y1 : x2 - x1); 7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (style == DOUBLE && width < 3) 7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project style = SOLID; 7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (style) { 7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BNONE: 7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BHIDDEN: 7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DOTTED: 7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DASHED: 722643ca7872b450ea4efacab6188849e5aac2ba161Steve Block graphicsContext->setStrokeColor(c, m_style->colorSpace()); 7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->setStrokeThickness(width); 7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->setStrokeStyle(style == DASHED ? DashedStroke : DottedStroke); 7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (width > 0) 7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (s) { 7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSBottom: 7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSTop: 7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawLine(IntPoint(x1, (y1 + y2) / 2), IntPoint(x2, (y1 + y2) / 2)); 7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSRight: 7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSLeft: 7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawLine(IntPoint((x1 + x2) / 2, y1), IntPoint((x1 + x2) / 2, y2)); 7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DOUBLE: { 7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int third = (width + 1) / 3; 7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (adjbw1 == 0 && adjbw2 == 0) { 7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->setStrokeStyle(NoStroke); 743643ca7872b450ea4efacab6188849e5aac2ba161Steve Block graphicsContext->setFillColor(c, m_style->colorSpace()); 7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (s) { 7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSTop: 7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSBottom: 7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x1, y1, x2 - x1, third)); 7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x1, y2 - third, x2 - x1, third)); 7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSLeft: 7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x1, y1 + 1, third, y2 - y1 - 1)); 7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x2 - third, y1 + 1, third, y2 - y1 - 1)); 7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSRight: 7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x1, y1 + 1, third, y2 - y1 - 1)); 7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x2 - third, y1 + 1, third, y2 - y1 - 1)); 7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int adjbw1bigthird = ((adjbw1 > 0) ? adjbw1 + 1 : adjbw1 - 1) / 3; 7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int adjbw2bigthird = ((adjbw2 > 0) ? adjbw2 + 1 : adjbw2 - 1) / 3; 7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (s) { 7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSTop: 7658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1 + max((-adjbw1 * 2 + 1) / 3, 0), 7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project y1, x2 - max((-adjbw2 * 2 + 1) / 3, 0), y1 + third, 767dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, SOLID, adjbw1bigthird, adjbw2bigthird); 7688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1 + max((adjbw1 * 2 + 1) / 3, 0), 7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project y2 - third, x2 - max((adjbw2 * 2 + 1) / 3, 0), y2, 770dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, SOLID, adjbw1bigthird, adjbw2bigthird); 7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSLeft: 7738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1, y1 + max((-adjbw1 * 2 + 1) / 3, 0), 7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project x1 + third, y2 - max((-adjbw2 * 2 + 1) / 3, 0), 775dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, SOLID, adjbw1bigthird, adjbw2bigthird); 7768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x2 - third, y1 + max((adjbw1 * 2 + 1) / 3, 0), 7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project x2, y2 - max((adjbw2 * 2 + 1) / 3, 0), 778dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, SOLID, adjbw1bigthird, adjbw2bigthird); 7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSBottom: 7818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1 + max((adjbw1 * 2 + 1) / 3, 0), 7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project y1, x2 - max((adjbw2 * 2 + 1) / 3, 0), y1 + third, 783dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, SOLID, adjbw1bigthird, adjbw2bigthird); 7848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1 + max((-adjbw1 * 2 + 1) / 3, 0), 7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project y2 - third, x2 - max((-adjbw2 * 2 + 1) / 3, 0), y2, 786dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, SOLID, adjbw1bigthird, adjbw2bigthird); 7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSRight: 7898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1, y1 + max((adjbw1 * 2 + 1) / 3, 0), 7900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch x1 + third, y2 - max((adjbw2 * 2 + 1) / 3, 0), 791dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, SOLID, adjbw1bigthird, adjbw2bigthird); 7928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x2 - third, y1 + max((-adjbw1 * 2 + 1) / 3, 0), 7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project x2, y2 - max((-adjbw2 * 2 + 1) / 3, 0), 794dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, SOLID, adjbw1bigthird, adjbw2bigthird); 7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case RIDGE: 8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case GROOVE: 8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EBorderStyle s1; 8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EBorderStyle s2; 8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (style == GROOVE) { 8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s1 = INSET; 8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s2 = OUTSET; 8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s1 = OUTSET; 8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s2 = INSET; 8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int adjbw1bighalf = ((adjbw1 > 0) ? adjbw1 + 1 : adjbw1 - 1) / 2; 8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int adjbw2bighalf = ((adjbw2 > 0) ? adjbw2 + 1 : adjbw2 - 1) / 2; 8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (s) { 8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSTop: 8208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1 + max(-adjbw1, 0) / 2, y1, x2 - max(-adjbw2, 0) / 2, (y1 + y2 + 1) / 2, 821dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, s1, adjbw1bighalf, adjbw2bighalf); 8228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1 + max(adjbw1 + 1, 0) / 2, (y1 + y2 + 1) / 2, x2 - max(adjbw2 + 1, 0) / 2, y2, 823dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, s2, adjbw1 / 2, adjbw2 / 2); 8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSLeft: 8268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1, y1 + max(-adjbw1, 0) / 2, (x1 + x2 + 1) / 2, y2 - max(-adjbw2, 0) / 2, 827dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, s1, adjbw1bighalf, adjbw2bighalf); 8288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, (x1 + x2 + 1) / 2, y1 + max(adjbw1 + 1, 0) / 2, x2, y2 - max(adjbw2 + 1, 0) / 2, 829dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, s2, adjbw1 / 2, adjbw2 / 2); 8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSBottom: 8328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1 + max(adjbw1, 0) / 2, y1, x2 - max(adjbw2, 0) / 2, (y1 + y2 + 1) / 2, 833dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, s2, adjbw1bighalf, adjbw2bighalf); 8348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1 + max(-adjbw1 + 1, 0) / 2, (y1 + y2 + 1) / 2, x2 - max(-adjbw2 + 1, 0) / 2, y2, 835dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, s1, adjbw1 / 2, adjbw2 / 2); 8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSRight: 8388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1, y1 + max(adjbw1, 0) / 2, (x1 + x2 + 1) / 2, y2 - max(adjbw2, 0) / 2, 839dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, s2, adjbw1bighalf, adjbw2bighalf); 8408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, (x1 + x2 + 1) / 2, y1 + max(-adjbw1 + 1, 0) / 2, x2, y2 - max(-adjbw2 + 1, 0) / 2, 841dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, s1, adjbw1 / 2, adjbw2 / 2); 8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case INSET: 8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (s == BSTop || s == BSLeft) 8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project c = c.dark(); 8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // fall through 8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case OUTSET: 8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (style == OUTSET && (s == BSBottom || s == BSRight)) 8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project c = c.dark(); 8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // fall through 8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case SOLID: { 8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->setStrokeStyle(NoStroke); 856643ca7872b450ea4efacab6188849e5aac2ba161Steve Block graphicsContext->setFillColor(c, m_style->colorSpace()); 8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(x2 >= x1); 8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(y2 >= y1); 8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!adjbw1 && !adjbw2) { 8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x1, y1, x2 - x1, y2 - y1)); 8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FloatPoint quad[4]; 8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (s) { 8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSTop: 8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[0] = FloatPoint(x1 + max(-adjbw1, 0), y1); 8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[1] = FloatPoint(x1 + max(adjbw1, 0), y2); 8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[2] = FloatPoint(x2 - max(adjbw2, 0), y2); 8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[3] = FloatPoint(x2 - max(-adjbw2, 0), y1); 8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSBottom: 8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[0] = FloatPoint(x1 + max(adjbw1, 0), y1); 8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[1] = FloatPoint(x1 + max(-adjbw1, 0), y2); 8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[2] = FloatPoint(x2 - max(-adjbw2, 0), y2); 8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[3] = FloatPoint(x2 - max(adjbw2, 0), y1); 8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSLeft: 8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[0] = FloatPoint(x1, y1 + max(-adjbw1, 0)); 8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[1] = FloatPoint(x1, y2 - max(-adjbw2, 0)); 8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[2] = FloatPoint(x2, y2 - max(adjbw2, 0)); 8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[3] = FloatPoint(x2, y1 + max(adjbw1, 0)); 8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSRight: 8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[0] = FloatPoint(x1, y1 + max(adjbw1, 0)); 8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[1] = FloatPoint(x1, y2 - max(adjbw2, 0)); 8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[2] = FloatPoint(x2, y2 - max(-adjbw2, 0)); 8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[3] = FloatPoint(x2, y1 + max(-adjbw1, 0)); 8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawConvexPolygon(4, quad); 8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 896ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve BlockIntRect RenderObject::borderInnerRect(const IntRect& borderRect, unsigned short topWidth, unsigned short bottomWidth, unsigned short leftWidth, unsigned short rightWidth) const 897ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{ 898ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return IntRect( 899ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block borderRect.x() + leftWidth, 900ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block borderRect.y() + topWidth, 901ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block borderRect.width() - leftWidth - rightWidth, 902ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block borderRect.height() - topWidth - bottomWidth); 903ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block} 904ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 905ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#if HAVE(PATH_BASED_BORDER_RADIUS_DRAWING) 906ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockvoid RenderObject::drawBoxSideFromPath(GraphicsContext* graphicsContext, IntRect borderRect, Path borderPath, 907ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block float thickness, float drawThickness, BoxSide s, const RenderStyle* style, 908ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block Color c, EBorderStyle borderStyle) 909ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{ 910ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (thickness <= 0) 911ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return; 912ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 913ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (borderStyle == DOUBLE && thickness < 3) 914ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block borderStyle = SOLID; 915ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 916ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block switch (borderStyle) { 917ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block case BNONE: 918ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block case BHIDDEN: 919ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return; 920ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block case DOTTED: 921ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block case DASHED: { 922ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->setStrokeColor(c, style->colorSpace()); 923ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 924ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // The stroke is doubled here because the provided path is the 925ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // outside edge of the border so half the stroke is clipped off. 926ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // The extra multiplier is so that the clipping mask can antialias 927ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // the edges to prevent jaggies. 928ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->setStrokeThickness(drawThickness * 2 * 1.1f); 929ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->setStrokeStyle(borderStyle == DASHED ? DashedStroke : DottedStroke); 930ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 931ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // If the number of dashes that fit in the path is odd and non-integral then we 932ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // will have an awkwardly-sized dash at the end of the path. To try to avoid that 933ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // here, we simply make the whitespace dashes ever so slightly bigger. 934ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // FIXME: This could be even better if we tried to manipulate the dash offset 935ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // and possibly the whiteSpaceWidth to get the corners dash-symmetrical. 936ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block float patWidth = thickness * ((borderStyle == DASHED) ? 3.0f : 1.0f); 937ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block float whiteSpaceWidth = patWidth; 938ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block float numberOfDashes = borderPath.length() / patWidth; 939ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block bool evenNumberOfFullDashes = !((int)numberOfDashes % 2); 940ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block bool integralNumberOfDashes = !(numberOfDashes - (int)numberOfDashes); 941ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (!evenNumberOfFullDashes && !integralNumberOfDashes) { 942ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block float numberOfWhitespaceDashes = numberOfDashes / 2; 943ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block whiteSpaceWidth += (patWidth / numberOfWhitespaceDashes); 944ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block } 945ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 946967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch DashArray lineDash; 947967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch lineDash.append(patWidth); 948967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch lineDash.append(whiteSpaceWidth); 949967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch graphicsContext->setLineDash(lineDash, patWidth); 950f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch graphicsContext->strokePath(borderPath); 951ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return; 952ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block } 953ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block case DOUBLE: { 954ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block int outerBorderTopWidth = style->borderTopWidth() / 3; 955ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block int outerBorderRightWidth = style->borderRightWidth() / 3; 956ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block int outerBorderBottomWidth = style->borderBottomWidth() / 3; 957ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block int outerBorderLeftWidth = style->borderLeftWidth() / 3; 958ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 959ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block int innerBorderTopWidth = style->borderTopWidth() * 2 / 3; 960ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block int innerBorderRightWidth = style->borderRightWidth() * 2 / 3; 961ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block int innerBorderBottomWidth = style->borderBottomWidth() * 2 / 3; 962ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block int innerBorderLeftWidth = style->borderLeftWidth() * 2 / 3; 963ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 964ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // We need certain integer rounding results 965ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (style->borderTopWidth() % 3 == 2) 966ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block outerBorderTopWidth += 1; 967ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (style->borderRightWidth() % 3 == 2) 968ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block outerBorderRightWidth += 1; 969ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (style->borderBottomWidth() % 3 == 2) 970ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block outerBorderBottomWidth += 1; 971ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (style->borderLeftWidth() % 3 == 2) 972ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block outerBorderLeftWidth += 1; 973ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 974ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (style->borderTopWidth() % 3 == 1) 975ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block innerBorderTopWidth += 1; 976ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (style->borderRightWidth() % 3 == 1) 977ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block innerBorderRightWidth += 1; 978ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (style->borderBottomWidth() % 3 == 1) 979ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block innerBorderBottomWidth += 1; 980ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (style->borderLeftWidth() % 3 == 1) 981ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block innerBorderLeftWidth += 1; 982ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 983ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // Get the inner border rects for both the outer border line and the inner border line 984ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block IntRect outerBorderInnerRect = borderInnerRect(borderRect, outerBorderTopWidth, outerBorderBottomWidth, 985ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block outerBorderLeftWidth, outerBorderRightWidth); 986ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block IntRect innerBorderInnerRect = borderInnerRect(borderRect, innerBorderTopWidth, innerBorderBottomWidth, 987ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block innerBorderLeftWidth, innerBorderRightWidth); 988ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 989ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // Get the inner radii for the outer border line 990ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block IntSize outerBorderTopLeftInnerRadius, outerBorderTopRightInnerRadius, outerBorderBottomLeftInnerRadius, 991ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block outerBorderBottomRightInnerRadius; 992ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block style->getInnerBorderRadiiForRectWithBorderWidths(outerBorderInnerRect, outerBorderTopWidth, outerBorderBottomWidth, 993ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block outerBorderLeftWidth, outerBorderRightWidth, outerBorderTopLeftInnerRadius, outerBorderTopRightInnerRadius, 994ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block outerBorderBottomLeftInnerRadius, outerBorderBottomRightInnerRadius); 995ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 996ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // Get the inner radii for the inner border line 997ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block IntSize innerBorderTopLeftInnerRadius, innerBorderTopRightInnerRadius, innerBorderBottomLeftInnerRadius, 998ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block innerBorderBottomRightInnerRadius; 999ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block style->getInnerBorderRadiiForRectWithBorderWidths(innerBorderInnerRect, innerBorderTopWidth, innerBorderBottomWidth, 1000ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block innerBorderLeftWidth, innerBorderRightWidth, innerBorderTopLeftInnerRadius, innerBorderTopRightInnerRadius, 1001ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block innerBorderBottomLeftInnerRadius, innerBorderBottomRightInnerRadius); 1002ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1003ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // Draw inner border line 1004ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->save(); 1005ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->addRoundedRectClip(innerBorderInnerRect, innerBorderTopLeftInnerRadius, 1006ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block innerBorderTopRightInnerRadius, innerBorderBottomLeftInnerRadius, innerBorderBottomRightInnerRadius); 1007ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block drawBoxSideFromPath(graphicsContext, borderRect, borderPath, thickness, drawThickness, s, style, c, SOLID); 1008ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->restore(); 1009ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1010ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // Draw outer border line 1011ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->save(); 1012ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->clipOutRoundedRect(outerBorderInnerRect, outerBorderTopLeftInnerRadius, 1013ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block outerBorderTopRightInnerRadius, outerBorderBottomLeftInnerRadius, outerBorderBottomRightInnerRadius); 1014ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block drawBoxSideFromPath(graphicsContext, borderRect, borderPath, thickness, drawThickness, s, style, c, SOLID); 1015ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->restore(); 1016ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1017ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return; 1018ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block } 1019ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block case RIDGE: 1020ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block case GROOVE: 1021ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block { 1022ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block EBorderStyle s1; 1023ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block EBorderStyle s2; 1024ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (borderStyle == GROOVE) { 1025ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block s1 = INSET; 1026ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block s2 = OUTSET; 1027ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block } else { 1028ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block s1 = OUTSET; 1029ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block s2 = INSET; 1030ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block } 1031ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1032ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block IntRect halfBorderRect = borderInnerRect(borderRect, style->borderLeftWidth() / 2, style->borderBottomWidth() / 2, 1033ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block style->borderLeftWidth() / 2, style->borderRightWidth() / 2); 1034ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1035ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block IntSize topLeftHalfRadius, topRightHalfRadius, bottomLeftHalfRadius, bottomRightHalfRadius; 1036ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block style->getInnerBorderRadiiForRectWithBorderWidths(halfBorderRect, style->borderLeftWidth() / 2, 1037ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block style->borderBottomWidth() / 2, style->borderLeftWidth() / 2, style->borderRightWidth() / 2, 1038ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block topLeftHalfRadius, topRightHalfRadius, bottomLeftHalfRadius, bottomRightHalfRadius); 1039ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1040ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // Paint full border 1041ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block drawBoxSideFromPath(graphicsContext, borderRect, borderPath, thickness, drawThickness, s, style, c, s1); 1042ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1043ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // Paint inner only 1044ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->save(); 1045ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->addRoundedRectClip(halfBorderRect, topLeftHalfRadius, topRightHalfRadius, 1046ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block bottomLeftHalfRadius, bottomRightHalfRadius); 1047ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block drawBoxSideFromPath(graphicsContext, borderRect, borderPath, thickness, drawThickness, s, style, c, s2); 1048ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->restore(); 1049ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1050ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return; 1051ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block } 1052ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block case INSET: 1053ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (s == BSTop || s == BSLeft) 1054ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block c = c.dark(); 1055ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block break; 1056ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block case OUTSET: 1057ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (s == BSBottom || s == BSRight) 1058ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block c = c.dark(); 1059ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block break; 1060ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block default: 1061ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block break; 1062ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block } 1063ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1064ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->setStrokeStyle(NoStroke); 1065ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->setFillColor(c, style->colorSpace()); 1066ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->drawRect(borderRect); 1067ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block} 1068ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#else 10698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::drawArcForBoxSide(GraphicsContext* graphicsContext, int x, int y, float thickness, IntSize radius, 1070dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int angleStart, int angleSpan, BoxSide s, Color c, 10718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian EBorderStyle style, bool firstCorner) 10728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1073ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // FIXME: This function should be removed when all ports implement GraphicsContext::clipConvexPolygon()!! 1074ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // At that time, everyone can use RenderObject::drawBoxSideFromPath() instead. This should happen soon. 10758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if ((style == DOUBLE && thickness / 2 < 3) || ((style == RIDGE || style == GROOVE) && thickness / 2 < 2)) 10768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian style = SOLID; 10778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian switch (style) { 10798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case BNONE: 10808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case BHIDDEN: 10818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 10828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case DOTTED: 10838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case DASHED: 1084643ca7872b450ea4efacab6188849e5aac2ba161Steve Block graphicsContext->setStrokeColor(c, m_style->colorSpace()); 10858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeStyle(style == DOTTED ? DottedStroke : DashedStroke); 10868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeThickness(thickness); 10878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->strokeArc(IntRect(x, y, radius.width() * 2, radius.height() * 2), angleStart, angleSpan); 10888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 10898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case DOUBLE: { 10908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian float third = thickness / 3.0f; 10918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian float innerThird = (thickness + 1.0f) / 6.0f; 10928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int shiftForInner = static_cast<int>(innerThird * 2.5f); 10938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int outerY = y; 10958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int outerHeight = radius.height() * 2; 10968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int innerX = x + shiftForInner; 10978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int innerY = y + shiftForInner; 10988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int innerWidth = (radius.width() - shiftForInner) * 2; 10998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int innerHeight = (radius.height() - shiftForInner) * 2; 11008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (innerThird > 1 && (s == BSTop || (firstCorner && (s == BSLeft || s == BSRight)))) { 11018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian outerHeight += 2; 11028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian innerHeight += 2; 11038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeStyle(SolidStroke); 1106643ca7872b450ea4efacab6188849e5aac2ba161Steve Block graphicsContext->setStrokeColor(c, m_style->colorSpace()); 11078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeThickness(third); 11088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->strokeArc(IntRect(x, outerY, radius.width() * 2, outerHeight), angleStart, angleSpan); 11098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeThickness(innerThird > 2 ? innerThird - 1 : innerThird); 11108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->strokeArc(IntRect(innerX, innerY, innerWidth, innerHeight), angleStart, angleSpan); 11118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 11128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case GROOVE: 11148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case RIDGE: { 11158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Color c2; 11168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if ((style == RIDGE && (s == BSTop || s == BSLeft)) || 11178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian (style == GROOVE && (s == BSBottom || s == BSRight))) 11188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian c2 = c.dark(); 11198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else { 11208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian c2 = c; 11218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian c = c.dark(); 11228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeStyle(SolidStroke); 1125643ca7872b450ea4efacab6188849e5aac2ba161Steve Block graphicsContext->setStrokeColor(c, m_style->colorSpace()); 11268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeThickness(thickness); 11278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->strokeArc(IntRect(x, y, radius.width() * 2, radius.height() * 2), angleStart, angleSpan); 11288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian float halfThickness = (thickness + 1.0f) / 4.0f; 11308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int shiftForInner = static_cast<int>(halfThickness * 1.5f); 1131643ca7872b450ea4efacab6188849e5aac2ba161Steve Block graphicsContext->setStrokeColor(c2, m_style->colorSpace()); 11328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeThickness(halfThickness > 2 ? halfThickness - 1 : halfThickness); 11338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->strokeArc(IntRect(x + shiftForInner, y + shiftForInner, (radius.width() - shiftForInner) * 2, 11348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian (radius.height() - shiftForInner) * 2), angleStart, angleSpan); 11358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 11368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case INSET: 11388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (s == BSTop || s == BSLeft) 11398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian c = c.dark(); 11408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case OUTSET: 11418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (style == OUTSET && (s == BSBottom || s == BSRight)) 11428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian c = c.dark(); 11438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case SOLID: 11448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeStyle(SolidStroke); 1145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block graphicsContext->setStrokeColor(c, m_style->colorSpace()); 11468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeThickness(thickness); 11478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->strokeArc(IntRect(x, y, radius.width() * 2, radius.height() * 2), angleStart, angleSpan); 11488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 11498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1151ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#endif 1152a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 1153a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid RenderObject::paintFocusRing(GraphicsContext* context, int tx, int ty, RenderStyle* style) 1154a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{ 1155a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch Vector<IntRect> focusRingRects; 1156a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch addFocusRingRects(focusRingRects, tx, ty); 1157a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (style->outlineStyleIsAuto()) 1158a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch context->drawFocusRing(focusRingRects, style->outlineWidth(), style->outlineOffset(), style->visitedDependentColor(CSSPropertyOutlineColor)); 1159a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch else 1160a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch addPDFURLRect(context, unionRect(focusRingRects)); 1161a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch} 11628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::addPDFURLRect(GraphicsContext* context, const IntRect& rect) 11648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (rect.isEmpty()) 11668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 11678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Node* n = node(); 11688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!n || !n->isLink() || !n->isElementNode()) 11698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 11708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian const AtomicString& href = static_cast<Element*>(n)->getAttribute(hrefAttr); 11718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (href.isNull()) 11728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 11738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian context->setURLForRect(n->document()->completeURL(href), rect); 11748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid RenderObject::paintOutline(GraphicsContext* graphicsContext, int tx, int ty, int w, int h) 11778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!hasOutline()) 11798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 11808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RenderStyle* styleToUse = style(); 1182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int ow = styleToUse->outlineWidth(); 1183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block EBorderStyle os = styleToUse->outlineStyle(); 11848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Color oc = styleToUse->visitedDependentColor(CSSPropertyOutlineColor); 11868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int offset = styleToUse->outlineOffset(); 11888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (styleToUse->outlineStyleIsAuto() || hasOutlineAnnotation()) { 1190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!theme()->supportsFocusRing(styleToUse)) { 11918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Only paint the focus ring by hand if the theme isn't able to draw the focus ring. 1192a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch paintFocusRing(graphicsContext, tx, ty, styleToUse); 11938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1196dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (styleToUse->outlineStyleIsAuto() || styleToUse->outlineStyle() == BNONE) 11978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 11988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project tx -= offset; 12008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ty -= offset; 12018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project w += 2 * offset; 12028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project h += 2 * offset; 12038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (h < 0 || w < 0) 12058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 12068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1207dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block drawLineForBoxSide(graphicsContext, tx - ow, ty - ow, tx, ty + h + ow, BSLeft, oc, os, ow, ow); 1208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block drawLineForBoxSide(graphicsContext, tx - ow, ty - ow, tx + w + ow, ty, BSTop, oc, os, ow, ow); 1209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block drawLineForBoxSide(graphicsContext, tx + w, ty - ow, tx + w + ow, ty + h + ow, BSRight, oc, os, ow, ow); 1210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block drawLineForBoxSide(graphicsContext, tx - ow, ty + h, tx + w + ow, ty + h + ow, BSBottom, oc, os, ow, ow); 12118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1213635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectIntRect RenderObject::absoluteBoundingBoxRect(bool useTransforms) 1214635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1215635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (useTransforms) { 1216635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<FloatQuad> quads; 1217635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project absoluteQuads(quads); 1218635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1219635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t n = quads.size(); 1220635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!n) 1221635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return IntRect(); 1222635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1223635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project IntRect result = quads[0].enclosingBoundingBox(); 1224635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (size_t i = 1; i < n; ++i) 1225635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project result.unite(quads[i].enclosingBoundingBox()); 1226635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return result; 1227635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1228635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1229635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FloatPoint absPos = localToAbsolute(); 1230635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<IntRect> rects; 1231635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project absoluteRects(rects, absPos.x(), absPos.y()); 1232635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1233635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t n = rects.size(); 1234635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!n) 1235635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return IntRect(); 1236635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1237635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project IntRect result = rects[0]; 1238635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (size_t i = 1; i < n; ++i) 1239635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project result.unite(rects[i]); 1240635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return result; 1241635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1242635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1243d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid RenderObject::absoluteFocusRingQuads(Vector<FloatQuad>& quads) 1244d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 1245d0825bca7fe65beaee391d30da42e937db621564Steve Block Vector<IntRect> rects; 1246d0825bca7fe65beaee391d30da42e937db621564Steve Block // FIXME: addFocusRingRects() needs to be passed this transform-unaware 1247d0825bca7fe65beaee391d30da42e937db621564Steve Block // localToAbsolute() offset here because RenderInline::addFocusRingRects() 1248d0825bca7fe65beaee391d30da42e937db621564Steve Block // implicitly assumes that. This doesn't work correctly with transformed 1249d0825bca7fe65beaee391d30da42e937db621564Steve Block // descendants. 1250d0825bca7fe65beaee391d30da42e937db621564Steve Block FloatPoint absolutePoint = localToAbsolute(); 1251d0825bca7fe65beaee391d30da42e937db621564Steve Block addFocusRingRects(rects, absolutePoint.x(), absolutePoint.y()); 1252d0825bca7fe65beaee391d30da42e937db621564Steve Block size_t count = rects.size(); 1253d0825bca7fe65beaee391d30da42e937db621564Steve Block for (size_t i = 0; i < count; ++i) { 1254d0825bca7fe65beaee391d30da42e937db621564Steve Block IntRect rect = rects[i]; 1255d0825bca7fe65beaee391d30da42e937db621564Steve Block rect.move(-absolutePoint.x(), -absolutePoint.y()); 1256d0825bca7fe65beaee391d30da42e937db621564Steve Block quads.append(localToAbsoluteQuad(FloatQuad(rect))); 1257d0825bca7fe65beaee391d30da42e937db621564Steve Block } 1258d0825bca7fe65beaee391d30da42e937db621564Steve Block} 1259d0825bca7fe65beaee391d30da42e937db621564Steve Block 1260635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid RenderObject::addAbsoluteRectForLayer(IntRect& result) 1261635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1262635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (hasLayer()) 1263635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project result.unite(absoluteBoundingBoxRect()); 1264635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (RenderObject* current = firstChild(); current; current = current->nextSibling()) 1265635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project current->addAbsoluteRectForLayer(result); 1266635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1267635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1268635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectIntRect RenderObject::paintingRootRect(IntRect& topLevelRect) 1269635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1270635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project IntRect result = absoluteBoundingBoxRect(); 1271635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project topLevelRect = result; 1272635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (RenderObject* current = firstChild(); current; current = current->nextSibling()) 1273635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project current->addAbsoluteRectForLayer(result); 1274635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return result; 1275635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1276635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 12778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::paint(PaintInfo& /*paintInfo*/, int /*tx*/, int /*ty*/) 12788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianRenderBoxModelObject* RenderObject::containerForRepaint() const 1282635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 12838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if USE(ACCELERATED_COMPOSITING) 12848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (RenderView* v = view()) { 12858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (v->usesCompositing()) { 12868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderLayer* compLayer = enclosingLayer()->enclosingCompositingLayer(); 12878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return compLayer ? compLayer->renderer() : 0; 12888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 12898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 12908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 12918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Do root-relative repaint. 1292635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return 0; 1293635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1294635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 12958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::repaintUsingContainer(RenderBoxModelObject* repaintContainer, const IntRect& r, bool immediate) 12968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 12976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!repaintContainer) { 12986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen view()->repaintViewRectangle(r, immediate); 12996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return; 13006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 13016c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 13028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if USE(ACCELERATED_COMPOSITING) 13036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen RenderView* v = view(); 13046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (repaintContainer->isRenderView()) { 13056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen ASSERT(repaintContainer == v); 13066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!v->hasLayer() || !v->layer()->isComposited() || v->layer()->backing()->paintingGoesToWindow()) { 13076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen v->repaintViewRectangle(r, immediate); 13086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return; 13098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 13106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 13116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 13126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (v->usesCompositing()) { 13136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen ASSERT(repaintContainer->hasLayer() && repaintContainer->layer()->isComposited()); 13146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen repaintContainer->layer()->setBackingNeedsRepaintInRect(r); 13156c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 13168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#else 13176c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (repaintContainer->isRenderView()) 13186c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen toRenderView(repaintContainer)->repaintViewRectangle(r, immediate); 13198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 13208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 13218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::repaint(bool immediate) 13238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Don't repaint if we're unrooted (note that view() still returns the view when unrooted) 13258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderView* view; 13268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!isRooted(&view)) 13278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1328635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 13298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (view->printing()) 13308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; // Don't repaint if we're printing. 1331635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 13328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderBoxModelObject* repaintContainer = containerForRepaint(); 13338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer ? repaintContainer : view, clippedOverflowRectForRepaint(repaintContainer), immediate); 13348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::repaintRectangle(const IntRect& r, bool immediate) 13378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Don't repaint if we're unrooted (note that view() still returns the view when unrooted) 13398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderView* view; 13408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!isRooted(&view)) 13418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1342635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 13438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (view->printing()) 13448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; // Don't repaint if we're printing. 1345635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 13468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian IntRect dirtyRect(r); 1347635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1348635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // FIXME: layoutDelta needs to be applied in parts before/after transforms and 1349635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // repaint containers. https://bugs.webkit.org/show_bug.cgi?id=23308 13508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian dirtyRect.move(view->layoutDelta()); 1351635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 13528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderBoxModelObject* repaintContainer = containerForRepaint(); 13538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian computeRectForRepaint(repaintContainer, dirtyRect); 13548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer ? repaintContainer : view, dirtyRect, immediate); 13558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1357dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool RenderObject::repaintAfterLayoutIfNeeded(RenderBoxModelObject* repaintContainer, const IntRect& oldBounds, const IntRect& oldOutlineBox, const IntRect* newBoundsPtr, const IntRect* newOutlineBoxRectPtr) 13588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderView* v = view(); 13608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (v->printing()) 13618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; // Don't repaint if we're printing. 13628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1363967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // This ASSERT fails due to animations. See https://bugs.webkit.org/show_bug.cgi?id=37048 1364967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // ASSERT(!newBoundsPtr || *newBoundsPtr == clippedOverflowRectForRepaint(repaintContainer)); 1365dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block IntRect newBounds = newBoundsPtr ? *newBoundsPtr : clippedOverflowRectForRepaint(repaintContainer); 13668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IntRect newOutlineBox; 13678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool fullRepaint = selfNeedsLayout(); 13698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Presumably a background or a border exists if border-fit:lines was specified. 13708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!fullRepaint && style()->borderFit() == BorderFitLines) 13718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fullRepaint = true; 13728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!fullRepaint) { 1373967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // This ASSERT fails due to animations. See https://bugs.webkit.org/show_bug.cgi?id=37048 1374967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // ASSERT(!newOutlineBoxRectPtr || *newOutlineBoxRectPtr == outlineBoundsForRepaint(repaintContainer)); 1375dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block newOutlineBox = newOutlineBoxRectPtr ? *newOutlineBoxRectPtr : outlineBoundsForRepaint(repaintContainer); 13768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newOutlineBox.location() != oldOutlineBox.location() || (mustRepaintBackgroundOrBorder() && (newBounds != oldBounds || newOutlineBox != oldOutlineBox))) 13778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fullRepaint = true; 13788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 13808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!repaintContainer) 13818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintContainer = v; 13828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 13838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (fullRepaint) { 13848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, oldBounds); 13858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newBounds != oldBounds) 13868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, newBounds); 13878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 13888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newBounds == oldBounds && newOutlineBox == oldOutlineBox) 13918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 13928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int deltaLeft = newBounds.x() - oldBounds.x(); 13948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (deltaLeft > 0) 13958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, IntRect(oldBounds.x(), oldBounds.y(), deltaLeft, oldBounds.height())); 13968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (deltaLeft < 0) 13978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, IntRect(newBounds.x(), newBounds.y(), -deltaLeft, newBounds.height())); 13988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int deltaRight = newBounds.right() - oldBounds.right(); 14008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (deltaRight > 0) 14018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, IntRect(oldBounds.right(), newBounds.y(), deltaRight, newBounds.height())); 14028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (deltaRight < 0) 14038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, IntRect(newBounds.right(), oldBounds.y(), -deltaRight, oldBounds.height())); 14048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int deltaTop = newBounds.y() - oldBounds.y(); 14068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (deltaTop > 0) 14078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, IntRect(oldBounds.x(), oldBounds.y(), oldBounds.width(), deltaTop)); 14088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (deltaTop < 0) 14098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, IntRect(newBounds.x(), newBounds.y(), newBounds.width(), -deltaTop)); 14108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int deltaBottom = newBounds.bottom() - oldBounds.bottom(); 14128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (deltaBottom > 0) 14138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, IntRect(newBounds.x(), oldBounds.bottom(), newBounds.width(), deltaBottom)); 14148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (deltaBottom < 0) 14158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, IntRect(oldBounds.x(), newBounds.bottom(), oldBounds.width(), -deltaBottom)); 14168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newOutlineBox == oldOutlineBox) 14188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 14198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We didn't move, but we did change size. Invalidate the delta, which will consist of possibly 14218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // two rectangles (but typically only one). 14228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderStyle* outlineStyle = outlineStyleForRepaint(); 14238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int ow = outlineStyle->outlineSize(); 14248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int width = abs(newOutlineBox.width() - oldOutlineBox.width()); 14258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (width) { 14260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int shadowLeft; 14270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int shadowRight; 14280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch style()->getBoxShadowHorizontalExtent(shadowLeft, shadowRight); 14298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1430635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int borderRight = isBox() ? toRenderBox(this)->borderRight() : 0; 14315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen int boxWidth = isBox() ? toRenderBox(this)->width() : 0; 14325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen int borderWidth = max(-outlineStyle->outlineOffset(), max(borderRight, max(style()->borderTopRightRadius().width().calcValue(boxWidth), style()->borderBottomRightRadius().width().calcValue(boxWidth)))) + max(ow, shadowRight); 14338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IntRect rightRect(newOutlineBox.x() + min(newOutlineBox.width(), oldOutlineBox.width()) - borderWidth, 14348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newOutlineBox.y(), 14358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project width + borderWidth, 14368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project max(newOutlineBox.height(), oldOutlineBox.height())); 14378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int right = min(newBounds.right(), oldBounds.right()); 14388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (rightRect.x() < right) { 14398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rightRect.setWidth(min(rightRect.width(), right - rightRect.x())); 14408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, rightRect); 14418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int height = abs(newOutlineBox.height() - oldOutlineBox.height()); 14448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (height) { 14450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int shadowTop; 14460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int shadowBottom; 14470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch style()->getBoxShadowVerticalExtent(shadowTop, shadowBottom); 14488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1449635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int borderBottom = isBox() ? toRenderBox(this)->borderBottom() : 0; 14505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen int boxHeight = isBox() ? toRenderBox(this)->height() : 0; 14515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen int borderHeight = max(-outlineStyle->outlineOffset(), max(borderBottom, max(style()->borderBottomLeftRadius().height().calcValue(boxHeight), style()->borderBottomRightRadius().height().calcValue(boxHeight)))) + max(ow, shadowBottom); 14528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IntRect bottomRect(newOutlineBox.x(), 14538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project min(newOutlineBox.bottom(), oldOutlineBox.bottom()) - borderHeight, 14548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project max(newOutlineBox.width(), oldOutlineBox.width()), 14558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project height + borderHeight); 14568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int bottom = min(newBounds.bottom(), oldBounds.bottom()); 14578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (bottomRect.y() < bottom) { 14588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bottomRect.setHeight(min(bottomRect.height(), bottom - bottomRect.y())); 14598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, bottomRect); 14608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 14638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1465635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid RenderObject::repaintDuringLayoutIfMoved(const IntRect&) 14668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1469635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid RenderObject::repaintOverhangingFloats(bool) 14708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::checkForRepaintDuringLayout() const 14748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: <https://bugs.webkit.org/show_bug.cgi?id=20885> It is probably safe to also require 14768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // m_everHadLayout. Currently, only RenderBlock::layoutBlock() adds this condition. See also 14778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // <https://bugs.webkit.org/show_bug.cgi?id=15129>. 14788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return !document()->view()->needsFullRepaint() && !hasLayer(); 14798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianIntRect RenderObject::rectWithOutlineForRepaint(RenderBoxModelObject* repaintContainer, int outlineWidth) 14828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1483635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project IntRect r(clippedOverflowRectForRepaint(repaintContainer)); 1484635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project r.inflate(outlineWidth); 14858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return r; 14868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianIntRect RenderObject::clippedOverflowRectForRepaint(RenderBoxModelObject*) 14898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT_NOT_REACHED(); 14918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return IntRect(); 14928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::computeRectForRepaint(RenderBoxModelObject* repaintContainer, IntRect& rect, bool fixed) 14958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1496635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (repaintContainer == this) 1497635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 1498635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 14998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (RenderObject* o = parent()) { 15008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (o->isBlockFlow()) { 15018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderBlock* cb = toRenderBlock(o); 15028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cb->hasColumns()) 15038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cb->adjustRectForColumns(rect); 15048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 15058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (o->hasOverflowClip()) { 15078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // o->height() is inaccurate if we're in the middle of a layout of |o|, so use the 15088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // layer's size instead. Even if the layer's size is wrong, the layer itself will repaint 15098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // anyway if its size does change. 1510635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project RenderBox* boxParent = toRenderBox(o); 1511635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1512dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block IntRect repaintRect(rect); 1513dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block repaintRect.move(-boxParent->layer()->scrolledContentOffset()); // For overflow:auto/scroll/hidden. 1514dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1515635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project IntRect boxRect(0, 0, boxParent->layer()->width(), boxParent->layer()->height()); 15168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rect = intersection(repaintRect, boxRect); 15178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (rect.isEmpty()) 15188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 15198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 15208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian o->computeRectForRepaint(repaintContainer, rect, fixed); 15228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 15238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1525635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid RenderObject::dirtyLinesFromChangedChild(RenderObject*) 15268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 15308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::showTreeForThis() const 15328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (node()) 15348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian node()->showTreeForThis(); 15358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1537643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid RenderObject::showRenderObject() const 1538643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1539643ca7872b450ea4efacab6188849e5aac2ba161Steve Block showRenderObject(0); 1540643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1541643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1542643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid RenderObject::showRenderObject(int printedCharacters) const 1543643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1544643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // As this function is intended to be used when debugging, the 1545643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // this pointer may be 0. 1546643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!this) { 1547643ca7872b450ea4efacab6188849e5aac2ba161Steve Block fputs("(null)\n", stderr); 1548643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 1549643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1550643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1551643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printedCharacters += fprintf(stderr, "%s %p", renderName(), this); 1552643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1553643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (node()) { 1554643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (printedCharacters) 1555643ca7872b450ea4efacab6188849e5aac2ba161Steve Block for (; printedCharacters < 39; printedCharacters++) 1556643ca7872b450ea4efacab6188849e5aac2ba161Steve Block fputc(' ', stderr); 1557643ca7872b450ea4efacab6188849e5aac2ba161Steve Block fputc('\t', stderr); 1558643ca7872b450ea4efacab6188849e5aac2ba161Steve Block node()->showNode(); 1559643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } else 1560643ca7872b450ea4efacab6188849e5aac2ba161Steve Block fputc('\n', stderr); 1561643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1562643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1563643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid RenderObject::showRenderTreeAndMark(const RenderObject* markedObject1, const char* markedLabel1, const RenderObject* markedObject2, const char* markedLabel2, int depth) const 1564643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1565643ca7872b450ea4efacab6188849e5aac2ba161Steve Block int printedCharacters = 0; 1566643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (markedObject1 == this && markedLabel1) 1567643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printedCharacters += fprintf(stderr, "%s", markedLabel1); 1568643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (markedObject2 == this && markedLabel2) 1569643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printedCharacters += fprintf(stderr, "%s", markedLabel2); 1570643ca7872b450ea4efacab6188849e5aac2ba161Steve Block for (; printedCharacters < depth * 2; printedCharacters++) 1571643ca7872b450ea4efacab6188849e5aac2ba161Steve Block fputc(' ', stderr); 1572643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1573643ca7872b450ea4efacab6188849e5aac2ba161Steve Block showRenderObject(printedCharacters); 1574643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!this) 1575643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 1576643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1577643ca7872b450ea4efacab6188849e5aac2ba161Steve Block for (const RenderObject* child = firstChild(); child; child = child->nextSibling()) 1578643ca7872b450ea4efacab6188849e5aac2ba161Steve Block child->showRenderTreeAndMark(markedObject1, markedLabel1, markedObject2, markedLabel2, depth + 1); 1579643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1580643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 15818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // NDEBUG 15828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectColor RenderObject::selectionBackgroundColor() const 15848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Color color; 15868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (style()->userSelect() != SELECT_NONE) { 1587e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block RefPtr<RenderStyle> pseudoStyle = getUncachedPseudoStyle(SELECTION); 1588e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if (pseudoStyle && pseudoStyle->visitedDependentColor(CSSPropertyBackgroundColor).isValid()) 1589e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block color = pseudoStyle->visitedDependentColor(CSSPropertyBackgroundColor).blendWithWhite(); 15908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 1591545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch color = frame()->selection()->isFocusedAndActive() ? 15928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project theme()->activeSelectionBackgroundColor() : 15938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project theme()->inactiveSelectionBackgroundColor(); 15948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 15958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return color; 15978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1599f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochColor RenderObject::selectionColor(int colorProperty) const 16008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Color color; 1602e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block // If the element is unselectable, or we are only painting the selection, 1603e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block // don't override the foreground color with the selection foreground color. 1604e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block if (style()->userSelect() == SELECT_NONE 1605e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block || (frame()->view()->paintBehavior() & PaintBehaviorSelectionOnly)) 16068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return color; 16078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (RefPtr<RenderStyle> pseudoStyle = getUncachedPseudoStyle(SELECTION)) { 1609f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch color = pseudoStyle->visitedDependentColor(colorProperty); 16108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!color.isValid()) 1611e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block color = pseudoStyle->visitedDependentColor(CSSPropertyColor); 16128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 1613545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch color = frame()->selection()->isFocusedAndActive() ? 1614635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project theme()->activeSelectionForegroundColor() : 1615635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project theme()->inactiveSelectionForegroundColor(); 16168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return color; 16188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1620f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochColor RenderObject::selectionForegroundColor() const 1621f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 1622f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return selectionColor(CSSPropertyWebkitTextFillColor); 1623f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 1624f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 1625f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochColor RenderObject::selectionEmphasisMarkColor() const 1626f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 1627f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return selectionColor(CSSPropertyWebkitTextEmphasisColor); 1628f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 1629f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 1630231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(DRAG_SUPPORT) 16318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNode* RenderObject::draggableNode(bool dhtmlOK, bool uaOK, int x, int y, bool& dhtmlWillDrag) const 16328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!dhtmlOK && !uaOK) 16348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 16358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (const RenderObject* curr = this; curr; curr = curr->parent()) { 16378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Node* elt = curr->node(); 16388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (elt && elt->nodeType() == Node::TEXT_NODE) { 16398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Since there's no way for the author to address the -webkit-user-drag style for a text node, 16408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we use our own judgement. 16418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (uaOK && view()->frameView()->frame()->eventHandler()->shouldDragAutoNode(curr->node(), IntPoint(x, y))) { 16428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dhtmlWillDrag = false; 16438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return curr->node(); 16448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (elt->canStartSelection()) 16468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // In this case we have a click in the unselected portion of text. If this text is 16478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // selectable, we want to start the selection process instead of looking for a parent 16488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // to try to drag. 16498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 16508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 16518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EUserDrag dragMode = curr->style()->userDrag(); 16528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (dhtmlOK && dragMode == DRAG_ELEMENT) { 16538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dhtmlWillDrag = true; 16548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return curr->node(); 16558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (uaOK && dragMode == DRAG_AUTO 16578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && view()->frameView()->frame()->eventHandler()->shouldDragAutoNode(curr->node(), IntPoint(x, y))) { 16588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dhtmlWillDrag = false; 16598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return curr->node(); 16608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 16648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1665231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif // ENABLE(DRAG_SUPPORT) 16668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::selectionStartEnd(int& spos, int& epos) const 16688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view()->selectionStartEnd(spos, epos); 16708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::handleDynamicFloatPositionChange() 16738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We have gone from not affecting the inline status of the parent flow to suddenly 16758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // having an impact. See if there is a mismatch between the parent flow's 16768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // childrenInline() state and our state. 16778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setInline(style()->isDisplayInlineType()); 16788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isInline() != parent()->childrenInline()) { 16798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!isInline()) 16808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderBoxModelObject(parent())->childBecameNonInline(this); 16818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else { 16828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // An anonymous block must be made to wrap this inline. 16838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderBlock* block = toRenderBlock(parent())->createAnonymousBlock(); 16848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObjectChildList* childlist = parent()->virtualChildren(); 16858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian childlist->insertChildNode(parent(), block, this); 16868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian block->children()->appendChildNode(block, childlist->removeChildNode(parent(), this)); 16878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::setAnimatableStyle(PassRefPtr<RenderStyle> style) 16928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!isText() && style) 16948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setStyle(animation()->updateAnimations(this, style.get())); 16958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 16968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setStyle(style); 16978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianStyleDifference RenderObject::adjustStyleDifference(StyleDifference diff, unsigned contextSensitiveProperties) const 17008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 17018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if USE(ACCELERATED_COMPOSITING) 17028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If transform changed, and we are not composited, need to do a layout. 17035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (contextSensitiveProperties & ContextSensitivePropertyTransform) { 17048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Text nodes share style with their parents but transforms don't apply to them, 17058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // hence the !isText() check. 17068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // FIXME: when transforms are taken into account for overflow, we will need to do a layout. 17078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!isText() && (!hasLayer() || !toRenderBoxModelObject(this)->layer()->isComposited())) 17088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian diff = StyleDifferenceLayout; 17098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if (diff < StyleDifferenceRecompositeLayer) 17108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian diff = StyleDifferenceRecompositeLayer; 17115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 17128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 17138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If opacity changed, and we are not composited, need to repaint (also 17148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // ignoring text nodes) 17155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (contextSensitiveProperties & ContextSensitivePropertyOpacity) { 17168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!isText() && (!hasLayer() || !toRenderBoxModelObject(this)->layer()->isComposited())) 17178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian diff = StyleDifferenceRepaintLayer; 17188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if (diff < StyleDifferenceRecompositeLayer) 17198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian diff = StyleDifferenceRecompositeLayer; 17205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 1721e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 1722e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // The answer to requiresLayer() for plugins and iframes can change outside of the style system, 1723e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // since it depends on whether we decide to composite these elements. When the layer status of 1724e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // one of these elements changes, we need to force a layout. 1725e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (diff == StyleDifferenceEqual && style() && isBoxModelObject()) { 1726e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (hasLayer() != toRenderBoxModelObject(this)->requiresLayer()) 1727e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke diff = StyleDifferenceLayout; 1728e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke } 17298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#else 17308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian UNUSED_PARAM(contextSensitiveProperties); 17318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 17328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 17338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If we have no layer(), just treat a RepaintLayer hint as a normal Repaint. 17348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (diff == StyleDifferenceRepaintLayer && !hasLayer()) 17358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian diff = StyleDifferenceRepaint; 17368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 17378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return diff; 17388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 17398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 17408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::setStyle(PassRefPtr<RenderStyle> style) 17418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 174228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (m_style == style) { 174328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#if USE(ACCELERATED_COMPOSITING) 174428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // We need to run through adjustStyleDifference() for iframes and plugins, so 174528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // style sharing is disabled for them. That should ensure that we never hit this code path. 174628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu ASSERT(!isRenderIFrame() && !isEmbeddedObject() &&!isApplet()); 174728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#endif 17488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 174928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } 17508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian StyleDifference diff = StyleDifferenceEqual; 17528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian unsigned contextSensitiveProperties = ContextSensitivePropertyNone; 17538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_style) 17548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian diff = m_style->diff(style.get(), contextSensitiveProperties); 17558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian diff = adjustStyleDifference(diff, contextSensitiveProperties); 17578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project styleWillChange(diff, style.get()); 17598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<RenderStyle> oldStyle = m_style.release(); 17618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_style = style; 17628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project updateFillImages(oldStyle ? oldStyle->backgroundLayers() : 0, m_style ? m_style->backgroundLayers() : 0); 17648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project updateFillImages(oldStyle ? oldStyle->maskLayers() : 0, m_style ? m_style->maskLayers() : 0); 17658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project updateImage(oldStyle ? oldStyle->borderImage().image() : 0, m_style ? m_style->borderImage().image() : 0); 17678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project updateImage(oldStyle ? oldStyle->maskBoxImage().image() : 0, m_style ? m_style->maskBoxImage().image() : 0); 17688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // We need to ensure that view->maximalOutlineSize() is valid for any repaints that happen 17708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // during styleDidChange (it's used by clippedOverflowRectForRepaint()). 17718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_style->outlineWidth() > 0 && m_style->outlineSize() > maximalOutlineSize(PaintPhaseOutline)) 17728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderView(document()->renderer())->setMaximalOutlineSize(m_style->outlineSize()); 17738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 17748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project styleDidChange(diff, oldStyle.get()); 17758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 17768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!m_parent || isText()) 17778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 17788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 17798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Now that the layer (if any) has been updated, we need to adjust the diff again, 17808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // check whether we should layout now, and decide if we need to repaint. 17818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian StyleDifference updatedDiff = adjustStyleDifference(diff, contextSensitiveProperties); 17828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 17838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (diff <= StyleDifferenceLayoutPositionedMovementOnly) { 17848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (updatedDiff == StyleDifferenceLayout) 17858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian setNeedsLayoutAndPrefWidthsRecalc(); 17868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if (updatedDiff == StyleDifferenceLayoutPositionedMovementOnly) 17878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian setNeedsPositionedMovementLayout(); 17888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 17898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 17908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (updatedDiff == StyleDifferenceRepaintLayer || updatedDiff == StyleDifferenceRepaint) { 17918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Do a repaint with the new style now, e.g., for example if we go from 17928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // not having an outline to having an outline. 17938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaint(); 17948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 17958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::setStyleInternal(PassRefPtr<RenderStyle> style) 17988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_style = style; 18008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::styleWillChange(StyleDifference diff, const RenderStyle* newStyle) 18038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_style) { 18058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If our z-index changes value or our visibility changes, 18068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we need to dirty our stacking context's z-order list. 18078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newStyle) { 18085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian bool visibilityChanged = m_style->visibility() != newStyle->visibility() 18095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian || m_style->zIndex() != newStyle->zIndex() 18105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian || m_style->hasAutoZIndex() != newStyle->hasAutoZIndex(); 18118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT) 18125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (visibilityChanged) 18138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project document()->setDashboardRegionsDirty(true); 18148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 18155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (visibilityChanged && AXObjectCache::accessibilityEnabled()) 18165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian document()->axObjectCache()->childrenChanged(this); 18178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1818635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Keep layer hierarchy visibility bits up to date if visibility changes. 18198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_style->visibility() != newStyle->visibility()) { 18208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (RenderLayer* l = enclosingLayer()) { 18218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newStyle->visibility() == VISIBLE) 18228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project l->setHasVisibleContent(true); 18238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (l->hasVisibleContent() && (this == l->renderer() || l->renderer()->style()->visibility() != VISIBLE)) { 18248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project l->dirtyVisibleContentStatus(); 18258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (diff > StyleDifferenceRepaintLayer) 18268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project repaint(); 18278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_parent && (diff == StyleDifferenceRepaint || newStyle->outlineSize() < m_style->outlineSize())) 1833635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project repaint(); 18348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isFloating() && (m_style->floating() != newStyle->floating())) 18358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For changes in float styles, we need to conceivably remove ourselves 18368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // from the floating objects list. 18378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderBox(this)->removeFloatingOrPositionedChildFromBlockLists(); 1838cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block else if (isPositioned() && (m_style->position() != newStyle->position())) 18398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For changes in positioning styles, we need to conceivably remove ourselves 18408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // from the positioned objects list. 18418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderBox(this)->removeFloatingOrPositionedChildFromBlockLists(); 18428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s_affectsParentBlock = isFloatingOrPositioned() && 18448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (!newStyle->isFloating() && newStyle->position() != AbsolutePosition && newStyle->position() != FixedPosition) 1845635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project && parent() && (parent()->isBlockFlow() || parent()->isRenderInline()); 18468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // reset style flags 18488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (diff == StyleDifferenceLayout || diff == StyleDifferenceLayoutPositionedMovementOnly) { 18498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_floating = false; 18508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_positioned = false; 18518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_relPositioned = false; 18528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_paintBackground = false; 18548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_hasOverflowClip = false; 18558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_hasTransform = false; 18568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_hasReflection = false; 18578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 18588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s_affectsParentBlock = false; 18598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (view()->frameView()) { 1861d0825bca7fe65beaee391d30da42e937db621564Steve Block bool shouldBlitOnFixedBackgroundImage = false; 1862d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(FAST_MOBILE_SCROLLING) 1863d0825bca7fe65beaee391d30da42e937db621564Steve Block // On low-powered/mobile devices, preventing blitting on a scroll can cause noticeable delays 1864d0825bca7fe65beaee391d30da42e937db621564Steve Block // when scrolling a page with a fixed background image. As an optimization, assuming there are 1865d0825bca7fe65beaee391d30da42e937db621564Steve Block // no fixed positoned elements on the page, we can acclerate scrolling (via blitting) if we 1866d0825bca7fe65beaee391d30da42e937db621564Steve Block // ignore the CSS property "background-attachment: fixed". 1867d0825bca7fe65beaee391d30da42e937db621564Steve Block shouldBlitOnFixedBackgroundImage = true; 1868d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 1869d0825bca7fe65beaee391d30da42e937db621564Steve Block 187006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen bool newStyleSlowScroll = newStyle && !shouldBlitOnFixedBackgroundImage && newStyle->hasFixedBackgroundImage(); 187106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen bool oldStyleSlowScroll = m_style && !shouldBlitOnFixedBackgroundImage && m_style->hasFixedBackgroundImage(); 18728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (oldStyleSlowScroll != newStyleSlowScroll) { 18738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (oldStyleSlowScroll) 18748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view()->frameView()->removeSlowRepaintObject(); 18758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newStyleSlowScroll) 18768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view()->frameView()->addSlowRepaintObject(); 18778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1881d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid RenderObject::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) 18828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (s_affectsParentBlock) 18848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project handleDynamicFloatPositionChange(); 18858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1886635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_parent) 1887635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 1888635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1889d0825bca7fe65beaee391d30da42e937db621564Steve Block if (diff == StyleDifferenceLayout) { 1890d0825bca7fe65beaee391d30da42e937db621564Steve Block RenderCounter::rendererStyleChanged(this, oldStyle, m_style.get()); 18918a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 18928a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block // If the object already needs layout, then setNeedsLayout won't do 18938a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block // any work. But if the containing block has changed, then we may need 18948a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block // to mark the new containing blocks for layout. The change that can 18958a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block // directly affect the containing block of this object is a change to 18968a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block // the position style. 18978a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block if (m_needsLayout && oldStyle->position() != m_style->position()) 18988a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block markContainingBlocksForLayout(); 18998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 19008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setNeedsLayoutAndPrefWidthsRecalc(); 1901d0825bca7fe65beaee391d30da42e937db621564Steve Block } else if (diff == StyleDifferenceLayoutPositionedMovementOnly) 19028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setNeedsPositionedMovementLayout(); 19038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Don't check for repaint here; we need to wait until the layer has been 19058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // updated by subclasses before we know if we have to repaint (in setStyle()). 19068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::updateFillImages(const FillLayer* oldLayers, const FillLayer* newLayers) 19098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1910231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Optimize the common case 1911231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (oldLayers && !oldLayers->next() && newLayers && !newLayers->next() && (oldLayers->image() == newLayers->image())) 1912231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 1913231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1914231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Go through the new layers and addClients first, to avoid removing all clients of an image. 1915058ccc7ba0a4d59b9f6e92808332aa9895425fc7Andrei Popescu for (const FillLayer* currNew = newLayers; currNew; currNew = currNew->next()) { 1916231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (currNew->image()) 1917058ccc7ba0a4d59b9f6e92808332aa9895425fc7Andrei Popescu currNew->image()->addClient(this); 1918058ccc7ba0a4d59b9f6e92808332aa9895425fc7Andrei Popescu } 1919231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1920231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block for (const FillLayer* currOld = oldLayers; currOld; currOld = currOld->next()) { 1921231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (currOld->image()) 1922231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block currOld->image()->removeClient(this); 1923231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 19248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::updateImage(StyleImage* oldImage, StyleImage* newImage) 19278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 19288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (oldImage != newImage) { 19298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (oldImage) 19308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project oldImage->removeClient(this); 19318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newImage) 19328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newImage->addClient(this); 19338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 19348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect RenderObject::viewRect() const 19378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 19388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return view()->viewRect(); 19398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1941635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectFloatPoint RenderObject::localToAbsolute(FloatPoint localPoint, bool fixed, bool useTransforms) const 19428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 19438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian TransformState transformState(TransformState::ApplyTransformDirection, localPoint); 19448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian mapLocalToContainer(0, fixed, useTransforms, transformState); 19458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian transformState.flatten(); 19468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return transformState.lastPlanarPoint(); 19488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1950635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectFloatPoint RenderObject::absoluteToLocal(FloatPoint containerPoint, bool fixed, bool useTransforms) const 19518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 19528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian TransformState transformState(TransformState::UnapplyInverseTransformDirection, containerPoint); 19538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian mapAbsoluteToLocalPoint(fixed, useTransforms, transformState); 19548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian transformState.flatten(); 19558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return transformState.lastPlanarPoint(); 19578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool fixed, bool useTransforms, TransformState& transformState) const 19608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1961635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (repaintContainer == this) 19628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 1963635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1964635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project RenderObject* o = parent(); 19658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!o) 19668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 19678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1968692e5dbf12901edacf14812a6fae25462920af42Steve Block IntSize columnOffset; 1969692e5dbf12901edacf14812a6fae25462920af42Steve Block o->adjustForColumns(columnOffset, roundedIntPoint(transformState.mappedPoint())); 1970692e5dbf12901edacf14812a6fae25462920af42Steve Block if (!columnOffset.isZero()) 1971692e5dbf12901edacf14812a6fae25462920af42Steve Block transformState.move(columnOffset); 1972692e5dbf12901edacf14812a6fae25462920af42Steve Block 19738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (o->hasOverflowClip()) 19748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian transformState.move(-toRenderBox(o)->layer()->scrolledContentOffset()); 19758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian o->mapLocalToContainer(repaintContainer, fixed, useTransforms, transformState); 19778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 19788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::mapAbsoluteToLocalPoint(bool fixed, bool useTransforms, TransformState& transformState) const 19808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 19818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* o = parent(); 1982635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (o) { 19838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian o->mapAbsoluteToLocalPoint(fixed, useTransforms, transformState); 1984635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (o->hasOverflowClip()) 19858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian transformState.move(toRenderBox(o)->layer()->scrolledContentOffset()); 1986635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 19878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 19888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool RenderObject::shouldUseTransformFromContainer(const RenderObject* containerObject) const 19908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 19915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(3D_RENDERING) 19925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // hasTransform() indicates whether the object has transform, transform-style or perspective. We just care about transform, 19935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // so check the layer's transform directly. 19945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return (hasLayer() && toRenderBoxModelObject(this)->layer()->transform()) || (containerObject && containerObject->style()->hasPerspective()); 1995353e1e16ed060c0ea11f2dea6dea8b565ac71533Mike Reed#else 19965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian UNUSED_PARAM(containerObject); 19975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return hasTransform(); 1998353e1e16ed060c0ea11f2dea6dea8b565ac71533Mike Reed#endif 19995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 2000353e1e16ed060c0ea11f2dea6dea8b565ac71533Mike Reed 20015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid RenderObject::getTransformFromContainer(const RenderObject* containerObject, const IntSize& offsetInContainer, TransformationMatrix& transform) const 20025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 20035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian transform.makeIdentity(); 20045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian transform.translate(offsetInContainer.width(), offsetInContainer.height()); 20055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian RenderLayer* layer; 20065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (hasLayer() && (layer = toRenderBoxModelObject(this)->layer()) && layer->transform()) 20075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian transform.multLeft(layer->currentTransform()); 20085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 20098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if ENABLE(3D_RENDERING) 20100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (containerObject && containerObject->hasLayer() && containerObject->style()->hasPerspective()) { 20118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Perpsective on the container affects us, so we have to factor it in here. 20128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(containerObject->hasLayer()); 2013bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen FloatPoint perspectiveOrigin = toRenderBoxModelObject(containerObject)->layer()->perspectiveOrigin(); 20148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 20158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian TransformationMatrix perspectiveMatrix; 20168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian perspectiveMatrix.applyPerspective(containerObject->style()->perspective()); 20178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 20185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian transform.translateRight3d(-perspectiveOrigin.x(), -perspectiveOrigin.y(), 0); 20195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian transform.multiply(perspectiveMatrix); 20205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian transform.translateRight3d(perspectiveOrigin.x(), perspectiveOrigin.y(), 0); 20218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 20228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#else 20238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian UNUSED_PARAM(containerObject); 20248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 20258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 2026635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 20278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianFloatQuad RenderObject::localToContainerQuad(const FloatQuad& localQuad, RenderBoxModelObject* repaintContainer, bool fixed) const 20288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 2029692e5dbf12901edacf14812a6fae25462920af42Steve Block // Track the point at the center of the quad's bounding box. As mapLocalToContainer() calls offsetFromContainer(), 2030692e5dbf12901edacf14812a6fae25462920af42Steve Block // it will use that point as the reference point to decide which column's transform to apply in multiple-column blocks. 2031692e5dbf12901edacf14812a6fae25462920af42Steve Block TransformState transformState(TransformState::ApplyTransformDirection, localQuad.boundingBox().center(), &localQuad); 20328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian mapLocalToContainer(repaintContainer, fixed, true, transformState); 20338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian transformState.flatten(); 20348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 20358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return transformState.lastPlanarQuad(); 20368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2038692e5dbf12901edacf14812a6fae25462920af42Steve BlockIntSize RenderObject::offsetFromContainer(RenderObject* o, const IntPoint& point) const 20398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2040635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(o == container()); 2041635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2042635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project IntSize offset; 2043692e5dbf12901edacf14812a6fae25462920af42Steve Block 2044692e5dbf12901edacf14812a6fae25462920af42Steve Block o->adjustForColumns(offset, point); 2045692e5dbf12901edacf14812a6fae25462920af42Steve Block 2046635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (o->hasOverflowClip()) 2047635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project offset -= toRenderBox(o)->layer()->scrolledContentOffset(); 2048635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2049635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return offset; 20508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2052231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockIntSize RenderObject::offsetFromAncestorContainer(RenderObject* container) const 2053231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 2054231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block IntSize offset; 2055692e5dbf12901edacf14812a6fae25462920af42Steve Block IntPoint referencePoint; 2056231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block const RenderObject* currContainer = this; 2057231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block do { 2058231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RenderObject* nextContainer = currContainer->container(); 2059231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(nextContainer); // This means we reached the top without finding container. 2060231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!nextContainer) 2061231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block break; 2062231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(!currContainer->hasTransform()); 2063692e5dbf12901edacf14812a6fae25462920af42Steve Block IntSize currentOffset = currContainer->offsetFromContainer(nextContainer, referencePoint); 2064692e5dbf12901edacf14812a6fae25462920af42Steve Block offset += currentOffset; 2065692e5dbf12901edacf14812a6fae25462920af42Steve Block referencePoint.move(currentOffset); 2066231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block currContainer = nextContainer; 2067231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } while (currContainer != container); 2068231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2069231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return offset; 2070231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 2071231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2072635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectIntRect RenderObject::localCaretRect(InlineBox*, int, int* extraWidthToEndOfLine) 20738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 20740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (extraWidthToEndOfLine) 20750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *extraWidthToEndOfLine = 0; 2076635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2077635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return IntRect(); 20788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderView* RenderObject::view() const 20818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 20828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return toRenderView(document()->renderer()); 20838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 20848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 20858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool RenderObject::isRooted(RenderView** view) 20868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 20878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* o = this; 20888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while (o->parent()) 20898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian o = o->parent(); 20908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 20918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!o->isRenderView()) 20928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return false; 20938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 20948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (view) 20958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *view = toRenderView(o); 20968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 20978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return true; 20988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::hasOutlineAnnotation() const 21018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return node() && node()->isLink() && document()->printing(); 21038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2105231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockRenderObject* RenderObject::container(RenderBoxModelObject* repaintContainer, bool* repaintContainerSkipped) const 21068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2107231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (repaintContainerSkipped) 2108231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *repaintContainerSkipped = false; 2109231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 21108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This method is extremely similar to containingBlock(), but with a few notable 21118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // exceptions. 21128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // (1) It can be used on orphaned subtrees, i.e., it can be called safely even when 21138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the object is not part of the primary document subtree yet. 21148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // (2) For normal flow elements, it just returns the parent. 21158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // (3) For absolute positioned elements, it will return a relative positioned inline. 21168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // containingBlock() simply skips relpositioned inlines and lets an enclosing block handle 2117bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen // the layout of the positioned object. This does mean that computePositionedLogicalWidth and 2118bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen // computePositionedLogicalHeight have to use container(). 21198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* o = parent(); 21208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isText()) 21228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o; 21238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EPosition pos = m_style->position(); 21258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (pos == FixedPosition) { 21268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // container() can be called on an object that is not in the 21278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // tree yet. We don't call view() since it will assert if it 21288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // can't get back to the canvas. Instead we just walk as high up 21298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // as we can. If we're in the tree, we'll get the root. If we 21308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // aren't we'll get the root of our little subtree (most likely 21318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we'll just return 0). 2132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // FIXME: The definition of view() has changed to not crawl up the render tree. It might 2133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // be safe now to use it. 2134231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block while (o && o->parent() && !(o->hasTransform() && o->isRenderBlock())) { 2135231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (repaintContainerSkipped && o == repaintContainer) 2136231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *repaintContainerSkipped = true; 21378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->parent(); 2138231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 21398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (pos == AbsolutePosition) { 21408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Same goes here. We technically just want our containing block, but 21418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we may not have one if we're part of an uninstalled subtree. We'll 21428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // climb as high as we can though. 2143231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block while (o && o->style()->position() == StaticPosition && !o->isRenderView() && !(o->hasTransform() && o->isRenderBlock())) { 2144231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (repaintContainerSkipped && o == repaintContainer) 2145231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *repaintContainerSkipped = true; 21468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->parent(); 2147231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 21488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 21498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o; 21518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::isSelectionBorder() const 21548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SelectionState st = selectionState(); 21568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return st == SelectionStart || st == SelectionEnd || st == SelectionBoth; 21578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::destroy() 21608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Destroy any leftover anonymous children. 21628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObjectChildList* children = virtualChildren(); 21638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (children) 21648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian children->destroyLeftoverChildren(); 21658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 21668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If this renderer is being autoscrolled, stop the autoscroll timer 2167231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2168d0825bca7fe65beaee391d30da42e937db621564Steve Block // FIXME: RenderObject::destroy should not get called with a renderer whose document 2169231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // has a null frame, so we assert this. However, we don't want release builds to crash which is why we 2170231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // check that the frame is not null. 2171545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch ASSERT(frame()); 2172545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (frame() && frame()->eventHandler()->autoscrollRenderer() == this) 2173545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch frame()->eventHandler()->stopAutoscrollTimer(true); 21748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_hasCounterNodeMap) 21768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderCounter::destroyCounterNodes(this); 21778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2178635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (AXObjectCache::accessibilityEnabled()) { 2179635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project document()->axObjectCache()->childrenChanged(this->parent()); 21808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project document()->axObjectCache()->remove(this); 2181635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 21828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project animation()->cancelAnimations(this); 21838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // By default no ref-counting. RenderWidget::destroy() doesn't call 21858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // this function because it needs to do ref-counting. If anything 21868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // in this function changes, be sure to fix RenderWidget::destroy() as well. 21878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project remove(); 21898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // FIXME: Would like to do this in RenderBoxModelObject, but the timing is so complicated that this can't easily 21918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // be moved into RenderBoxModelObject::destroy. 21925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (hasLayer()) { 21935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian setHasLayer(false); 21948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderBoxModelObject(this)->destroyLayer(); 21955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 21968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian arenaDelete(renderArena(), this); 21978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::arenaDelete(RenderArena* arena, void* base) 22008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_style) { 22028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (const FillLayer* bgLayer = m_style->backgroundLayers(); bgLayer; bgLayer = bgLayer->next()) { 22038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (StyleImage* backgroundImage = bgLayer->image()) 22048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project backgroundImage->removeClient(this); 22058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (const FillLayer* maskLayer = m_style->maskLayers(); maskLayer; maskLayer = maskLayer->next()) { 22088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (StyleImage* maskImage = maskLayer->image()) 22098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project maskImage->removeClient(this); 22108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (StyleImage* borderImage = m_style->borderImage().image()) 22138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project borderImage->removeClient(this); 22148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (StyleImage* maskBoxImage = m_style->maskBoxImage().image()) 22168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project maskBoxImage->removeClient(this); 22178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 22208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void* savedBase = baseOfRenderObjectBeingDeleted; 22218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project baseOfRenderObjectBeingDeleted = base; 22228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 22238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete this; 22248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 22258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project baseOfRenderObjectBeingDeleted = savedBase; 22268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 22278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Recover the size left there for us by operator delete and free the memory. 22298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project arena->free(*(size_t*)base, base); 22308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianVisiblePosition RenderObject::positionForCoordinates(int x, int y) 22338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return positionForPoint(IntPoint(x, y)); 22358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianVisiblePosition RenderObject::positionForPoint(const IntPoint&) 2238635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 22398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return createVisiblePosition(caretMinOffset(), DOWNSTREAM); 2240635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 2241635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 22428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::updateDragState(bool dragOn) 22438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool valueChanged = (dragOn != m_isDragging); 22458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isDragging = dragOn; 2246a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (valueChanged && style()->affectedByDragRules() && node()) 22475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian node()->setNeedsStyleRecalc(); 22488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling()) 22498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr->updateDragState(dragOn); 22508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::hitTest(const HitTestRequest& request, HitTestResult& result, const IntPoint& point, int tx, int ty, HitTestFilter hitTestFilter) 22538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool inside = false; 22558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hitTestFilter != HitTestSelf) { 22568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // First test the foreground layer (lines and inlines). 22578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project inside = nodeAtPoint(request, result, point.x(), point.y(), tx, ty, HitTestForeground); 22588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Test floats next. 22608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!inside) 22618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project inside = nodeAtPoint(request, result, point.x(), point.y(), tx, ty, HitTestFloat); 22628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Finally test to see if the mouse is in the background (within a child block's background). 22648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!inside) 22658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project inside = nodeAtPoint(request, result, point.x(), point.y(), tx, ty, HitTestChildBlockBackgrounds); 22668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // See if the mouse is inside us but not any of our descendants 22698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hitTestFilter != HitTestDescendants && !inside) 22708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project inside = nodeAtPoint(request, result, point.x(), point.y(), tx, ty, HitTestBlockBackground); 22718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return inside; 22738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::updateHitTestResult(HitTestResult& result, const IntPoint& point) 22768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result.innerNode()) 22788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 22798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Node* n = node(); 22818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (n) { 22828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result.setInnerNode(n); 22838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!result.innerNonSharedNode()) 22848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result.setInnerNonSharedNode(n); 22858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result.setLocalPoint(point); 22868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::nodeAtPoint(const HitTestRequest&, HitTestResult&, int /*x*/, int /*y*/, int /*tx*/, int /*ty*/, HitTestAction) 22908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 22928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::scheduleRelayout() 22958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isRenderView()) { 22978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian FrameView* view = toRenderView(this)->frameView(); 22988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (view) 22998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->scheduleRelayout(); 23008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (parent()) { 23018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameView* v = view() ? view()->frameView() : 0; 23028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (v) 23038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project v->scheduleRelayoutOfSubtree(this); 23048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::layout() 23088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(needsLayout()); 23108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* child = firstChild(); 23118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while (child) { 23128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child->layoutIfNeeded(); 23138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(!child->needsLayout()); 23148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child = child->nextSibling(); 23158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 23168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian setNeedsLayout(false); 23178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<RenderStyle> RenderObject::uncachedFirstLineStyle(RenderStyle* style) const 23200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 23210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!document()->usesFirstLineRules()) 23220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return 0; 23230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 23240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(!isText()); 23250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 23260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RefPtr<RenderStyle> result; 23270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 23280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (isBlockFlow()) { 23290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (RenderBlock* firstLineBlock = this->firstLineBlock()) 23300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch result = firstLineBlock->getUncachedPseudoStyle(FIRST_LINE, style, firstLineBlock == this ? style : 0); 23310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } else if (!isAnonymous() && isRenderInline()) { 23320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RenderStyle* parentStyle = parent()->firstLineStyle(); 23330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (parentStyle != parent()->style()) 23340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch result = getUncachedPseudoStyle(FIRST_LINE_INHERITED, parentStyle, style); 23350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 23360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 23370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return result.release(); 23380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 23390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 23408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianRenderStyle* RenderObject::firstLineStyleSlowCase() const 23418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(document()->usesFirstLineRules()); 23438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderStyle* style = m_style.get(); 23458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian const RenderObject* renderer = isText() ? parent() : this; 23468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (renderer->isBlockFlow()) { 23478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (RenderBlock* firstLineBlock = renderer->firstLineBlock()) 23488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian style = firstLineBlock->getCachedPseudoStyle(FIRST_LINE, style); 23498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } else if (!renderer->isAnonymous() && renderer->isRenderInline()) { 23508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderStyle* parentStyle = renderer->parent()->firstLineStyle(); 23518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (parentStyle != renderer->parent()->style()) { 23528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // A first-line style is in effect. Cache a first-line style for ourselves. 2353bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen renderer->style()->setHasPseudoStyle(FIRST_LINE_INHERITED); 23548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian style = renderer->getCachedPseudoStyle(FIRST_LINE_INHERITED, parentStyle); 23558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 23588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return style; 23598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianRenderStyle* RenderObject::getCachedPseudoStyle(PseudoId pseudo, RenderStyle* parentStyle) const 23628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (pseudo < FIRST_INTERNAL_PSEUDOID && !style()->hasPseudoStyle(pseudo)) 23648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 23658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderStyle* cachedStyle = style()->getCachedPseudoStyle(pseudo); 23678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cachedStyle) 23688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return cachedStyle; 23698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<RenderStyle> result = getUncachedPseudoStyle(pseudo, parentStyle); 23718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result) 23728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return style()->addCachedPseudoStyle(result.release()); 23738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 23748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<RenderStyle> RenderObject::getUncachedPseudoStyle(PseudoId pseudo, RenderStyle* parentStyle, RenderStyle* ownStyle) const 23778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (pseudo < FIRST_INTERNAL_PSEUDOID && !ownStyle && !style()->hasPseudoStyle(pseudo)) 23798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 23808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!parentStyle) { 23820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(!ownStyle); 23838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project parentStyle = style(); 23840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 23858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Node* n = node(); 23878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while (n && !n->isElementNode()) 23888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian n = n->parentNode(); 23898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!n) 23908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 23918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<RenderStyle> result; 23938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (pseudo == FIRST_LINE_INHERITED) { 23948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result = document()->styleSelector()->styleForElement(static_cast<Element*>(n), parentStyle, false); 23958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result->setStyleType(FIRST_LINE_INHERITED); 23968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 23978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result = document()->styleSelector()->pseudoStyleForElement(pseudo, static_cast<Element*>(n), parentStyle); 23988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result.release(); 23998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2401dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic Color decorationColor(RenderObject* renderer) 24028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Color result; 2404dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (renderer->style()->textStrokeWidth() > 0) { 24058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Prefer stroke color if possible but not if it's fully transparent. 2406dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block result = renderer->style()->visitedDependentColor(CSSPropertyWebkitTextStrokeColor); 24078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result.alpha()) 24088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 24098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2411dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block result = renderer->style()->visitedDependentColor(CSSPropertyWebkitTextFillColor); 24128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 24138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::getTextDecorationColors(int decorations, Color& underline, Color& overline, 24168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Color& linethrough, bool quirksMode) 24178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* curr = this; 24198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project do { 24208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int currDecs = curr->style()->textDecoration(); 24218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (currDecs) { 24228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (currDecs & UNDERLINE) { 24238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project decorations &= ~UNDERLINE; 2424dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block underline = decorationColor(curr); 24258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (currDecs & OVERLINE) { 24278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project decorations &= ~OVERLINE; 2428dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block overline = decorationColor(curr); 24298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (currDecs & LINE_THROUGH) { 24318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project decorations &= ~LINE_THROUGH; 2432dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block linethrough = decorationColor(curr); 24338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr = curr->parent(); 2436e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if (curr && curr->isAnonymousBlock() && toRenderBlock(curr)->continuation()) 2437e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block curr = toRenderBlock(curr)->continuation(); 24388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } while (curr && decorations && (!quirksMode || !curr->node() || 24398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian (!curr->node()->hasTagName(aTag) && !curr->node()->hasTagName(fontTag)))); 24408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we bailed out, use the element we bailed out at (typically a <font> or <a> element). 24428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (decorations && curr) { 24438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (decorations & UNDERLINE) 2444dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block underline = decorationColor(curr); 24458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (decorations & OVERLINE) 2446dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block overline = decorationColor(curr); 24478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (decorations & LINE_THROUGH) 2448dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block linethrough = decorationColor(curr); 24498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT) 24538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::addDashboardRegions(Vector<DashboardRegionValue>& regions) 24548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Convert the style regions to absolute coordinates. 2456635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (style()->visibility() != VISIBLE || !isBox()) 24578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2458635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2459635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project RenderBox* box = toRenderBox(this); 24608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const Vector<StyleDashboardRegion>& styleRegions = style()->dashboardRegions(); 24628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned i, count = styleRegions.size(); 24638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (i = 0; i < count; i++) { 24648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project StyleDashboardRegion styleRegion = styleRegions[i]; 24658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2466635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int w = box->width(); 2467635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int h = box->height(); 24688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DashboardRegionValue region; 24708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.label = styleRegion.label; 24718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.bounds = IntRect(styleRegion.offset.left().value(), 24728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project styleRegion.offset.top().value(), 24738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project w - styleRegion.offset.left().value() - styleRegion.offset.right().value(), 24748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project h - styleRegion.offset.top().value() - styleRegion.offset.bottom().value()); 24758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.type = styleRegion.type; 24768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.clip = region.bounds; 24788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project computeAbsoluteRepaintRect(region.clip); 24798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (region.clip.height() < 0) { 24808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.clip.setHeight(0); 24818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.clip.setWidth(0); 24828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2484635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FloatPoint absPos = localToAbsolute(); 2485635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project region.bounds.setX(absPos.x() + styleRegion.offset.left().value()); 2486635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project region.bounds.setY(absPos.y() + styleRegion.offset.top().value()); 24878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2488545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (frame()) { 2489545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch float pageScaleFactor = frame()->page()->chrome()->scaleFactor(); 24908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (pageScaleFactor != 1.0f) { 24918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.bounds.scale(pageScaleFactor); 24928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.clip.scale(pageScaleFactor); 24938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project regions.append(region); 24978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::collectDashboardRegions(Vector<DashboardRegionValue>& regions) 25018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // RenderTexts don't have their own style, they just use their parent's style, 25038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // so we don't want to include them. 25048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isText()) 25058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 25068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addDashboardRegions(regions); 25088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling()) 25098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr->collectDashboardRegions(regions); 25108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 25128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::willRenderImage(CachedImage*) 25148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Without visibility we won't render (and therefore don't care about animation). 25168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (style()->visibility() != VISIBLE) 25178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 25188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we're not in a window (i.e., we're dormant from being put in the b/f cache or in a background tab) 25208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // then we don't want to render either. 25218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return !document()->inPageCache() && !document()->view()->isOffscreen(); 25228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint RenderObject::maximalOutlineSize(PaintPhase p) const 25258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (p != PaintPhaseOutline && p != PaintPhaseSelfOutline && p != PaintPhaseChildOutlines) 25278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 25288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return toRenderView(document()->renderer())->maximalOutlineSize(); 25298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint RenderObject::caretMinOffset() const 25328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 25348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint RenderObject::caretMaxOffset() const 25378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isReplaced()) 25398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return node() ? max(1U, node()->childNodeCount()) : 1; 25408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isHR()) 25418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 1; 25428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 25438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned RenderObject::caretMaxRenderedOffset() const 25468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 25488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint RenderObject::previousOffset(int current) const 25518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return current - 1; 25538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianint RenderObject::previousOffsetForBackwardDeletion(int current) const 25568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 25578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return current - 1; 25588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 25598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint RenderObject::nextOffset(int current) const 25618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return current + 1; 25638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::adjustRectForOutlineAndShadow(IntRect& rect) const 25668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int outlineSize = outlineStyleForRepaint()->outlineSize(); 2568dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (const ShadowData* boxShadow = style()->boxShadow()) { 25695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen boxShadow->adjustRectForShadow(rect, outlineSize); 25705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return; 25715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 25728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen rect.inflate(outlineSize); 25748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectAnimationController* RenderObject::animation() const 25778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2578545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return frame()->animation(); 25798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2581635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid RenderObject::imageChanged(CachedImage* image, const IntRect* rect) 25828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2583635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project imageChanged(static_cast<WrappedImagePtr>(image), rect); 25848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianRenderBoxModelObject* RenderObject::offsetParent() const 25878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 25888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If any of the following holds true return null and stop this algorithm: 25898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // A is the root element. 25908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // A is the HTML body element. 25918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // The computed value of the position property for element A is fixed. 25928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (isRoot() || isBody() || (isPositioned() && style()->position() == FixedPosition)) 25938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return 0; 25948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If A is an area HTML element which has a map HTML element somewhere in the ancestor 25968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // chain return the nearest ancestor map HTML element and stop this algorithm. 25978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // FIXME: Implement! 25988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Return the nearest ancestor element of A for which at least one of the following is 26008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // true and stop this algorithm if such an ancestor is found: 26018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // * The computed value of the position property is not static. 26028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // * It is the HTML body element. 26038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // * The computed value of the position property of A is static and the ancestor 26048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // is one of the following HTML elements: td, th, or table. 26058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // * Our own extension: if there is a difference in the effective zoom 26068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool skipTables = isPositioned() || isRelPositioned(); 26078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian float currZoom = style()->effectiveZoom(); 26088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* curr = parent(); 26098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while (curr && (!curr->node() || 26108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian (!curr->isPositioned() && !curr->isRelPositioned() && !curr->isBody()))) { 26118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Node* element = curr->node(); 26128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!skipTables && element) { 26138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool isTableElement = element->hasTagName(tableTag) || 26148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian element->hasTagName(tdTag) || 26158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian element->hasTagName(thTag); 26168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if ENABLE(WML) 26188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!isTableElement && element->isWMLElement()) 26198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian isTableElement = element->hasTagName(WMLNames::tableTag) || 26208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian element->hasTagName(WMLNames::tdTag); 26218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 26228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (isTableElement) 26248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 26258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 26268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian float newZoom = curr->style()->effectiveZoom(); 26288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (currZoom != newZoom) 26298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 26308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian currZoom = newZoom; 26318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian curr = curr->parent(); 26328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 26338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return curr && curr->isBoxModelObject() ? toRenderBoxModelObject(curr) : 0; 26348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 26358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianVisiblePosition RenderObject::createVisiblePosition(int offset, EAffinity affinity) 26378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 2638643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If this is a non-anonymous renderer in an editable area, then it's simple. 2639643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (Node* node = this->node()) { 2640643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!node->isContentEditable()) { 2641643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If it can be found, we prefer a visually equivalent position that is editable. 2642643ca7872b450ea4efacab6188849e5aac2ba161Steve Block Position position(node, offset); 26434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Position candidate = position.downstream(CanCrossEditingBoundary); 2644643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (candidate.node()->isContentEditable()) 2645643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return VisiblePosition(candidate, affinity); 26464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang candidate = position.upstream(CanCrossEditingBoundary); 2647643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (candidate.node()->isContentEditable()) 2648643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return VisiblePosition(candidate, affinity); 2649643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 26508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return VisiblePosition(node, offset, affinity); 2651643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 26528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // We don't want to cross the boundary between editable and non-editable 26548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // regions of the document, but that is either impossible or at least 26558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // extremely unlikely in any normal case because we stop as soon as we 26568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // find a single non-anonymous renderer. 26578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Find a nearby non-anonymous renderer. 26598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* child = this; 26608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while (RenderObject* parent = child->parent()) { 26618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Find non-anonymous content after. 26628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* renderer = child; 26638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while ((renderer = renderer->nextInPreOrder(parent))) { 26648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (Node* node = renderer->node()) 26658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return VisiblePosition(node, 0, DOWNSTREAM); 26668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 26678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Find non-anonymous content before. 26698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian renderer = child; 26708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while ((renderer = renderer->previousInPreOrder())) { 26718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (renderer == parent) 26728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 26738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (Node* node = renderer->node()) 26745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return VisiblePosition(lastDeepEditingPositionForNode(node), DOWNSTREAM); 26758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 26768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Use the parent itself unless it too is anonymous. 26788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (Node* node = parent->node()) 26798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return VisiblePosition(node, 0, DOWNSTREAM); 26808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Repeat at the next level up. 26828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child = parent; 26838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 26848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Everything was anonymous. Give up. 26868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return VisiblePosition(); 26878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 26888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianVisiblePosition RenderObject::createVisiblePosition(const Position& position) 26908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 26918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (position.isNotNull()) 26928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return VisiblePosition(position); 26938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(!node()); 26958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return createVisiblePosition(0, DOWNSTREAM); 26968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 26978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG) 269921939df44de1705786c545cd1bf519d47250322dBen MurdochRenderSVGResourceContainer* RenderObject::toRenderSVGResourceContainer() 2700d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 2701d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT_NOT_REACHED(); 2702d0825bca7fe65beaee391d30da42e937db621564Steve Block return 0; 2703d0825bca7fe65beaee391d30da42e937db621564Steve Block} 27048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid RenderObject::setNeedsBoundariesUpdate() 27065ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 27075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (RenderObject* renderer = parent()) 27085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen renderer->setNeedsBoundariesUpdate(); 27095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 27105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 271121939df44de1705786c545cd1bf519d47250322dBen MurdochFloatRect RenderObject::objectBoundingBox() const 2712692e5dbf12901edacf14812a6fae25462920af42Steve Block{ 2713692e5dbf12901edacf14812a6fae25462920af42Steve Block ASSERT_NOT_REACHED(); 271421939df44de1705786c545cd1bf519d47250322dBen Murdoch return FloatRect(); 2715692e5dbf12901edacf14812a6fae25462920af42Steve Block} 2716692e5dbf12901edacf14812a6fae25462920af42Steve Block 271721939df44de1705786c545cd1bf519d47250322dBen MurdochFloatRect RenderObject::strokeBoundingBox() const 27188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 27195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ASSERT_NOT_REACHED(); 27205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return FloatRect(); 27215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 27225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 27235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// Returns the smallest rectangle enclosing all of the painted content 27245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// respecting clipping, masking, filters, opacity, stroke-width and markers 27255f1ab04193ad0130ca8204aadaceae083aca9881Feng QianFloatRect RenderObject::repaintRectInLocalCoordinates() const 27265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 27275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ASSERT_NOT_REACHED(); 27288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return FloatRect(); 27298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 27308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27318a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockAffineTransform RenderObject::localTransform() const 27328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 27338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block static const AffineTransform identity; 2734d0825bca7fe65beaee391d30da42e937db621564Steve Block return identity; 27358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 27368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27378a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockconst AffineTransform& RenderObject::localToParentTransform() const 27385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 27398a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block static const AffineTransform identity; 2740d0825bca7fe65beaee391d30da42e937db621564Steve Block return identity; 27415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 27425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 27435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool RenderObject::nodeAtFloatPoint(const HitTestRequest&, HitTestResult&, const FloatPoint&, HitTestAction) 27445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 27455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ASSERT_NOT_REACHED(); 27465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return false; 27475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 27485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 27498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(SVG) 27508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 27528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 27548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid showTree(const WebCore::RenderObject* ro) 27568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 27578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ro) 27588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ro->showTreeForThis(); 27598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 27608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2761643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid showRenderTree(const WebCore::RenderObject* object1) 2762643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 2763643ca7872b450ea4efacab6188849e5aac2ba161Steve Block showRenderTree(object1, 0); 2764643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 2765643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 2766643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid showRenderTree(const WebCore::RenderObject* object1, const WebCore::RenderObject* object2) 2767643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 2768643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (object1) { 2769643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const WebCore::RenderObject* root = object1; 2770643ca7872b450ea4efacab6188849e5aac2ba161Steve Block while (root->parent()) 2771643ca7872b450ea4efacab6188849e5aac2ba161Steve Block root = root->parent(); 2772643ca7872b450ea4efacab6188849e5aac2ba161Steve Block root->showRenderTreeAndMark(object1, "*", object2, "-", 0); 2773643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 2774643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 2775643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 27768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2777