VisiblePosition VisibleSelection::visiblePositionRespectingEditingBoundary(const LayoutPoint& localPoint, Node* targetNode) const { if (!targetNode->renderer()) return VisiblePosition(); LayoutPoint selectionEndPoint = localPoint; Element* editableElement = rootEditableElement(); if (editableElement && !editableElement->contains(targetNode)) { if (!editableElement->renderer()) return VisiblePosition(); FloatPoint absolutePoint = targetNode->renderer()->localToAbsolute(FloatPoint(selectionEndPoint)); selectionEndPoint = roundedLayoutPoint(editableElement->renderer()->absoluteToLocal(absolutePoint)); targetNode = editableElement; } return VisiblePosition(targetNode->renderer()->positionForPoint(selectionEndPoint)); }
void Element::updateFocusAppearance(bool /*restorePreviousSelection*/) { if (this == rootEditableElement()) { Frame* frame = document()->frame(); if (!frame) return; // FIXME: We should restore the previous selection if there is one. Selection newSelection = hasTagName(htmlTag) || hasTagName(bodyTag) ? Selection(Position(this, 0), DOWNSTREAM) : Selection::selectionFromContentsOfNode(this); if (frame->shouldChangeSelection(newSelection)) { frame->selection()->setSelection(newSelection); frame->revealSelection(); } #ifdef ANDROID_SCROLL_FIX // We handle the scrolling the screen with our navigation code, // so ignore this call to put the rectangle on screen. } #else } else if (renderer() && !renderer()->isWidget())
bool HTMLAnchorElement::treatLinkAsLiveForEventType(EventType eventType) const { if (!rendererIsEditable()) return true; Settings* settings = document()->settings(); if (!settings) return true; switch (settings->editableLinkBehavior()) { case EditableLinkDefaultBehavior: case EditableLinkAlwaysLive: return true; case EditableLinkNeverLive: return false; // If the selection prior to clicking on this link resided in the same editable block as this link, // and the shift key isn't pressed, we don't want to follow the link. case EditableLinkLiveWhenNotFocused: return eventType == MouseEventWithShiftKey || (eventType == MouseEventWithoutShiftKey && rootEditableElementForSelectionOnMouseDown() != rootEditableElement()); case EditableLinkOnlyLiveWithShiftKey: return eventType == MouseEventWithShiftKey; } ASSERT_NOT_REACHED(); return false; }
void HTMLAnchorElement::setActive(bool down, bool pause) { if (rendererIsEditable()) { EditableLinkBehavior editableLinkBehavior = EditableLinkDefaultBehavior; if (Settings* settings = document()->settings()) editableLinkBehavior = settings->editableLinkBehavior(); switch (editableLinkBehavior) { default: case EditableLinkDefaultBehavior: case EditableLinkAlwaysLive: break; case EditableLinkNeverLive: return; // Don't set the link to be active if the current selection is in the same editable block as // this link case EditableLinkLiveWhenNotFocused: if (down && document()->frame() && document()->frame()->selection()->rootEditableElement() == rootEditableElement()) return; break; case EditableLinkOnlyLiveWithShiftKey: return; } } ContainerNode::setActive(down, pause); }