Commit 95a072a8 authored by Yoshifumi Inoue's avatar Yoshifumi Inoue Committed by Commit Bot

Make SelectionModifier::Modify() to do nothing for empty selection

This patch makes |SelectionModifier::Modify()| to do nothing for empty selection
to avoid calling |NextWordPosition()| with null-position.

Note: |NextWordPosition()| doesn't accept null-position since the patch[1].

[1] http:/crrev.com/c/1004536 Make NextWordPosition() to utilize
TextOffsetMapping

Bug: 832061
Change-Id: I534af079f068f709c9b48a408988cb413a520b86
Reviewed-on: https://chromium-review.googlesource.com/1014841Reviewed-by: default avatarXiaocheng Hu <xiaochengh@chromium.org>
Commit-Queue: Yoshifumi Inoue <yosin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#551539}
parent d453881f
...@@ -639,6 +639,8 @@ bool SelectionModifier::Modify(SelectionModifyAlteration alter, ...@@ -639,6 +639,8 @@ bool SelectionModifier::Modify(SelectionModifyAlteration alter,
GetFrame().GetDocument()->Lifecycle()); GetFrame().GetDocument()->Lifecycle());
selection_ = PrepareToModifySelection(alter, direction); selection_ = PrepareToModifySelection(alter, direction);
if (selection_.IsNone())
return false;
bool was_range = selection_.IsRange(); bool was_range = selection_.IsRange();
VisiblePosition original_start_position = selection_.VisibleStart(); VisiblePosition original_start_position = selection_.VisibleStart();
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_SELECTION_MODIFIER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_SELECTION_MODIFIER_H_
#include "base/macros.h" #include "base/macros.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/editing/selection_template.h" #include "third_party/blink/renderer/core/editing/selection_template.h"
#include "third_party/blink/renderer/core/editing/visible_selection.h" #include "third_party/blink/renderer/core/editing/visible_selection.h"
#include "third_party/blink/renderer/platform/layout_unit.h" #include "third_party/blink/renderer/platform/layout_unit.h"
...@@ -41,7 +42,7 @@ enum class SelectionModifyAlteration { kMove, kExtend }; ...@@ -41,7 +42,7 @@ enum class SelectionModifyAlteration { kMove, kExtend };
enum class SelectionModifyVerticalDirection { kUp, kDown }; enum class SelectionModifyVerticalDirection { kUp, kDown };
enum class SelectionModifyDirection { kBackward, kForward, kLeft, kRight }; enum class SelectionModifyDirection { kBackward, kForward, kLeft, kRight };
class SelectionModifier { class CORE_EXPORT SelectionModifier {
STACK_ALLOCATED(); STACK_ALLOCATED();
public: public:
......
...@@ -11,6 +11,15 @@ namespace blink { ...@@ -11,6 +11,15 @@ namespace blink {
class SelectionModifierTest : public EditingTestBase {}; class SelectionModifierTest : public EditingTestBase {};
TEST_F(SelectionModifierTest, ExtendForwardByWordNone) {
SetBodyContent("abc");
SelectionModifier modifier(GetFrame(), SelectionInDOMTree());
modifier.Modify(SelectionModifyAlteration::kExtend,
SelectionModifyDirection::kForward, TextGranularity::kWord);
// We should not crash here. See http://crbug.com/832061
EXPECT_EQ(SelectionInDOMTree(), modifier.Selection().AsSelection());
}
TEST_F(SelectionModifierTest, leftPositionOf) { TEST_F(SelectionModifierTest, leftPositionOf) {
const char* body_content = const char* body_content =
"<b id=zero>0</b><p id=host><b id=one>1</b><b id=two>22</b></p><b " "<b id=zero>0</b><p id=host><b id=one>1</b><b id=two>22</b></p><b "
...@@ -49,6 +58,15 @@ TEST_F(SelectionModifierTest, leftPositionOf) { ...@@ -49,6 +58,15 @@ TEST_F(SelectionModifierTest, leftPositionOf) {
.DeepEquivalent()); .DeepEquivalent());
} }
TEST_F(SelectionModifierTest, MoveForwardByWordNone) {
SetBodyContent("abc");
SelectionModifier modifier(GetFrame(), SelectionInDOMTree());
modifier.Modify(SelectionModifyAlteration::kMove,
SelectionModifyDirection::kForward, TextGranularity::kWord);
// We should not crash here. See http://crbug.com/832061
EXPECT_EQ(SelectionInDOMTree(), modifier.Selection().AsSelection());
}
TEST_F(SelectionModifierTest, rightPositionOf) { TEST_F(SelectionModifierTest, rightPositionOf) {
const char* body_content = const char* body_content =
"<b id=zero>0</b><p id=host><b id=one>1</b><b id=two>22</b></p><b " "<b id=zero>0</b><p id=host><b id=one>1</b><b id=two>22</b></p><b "
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment