Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(907)

Unified Diff: third_party/WebKit/WebCore/rendering/RenderObject.cpp

Issue 21184: WebKit merge 40722:40785 (part 1) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 11 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/WebCore/rendering/RenderObject.cpp
===================================================================
--- third_party/WebKit/WebCore/rendering/RenderObject.cpp (revision 9391)
+++ third_party/WebKit/WebCore/rendering/RenderObject.cpp (working copy)
@@ -429,7 +429,7 @@
beforeChild = newObject->parent()->findNextLayer(parentLayer, newObject);
newObject = 0;
}
- parentLayer->addChild(toRenderBox(obj)->layer(), beforeChild);
+ parentLayer->addChild(toRenderBoxModelObject(obj)->layer(), beforeChild);
return;
}
@@ -453,7 +453,7 @@
return;
if (hasLayer()) {
- parentLayer->removeChild(toRenderBox(this)->layer());
+ parentLayer->removeChild(toRenderBoxModelObject(this)->layer());
return;
}
@@ -467,7 +467,7 @@
return;
if (hasLayer()) {
- RenderLayer* layer = toRenderBox(this)->layer();
+ RenderLayer* layer = toRenderBoxModelObject(this)->layer();
if (oldParent)
oldParent->removeChild(layer);
newParent->addChild(layer);
@@ -486,7 +486,7 @@
return 0;
// Step 1: If our layer is a child of the desired parent, then return our layer.
- RenderLayer* ourLayer = hasLayer() ? toRenderBox(this)->layer() : 0;
+ RenderLayer* ourLayer = hasLayer() ? toRenderBoxModelObject(this)->layer() : 0;
if (ourLayer && ourLayer->parent() == parentLayer)
return ourLayer;
@@ -518,7 +518,7 @@
{
const RenderObject* curr = this;
while (curr) {
- RenderLayer* layer = curr->hasLayer() ? toRenderBox(curr)->layer() : 0;
+ RenderLayer* layer = curr->hasLayer() ? toRenderBoxModelObject(curr)->layer() : 0;
if (layer)
return layer;
curr = curr->parent();
@@ -531,7 +531,7 @@
{
const RenderObject* curr = this;
while (curr) {
- RenderLayer* layer = curr->hasLayer() ? toRenderBox(curr)->layer() : 0;
+ RenderLayer* layer = curr->hasLayer() ? toRenderBoxModelObject(curr)->layer() : 0;
if (layer && layer->isComposited())
return layer;
curr = curr->parent();
@@ -583,7 +583,8 @@
void RenderObject::setLayerNeedsFullRepaint()
{
- toRenderBox(this)->layer()->setNeedsFullRepaint(true);
+ ASSERT(hasLayer());
+ toRenderBoxModelObject(this)->layer()->setNeedsFullRepaint(true);
}
RenderBlock* RenderObject::containingBlock() const
@@ -1549,7 +1550,7 @@
void RenderObject::absoluteRectsForRange(Vector<IntRect>& rects, unsigned start, unsigned end, bool)
{
- if (!virtualChildren()->firstChild()) {
+ if (!firstChild()) {
if ((isInline() || isAnonymousBlock())) {
FloatPoint absPos = localToAbsolute(FloatPoint());
absoluteRects(rects, absPos.x(), absPos.y());
@@ -1568,7 +1569,7 @@
void RenderObject::absoluteQuadsForRange(Vector<FloatQuad>& quads, unsigned start, unsigned end, bool)
{
- if (!virtualChildren()->firstChild()) {
+ if (!firstChild()) {
if (isInline() || isAnonymousBlock())
absoluteQuads(quads);
return;
@@ -1666,14 +1667,11 @@
void RenderObject::repaint(bool immediate)
{
- // Can't use view(), since we might be unrooted.
- RenderObject* o = this;
- while (o->parent())
- o = o->parent();
- if (!o->isRenderView())
+ // Don't repaint if we're unrooted (note that view() still returns the view when unrooted)
+ RenderView* view;
+ if (!isRooted(&view))
return;
- RenderView* view = toRenderView(o);
if (view->printing())
return; // Don't repaint if we're printing.
@@ -1683,14 +1681,11 @@
void RenderObject::repaintRectangle(const IntRect& r, bool immediate)
{
- // Can't use view(), since we might be unrooted.
- RenderObject* o = this;
- while (o->parent())
- o = o->parent();
- if (!o->isRenderView())
+ // Don't repaint if we're unrooted (note that view() still returns the view when unrooted)
+ RenderView* view;
+ if (!isRooted(&view))
return;
- RenderView* view = toRenderView(o);
if (view->printing())
return; // Don't repaint if we're printing.
@@ -1976,7 +1971,7 @@
setInline(style()->isDisplayInlineType());
if (isInline() != parent()->childrenInline()) {
if (!isInline())
- toRenderBox(parent())->childBecameNonInline(this);
+ toRenderBoxModelObject(parent())->childBecameNonInline(this);
else {
// An anonymous block must be made to wrap this inline.
RenderBlock* block = createAnonymousBlock();
@@ -2211,6 +2206,21 @@
return toRenderView(document()->renderer());
}
+bool RenderObject::isRooted(RenderView** view)
+{
+ RenderObject* o = this;
+ while (o->parent())
+ o = o->parent();
+
+ if (!o->isRenderView())
+ return false;
+
+ if (view)
+ *view = toRenderView(o);
+
+ return true;
+}
+
bool RenderObject::hasOutlineAnnotation() const
{
return element() && element()->isLink() && document()->printing();
@@ -2287,11 +2297,11 @@
remove();
- // FIXME: Would like to do this in RenderBox, but the timing is so complicated that this can't easily
- // be moved into RenderBox::destroy.
+ // FIXME: Would like to do this in RenderBoxModelObject, but the timing is so complicated that this can't easily
+ // be moved into RenderBoxModelObject::destroy.
RenderArena* arena = renderArena();
if (hasLayer())
- toRenderBox(this)->layer()->destroy(arena);
+ toRenderBoxModelObject(this)->layer()->destroy(arena);
arenaDelete(arena, this);
}
@@ -2789,6 +2799,56 @@
imageChanged(static_cast<WrappedImagePtr>(image), rect);
}
+RenderBoxModelObject* RenderObject::offsetParent() const
+{
+ // If any of the following holds true return null and stop this algorithm:
+ // A is the root element.
+ // A is the HTML body element.
+ // The computed value of the position property for element A is fixed.
+ if (isRoot() || isBody() || (isPositioned() && style()->position() == FixedPosition))
+ return 0;
+
+ // If A is an area HTML element which has a map HTML element somewhere in the ancestor
+ // chain return the nearest ancestor map HTML element and stop this algorithm.
+ // FIXME: Implement!
+
+ // Return the nearest ancestor element of A for which at least one of the following is
+ // true and stop this algorithm if such an ancestor is found:
+ // * The computed value of the position property is not static.
+ // * It is the HTML body element.
+ // * The computed value of the position property of A is static and the ancestor
+ // is one of the following HTML elements: td, th, or table.
+ // * Our own extension: if there is a difference in the effective zoom
+ bool skipTables = isPositioned() || isRelPositioned();
+ float currZoom = style()->effectiveZoom();
+ RenderObject* curr = parent();
+ while (curr && (!curr->element() ||
+ (!curr->isPositioned() && !curr->isRelPositioned() && !curr->isBody()))) {
+ Node* element = curr->element();
+ if (!skipTables && element) {
+ bool isTableElement = element->hasTagName(tableTag) ||
+ element->hasTagName(tdTag) ||
+ element->hasTagName(thTag);
+
+#if ENABLE(WML)
+ if (!isTableElement && element->isWMLElement())
+ isTableElement = element->hasTagName(WMLNames::tableTag) ||
+ element->hasTagName(WMLNames::tdTag);
+#endif
+
+ if (isTableElement)
+ break;
+ }
+
+ float newZoom = curr->style()->effectiveZoom();
+ if (currZoom != newZoom)
+ break;
+ currZoom = newZoom;
+ curr = curr->parent();
+ }
+ return curr && curr->isBox() ? toRenderBox(curr) : 0;
+}
+
#if ENABLE(SVG)
FloatRect RenderObject::relativeBBox(bool) const
« no previous file with comments | « third_party/WebKit/WebCore/rendering/RenderObject.h ('k') | third_party/WebKit/WebCore/rendering/RenderPath.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698