bool DOMSelection::containsNode(Node& node, bool allowPartial) const { if (!m_frame) return false; FrameSelection& selection = m_frame->selection(); if (m_frame->document() != &node.document() || selection.isNone()) return false; Ref<Node> protectedNode(node); RefPtr<Range> selectedRange = selection.selection().toNormalizedRange(); ContainerNode* parentNode = node.parentNode(); if (!parentNode || !parentNode->inDocument()) return false; unsigned nodeIndex = node.computeNodeIndex(); ExceptionCode ec = 0; bool nodeFullySelected = Range::compareBoundaryPoints(parentNode, nodeIndex, &selectedRange->startContainer(), selectedRange->startOffset(), ec) >= 0 && !ec && Range::compareBoundaryPoints(parentNode, nodeIndex + 1, &selectedRange->endContainer(), selectedRange->endOffset(), ec) <= 0 && !ec; ASSERT(!ec); if (nodeFullySelected) return true; bool nodeFullyUnselected = (Range::compareBoundaryPoints(parentNode, nodeIndex, &selectedRange->endContainer(), selectedRange->endOffset(), ec) > 0 && !ec) || (Range::compareBoundaryPoints(parentNode, nodeIndex + 1, &selectedRange->startContainer(), selectedRange->startOffset(), ec) < 0 && !ec); ASSERT(!ec); if (nodeFullyUnselected) return false; return allowPartial || node.isTextNode(); }
bool RenderWidget::setWidgetGeometry(const LayoutRect& frame) { if (!node()) return false; IntRect clipRect = roundedIntRect(enclosingLayer()->childrenClipRect()); IntRect newFrame = roundedIntRect(frame); bool clipChanged = m_clipRect != clipRect; bool frameRectChanged = m_widget->frameRect() != newFrame; if (!frameRectChanged && !clipChanged) return false; m_clipRect = clipRect; RefPtr<RenderWidget> protector(this); RefPtr<Node> protectedNode(node()); m_widget->setFrameRect(newFrame); if (clipChanged && !frameRectChanged) m_widget->clipRectChanged(); if (hasLayer() && layer()->compositingState() == PaintsIntoOwnBacking) layer()->compositedLayerMapping()->updateAfterWidgetResize(); bool boundsChanged = m_widget->frameRect().size() != newFrame.size(); return boundsChanged; }
bool LayoutPart::setWidgetGeometry(const LayoutRect& frame) { if (!node()) return false; Widget* widget = this->widget(); ASSERT(widget); IntRect newFrame = roundedIntRect(frame); if (widget->frameRect() == newFrame) return false; RefPtr<LayoutPart> protector(this); RawPtr<Node> protectedNode(node()); widget->setFrameRect(newFrame); return widget->frameRect().size() != newFrame.size(); }