Commit 5bb682ed authored by Xiaocheng Hu's avatar Xiaocheng Hu Committed by Commit Bot

Move InlineBoxPosition related code to InlineBoxPosition.h/cpp

Bug: 771398
Change-Id: Ic35d94a75a5bb9d4ef00fc9abdb839c0e26c2c78
Reviewed-on: https://chromium-review.googlesource.com/701414Reviewed-by: default avatarYoshifumi Inoue <yosin@chromium.org>
Commit-Queue: Xiaocheng Hu <xiaochengh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#506626}
parent fd71dbbe
......@@ -44,6 +44,8 @@ blink_core_sources("editing") {
"ImeTextSpan.h",
"ImeTextSpanVectorBuilder.cpp",
"ImeTextSpanVectorBuilder.h",
"InlineBoxPosition.cpp",
"InlineBoxPosition.h",
"InlineBoxTraversal.cpp",
"InlineBoxTraversal.h",
"InputMethodController.cpp",
......@@ -327,6 +329,7 @@ source_set("unit_tests") {
"FrameSelectionTest.cpp",
"GranularityStrategyTest.cpp",
"ImeTextSpanTest.cpp",
"InlineBoxPositionTest.cpp",
"InputMethodControllerTest.cpp",
"LayoutSelectionTest.cpp",
"PositionIteratorTest.cpp",
......
This diff is collapsed.
/*
* Copyright (C) 2004 Apple Computer, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef InlineBoxPosition_h
#define InlineBoxPosition_h
#include "core/CoreExport.h"
#include "core/editing/Forward.h"
#include "platform/text/TextDirection.h"
#include "platform/wtf/Assertions.h"
namespace blink {
class InlineBox;
struct InlineBoxPosition {
InlineBox* inline_box;
int offset_in_box;
InlineBoxPosition() : inline_box(nullptr), offset_in_box(0) {}
InlineBoxPosition(InlineBox* inline_box, int offset_in_box)
: inline_box(inline_box), offset_in_box(offset_in_box) {
DCHECK(inline_box);
DCHECK_GE(offset_in_box, 0);
}
bool operator==(const InlineBoxPosition& other) const {
return inline_box == other.inline_box &&
offset_in_box == other.offset_in_box;
}
bool operator!=(const InlineBoxPosition& other) const {
return !operator==(other);
}
};
CORE_EXPORT InlineBoxPosition ComputeInlineBoxPosition(const Position&,
TextAffinity);
CORE_EXPORT InlineBoxPosition
ComputeInlineBoxPosition(const Position&,
TextAffinity,
TextDirection primary_direction);
CORE_EXPORT InlineBoxPosition
ComputeInlineBoxPosition(const PositionInFlatTree&, TextAffinity);
CORE_EXPORT InlineBoxPosition
ComputeInlineBoxPosition(const PositionInFlatTree&,
TextAffinity,
TextDirection primary_direction);
CORE_EXPORT InlineBoxPosition ComputeInlineBoxPosition(const VisiblePosition&);
// The print for |InlineBoxPosition| is available only for testing
// in "webkit_unit_tests", and implemented in
// "core/editing/InlineBoxPositionTest.cpp".
std::ostream& operator<<(std::ostream&, const InlineBoxPosition&);
} // namespace blink
#endif // InlineBoxPosition_h
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "core/editing/InlineBoxPosition.h"
#include "core/editing/Position.h"
#include "core/editing/testing/EditingTestBase.h"
#include "core/layout/line/InlineTextBox.h"
namespace blink {
std::ostream& operator<<(std::ostream& ostream,
const InlineBoxPosition& inline_box_position) {
if (!inline_box_position.inline_box)
return ostream << "null";
return ostream
<< inline_box_position.inline_box->GetLineLayoutItem().GetNode() << "@"
<< inline_box_position.offset_in_box;
}
class InlineBoxPositionTest : public EditingTestBase {};
TEST_F(InlineBoxPositionTest, ComputeInlineBoxPositionBidiIsolate) {
// "|" is bidi-level 0, and "foo" and "bar" are bidi-level 2
SetBodyContent(
"|<span id=sample style='unicode-bidi: isolate;'>foo<br>bar</span>|");
Element* sample = GetDocument().getElementById("sample");
Node* text = sample->firstChild();
const InlineBoxPosition& actual =
ComputeInlineBoxPosition(Position(text, 0), TextAffinity::kDownstream);
EXPECT_EQ(ToLayoutText(text->GetLayoutObject())->FirstTextBox(),
actual.inline_box);
}
// http://crbug.com/716093
TEST_F(InlineBoxPositionTest, ComputeInlineBoxPositionMixedEditable) {
SetBodyContent(
"<div contenteditable id=sample>abc<input contenteditable=false></div>");
Element* const sample = GetDocument().getElementById("sample");
const InlineBoxPosition& actual = ComputeInlineBoxPosition(
Position::LastPositionInNode(*sample), TextAffinity::kDownstream);
// Should not be in infinite-loop
EXPECT_EQ(nullptr, actual.inline_box);
EXPECT_EQ(0, actual.offset_in_box);
}
} // namespace blink
......@@ -30,6 +30,7 @@
#include "core/editing/RenderedPosition.h"
#include "core/editing/InlineBoxPosition.h"
#include "core/editing/InlineBoxTraversal.h"
#include "core/editing/TextAffinity.h"
#include "core/editing/VisiblePosition.h"
......
......@@ -28,6 +28,7 @@
#include "core/editing/EditingUtilities.h"
#include "core/editing/Editor.h"
#include "core/editing/InlineBoxPosition.h"
#include "core/editing/SelectionTemplate.h"
#include "core/editing/VisiblePosition.h"
#include "core/editing/VisibleUnits.h"
......
......@@ -31,6 +31,7 @@
#include "core/editing/SelectionModifier.h"
#include "core/editing/EditingUtilities.h"
#include "core/editing/InlineBoxPosition.h"
#include "core/editing/InlineBoxTraversal.h"
#include "core/editing/VisiblePosition.h"
#include "core/editing/VisibleUnits.h"
......
......@@ -26,6 +26,7 @@
#include "core/editing/SelectionModifier.h"
#include "core/editing/EditingUtilities.h"
#include "core/editing/InlineBoxPosition.h"
#include "core/editing/RenderedPosition.h"
#include "core/editing/VisiblePosition.h"
#include "core/editing/VisibleUnits.h"
......
......@@ -39,34 +39,11 @@ class LayoutUnit;
class LayoutObject;
class Node;
class IntPoint;
class InlineBox;
class IntRect;
class LocalFrame;
enum EWordSide { kRightWordIfOnBoundary = false, kLeftWordIfOnBoundary = true };
struct InlineBoxPosition {
InlineBox* inline_box;
int offset_in_box;
InlineBoxPosition() : inline_box(nullptr), offset_in_box(0) {}
InlineBoxPosition(InlineBox* inline_box, int offset_in_box)
: inline_box(inline_box), offset_in_box(offset_in_box) {
DCHECK(inline_box);
DCHECK_GE(offset_in_box, 0);
}
bool operator==(const InlineBoxPosition& other) const {
return inline_box == other.inline_box &&
offset_in_box == other.offset_in_box;
}
bool operator!=(const InlineBoxPosition& other) const {
return !operator==(other);
}
};
// This struct represents local caret rectangle in |layout_object|.
struct LocalCaretRect {
LayoutObject* layout_object = nullptr;
......@@ -79,11 +56,6 @@ struct LocalCaretRect {
bool IsEmpty() const { return !layout_object || rect.IsEmpty(); }
};
// The print for |InlineBoxPosition| is available only for testing
// in "webkit_unit_tests", and implemented in
// "core/editing/VisibleUnitsTest.cpp".
std::ostream& operator<<(std::ostream&, const InlineBoxPosition&);
// offset functions on Node
CORE_EXPORT int CaretMinOffset(const Node*);
CORE_EXPORT int CaretMaxOffset(const Node*);
......@@ -303,20 +275,6 @@ CORE_EXPORT bool IsEndOfEditableOrNonEditableContent(const VisiblePosition&);
CORE_EXPORT bool IsEndOfEditableOrNonEditableContent(
const VisiblePositionInFlatTree&);
CORE_EXPORT InlineBoxPosition ComputeInlineBoxPosition(const Position&,
TextAffinity);
CORE_EXPORT InlineBoxPosition
ComputeInlineBoxPosition(const Position&,
TextAffinity,
TextDirection primary_direction);
CORE_EXPORT InlineBoxPosition
ComputeInlineBoxPosition(const PositionInFlatTree&, TextAffinity);
CORE_EXPORT InlineBoxPosition
ComputeInlineBoxPosition(const PositionInFlatTree&,
TextAffinity,
TextDirection primary_direction);
CORE_EXPORT InlineBoxPosition ComputeInlineBoxPosition(const VisiblePosition&);
// Rect is local to the returned layoutObject
CORE_EXPORT LocalCaretRect
LocalCaretRectOfPosition(const PositionWithAffinity&);
......
......@@ -32,6 +32,7 @@
#include "core/dom/AXObjectCache.h"
#include "core/editing/EditingUtilities.h"
#include "core/editing/InlineBoxPosition.h"
#include "core/editing/RenderedPosition.h"
#include "core/editing/VisiblePosition.h"
#include "core/layout/api/LineLayoutBlockFlow.h"
......
......@@ -4,7 +4,6 @@
#include "core/editing/VisibleUnits.h"
#include <ostream> // NOLINT
#include "bindings/core/v8/V8BindingForTesting.h"
#include "core/dom/Text.h"
#include "core/editing/PositionWithAffinity.h"
......@@ -12,7 +11,6 @@
#include "core/editing/testing/EditingTestBase.h"
#include "core/html/TextControlElement.h"
#include "core/layout/LayoutTextFragment.h"
#include "core/layout/line/InlineTextBox.h"
namespace blink {
......@@ -50,15 +48,6 @@ VisiblePositionInFlatTree CreateVisiblePositionInFlatTree(
} // namespace
std::ostream& operator<<(std::ostream& ostream,
const InlineBoxPosition& inline_box_position) {
if (!inline_box_position.inline_box)
return ostream << "null";
return ostream
<< inline_box_position.inline_box->GetLineLayoutItem().GetNode() << "@"
<< inline_box_position.offset_in_box;
}
class VisibleUnitsTest : public EditingTestBase {};
TEST_F(VisibleUnitsTest, absoluteCaretBoundsOf) {
......@@ -208,33 +197,6 @@ TEST_F(VisibleUnitsTest, characterBefore) {
EXPECT_EQ('1', CharacterBefore(CreateVisiblePositionInFlatTree(*five, 0)));
}
TEST_F(VisibleUnitsTest, computeInlineBoxPositionBidiIsolate) {
// "|" is bidi-level 0, and "foo" and "bar" are bidi-level 2
SetBodyContent(
"|<span id=sample style='unicode-bidi: isolate;'>foo<br>bar</span>|");
Element* sample = GetDocument().getElementById("sample");
Node* text = sample->firstChild();
const InlineBoxPosition& actual =
ComputeInlineBoxPosition(Position(text, 0), TextAffinity::kDownstream);
EXPECT_EQ(ToLayoutText(text->GetLayoutObject())->FirstTextBox(),
actual.inline_box);
}
// http://crbug.com/716093
TEST_F(VisibleUnitsTest, ComputeInlineBoxPositionMixedEditable) {
SetBodyContent(
"<div contenteditable id=sample>abc<input contenteditable=false></div>");
Element* const sample = GetDocument().getElementById("sample");
const InlineBoxPosition& actual = ComputeInlineBoxPosition(
Position::LastPositionInNode(*sample), TextAffinity::kDownstream);
// Should not be in infinite-loop
EXPECT_EQ(nullptr, actual.inline_box);
EXPECT_EQ(0, actual.offset_in_box);
}
TEST_F(VisibleUnitsTest, endOfDocument) {
const char* body_content = "<a id=host><b id=one>1</b><b id=two>22</b></a>";
const char* shadow_content =
......
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