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) 62fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 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" 342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "CursorList.h" 35ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include "DashArray.h" 364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "EditingBoundary.h" 37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "FloatQuad.h" 388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "Frame.h" 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h" 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h" 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h" 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HitTestResult.h" 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h" 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderArena.h" 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderCounter.h" 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderFlexibleBox.h" 475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "RenderImage.h" 485ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "RenderImageResourceStyleImage.h" 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderInline.h" 50545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "RenderLayer.h" 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderListItem.h" 52643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "RenderRuby.h" 53643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "RenderRubyText.h" 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderTableCell.h" 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderTableCol.h" 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderTableRow.h" 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderTheme.h" 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderView.h" 598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "TransformState.h" 60231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "htmlediting.h" 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <algorithm> 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_LAYOUT 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h" 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <stdio.h> 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/RefCountedLeakCounter.h> 678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include <wtf/UnusedParam.h> 688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if USE(ACCELERATED_COMPOSITING) 708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "RenderLayerCompositor.h" 718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 73635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML) 74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WMLNames.h" 75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 76635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 77d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(SVG) 7821939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "RenderSVGResourceContainer.h" 79d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "SVGRenderSupport.h" 80d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 81d0825bca7fe65beaee391d30da42e937db621564Steve Block 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace std; 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames; 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void* baseOfRenderObjectBeingDeleted; 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::s_affectsParentBlock = false; 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid* RenderObject::operator new(size_t sz, RenderArena* renderArena) throw() 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return renderArena->allocate(sz); 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::operator delete(void* ptr, size_t sz) 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(baseOfRenderObjectBeingDeleted == ptr); 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Stash size where destroy can find it. 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *(size_t *)ptr = sz; 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::createObject(Node* node, RenderStyle* style) 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Document* doc = node->document(); 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderArena* arena = doc->renderArena(); 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Minimal support for content properties replacing an entire element. 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Works only if we have exactly one piece of content and it's a URL. 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Otherwise acts as if we didn't support this feature. 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ContentData* contentData = style->contentData(); 1168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (contentData && !contentData->next() && contentData->isImage() && doc != node) { 1175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen RenderImage* image = new (arena) RenderImage(node); 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project image->setStyle(style); 1198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (StyleImage* styleImage = contentData->image()) 1205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen image->setImageResource(RenderImageResourceStyleImage::create(styleImage)); 1215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen else 1225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen image->setImageResource(RenderImageResource::create()); 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return image; 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (node->hasTagName(rubyTag)) { 127643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (style->display() == INLINE) 128643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderRubyAsInline(node); 129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block else if (style->display() == BLOCK) 130643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderRubyAsBlock(node); 131643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 132643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // treat <rt> as ruby text ONLY if it still has its default treatment of block 133643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (node->hasTagName(rtTag) && style->display() == BLOCK) 134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return new (arena) RenderRubyText(node); 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (style->display()) { 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NONE: 138643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case INLINE: 140643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderInline(node); 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BLOCK: 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case INLINE_BLOCK: 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case RUN_IN: 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case COMPACT: 145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderBlock(node); 146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case LIST_ITEM: 147643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderListItem(node); 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE: 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case INLINE_TABLE: 150643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderTable(node); 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_ROW_GROUP: 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_HEADER_GROUP: 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_FOOTER_GROUP: 154643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderTableSection(node); 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_ROW: 156643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderTableRow(node); 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_COLUMN_GROUP: 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_COLUMN: 159643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderTableCol(node); 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_CELL: 161643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderTableCell(node); 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TABLE_CAPTION: 163231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS) 164231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // As per the section 17.1 of the spec WAP-239-WCSS-20011026-a.pdf, 165231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // the marquee box inherits and extends the characteristics of the 166231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // principal block box ([CSS2] section 9.2.1). 167231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block case WAP_MARQUEE: 168231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 169643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderBlock(node); 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BOX: 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case INLINE_BOX: 172643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return new (arena) RenderFlexibleBox(node); 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 175643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic WTF::RefCountedLeakCounter renderObjectCounter("RenderObject"); 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject::RenderObject(Node* node) 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : CachedResourceClient() 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_style(0) 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_node(node) 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_parent(0) 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_previous(0) 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_next(0) 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasAXObject(false) 191635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_setNeedsLayoutForbidden(false) 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_needsLayout(false) 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_needsPositionedMovementLayout(false) 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_normalChildNeedsLayout(false) 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_posChildNeedsLayout(false) 1972bde8e466a4451c7319e3a072d118917957d6554Steve Block , m_needsSimplifiedNormalFlowLayout(false) 198bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen , m_preferredLogicalWidthsDirty(false) 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_floating(false) 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_positioned(false) 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_relPositioned(false) 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_paintBackground(false) 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_isAnonymous(node == node->document()) 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_isText(false) 205635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_isBox(false) 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_inline(true) 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_replaced(false) 2082bde8e466a4451c7319e3a072d118917957d6554Steve Block , m_horizontalWritingMode(true) 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_isDragging(false) 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasLayer(false) 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasOverflowClip(false) 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasTransform(false) 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasReflection(false) 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasOverrideSize(false) 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasCounterNodeMap(false) 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_everHadLayout(false) 2178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian , m_childrenInline(false) 218bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen , m_marginBeforeQuirk(false) 219bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen , m_marginAfterQuirk(false) 2208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian , m_hasMarkupTruncation(false) 2218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian , m_selectionState(SelectionNone) 2228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian , m_hasColumns(false) 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project renderObjectCounter.increment(); 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(node); 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject::~RenderObject() 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 232545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch ASSERT(!node() || documentBeingDestroyed() || !frame()->view() || frame()->view()->layoutRoot() != this); 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!m_hasAXObject); 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project renderObjectCounter.decrement(); 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochRenderTheme* RenderObject::theme() const 2400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 2410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(document()->page()); 2420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return document()->page()->theme(); 2440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 2450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::isDescendantOf(const RenderObject* obj) const 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (const RenderObject* r = this; r; r = r->m_parent) { 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (r == obj) 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::isBody() const 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return node() && node()->hasTagName(bodyTag); 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::isHR() const 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return node() && node()->hasTagName(hrTag); 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerbool RenderObject::isLegend() const 2666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 2676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return node() && (node()->hasTagName(legendTag) 2686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#if ENABLE(WML) 2696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner || node()->hasTagName(WMLNames::insertedLegendTag) 2706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#endif 2716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner ); 2726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 2736b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::isHTMLMarquee() const 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return node() && node()->renderer() == this && node()->hasTagName(marqueeTag); 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::addChild(RenderObject* newChild, RenderObject* beforeChild) 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObjectChildList* children = virtualChildren(); 2828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(children); 2838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!children) 2848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool needsTable = false; 2878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 288dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (newChild->isTableCol() && newChild->style()->display() == TABLE_COLUMN_GROUP) 2898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian needsTable = !isTable(); 2908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if (newChild->isRenderBlock() && newChild->style()->display() == TABLE_CAPTION) 2918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian needsTable = !isTable(); 2928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if (newChild->isTableSection()) 2938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian needsTable = !isTable(); 2948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if (newChild->isTableRow()) 2958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian needsTable = !isTableSection(); 2968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if (newChild->isTableCell()) { 2978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian needsTable = !isTableRow(); 2988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // I'm not 100% sure this is the best way to fix this, but without this 2998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // change we recurse infinitely when trying to render the CSS2 test page: 3008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // http://www.bath.ac.uk/%7Epy8ieh/internet/eviltests/htmlbodyheadrendering2.html. 3018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // See Radar 2925291. 3028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (needsTable && isTableCell() && !children->firstChild() && !newChild->isTableCell()) 3038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian needsTable = false; 3048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (needsTable) { 3078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderTable* table; 3088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* afterChild = beforeChild ? beforeChild->previousSibling() : children->lastChild(); 3098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (afterChild && afterChild->isAnonymous() && afterChild->isTable()) 3100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch table = toRenderTable(afterChild); 3118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else { 3128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian table = new (renderArena()) RenderTable(document() /* is anonymous */); 3138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RefPtr<RenderStyle> newStyle = RenderStyle::create(); 3148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian newStyle->inheritFrom(style()); 3158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian newStyle->setDisplay(TABLE); 3168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian table->setStyle(newStyle.release()); 3178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian addChild(table, beforeChild); 3188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian table->addChild(newChild); 3208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } else { 3218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Just add it... 3228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian children->insertChildNode(this, newChild, beforeChild); 3238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (newChild->isText() && newChild->style()->textTransform() == CAPITALIZE) { 3258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RefPtr<StringImpl> textToTransform = toRenderText(newChild)->originalText(); 3268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (textToTransform) 3278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderText(newChild)->setText(textToTransform.release(), true); 3288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::removeChild(RenderObject* oldChild) 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObjectChildList* children = virtualChildren(); 3348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(children); 3358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!children) 3368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // We do this here instead of in removeChildNode, since the only extremely low-level uses of remove/appendChildNode 3398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // cannot affect the positioned object list, and the floating object list is irrelevant (since the list gets cleared on 3408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // layout anyway). 3418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (oldChild->isFloatingOrPositioned()) 3428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderBox(oldChild)->removeFloatingOrPositionedChildFromBlockLists(); 3438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian children->removeChildNode(this, oldChild); 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::nextInPreOrder() const 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (RenderObject* o = firstChild()) 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o; 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nextInPreOrderAfterChildren(); 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::nextInPreOrderAfterChildren() const 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* o; 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!(o = nextSibling())) { 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = parent(); 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (o && !o->nextSibling()) 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->parent(); 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (o) 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->nextSibling(); 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o; 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3699a26d18f4c7e98b479be700575d003f873214550John ReckRenderObject* RenderObject::nextInPreOrder(const RenderObject* stayWithin) const 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (RenderObject* o = firstChild()) 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o; 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nextInPreOrderAfterChildren(stayWithin); 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3779a26d18f4c7e98b479be700575d003f873214550John ReckRenderObject* RenderObject::nextInPreOrderAfterChildren(const RenderObject* stayWithin) const 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (this == stayWithin) 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 382d0825bca7fe65beaee391d30da42e937db621564Steve Block const RenderObject* current = this; 383d0825bca7fe65beaee391d30da42e937db621564Steve Block RenderObject* next; 384d0825bca7fe65beaee391d30da42e937db621564Steve Block while (!(next = current->nextSibling())) { 385d0825bca7fe65beaee391d30da42e937db621564Steve Block current = current->parent(); 386d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!current || current == stayWithin) 387d0825bca7fe65beaee391d30da42e937db621564Steve Block return 0; 3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 389d0825bca7fe65beaee391d30da42e937db621564Steve Block return next; 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::previousInPreOrder() const 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (RenderObject* o = previousSibling()) { 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (o->lastChild()) 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->lastChild(); 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o; 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return parent(); 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::childAt(unsigned index) const 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* child = firstChild(); 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned i = 0; child && i < index; i++) 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project child = child->nextSibling(); 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return child; 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::firstLeafChild() const 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* r = firstChild(); 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (r) { 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* n = 0; 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project n = r->firstChild(); 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!n) 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project r = n; 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return r; 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* RenderObject::lastLeafChild() const 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* r = lastChild(); 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (r) { 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* n = 0; 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project n = r->lastChild(); 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!n) 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project r = n; 4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return r; 4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void addLayers(RenderObject* obj, RenderLayer* parentLayer, RenderObject*& newObject, 4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderLayer*& beforeChild) 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (obj->hasLayer()) { 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!beforeChild && newObject) { 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We need to figure out the layer that follows newObject. We only do 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // this the first time we find a child layer, and then we update the 4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // pointer values for newObject and beforeChild used by everyone else. 4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project beforeChild = newObject->parent()->findNextLayer(parentLayer, newObject); 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newObject = 0; 4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian parentLayer->addChild(toRenderBoxModelObject(obj)->layer(), beforeChild); 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RenderObject* curr = obj->firstChild(); curr; curr = curr->nextSibling()) 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addLayers(curr, parentLayer, newObject, beforeChild); 4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::addLayers(RenderLayer* parentLayer, RenderObject* newObject) 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!parentLayer) 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* object = newObject; 4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderLayer* beforeChild = 0; 4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCore::addLayers(this, parentLayer, object, beforeChild); 4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::removeLayers(RenderLayer* parentLayer) 4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!parentLayer) 4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hasLayer()) { 4728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian parentLayer->removeChild(toRenderBoxModelObject(this)->layer()); 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling()) 4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr->removeLayers(parentLayer); 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::moveLayers(RenderLayer* oldParent, RenderLayer* newParent) 4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!newParent) 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hasLayer()) { 4868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderLayer* layer = toRenderBoxModelObject(this)->layer(); 4875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ASSERT(oldParent == layer->parent()); 4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (oldParent) 489635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project oldParent->removeChild(layer); 490635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project newParent->addChild(layer); 4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling()) 4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr->moveLayers(oldParent, newParent); 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderLayer* RenderObject::findNextLayer(RenderLayer* parentLayer, RenderObject* startPoint, 4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool checkParent) 5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Error check the parent layer passed in. If it's null, we can't find anything. 5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!parentLayer) 5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Step 1: If our layer is a child of the desired parent, then return our layer. 5068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderLayer* ourLayer = hasLayer() ? toRenderBoxModelObject(this)->layer() : 0; 5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ourLayer && ourLayer->parent() == parentLayer) 5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ourLayer; 5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Step 2: If we don't have a layer, or our layer is the desired parent, then descend 5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // into our siblings trying to find the next layer whose parent is the desired parent. 5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!ourLayer || ourLayer == parentLayer) { 5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RenderObject* curr = startPoint ? startPoint->nextSibling() : firstChild(); 5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr; curr = curr->nextSibling()) { 5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderLayer* nextLayer = curr->findNextLayer(parentLayer, 0, false); 5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (nextLayer) 5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nextLayer; 5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Step 3: If our layer is the desired parent layer, then we're finished. We didn't 5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // find anything. 5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (parentLayer == ourLayer) 5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Step 4: If |checkParent| is set, climb up to our parent and check its siblings that 5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // follow us to see if we can locate a layer. 5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (checkParent && parent()) 5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return parent()->findNextLayer(parentLayer, this, true); 5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderLayer* RenderObject::enclosingLayer() const 5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const RenderObject* curr = this; 5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (curr) { 5388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderLayer* layer = curr->hasLayer() ? toRenderBoxModelObject(curr)->layer() : 0; 5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (layer) 5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return layer; 5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr = curr->parent(); 5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 546635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectRenderBox* RenderObject::enclosingBox() const 5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 548635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project RenderObject* curr = const_cast<RenderObject*>(this); 549635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project while (curr) { 550635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (curr->isBox()) 551635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return toRenderBox(curr); 5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr = curr->parent(); 5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 555635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT_NOT_REACHED(); 556635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return 0; 5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 559e458d70a0d18538346f41b503114c9ebe6b2ce12Leon ClarkeRenderBoxModelObject* RenderObject::enclosingBoxModelObject() const 560e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{ 561e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke RenderObject* curr = const_cast<RenderObject*>(this); 562e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke while (curr) { 563e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (curr->isBoxModelObject()) 564e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return toRenderBoxModelObject(curr); 565e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke curr = curr->parent(); 566e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke } 567e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 568e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke ASSERT_NOT_REACHED(); 569e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return 0; 570e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke} 571e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 572635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectRenderBlock* RenderObject::firstLineBlock() const 5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 574635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return 0; 5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 577bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid RenderObject::setPreferredLogicalWidthsDirty(bool b, bool markParents) 5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 579bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen bool alreadyDirty = m_preferredLogicalWidthsDirty; 580bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_preferredLogicalWidthsDirty = b; 5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (b && !alreadyDirty && markParents && (isText() || (style()->position() != FixedPosition && style()->position() != AbsolutePosition))) 582bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen invalidateContainerPreferredLogicalWidths(); 5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 585bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid RenderObject::invalidateContainerPreferredLogicalWidths() 5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // In order to avoid pathological behavior when inlines are deeply nested, we do include them 5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // in the chain that we mark dirty (even though they're kind of irrelevant). 5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* o = isTableCell() ? containingBlock() : container(); 590bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen while (o && !o->m_preferredLogicalWidthsDirty) { 5918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Don't invalidate the outermost object of an unrooted subtree. That object will be 5928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // invalidated when the subtree is added to the document. 5938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* container = o->isTableCell() ? o->containingBlock() : o->container(); 5948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!container && !o->isRenderView()) 5958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 5968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 597bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen o->m_preferredLogicalWidthsDirty = true; 5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (o->style()->position() == FixedPosition || o->style()->position() == AbsolutePosition) 5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // A positioned object has no effect on the min/max width of its containing block ever. 6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We can optimize this case and not go up any further. 6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 6028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian o = container; 6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::setLayerNeedsFullRepaint() 6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(hasLayer()); 6098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderBoxModelObject(this)->layer()->setNeedsFullRepaint(true); 6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderBlock* RenderObject::containingBlock() const 6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isTableCell()) { 6150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch const RenderTableCell* cell = toRenderTableCell(this); 6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (parent() && cell->section()) 6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return cell->table(); 6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isRenderView()) 6228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return const_cast<RenderView*>(toRenderView(this)); 6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* o = parent(); 6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!isText() && m_style->position() == FixedPosition) { 6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (o && !o->isRenderView() && !(o->hasTransform() && o->isRenderBlock())) 6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->parent(); 6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (!isText() && m_style->position() == AbsolutePosition) { 6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (o && (o->style()->position() == StaticPosition || (o->isInline() && !o->isReplaced())) && !o->isRenderView() && !(o->hasTransform() && o->isRenderBlock())) { 6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For relpositioned inlines, we return the nearest enclosing block. We don't try 6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // to return the inline itself. This allows us to avoid having a positioned objects 6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // list in all RenderInlines and lets us return a strongly-typed RenderBlock* result 6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // from this method. The container() method can actually be used to obtain the 6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // inline directly. 6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (o->style()->position() == RelativePosition && o->isInline() && !o->isReplaced()) 6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o->containingBlock(); 637231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(SVG) 638231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (o->isSVGForeignObject()) //foreignObject is the containing block for contents inside it 639231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block break; 640231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 641231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->parent(); 6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (o && ((o->isInline() && !o->isReplaced()) || o->isTableRow() || o->isTableSection() 6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project || o->isTableCol() || o->isFrameSet() || o->isMedia() 6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG) 6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project || o->isSVGContainer() || o->isSVGRoot() 6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project )) 6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->parent(); 6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!o || !o->isRenderBlock()) 655643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; // This can still happen in case of an orphaned tree 6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return toRenderBlock(o); 6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool mustRepaintFillLayers(const RenderObject* renderer, const FillLayer* layer) 6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Nobody will use multiple layers without wanting fancy positioning. 6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (layer->next()) 6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Make sure we have a valid image. 6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project StyleImage* img = layer->image(); 6680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!img || !img->canRender(renderer->style()->effectiveZoom())) 6690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return false; 6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!layer->xPosition().isZero() || !layer->yPosition().isZero()) 6720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return true; 6730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 674231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (layer->size().type == SizeLength) { 675231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (layer->size().size.width().isPercent() || layer->size().size.height().isPercent()) 6760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return true; 677231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } else if (layer->size().type == Contain || layer->size().type == Cover || img->usesImageContainerSize()) 6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::mustRepaintBackgroundOrBorder() const 6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hasMask() && mustRepaintFillLayers(this, style()->maskLayers())) 6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we don't have a background/border/mask, then nothing to do. 6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!hasBoxDecorations()) 6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (mustRepaintFillLayers(this, style()->backgroundLayers())) 6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Our fill layers are ok. Let's check border. 6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (style()->hasBorder()) { 6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Border images are not ok. 6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project StyleImage* borderImage = style()->borderImage().image(); 6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool shouldPaintBorderImage = borderImage && borderImage->canRender(style()->effectiveZoom()); 7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the image hasn't loaded, we're still using the normal border style. 7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (shouldPaintBorderImage && borderImage->isLoaded()) 7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::drawLineForBoxSide(GraphicsContext* graphicsContext, int x1, int y1, int x2, int y2, 7102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch BoxSide side, Color color, EBorderStyle style, 7112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch int adjacentWidth1, int adjacentWidth2, bool antialias) 7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch int width = (side == BSTop || side == BSBottom ? y2 - y1 : x2 - x1); 7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (style == DOUBLE && width < 3) 7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project style = SOLID; 7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (style) { 7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BNONE: 7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BHIDDEN: 7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DOTTED: 7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DASHED: 7242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch graphicsContext->setStrokeColor(color, m_style->colorSpace()); 7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->setStrokeThickness(width); 7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->setStrokeStyle(style == DASHED ? DashedStroke : DottedStroke); 7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (width > 0) { 7292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool wasAntialiased = graphicsContext->shouldAntialias(); 7302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch graphicsContext->setShouldAntialias(antialias); 7312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 7322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch switch (side) { 7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSBottom: 7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSTop: 7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawLine(IntPoint(x1, (y1 + y2) / 2), IntPoint(x2, (y1 + y2) / 2)); 7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSRight: 7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSLeft: 7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawLine(IntPoint((x1 + x2) / 2, y1), IntPoint((x1 + x2) / 2, y2)); 7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch graphicsContext->setShouldAntialias(wasAntialiased); 7432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DOUBLE: { 7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int third = (width + 1) / 3; 7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (adjacentWidth1 == 0 && adjacentWidth2 == 0) { 7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->setStrokeStyle(NoStroke); 7502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch graphicsContext->setFillColor(color, m_style->colorSpace()); 7512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 7522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool wasAntialiased = graphicsContext->shouldAntialias(); 7532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch graphicsContext->setShouldAntialias(antialias); 7542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 7552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch switch (side) { 7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSTop: 7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSBottom: 7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x1, y1, x2 - x1, third)); 7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x1, y2 - third, x2 - x1, third)); 7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSLeft: 7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x1, y1 + 1, third, y2 - y1 - 1)); 7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x2 - third, y1 + 1, third, y2 - y1 - 1)); 7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSRight: 7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x1, y1 + 1, third, y2 - y1 - 1)); 7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x2 - third, y1 + 1, third, y2 - y1 - 1)); 7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 7712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch graphicsContext->setShouldAntialias(wasAntialiased); 7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 7732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch int adjacent1BigThird = ((adjacentWidth1 > 0) ? adjacentWidth1 + 1 : adjacentWidth1 - 1) / 3; 7742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch int adjacent2BigThird = ((adjacentWidth2 > 0) ? adjacentWidth2 + 1 : adjacentWidth2 - 1) / 3; 7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch switch (side) { 7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSTop: 7782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch drawLineForBoxSide(graphicsContext, x1 + max((-adjacentWidth1 * 2 + 1) / 3, 0), 7792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch y1, x2 - max((-adjacentWidth2 * 2 + 1) / 3, 0), y1 + third, 7802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch side, color, SOLID, adjacent1BigThird, adjacent2BigThird, antialias); 7812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch drawLineForBoxSide(graphicsContext, x1 + max((adjacentWidth1 * 2 + 1) / 3, 0), 7822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch y2 - third, x2 - max((adjacentWidth2 * 2 + 1) / 3, 0), y2, 7832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch side, color, SOLID, adjacent1BigThird, adjacent2BigThird, antialias); 7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSLeft: 7862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch drawLineForBoxSide(graphicsContext, x1, y1 + max((-adjacentWidth1 * 2 + 1) / 3, 0), 7872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch x1 + third, y2 - max((-adjacentWidth2 * 2 + 1) / 3, 0), 7882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch side, color, SOLID, adjacent1BigThird, adjacent2BigThird, antialias); 7892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch drawLineForBoxSide(graphicsContext, x2 - third, y1 + max((adjacentWidth1 * 2 + 1) / 3, 0), 7902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch x2, y2 - max((adjacentWidth2 * 2 + 1) / 3, 0), 7912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch side, color, SOLID, adjacent1BigThird, adjacent2BigThird, antialias); 7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSBottom: 7942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch drawLineForBoxSide(graphicsContext, x1 + max((adjacentWidth1 * 2 + 1) / 3, 0), 7952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch y1, x2 - max((adjacentWidth2 * 2 + 1) / 3, 0), y1 + third, 7962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch side, color, SOLID, adjacent1BigThird, adjacent2BigThird, antialias); 7972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch drawLineForBoxSide(graphicsContext, x1 + max((-adjacentWidth1 * 2 + 1) / 3, 0), 7982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch y2 - third, x2 - max((-adjacentWidth2 * 2 + 1) / 3, 0), y2, 7992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch side, color, SOLID, adjacent1BigThird, adjacent2BigThird, antialias); 8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSRight: 8022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch drawLineForBoxSide(graphicsContext, x1, y1 + max((adjacentWidth1 * 2 + 1) / 3, 0), 8032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch x1 + third, y2 - max((adjacentWidth2 * 2 + 1) / 3, 0), 8042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch side, color, SOLID, adjacent1BigThird, adjacent2BigThird, antialias); 8052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch drawLineForBoxSide(graphicsContext, x2 - third, y1 + max((-adjacentWidth1 * 2 + 1) / 3, 0), 8062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch x2, y2 - max((-adjacentWidth2 * 2 + 1) / 3, 0), 8072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch side, color, SOLID, adjacent1BigThird, adjacent2BigThird, antialias); 8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case RIDGE: 8162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch case GROOVE: { 8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EBorderStyle s1; 8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EBorderStyle s2; 8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (style == GROOVE) { 8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s1 = INSET; 8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s2 = OUTSET; 8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s1 = OUTSET; 8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s2 = INSET; 8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch int adjacent1BigHalf = ((adjacentWidth1 > 0) ? adjacentWidth1 + 1 : adjacentWidth1 - 1) / 2; 8282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch int adjacent2BigHalf = ((adjacentWidth2 > 0) ? adjacentWidth2 + 1 : adjacentWidth2 - 1) / 2; 8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch switch (side) { 8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSTop: 8322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch drawLineForBoxSide(graphicsContext, x1 + max(-adjacentWidth1, 0) / 2, y1, x2 - max(-adjacentWidth2, 0) / 2, (y1 + y2 + 1) / 2, 8332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch side, color, s1, adjacent1BigHalf, adjacent2BigHalf, antialias); 8342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch drawLineForBoxSide(graphicsContext, x1 + max(adjacentWidth1 + 1, 0) / 2, (y1 + y2 + 1) / 2, x2 - max(adjacentWidth2 + 1, 0) / 2, y2, 8352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch side, color, s2, adjacentWidth1 / 2, adjacentWidth2 / 2, antialias); 8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSLeft: 8382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch drawLineForBoxSide(graphicsContext, x1, y1 + max(-adjacentWidth1, 0) / 2, (x1 + x2 + 1) / 2, y2 - max(-adjacentWidth2, 0) / 2, 8392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch side, color, s1, adjacent1BigHalf, adjacent2BigHalf, antialias); 8402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch drawLineForBoxSide(graphicsContext, (x1 + x2 + 1) / 2, y1 + max(adjacentWidth1 + 1, 0) / 2, x2, y2 - max(adjacentWidth2 + 1, 0) / 2, 8412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch side, color, s2, adjacentWidth1 / 2, adjacentWidth2 / 2, antialias); 8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSBottom: 8442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch drawLineForBoxSide(graphicsContext, x1 + max(adjacentWidth1, 0) / 2, y1, x2 - max(adjacentWidth2, 0) / 2, (y1 + y2 + 1) / 2, 8452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch side, color, s2, adjacent1BigHalf, adjacent2BigHalf, antialias); 8462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch drawLineForBoxSide(graphicsContext, x1 + max(-adjacentWidth1 + 1, 0) / 2, (y1 + y2 + 1) / 2, x2 - max(-adjacentWidth2 + 1, 0) / 2, y2, 8472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch side, color, s1, adjacentWidth1 / 2, adjacentWidth2 / 2, antialias); 8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSRight: 8502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch drawLineForBoxSide(graphicsContext, x1, y1 + max(adjacentWidth1, 0) / 2, (x1 + x2 + 1) / 2, y2 - max(adjacentWidth2, 0) / 2, 8512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch side, color, s2, adjacent1BigHalf, adjacent2BigHalf, antialias); 8522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch drawLineForBoxSide(graphicsContext, (x1 + x2 + 1) / 2, y1 + max(-adjacentWidth1 + 1, 0) / 2, x2, y2 - max(-adjacentWidth2 + 1, 0) / 2, 8532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch side, color, s1, adjacentWidth1 / 2, adjacentWidth2 / 2, antialias); 8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case INSET: 8592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // FIXME: Maybe we should lighten the colors on one side like Firefox. 8602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // https://bugs.webkit.org/show_bug.cgi?id=58608 8612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (side == BSTop || side == BSLeft) 8622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch color = color.dark(); 8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // fall through 8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case OUTSET: 8652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (style == OUTSET && (side == BSBottom || side == BSRight)) 8662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch color = color.dark(); 8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // fall through 8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case SOLID: { 8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->setStrokeStyle(NoStroke); 8702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch graphicsContext->setFillColor(color, m_style->colorSpace()); 8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(x2 >= x1); 8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(y2 >= y1); 8732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!adjacentWidth1 && !adjacentWidth2) { 8742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Turn off antialiasing to match the behavior of drawConvexPolygon(); 8752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // this matters for rects in transformed contexts. 8762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool wasAntialiased = graphicsContext->shouldAntialias(); 8772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch graphicsContext->setShouldAntialias(antialias); 8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project graphicsContext->drawRect(IntRect(x1, y1, x2 - x1, y2 - y1)); 8792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch graphicsContext->setShouldAntialias(wasAntialiased); 8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FloatPoint quad[4]; 8832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch switch (side) { 8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSTop: 8852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch quad[0] = FloatPoint(x1 + max(-adjacentWidth1, 0), y1); 8862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch quad[1] = FloatPoint(x1 + max(adjacentWidth1, 0), y2); 8872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch quad[2] = FloatPoint(x2 - max(adjacentWidth2, 0), y2); 8882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch quad[3] = FloatPoint(x2 - max(-adjacentWidth2, 0), y1); 8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSBottom: 8912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch quad[0] = FloatPoint(x1 + max(adjacentWidth1, 0), y1); 8922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch quad[1] = FloatPoint(x1 + max(-adjacentWidth1, 0), y2); 8932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch quad[2] = FloatPoint(x2 - max(-adjacentWidth2, 0), y2); 8942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch quad[3] = FloatPoint(x2 - max(adjacentWidth2, 0), y1); 8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSLeft: 8972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch quad[0] = FloatPoint(x1, y1 + max(-adjacentWidth1, 0)); 8982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch quad[1] = FloatPoint(x1, y2 - max(-adjacentWidth2, 0)); 8992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch quad[2] = FloatPoint(x2, y2 - max(adjacentWidth2, 0)); 9002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch quad[3] = FloatPoint(x2, y1 + max(adjacentWidth1, 0)); 9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 9028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BSRight: 9032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch quad[0] = FloatPoint(x1, y1 + max(adjacentWidth1, 0)); 9042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch quad[1] = FloatPoint(x1, y2 - max(adjacentWidth2, 0)); 9052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch quad[2] = FloatPoint(x2, y2 - max(-adjacentWidth2, 0)); 9062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch quad[3] = FloatPoint(x2, y1 + max(-adjacentWidth1, 0)); 9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 9102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch graphicsContext->drawConvexPolygon(4, quad, antialias); 9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 916ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve BlockIntRect RenderObject::borderInnerRect(const IntRect& borderRect, unsigned short topWidth, unsigned short bottomWidth, unsigned short leftWidth, unsigned short rightWidth) const 917ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{ 918ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return IntRect( 919ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block borderRect.x() + leftWidth, 920ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block borderRect.y() + topWidth, 921ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block borderRect.width() - leftWidth - rightWidth, 922ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block borderRect.height() - topWidth - bottomWidth); 923ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block} 924ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 9252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if !HAVE(PATH_BASED_BORDER_RADIUS_DRAWING) 9262bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid RenderObject::drawArcForBoxSide(GraphicsContext* graphicsContext, int x, int y, float thickness, const IntSize& radius, 9272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch int angleStart, int angleSpan, BoxSide s, Color color, 9288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian EBorderStyle style, bool firstCorner) 9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 930ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // FIXME: This function should be removed when all ports implement GraphicsContext::clipConvexPolygon()!! 931ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // At that time, everyone can use RenderObject::drawBoxSideFromPath() instead. This should happen soon. 9328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if ((style == DOUBLE && thickness / 2 < 3) || ((style == RIDGE || style == GROOVE) && thickness / 2 < 2)) 9338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian style = SOLID; 9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian switch (style) { 9368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case BNONE: 9378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case BHIDDEN: 9388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 9398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case DOTTED: 9408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case DASHED: 9412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch graphicsContext->setStrokeColor(color, m_style->colorSpace()); 9428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeStyle(style == DOTTED ? DottedStroke : DashedStroke); 9438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeThickness(thickness); 9448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->strokeArc(IntRect(x, y, radius.width() * 2, radius.height() * 2), angleStart, angleSpan); 9458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 9468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case DOUBLE: { 9478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian float third = thickness / 3.0f; 9488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian float innerThird = (thickness + 1.0f) / 6.0f; 9498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int shiftForInner = static_cast<int>(innerThird * 2.5f); 9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int outerY = y; 9528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int outerHeight = radius.height() * 2; 9538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int innerX = x + shiftForInner; 9548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int innerY = y + shiftForInner; 9558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int innerWidth = (radius.width() - shiftForInner) * 2; 9568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int innerHeight = (radius.height() - shiftForInner) * 2; 9578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (innerThird > 1 && (s == BSTop || (firstCorner && (s == BSLeft || s == BSRight)))) { 9588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian outerHeight += 2; 9598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian innerHeight += 2; 9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeStyle(SolidStroke); 9632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch graphicsContext->setStrokeColor(color, m_style->colorSpace()); 9648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeThickness(third); 9658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->strokeArc(IntRect(x, outerY, radius.width() * 2, outerHeight), angleStart, angleSpan); 9668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeThickness(innerThird > 2 ? innerThird - 1 : innerThird); 9678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->strokeArc(IntRect(innerX, innerY, innerWidth, innerHeight), angleStart, angleSpan); 9688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case GROOVE: 9718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case RIDGE: { 9728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Color c2; 9738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if ((style == RIDGE && (s == BSTop || s == BSLeft)) || 9748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian (style == GROOVE && (s == BSBottom || s == BSRight))) 9752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch c2 = color.dark(); 9768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else { 9772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch c2 = color; 9782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch color = color.dark(); 9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeStyle(SolidStroke); 9822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch graphicsContext->setStrokeColor(color, m_style->colorSpace()); 9838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeThickness(thickness); 9848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->strokeArc(IntRect(x, y, radius.width() * 2, radius.height() * 2), angleStart, angleSpan); 9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian float halfThickness = (thickness + 1.0f) / 4.0f; 9878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int shiftForInner = static_cast<int>(halfThickness * 1.5f); 988643ca7872b450ea4efacab6188849e5aac2ba161Steve Block graphicsContext->setStrokeColor(c2, m_style->colorSpace()); 9898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeThickness(halfThickness > 2 ? halfThickness - 1 : halfThickness); 9908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->strokeArc(IntRect(x + shiftForInner, y + shiftForInner, (radius.width() - shiftForInner) * 2, 9918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian (radius.height() - shiftForInner) * 2), angleStart, angleSpan); 9928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 9938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case INSET: 9958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (s == BSTop || s == BSLeft) 9962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch color = color.dark(); 9978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case OUTSET: 9988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (style == OUTSET && (s == BSBottom || s == BSRight)) 9992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch color = color.dark(); 10008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian case SOLID: 10018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeStyle(SolidStroke); 10022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch graphicsContext->setStrokeColor(color, m_style->colorSpace()); 10038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->setStrokeThickness(thickness); 10048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian graphicsContext->strokeArc(IntRect(x, y, radius.width() * 2, radius.height() * 2), angleStart, angleSpan); 10058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 10068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1008ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#endif 1009a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 1010a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid RenderObject::paintFocusRing(GraphicsContext* context, int tx, int ty, RenderStyle* style) 1011a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{ 1012a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch Vector<IntRect> focusRingRects; 1013a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch addFocusRingRects(focusRingRects, tx, ty); 1014a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (style->outlineStyleIsAuto()) 1015a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch context->drawFocusRing(focusRingRects, style->outlineWidth(), style->outlineOffset(), style->visitedDependentColor(CSSPropertyOutlineColor)); 1016a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch else 1017a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch addPDFURLRect(context, unionRect(focusRingRects)); 1018a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch} 10198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::addPDFURLRect(GraphicsContext* context, const IntRect& rect) 10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (rect.isEmpty()) 10238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 10248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Node* n = node(); 10258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!n || !n->isLink() || !n->isElementNode()) 10268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 10278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian const AtomicString& href = static_cast<Element*>(n)->getAttribute(hrefAttr); 10288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (href.isNull()) 10298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 10308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian context->setURLForRect(n->document()->completeURL(href), rect); 10318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1033dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid RenderObject::paintOutline(GraphicsContext* graphicsContext, int tx, int ty, int w, int h) 10348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!hasOutline()) 10368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 10378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1038dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RenderStyle* styleToUse = style(); 1039dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int ow = styleToUse->outlineWidth(); 1040dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block EBorderStyle os = styleToUse->outlineStyle(); 10418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1042dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Color oc = styleToUse->visitedDependentColor(CSSPropertyOutlineColor); 10438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1044dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int offset = styleToUse->outlineOffset(); 10458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1046dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (styleToUse->outlineStyleIsAuto() || hasOutlineAnnotation()) { 1047dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!theme()->supportsFocusRing(styleToUse)) { 10488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Only paint the focus ring by hand if the theme isn't able to draw the focus ring. 1049a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch paintFocusRing(graphicsContext, tx, ty, styleToUse); 10508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1053dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (styleToUse->outlineStyleIsAuto() || styleToUse->outlineStyle() == BNONE) 10548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 10558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project tx -= offset; 10578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ty -= offset; 10588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project w += 2 * offset; 10598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project h += 2 * offset; 10608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (h < 0 || w < 0) 10628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 10638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1064dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block drawLineForBoxSide(graphicsContext, tx - ow, ty - ow, tx, ty + h + ow, BSLeft, oc, os, ow, ow); 1065dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block drawLineForBoxSide(graphicsContext, tx - ow, ty - ow, tx + w + ow, ty, BSTop, oc, os, ow, ow); 1066dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block drawLineForBoxSide(graphicsContext, tx + w, ty - ow, tx + w + ow, ty + h + ow, BSRight, oc, os, ow, ow); 1067dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block drawLineForBoxSide(graphicsContext, tx - ow, ty + h, tx + w + ow, ty + h + ow, BSBottom, oc, os, ow, ow); 10688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1070635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectIntRect RenderObject::absoluteBoundingBoxRect(bool useTransforms) 1071635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1072635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (useTransforms) { 1073635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<FloatQuad> quads; 1074635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project absoluteQuads(quads); 1075635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1076635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t n = quads.size(); 1077635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!n) 1078635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return IntRect(); 1079635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1080635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project IntRect result = quads[0].enclosingBoundingBox(); 1081635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (size_t i = 1; i < n; ++i) 1082635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project result.unite(quads[i].enclosingBoundingBox()); 1083635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return result; 1084635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1085635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1086635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FloatPoint absPos = localToAbsolute(); 1087635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<IntRect> rects; 1088635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project absoluteRects(rects, absPos.x(), absPos.y()); 1089635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1090635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t n = rects.size(); 1091635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!n) 1092635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return IntRect(); 1093635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1094635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project IntRect result = rects[0]; 1095635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (size_t i = 1; i < n; ++i) 1096635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project result.unite(rects[i]); 1097635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return result; 1098635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1099635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1100d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid RenderObject::absoluteFocusRingQuads(Vector<FloatQuad>& quads) 1101d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 1102d0825bca7fe65beaee391d30da42e937db621564Steve Block Vector<IntRect> rects; 1103d0825bca7fe65beaee391d30da42e937db621564Steve Block // FIXME: addFocusRingRects() needs to be passed this transform-unaware 1104d0825bca7fe65beaee391d30da42e937db621564Steve Block // localToAbsolute() offset here because RenderInline::addFocusRingRects() 1105d0825bca7fe65beaee391d30da42e937db621564Steve Block // implicitly assumes that. This doesn't work correctly with transformed 1106d0825bca7fe65beaee391d30da42e937db621564Steve Block // descendants. 1107d0825bca7fe65beaee391d30da42e937db621564Steve Block FloatPoint absolutePoint = localToAbsolute(); 1108d0825bca7fe65beaee391d30da42e937db621564Steve Block addFocusRingRects(rects, absolutePoint.x(), absolutePoint.y()); 1109d0825bca7fe65beaee391d30da42e937db621564Steve Block size_t count = rects.size(); 1110d0825bca7fe65beaee391d30da42e937db621564Steve Block for (size_t i = 0; i < count; ++i) { 1111d0825bca7fe65beaee391d30da42e937db621564Steve Block IntRect rect = rects[i]; 1112d0825bca7fe65beaee391d30da42e937db621564Steve Block rect.move(-absolutePoint.x(), -absolutePoint.y()); 1113d0825bca7fe65beaee391d30da42e937db621564Steve Block quads.append(localToAbsoluteQuad(FloatQuad(rect))); 1114d0825bca7fe65beaee391d30da42e937db621564Steve Block } 1115d0825bca7fe65beaee391d30da42e937db621564Steve Block} 1116d0825bca7fe65beaee391d30da42e937db621564Steve Block 1117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid RenderObject::addAbsoluteRectForLayer(IntRect& result) 1118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (hasLayer()) 1120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project result.unite(absoluteBoundingBoxRect()); 1121635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (RenderObject* current = firstChild(); current; current = current->nextSibling()) 1122635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project current->addAbsoluteRectForLayer(result); 1123635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1124635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectIntRect RenderObject::paintingRootRect(IntRect& topLevelRect) 1126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1127635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project IntRect result = absoluteBoundingBoxRect(); 1128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project topLevelRect = result; 1129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (RenderObject* current = firstChild(); current; current = current->nextSibling()) 1130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project current->addAbsoluteRectForLayer(result); 1131635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return result; 1132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 11348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::paint(PaintInfo& /*paintInfo*/, int /*tx*/, int /*ty*/) 11358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianRenderBoxModelObject* RenderObject::containerForRepaint() const 1139635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 11408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if USE(ACCELERATED_COMPOSITING) 11418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (RenderView* v = view()) { 11428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (v->usesCompositing()) { 11438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderLayer* compLayer = enclosingLayer()->enclosingCompositingLayer(); 11448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return compLayer ? compLayer->renderer() : 0; 11458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 11468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 11478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 11488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Do root-relative repaint. 1149635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return 0; 1150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 11528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::repaintUsingContainer(RenderBoxModelObject* repaintContainer, const IntRect& r, bool immediate) 11538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 11546c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!repaintContainer) { 11556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen view()->repaintViewRectangle(r, immediate); 11566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return; 11576c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 11586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 11598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if USE(ACCELERATED_COMPOSITING) 11606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen RenderView* v = view(); 11616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (repaintContainer->isRenderView()) { 11626c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen ASSERT(repaintContainer == v); 11636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!v->hasLayer() || !v->layer()->isComposited() || v->layer()->backing()->paintingGoesToWindow()) { 11646c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen v->repaintViewRectangle(r, immediate); 11656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return; 11668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 11676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 11686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 11696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (v->usesCompositing()) { 11706c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen ASSERT(repaintContainer->hasLayer() && repaintContainer->layer()->isComposited()); 11716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen repaintContainer->layer()->setBackingNeedsRepaintInRect(r); 11726c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 11738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#else 11746c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (repaintContainer->isRenderView()) 11756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen toRenderView(repaintContainer)->repaintViewRectangle(r, immediate); 11768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 11778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 11788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 11798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::repaint(bool immediate) 11808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Don't repaint if we're unrooted (note that view() still returns the view when unrooted) 11828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderView* view; 11838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!isRooted(&view)) 11848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1185635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 11868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (view->printing()) 11878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; // Don't repaint if we're printing. 1188635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 11898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderBoxModelObject* repaintContainer = containerForRepaint(); 11908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer ? repaintContainer : view, clippedOverflowRectForRepaint(repaintContainer), immediate); 11918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::repaintRectangle(const IntRect& r, bool immediate) 11948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Don't repaint if we're unrooted (note that view() still returns the view when unrooted) 11968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderView* view; 11978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!isRooted(&view)) 11988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1199635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 12008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (view->printing()) 12018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; // Don't repaint if we're printing. 1202635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 12038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian IntRect dirtyRect(r); 1204635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1205635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // FIXME: layoutDelta needs to be applied in parts before/after transforms and 1206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // repaint containers. https://bugs.webkit.org/show_bug.cgi?id=23308 12078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian dirtyRect.move(view->layoutDelta()); 1208635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 12098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderBoxModelObject* repaintContainer = containerForRepaint(); 12108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian computeRectForRepaint(repaintContainer, dirtyRect); 12118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer ? repaintContainer : view, dirtyRect, immediate); 12128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool RenderObject::repaintAfterLayoutIfNeeded(RenderBoxModelObject* repaintContainer, const IntRect& oldBounds, const IntRect& oldOutlineBox, const IntRect* newBoundsPtr, const IntRect* newOutlineBoxRectPtr) 12158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderView* v = view(); 12178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (v->printing()) 12188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; // Don't repaint if we're printing. 12198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1220967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // This ASSERT fails due to animations. See https://bugs.webkit.org/show_bug.cgi?id=37048 1221967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // ASSERT(!newBoundsPtr || *newBoundsPtr == clippedOverflowRectForRepaint(repaintContainer)); 1222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block IntRect newBounds = newBoundsPtr ? *newBoundsPtr : clippedOverflowRectForRepaint(repaintContainer); 12238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IntRect newOutlineBox; 12248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool fullRepaint = selfNeedsLayout(); 12268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Presumably a background or a border exists if border-fit:lines was specified. 12278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!fullRepaint && style()->borderFit() == BorderFitLines) 12288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fullRepaint = true; 12298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!fullRepaint) { 1230967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // This ASSERT fails due to animations. See https://bugs.webkit.org/show_bug.cgi?id=37048 1231967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // ASSERT(!newOutlineBoxRectPtr || *newOutlineBoxRectPtr == outlineBoundsForRepaint(repaintContainer)); 1232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block newOutlineBox = newOutlineBoxRectPtr ? *newOutlineBoxRectPtr : outlineBoundsForRepaint(repaintContainer); 12338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newOutlineBox.location() != oldOutlineBox.location() || (mustRepaintBackgroundOrBorder() && (newBounds != oldBounds || newOutlineBox != oldOutlineBox))) 12348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fullRepaint = true; 12358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 12378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!repaintContainer) 12388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintContainer = v; 12398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 12408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (fullRepaint) { 12418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, oldBounds); 12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newBounds != oldBounds) 12438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, newBounds); 12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newBounds == oldBounds && newOutlineBox == oldOutlineBox) 12488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 12498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int deltaLeft = newBounds.x() - oldBounds.x(); 12518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (deltaLeft > 0) 12528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, IntRect(oldBounds.x(), oldBounds.y(), deltaLeft, oldBounds.height())); 12538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (deltaLeft < 0) 12548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, IntRect(newBounds.x(), newBounds.y(), -deltaLeft, newBounds.height())); 12558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block int deltaRight = newBounds.maxX() - oldBounds.maxX(); 12578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (deltaRight > 0) 12582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block repaintUsingContainer(repaintContainer, IntRect(oldBounds.maxX(), newBounds.y(), deltaRight, newBounds.height())); 12598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (deltaRight < 0) 12602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block repaintUsingContainer(repaintContainer, IntRect(newBounds.maxX(), oldBounds.y(), -deltaRight, oldBounds.height())); 12618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int deltaTop = newBounds.y() - oldBounds.y(); 12638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (deltaTop > 0) 12648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, IntRect(oldBounds.x(), oldBounds.y(), oldBounds.width(), deltaTop)); 12658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (deltaTop < 0) 12668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, IntRect(newBounds.x(), newBounds.y(), newBounds.width(), -deltaTop)); 12678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block int deltaBottom = newBounds.maxY() - oldBounds.maxY(); 12698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (deltaBottom > 0) 12702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block repaintUsingContainer(repaintContainer, IntRect(newBounds.x(), oldBounds.maxY(), newBounds.width(), deltaBottom)); 12718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (deltaBottom < 0) 12722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block repaintUsingContainer(repaintContainer, IntRect(oldBounds.x(), newBounds.maxY(), oldBounds.width(), -deltaBottom)); 12738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newOutlineBox == oldOutlineBox) 12758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 12768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We didn't move, but we did change size. Invalidate the delta, which will consist of possibly 12788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // two rectangles (but typically only one). 12798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderStyle* outlineStyle = outlineStyleForRepaint(); 12808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int ow = outlineStyle->outlineSize(); 12818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int width = abs(newOutlineBox.width() - oldOutlineBox.width()); 12828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (width) { 12830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int shadowLeft; 12840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int shadowRight; 12850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch style()->getBoxShadowHorizontalExtent(shadowLeft, shadowRight); 12868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1287635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int borderRight = isBox() ? toRenderBox(this)->borderRight() : 0; 12885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen int boxWidth = isBox() ? toRenderBox(this)->width() : 0; 12895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen int borderWidth = max(-outlineStyle->outlineOffset(), max(borderRight, max(style()->borderTopRightRadius().width().calcValue(boxWidth), style()->borderBottomRightRadius().width().calcValue(boxWidth)))) + max(ow, shadowRight); 12908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IntRect rightRect(newOutlineBox.x() + min(newOutlineBox.width(), oldOutlineBox.width()) - borderWidth, 12918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newOutlineBox.y(), 12928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project width + borderWidth, 12938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project max(newOutlineBox.height(), oldOutlineBox.height())); 12942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block int right = min(newBounds.maxX(), oldBounds.maxX()); 12958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (rightRect.x() < right) { 12968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rightRect.setWidth(min(rightRect.width(), right - rightRect.x())); 12978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, rightRect); 12988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int height = abs(newOutlineBox.height() - oldOutlineBox.height()); 13018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (height) { 13020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int shadowTop; 13030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int shadowBottom; 13040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch style()->getBoxShadowVerticalExtent(shadowTop, shadowBottom); 13058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1306635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int borderBottom = isBox() ? toRenderBox(this)->borderBottom() : 0; 13075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen int boxHeight = isBox() ? toRenderBox(this)->height() : 0; 13085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen int borderHeight = max(-outlineStyle->outlineOffset(), max(borderBottom, max(style()->borderBottomLeftRadius().height().calcValue(boxHeight), style()->borderBottomRightRadius().height().calcValue(boxHeight)))) + max(ow, shadowBottom); 13098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IntRect bottomRect(newOutlineBox.x(), 13102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block min(newOutlineBox.maxY(), oldOutlineBox.maxY()) - borderHeight, 13118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project max(newOutlineBox.width(), oldOutlineBox.width()), 13128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project height + borderHeight); 13132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block int bottom = min(newBounds.maxY(), oldBounds.maxY()); 13148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (bottomRect.y() < bottom) { 13158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bottomRect.setHeight(min(bottomRect.height(), bottom - bottomRect.y())); 13168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaintUsingContainer(repaintContainer, bottomRect); 13178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 13208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1322635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid RenderObject::repaintDuringLayoutIfMoved(const IntRect&) 13238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1326635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid RenderObject::repaintOverhangingFloats(bool) 13278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::checkForRepaintDuringLayout() const 13318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: <https://bugs.webkit.org/show_bug.cgi?id=20885> It is probably safe to also require 13338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // m_everHadLayout. Currently, only RenderBlock::layoutBlock() adds this condition. See also 13348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // <https://bugs.webkit.org/show_bug.cgi?id=15129>. 13358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return !document()->view()->needsFullRepaint() && !hasLayer(); 13368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianIntRect RenderObject::rectWithOutlineForRepaint(RenderBoxModelObject* repaintContainer, int outlineWidth) 13398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1340635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project IntRect r(clippedOverflowRectForRepaint(repaintContainer)); 1341635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project r.inflate(outlineWidth); 13428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return r; 13438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianIntRect RenderObject::clippedOverflowRectForRepaint(RenderBoxModelObject*) 13468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT_NOT_REACHED(); 13488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return IntRect(); 13498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::computeRectForRepaint(RenderBoxModelObject* repaintContainer, IntRect& rect, bool fixed) 13528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1353635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (repaintContainer == this) 1354635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 1355635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 13568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (RenderObject* o = parent()) { 13578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (o->isBlockFlow()) { 13588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderBlock* cb = toRenderBlock(o); 13598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cb->hasColumns()) 13608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cb->adjustRectForColumns(rect); 13618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (o->hasOverflowClip()) { 13648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // o->height() is inaccurate if we're in the middle of a layout of |o|, so use the 13658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // layer's size instead. Even if the layer's size is wrong, the layer itself will repaint 13668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // anyway if its size does change. 1367635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project RenderBox* boxParent = toRenderBox(o); 1368635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1369dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block IntRect repaintRect(rect); 1370dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block repaintRect.move(-boxParent->layer()->scrolledContentOffset()); // For overflow:auto/scroll/hidden. 1371dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1372635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project IntRect boxRect(0, 0, boxParent->layer()->width(), boxParent->layer()->height()); 13738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rect = intersection(repaintRect, boxRect); 13748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (rect.isEmpty()) 13758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 13768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian o->computeRectForRepaint(repaintContainer, rect, fixed); 13798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1382635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid RenderObject::dirtyLinesFromChangedChild(RenderObject*) 13838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 13878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::showTreeForThis() const 13898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (node()) 13918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian node()->showTreeForThis(); 13928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1394643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid RenderObject::showRenderObject() const 1395643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1396643ca7872b450ea4efacab6188849e5aac2ba161Steve Block showRenderObject(0); 1397643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1398643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1399643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid RenderObject::showRenderObject(int printedCharacters) const 1400643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1401643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // As this function is intended to be used when debugging, the 1402643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // this pointer may be 0. 1403643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!this) { 1404643ca7872b450ea4efacab6188849e5aac2ba161Steve Block fputs("(null)\n", stderr); 1405643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 1406643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1407643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1408643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printedCharacters += fprintf(stderr, "%s %p", renderName(), this); 1409643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1410643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (node()) { 1411643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (printedCharacters) 1412643ca7872b450ea4efacab6188849e5aac2ba161Steve Block for (; printedCharacters < 39; printedCharacters++) 1413643ca7872b450ea4efacab6188849e5aac2ba161Steve Block fputc(' ', stderr); 1414643ca7872b450ea4efacab6188849e5aac2ba161Steve Block fputc('\t', stderr); 1415643ca7872b450ea4efacab6188849e5aac2ba161Steve Block node()->showNode(); 1416643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } else 1417643ca7872b450ea4efacab6188849e5aac2ba161Steve Block fputc('\n', stderr); 1418643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1419643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1420643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid RenderObject::showRenderTreeAndMark(const RenderObject* markedObject1, const char* markedLabel1, const RenderObject* markedObject2, const char* markedLabel2, int depth) const 1421643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1422643ca7872b450ea4efacab6188849e5aac2ba161Steve Block int printedCharacters = 0; 1423643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (markedObject1 == this && markedLabel1) 1424643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printedCharacters += fprintf(stderr, "%s", markedLabel1); 1425643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (markedObject2 == this && markedLabel2) 1426643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printedCharacters += fprintf(stderr, "%s", markedLabel2); 1427643ca7872b450ea4efacab6188849e5aac2ba161Steve Block for (; printedCharacters < depth * 2; printedCharacters++) 1428643ca7872b450ea4efacab6188849e5aac2ba161Steve Block fputc(' ', stderr); 1429643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1430643ca7872b450ea4efacab6188849e5aac2ba161Steve Block showRenderObject(printedCharacters); 1431643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!this) 1432643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 1433643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1434643ca7872b450ea4efacab6188849e5aac2ba161Steve Block for (const RenderObject* child = firstChild(); child; child = child->nextSibling()) 1435643ca7872b450ea4efacab6188849e5aac2ba161Steve Block child->showRenderTreeAndMark(markedObject1, markedLabel1, markedObject2, markedLabel2, depth + 1); 1436643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1437643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 14388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // NDEBUG 14398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectColor RenderObject::selectionBackgroundColor() const 14418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Color color; 14438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (style()->userSelect() != SELECT_NONE) { 1444e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block RefPtr<RenderStyle> pseudoStyle = getUncachedPseudoStyle(SELECTION); 1445e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if (pseudoStyle && pseudoStyle->visitedDependentColor(CSSPropertyBackgroundColor).isValid()) 1446e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block color = pseudoStyle->visitedDependentColor(CSSPropertyBackgroundColor).blendWithWhite(); 14478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 1448545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch color = frame()->selection()->isFocusedAndActive() ? 14498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project theme()->activeSelectionBackgroundColor() : 14508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project theme()->inactiveSelectionBackgroundColor(); 14518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return color; 14548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1456f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochColor RenderObject::selectionColor(int colorProperty) const 14578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Color color; 1459e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block // If the element is unselectable, or we are only painting the selection, 1460e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block // don't override the foreground color with the selection foreground color. 1461e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block if (style()->userSelect() == SELECT_NONE 1462e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block || (frame()->view()->paintBehavior() & PaintBehaviorSelectionOnly)) 14638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return color; 14648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (RefPtr<RenderStyle> pseudoStyle = getUncachedPseudoStyle(SELECTION)) { 1466f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch color = pseudoStyle->visitedDependentColor(colorProperty); 14678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!color.isValid()) 1468e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block color = pseudoStyle->visitedDependentColor(CSSPropertyColor); 14698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 1470545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch color = frame()->selection()->isFocusedAndActive() ? 1471635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project theme()->activeSelectionForegroundColor() : 1472635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project theme()->inactiveSelectionForegroundColor(); 14738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return color; 14758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1477f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochColor RenderObject::selectionForegroundColor() const 1478f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 1479f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return selectionColor(CSSPropertyWebkitTextFillColor); 1480f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 1481f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 1482f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochColor RenderObject::selectionEmphasisMarkColor() const 1483f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 1484f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return selectionColor(CSSPropertyWebkitTextEmphasisColor); 1485f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 1486f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 1487231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(DRAG_SUPPORT) 14888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNode* RenderObject::draggableNode(bool dhtmlOK, bool uaOK, int x, int y, bool& dhtmlWillDrag) const 14898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!dhtmlOK && !uaOK) 14918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 14928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (const RenderObject* curr = this; curr; curr = curr->parent()) { 14948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Node* elt = curr->node(); 14958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (elt && elt->nodeType() == Node::TEXT_NODE) { 14968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Since there's no way for the author to address the -webkit-user-drag style for a text node, 14978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we use our own judgement. 14988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (uaOK && view()->frameView()->frame()->eventHandler()->shouldDragAutoNode(curr->node(), IntPoint(x, y))) { 14998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dhtmlWillDrag = false; 15008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return curr->node(); 15018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 15028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (elt->canStartSelection()) 15038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // In this case we have a click in the unselected portion of text. If this text is 15048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // selectable, we want to start the selection process instead of looking for a parent 15058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // to try to drag. 15068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 15078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 15088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EUserDrag dragMode = curr->style()->userDrag(); 15098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (dhtmlOK && dragMode == DRAG_ELEMENT) { 15108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dhtmlWillDrag = true; 15118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return curr->node(); 15128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 15138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (uaOK && dragMode == DRAG_AUTO 15148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && view()->frameView()->frame()->eventHandler()->shouldDragAutoNode(curr->node(), IntPoint(x, y))) { 15158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dhtmlWillDrag = false; 15168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return curr->node(); 15178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 15188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 15198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 15208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 15218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1522231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif // ENABLE(DRAG_SUPPORT) 15238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::selectionStartEnd(int& spos, int& epos) const 15258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view()->selectionStartEnd(spos, epos); 15278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::handleDynamicFloatPositionChange() 15308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We have gone from not affecting the inline status of the parent flow to suddenly 15328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // having an impact. See if there is a mismatch between the parent flow's 15338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // childrenInline() state and our state. 15348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setInline(style()->isDisplayInlineType()); 15358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isInline() != parent()->childrenInline()) { 15368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!isInline()) 15378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderBoxModelObject(parent())->childBecameNonInline(this); 15388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else { 15398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // An anonymous block must be made to wrap this inline. 15408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderBlock* block = toRenderBlock(parent())->createAnonymousBlock(); 15418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObjectChildList* childlist = parent()->virtualChildren(); 15428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian childlist->insertChildNode(parent(), block, this); 15438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian block->children()->appendChildNode(block, childlist->removeChildNode(parent(), this)); 15448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 15458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 15468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::setAnimatableStyle(PassRefPtr<RenderStyle> style) 15498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!isText() && style) 15518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setStyle(animation()->updateAnimations(this, style.get())); 15528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 15538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setStyle(style); 15548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianStyleDifference RenderObject::adjustStyleDifference(StyleDifference diff, unsigned contextSensitiveProperties) const 15578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 15588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if USE(ACCELERATED_COMPOSITING) 15598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If transform changed, and we are not composited, need to do a layout. 15605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (contextSensitiveProperties & ContextSensitivePropertyTransform) { 15618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Text nodes share style with their parents but transforms don't apply to them, 15628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // hence the !isText() check. 15638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // FIXME: when transforms are taken into account for overflow, we will need to do a layout. 15642bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!isText() && (!hasLayer() || !toRenderBoxModelObject(this)->layer()->isComposited())) { 15652bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!hasLayer()) 15662bde8e466a4451c7319e3a072d118917957d6554Steve Block diff = StyleDifferenceLayout; // FIXME: Do this for now since SimplifiedLayout cannot handle updating floating objects lists. 15672bde8e466a4451c7319e3a072d118917957d6554Steve Block else if (diff < StyleDifferenceSimplifiedLayout) 15682bde8e466a4451c7319e3a072d118917957d6554Steve Block diff = StyleDifferenceSimplifiedLayout; 15692bde8e466a4451c7319e3a072d118917957d6554Steve Block } else if (diff < StyleDifferenceRecompositeLayer) 15708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian diff = StyleDifferenceRecompositeLayer; 15715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 15728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 15738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If opacity changed, and we are not composited, need to repaint (also 15748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // ignoring text nodes) 15755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (contextSensitiveProperties & ContextSensitivePropertyOpacity) { 15768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!isText() && (!hasLayer() || !toRenderBoxModelObject(this)->layer()->isComposited())) 15778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian diff = StyleDifferenceRepaintLayer; 15788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if (diff < StyleDifferenceRecompositeLayer) 15798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian diff = StyleDifferenceRecompositeLayer; 15805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 1581e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 1582e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // The answer to requiresLayer() for plugins and iframes can change outside of the style system, 1583e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // since it depends on whether we decide to composite these elements. When the layer status of 1584e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // one of these elements changes, we need to force a layout. 1585e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (diff == StyleDifferenceEqual && style() && isBoxModelObject()) { 1586e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (hasLayer() != toRenderBoxModelObject(this)->requiresLayer()) 1587e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke diff = StyleDifferenceLayout; 1588e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke } 15898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#else 15908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian UNUSED_PARAM(contextSensitiveProperties); 15918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 15928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 15938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If we have no layer(), just treat a RepaintLayer hint as a normal Repaint. 15948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (diff == StyleDifferenceRepaintLayer && !hasLayer()) 15958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian diff = StyleDifferenceRepaint; 15968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 15978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return diff; 15988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 15998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 16008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::setStyle(PassRefPtr<RenderStyle> style) 16018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 160228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (m_style == style) { 160328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#if USE(ACCELERATED_COMPOSITING) 160428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // We need to run through adjustStyleDifference() for iframes and plugins, so 160528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // style sharing is disabled for them. That should ensure that we never hit this code path. 160628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu ASSERT(!isRenderIFrame() && !isEmbeddedObject() &&!isApplet()); 160728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#endif 16088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 160928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } 16108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian StyleDifference diff = StyleDifferenceEqual; 16128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian unsigned contextSensitiveProperties = ContextSensitivePropertyNone; 16138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_style) 16148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian diff = m_style->diff(style.get(), contextSensitiveProperties); 16158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian diff = adjustStyleDifference(diff, contextSensitiveProperties); 16178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project styleWillChange(diff, style.get()); 16198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<RenderStyle> oldStyle = m_style.release(); 16218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_style = style; 16228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project updateFillImages(oldStyle ? oldStyle->backgroundLayers() : 0, m_style ? m_style->backgroundLayers() : 0); 16248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project updateFillImages(oldStyle ? oldStyle->maskLayers() : 0, m_style ? m_style->maskLayers() : 0); 16258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project updateImage(oldStyle ? oldStyle->borderImage().image() : 0, m_style ? m_style->borderImage().image() : 0); 16278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project updateImage(oldStyle ? oldStyle->maskBoxImage().image() : 0, m_style ? m_style->maskBoxImage().image() : 0); 16288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // We need to ensure that view->maximalOutlineSize() is valid for any repaints that happen 16308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // during styleDidChange (it's used by clippedOverflowRectForRepaint()). 16318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_style->outlineWidth() > 0 && m_style->outlineSize() > maximalOutlineSize(PaintPhaseOutline)) 16328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderView(document()->renderer())->setMaximalOutlineSize(m_style->outlineSize()); 16338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 16348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project styleDidChange(diff, oldStyle.get()); 16358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 16368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!m_parent || isText()) 16378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 16388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 16398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Now that the layer (if any) has been updated, we need to adjust the diff again, 16408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // check whether we should layout now, and decide if we need to repaint. 16418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian StyleDifference updatedDiff = adjustStyleDifference(diff, contextSensitiveProperties); 16428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 16438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (diff <= StyleDifferenceLayoutPositionedMovementOnly) { 16448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (updatedDiff == StyleDifferenceLayout) 16458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian setNeedsLayoutAndPrefWidthsRecalc(); 16468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if (updatedDiff == StyleDifferenceLayoutPositionedMovementOnly) 16478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian setNeedsPositionedMovementLayout(); 16482bde8e466a4451c7319e3a072d118917957d6554Steve Block else if (updatedDiff == StyleDifferenceSimplifiedLayout) 16492bde8e466a4451c7319e3a072d118917957d6554Steve Block setNeedsSimplifiedNormalFlowLayout(); 16508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 16518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 16528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (updatedDiff == StyleDifferenceRepaintLayer || updatedDiff == StyleDifferenceRepaint) { 16538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Do a repaint with the new style now, e.g., for example if we go from 16548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // not having an outline to having an outline. 16558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian repaint(); 16568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 16578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::setStyleInternal(PassRefPtr<RenderStyle> style) 16608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_style = style; 16628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::styleWillChange(StyleDifference diff, const RenderStyle* newStyle) 16658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_style) { 16678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If our z-index changes value or our visibility changes, 16688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we need to dirty our stacking context's z-order list. 16698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newStyle) { 1670e90019d2a3c455d2bee14682e8973dcd33460010Anders Edenbrandt#if ENABLE(COMPOSITED_FIXED_ELEMENTS) 1671e90019d2a3c455d2bee14682e8973dcd33460010Anders Edenbrandt RenderLayer* layer = hasLayer() ? enclosingLayer() : 0; 1672e90019d2a3c455d2bee14682e8973dcd33460010Anders Edenbrandt if (layer && m_style->position() != newStyle->position() 1673e90019d2a3c455d2bee14682e8973dcd33460010Anders Edenbrandt && (m_style->position() == FixedPosition || newStyle->position() == FixedPosition)) 1674e90019d2a3c455d2bee14682e8973dcd33460010Anders Edenbrandt layer->dirtyZOrderLists(); 1675e90019d2a3c455d2bee14682e8973dcd33460010Anders Edenbrandt#endif 16765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian bool visibilityChanged = m_style->visibility() != newStyle->visibility() 16775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian || m_style->zIndex() != newStyle->zIndex() 16785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian || m_style->hasAutoZIndex() != newStyle->hasAutoZIndex(); 16798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT) 16805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (visibilityChanged) 16818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project document()->setDashboardRegionsDirty(true); 16828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 16835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (visibilityChanged && AXObjectCache::accessibilityEnabled()) 16845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian document()->axObjectCache()->childrenChanged(this); 16858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1686635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Keep layer hierarchy visibility bits up to date if visibility changes. 16878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_style->visibility() != newStyle->visibility()) { 16888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (RenderLayer* l = enclosingLayer()) { 16898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newStyle->visibility() == VISIBLE) 16908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project l->setHasVisibleContent(true); 16918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (l->hasVisibleContent() && (this == l->renderer() || l->renderer()->style()->visibility() != VISIBLE)) { 16928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project l->dirtyVisibleContentStatus(); 16938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (diff > StyleDifferenceRepaintLayer) 16948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project repaint(); 16958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_parent && (diff == StyleDifferenceRepaint || newStyle->outlineSize() < m_style->outlineSize())) 1701635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project repaint(); 17028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isFloating() && (m_style->floating() != newStyle->floating())) 17038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For changes in float styles, we need to conceivably remove ourselves 17048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // from the floating objects list. 17058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderBox(this)->removeFloatingOrPositionedChildFromBlockLists(); 1706cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block else if (isPositioned() && (m_style->position() != newStyle->position())) 17078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For changes in positioning styles, we need to conceivably remove ourselves 17088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // from the positioned objects list. 17098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderBox(this)->removeFloatingOrPositionedChildFromBlockLists(); 17108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s_affectsParentBlock = isFloatingOrPositioned() && 17128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (!newStyle->isFloating() && newStyle->position() != AbsolutePosition && newStyle->position() != FixedPosition) 1713635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project && parent() && (parent()->isBlockFlow() || parent()->isRenderInline()); 17148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // reset style flags 17168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (diff == StyleDifferenceLayout || diff == StyleDifferenceLayoutPositionedMovementOnly) { 17178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_floating = false; 17188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_positioned = false; 17198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_relPositioned = false; 17208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 17212bde8e466a4451c7319e3a072d118917957d6554Steve Block m_horizontalWritingMode = true; 17228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_paintBackground = false; 17238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_hasOverflowClip = false; 17248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_hasTransform = false; 17258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_hasReflection = false; 17268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 17278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s_affectsParentBlock = false; 17288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (view()->frameView()) { 1730d0825bca7fe65beaee391d30da42e937db621564Steve Block bool shouldBlitOnFixedBackgroundImage = false; 1731d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(FAST_MOBILE_SCROLLING) 1732d0825bca7fe65beaee391d30da42e937db621564Steve Block // On low-powered/mobile devices, preventing blitting on a scroll can cause noticeable delays 1733d0825bca7fe65beaee391d30da42e937db621564Steve Block // when scrolling a page with a fixed background image. As an optimization, assuming there are 1734d0825bca7fe65beaee391d30da42e937db621564Steve Block // no fixed positoned elements on the page, we can acclerate scrolling (via blitting) if we 1735d0825bca7fe65beaee391d30da42e937db621564Steve Block // ignore the CSS property "background-attachment: fixed". 1736d0825bca7fe65beaee391d30da42e937db621564Steve Block shouldBlitOnFixedBackgroundImage = true; 1737d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 1738d0825bca7fe65beaee391d30da42e937db621564Steve Block 173906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen bool newStyleSlowScroll = newStyle && !shouldBlitOnFixedBackgroundImage && newStyle->hasFixedBackgroundImage(); 174006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen bool oldStyleSlowScroll = m_style && !shouldBlitOnFixedBackgroundImage && m_style->hasFixedBackgroundImage(); 17418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (oldStyleSlowScroll != newStyleSlowScroll) { 17428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (oldStyleSlowScroll) 17438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view()->frameView()->removeSlowRepaintObject(); 17448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newStyleSlowScroll) 17458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view()->frameView()->addSlowRepaintObject(); 17468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 17478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 17488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17502fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic bool areNonIdenticalCursorListsEqual(const RenderStyle* a, const RenderStyle* b) 17512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 17522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(a->cursors() != b->cursors()); 17532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return a->cursors() && b->cursors() && *a->cursors() == *b->cursors(); 17542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 17552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 17562fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic inline bool areCursorsEqual(const RenderStyle* a, const RenderStyle* b) 17572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 17582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return a->cursor() == b->cursor() && (a->cursors() == b->cursors() || areNonIdenticalCursorListsEqual(a, b)); 17592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 17602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1761d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid RenderObject::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) 17628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (s_affectsParentBlock) 17648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project handleDynamicFloatPositionChange(); 17658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1766635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_parent) 1767635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 1768635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 17692bde8e466a4451c7319e3a072d118917957d6554Steve Block if (diff == StyleDifferenceLayout || diff == StyleDifferenceSimplifiedLayout) { 1770d0825bca7fe65beaee391d30da42e937db621564Steve Block RenderCounter::rendererStyleChanged(this, oldStyle, m_style.get()); 17718a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 17728a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block // If the object already needs layout, then setNeedsLayout won't do 17738a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block // any work. But if the containing block has changed, then we may need 17748a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block // to mark the new containing blocks for layout. The change that can 17758a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block // directly affect the containing block of this object is a change to 17768a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block // the position style. 17778a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block if (m_needsLayout && oldStyle->position() != m_style->position()) 17788a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block markContainingBlocksForLayout(); 17798a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 17802bde8e466a4451c7319e3a072d118917957d6554Steve Block if (diff == StyleDifferenceLayout) 17812bde8e466a4451c7319e3a072d118917957d6554Steve Block setNeedsLayoutAndPrefWidthsRecalc(); 17822bde8e466a4451c7319e3a072d118917957d6554Steve Block else 17832bde8e466a4451c7319e3a072d118917957d6554Steve Block setNeedsSimplifiedNormalFlowLayout(); 1784d0825bca7fe65beaee391d30da42e937db621564Steve Block } else if (diff == StyleDifferenceLayoutPositionedMovementOnly) 17858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setNeedsPositionedMovementLayout(); 17868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 17878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Don't check for repaint here; we need to wait until the layer has been 17888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // updated by subclasses before we know if we have to repaint (in setStyle()). 17892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 17902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (oldStyle && !areCursorsEqual(oldStyle, style())) { 17912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (Frame* frame = this->frame()) 17922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block frame->eventHandler()->dispatchFakeMouseMoveEventSoon(); 17932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 17948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 179605c44efdceb09e0a5066c1f2ae06a5f19fd7fc6cVictoria Leasevoid RenderObject::propagateStyleToAnonymousChildren() 179705c44efdceb09e0a5066c1f2ae06a5f19fd7fc6cVictoria Lease{ 179805c44efdceb09e0a5066c1f2ae06a5f19fd7fc6cVictoria Lease for (RenderObject* child = firstChild(); child; child = child->nextSibling()) { 179905c44efdceb09e0a5066c1f2ae06a5f19fd7fc6cVictoria Lease if (child->isAnonymous() && !child->isBeforeOrAfterContent()) { 180005c44efdceb09e0a5066c1f2ae06a5f19fd7fc6cVictoria Lease RefPtr<RenderStyle> newStyle = RenderStyle::createAnonymousStyle(style()); 180105c44efdceb09e0a5066c1f2ae06a5f19fd7fc6cVictoria Lease if (style()->specifiesColumns()) { 180205c44efdceb09e0a5066c1f2ae06a5f19fd7fc6cVictoria Lease if (child->style()->specifiesColumns()) 180305c44efdceb09e0a5066c1f2ae06a5f19fd7fc6cVictoria Lease newStyle->inheritColumnPropertiesFrom(style()); 180405c44efdceb09e0a5066c1f2ae06a5f19fd7fc6cVictoria Lease if (child->style()->columnSpan()) 180505c44efdceb09e0a5066c1f2ae06a5f19fd7fc6cVictoria Lease newStyle->setColumnSpan(true); 180605c44efdceb09e0a5066c1f2ae06a5f19fd7fc6cVictoria Lease } 180705c44efdceb09e0a5066c1f2ae06a5f19fd7fc6cVictoria Lease newStyle->setDisplay(child->style()->display()); 180805c44efdceb09e0a5066c1f2ae06a5f19fd7fc6cVictoria Lease child->setStyle(newStyle.release()); 180905c44efdceb09e0a5066c1f2ae06a5f19fd7fc6cVictoria Lease } 181005c44efdceb09e0a5066c1f2ae06a5f19fd7fc6cVictoria Lease } 181105c44efdceb09e0a5066c1f2ae06a5f19fd7fc6cVictoria Lease} 181205c44efdceb09e0a5066c1f2ae06a5f19fd7fc6cVictoria Lease 18138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::updateFillImages(const FillLayer* oldLayers, const FillLayer* newLayers) 18148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1815231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Optimize the common case 1816231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (oldLayers && !oldLayers->next() && newLayers && !newLayers->next() && (oldLayers->image() == newLayers->image())) 1817231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 1818231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1819231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Go through the new layers and addClients first, to avoid removing all clients of an image. 1820058ccc7ba0a4d59b9f6e92808332aa9895425fc7Andrei Popescu for (const FillLayer* currNew = newLayers; currNew; currNew = currNew->next()) { 1821231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (currNew->image()) 1822058ccc7ba0a4d59b9f6e92808332aa9895425fc7Andrei Popescu currNew->image()->addClient(this); 1823058ccc7ba0a4d59b9f6e92808332aa9895425fc7Andrei Popescu } 1824231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1825231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block for (const FillLayer* currOld = oldLayers; currOld; currOld = currOld->next()) { 1826231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (currOld->image()) 1827231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block currOld->image()->removeClient(this); 1828231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 18298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::updateImage(StyleImage* oldImage, StyleImage* newImage) 18328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (oldImage != newImage) { 18348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (oldImage) 18358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project oldImage->removeClient(this); 18368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newImage) 18378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newImage->addClient(this); 18388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect RenderObject::viewRect() const 18428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return view()->viewRect(); 18448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18462bde8e466a4451c7319e3a072d118917957d6554Steve BlockFloatPoint RenderObject::localToAbsolute(const FloatPoint& localPoint, bool fixed, bool useTransforms) const 18478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian TransformState transformState(TransformState::ApplyTransformDirection, localPoint); 18498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian mapLocalToContainer(0, fixed, useTransforms, transformState); 18508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian transformState.flatten(); 18518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 18528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return transformState.lastPlanarPoint(); 18538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18552bde8e466a4451c7319e3a072d118917957d6554Steve BlockFloatPoint RenderObject::absoluteToLocal(const FloatPoint& containerPoint, bool fixed, bool useTransforms) const 18568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian TransformState transformState(TransformState::UnapplyInverseTransformDirection, containerPoint); 18588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian mapAbsoluteToLocalPoint(fixed, useTransforms, transformState); 18598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian transformState.flatten(); 18608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 18618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return transformState.lastPlanarPoint(); 18628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool fixed, bool useTransforms, TransformState& transformState) const 18658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1866635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (repaintContainer == this) 18678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 1868635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1869635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project RenderObject* o = parent(); 18708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!o) 18718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 18728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 18732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block IntPoint centerPoint = roundedIntPoint(transformState.mappedPoint()); 18742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (o->isBox() && o->style()->isFlippedBlocksWritingMode()) 18752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block transformState.move(toRenderBox(o)->flipForWritingModeIncludingColumns(roundedIntPoint(transformState.mappedPoint())) - centerPoint); 18762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1877692e5dbf12901edacf14812a6fae25462920af42Steve Block IntSize columnOffset; 1878692e5dbf12901edacf14812a6fae25462920af42Steve Block o->adjustForColumns(columnOffset, roundedIntPoint(transformState.mappedPoint())); 1879692e5dbf12901edacf14812a6fae25462920af42Steve Block if (!columnOffset.isZero()) 1880692e5dbf12901edacf14812a6fae25462920af42Steve Block transformState.move(columnOffset); 1881692e5dbf12901edacf14812a6fae25462920af42Steve Block 18828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (o->hasOverflowClip()) 18838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian transformState.move(-toRenderBox(o)->layer()->scrolledContentOffset()); 18848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 18858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian o->mapLocalToContainer(repaintContainer, fixed, useTransforms, transformState); 18868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 18878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 18888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::mapAbsoluteToLocalPoint(bool fixed, bool useTransforms, TransformState& transformState) const 18898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 18908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* o = parent(); 1891635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (o) { 18928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian o->mapAbsoluteToLocalPoint(fixed, useTransforms, transformState); 1893635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (o->hasOverflowClip()) 18948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian transformState.move(toRenderBox(o)->layer()->scrolledContentOffset()); 1895635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 18968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 18978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 18985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool RenderObject::shouldUseTransformFromContainer(const RenderObject* containerObject) const 18998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 19005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(3D_RENDERING) 19015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // hasTransform() indicates whether the object has transform, transform-style or perspective. We just care about transform, 19025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // so check the layer's transform directly. 19035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return (hasLayer() && toRenderBoxModelObject(this)->layer()->transform()) || (containerObject && containerObject->style()->hasPerspective()); 1904353e1e16ed060c0ea11f2dea6dea8b565ac71533Mike Reed#else 19055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian UNUSED_PARAM(containerObject); 19065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return hasTransform(); 1907353e1e16ed060c0ea11f2dea6dea8b565ac71533Mike Reed#endif 19085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 1909353e1e16ed060c0ea11f2dea6dea8b565ac71533Mike Reed 19105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid RenderObject::getTransformFromContainer(const RenderObject* containerObject, const IntSize& offsetInContainer, TransformationMatrix& transform) const 19115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 19125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian transform.makeIdentity(); 19135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian transform.translate(offsetInContainer.width(), offsetInContainer.height()); 19145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian RenderLayer* layer; 19155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (hasLayer() && (layer = toRenderBoxModelObject(this)->layer()) && layer->transform()) 19162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block transform.multiply(layer->currentTransform()); 19175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 19188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if ENABLE(3D_RENDERING) 19190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (containerObject && containerObject->hasLayer() && containerObject->style()->hasPerspective()) { 19208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Perpsective on the container affects us, so we have to factor it in here. 19218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(containerObject->hasLayer()); 1922bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen FloatPoint perspectiveOrigin = toRenderBoxModelObject(containerObject)->layer()->perspectiveOrigin(); 19238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian TransformationMatrix perspectiveMatrix; 19258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian perspectiveMatrix.applyPerspective(containerObject->style()->perspective()); 19268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian transform.translateRight3d(-perspectiveOrigin.x(), -perspectiveOrigin.y(), 0); 19282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block transform = perspectiveMatrix * transform; 19295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian transform.translateRight3d(perspectiveOrigin.x(), perspectiveOrigin.y(), 0); 19308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 19318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#else 19328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian UNUSED_PARAM(containerObject); 19338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 19348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 1935635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 19368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianFloatQuad RenderObject::localToContainerQuad(const FloatQuad& localQuad, RenderBoxModelObject* repaintContainer, bool fixed) const 19378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 1938692e5dbf12901edacf14812a6fae25462920af42Steve Block // Track the point at the center of the quad's bounding box. As mapLocalToContainer() calls offsetFromContainer(), 1939692e5dbf12901edacf14812a6fae25462920af42Steve Block // it will use that point as the reference point to decide which column's transform to apply in multiple-column blocks. 1940692e5dbf12901edacf14812a6fae25462920af42Steve Block TransformState transformState(TransformState::ApplyTransformDirection, localQuad.boundingBox().center(), &localQuad); 19418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian mapLocalToContainer(repaintContainer, fixed, true, transformState); 19428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian transformState.flatten(); 19438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return transformState.lastPlanarQuad(); 19458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1947692e5dbf12901edacf14812a6fae25462920af42Steve BlockIntSize RenderObject::offsetFromContainer(RenderObject* o, const IntPoint& point) const 19488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1949635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(o == container()); 1950635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1951635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project IntSize offset; 1952692e5dbf12901edacf14812a6fae25462920af42Steve Block 1953692e5dbf12901edacf14812a6fae25462920af42Steve Block o->adjustForColumns(offset, point); 1954692e5dbf12901edacf14812a6fae25462920af42Steve Block 1955635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (o->hasOverflowClip()) 1956635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project offset -= toRenderBox(o)->layer()->scrolledContentOffset(); 1957635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1958635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return offset; 19598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1961231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockIntSize RenderObject::offsetFromAncestorContainer(RenderObject* container) const 1962231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 1963231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block IntSize offset; 1964692e5dbf12901edacf14812a6fae25462920af42Steve Block IntPoint referencePoint; 1965231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block const RenderObject* currContainer = this; 1966231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block do { 1967231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RenderObject* nextContainer = currContainer->container(); 1968231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(nextContainer); // This means we reached the top without finding container. 1969231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!nextContainer) 1970231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block break; 1971231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(!currContainer->hasTransform()); 1972692e5dbf12901edacf14812a6fae25462920af42Steve Block IntSize currentOffset = currContainer->offsetFromContainer(nextContainer, referencePoint); 1973692e5dbf12901edacf14812a6fae25462920af42Steve Block offset += currentOffset; 1974692e5dbf12901edacf14812a6fae25462920af42Steve Block referencePoint.move(currentOffset); 1975231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block currContainer = nextContainer; 1976231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } while (currContainer != container); 1977231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1978231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return offset; 1979231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 1980231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1981635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectIntRect RenderObject::localCaretRect(InlineBox*, int, int* extraWidthToEndOfLine) 19828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 19830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (extraWidthToEndOfLine) 19840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *extraWidthToEndOfLine = 0; 1985635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1986635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return IntRect(); 19878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderView* RenderObject::view() const 19908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 19918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return toRenderView(document()->renderer()); 19928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 19938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool RenderObject::isRooted(RenderView** view) 19958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 19968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* o = this; 19978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while (o->parent()) 19988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian o = o->parent(); 19998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 20008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!o->isRenderView()) 20018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return false; 20028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 20038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (view) 20048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *view = toRenderView(o); 20058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 20068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return true; 20078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::hasOutlineAnnotation() const 20108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 20118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return node() && node()->isLink() && document()->printing(); 20128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2014231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockRenderObject* RenderObject::container(RenderBoxModelObject* repaintContainer, bool* repaintContainerSkipped) const 20158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2016231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (repaintContainerSkipped) 2017231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *repaintContainerSkipped = false; 2018231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 20198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This method is extremely similar to containingBlock(), but with a few notable 20208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // exceptions. 20218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // (1) It can be used on orphaned subtrees, i.e., it can be called safely even when 20228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the object is not part of the primary document subtree yet. 20238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // (2) For normal flow elements, it just returns the parent. 20248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // (3) For absolute positioned elements, it will return a relative positioned inline. 20258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // containingBlock() simply skips relpositioned inlines and lets an enclosing block handle 2026bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen // the layout of the positioned object. This does mean that computePositionedLogicalWidth and 2027bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen // computePositionedLogicalHeight have to use container(). 20288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* o = parent(); 20298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isText()) 20318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o; 20328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EPosition pos = m_style->position(); 20348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (pos == FixedPosition) { 20358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // container() can be called on an object that is not in the 20368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // tree yet. We don't call view() since it will assert if it 20378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // can't get back to the canvas. Instead we just walk as high up 20388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // as we can. If we're in the tree, we'll get the root. If we 20398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // aren't we'll get the root of our little subtree (most likely 20408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we'll just return 0). 2041635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // FIXME: The definition of view() has changed to not crawl up the render tree. It might 2042635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // be safe now to use it. 2043231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block while (o && o->parent() && !(o->hasTransform() && o->isRenderBlock())) { 2044231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (repaintContainerSkipped && o == repaintContainer) 2045231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *repaintContainerSkipped = true; 20468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->parent(); 2047231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 20488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (pos == AbsolutePosition) { 20498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Same goes here. We technically just want our containing block, but 20508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we may not have one if we're part of an uninstalled subtree. We'll 20518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // climb as high as we can though. 2052231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block while (o && o->style()->position() == StaticPosition && !o->isRenderView() && !(o->hasTransform() && o->isRenderBlock())) { 2053231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (repaintContainerSkipped && o == repaintContainer) 2054231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *repaintContainerSkipped = true; 2055a921a7a3e5bb1bc5531af9e88cf9f1e3781a9843Steve Block#if ENABLE(SVG) 2056a921a7a3e5bb1bc5531af9e88cf9f1e3781a9843Steve Block if (o->isSVGForeignObject()) // foreignObject is the containing block for contents inside it 2057a921a7a3e5bb1bc5531af9e88cf9f1e3781a9843Steve Block break; 2058a921a7a3e5bb1bc5531af9e88cf9f1e3781a9843Steve Block#endif 20598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project o = o->parent(); 2060231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 20618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 20628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return o; 20648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::isSelectionBorder() const 20678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 20688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SelectionState st = selectionState(); 20698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return st == SelectionStart || st == SelectionEnd || st == SelectionBoth; 20708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::destroy() 20738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 20748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Destroy any leftover anonymous children. 20758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObjectChildList* children = virtualChildren(); 20768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (children) 20778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian children->destroyLeftoverChildren(); 20788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 20798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If this renderer is being autoscrolled, stop the autoscroll timer 2080231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2081d0825bca7fe65beaee391d30da42e937db621564Steve Block // FIXME: RenderObject::destroy should not get called with a renderer whose document 2082231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // has a null frame, so we assert this. However, we don't want release builds to crash which is why we 2083231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // check that the frame is not null. 2084545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch ASSERT(frame()); 2085545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (frame() && frame()->eventHandler()->autoscrollRenderer() == this) 2086545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch frame()->eventHandler()->stopAutoscrollTimer(true); 20878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2088635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (AXObjectCache::accessibilityEnabled()) { 2089635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project document()->axObjectCache()->childrenChanged(this->parent()); 20908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project document()->axObjectCache()->remove(this); 2091635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 20928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project animation()->cancelAnimations(this); 20938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // By default no ref-counting. RenderWidget::destroy() doesn't call 20958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // this function because it needs to do ref-counting. If anything 20968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // in this function changes, be sure to fix RenderWidget::destroy() as well. 20978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project remove(); 20998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // If this renderer had a parent, remove should have destroyed any counters 21012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // attached to this renderer and marked the affected other counters for 21022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // reevaluation. This apparently redundant check is here for the case when 21032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // this renderer had no parent at the time remove() was called. 21042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 21052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (m_hasCounterNodeMap) 21062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block RenderCounter::destroyCounterNodes(this); 21072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 21088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // FIXME: Would like to do this in RenderBoxModelObject, but the timing is so complicated that this can't easily 21098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // be moved into RenderBoxModelObject::destroy. 21105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (hasLayer()) { 21115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian setHasLayer(false); 21128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian toRenderBoxModelObject(this)->destroyLayer(); 21135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 21148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian arenaDelete(renderArena(), this); 21158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::arenaDelete(RenderArena* arena, void* base) 21188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_style) { 21208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (const FillLayer* bgLayer = m_style->backgroundLayers(); bgLayer; bgLayer = bgLayer->next()) { 21218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (StyleImage* backgroundImage = bgLayer->image()) 21228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project backgroundImage->removeClient(this); 21238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 21248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (const FillLayer* maskLayer = m_style->maskLayers(); maskLayer; maskLayer = maskLayer->next()) { 21268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (StyleImage* maskImage = maskLayer->image()) 21278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project maskImage->removeClient(this); 21288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 21298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (StyleImage* borderImage = m_style->borderImage().image()) 21318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project borderImage->removeClient(this); 21328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (StyleImage* maskBoxImage = m_style->maskBoxImage().image()) 21348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project maskBoxImage->removeClient(this); 21358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 21368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 21388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void* savedBase = baseOfRenderObjectBeingDeleted; 21398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project baseOfRenderObjectBeingDeleted = base; 21408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 21418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete this; 21428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 21438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project baseOfRenderObjectBeingDeleted = savedBase; 21448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 21458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Recover the size left there for us by operator delete and free the memory. 21478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project arena->free(*(size_t*)base, base); 21488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianVisiblePosition RenderObject::positionForCoordinates(int x, int y) 21518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return positionForPoint(IntPoint(x, y)); 21538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianVisiblePosition RenderObject::positionForPoint(const IntPoint&) 2156635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 21578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return createVisiblePosition(caretMinOffset(), DOWNSTREAM); 2158635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 2159635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 21608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::updateDragState(bool dragOn) 21618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool valueChanged = (dragOn != m_isDragging); 21638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isDragging = dragOn; 2164a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (valueChanged && style()->affectedByDragRules() && node()) 21655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian node()->setNeedsStyleRecalc(); 21668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling()) 21678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr->updateDragState(dragOn); 21688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::hitTest(const HitTestRequest& request, HitTestResult& result, const IntPoint& point, int tx, int ty, HitTestFilter hitTestFilter) 21718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool inside = false; 21738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hitTestFilter != HitTestSelf) { 21748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // First test the foreground layer (lines and inlines). 21758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project inside = nodeAtPoint(request, result, point.x(), point.y(), tx, ty, HitTestForeground); 21768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Test floats next. 21788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!inside) 21798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project inside = nodeAtPoint(request, result, point.x(), point.y(), tx, ty, HitTestFloat); 21808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Finally test to see if the mouse is in the background (within a child block's background). 21828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!inside) 21838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project inside = nodeAtPoint(request, result, point.x(), point.y(), tx, ty, HitTestChildBlockBackgrounds); 21848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 21858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // See if the mouse is inside us but not any of our descendants 21878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hitTestFilter != HitTestDescendants && !inside) 21888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project inside = nodeAtPoint(request, result, point.x(), point.y(), tx, ty, HitTestBlockBackground); 21898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return inside; 21918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::updateHitTestResult(HitTestResult& result, const IntPoint& point) 21948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result.innerNode()) 21968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 21978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Node* n = node(); 21998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (n) { 22008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result.setInnerNode(n); 22018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!result.innerNonSharedNode()) 22028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result.setInnerNonSharedNode(n); 22038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result.setLocalPoint(point); 22048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::nodeAtPoint(const HitTestRequest&, HitTestResult&, int /*x*/, int /*y*/, int /*tx*/, int /*ty*/, HitTestAction) 22088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 22108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::scheduleRelayout() 22138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isRenderView()) { 22158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian FrameView* view = toRenderView(this)->frameView(); 22168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (view) 22178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->scheduleRelayout(); 22188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (parent()) { 22198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameView* v = view() ? view()->frameView() : 0; 22208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (v) 22218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project v->scheduleRelayoutOfSubtree(this); 22228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderObject::layout() 22268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(needsLayout()); 22288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* child = firstChild(); 22298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while (child) { 22308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child->layoutIfNeeded(); 22318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(!child->needsLayout()); 22328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child = child->nextSibling(); 22338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 22348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian setNeedsLayout(false); 22358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<RenderStyle> RenderObject::uncachedFirstLineStyle(RenderStyle* style) const 22380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 22390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!document()->usesFirstLineRules()) 22400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return 0; 22410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 22420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(!isText()); 22430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 22440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RefPtr<RenderStyle> result; 22450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 22460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (isBlockFlow()) { 22470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (RenderBlock* firstLineBlock = this->firstLineBlock()) 22480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch result = firstLineBlock->getUncachedPseudoStyle(FIRST_LINE, style, firstLineBlock == this ? style : 0); 22490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } else if (!isAnonymous() && isRenderInline()) { 22500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RenderStyle* parentStyle = parent()->firstLineStyle(); 22510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (parentStyle != parent()->style()) 22520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch result = getUncachedPseudoStyle(FIRST_LINE_INHERITED, parentStyle, style); 22530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 22540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 22550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return result.release(); 22560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 22570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 22588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianRenderStyle* RenderObject::firstLineStyleSlowCase() const 22598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(document()->usesFirstLineRules()); 22618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderStyle* style = m_style.get(); 22638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian const RenderObject* renderer = isText() ? parent() : this; 22648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (renderer->isBlockFlow()) { 22658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (RenderBlock* firstLineBlock = renderer->firstLineBlock()) 22668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian style = firstLineBlock->getCachedPseudoStyle(FIRST_LINE, style); 22678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } else if (!renderer->isAnonymous() && renderer->isRenderInline()) { 22688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderStyle* parentStyle = renderer->parent()->firstLineStyle(); 22698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (parentStyle != renderer->parent()->style()) { 22708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // A first-line style is in effect. Cache a first-line style for ourselves. 2271bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen renderer->style()->setHasPseudoStyle(FIRST_LINE_INHERITED); 22728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian style = renderer->getCachedPseudoStyle(FIRST_LINE_INHERITED, parentStyle); 22738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 22768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return style; 22778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianRenderStyle* RenderObject::getCachedPseudoStyle(PseudoId pseudo, RenderStyle* parentStyle) const 22808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (pseudo < FIRST_INTERNAL_PSEUDOID && !style()->hasPseudoStyle(pseudo)) 22828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 22838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderStyle* cachedStyle = style()->getCachedPseudoStyle(pseudo); 22858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cachedStyle) 22868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return cachedStyle; 22878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<RenderStyle> result = getUncachedPseudoStyle(pseudo, parentStyle); 22898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result) 22908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return style()->addCachedPseudoStyle(result.release()); 22918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 22928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<RenderStyle> RenderObject::getUncachedPseudoStyle(PseudoId pseudo, RenderStyle* parentStyle, RenderStyle* ownStyle) const 22958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (pseudo < FIRST_INTERNAL_PSEUDOID && !ownStyle && !style()->hasPseudoStyle(pseudo)) 22978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 22988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!parentStyle) { 23000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(!ownStyle); 23018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project parentStyle = style(); 23020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 23038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Node* n = node(); 23058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while (n && !n->isElementNode()) 23068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian n = n->parentNode(); 23078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!n) 23088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 23098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<RenderStyle> result; 23118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (pseudo == FIRST_LINE_INHERITED) { 23128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result = document()->styleSelector()->styleForElement(static_cast<Element*>(n), parentStyle, false); 23138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result->setStyleType(FIRST_LINE_INHERITED); 23148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 23158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result = document()->styleSelector()->pseudoStyleForElement(pseudo, static_cast<Element*>(n), parentStyle); 23168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result.release(); 23178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2319dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic Color decorationColor(RenderObject* renderer) 23208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Color result; 2322dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (renderer->style()->textStrokeWidth() > 0) { 23238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Prefer stroke color if possible but not if it's fully transparent. 2324dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block result = renderer->style()->visitedDependentColor(CSSPropertyWebkitTextStrokeColor); 23258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result.alpha()) 23268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 23278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block result = renderer->style()->visitedDependentColor(CSSPropertyWebkitTextFillColor); 23308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 23318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::getTextDecorationColors(int decorations, Color& underline, Color& overline, 23348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Color& linethrough, bool quirksMode) 23358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* curr = this; 23378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project do { 23388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int currDecs = curr->style()->textDecoration(); 23398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (currDecs) { 23408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (currDecs & UNDERLINE) { 23418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project decorations &= ~UNDERLINE; 2342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block underline = decorationColor(curr); 23438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (currDecs & OVERLINE) { 23458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project decorations &= ~OVERLINE; 2346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block overline = decorationColor(curr); 23478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (currDecs & LINE_THROUGH) { 23498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project decorations &= ~LINE_THROUGH; 2350dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block linethrough = decorationColor(curr); 23518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr = curr->parent(); 2354e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if (curr && curr->isAnonymousBlock() && toRenderBlock(curr)->continuation()) 2355e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block curr = toRenderBlock(curr)->continuation(); 23568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } while (curr && decorations && (!quirksMode || !curr->node() || 23578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian (!curr->node()->hasTagName(aTag) && !curr->node()->hasTagName(fontTag)))); 23588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we bailed out, use the element we bailed out at (typically a <font> or <a> element). 23608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (decorations && curr) { 23618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (decorations & UNDERLINE) 2362dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block underline = decorationColor(curr); 23638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (decorations & OVERLINE) 2364dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block overline = decorationColor(curr); 23658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (decorations & LINE_THROUGH) 2366dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block linethrough = decorationColor(curr); 23678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT) 23718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::addDashboardRegions(Vector<DashboardRegionValue>& regions) 23728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Convert the style regions to absolute coordinates. 2374635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (style()->visibility() != VISIBLE || !isBox()) 23758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2376635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2377635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project RenderBox* box = toRenderBox(this); 23788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const Vector<StyleDashboardRegion>& styleRegions = style()->dashboardRegions(); 23808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned i, count = styleRegions.size(); 23818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (i = 0; i < count; i++) { 23828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project StyleDashboardRegion styleRegion = styleRegions[i]; 23838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2384635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int w = box->width(); 2385635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int h = box->height(); 23868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DashboardRegionValue region; 23888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.label = styleRegion.label; 23898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.bounds = IntRect(styleRegion.offset.left().value(), 23908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project styleRegion.offset.top().value(), 23918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project w - styleRegion.offset.left().value() - styleRegion.offset.right().value(), 23928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project h - styleRegion.offset.top().value() - styleRegion.offset.bottom().value()); 23938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.type = styleRegion.type; 23948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.clip = region.bounds; 23968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project computeAbsoluteRepaintRect(region.clip); 23978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (region.clip.height() < 0) { 23988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.clip.setHeight(0); 23998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.clip.setWidth(0); 24008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2402635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FloatPoint absPos = localToAbsolute(); 2403635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project region.bounds.setX(absPos.x() + styleRegion.offset.left().value()); 2404635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project region.bounds.setY(absPos.y() + styleRegion.offset.top().value()); 24058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2406545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (frame()) { 2407545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch float pageScaleFactor = frame()->page()->chrome()->scaleFactor(); 24088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (pageScaleFactor != 1.0f) { 24098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.bounds.scale(pageScaleFactor); 24108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project region.clip.scale(pageScaleFactor); 24118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project regions.append(region); 24158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::collectDashboardRegions(Vector<DashboardRegionValue>& regions) 24198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // RenderTexts don't have their own style, they just use their parent's style, 24218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // so we don't want to include them. 24228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isText()) 24238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addDashboardRegions(regions); 24268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling()) 24278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project curr->collectDashboardRegions(regions); 24288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 24308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderObject::willRenderImage(CachedImage*) 24328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Without visibility we won't render (and therefore don't care about animation). 24348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (style()->visibility() != VISIBLE) 24358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 24368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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) 24388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // then we don't want to render either. 24398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return !document()->inPageCache() && !document()->view()->isOffscreen(); 24408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint RenderObject::maximalOutlineSize(PaintPhase p) const 24438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (p != PaintPhaseOutline && p != PaintPhaseSelfOutline && p != PaintPhaseChildOutlines) 24458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 24468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return toRenderView(document()->renderer())->maximalOutlineSize(); 24478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint RenderObject::caretMinOffset() const 24508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 24528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint RenderObject::caretMaxOffset() const 24558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isReplaced()) 24578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return node() ? max(1U, node()->childNodeCount()) : 1; 24588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isHR()) 24598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 1; 24608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 24618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned RenderObject::caretMaxRenderedOffset() const 24648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 24668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint RenderObject::previousOffset(int current) const 24698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return current - 1; 24718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianint RenderObject::previousOffsetForBackwardDeletion(int current) const 24748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 24758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return current - 1; 24768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 24778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 24788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint RenderObject::nextOffset(int current) const 24798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return current + 1; 24818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderObject::adjustRectForOutlineAndShadow(IntRect& rect) const 24848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int outlineSize = outlineStyleForRepaint()->outlineSize(); 2486dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (const ShadowData* boxShadow = style()->boxShadow()) { 24875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen boxShadow->adjustRectForShadow(rect, outlineSize); 24885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return; 24895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 24908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen rect.inflate(outlineSize); 24928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectAnimationController* RenderObject::animation() const 24958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2496545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return frame()->animation(); 24978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2499635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid RenderObject::imageChanged(CachedImage* image, const IntRect* rect) 25008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2501635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project imageChanged(static_cast<WrappedImagePtr>(image), rect); 25028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianRenderBoxModelObject* RenderObject::offsetParent() const 25058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 25068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If any of the following holds true return null and stop this algorithm: 25078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // A is the root element. 25088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // A is the HTML body element. 25098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // The computed value of the position property for element A is fixed. 25108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (isRoot() || isBody() || (isPositioned() && style()->position() == FixedPosition)) 25118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return 0; 25128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If A is an area HTML element which has a map HTML element somewhere in the ancestor 25148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // chain return the nearest ancestor map HTML element and stop this algorithm. 25158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // FIXME: Implement! 25168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Return the nearest ancestor element of A for which at least one of the following is 25188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // true and stop this algorithm if such an ancestor is found: 25198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // * The computed value of the position property is not static. 25208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // * It is the HTML body element. 25218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // * The computed value of the position property of A is static and the ancestor 25228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // is one of the following HTML elements: td, th, or table. 25238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // * Our own extension: if there is a difference in the effective zoom 25242bde8e466a4451c7319e3a072d118917957d6554Steve Block 25258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool skipTables = isPositioned() || isRelPositioned(); 25268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian float currZoom = style()->effectiveZoom(); 25278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* curr = parent(); 25282bde8e466a4451c7319e3a072d118917957d6554Steve Block while (curr && (!curr->node() || (!curr->isPositioned() && !curr->isRelPositioned() && !curr->isBody()))) { 25298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Node* element = curr->node(); 25308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!skipTables && element) { 25318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool isTableElement = element->hasTagName(tableTag) || 25328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian element->hasTagName(tdTag) || 25338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian element->hasTagName(thTag); 25348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if ENABLE(WML) 25368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!isTableElement && element->isWMLElement()) 25378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian isTableElement = element->hasTagName(WMLNames::tableTag) || 25388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian element->hasTagName(WMLNames::tdTag); 25398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 25408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (isTableElement) 25428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 25438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 25448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian float newZoom = curr->style()->effectiveZoom(); 25468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (currZoom != newZoom) 25478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 25488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian currZoom = newZoom; 25498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian curr = curr->parent(); 25508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 25518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return curr && curr->isBoxModelObject() ? toRenderBoxModelObject(curr) : 0; 25528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 25538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianVisiblePosition RenderObject::createVisiblePosition(int offset, EAffinity affinity) 25558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 2556643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If this is a non-anonymous renderer in an editable area, then it's simple. 2557643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (Node* node = this->node()) { 25582bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!node->rendererIsEditable()) { 2559643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If it can be found, we prefer a visually equivalent position that is editable. 2560643ca7872b450ea4efacab6188849e5aac2ba161Steve Block Position position(node, offset); 25614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Position candidate = position.downstream(CanCrossEditingBoundary); 25622bde8e466a4451c7319e3a072d118917957d6554Steve Block if (candidate.deprecatedNode()->rendererIsEditable()) 2563643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return VisiblePosition(candidate, affinity); 25644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang candidate = position.upstream(CanCrossEditingBoundary); 25652bde8e466a4451c7319e3a072d118917957d6554Steve Block if (candidate.deprecatedNode()->rendererIsEditable()) 2566643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return VisiblePosition(candidate, affinity); 2567643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 256881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // FIXME: Eliminate legacy editing positions 256981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return VisiblePosition(Position(node, offset), affinity); 2570643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 25718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // We don't want to cross the boundary between editable and non-editable 25738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // regions of the document, but that is either impossible or at least 25748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // extremely unlikely in any normal case because we stop as soon as we 25758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // find a single non-anonymous renderer. 25768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Find a nearby non-anonymous renderer. 25788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* child = this; 25798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while (RenderObject* parent = child->parent()) { 25808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Find non-anonymous content after. 25818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian RenderObject* renderer = child; 25828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while ((renderer = renderer->nextInPreOrder(parent))) { 25838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (Node* node = renderer->node()) 258481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return VisiblePosition(firstPositionInOrBeforeNode(node), DOWNSTREAM); 25858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 25868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Find non-anonymous content before. 25888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian renderer = child; 25898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while ((renderer = renderer->previousInPreOrder())) { 25908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (renderer == parent) 25918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian break; 25928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (Node* node = renderer->node()) 259381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return VisiblePosition(lastPositionInOrAfterNode(node), DOWNSTREAM); 25948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 25958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Use the parent itself unless it too is anonymous. 25978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (Node* node = parent->node()) 259881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return VisiblePosition(firstPositionInOrBeforeNode(node), DOWNSTREAM); 25998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Repeat at the next level up. 26018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child = parent; 26028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 26038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Everything was anonymous. Give up. 26058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return VisiblePosition(); 26068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 26078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianVisiblePosition RenderObject::createVisiblePosition(const Position& position) 26098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 26108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (position.isNotNull()) 26118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return VisiblePosition(position); 26128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(!node()); 26148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return createVisiblePosition(0, DOWNSTREAM); 26158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 26168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG) 261821939df44de1705786c545cd1bf519d47250322dBen MurdochRenderSVGResourceContainer* RenderObject::toRenderSVGResourceContainer() 2619d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 2620d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT_NOT_REACHED(); 2621d0825bca7fe65beaee391d30da42e937db621564Steve Block return 0; 2622d0825bca7fe65beaee391d30da42e937db621564Steve Block} 26238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid RenderObject::setNeedsBoundariesUpdate() 26255ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 26265ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (RenderObject* renderer = parent()) 26275ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen renderer->setNeedsBoundariesUpdate(); 26285ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 26295ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 263021939df44de1705786c545cd1bf519d47250322dBen MurdochFloatRect RenderObject::objectBoundingBox() const 2631692e5dbf12901edacf14812a6fae25462920af42Steve Block{ 2632692e5dbf12901edacf14812a6fae25462920af42Steve Block ASSERT_NOT_REACHED(); 263321939df44de1705786c545cd1bf519d47250322dBen Murdoch return FloatRect(); 2634692e5dbf12901edacf14812a6fae25462920af42Steve Block} 2635692e5dbf12901edacf14812a6fae25462920af42Steve Block 263621939df44de1705786c545cd1bf519d47250322dBen MurdochFloatRect RenderObject::strokeBoundingBox() const 26378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 26385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ASSERT_NOT_REACHED(); 26395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return FloatRect(); 26405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 26415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 26425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// Returns the smallest rectangle enclosing all of the painted content 26435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// respecting clipping, masking, filters, opacity, stroke-width and markers 26445f1ab04193ad0130ca8204aadaceae083aca9881Feng QianFloatRect RenderObject::repaintRectInLocalCoordinates() const 26455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 26465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ASSERT_NOT_REACHED(); 26478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return FloatRect(); 26488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 26498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26508a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockAffineTransform RenderObject::localTransform() const 26518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 26528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block static const AffineTransform identity; 2653d0825bca7fe65beaee391d30da42e937db621564Steve Block return identity; 26548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 26558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26568a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockconst AffineTransform& RenderObject::localToParentTransform() const 26575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 26588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block static const AffineTransform identity; 2659d0825bca7fe65beaee391d30da42e937db621564Steve Block return identity; 26605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 26615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 26625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool RenderObject::nodeAtFloatPoint(const HitTestRequest&, HitTestResult&, const FloatPoint&, HitTestAction) 26635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 26645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ASSERT_NOT_REACHED(); 26655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return false; 26665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 26675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 26688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(SVG) 26698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 26718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 26738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid showTree(const WebCore::RenderObject* ro) 26758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 26768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ro) 26778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ro->showTreeForThis(); 26788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 26798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2680643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid showRenderTree(const WebCore::RenderObject* object1) 2681643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 2682643ca7872b450ea4efacab6188849e5aac2ba161Steve Block showRenderTree(object1, 0); 2683643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 2684643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 2685643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid showRenderTree(const WebCore::RenderObject* object1, const WebCore::RenderObject* object2) 2686643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 2687643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (object1) { 2688643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const WebCore::RenderObject* root = object1; 2689643ca7872b450ea4efacab6188849e5aac2ba161Steve Block while (root->parent()) 2690643ca7872b450ea4efacab6188849e5aac2ba161Steve Block root = root->parent(); 2691643ca7872b450ea4efacab6188849e5aac2ba161Steve Block root->showRenderTreeAndMark(object1, "*", object2, "-", 0); 2692643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 2693643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 2694643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 26958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2696