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

Unified Diff: Source/core/editing/VisibleUnits.cpp

Issue 1191283002: Make VisiblePosition::init to not use being constructed object (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: 2015-06-22T16:23:26 Add a comment to PositionWIthAffinity::operator==() Created 5 years, 6 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
« no previous file with comments | « Source/core/editing/VisibleUnits.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/editing/VisibleUnits.cpp
diff --git a/Source/core/editing/VisibleUnits.cpp b/Source/core/editing/VisibleUnits.cpp
index 15074fff0273711e3fd10b2bb436cc9af79678f6..d8eb3bf2aa97cf59f7adb2bd3328665688ab87ce 100644
--- a/Source/core/editing/VisibleUnits.cpp
+++ b/Source/core/editing/VisibleUnits.cpp
@@ -711,20 +711,20 @@ VisiblePosition nextWordPosition(const VisiblePosition &c)
// ---------
enum LineEndpointComputationMode { UseLogicalOrdering, UseInlineBoxOrdering };
-static VisiblePosition startPositionForLine(const VisiblePosition& c, LineEndpointComputationMode mode)
+static PositionWithAffinity startPositionForLine(const PositionWithAffinity& c, LineEndpointComputationMode mode)
{
if (c.isNull())
- return VisiblePosition();
+ return PositionWithAffinity();
- RootInlineBox* rootBox = RenderedPosition(c).rootBox();
+ RootInlineBox* rootBox = RenderedPosition(c.position(), c.affinity()).rootBox();
if (!rootBox) {
// There are VisiblePositions at offset 0 in blocks without
// RootInlineBoxes, like empty editable blocks and bordered blocks.
- Position p = c.deepEquivalent();
+ Position p = c.position();
if (p.deprecatedNode()->layoutObject() && p.deprecatedNode()->layoutObject()->isLayoutBlock() && !p.deprecatedEditingOffset())
return c;
- return VisiblePosition();
+ return PositionWithAffinity();
}
Node* startNode;
@@ -732,14 +732,14 @@ static VisiblePosition startPositionForLine(const VisiblePosition& c, LineEndpoi
if (mode == UseLogicalOrdering) {
startNode = rootBox->getLogicalStartBoxWithNode(startBox);
if (!startNode)
- return VisiblePosition();
+ return PositionWithAffinity();
} else {
// Generated content (e.g. list markers and CSS :before and :after pseudoelements) have no corresponding DOM element,
// and so cannot be represented by a VisiblePosition. Use whatever follows instead.
startBox = rootBox->firstLeafChild();
while (true) {
if (!startBox)
- return VisiblePosition();
+ return PositionWithAffinity();
startNode = startBox->layoutObject().nonPseudoNode();
if (startNode)
@@ -749,34 +749,39 @@ static VisiblePosition startPositionForLine(const VisiblePosition& c, LineEndpoi
}
}
- return VisiblePosition(startNode->isTextNode() ? Position(toText(startNode), toInlineTextBox(startBox)->start()) : positionBeforeNode(startNode));
+ return PositionWithAffinity(startNode->isTextNode() ? Position(toText(startNode), toInlineTextBox(startBox)->start()) : positionBeforeNode(startNode));
}
-static VisiblePosition startOfLine(const VisiblePosition& c, LineEndpointComputationMode mode)
+static PositionWithAffinity startOfLine(const PositionWithAffinity& c, LineEndpointComputationMode mode)
{
// TODO: this is the current behavior that might need to be fixed.
// Please refer to https://bugs.webkit.org/show_bug.cgi?id=49107 for detail.
- VisiblePosition visPos = startPositionForLine(c, mode);
+ PositionWithAffinity visPos = startPositionForLine(c, mode);
if (mode == UseLogicalOrdering) {
- if (ContainerNode* editableRoot = highestEditableRoot(c.deepEquivalent())) {
- if (!editableRoot->contains(visPos.deepEquivalent().containerNode()))
- return VisiblePosition(firstPositionInNode(editableRoot));
+ if (ContainerNode* editableRoot = highestEditableRoot(c.position())) {
+ if (!editableRoot->contains(visPos.position().containerNode()))
+ return PositionWithAffinity(firstPositionInNode(editableRoot));
}
}
- return c.honorEditingBoundaryAtOrBefore(visPos);
+ return honorEditingBoundaryAtOrBeforeOf(visPos, c.position());
+}
+
+static PositionWithAffinity startOfLine(const PositionWithAffinity& currentPosition)
+{
+ return startOfLine(currentPosition, UseInlineBoxOrdering);
}
// FIXME: Rename this function to reflect the fact it ignores bidi levels.
VisiblePosition startOfLine(const VisiblePosition& currentPosition)
{
- return startOfLine(currentPosition, UseInlineBoxOrdering);
+ return VisiblePosition(startOfLine(PositionWithAffinity(currentPosition.deepEquivalent(), currentPosition.affinity()), UseInlineBoxOrdering));
}
VisiblePosition logicalStartOfLine(const VisiblePosition& currentPosition)
{
- return startOfLine(currentPosition, UseLogicalOrdering);
+ return VisiblePosition(startOfLine(PositionWithAffinity(currentPosition.deepEquivalent(), currentPosition.affinity()), UseLogicalOrdering));
}
static VisiblePosition endPositionForLine(const VisiblePosition& c, LineEndpointComputationMode mode)
@@ -885,9 +890,23 @@ VisiblePosition logicalEndOfLine(const VisiblePosition& currentPosition)
return endOfLine(currentPosition, UseLogicalOrdering);
}
+bool inSameLine(const PositionWithAffinity& position1, const PositionWithAffinity& position2)
+{
+ if (position1.isNull() || position2.isNull())
+ return false;
+ PositionWithAffinity startOfLine1 = startOfLine(position1);
+ PositionWithAffinity startOfLine2 = startOfLine(position2);
+ if (startOfLine1 == startOfLine2)
+ return true;
+ Position canonicalized1 = canonicalPositionOf(startOfLine1.position());
+ if (canonicalized1 == startOfLine2.position())
+ return true;
+ return canonicalized1 == canonicalPositionOf(startOfLine2.position());
+}
+
bool inSameLine(const VisiblePosition &a, const VisiblePosition &b)
{
- return a.isNotNull() && startOfLine(a) == startOfLine(b);
+ return inSameLine(PositionWithAffinity(a.deepEquivalent(), a.affinity()), PositionWithAffinity(b.deepEquivalent(), b.affinity()));
}
bool isStartOfLine(const VisiblePosition &p)
« no previous file with comments | « Source/core/editing/VisibleUnits.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698