static bool shouldEmitTabBeforeNode(Node* node) { RenderObject* r = node->renderer(); // Table cells are delimited by tabs. if (!r || !isTableCell(node)) return false; // Want a tab before every cell other than the first one RenderTableCell* rc = static_cast<RenderTableCell*>(r); RenderTable* t = rc->table(); return t && (t->cellBefore(rc) || t->cellAbove(rc)); }
CollapsedBorderValue RenderTableCell::collapsedStartBorder() const { RenderTable* table = this->table(); bool isStartColumn = col() == 0; // For the start border, we need to check, in order of precedence: // (1) Our start border. int start = CSSProperty::resolveDirectionAwareProperty(CSSPropertyWebkitBorderStartColor, table->style()->direction(), table->style()->writingMode()); int end = CSSProperty::resolveDirectionAwareProperty(CSSPropertyWebkitBorderEndColor, table->style()->direction(), table->style()->writingMode()); CollapsedBorderValue result(&style()->borderStart(), style()->visitedDependentColor(start), BCELL); // (2) The end border of the preceding cell. if (RenderTableCell* prevCell = table->cellBefore(this)) { CollapsedBorderValue prevCellBorder = CollapsedBorderValue(&prevCell->style()->borderEnd(), prevCell->style()->visitedDependentColor(end), BCELL); result = chooseBorder(prevCellBorder, result); if (!result.exists()) return result; } else if (isStartColumn) { // (3) Our row's start border. result = chooseBorder(result, CollapsedBorderValue(&parent()->style()->borderStart(), parent()->style()->visitedDependentColor(start), BROW)); if (!result.exists()) return result; // (4) Our row group's start border. result = chooseBorder(result, CollapsedBorderValue(§ion()->style()->borderStart(), section()->style()->visitedDependentColor(start), BROWGROUP)); if (!result.exists()) return result; } // (5) Our column and column group's start borders. bool startColEdge; bool endColEdge; RenderTableCol* colElt = table->colElement(col(), &startColEdge, &endColEdge); if (colElt && startColEdge) { result = chooseBorder(result, CollapsedBorderValue(&colElt->style()->borderStart(), colElt->style()->visitedDependentColor(start), BCOL)); if (!result.exists()) return result; if (colElt->parent()->isTableCol() && !colElt->previousSibling()) { result = chooseBorder(result, CollapsedBorderValue(&colElt->parent()->style()->borderStart(), colElt->parent()->style()->visitedDependentColor(start), BCOLGROUP)); if (!result.exists()) return result; } } // (6) The end border of the preceding column. if (!isStartColumn) { colElt = table->colElement(col() -1, &startColEdge, &endColEdge); if (colElt && endColEdge) { CollapsedBorderValue endBorder = CollapsedBorderValue(&colElt->style()->borderEnd(), colElt->style()->visitedDependentColor(end), BCOL); result = chooseBorder(endBorder, result); if (!result.exists()) return result; } } else { // (7) The table's start border. result = chooseBorder(result, CollapsedBorderValue(&table->style()->borderStart(), table->style()->visitedDependentColor(start), BTABLE)); if (!result.exists()) return result; } return result; }
CollapsedBorderValue RenderTableCell::collapsedRightBorder(bool rtl) const { RenderTable* tableElt = table(); bool rightmostColumn; if (rtl) rightmostColumn = col() == 0; else { int effCol = tableElt->colToEffCol(col() + colSpan() - 1); rightmostColumn = effCol == tableElt->numEffCols() - 1; } // For border right, we need to check, in order of precedence: // (1) Our right border. CollapsedBorderValue result = CollapsedBorderValue(&style()->borderRight(), BCELL); // (2) The left border of the cell to the right. if (!rightmostColumn) { RenderTableCell* nextCell = rtl ? tableElt->cellBefore(this) : tableElt->cellAfter(this); if (nextCell && nextCell->style()) { result = rtl ? compareBorders(CollapsedBorderValue(&nextCell->style()->borderLeft(), BCELL), result) : compareBorders(result, CollapsedBorderValue(&nextCell->style()->borderLeft(), BCELL)); if (!result.exists()) return result; } } else { // (3) Our row's right border. result = compareBorders(result, CollapsedBorderValue(&parent()->style()->borderRight(), BROW)); if (!result.exists()) return result; // (4) Our row group's right border. result = compareBorders(result, CollapsedBorderValue(§ion()->style()->borderRight(), BROWGROUP)); if (!result.exists()) return result; } // (5) Our column and column group's right borders. bool startColEdge; bool endColEdge; RenderTableCol* colElt = tableElt->colElement(col() + (rtl ? 0 : colSpan() - 1), &startColEdge, &endColEdge); if (colElt && (!rtl ? endColEdge : startColEdge)) { result = compareBorders(result, CollapsedBorderValue(&colElt->style()->borderRight(), BCOL)); if (!result.exists()) return result; if (colElt->parent()->isTableCol() && (!rtl ? !colElt->nextSibling() : !colElt->previousSibling())) { result = compareBorders(result, CollapsedBorderValue(&colElt->parent()->style()->borderRight(), BCOLGROUP)); if (!result.exists()) return result; } } // (6) The left border of the column to the right. if (!rightmostColumn) { colElt = tableElt->colElement(col() + (rtl ? -1 : colSpan()), &startColEdge, &endColEdge); if (colElt && (!rtl ? startColEdge : endColEdge)) { result = rtl ? compareBorders(CollapsedBorderValue(&colElt->style()->borderLeft(), BCOL), result) : compareBorders(result, CollapsedBorderValue(&colElt->style()->borderLeft(), BCOL)); if (!result.exists()) return result; } } else { // (7) The table's right border. result = compareBorders(result, CollapsedBorderValue(&tableElt->style()->borderRight(), BTABLE)); if (!result.exists()) return result; } return result; }