void RenderTableRow::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) { ASSERT(style()->display() == TABLE_ROW); RenderBox::styleDidChange(diff, oldStyle); propagateStyleToAnonymousChildren(); if (section() && oldStyle && style()->logicalHeight() != oldStyle->logicalHeight()) section()->rowLogicalHeightChanged(rowIndex()); // If border was changed, notify table. if (parent()) { RenderTable* table = this->table(); if (table && !table->selfNeedsLayout() && !table->normalChildNeedsLayout() && oldStyle && oldStyle->border() != style()->border()) table->invalidateCollapsedBorders(); if (table && oldStyle && diff == StyleDifferenceLayout && needsLayout() && table->collapseBorders() && borderWidthChanged(oldStyle, style())) { // If the border width changes on a row, we need to make sure the cells in the row know to lay out again. // This only happens when borders are collapsed, since they end up affecting the border sides of the cell // itself. for (RenderBox* childBox = firstChildBox(); childBox; childBox = childBox->nextSiblingBox()) { if (!childBox->isTableCell()) continue; childBox->setChildNeedsLayout(true, MarkOnlyThis); } } } }
void RenderBox_setStyle(RenderBox *thisin, RenderStyle *_style) { RenderBox *this = thisin; bool oldpos, tmp; EPosition tmppo; tmp = this->m_positioned; oldpos = tmp; RenderObject_setStyle(this, _style); tmppo = _style->noninherited_flags.x.f._position; switch(tmppo) { case ABSOLUTE: case FIXED: { bool ltrue = true; this->m_positioned = ltrue; break; } default: { EFloat tmpf; EPosition tmpp; if (oldpos) { bool ltrue = true; this->m_positioned = ltrue; removeFromSpecialObjects(this); } { bool lfalse = false; this->m_positioned = lfalse; } tmpf = _style->noninherited_flags.x.f._floating; if(!this->isTableCell (this) && !(tmpf == FNONE)) { bool ltrue = true; this->m_floating = ltrue; } else { tmpp = _style->noninherited_flags.x.f._position; if (tmpp == RELATIVE) { bool ltrue = true; this->m_relPositioned = ltrue; } } } } }
static bool isDeletableElement(const Node* node) { if (!node || !node->isHTMLElement() || !node->inDocument() || !node->rendererIsEditable()) return false; // In general we want to only draw the UI around object of a certain area, but we still keep the min width/height to // make sure we don't end up with very thin or very short elements getting the UI. const int minimumArea = 2500; const int minimumWidth = 48; const int minimumHeight = 16; const unsigned minimumVisibleBorders = 1; RenderObject* renderer = node->renderer(); if (!renderer || !renderer->isBox()) return false; // Disallow the body element since it isn't practical to delete, and the deletion UI would be clipped. if (node->hasTagName(bodyTag)) return false; // Disallow elements with any overflow clip, since the deletion UI would be clipped as well. <rdar://problem/6840161> if (renderer->hasOverflowClip()) return false; // Disallow Mail blockquotes since the deletion UI would get in the way of editing for these. if (isMailBlockquote(node)) return false; RenderBox* box = toRenderBox(renderer); IntRect borderBoundingBox = box->borderBoundingBox(); if (borderBoundingBox.width() < minimumWidth || borderBoundingBox.height() < minimumHeight) return false; if ((borderBoundingBox.width() * borderBoundingBox.height()) < minimumArea) return false; if (box->isTable()) return true; if (node->hasTagName(ulTag) || node->hasTagName(olTag) || node->hasTagName(iframeTag)) return true; if (box->isOutOfFlowPositioned()) return true; if (box->isRenderBlock() && !box->isTableCell()) { const RenderStyle& style = box->style(); // Allow blocks that have background images if (style.hasBackgroundImage()) { for (const FillLayer* background = style.backgroundLayers(); background; background = background->next()) { if (background->image() && background->image()->canRender(box, 1)) return true; } } // Allow blocks with a minimum number of non-transparent borders unsigned visibleBorders = style.borderTop().isVisible() + style.borderBottom().isVisible() + style.borderLeft().isVisible() + style.borderRight().isVisible(); if (visibleBorders >= minimumVisibleBorders) return true; // Allow blocks that have a different background from it's parent ContainerNode* parentNode = node->parentNode(); if (!parentNode) return false; RenderObject* parentRenderer = parentNode->renderer(); if (!parentRenderer) return false; const RenderStyle& parentStyle = parentRenderer->style(); if (box->hasBackground() && (!parentRenderer->hasBackground() || style.visitedDependentColor(CSSPropertyBackgroundColor) != parentStyle.visitedDependentColor(CSSPropertyBackgroundColor))) return true; } return false; }