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

Unified Diff: third_party/WebKit/Source/core/editing/FrameCaret.cpp

Issue 2161373002: Make FrameCaret to retrieve caret position from SelectionEditor (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 2016-07-21T11:26:04 Created 4 years, 5 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
Index: third_party/WebKit/Source/core/editing/FrameCaret.cpp
diff --git a/third_party/WebKit/Source/core/editing/FrameCaret.cpp b/third_party/WebKit/Source/core/editing/FrameCaret.cpp
index f8b99f28aa9b532f3a44083b3ecbc1d6c7a0c7b1..f43c1a8076e4144d9d92014befa585d0a0d67e4c 100644
--- a/third_party/WebKit/Source/core/editing/FrameCaret.cpp
+++ b/third_party/WebKit/Source/core/editing/FrameCaret.cpp
@@ -27,6 +27,7 @@
#include "core/editing/EditingUtilities.h"
#include "core/editing/Editor.h"
+#include "core/editing/SelectionEditor.h"
#include "core/editing/commands/CompositeEditCommand.h"
#include "core/frame/LocalFrame.h"
#include "core/frame/Settings.h"
@@ -39,8 +40,9 @@
namespace blink {
-FrameCaret::FrameCaret(LocalFrame* frame)
- : m_frame(frame)
+FrameCaret::FrameCaret(LocalFrame* frame, const SelectionEditor& selectionEditor)
+ : m_selectionEditor(&selectionEditor)
+ , m_frame(frame)
, m_previousCaretVisibility(CaretVisibility::Hidden)
, m_caretBlinkTimer(this, &FrameCaret::caretBlinkTimerFired)
, m_caretRectDirty(true)
@@ -55,22 +57,18 @@ FrameCaret::~FrameCaret() = default;
DEFINE_TRACE(FrameCaret)
{
+ visitor->trace(m_selectionEditor);
visitor->trace(m_frame);
visitor->trace(m_previousCaretNode);
- visitor->trace(m_caretPosition);
CaretBase::trace(visitor);
}
-void FrameCaret::setCaretPosition(const PositionWithAffinity& position)
+const PositionWithAffinity FrameCaret::caretPosition() const
{
- m_caretPosition = position;
- setCaretRectNeedsUpdate();
-}
-
-void FrameCaret::clear()
-{
- m_caretPosition = PositionWithAffinity();
- setCaretRectNeedsUpdate();
+ const VisibleSelection& selection = m_selectionEditor->visibleSelection<EditingStrategy>();
+ if (!selection.isCaret())
+ return PositionWithAffinity();
+ return PositionWithAffinity(selection.start(), selection.affinity());
}
inline static bool shouldStopBlinkingDueToTypingCommand(LocalFrame* frame)
@@ -82,7 +80,7 @@ void FrameCaret::updateAppearance()
{
// Paint a block cursor instead of a caret in overtype mode unless the caret is at the end of a line (in this case
// the FrameSelection will paint a blinking caret as usual).
- bool paintBlockCursor = m_shouldShowBlockCursor && isActive() && !isLogicalEndOfLine(createVisiblePosition(m_caretPosition));
+ bool paintBlockCursor = m_shouldShowBlockCursor && isActive() && !isLogicalEndOfLine(createVisiblePosition(caretPosition()));
bool shouldBlink = !paintBlockCursor && shouldBlinkCaret();
@@ -145,8 +143,8 @@ bool FrameCaret::caretPositionIsValidForDocument(const Document& document) const
if (!isActive())
return true;
- return m_caretPosition.position().document() == document
- && !m_caretPosition.position().isOrphan();
+ return caretPosition().position().document() == document
+ && !caretPosition().position().isOrphan();
}
void FrameCaret::invalidateCaretRect()
@@ -159,7 +157,7 @@ void FrameCaret::invalidateCaretRect()
LayoutObject* layoutObject = nullptr;
LayoutRect newRect;
if (isActive())
- newRect = localCaretRectOfPosition(m_caretPosition, layoutObject);
+ newRect = localCaretRectOfPosition(caretPosition(), layoutObject);
Node* newNode = layoutObject ? layoutObject->node() : nullptr;
if (!m_caretBlinkTimer.isActive()
@@ -185,12 +183,16 @@ IntRect FrameCaret::absoluteCaretBounds()
if (!isActive()) {
clearCaretRect();
} else {
- if (enclosingTextFormControl(m_caretPosition.position()))
- updateCaretRect(PositionWithAffinity(isVisuallyEquivalentCandidate(m_caretPosition.position()) ? m_caretPosition.position() : Position(), m_caretPosition.affinity()));
- else
- updateCaretRect(createVisiblePosition(m_caretPosition));
+ if (enclosingTextFormControl(caretPosition().position())) {
+ if (isVisuallyEquivalentCandidate(caretPosition().position()))
+ updateCaretRect(caretPosition());
+ else
+ updateCaretRect(createVisiblePosition(caretPosition()));
+ } else {
+ updateCaretRect(createVisiblePosition(caretPosition()));
+ }
}
- return absoluteBoundsForLocalRect(m_caretPosition.position().anchorNode(), localCaretRectWithoutUpdate());
+ return absoluteBoundsForLocalRect(caretPosition().position().anchorNode(), localCaretRectWithoutUpdate());
}
void FrameCaret::setShouldShowBlockCursor(bool shouldShowBlockCursor)
@@ -207,8 +209,8 @@ void FrameCaret::paintCaret(GraphicsContext& context, const LayoutPoint& paintOf
if (!(isActive() && m_shouldPaintCaret))
return;
- updateCaretRect(m_caretPosition);
- CaretBase::paintCaret(m_caretPosition.position().anchorNode(), context, paintOffset);
+ updateCaretRect(caretPosition());
+ CaretBase::paintCaret(caretPosition().position().anchorNode(), context, paintOffset);
}
void FrameCaret::dataWillChange(const CharacterData& node)
@@ -234,7 +236,6 @@ void FrameCaret::nodeWillBeRemoved(Node& node)
void FrameCaret::documentDetached()
{
- m_caretPosition = PositionWithAffinity();
m_caretBlinkTimer.stop();
m_previousCaretNode.clear();
}
@@ -247,7 +248,7 @@ bool FrameCaret::shouldBlinkCaret() const
if (m_frame->settings() && m_frame->settings()->caretBrowsingEnabled())
return false;
- Element* root = rootEditableElementOf(m_caretPosition.position());
+ Element* root = rootEditableElementOf(caretPosition().position());
if (!root)
return false;
@@ -255,7 +256,7 @@ bool FrameCaret::shouldBlinkCaret() const
if (!focusedElement)
return false;
- return focusedElement->isShadowIncludingInclusiveAncestorOf(m_caretPosition.position().anchorNode());
+ return focusedElement->isShadowIncludingInclusiveAncestorOf(caretPosition().position().anchorNode());
}
void FrameCaret::caretBlinkTimerFired(Timer<FrameCaret>*)
« no previous file with comments | « third_party/WebKit/Source/core/editing/FrameCaret.h ('k') | third_party/WebKit/Source/core/editing/FrameSelection.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698