RenderObject.cpp revision 65f03d4f644ce73618e5f4f50dd694b26f55ae12
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" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSStyleSelector.h" 3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "Chrome.h" 3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ContentData.h" 34ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include "DashArray.h" 354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "EditingBoundary.h" 36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "FloatQuad.h" 378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "Frame.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h" 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h" 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h" 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HitTestResult.h" 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h" 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderArena.h" 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderCounter.h" 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderFlexibleBox.h" 465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "RenderImage.h" 475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "RenderImageResourceStyleImage.h" 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderInline.h" 49545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "RenderLayer.h" 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderListItem.h" 51643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "RenderRuby.h" 52643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "RenderRubyText.h" 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderTableCell.h" 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderTableCol.h" 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderTableRow.h" 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderTheme.h" 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderView.h" 588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "TransformState.h" 59231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "htmlediting.h" 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <algorithm> 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_LAYOUT 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h" 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <stdio.h> 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/RefCountedLeakCounter.h> 668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include <wtf/UnusedParam.h> 678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if USE(ACCELERATED_COMPOSITING) 698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "RenderLayerCompositor.h" 708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML) 73635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WMLNames.h" 74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 76d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(SVG) 7721939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "RenderSVGResourceContainer.h" 78d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "SVGRenderSupport.h" 79d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 80d0825bca7fe65beaee391d30da42e937db621564Steve Block 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace std; 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames; 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void* baseOfRenderObjectBeingDeleted; 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::s_affectsParentBlock = false; 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid* RenderObject::operator new(size_t sz, RenderArena* renderArena) throw() 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return renderArena->allocate(sz); 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::operator delete(void* ptr, size_t sz) 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(baseOfRenderObjectBeingDeleted == ptr); 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Stash size where destroy can find it. 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *(size_t *)ptr = sz; 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::createObject(Node* node, RenderStyle* style) 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Document* doc = node->document(); 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderArena* arena = doc->renderArena(); 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Minimal support for content properties replacing an entire element. 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Works only if we have exactly one piece of content and it's a URL. 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Otherwise acts as if we didn't support this feature. 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ContentData* contentData = style->contentData(); 1158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (contentData && !contentData->next() && contentData->isImage() && doc != node) { 1165ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen RenderImage* image = new (arena) RenderImage(node); 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project image->setStyle(style); 1188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (StyleImage* styleImage = contentData->image()) 1195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen image->setImageResource(RenderImageResourceStyleImage::create(styleImage)); 1205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen else 1215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen image->setImageResource(RenderImageResource::create()); 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return image; 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 125643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (node->hasTagName(rubyTag)) { 126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (style->display() == INLINE) 127643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderRubyAsInline(node); 128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block else if (style->display() == BLOCK) 129643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderRubyAsBlock(node); 130643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 131643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // treat <rt> as ruby text ONLY if it still has its default treatment of block 132643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (node->hasTagName(rtTag) && style->display() == BLOCK) 133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return new (arena) RenderRubyText(node); 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (style->display()) { 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NONE: 137643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case INLINE: 139643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderInline(node); 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BLOCK: 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case INLINE_BLOCK: 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case RUN_IN: 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case COMPACT: 144643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderBlock(node); 145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case LIST_ITEM: 146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderListItem(node); 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE: 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case INLINE_TABLE: 149643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderTable(node); 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_ROW_GROUP: 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_HEADER_GROUP: 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_FOOTER_GROUP: 153643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderTableSection(node); 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_ROW: 155643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderTableRow(node); 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_COLUMN_GROUP: 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_COLUMN: 158643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderTableCol(node); 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_CELL: 160643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderTableCell(node); 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_CAPTION: 162231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS) 163231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // As per the section 17.1 of the spec WAP-239-WCSS-20011026-a.pdf, 164231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // the marquee box inherits and extends the characteristics of the 165231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // principal block box ([CSS2] section 9.2.1). 166231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block case WAP_MARQUEE: 167231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 168643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderBlock(node); 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BOX: 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case INLINE_BOX: 171643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderFlexibleBox(node); 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 174643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic WTF::RefCountedLeakCounter renderObjectCounter("RenderObject"); 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject::RenderObject(Node* node) 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : CachedResourceClient() 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_style(0) 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_node(node) 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_parent(0) 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_previous(0) 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_next(0) 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasAXObject(false) 190635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_setNeedsLayoutForbidden(false) 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_needsLayout(false) 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_needsPositionedMovementLayout(false) 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_normalChildNeedsLayout(false) 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_posChildNeedsLayout(false) 196bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen , m_preferredLogicalWidthsDirty(false) 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_floating(false) 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_positioned(false) 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_relPositioned(false) 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_paintBackground(false) 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_isAnonymous(node == node->document()) 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_isText(false) 203635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_isBox(false) 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_inline(true) 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_replaced(false) 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_isDragging(false) 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasLayer(false) 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasOverflowClip(false) 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasTransform(false) 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasReflection(false) 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasOverrideSize(false) 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasCounterNodeMap(false) 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_everHadLayout(false) 2148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian , m_childrenInline(false) 215bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen , m_marginBeforeQuirk(false) 216bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen , m_marginAfterQuirk(false) 2178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian , m_hasMarkupTruncation(false) 2188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian , m_selectionState(SelectionNone) 2198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian , m_hasColumns(false) 2208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian , m_cellWidthChanged(false) 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project renderObjectCounter.increment(); 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(node); 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject::~RenderObject() 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 230545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch ASSERT(!node() || documentBeingDestroyed() || !frame()->view() || frame()->view()->layoutRoot() != this); 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!m_hasAXObject); 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project renderObjectCounter.decrement(); 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochRenderTheme* RenderObject::theme() const 2380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 2390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(document()->page()); 2400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return document()->page()->theme(); 2420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 2430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::isDescendantOf(const RenderObject* obj) const 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (const RenderObject* r = this; r; r = r->m_parent) { 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (r == obj) 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::isBody() const 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return node() && node()->hasTagName(bodyTag); 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::isHR() const 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return node() && node()->hasTagName(hrTag); 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerbool RenderObject::isLegend() const 2646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 2656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return node() && (node()->hasTagName(legendTag) 2666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#if ENABLE(WML) 2676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner || node()->hasTagName(WMLNames::insertedLegendTag) 2686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#endif 2696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner ); 2706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 2716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::isHTMLMarquee() const 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return node() && node()->renderer() == this && node()->hasTagName(marqueeTag); 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::addChild(RenderObject* newChild, RenderObject* beforeChild) 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObjectChildList* children = virtualChildren(); 2808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(children); 2818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!children) 2828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool needsTable = false; 2858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 286dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (newChild->isTableCol() && newChild->style()->display() == TABLE_COLUMN_GROUP) 2878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian needsTable = !isTable(); 2888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if (newChild->isRenderBlock() && newChild->style()->display() == TABLE_CAPTION) 2898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian needsTable = !isTable(); 2908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if (newChild->isTableSection()) 2918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian needsTable = !isTable(); 2928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if (newChild->isTableRow()) 2938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian needsTable = !isTableSection(); 2948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if (newChild->isTableCell()) { 2958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian needsTable = !isTableRow(); 2968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // I'm not 100% sure this is the best way to fix this, but without this 2978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // change we recurse infinitely when trying to render the CSS2 test page: 2988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // http://www.bath.ac.uk/%7Epy8ieh/internet/eviltests/htmlbodyheadrendering2.html. 2998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // See Radar 2925291. 3008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (needsTable && isTableCell() && !children->firstChild() && !newChild->isTableCell()) 3018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian needsTable = false; 3028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (needsTable) { 3058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderTable* table; 3068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* afterChild = beforeChild ? beforeChild->previousSibling() : children->lastChild(); 3078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (afterChild && afterChild->isAnonymous() && afterChild->isTable()) 3080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch table = toRenderTable(afterChild); 3098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else { 3108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian table = new (renderArena()) RenderTable(document() /* is anonymous */); 3118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RefPtr<RenderStyle> newStyle = RenderStyle::create(); 3128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian newStyle->inheritFrom(style()); 3138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian newStyle->setDisplay(TABLE); 3148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian table->setStyle(newStyle.release()); 3158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian addChild(table, beforeChild); 3168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian table->addChild(newChild); 3188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } else { 3198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Just add it... 3208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian children->insertChildNode(this, newChild, beforeChild); 3218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 322cad810f21b803229eb11403f9209855525a25d57Steve Block RenderCounter::rendererSubtreeAttached(newChild); 3238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (newChild->isText() && newChild->style()->textTransform() == CAPITALIZE) { 3248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RefPtr<StringImpl> textToTransform = toRenderText(newChild)->originalText(); 3258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (textToTransform) 3268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderText(newChild)->setText(textToTransform.release(), true); 3278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::removeChild(RenderObject* oldChild) 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObjectChildList* children = virtualChildren(); 3338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(children); 3348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!children) 3358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // We do this here instead of in removeChildNode, since the only extremely low-level uses of remove/appendChildNode 3388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // cannot affect the positioned object list, and the floating object list is irrelevant (since the list gets cleared on 3398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // layout anyway). 3408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (oldChild->isFloatingOrPositioned()) 3418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderBox(oldChild)->removeFloatingOrPositionedChildFromBlockLists(); 3428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian children->removeChildNode(this, oldChild); 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::nextInPreOrder() const 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (RenderObject* o = firstChild()) 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o; 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nextInPreOrderAfterChildren(); 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::nextInPreOrderAfterChildren() const 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* o; 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!(o = nextSibling())) { 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = parent(); 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (o && !o->nextSibling()) 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->parent(); 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (o) 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->nextSibling(); 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o; 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::nextInPreOrder(RenderObject* stayWithin) const 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (RenderObject* o = firstChild()) 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o; 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nextInPreOrderAfterChildren(stayWithin); 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::nextInPreOrderAfterChildren(RenderObject* stayWithin) const 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (this == stayWithin) 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 381d0825bca7fe65beaee391d30da42e937db621564Steve Block const RenderObject* current = this; 382d0825bca7fe65beaee391d30da42e937db621564Steve Block RenderObject* next; 383d0825bca7fe65beaee391d30da42e937db621564Steve Block while (!(next = current->nextSibling())) { 384d0825bca7fe65beaee391d30da42e937db621564Steve Block current = current->parent(); 385d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!current || current == stayWithin) 386d0825bca7fe65beaee391d30da42e937db621564Steve Block return 0; 3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 388d0825bca7fe65beaee391d30da42e937db621564Steve Block return next; 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::previousInPreOrder() const 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (RenderObject* o = previousSibling()) { 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (o->lastChild()) 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->lastChild(); 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o; 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return parent(); 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::childAt(unsigned index) const 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* child = firstChild(); 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned i = 0; child && i < index; i++) 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project child = child->nextSibling(); 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return child; 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::firstLeafChild() const 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* r = firstChild(); 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (r) { 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* n = 0; 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project n = r->firstChild(); 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!n) 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project r = n; 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return r; 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::lastLeafChild() const 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* r = lastChild(); 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (r) { 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* n = 0; 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project n = r->lastChild(); 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!n) 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project r = n; 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return r; 4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void addLayers(RenderObject* obj, RenderLayer* parentLayer, RenderObject*& newObject, 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderLayer*& beforeChild) 4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (obj->hasLayer()) { 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!beforeChild && newObject) { 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We need to figure out the layer that follows newObject. We only do 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // this the first time we find a child layer, and then we update the 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // pointer values for newObject and beforeChild used by everyone else. 4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project beforeChild = newObject->parent()->findNextLayer(parentLayer, newObject); 4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newObject = 0; 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian parentLayer->addChild(toRenderBoxModelObject(obj)->layer(), beforeChild); 4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RenderObject* curr = obj->firstChild(); curr; curr = curr->nextSibling()) 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addLayers(curr, parentLayer, newObject, beforeChild); 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::addLayers(RenderLayer* parentLayer, RenderObject* newObject) 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!parentLayer) 4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* object = newObject; 4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderLayer* beforeChild = 0; 4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCore::addLayers(this, parentLayer, object, beforeChild); 4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::removeLayers(RenderLayer* parentLayer) 4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!parentLayer) 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hasLayer()) { 4718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian parentLayer->removeChild(toRenderBoxModelObject(this)->layer()); 4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling()) 4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr->removeLayers(parentLayer); 4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::moveLayers(RenderLayer* oldParent, RenderLayer* newParent) 4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!newParent) 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hasLayer()) { 4858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderLayer* layer = toRenderBoxModelObject(this)->layer(); 4865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ASSERT(oldParent == layer->parent()); 4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (oldParent) 488635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project oldParent->removeChild(layer); 489635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project newParent->addChild(layer); 4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling()) 4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr->moveLayers(oldParent, newParent); 4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderLayer* RenderObject::findNextLayer(RenderLayer* parentLayer, RenderObject* startPoint, 4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool checkParent) 4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Error check the parent layer passed in. If it's null, we can't find anything. 5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!parentLayer) 5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Step 1: If our layer is a child of the desired parent, then return our layer. 5058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderLayer* ourLayer = hasLayer() ? toRenderBoxModelObject(this)->layer() : 0; 5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ourLayer && ourLayer->parent() == parentLayer) 5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ourLayer; 5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Step 2: If we don't have a layer, or our layer is the desired parent, then descend 5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // into our siblings trying to find the next layer whose parent is the desired parent. 5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!ourLayer || ourLayer == parentLayer) { 5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RenderObject* curr = startPoint ? startPoint->nextSibling() : firstChild(); 5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr; curr = curr->nextSibling()) { 5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderLayer* nextLayer = curr->findNextLayer(parentLayer, 0, false); 5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (nextLayer) 5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nextLayer; 5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Step 3: If our layer is the desired parent layer, then we're finished. We didn't 5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // find anything. 5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (parentLayer == ourLayer) 5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Step 4: If |checkParent| is set, climb up to our parent and check its siblings that 5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // follow us to see if we can locate a layer. 5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (checkParent && parent()) 5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return parent()->findNextLayer(parentLayer, this, true); 5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderLayer* RenderObject::enclosingLayer() const 5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const RenderObject* curr = this; 5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (curr) { 5378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderLayer* layer = curr->hasLayer() ? toRenderBoxModelObject(curr)->layer() : 0; 5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (layer) 5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return layer; 5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr = curr->parent(); 5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 545635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectRenderBox* RenderObject::enclosingBox() const 5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 547635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project RenderObject* curr = const_cast<RenderObject*>(this); 548635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project while (curr) { 549635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (curr->isBox()) 550635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return toRenderBox(curr); 5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr = curr->parent(); 5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 554635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT_NOT_REACHED(); 555635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return 0; 5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 558e458d70a0d18538346f41b503114c9ebe6b2ce12Leon ClarkeRenderBoxModelObject* RenderObject::enclosingBoxModelObject() const 559e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{ 560e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke RenderObject* curr = const_cast<RenderObject*>(this); 561e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke while (curr) { 562e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (curr->isBoxModelObject()) 563e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return toRenderBoxModelObject(curr); 564e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke curr = curr->parent(); 565e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke } 566e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 567e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke ASSERT_NOT_REACHED(); 568e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return 0; 569e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke} 570e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 571635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectRenderBlock* RenderObject::firstLineBlock() const 5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 573635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return 0; 5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 576bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid RenderObject::setPreferredLogicalWidthsDirty(bool b, bool markParents) 5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 578bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen bool alreadyDirty = m_preferredLogicalWidthsDirty; 579bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_preferredLogicalWidthsDirty = b; 5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (b && !alreadyDirty && markParents && (isText() || (style()->position() != FixedPosition && style()->position() != AbsolutePosition))) 581bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen invalidateContainerPreferredLogicalWidths(); 5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 584bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid RenderObject::invalidateContainerPreferredLogicalWidths() 5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // In order to avoid pathological behavior when inlines are deeply nested, we do include them 5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // in the chain that we mark dirty (even though they're kind of irrelevant). 5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* o = isTableCell() ? containingBlock() : container(); 589bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen while (o && !o->m_preferredLogicalWidthsDirty) { 5908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Don't invalidate the outermost object of an unrooted subtree. That object will be 5918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // invalidated when the subtree is added to the document. 5928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* container = o->isTableCell() ? o->containingBlock() : o->container(); 5938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!container && !o->isRenderView()) 5948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 5958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 596bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen o->m_preferredLogicalWidthsDirty = true; 5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (o->style()->position() == FixedPosition || o->style()->position() == AbsolutePosition) 5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // A positioned object has no effect on the min/max width of its containing block ever. 5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We can optimize this case and not go up any further. 6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 6018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian o = container; 6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::setLayerNeedsFullRepaint() 6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(hasLayer()); 6088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderBoxModelObject(this)->layer()->setNeedsFullRepaint(true); 6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderBlock* RenderObject::containingBlock() const 6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isTableCell()) { 6140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch const RenderTableCell* cell = toRenderTableCell(this); 6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (parent() && cell->section()) 6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return cell->table(); 6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isRenderView()) 6218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return const_cast<RenderView*>(toRenderView(this)); 6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* o = parent(); 6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!isText() && m_style->position() == FixedPosition) { 6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (o && !o->isRenderView() && !(o->hasTransform() && o->isRenderBlock())) 6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->parent(); 6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (!isText() && m_style->position() == AbsolutePosition) { 6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (o && (o->style()->position() == StaticPosition || (o->isInline() && !o->isReplaced())) && !o->isRenderView() && !(o->hasTransform() && o->isRenderBlock())) { 6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For relpositioned inlines, we return the nearest enclosing block. We don't try 6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // to return the inline itself. This allows us to avoid having a positioned objects 6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // list in all RenderInlines and lets us return a strongly-typed RenderBlock* result 6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // from this method. The container() method can actually be used to obtain the 6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // inline directly. 6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (o->style()->position() == RelativePosition && o->isInline() && !o->isReplaced()) 6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o->containingBlock(); 636231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(SVG) 637231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (o->isSVGForeignObject()) //foreignObject is the containing block for contents inside it 638231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block break; 639231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 640231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->parent(); 6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (o && ((o->isInline() && !o->isReplaced()) || o->isTableRow() || o->isTableSection() 6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project || o->isTableCol() || o->isFrameSet() || o->isMedia() 6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG) 6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project || o->isSVGContainer() || o->isSVGRoot() 6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project )) 6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->parent(); 6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!o || !o->isRenderBlock()) 654643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; // This can still happen in case of an orphaned tree 6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return toRenderBlock(o); 6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool mustRepaintFillLayers(const RenderObject* renderer, const FillLayer* layer) 6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Nobody will use multiple layers without wanting fancy positioning. 6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (layer->next()) 6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Make sure we have a valid image. 6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project StyleImage* img = layer->image(); 6670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!img || !img->canRender(renderer->style()->effectiveZoom())) 6680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return false; 6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!layer->xPosition().isZero() || !layer->yPosition().isZero()) 6710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return true; 6720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 673231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (layer->size().type == SizeLength) { 674231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (layer->size().size.width().isPercent() || layer->size().size.height().isPercent()) 6750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return true; 676231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } else if (layer->size().type == Contain || layer->size().type == Cover || img->usesImageContainerSize()) 6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::mustRepaintBackgroundOrBorder() const 6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hasMask() && mustRepaintFillLayers(this, style()->maskLayers())) 6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we don't have a background/border/mask, then nothing to do. 6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!hasBoxDecorations()) 6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (mustRepaintFillLayers(this, style()->backgroundLayers())) 6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Our fill layers are ok. Let's check border. 6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (style()->hasBorder()) { 6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Border images are not ok. 6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project StyleImage* borderImage = style()->borderImage().image(); 6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool shouldPaintBorderImage = borderImage && borderImage->canRender(style()->effectiveZoom()); 6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the image hasn't loaded, we're still using the normal border style. 7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (shouldPaintBorderImage && borderImage->isLoaded()) 7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::drawLineForBoxSide(GraphicsContext* graphicsContext, int x1, int y1, int x2, int y2, 709dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block BoxSide s, Color c, EBorderStyle style, 7108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int adjbw1, int adjbw2) 7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int width = (s == BSTop || s == BSBottom ? y2 - y1 : x2 - x1); 7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (style == DOUBLE && width < 3) 7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project style = SOLID; 7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (style) { 7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BNONE: 7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BHIDDEN: 7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DOTTED: 7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DASHED: 723643ca7872b450ea4efacab6188849e5aac2ba161Steve Block graphicsContext->setStrokeColor(c, m_style->colorSpace()); 7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->setStrokeThickness(width); 7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->setStrokeStyle(style == DASHED ? DashedStroke : DottedStroke); 7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (width > 0) 7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (s) { 7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSBottom: 7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSTop: 7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawLine(IntPoint(x1, (y1 + y2) / 2), IntPoint(x2, (y1 + y2) / 2)); 7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSRight: 7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSLeft: 7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawLine(IntPoint((x1 + x2) / 2, y1), IntPoint((x1 + x2) / 2, y2)); 7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DOUBLE: { 7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int third = (width + 1) / 3; 7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (adjbw1 == 0 && adjbw2 == 0) { 7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->setStrokeStyle(NoStroke); 744643ca7872b450ea4efacab6188849e5aac2ba161Steve Block graphicsContext->setFillColor(c, m_style->colorSpace()); 7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (s) { 7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSTop: 7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSBottom: 7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x1, y1, x2 - x1, third)); 7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x1, y2 - third, x2 - x1, third)); 7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSLeft: 7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x1, y1 + 1, third, y2 - y1 - 1)); 7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x2 - third, y1 + 1, third, y2 - y1 - 1)); 7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSRight: 7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x1, y1 + 1, third, y2 - y1 - 1)); 7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x2 - third, y1 + 1, third, y2 - y1 - 1)); 7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int adjbw1bigthird = ((adjbw1 > 0) ? adjbw1 + 1 : adjbw1 - 1) / 3; 7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int adjbw2bigthird = ((adjbw2 > 0) ? adjbw2 + 1 : adjbw2 - 1) / 3; 7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (s) { 7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSTop: 7668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1 + max((-adjbw1 * 2 + 1) / 3, 0), 7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project y1, x2 - max((-adjbw2 * 2 + 1) / 3, 0), y1 + third, 768dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, SOLID, adjbw1bigthird, adjbw2bigthird); 7698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1 + max((adjbw1 * 2 + 1) / 3, 0), 7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project y2 - third, x2 - max((adjbw2 * 2 + 1) / 3, 0), y2, 771dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, SOLID, adjbw1bigthird, adjbw2bigthird); 7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSLeft: 7748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1, y1 + max((-adjbw1 * 2 + 1) / 3, 0), 7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project x1 + third, y2 - max((-adjbw2 * 2 + 1) / 3, 0), 776dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, SOLID, adjbw1bigthird, adjbw2bigthird); 7778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x2 - third, y1 + max((adjbw1 * 2 + 1) / 3, 0), 7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project x2, y2 - max((adjbw2 * 2 + 1) / 3, 0), 779dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, SOLID, adjbw1bigthird, adjbw2bigthird); 7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSBottom: 7828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1 + max((adjbw1 * 2 + 1) / 3, 0), 7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project y1, x2 - max((adjbw2 * 2 + 1) / 3, 0), y1 + third, 784dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, SOLID, adjbw1bigthird, adjbw2bigthird); 7858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1 + max((-adjbw1 * 2 + 1) / 3, 0), 7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project y2 - third, x2 - max((-adjbw2 * 2 + 1) / 3, 0), y2, 787dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, SOLID, adjbw1bigthird, adjbw2bigthird); 7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSRight: 7908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1, y1 + max((adjbw1 * 2 + 1) / 3, 0), 7910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch x1 + third, y2 - max((adjbw2 * 2 + 1) / 3, 0), 792dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, SOLID, adjbw1bigthird, adjbw2bigthird); 7938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x2 - third, y1 + max((-adjbw1 * 2 + 1) / 3, 0), 7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project x2, y2 - max((-adjbw2 * 2 + 1) / 3, 0), 795dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, SOLID, adjbw1bigthird, adjbw2bigthird); 7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case RIDGE: 8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case GROOVE: 8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EBorderStyle s1; 8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EBorderStyle s2; 8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (style == GROOVE) { 8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s1 = INSET; 8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s2 = OUTSET; 8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s1 = OUTSET; 8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s2 = INSET; 8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int adjbw1bighalf = ((adjbw1 > 0) ? adjbw1 + 1 : adjbw1 - 1) / 2; 8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int adjbw2bighalf = ((adjbw2 > 0) ? adjbw2 + 1 : adjbw2 - 1) / 2; 8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (s) { 8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSTop: 8218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1 + max(-adjbw1, 0) / 2, y1, x2 - max(-adjbw2, 0) / 2, (y1 + y2 + 1) / 2, 822dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, s1, adjbw1bighalf, adjbw2bighalf); 8238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1 + max(adjbw1 + 1, 0) / 2, (y1 + y2 + 1) / 2, x2 - max(adjbw2 + 1, 0) / 2, y2, 824dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, s2, adjbw1 / 2, adjbw2 / 2); 8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSLeft: 8278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1, y1 + max(-adjbw1, 0) / 2, (x1 + x2 + 1) / 2, y2 - max(-adjbw2, 0) / 2, 828dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, s1, adjbw1bighalf, adjbw2bighalf); 8298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, (x1 + x2 + 1) / 2, y1 + max(adjbw1 + 1, 0) / 2, x2, y2 - max(adjbw2 + 1, 0) / 2, 830dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, s2, adjbw1 / 2, adjbw2 / 2); 8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSBottom: 8338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1 + max(adjbw1, 0) / 2, y1, x2 - max(adjbw2, 0) / 2, (y1 + y2 + 1) / 2, 834dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, s2, adjbw1bighalf, adjbw2bighalf); 8358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1 + max(-adjbw1 + 1, 0) / 2, (y1 + y2 + 1) / 2, x2 - max(-adjbw2 + 1, 0) / 2, y2, 836dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, s1, adjbw1 / 2, adjbw2 / 2); 8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSRight: 8398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, x1, y1 + max(adjbw1, 0) / 2, (x1 + x2 + 1) / 2, y2 - max(adjbw2, 0) / 2, 840dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, s2, adjbw1bighalf, adjbw2bighalf); 8418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian drawLineForBoxSide(graphicsContext, (x1 + x2 + 1) / 2, y1 + max(-adjbw1 + 1, 0) / 2, x2, y2 - max(-adjbw2 + 1, 0) / 2, 842dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block s, c, s1, adjbw1 / 2, adjbw2 / 2); 8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case INSET: 8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (s == BSTop || s == BSLeft) 8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project c = c.dark(); 8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // fall through 8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case OUTSET: 8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (style == OUTSET && (s == BSBottom || s == BSRight)) 8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project c = c.dark(); 8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // fall through 8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case SOLID: { 8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->setStrokeStyle(NoStroke); 857643ca7872b450ea4efacab6188849e5aac2ba161Steve Block graphicsContext->setFillColor(c, m_style->colorSpace()); 8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(x2 >= x1); 8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(y2 >= y1); 8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!adjbw1 && !adjbw2) { 8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x1, y1, x2 - x1, y2 - y1)); 8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FloatPoint quad[4]; 8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (s) { 8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSTop: 8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[0] = FloatPoint(x1 + max(-adjbw1, 0), y1); 8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[1] = FloatPoint(x1 + max(adjbw1, 0), y2); 8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[2] = FloatPoint(x2 - max(adjbw2, 0), y2); 8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[3] = FloatPoint(x2 - max(-adjbw2, 0), y1); 8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSBottom: 8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[0] = FloatPoint(x1 + max(adjbw1, 0), y1); 8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[1] = FloatPoint(x1 + max(-adjbw1, 0), y2); 8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[2] = FloatPoint(x2 - max(-adjbw2, 0), y2); 8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[3] = FloatPoint(x2 - max(adjbw2, 0), y1); 8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSLeft: 8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[0] = FloatPoint(x1, y1 + max(-adjbw1, 0)); 8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[1] = FloatPoint(x1, y2 - max(-adjbw2, 0)); 8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[2] = FloatPoint(x2, y2 - max(adjbw2, 0)); 8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[3] = FloatPoint(x2, y1 + max(adjbw1, 0)); 8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSRight: 8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[0] = FloatPoint(x1, y1 + max(adjbw1, 0)); 8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[1] = FloatPoint(x1, y2 - max(adjbw2, 0)); 8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[2] = FloatPoint(x2, y2 - max(-adjbw2, 0)); 8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project quad[3] = FloatPoint(x2, y1 + max(-adjbw1, 0)); 8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawConvexPolygon(4, quad); 8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 897ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve BlockIntRect RenderObject::borderInnerRect(const IntRect& borderRect, unsigned short topWidth, unsigned short bottomWidth, unsigned short leftWidth, unsigned short rightWidth) const 898ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{ 899ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return IntRect( 900ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block borderRect.x() + leftWidth, 901ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block borderRect.y() + topWidth, 902ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block borderRect.width() - leftWidth - rightWidth, 903ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block borderRect.height() - topWidth - bottomWidth); 904ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block} 905ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 906ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#if HAVE(PATH_BASED_BORDER_RADIUS_DRAWING) 907ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockvoid RenderObject::drawBoxSideFromPath(GraphicsContext* graphicsContext, IntRect borderRect, Path borderPath, 908ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block float thickness, float drawThickness, BoxSide s, const RenderStyle* style, 909ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block Color c, EBorderStyle borderStyle) 910ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{ 911ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (thickness <= 0) 912ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return; 913ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 914ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (borderStyle == DOUBLE && thickness < 3) 915ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block borderStyle = SOLID; 916ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 917ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block switch (borderStyle) { 918ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block case BNONE: 919ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block case BHIDDEN: 920ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return; 921ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block case DOTTED: 922ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block case DASHED: { 923ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->setStrokeColor(c, style->colorSpace()); 924ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 925ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // The stroke is doubled here because the provided path is the 926ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // outside edge of the border so half the stroke is clipped off. 927ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // The extra multiplier is so that the clipping mask can antialias 928ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // the edges to prevent jaggies. 929ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->setStrokeThickness(drawThickness * 2 * 1.1f); 930ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->setStrokeStyle(borderStyle == DASHED ? DashedStroke : DottedStroke); 931ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 932ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // If the number of dashes that fit in the path is odd and non-integral then we 933ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // will have an awkwardly-sized dash at the end of the path. To try to avoid that 934ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // here, we simply make the whitespace dashes ever so slightly bigger. 935ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // FIXME: This could be even better if we tried to manipulate the dash offset 936ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // and possibly the whiteSpaceWidth to get the corners dash-symmetrical. 937ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block float patWidth = thickness * ((borderStyle == DASHED) ? 3.0f : 1.0f); 938ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block float whiteSpaceWidth = patWidth; 939ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block float numberOfDashes = borderPath.length() / patWidth; 940ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block bool evenNumberOfFullDashes = !((int)numberOfDashes % 2); 941ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block bool integralNumberOfDashes = !(numberOfDashes - (int)numberOfDashes); 942ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (!evenNumberOfFullDashes && !integralNumberOfDashes) { 943ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block float numberOfWhitespaceDashes = numberOfDashes / 2; 944ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block whiteSpaceWidth += (patWidth / numberOfWhitespaceDashes); 945ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block } 946ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 947967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch DashArray lineDash; 948967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch lineDash.append(patWidth); 949967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch lineDash.append(whiteSpaceWidth); 950967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch graphicsContext->setLineDash(lineDash, patWidth); 951f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch graphicsContext->strokePath(borderPath); 952ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return; 953ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block } 954ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block case DOUBLE: { 955ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block int outerBorderTopWidth = style->borderTopWidth() / 3; 956ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block int outerBorderRightWidth = style->borderRightWidth() / 3; 957ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block int outerBorderBottomWidth = style->borderBottomWidth() / 3; 958ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block int outerBorderLeftWidth = style->borderLeftWidth() / 3; 959ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 960ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block int innerBorderTopWidth = style->borderTopWidth() * 2 / 3; 961ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block int innerBorderRightWidth = style->borderRightWidth() * 2 / 3; 962ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block int innerBorderBottomWidth = style->borderBottomWidth() * 2 / 3; 963ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block int innerBorderLeftWidth = style->borderLeftWidth() * 2 / 3; 964ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 965ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // We need certain integer rounding results 966ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (style->borderTopWidth() % 3 == 2) 967ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block outerBorderTopWidth += 1; 968ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (style->borderRightWidth() % 3 == 2) 969ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block outerBorderRightWidth += 1; 970ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (style->borderBottomWidth() % 3 == 2) 971ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block outerBorderBottomWidth += 1; 972ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (style->borderLeftWidth() % 3 == 2) 973ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block outerBorderLeftWidth += 1; 974ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 975ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (style->borderTopWidth() % 3 == 1) 976ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block innerBorderTopWidth += 1; 977ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (style->borderRightWidth() % 3 == 1) 978ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block innerBorderRightWidth += 1; 979ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (style->borderBottomWidth() % 3 == 1) 980ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block innerBorderBottomWidth += 1; 981ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (style->borderLeftWidth() % 3 == 1) 982ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block innerBorderLeftWidth += 1; 983ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 984ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // Get the inner border rects for both the outer border line and the inner border line 985ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block IntRect outerBorderInnerRect = borderInnerRect(borderRect, outerBorderTopWidth, outerBorderBottomWidth, 986ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block outerBorderLeftWidth, outerBorderRightWidth); 987ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block IntRect innerBorderInnerRect = borderInnerRect(borderRect, innerBorderTopWidth, innerBorderBottomWidth, 988ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block innerBorderLeftWidth, innerBorderRightWidth); 989ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 990ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // Get the inner radii for the outer border line 991ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block IntSize outerBorderTopLeftInnerRadius, outerBorderTopRightInnerRadius, outerBorderBottomLeftInnerRadius, 992ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block outerBorderBottomRightInnerRadius; 993ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block style->getInnerBorderRadiiForRectWithBorderWidths(outerBorderInnerRect, outerBorderTopWidth, outerBorderBottomWidth, 994ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block outerBorderLeftWidth, outerBorderRightWidth, outerBorderTopLeftInnerRadius, outerBorderTopRightInnerRadius, 995ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block outerBorderBottomLeftInnerRadius, outerBorderBottomRightInnerRadius); 996ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 997ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // Get the inner radii for the inner border line 998ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block IntSize innerBorderTopLeftInnerRadius, innerBorderTopRightInnerRadius, innerBorderBottomLeftInnerRadius, 999ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block innerBorderBottomRightInnerRadius; 1000ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block style->getInnerBorderRadiiForRectWithBorderWidths(innerBorderInnerRect, innerBorderTopWidth, innerBorderBottomWidth, 1001ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block innerBorderLeftWidth, innerBorderRightWidth, innerBorderTopLeftInnerRadius, innerBorderTopRightInnerRadius, 1002ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block innerBorderBottomLeftInnerRadius, innerBorderBottomRightInnerRadius); 1003ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1004ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // Draw inner border line 1005ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->save(); 1006ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->addRoundedRectClip(innerBorderInnerRect, innerBorderTopLeftInnerRadius, 1007ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block innerBorderTopRightInnerRadius, innerBorderBottomLeftInnerRadius, innerBorderBottomRightInnerRadius); 1008ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block drawBoxSideFromPath(graphicsContext, borderRect, borderPath, thickness, drawThickness, s, style, c, SOLID); 1009ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->restore(); 1010ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1011ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // Draw outer border line 1012ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->save(); 1013ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->clipOutRoundedRect(outerBorderInnerRect, outerBorderTopLeftInnerRadius, 1014ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block outerBorderTopRightInnerRadius, outerBorderBottomLeftInnerRadius, outerBorderBottomRightInnerRadius); 1015ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block drawBoxSideFromPath(graphicsContext, borderRect, borderPath, thickness, drawThickness, s, style, c, SOLID); 1016ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->restore(); 1017ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1018ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return; 1019ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block } 1020ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block case RIDGE: 1021ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block case GROOVE: 1022ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block { 1023ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block EBorderStyle s1; 1024ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block EBorderStyle s2; 1025ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (borderStyle == GROOVE) { 1026ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block s1 = INSET; 1027ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block s2 = OUTSET; 1028ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block } else { 1029ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block s1 = OUTSET; 1030ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block s2 = INSET; 1031ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block } 1032ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1033ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block IntRect halfBorderRect = borderInnerRect(borderRect, style->borderLeftWidth() / 2, style->borderBottomWidth() / 2, 1034ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block style->borderLeftWidth() / 2, style->borderRightWidth() / 2); 1035ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1036ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block IntSize topLeftHalfRadius, topRightHalfRadius, bottomLeftHalfRadius, bottomRightHalfRadius; 1037ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block style->getInnerBorderRadiiForRectWithBorderWidths(halfBorderRect, style->borderLeftWidth() / 2, 1038ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block style->borderBottomWidth() / 2, style->borderLeftWidth() / 2, style->borderRightWidth() / 2, 1039ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block topLeftHalfRadius, topRightHalfRadius, bottomLeftHalfRadius, bottomRightHalfRadius); 1040ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1041ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // Paint full border 1042ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block drawBoxSideFromPath(graphicsContext, borderRect, borderPath, thickness, drawThickness, s, style, c, s1); 1043ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1044ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // Paint inner only 1045ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->save(); 1046ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->addRoundedRectClip(halfBorderRect, topLeftHalfRadius, topRightHalfRadius, 1047ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block bottomLeftHalfRadius, bottomRightHalfRadius); 1048ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block drawBoxSideFromPath(graphicsContext, borderRect, borderPath, thickness, drawThickness, s, style, c, s2); 1049ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->restore(); 1050ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1051ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return; 1052ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block } 1053ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block case INSET: 1054ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (s == BSTop || s == BSLeft) 1055ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block c = c.dark(); 1056ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block break; 1057ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block case OUTSET: 1058ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (s == BSBottom || s == BSRight) 1059ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block c = c.dark(); 1060ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block break; 1061ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block default: 1062ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block break; 1063ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block } 1064ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1065ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->setStrokeStyle(NoStroke); 1066ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->setFillColor(c, style->colorSpace()); 1067ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block graphicsContext->drawRect(borderRect); 1068ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block} 1069ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#else 10708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::drawArcForBoxSide(GraphicsContext* graphicsContext, int x, int y, float thickness, IntSize radius, 1071dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int angleStart, int angleSpan, BoxSide s, Color c, 10728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian EBorderStyle style, bool firstCorner) 10738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1074ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // FIXME: This function should be removed when all ports implement GraphicsContext::clipConvexPolygon()!! 1075ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // At that time, everyone can use RenderObject::drawBoxSideFromPath() instead. This should happen soon. 10768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if ((style == DOUBLE && thickness / 2 < 3) || ((style == RIDGE || style == GROOVE) && thickness / 2 < 2)) 10778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian style = SOLID; 10788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian switch (style) { 10808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case BNONE: 10818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case BHIDDEN: 10828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 10838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case DOTTED: 10848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case DASHED: 1085643ca7872b450ea4efacab6188849e5aac2ba161Steve Block graphicsContext->setStrokeColor(c, m_style->colorSpace()); 10868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeStyle(style == DOTTED ? DottedStroke : DashedStroke); 10878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeThickness(thickness); 10888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->strokeArc(IntRect(x, y, radius.width() * 2, radius.height() * 2), angleStart, angleSpan); 10898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 10908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case DOUBLE: { 10918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian float third = thickness / 3.0f; 10928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian float innerThird = (thickness + 1.0f) / 6.0f; 10938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int shiftForInner = static_cast<int>(innerThird * 2.5f); 10948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int outerY = y; 10968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int outerHeight = radius.height() * 2; 10978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int innerX = x + shiftForInner; 10988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int innerY = y + shiftForInner; 10998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int innerWidth = (radius.width() - shiftForInner) * 2; 11008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int innerHeight = (radius.height() - shiftForInner) * 2; 11018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (innerThird > 1 && (s == BSTop || (firstCorner && (s == BSLeft || s == BSRight)))) { 11028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian outerHeight += 2; 11038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian innerHeight += 2; 11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeStyle(SolidStroke); 1107643ca7872b450ea4efacab6188849e5aac2ba161Steve Block graphicsContext->setStrokeColor(c, m_style->colorSpace()); 11088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeThickness(third); 11098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->strokeArc(IntRect(x, outerY, radius.width() * 2, outerHeight), angleStart, angleSpan); 11108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeThickness(innerThird > 2 ? innerThird - 1 : innerThird); 11118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->strokeArc(IntRect(innerX, innerY, innerWidth, innerHeight), angleStart, angleSpan); 11128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 11138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case GROOVE: 11158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case RIDGE: { 11168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Color c2; 11178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if ((style == RIDGE && (s == BSTop || s == BSLeft)) || 11188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian (style == GROOVE && (s == BSBottom || s == BSRight))) 11198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian c2 = c.dark(); 11208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else { 11218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian c2 = c; 11228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian c = c.dark(); 11238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeStyle(SolidStroke); 1126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block graphicsContext->setStrokeColor(c, m_style->colorSpace()); 11278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeThickness(thickness); 11288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->strokeArc(IntRect(x, y, radius.width() * 2, radius.height() * 2), angleStart, angleSpan); 11298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian float halfThickness = (thickness + 1.0f) / 4.0f; 11318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int shiftForInner = static_cast<int>(halfThickness * 1.5f); 1132643ca7872b450ea4efacab6188849e5aac2ba161Steve Block graphicsContext->setStrokeColor(c2, m_style->colorSpace()); 11338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeThickness(halfThickness > 2 ? halfThickness - 1 : halfThickness); 11348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->strokeArc(IntRect(x + shiftForInner, y + shiftForInner, (radius.width() - shiftForInner) * 2, 11358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian (radius.height() - shiftForInner) * 2), angleStart, angleSpan); 11368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 11378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case INSET: 11398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (s == BSTop || s == BSLeft) 11408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian c = c.dark(); 11418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case OUTSET: 11428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (style == OUTSET && (s == BSBottom || s == BSRight)) 11438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian c = c.dark(); 11448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case SOLID: 11458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeStyle(SolidStroke); 1146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block graphicsContext->setStrokeColor(c, m_style->colorSpace()); 11478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeThickness(thickness); 11488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->strokeArc(IntRect(x, y, radius.width() * 2, radius.height() * 2), angleStart, angleSpan); 11498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 11508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1152ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#endif 1153a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 1154a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid RenderObject::paintFocusRing(GraphicsContext* context, int tx, int ty, RenderStyle* style) 1155a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{ 1156a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch Vector<IntRect> focusRingRects; 1157a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch addFocusRingRects(focusRingRects, tx, ty); 1158a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (style->outlineStyleIsAuto()) 1159a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch context->drawFocusRing(focusRingRects, style->outlineWidth(), style->outlineOffset(), style->visitedDependentColor(CSSPropertyOutlineColor)); 1160a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch else 1161a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch addPDFURLRect(context, unionRect(focusRingRects)); 1162a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch} 11638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::addPDFURLRect(GraphicsContext* context, const IntRect& rect) 11658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (rect.isEmpty()) 11678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 11688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Node* n = node(); 11698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!n || !n->isLink() || !n->isElementNode()) 11708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 11718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian const AtomicString& href = static_cast<Element*>(n)->getAttribute(hrefAttr); 11728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (href.isNull()) 11738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 11748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian context->setURLForRect(n->document()->completeURL(href), rect); 11758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid RenderObject::paintOutline(GraphicsContext* graphicsContext, int tx, int ty, int w, int h) 11788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!hasOutline()) 11808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 11818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RenderStyle* styleToUse = style(); 1183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int ow = styleToUse->outlineWidth(); 1184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block EBorderStyle os = styleToUse->outlineStyle(); 11858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Color oc = styleToUse->visitedDependentColor(CSSPropertyOutlineColor); 11878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int offset = styleToUse->outlineOffset(); 11898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (styleToUse->outlineStyleIsAuto() || hasOutlineAnnotation()) { 1191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!theme()->supportsFocusRing(styleToUse)) { 11928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Only paint the focus ring by hand if the theme isn't able to draw the focus ring. 1193a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch paintFocusRing(graphicsContext, tx, ty, styleToUse); 11948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (styleToUse->outlineStyleIsAuto() || styleToUse->outlineStyle() == BNONE) 11988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 11998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project tx -= offset; 12018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ty -= offset; 12028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project w += 2 * offset; 12038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project h += 2 * offset; 12048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (h < 0 || w < 0) 12068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 12078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block drawLineForBoxSide(graphicsContext, tx - ow, ty - ow, tx, ty + h + ow, BSLeft, oc, os, ow, ow); 1209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block drawLineForBoxSide(graphicsContext, tx - ow, ty - ow, tx + w + ow, ty, BSTop, oc, os, ow, ow); 1210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block drawLineForBoxSide(graphicsContext, tx + w, ty - ow, tx + w + ow, ty + h + ow, BSRight, oc, os, ow, ow); 1211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block drawLineForBoxSide(graphicsContext, tx - ow, ty + h, tx + w + ow, ty + h + ow, BSBottom, oc, os, ow, ow); 12128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1214635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectIntRect RenderObject::absoluteBoundingBoxRect(bool useTransforms) 1215635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1216635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (useTransforms) { 1217635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<FloatQuad> quads; 1218635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project absoluteQuads(quads); 1219635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1220635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t n = quads.size(); 1221635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!n) 1222635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return IntRect(); 1223635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1224635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project IntRect result = quads[0].enclosingBoundingBox(); 1225635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (size_t i = 1; i < n; ++i) 1226635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project result.unite(quads[i].enclosingBoundingBox()); 1227635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return result; 1228635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1229635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1230635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FloatPoint absPos = localToAbsolute(); 1231635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<IntRect> rects; 1232635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project absoluteRects(rects, absPos.x(), absPos.y()); 1233635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1234635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t n = rects.size(); 1235635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!n) 1236635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return IntRect(); 1237635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1238635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project IntRect result = rects[0]; 1239635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (size_t i = 1; i < n; ++i) 1240635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project result.unite(rects[i]); 1241635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return result; 1242635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1243635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1244d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid RenderObject::absoluteFocusRingQuads(Vector<FloatQuad>& quads) 1245d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 1246d0825bca7fe65beaee391d30da42e937db621564Steve Block Vector<IntRect> rects; 1247d0825bca7fe65beaee391d30da42e937db621564Steve Block // FIXME: addFocusRingRects() needs to be passed this transform-unaware 1248d0825bca7fe65beaee391d30da42e937db621564Steve Block // localToAbsolute() offset here because RenderInline::addFocusRingRects() 1249d0825bca7fe65beaee391d30da42e937db621564Steve Block // implicitly assumes that. This doesn't work correctly with transformed 1250d0825bca7fe65beaee391d30da42e937db621564Steve Block // descendants. 1251d0825bca7fe65beaee391d30da42e937db621564Steve Block FloatPoint absolutePoint = localToAbsolute(); 1252d0825bca7fe65beaee391d30da42e937db621564Steve Block addFocusRingRects(rects, absolutePoint.x(), absolutePoint.y()); 1253d0825bca7fe65beaee391d30da42e937db621564Steve Block size_t count = rects.size(); 1254d0825bca7fe65beaee391d30da42e937db621564Steve Block for (size_t i = 0; i < count; ++i) { 1255d0825bca7fe65beaee391d30da42e937db621564Steve Block IntRect rect = rects[i]; 1256d0825bca7fe65beaee391d30da42e937db621564Steve Block rect.move(-absolutePoint.x(), -absolutePoint.y()); 1257d0825bca7fe65beaee391d30da42e937db621564Steve Block quads.append(localToAbsoluteQuad(FloatQuad(rect))); 1258d0825bca7fe65beaee391d30da42e937db621564Steve Block } 1259d0825bca7fe65beaee391d30da42e937db621564Steve Block} 1260d0825bca7fe65beaee391d30da42e937db621564Steve Block 1261635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid RenderObject::addAbsoluteRectForLayer(IntRect& result) 1262635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1263635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (hasLayer()) 1264635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project result.unite(absoluteBoundingBoxRect()); 1265635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (RenderObject* current = firstChild(); current; current = current->nextSibling()) 1266635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project current->addAbsoluteRectForLayer(result); 1267635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1268635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1269635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectIntRect RenderObject::paintingRootRect(IntRect& topLevelRect) 1270635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1271635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project IntRect result = absoluteBoundingBoxRect(); 1272635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project topLevelRect = result; 1273635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (RenderObject* current = firstChild(); current; current = current->nextSibling()) 1274635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project current->addAbsoluteRectForLayer(result); 1275635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return result; 1276635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1277635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 12788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::paint(PaintInfo& /*paintInfo*/, int /*tx*/, int /*ty*/) 12798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianRenderBoxModelObject* RenderObject::containerForRepaint() const 1283635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 12848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if USE(ACCELERATED_COMPOSITING) 12858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (RenderView* v = view()) { 12868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (v->usesCompositing()) { 12878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderLayer* compLayer = enclosingLayer()->enclosingCompositingLayer(); 12888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return compLayer ? compLayer->renderer() : 0; 12898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 12908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 12918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 12928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Do root-relative repaint. 1293635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return 0; 1294635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1295635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 12968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::repaintUsingContainer(RenderBoxModelObject* repaintContainer, const IntRect& r, bool immediate) 12978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 12986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!repaintContainer) { 12996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen view()->repaintViewRectangle(r, immediate); 13006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return; 13016c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 13026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 13038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if USE(ACCELERATED_COMPOSITING) 13046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen RenderView* v = view(); 13056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (repaintContainer->isRenderView()) { 13066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen ASSERT(repaintContainer == v); 13076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!v->hasLayer() || !v->layer()->isComposited() || v->layer()->backing()->paintingGoesToWindow()) { 13086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen v->repaintViewRectangle(r, immediate); 13096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return; 13108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 13116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 13126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 13136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (v->usesCompositing()) { 13146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen ASSERT(repaintContainer->hasLayer() && repaintContainer->layer()->isComposited()); 13156c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen repaintContainer->layer()->setBackingNeedsRepaintInRect(r); 13166c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 13178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#else 13186c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (repaintContainer->isRenderView()) 13196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen toRenderView(repaintContainer)->repaintViewRectangle(r, immediate); 13208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 13218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 13228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 13238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::repaint(bool immediate) 13248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Don't repaint if we're unrooted (note that view() still returns the view when unrooted) 13268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderView* view; 13278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!isRooted(&view)) 13288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1329635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 13308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (view->printing()) 13318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; // Don't repaint if we're printing. 1332635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 13338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderBoxModelObject* repaintContainer = containerForRepaint(); 13348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer ? repaintContainer : view, clippedOverflowRectForRepaint(repaintContainer), immediate); 13358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::repaintRectangle(const IntRect& r, bool immediate) 13388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Don't repaint if we're unrooted (note that view() still returns the view when unrooted) 13408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderView* view; 13418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!isRooted(&view)) 13428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1343635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 13448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (view->printing()) 13458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; // Don't repaint if we're printing. 1346635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 13478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian IntRect dirtyRect(r); 1348635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1349635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // FIXME: layoutDelta needs to be applied in parts before/after transforms and 1350635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // repaint containers. https://bugs.webkit.org/show_bug.cgi?id=23308 13518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian dirtyRect.move(view->layoutDelta()); 1352635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 13538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderBoxModelObject* repaintContainer = containerForRepaint(); 13548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian computeRectForRepaint(repaintContainer, dirtyRect); 13558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer ? repaintContainer : view, dirtyRect, immediate); 13568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1358dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool RenderObject::repaintAfterLayoutIfNeeded(RenderBoxModelObject* repaintContainer, const IntRect& oldBounds, const IntRect& oldOutlineBox, const IntRect* newBoundsPtr, const IntRect* newOutlineBoxRectPtr) 13598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderView* v = view(); 13618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (v->printing()) 13628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; // Don't repaint if we're printing. 13638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1364967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // This ASSERT fails due to animations. See https://bugs.webkit.org/show_bug.cgi?id=37048 1365967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // ASSERT(!newBoundsPtr || *newBoundsPtr == clippedOverflowRectForRepaint(repaintContainer)); 1366dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block IntRect newBounds = newBoundsPtr ? *newBoundsPtr : clippedOverflowRectForRepaint(repaintContainer); 13678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IntRect newOutlineBox; 13688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool fullRepaint = selfNeedsLayout(); 13708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Presumably a background or a border exists if border-fit:lines was specified. 13718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!fullRepaint && style()->borderFit() == BorderFitLines) 13728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fullRepaint = true; 13738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!fullRepaint) { 1374967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // This ASSERT fails due to animations. See https://bugs.webkit.org/show_bug.cgi?id=37048 1375967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // ASSERT(!newOutlineBoxRectPtr || *newOutlineBoxRectPtr == outlineBoundsForRepaint(repaintContainer)); 1376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block newOutlineBox = newOutlineBoxRectPtr ? *newOutlineBoxRectPtr : outlineBoundsForRepaint(repaintContainer); 13778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newOutlineBox.location() != oldOutlineBox.location() || (mustRepaintBackgroundOrBorder() && (newBounds != oldBounds || newOutlineBox != oldOutlineBox))) 13788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fullRepaint = true; 13798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 13818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!repaintContainer) 13828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintContainer = v; 13838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 13848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (fullRepaint) { 13858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, oldBounds); 13868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newBounds != oldBounds) 13878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, newBounds); 13888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 13898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newBounds == oldBounds && newOutlineBox == oldOutlineBox) 13928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 13938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int deltaLeft = newBounds.x() - oldBounds.x(); 13958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (deltaLeft > 0) 13968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, IntRect(oldBounds.x(), oldBounds.y(), deltaLeft, oldBounds.height())); 13978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (deltaLeft < 0) 13988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, IntRect(newBounds.x(), newBounds.y(), -deltaLeft, newBounds.height())); 13998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int deltaRight = newBounds.right() - oldBounds.right(); 14018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (deltaRight > 0) 14028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, IntRect(oldBounds.right(), newBounds.y(), deltaRight, newBounds.height())); 14038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (deltaRight < 0) 14048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, IntRect(newBounds.right(), oldBounds.y(), -deltaRight, oldBounds.height())); 14058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int deltaTop = newBounds.y() - oldBounds.y(); 14078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (deltaTop > 0) 14088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, IntRect(oldBounds.x(), oldBounds.y(), oldBounds.width(), deltaTop)); 14098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (deltaTop < 0) 14108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, IntRect(newBounds.x(), newBounds.y(), newBounds.width(), -deltaTop)); 14118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int deltaBottom = newBounds.bottom() - oldBounds.bottom(); 14138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (deltaBottom > 0) 14148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, IntRect(newBounds.x(), oldBounds.bottom(), newBounds.width(), deltaBottom)); 14158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (deltaBottom < 0) 14168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, IntRect(oldBounds.x(), newBounds.bottom(), oldBounds.width(), -deltaBottom)); 14178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newOutlineBox == oldOutlineBox) 14198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 14208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We didn't move, but we did change size. Invalidate the delta, which will consist of possibly 14228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // two rectangles (but typically only one). 14238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderStyle* outlineStyle = outlineStyleForRepaint(); 14248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int ow = outlineStyle->outlineSize(); 14258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int width = abs(newOutlineBox.width() - oldOutlineBox.width()); 14268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (width) { 14270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int shadowLeft; 14280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int shadowRight; 14290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch style()->getBoxShadowHorizontalExtent(shadowLeft, shadowRight); 14308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1431635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int borderRight = isBox() ? toRenderBox(this)->borderRight() : 0; 14325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen int boxWidth = isBox() ? toRenderBox(this)->width() : 0; 14335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen int borderWidth = max(-outlineStyle->outlineOffset(), max(borderRight, max(style()->borderTopRightRadius().width().calcValue(boxWidth), style()->borderBottomRightRadius().width().calcValue(boxWidth)))) + max(ow, shadowRight); 14348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IntRect rightRect(newOutlineBox.x() + min(newOutlineBox.width(), oldOutlineBox.width()) - borderWidth, 14358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newOutlineBox.y(), 14368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project width + borderWidth, 14378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project max(newOutlineBox.height(), oldOutlineBox.height())); 14388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int right = min(newBounds.right(), oldBounds.right()); 14398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (rightRect.x() < right) { 14408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rightRect.setWidth(min(rightRect.width(), right - rightRect.x())); 14418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, rightRect); 14428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int height = abs(newOutlineBox.height() - oldOutlineBox.height()); 14458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (height) { 14460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int shadowTop; 14470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int shadowBottom; 14480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch style()->getBoxShadowVerticalExtent(shadowTop, shadowBottom); 14498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1450635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int borderBottom = isBox() ? toRenderBox(this)->borderBottom() : 0; 14515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen int boxHeight = isBox() ? toRenderBox(this)->height() : 0; 14525ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen int borderHeight = max(-outlineStyle->outlineOffset(), max(borderBottom, max(style()->borderBottomLeftRadius().height().calcValue(boxHeight), style()->borderBottomRightRadius().height().calcValue(boxHeight)))) + max(ow, shadowBottom); 14538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IntRect bottomRect(newOutlineBox.x(), 14548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project min(newOutlineBox.bottom(), oldOutlineBox.bottom()) - borderHeight, 14558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project max(newOutlineBox.width(), oldOutlineBox.width()), 14568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project height + borderHeight); 14578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int bottom = min(newBounds.bottom(), oldBounds.bottom()); 14588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (bottomRect.y() < bottom) { 14598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bottomRect.setHeight(min(bottomRect.height(), bottom - bottomRect.y())); 14608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, bottomRect); 14618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 14648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1466635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid RenderObject::repaintDuringLayoutIfMoved(const IntRect&) 14678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1470635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid RenderObject::repaintOverhangingFloats(bool) 14718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::checkForRepaintDuringLayout() const 14758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: <https://bugs.webkit.org/show_bug.cgi?id=20885> It is probably safe to also require 14778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // m_everHadLayout. Currently, only RenderBlock::layoutBlock() adds this condition. See also 14788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // <https://bugs.webkit.org/show_bug.cgi?id=15129>. 14798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return !document()->view()->needsFullRepaint() && !hasLayer(); 14808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianIntRect RenderObject::rectWithOutlineForRepaint(RenderBoxModelObject* repaintContainer, int outlineWidth) 14838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1484635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project IntRect r(clippedOverflowRectForRepaint(repaintContainer)); 1485635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project r.inflate(outlineWidth); 14868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return r; 14878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianIntRect RenderObject::clippedOverflowRectForRepaint(RenderBoxModelObject*) 14908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT_NOT_REACHED(); 14928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return IntRect(); 14938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::computeRectForRepaint(RenderBoxModelObject* repaintContainer, IntRect& rect, bool fixed) 14968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1497635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (repaintContainer == this) 1498635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 1499635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 15008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (RenderObject* o = parent()) { 15018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (o->isBlockFlow()) { 15028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderBlock* cb = toRenderBlock(o); 15038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cb->hasColumns()) 15048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cb->adjustRectForColumns(rect); 15058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 15068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (o->hasOverflowClip()) { 15088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // o->height() is inaccurate if we're in the middle of a layout of |o|, so use the 15098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // layer's size instead. Even if the layer's size is wrong, the layer itself will repaint 15108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // anyway if its size does change. 1511635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project RenderBox* boxParent = toRenderBox(o); 1512635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1513dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block IntRect repaintRect(rect); 1514dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block repaintRect.move(-boxParent->layer()->scrolledContentOffset()); // For overflow:auto/scroll/hidden. 1515dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1516635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project IntRect boxRect(0, 0, boxParent->layer()->width(), boxParent->layer()->height()); 15178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rect = intersection(repaintRect, boxRect); 15188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (rect.isEmpty()) 15198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 15208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 15218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian o->computeRectForRepaint(repaintContainer, rect, fixed); 15238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 15248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1526635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid RenderObject::dirtyLinesFromChangedChild(RenderObject*) 15278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 15318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::showTreeForThis() const 15338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (node()) 15358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian node()->showTreeForThis(); 15368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1538643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid RenderObject::showRenderObject() const 1539643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1540643ca7872b450ea4efacab6188849e5aac2ba161Steve Block showRenderObject(0); 1541643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1542643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1543643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid RenderObject::showRenderObject(int printedCharacters) const 1544643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1545643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // As this function is intended to be used when debugging, the 1546643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // this pointer may be 0. 1547643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!this) { 1548643ca7872b450ea4efacab6188849e5aac2ba161Steve Block fputs("(null)\n", stderr); 1549643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 1550643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1551643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1552643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printedCharacters += fprintf(stderr, "%s %p", renderName(), this); 1553643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1554643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (node()) { 1555643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (printedCharacters) 1556643ca7872b450ea4efacab6188849e5aac2ba161Steve Block for (; printedCharacters < 39; printedCharacters++) 1557643ca7872b450ea4efacab6188849e5aac2ba161Steve Block fputc(' ', stderr); 1558643ca7872b450ea4efacab6188849e5aac2ba161Steve Block fputc('\t', stderr); 1559643ca7872b450ea4efacab6188849e5aac2ba161Steve Block node()->showNode(); 1560643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } else 1561643ca7872b450ea4efacab6188849e5aac2ba161Steve Block fputc('\n', stderr); 1562643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1563643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1564643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid RenderObject::showRenderTreeAndMark(const RenderObject* markedObject1, const char* markedLabel1, const RenderObject* markedObject2, const char* markedLabel2, int depth) const 1565643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1566643ca7872b450ea4efacab6188849e5aac2ba161Steve Block int printedCharacters = 0; 1567643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (markedObject1 == this && markedLabel1) 1568643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printedCharacters += fprintf(stderr, "%s", markedLabel1); 1569643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (markedObject2 == this && markedLabel2) 1570643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printedCharacters += fprintf(stderr, "%s", markedLabel2); 1571643ca7872b450ea4efacab6188849e5aac2ba161Steve Block for (; printedCharacters < depth * 2; printedCharacters++) 1572643ca7872b450ea4efacab6188849e5aac2ba161Steve Block fputc(' ', stderr); 1573643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1574643ca7872b450ea4efacab6188849e5aac2ba161Steve Block showRenderObject(printedCharacters); 1575643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!this) 1576643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 1577643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1578643ca7872b450ea4efacab6188849e5aac2ba161Steve Block for (const RenderObject* child = firstChild(); child; child = child->nextSibling()) 1579643ca7872b450ea4efacab6188849e5aac2ba161Steve Block child->showRenderTreeAndMark(markedObject1, markedLabel1, markedObject2, markedLabel2, depth + 1); 1580643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1581643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 15828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // NDEBUG 15838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectColor RenderObject::selectionBackgroundColor() const 15858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Color color; 15878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (style()->userSelect() != SELECT_NONE) { 1588e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block RefPtr<RenderStyle> pseudoStyle = getUncachedPseudoStyle(SELECTION); 1589e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if (pseudoStyle && pseudoStyle->visitedDependentColor(CSSPropertyBackgroundColor).isValid()) 1590e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block color = pseudoStyle->visitedDependentColor(CSSPropertyBackgroundColor).blendWithWhite(); 15918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 1592545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch color = frame()->selection()->isFocusedAndActive() ? 15938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project theme()->activeSelectionBackgroundColor() : 15948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project theme()->inactiveSelectionBackgroundColor(); 15958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 15968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return color; 15988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1600f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochColor RenderObject::selectionColor(int colorProperty) const 16018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Color color; 1603e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block // If the element is unselectable, or we are only painting the selection, 1604e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block // don't override the foreground color with the selection foreground color. 1605e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block if (style()->userSelect() == SELECT_NONE 1606e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block || (frame()->view()->paintBehavior() & PaintBehaviorSelectionOnly)) 16078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return color; 16088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (RefPtr<RenderStyle> pseudoStyle = getUncachedPseudoStyle(SELECTION)) { 1610f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch color = pseudoStyle->visitedDependentColor(colorProperty); 16118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!color.isValid()) 1612e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block color = pseudoStyle->visitedDependentColor(CSSPropertyColor); 16138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 1614545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch color = frame()->selection()->isFocusedAndActive() ? 1615635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project theme()->activeSelectionForegroundColor() : 1616635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project theme()->inactiveSelectionForegroundColor(); 16178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return color; 16198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1621f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochColor RenderObject::selectionForegroundColor() const 1622f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 1623f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return selectionColor(CSSPropertyWebkitTextFillColor); 1624f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 1625f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 1626f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochColor RenderObject::selectionEmphasisMarkColor() const 1627f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 1628f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return selectionColor(CSSPropertyWebkitTextEmphasisColor); 1629f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 1630f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 1631231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(DRAG_SUPPORT) 16328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNode* RenderObject::draggableNode(bool dhtmlOK, bool uaOK, int x, int y, bool& dhtmlWillDrag) const 16338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!dhtmlOK && !uaOK) 16358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 16368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (const RenderObject* curr = this; curr; curr = curr->parent()) { 16388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Node* elt = curr->node(); 16398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (elt && elt->nodeType() == Node::TEXT_NODE) { 16408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Since there's no way for the author to address the -webkit-user-drag style for a text node, 16418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we use our own judgement. 16428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (uaOK && view()->frameView()->frame()->eventHandler()->shouldDragAutoNode(curr->node(), IntPoint(x, y))) { 16438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dhtmlWillDrag = false; 16448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return curr->node(); 16458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (elt->canStartSelection()) 16478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // In this case we have a click in the unselected portion of text. If this text is 16488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // selectable, we want to start the selection process instead of looking for a parent 16498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // to try to drag. 16508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 16518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 16528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EUserDrag dragMode = curr->style()->userDrag(); 16538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (dhtmlOK && dragMode == DRAG_ELEMENT) { 16548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dhtmlWillDrag = true; 16558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return curr->node(); 16568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (uaOK && dragMode == DRAG_AUTO 16588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && view()->frameView()->frame()->eventHandler()->shouldDragAutoNode(curr->node(), IntPoint(x, y))) { 16598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dhtmlWillDrag = false; 16608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return curr->node(); 16618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 16658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1666231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif // ENABLE(DRAG_SUPPORT) 16678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::selectionStartEnd(int& spos, int& epos) const 16698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view()->selectionStartEnd(spos, epos); 16718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::handleDynamicFloatPositionChange() 16748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We have gone from not affecting the inline status of the parent flow to suddenly 16768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // having an impact. See if there is a mismatch between the parent flow's 16778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // childrenInline() state and our state. 16788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setInline(style()->isDisplayInlineType()); 16798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isInline() != parent()->childrenInline()) { 16808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!isInline()) 16818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderBoxModelObject(parent())->childBecameNonInline(this); 16828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else { 16838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // An anonymous block must be made to wrap this inline. 16848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderBlock* block = toRenderBlock(parent())->createAnonymousBlock(); 16858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObjectChildList* childlist = parent()->virtualChildren(); 16868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian childlist->insertChildNode(parent(), block, this); 16878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian block->children()->appendChildNode(block, childlist->removeChildNode(parent(), this)); 16888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::setAnimatableStyle(PassRefPtr<RenderStyle> style) 16938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!isText() && style) 16958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setStyle(animation()->updateAnimations(this, style.get())); 16968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 16978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setStyle(style); 16988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianStyleDifference RenderObject::adjustStyleDifference(StyleDifference diff, unsigned contextSensitiveProperties) const 17018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 17028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if USE(ACCELERATED_COMPOSITING) 17038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If transform changed, and we are not composited, need to do a layout. 17045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (contextSensitiveProperties & ContextSensitivePropertyTransform) { 17058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Text nodes share style with their parents but transforms don't apply to them, 17068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // hence the !isText() check. 17078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // FIXME: when transforms are taken into account for overflow, we will need to do a layout. 17088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!isText() && (!hasLayer() || !toRenderBoxModelObject(this)->layer()->isComposited())) 17098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian diff = StyleDifferenceLayout; 17108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if (diff < StyleDifferenceRecompositeLayer) 17118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian diff = StyleDifferenceRecompositeLayer; 17125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 17138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 17148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If opacity changed, and we are not composited, need to repaint (also 17158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // ignoring text nodes) 17165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (contextSensitiveProperties & ContextSensitivePropertyOpacity) { 17178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!isText() && (!hasLayer() || !toRenderBoxModelObject(this)->layer()->isComposited())) 17188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian diff = StyleDifferenceRepaintLayer; 17198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if (diff < StyleDifferenceRecompositeLayer) 17208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian diff = StyleDifferenceRecompositeLayer; 17215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 1722e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 1723e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // The answer to requiresLayer() for plugins and iframes can change outside of the style system, 1724e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // since it depends on whether we decide to composite these elements. When the layer status of 1725e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // one of these elements changes, we need to force a layout. 1726e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (diff == StyleDifferenceEqual && style() && isBoxModelObject()) { 1727e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (hasLayer() != toRenderBoxModelObject(this)->requiresLayer()) 1728e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke diff = StyleDifferenceLayout; 1729e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke } 17308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#else 17318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian UNUSED_PARAM(contextSensitiveProperties); 17328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 17338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 17348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If we have no layer(), just treat a RepaintLayer hint as a normal Repaint. 17358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (diff == StyleDifferenceRepaintLayer && !hasLayer()) 17368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian diff = StyleDifferenceRepaint; 17378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 17388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return diff; 17398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 17408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 17418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::setStyle(PassRefPtr<RenderStyle> style) 17428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 174328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (m_style == style) { 174428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#if USE(ACCELERATED_COMPOSITING) 174528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // We need to run through adjustStyleDifference() for iframes and plugins, so 174628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // style sharing is disabled for them. That should ensure that we never hit this code path. 174728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu ASSERT(!isRenderIFrame() && !isEmbeddedObject() &&!isApplet()); 174828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#endif 17498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 175028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } 17518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian StyleDifference diff = StyleDifferenceEqual; 17538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian unsigned contextSensitiveProperties = ContextSensitivePropertyNone; 17548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_style) 17558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian diff = m_style->diff(style.get(), contextSensitiveProperties); 17568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian diff = adjustStyleDifference(diff, contextSensitiveProperties); 17588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project styleWillChange(diff, style.get()); 17608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<RenderStyle> oldStyle = m_style.release(); 17628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_style = style; 17638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project updateFillImages(oldStyle ? oldStyle->backgroundLayers() : 0, m_style ? m_style->backgroundLayers() : 0); 17658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project updateFillImages(oldStyle ? oldStyle->maskLayers() : 0, m_style ? m_style->maskLayers() : 0); 17668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project updateImage(oldStyle ? oldStyle->borderImage().image() : 0, m_style ? m_style->borderImage().image() : 0); 17688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project updateImage(oldStyle ? oldStyle->maskBoxImage().image() : 0, m_style ? m_style->maskBoxImage().image() : 0); 17698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // We need to ensure that view->maximalOutlineSize() is valid for any repaints that happen 17718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // during styleDidChange (it's used by clippedOverflowRectForRepaint()). 17728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_style->outlineWidth() > 0 && m_style->outlineSize() > maximalOutlineSize(PaintPhaseOutline)) 17738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderView(document()->renderer())->setMaximalOutlineSize(m_style->outlineSize()); 17748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 17758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project styleDidChange(diff, oldStyle.get()); 17768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 17778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!m_parent || isText()) 17788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 17798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 17808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Now that the layer (if any) has been updated, we need to adjust the diff again, 17818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // check whether we should layout now, and decide if we need to repaint. 17828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian StyleDifference updatedDiff = adjustStyleDifference(diff, contextSensitiveProperties); 17838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 17848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (diff <= StyleDifferenceLayoutPositionedMovementOnly) { 17858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (updatedDiff == StyleDifferenceLayout) 17868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian setNeedsLayoutAndPrefWidthsRecalc(); 17878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if (updatedDiff == StyleDifferenceLayoutPositionedMovementOnly) 17888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian setNeedsPositionedMovementLayout(); 17898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 17908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 17918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (updatedDiff == StyleDifferenceRepaintLayer || updatedDiff == StyleDifferenceRepaint) { 17928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Do a repaint with the new style now, e.g., for example if we go from 17938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // not having an outline to having an outline. 17948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaint(); 17958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 17968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::setStyleInternal(PassRefPtr<RenderStyle> style) 17998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_style = style; 18018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::styleWillChange(StyleDifference diff, const RenderStyle* newStyle) 18048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_style) { 18068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If our z-index changes value or our visibility changes, 18078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we need to dirty our stacking context's z-order list. 18088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newStyle) { 18095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian bool visibilityChanged = m_style->visibility() != newStyle->visibility() 18105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian || m_style->zIndex() != newStyle->zIndex() 18115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian || m_style->hasAutoZIndex() != newStyle->hasAutoZIndex(); 18128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT) 18135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (visibilityChanged) 18148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project document()->setDashboardRegionsDirty(true); 18158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 18165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (visibilityChanged && AXObjectCache::accessibilityEnabled()) 18175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian document()->axObjectCache()->childrenChanged(this); 18188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1819635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Keep layer hierarchy visibility bits up to date if visibility changes. 18208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_style->visibility() != newStyle->visibility()) { 18218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (RenderLayer* l = enclosingLayer()) { 18228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newStyle->visibility() == VISIBLE) 18238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project l->setHasVisibleContent(true); 18248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (l->hasVisibleContent() && (this == l->renderer() || l->renderer()->style()->visibility() != VISIBLE)) { 18258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project l->dirtyVisibleContentStatus(); 18268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (diff > StyleDifferenceRepaintLayer) 18278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project repaint(); 18288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_parent && (diff == StyleDifferenceRepaint || newStyle->outlineSize() < m_style->outlineSize())) 1834635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project repaint(); 18358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isFloating() && (m_style->floating() != newStyle->floating())) 18368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For changes in float styles, we need to conceivably remove ourselves 18378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // from the floating objects list. 18388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderBox(this)->removeFloatingOrPositionedChildFromBlockLists(); 1839cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block else if (isPositioned() && (m_style->position() != newStyle->position())) 18408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For changes in positioning styles, we need to conceivably remove ourselves 18418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // from the positioned objects list. 18428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderBox(this)->removeFloatingOrPositionedChildFromBlockLists(); 18438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s_affectsParentBlock = isFloatingOrPositioned() && 18458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (!newStyle->isFloating() && newStyle->position() != AbsolutePosition && newStyle->position() != FixedPosition) 1846635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project && parent() && (parent()->isBlockFlow() || parent()->isRenderInline()); 18478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // reset style flags 18498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (diff == StyleDifferenceLayout || diff == StyleDifferenceLayoutPositionedMovementOnly) { 18508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_floating = false; 18518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_positioned = false; 18528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_relPositioned = false; 18538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_paintBackground = false; 18558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_hasOverflowClip = false; 18568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_hasTransform = false; 18578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_hasReflection = false; 18588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 18598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s_affectsParentBlock = false; 18608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (view()->frameView()) { 1862d0825bca7fe65beaee391d30da42e937db621564Steve Block bool shouldBlitOnFixedBackgroundImage = false; 1863d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(FAST_MOBILE_SCROLLING) 1864d0825bca7fe65beaee391d30da42e937db621564Steve Block // On low-powered/mobile devices, preventing blitting on a scroll can cause noticeable delays 1865d0825bca7fe65beaee391d30da42e937db621564Steve Block // when scrolling a page with a fixed background image. As an optimization, assuming there are 1866d0825bca7fe65beaee391d30da42e937db621564Steve Block // no fixed positoned elements on the page, we can acclerate scrolling (via blitting) if we 1867d0825bca7fe65beaee391d30da42e937db621564Steve Block // ignore the CSS property "background-attachment: fixed". 1868d0825bca7fe65beaee391d30da42e937db621564Steve Block shouldBlitOnFixedBackgroundImage = true; 1869d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 1870d0825bca7fe65beaee391d30da42e937db621564Steve Block 187106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen bool newStyleSlowScroll = newStyle && !shouldBlitOnFixedBackgroundImage && newStyle->hasFixedBackgroundImage(); 187206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen bool oldStyleSlowScroll = m_style && !shouldBlitOnFixedBackgroundImage && m_style->hasFixedBackgroundImage(); 18738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (oldStyleSlowScroll != newStyleSlowScroll) { 18748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (oldStyleSlowScroll) 18758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view()->frameView()->removeSlowRepaintObject(); 18768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newStyleSlowScroll) 18778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view()->frameView()->addSlowRepaintObject(); 18788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1882d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid RenderObject::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) 18838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (s_affectsParentBlock) 18858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project handleDynamicFloatPositionChange(); 18868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1887635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_parent) 1888635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 1889635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1890d0825bca7fe65beaee391d30da42e937db621564Steve Block if (diff == StyleDifferenceLayout) { 1891d0825bca7fe65beaee391d30da42e937db621564Steve Block RenderCounter::rendererStyleChanged(this, oldStyle, m_style.get()); 18928a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 18938a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block // If the object already needs layout, then setNeedsLayout won't do 18948a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block // any work. But if the containing block has changed, then we may need 18958a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block // to mark the new containing blocks for layout. The change that can 18968a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block // directly affect the containing block of this object is a change to 18978a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block // the position style. 18988a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block if (m_needsLayout && oldStyle->position() != m_style->position()) 18998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block markContainingBlocksForLayout(); 19008a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 19018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setNeedsLayoutAndPrefWidthsRecalc(); 1902d0825bca7fe65beaee391d30da42e937db621564Steve Block } else if (diff == StyleDifferenceLayoutPositionedMovementOnly) 19038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setNeedsPositionedMovementLayout(); 19048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Don't check for repaint here; we need to wait until the layer has been 19068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // updated by subclasses before we know if we have to repaint (in setStyle()). 19078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::updateFillImages(const FillLayer* oldLayers, const FillLayer* newLayers) 19108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1911231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Optimize the common case 1912231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (oldLayers && !oldLayers->next() && newLayers && !newLayers->next() && (oldLayers->image() == newLayers->image())) 1913231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 1914231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1915231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Go through the new layers and addClients first, to avoid removing all clients of an image. 1916058ccc7ba0a4d59b9f6e92808332aa9895425fc7Andrei Popescu for (const FillLayer* currNew = newLayers; currNew; currNew = currNew->next()) { 1917231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (currNew->image()) 1918058ccc7ba0a4d59b9f6e92808332aa9895425fc7Andrei Popescu currNew->image()->addClient(this); 1919058ccc7ba0a4d59b9f6e92808332aa9895425fc7Andrei Popescu } 1920231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1921231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block for (const FillLayer* currOld = oldLayers; currOld; currOld = currOld->next()) { 1922231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (currOld->image()) 1923231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block currOld->image()->removeClient(this); 1924231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 19258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::updateImage(StyleImage* oldImage, StyleImage* newImage) 19288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 19298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (oldImage != newImage) { 19308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (oldImage) 19318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project oldImage->removeClient(this); 19328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newImage) 19338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newImage->addClient(this); 19348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 19358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect RenderObject::viewRect() const 19388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 19398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return view()->viewRect(); 19408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1942635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectFloatPoint RenderObject::localToAbsolute(FloatPoint localPoint, bool fixed, bool useTransforms) const 19438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 19448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian TransformState transformState(TransformState::ApplyTransformDirection, localPoint); 19458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian mapLocalToContainer(0, fixed, useTransforms, transformState); 19468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian transformState.flatten(); 19478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return transformState.lastPlanarPoint(); 19498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1951635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectFloatPoint RenderObject::absoluteToLocal(FloatPoint containerPoint, bool fixed, bool useTransforms) const 19528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 19538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian TransformState transformState(TransformState::UnapplyInverseTransformDirection, containerPoint); 19548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian mapAbsoluteToLocalPoint(fixed, useTransforms, transformState); 19558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian transformState.flatten(); 19568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return transformState.lastPlanarPoint(); 19588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool fixed, bool useTransforms, TransformState& transformState) const 19618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1962635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (repaintContainer == this) 19638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 1964635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1965635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project RenderObject* o = parent(); 19668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!o) 19678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 19688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1969692e5dbf12901edacf14812a6fae25462920af42Steve Block IntSize columnOffset; 1970692e5dbf12901edacf14812a6fae25462920af42Steve Block o->adjustForColumns(columnOffset, roundedIntPoint(transformState.mappedPoint())); 1971692e5dbf12901edacf14812a6fae25462920af42Steve Block if (!columnOffset.isZero()) 1972692e5dbf12901edacf14812a6fae25462920af42Steve Block transformState.move(columnOffset); 1973692e5dbf12901edacf14812a6fae25462920af42Steve Block 19748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (o->hasOverflowClip()) 19758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian transformState.move(-toRenderBox(o)->layer()->scrolledContentOffset()); 19768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian o->mapLocalToContainer(repaintContainer, fixed, useTransforms, transformState); 19788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 19798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::mapAbsoluteToLocalPoint(bool fixed, bool useTransforms, TransformState& transformState) const 19818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 19828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* o = parent(); 1983635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (o) { 19848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian o->mapAbsoluteToLocalPoint(fixed, useTransforms, transformState); 1985635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (o->hasOverflowClip()) 19868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian transformState.move(toRenderBox(o)->layer()->scrolledContentOffset()); 1987635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 19888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 19898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool RenderObject::shouldUseTransformFromContainer(const RenderObject* containerObject) const 19918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 19925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(3D_RENDERING) 19935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // hasTransform() indicates whether the object has transform, transform-style or perspective. We just care about transform, 19945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // so check the layer's transform directly. 19955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return (hasLayer() && toRenderBoxModelObject(this)->layer()->transform()) || (containerObject && containerObject->style()->hasPerspective()); 1996353e1e16ed060c0ea11f2dea6dea8b565ac71533Mike Reed#else 19975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian UNUSED_PARAM(containerObject); 19985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return hasTransform(); 1999353e1e16ed060c0ea11f2dea6dea8b565ac71533Mike Reed#endif 20005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 2001353e1e16ed060c0ea11f2dea6dea8b565ac71533Mike Reed 20025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid RenderObject::getTransformFromContainer(const RenderObject* containerObject, const IntSize& offsetInContainer, TransformationMatrix& transform) const 20035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 20045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian transform.makeIdentity(); 20055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian transform.translate(offsetInContainer.width(), offsetInContainer.height()); 20065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian RenderLayer* layer; 20075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (hasLayer() && (layer = toRenderBoxModelObject(this)->layer()) && layer->transform()) 20085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian transform.multLeft(layer->currentTransform()); 20095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 20108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if ENABLE(3D_RENDERING) 20110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (containerObject && containerObject->hasLayer() && containerObject->style()->hasPerspective()) { 20128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Perpsective on the container affects us, so we have to factor it in here. 20138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(containerObject->hasLayer()); 2014bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen FloatPoint perspectiveOrigin = toRenderBoxModelObject(containerObject)->layer()->perspectiveOrigin(); 20158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 20168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian TransformationMatrix perspectiveMatrix; 20178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian perspectiveMatrix.applyPerspective(containerObject->style()->perspective()); 20188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 20195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian transform.translateRight3d(-perspectiveOrigin.x(), -perspectiveOrigin.y(), 0); 20205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian transform.multiply(perspectiveMatrix); 20215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian transform.translateRight3d(perspectiveOrigin.x(), perspectiveOrigin.y(), 0); 20228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 20238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#else 20248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian UNUSED_PARAM(containerObject); 20258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 20268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 2027635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 20288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianFloatQuad RenderObject::localToContainerQuad(const FloatQuad& localQuad, RenderBoxModelObject* repaintContainer, bool fixed) const 20298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 2030692e5dbf12901edacf14812a6fae25462920af42Steve Block // Track the point at the center of the quad's bounding box. As mapLocalToContainer() calls offsetFromContainer(), 2031692e5dbf12901edacf14812a6fae25462920af42Steve Block // it will use that point as the reference point to decide which column's transform to apply in multiple-column blocks. 2032692e5dbf12901edacf14812a6fae25462920af42Steve Block TransformState transformState(TransformState::ApplyTransformDirection, localQuad.boundingBox().center(), &localQuad); 20338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian mapLocalToContainer(repaintContainer, fixed, true, transformState); 20348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian transformState.flatten(); 20358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 20368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return transformState.lastPlanarQuad(); 20378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2039692e5dbf12901edacf14812a6fae25462920af42Steve BlockIntSize RenderObject::offsetFromContainer(RenderObject* o, const IntPoint& point) const 20408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2041635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(o == container()); 2042635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2043635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project IntSize offset; 2044692e5dbf12901edacf14812a6fae25462920af42Steve Block 2045692e5dbf12901edacf14812a6fae25462920af42Steve Block o->adjustForColumns(offset, point); 2046692e5dbf12901edacf14812a6fae25462920af42Steve Block 2047635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (o->hasOverflowClip()) 2048635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project offset -= toRenderBox(o)->layer()->scrolledContentOffset(); 2049635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2050635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return offset; 20518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2053231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockIntSize RenderObject::offsetFromAncestorContainer(RenderObject* container) const 2054231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 2055231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block IntSize offset; 2056692e5dbf12901edacf14812a6fae25462920af42Steve Block IntPoint referencePoint; 2057231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block const RenderObject* currContainer = this; 2058231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block do { 2059231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RenderObject* nextContainer = currContainer->container(); 2060231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(nextContainer); // This means we reached the top without finding container. 2061231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!nextContainer) 2062231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block break; 2063231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(!currContainer->hasTransform()); 2064692e5dbf12901edacf14812a6fae25462920af42Steve Block IntSize currentOffset = currContainer->offsetFromContainer(nextContainer, referencePoint); 2065692e5dbf12901edacf14812a6fae25462920af42Steve Block offset += currentOffset; 2066692e5dbf12901edacf14812a6fae25462920af42Steve Block referencePoint.move(currentOffset); 2067231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block currContainer = nextContainer; 2068231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } while (currContainer != container); 2069231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2070231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return offset; 2071231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 2072231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2073635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectIntRect RenderObject::localCaretRect(InlineBox*, int, int* extraWidthToEndOfLine) 20748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 20750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (extraWidthToEndOfLine) 20760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *extraWidthToEndOfLine = 0; 2077635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2078635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return IntRect(); 20798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderView* RenderObject::view() const 20828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 20838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return toRenderView(document()->renderer()); 20848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 20858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 20868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool RenderObject::isRooted(RenderView** view) 20878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 20888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* o = this; 20898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while (o->parent()) 20908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian o = o->parent(); 20918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 20928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!o->isRenderView()) 20938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return false; 20948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 20958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (view) 20968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *view = toRenderView(o); 20978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 20988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return true; 20998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::hasOutlineAnnotation() const 21028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return node() && node()->isLink() && document()->printing(); 21048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2106231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockRenderObject* RenderObject::container(RenderBoxModelObject* repaintContainer, bool* repaintContainerSkipped) const 21078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2108231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (repaintContainerSkipped) 2109231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *repaintContainerSkipped = false; 2110231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 21118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This method is extremely similar to containingBlock(), but with a few notable 21128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // exceptions. 21138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // (1) It can be used on orphaned subtrees, i.e., it can be called safely even when 21148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the object is not part of the primary document subtree yet. 21158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // (2) For normal flow elements, it just returns the parent. 21168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // (3) For absolute positioned elements, it will return a relative positioned inline. 21178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // containingBlock() simply skips relpositioned inlines and lets an enclosing block handle 2118bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen // the layout of the positioned object. This does mean that computePositionedLogicalWidth and 2119bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen // computePositionedLogicalHeight have to use container(). 21208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* o = parent(); 21218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isText()) 21238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o; 21248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EPosition pos = m_style->position(); 21268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (pos == FixedPosition) { 21278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // container() can be called on an object that is not in the 21288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // tree yet. We don't call view() since it will assert if it 21298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // can't get back to the canvas. Instead we just walk as high up 21308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // as we can. If we're in the tree, we'll get the root. If we 21318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // aren't we'll get the root of our little subtree (most likely 21328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we'll just return 0). 2133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // FIXME: The definition of view() has changed to not crawl up the render tree. It might 2134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // be safe now to use it. 2135231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block while (o && o->parent() && !(o->hasTransform() && o->isRenderBlock())) { 2136231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (repaintContainerSkipped && o == repaintContainer) 2137231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *repaintContainerSkipped = true; 21388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->parent(); 2139231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 21408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (pos == AbsolutePosition) { 21418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Same goes here. We technically just want our containing block, but 21428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we may not have one if we're part of an uninstalled subtree. We'll 21438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // climb as high as we can though. 2144231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block while (o && o->style()->position() == StaticPosition && !o->isRenderView() && !(o->hasTransform() && o->isRenderBlock())) { 2145231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (repaintContainerSkipped && o == repaintContainer) 2146231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *repaintContainerSkipped = true; 21478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->parent(); 2148231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 21498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 21508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o; 21528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::isSelectionBorder() const 21558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SelectionState st = selectionState(); 21578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return st == SelectionStart || st == SelectionEnd || st == SelectionBoth; 21588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::destroy() 21618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Destroy any leftover anonymous children. 21638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObjectChildList* children = virtualChildren(); 21648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (children) 21658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian children->destroyLeftoverChildren(); 21668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 21678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If this renderer is being autoscrolled, stop the autoscroll timer 2168231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2169d0825bca7fe65beaee391d30da42e937db621564Steve Block // FIXME: RenderObject::destroy should not get called with a renderer whose document 2170231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // has a null frame, so we assert this. However, we don't want release builds to crash which is why we 2171231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // check that the frame is not null. 2172545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch ASSERT(frame()); 2173545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (frame() && frame()->eventHandler()->autoscrollRenderer() == this) 2174545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch frame()->eventHandler()->stopAutoscrollTimer(true); 21758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_hasCounterNodeMap) 21778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderCounter::destroyCounterNodes(this); 21788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2179635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (AXObjectCache::accessibilityEnabled()) { 2180635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project document()->axObjectCache()->childrenChanged(this->parent()); 21818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project document()->axObjectCache()->remove(this); 2182635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 21838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project animation()->cancelAnimations(this); 21848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // By default no ref-counting. RenderWidget::destroy() doesn't call 21868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // this function because it needs to do ref-counting. If anything 21878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // in this function changes, be sure to fix RenderWidget::destroy() as well. 21888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project remove(); 21908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // FIXME: Would like to do this in RenderBoxModelObject, but the timing is so complicated that this can't easily 21928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // be moved into RenderBoxModelObject::destroy. 21935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (hasLayer()) { 21945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian setHasLayer(false); 21958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderBoxModelObject(this)->destroyLayer(); 21965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 21978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian arenaDelete(renderArena(), this); 21988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::arenaDelete(RenderArena* arena, void* base) 22018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_style) { 22038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (const FillLayer* bgLayer = m_style->backgroundLayers(); bgLayer; bgLayer = bgLayer->next()) { 22048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (StyleImage* backgroundImage = bgLayer->image()) 22058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project backgroundImage->removeClient(this); 22068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (const FillLayer* maskLayer = m_style->maskLayers(); maskLayer; maskLayer = maskLayer->next()) { 22098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (StyleImage* maskImage = maskLayer->image()) 22108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project maskImage->removeClient(this); 22118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (StyleImage* borderImage = m_style->borderImage().image()) 22148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project borderImage->removeClient(this); 22158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (StyleImage* maskBoxImage = m_style->maskBoxImage().image()) 22178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project maskBoxImage->removeClient(this); 22188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 22218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void* savedBase = baseOfRenderObjectBeingDeleted; 22228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project baseOfRenderObjectBeingDeleted = base; 22238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 22248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete this; 22258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 22268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project baseOfRenderObjectBeingDeleted = savedBase; 22278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 22288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Recover the size left there for us by operator delete and free the memory. 22308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project arena->free(*(size_t*)base, base); 22318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianVisiblePosition RenderObject::positionForCoordinates(int x, int y) 22348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return positionForPoint(IntPoint(x, y)); 22368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianVisiblePosition RenderObject::positionForPoint(const IntPoint&) 2239635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 22408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return createVisiblePosition(caretMinOffset(), DOWNSTREAM); 2241635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 2242635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 22438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::updateDragState(bool dragOn) 22448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool valueChanged = (dragOn != m_isDragging); 22468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isDragging = dragOn; 2247a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (valueChanged && style()->affectedByDragRules() && node()) 22485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian node()->setNeedsStyleRecalc(); 22498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling()) 22508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr->updateDragState(dragOn); 22518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::hitTest(const HitTestRequest& request, HitTestResult& result, const IntPoint& point, int tx, int ty, HitTestFilter hitTestFilter) 22548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool inside = false; 22568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hitTestFilter != HitTestSelf) { 22578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // First test the foreground layer (lines and inlines). 22588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project inside = nodeAtPoint(request, result, point.x(), point.y(), tx, ty, HitTestForeground); 22598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Test floats next. 22618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!inside) 22628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project inside = nodeAtPoint(request, result, point.x(), point.y(), tx, ty, HitTestFloat); 22638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Finally test to see if the mouse is in the background (within a child block's background). 22658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!inside) 22668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project inside = nodeAtPoint(request, result, point.x(), point.y(), tx, ty, HitTestChildBlockBackgrounds); 22678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // See if the mouse is inside us but not any of our descendants 22708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hitTestFilter != HitTestDescendants && !inside) 22718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project inside = nodeAtPoint(request, result, point.x(), point.y(), tx, ty, HitTestBlockBackground); 22728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return inside; 22748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::updateHitTestResult(HitTestResult& result, const IntPoint& point) 22778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result.innerNode()) 22798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 22808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Node* n = node(); 22828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (n) { 22838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result.setInnerNode(n); 22848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!result.innerNonSharedNode()) 22858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result.setInnerNonSharedNode(n); 22868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result.setLocalPoint(point); 22878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::nodeAtPoint(const HitTestRequest&, HitTestResult&, int /*x*/, int /*y*/, int /*tx*/, int /*ty*/, HitTestAction) 22918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 22938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::scheduleRelayout() 22968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isRenderView()) { 22988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian FrameView* view = toRenderView(this)->frameView(); 22998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (view) 23008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->scheduleRelayout(); 23018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (parent()) { 23028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameView* v = view() ? view()->frameView() : 0; 23038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (v) 23048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project v->scheduleRelayoutOfSubtree(this); 23058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::layout() 23098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(needsLayout()); 23118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* child = firstChild(); 23128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while (child) { 23138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child->layoutIfNeeded(); 23148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(!child->needsLayout()); 23158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child = child->nextSibling(); 23168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 23178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian setNeedsLayout(false); 23188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<RenderStyle> RenderObject::uncachedFirstLineStyle(RenderStyle* style) const 23210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 23220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!document()->usesFirstLineRules()) 23230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return 0; 23240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 23250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(!isText()); 23260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 23270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RefPtr<RenderStyle> result; 23280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 23290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (isBlockFlow()) { 23300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (RenderBlock* firstLineBlock = this->firstLineBlock()) 23310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch result = firstLineBlock->getUncachedPseudoStyle(FIRST_LINE, style, firstLineBlock == this ? style : 0); 23320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } else if (!isAnonymous() && isRenderInline()) { 23330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RenderStyle* parentStyle = parent()->firstLineStyle(); 23340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (parentStyle != parent()->style()) 23350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch result = getUncachedPseudoStyle(FIRST_LINE_INHERITED, parentStyle, style); 23360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 23370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 23380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return result.release(); 23390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 23400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 23418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianRenderStyle* RenderObject::firstLineStyleSlowCase() const 23428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(document()->usesFirstLineRules()); 23448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderStyle* style = m_style.get(); 23468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian const RenderObject* renderer = isText() ? parent() : this; 23478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (renderer->isBlockFlow()) { 23488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (RenderBlock* firstLineBlock = renderer->firstLineBlock()) 23498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian style = firstLineBlock->getCachedPseudoStyle(FIRST_LINE, style); 23508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } else if (!renderer->isAnonymous() && renderer->isRenderInline()) { 23518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderStyle* parentStyle = renderer->parent()->firstLineStyle(); 23528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (parentStyle != renderer->parent()->style()) { 23538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // A first-line style is in effect. Cache a first-line style for ourselves. 2354bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen renderer->style()->setHasPseudoStyle(FIRST_LINE_INHERITED); 23558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian style = renderer->getCachedPseudoStyle(FIRST_LINE_INHERITED, parentStyle); 23568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 23598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return style; 23608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianRenderStyle* RenderObject::getCachedPseudoStyle(PseudoId pseudo, RenderStyle* parentStyle) const 23638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (pseudo < FIRST_INTERNAL_PSEUDOID && !style()->hasPseudoStyle(pseudo)) 23658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 23668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderStyle* cachedStyle = style()->getCachedPseudoStyle(pseudo); 23688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cachedStyle) 23698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return cachedStyle; 23708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<RenderStyle> result = getUncachedPseudoStyle(pseudo, parentStyle); 23728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result) 23738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return style()->addCachedPseudoStyle(result.release()); 23748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 23758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<RenderStyle> RenderObject::getUncachedPseudoStyle(PseudoId pseudo, RenderStyle* parentStyle, RenderStyle* ownStyle) const 23788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (pseudo < FIRST_INTERNAL_PSEUDOID && !ownStyle && !style()->hasPseudoStyle(pseudo)) 23808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 23818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!parentStyle) { 23830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(!ownStyle); 23848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project parentStyle = style(); 23850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 23868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Node* n = node(); 23888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while (n && !n->isElementNode()) 23898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian n = n->parentNode(); 23908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!n) 23918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 23928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<RenderStyle> result; 23948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (pseudo == FIRST_LINE_INHERITED) { 23958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result = document()->styleSelector()->styleForElement(static_cast<Element*>(n), parentStyle, false); 23968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result->setStyleType(FIRST_LINE_INHERITED); 23978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 23988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result = document()->styleSelector()->pseudoStyleForElement(pseudo, static_cast<Element*>(n), parentStyle); 23998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result.release(); 24008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic Color decorationColor(RenderObject* renderer) 24038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Color result; 2405dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (renderer->style()->textStrokeWidth() > 0) { 24068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Prefer stroke color if possible but not if it's fully transparent. 2407dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block result = renderer->style()->visitedDependentColor(CSSPropertyWebkitTextStrokeColor); 24088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result.alpha()) 24098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 24108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2412dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block result = renderer->style()->visitedDependentColor(CSSPropertyWebkitTextFillColor); 24138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 24148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::getTextDecorationColors(int decorations, Color& underline, Color& overline, 24178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Color& linethrough, bool quirksMode) 24188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* curr = this; 24208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project do { 24218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int currDecs = curr->style()->textDecoration(); 24228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (currDecs) { 24238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (currDecs & UNDERLINE) { 24248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project decorations &= ~UNDERLINE; 2425dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block underline = decorationColor(curr); 24268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (currDecs & OVERLINE) { 24288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project decorations &= ~OVERLINE; 2429dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block overline = decorationColor(curr); 24308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (currDecs & LINE_THROUGH) { 24328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project decorations &= ~LINE_THROUGH; 2433dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block linethrough = decorationColor(curr); 24348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr = curr->parent(); 2437e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if (curr && curr->isAnonymousBlock() && toRenderBlock(curr)->continuation()) 2438e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block curr = toRenderBlock(curr)->continuation(); 24398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } while (curr && decorations && (!quirksMode || !curr->node() || 24408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian (!curr->node()->hasTagName(aTag) && !curr->node()->hasTagName(fontTag)))); 24418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we bailed out, use the element we bailed out at (typically a <font> or <a> element). 24438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (decorations && curr) { 24448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (decorations & UNDERLINE) 2445dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block underline = decorationColor(curr); 24468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (decorations & OVERLINE) 2447dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block overline = decorationColor(curr); 24488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (decorations & LINE_THROUGH) 2449dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block linethrough = decorationColor(curr); 24508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT) 24548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::addDashboardRegions(Vector<DashboardRegionValue>& regions) 24558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Convert the style regions to absolute coordinates. 2457635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (style()->visibility() != VISIBLE || !isBox()) 24588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2459635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2460635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project RenderBox* box = toRenderBox(this); 24618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const Vector<StyleDashboardRegion>& styleRegions = style()->dashboardRegions(); 24638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned i, count = styleRegions.size(); 24648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (i = 0; i < count; i++) { 24658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project StyleDashboardRegion styleRegion = styleRegions[i]; 24668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2467635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int w = box->width(); 2468635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int h = box->height(); 24698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DashboardRegionValue region; 24718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.label = styleRegion.label; 24728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.bounds = IntRect(styleRegion.offset.left().value(), 24738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project styleRegion.offset.top().value(), 24748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project w - styleRegion.offset.left().value() - styleRegion.offset.right().value(), 24758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project h - styleRegion.offset.top().value() - styleRegion.offset.bottom().value()); 24768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.type = styleRegion.type; 24778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.clip = region.bounds; 24798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project computeAbsoluteRepaintRect(region.clip); 24808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (region.clip.height() < 0) { 24818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.clip.setHeight(0); 24828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.clip.setWidth(0); 24838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2485635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FloatPoint absPos = localToAbsolute(); 2486635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project region.bounds.setX(absPos.x() + styleRegion.offset.left().value()); 2487635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project region.bounds.setY(absPos.y() + styleRegion.offset.top().value()); 24888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2489545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (frame()) { 2490545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch float pageScaleFactor = frame()->page()->chrome()->scaleFactor(); 24918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (pageScaleFactor != 1.0f) { 24928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.bounds.scale(pageScaleFactor); 24938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.clip.scale(pageScaleFactor); 24948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project regions.append(region); 24988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::collectDashboardRegions(Vector<DashboardRegionValue>& regions) 25028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // RenderTexts don't have their own style, they just use their parent's style, 25048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // so we don't want to include them. 25058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isText()) 25068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 25078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addDashboardRegions(regions); 25098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling()) 25108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr->collectDashboardRegions(regions); 25118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 25138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::willRenderImage(CachedImage*) 25158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Without visibility we won't render (and therefore don't care about animation). 25178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (style()->visibility() != VISIBLE) 25188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 25198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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) 25218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // then we don't want to render either. 25228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return !document()->inPageCache() && !document()->view()->isOffscreen(); 25238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint RenderObject::maximalOutlineSize(PaintPhase p) const 25268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (p != PaintPhaseOutline && p != PaintPhaseSelfOutline && p != PaintPhaseChildOutlines) 25288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 25298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return toRenderView(document()->renderer())->maximalOutlineSize(); 25308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint RenderObject::caretMinOffset() const 25338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 25358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint RenderObject::caretMaxOffset() const 25388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isReplaced()) 25408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return node() ? max(1U, node()->childNodeCount()) : 1; 25418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isHR()) 25428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 1; 25438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 25448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned RenderObject::caretMaxRenderedOffset() const 25478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 25498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint RenderObject::previousOffset(int current) const 25528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return current - 1; 25548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianint RenderObject::previousOffsetForBackwardDeletion(int current) const 25578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 25588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return current - 1; 25598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 25608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint RenderObject::nextOffset(int current) const 25628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return current + 1; 25648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::adjustRectForOutlineAndShadow(IntRect& rect) const 25678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int outlineSize = outlineStyleForRepaint()->outlineSize(); 2569dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (const ShadowData* boxShadow = style()->boxShadow()) { 25705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen boxShadow->adjustRectForShadow(rect, outlineSize); 25715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return; 25725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 25738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen rect.inflate(outlineSize); 25758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectAnimationController* RenderObject::animation() const 25788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2579545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return frame()->animation(); 25808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2582635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid RenderObject::imageChanged(CachedImage* image, const IntRect* rect) 25838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2584635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project imageChanged(static_cast<WrappedImagePtr>(image), rect); 25858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianRenderBoxModelObject* RenderObject::offsetParent() const 25888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 25898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If any of the following holds true return null and stop this algorithm: 25908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // A is the root element. 25918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // A is the HTML body element. 25928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // The computed value of the position property for element A is fixed. 25938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (isRoot() || isBody() || (isPositioned() && style()->position() == FixedPosition)) 25948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return 0; 25958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If A is an area HTML element which has a map HTML element somewhere in the ancestor 25978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // chain return the nearest ancestor map HTML element and stop this algorithm. 25988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // FIXME: Implement! 25998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Return the nearest ancestor element of A for which at least one of the following is 26018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // true and stop this algorithm if such an ancestor is found: 26028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // * The computed value of the position property is not static. 26038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // * It is the HTML body element. 26048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // * The computed value of the position property of A is static and the ancestor 26058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // is one of the following HTML elements: td, th, or table. 26068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // * Our own extension: if there is a difference in the effective zoom 26078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool skipTables = isPositioned() || isRelPositioned(); 26088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian float currZoom = style()->effectiveZoom(); 26098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* curr = parent(); 26108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while (curr && (!curr->node() || 26118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian (!curr->isPositioned() && !curr->isRelPositioned() && !curr->isBody()))) { 26128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Node* element = curr->node(); 26138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!skipTables && element) { 26148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool isTableElement = element->hasTagName(tableTag) || 26158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian element->hasTagName(tdTag) || 26168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian element->hasTagName(thTag); 26178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if ENABLE(WML) 26198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!isTableElement && element->isWMLElement()) 26208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian isTableElement = element->hasTagName(WMLNames::tableTag) || 26218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian element->hasTagName(WMLNames::tdTag); 26228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 26238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (isTableElement) 26258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 26268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 26278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian float newZoom = curr->style()->effectiveZoom(); 26298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (currZoom != newZoom) 26308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 26318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian currZoom = newZoom; 26328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian curr = curr->parent(); 26338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 26348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return curr && curr->isBoxModelObject() ? toRenderBoxModelObject(curr) : 0; 26358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 26368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianVisiblePosition RenderObject::createVisiblePosition(int offset, EAffinity affinity) 26388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 2639643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If this is a non-anonymous renderer in an editable area, then it's simple. 2640643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (Node* node = this->node()) { 2641643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!node->isContentEditable()) { 2642643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If it can be found, we prefer a visually equivalent position that is editable. 2643643ca7872b450ea4efacab6188849e5aac2ba161Steve Block Position position(node, offset); 26444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Position candidate = position.downstream(CanCrossEditingBoundary); 2645643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (candidate.node()->isContentEditable()) 2646643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return VisiblePosition(candidate, affinity); 26474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang candidate = position.upstream(CanCrossEditingBoundary); 2648643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (candidate.node()->isContentEditable()) 2649643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return VisiblePosition(candidate, affinity); 2650643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 26518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return VisiblePosition(node, offset, affinity); 2652643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 26538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // We don't want to cross the boundary between editable and non-editable 26558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // regions of the document, but that is either impossible or at least 26568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // extremely unlikely in any normal case because we stop as soon as we 26578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // find a single non-anonymous renderer. 26588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Find a nearby non-anonymous renderer. 26608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* child = this; 26618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while (RenderObject* parent = child->parent()) { 26628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Find non-anonymous content after. 26638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* renderer = child; 26648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while ((renderer = renderer->nextInPreOrder(parent))) { 26658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (Node* node = renderer->node()) 26668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return VisiblePosition(node, 0, DOWNSTREAM); 26678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 26688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Find non-anonymous content before. 26708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian renderer = child; 26718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while ((renderer = renderer->previousInPreOrder())) { 26728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (renderer == parent) 26738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 26748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (Node* node = renderer->node()) 26755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return VisiblePosition(lastDeepEditingPositionForNode(node), DOWNSTREAM); 26768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 26778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Use the parent itself unless it too is anonymous. 26798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (Node* node = parent->node()) 26808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return VisiblePosition(node, 0, DOWNSTREAM); 26818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Repeat at the next level up. 26838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child = parent; 26848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 26858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Everything was anonymous. Give up. 26878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return VisiblePosition(); 26888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 26898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianVisiblePosition RenderObject::createVisiblePosition(const Position& position) 26918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 26928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (position.isNotNull()) 26938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return VisiblePosition(position); 26948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(!node()); 26968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return createVisiblePosition(0, DOWNSTREAM); 26978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 26988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG) 270021939df44de1705786c545cd1bf519d47250322dBen MurdochRenderSVGResourceContainer* RenderObject::toRenderSVGResourceContainer() 2701d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 2702d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT_NOT_REACHED(); 2703d0825bca7fe65beaee391d30da42e937db621564Steve Block return 0; 2704d0825bca7fe65beaee391d30da42e937db621564Steve Block} 27058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27065ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid RenderObject::setNeedsBoundariesUpdate() 27075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 27085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (RenderObject* renderer = parent()) 27095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen renderer->setNeedsBoundariesUpdate(); 27105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 27115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 271221939df44de1705786c545cd1bf519d47250322dBen MurdochFloatRect RenderObject::objectBoundingBox() const 2713692e5dbf12901edacf14812a6fae25462920af42Steve Block{ 2714692e5dbf12901edacf14812a6fae25462920af42Steve Block ASSERT_NOT_REACHED(); 271521939df44de1705786c545cd1bf519d47250322dBen Murdoch return FloatRect(); 2716692e5dbf12901edacf14812a6fae25462920af42Steve Block} 2717692e5dbf12901edacf14812a6fae25462920af42Steve Block 271821939df44de1705786c545cd1bf519d47250322dBen MurdochFloatRect RenderObject::strokeBoundingBox() const 27198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 27205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ASSERT_NOT_REACHED(); 27215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return FloatRect(); 27225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 27235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 27245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// Returns the smallest rectangle enclosing all of the painted content 27255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// respecting clipping, masking, filters, opacity, stroke-width and markers 27265f1ab04193ad0130ca8204aadaceae083aca9881Feng QianFloatRect RenderObject::repaintRectInLocalCoordinates() const 27275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 27285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ASSERT_NOT_REACHED(); 27298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return FloatRect(); 27308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 27318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27328a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockAffineTransform RenderObject::localTransform() const 27338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 27348a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block static const AffineTransform identity; 2735d0825bca7fe65beaee391d30da42e937db621564Steve Block return identity; 27368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 27378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27388a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockconst AffineTransform& RenderObject::localToParentTransform() const 27395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 27408a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block static const AffineTransform identity; 2741d0825bca7fe65beaee391d30da42e937db621564Steve Block return identity; 27425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 27435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 27445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool RenderObject::nodeAtFloatPoint(const HitTestRequest&, HitTestResult&, const FloatPoint&, HitTestAction) 27455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 27465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ASSERT_NOT_REACHED(); 27475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return false; 27485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 27495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 27508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(SVG) 27518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 27538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 27558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid showTree(const WebCore::RenderObject* ro) 27578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 27588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ro) 27598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ro->showTreeForThis(); 27608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 27618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2762643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid showRenderTree(const WebCore::RenderObject* object1) 2763643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 2764643ca7872b450ea4efacab6188849e5aac2ba161Steve Block showRenderTree(object1, 0); 2765643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 2766643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 2767643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid showRenderTree(const WebCore::RenderObject* object1, const WebCore::RenderObject* object2) 2768643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 2769643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (object1) { 2770643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const WebCore::RenderObject* root = object1; 2771643ca7872b450ea4efacab6188849e5aac2ba161Steve Block while (root->parent()) 2772643ca7872b450ea4efacab6188849e5aac2ba161Steve Block root = root->parent(); 2773643ca7872b450ea4efacab6188849e5aac2ba161Steve Block root->showRenderTreeAndMark(object1, "*", object2, "-", 0); 2774643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 2775643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 2776643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 27778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2778