| Index: third_party/WebKit/Source/core/layout/LayoutView.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/LayoutView.cpp b/third_party/WebKit/Source/core/layout/LayoutView.cpp
|
| index 22314dc7eeb4dd3d1cd2f2540c41434e4982c56a..af059cfdf331c1de38b46ab52e69dee2d10aeeae 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutView.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutView.cpp
|
| @@ -25,7 +25,6 @@
|
| #include "core/dom/Document.h"
|
| #include "core/dom/Element.h"
|
| #include "core/editing/FrameSelection.h"
|
| -#include "core/editing/LayoutSelection.h"
|
| #include "core/frame/FrameView.h"
|
| #include "core/frame/LocalFrame.h"
|
| #include "core/frame/Settings.h"
|
| @@ -610,289 +609,6 @@ void LayoutView::AbsoluteQuads(Vector<FloatQuad>& quads,
|
| FloatRect(FloatPoint(), FloatSize(Layer()->size())), mode));
|
| }
|
|
|
| -static LayoutObject* LayoutObjectAfterPosition(LayoutObject* object,
|
| - unsigned offset) {
|
| - if (!object)
|
| - return nullptr;
|
| -
|
| - LayoutObject* child = object->ChildAt(offset);
|
| - return child ? child : object->NextInPreOrderAfterChildren();
|
| -}
|
| -
|
| -static LayoutRect SelectionRectForLayoutObject(const LayoutObject* object) {
|
| - if (!object->IsRooted())
|
| - return LayoutRect();
|
| -
|
| - if (!object->CanUpdateSelectionOnRootLineBoxes())
|
| - return LayoutRect();
|
| -
|
| - return object->SelectionRectInViewCoordinates();
|
| -}
|
| -
|
| -// TODO(yoichio): Move this to LayoutSelection.
|
| -IntRect LayoutSelection::SelectionBounds() {
|
| - // Now create a single bounding box rect that encloses the whole selection.
|
| - LayoutRect sel_rect;
|
| -
|
| - typedef HashSet<const LayoutBlock*> VisitedContainingBlockSet;
|
| - VisitedContainingBlockSet visited_containing_blocks;
|
| -
|
| - Commit(*frame_selection_->GetDocument().GetLayoutView());
|
| - LayoutObject* os = selection_start_;
|
| - LayoutObject* stop =
|
| - LayoutObjectAfterPosition(selection_end_, selection_end_pos_);
|
| - while (os && os != stop) {
|
| - if ((os->CanBeSelectionLeaf() || os == selection_start_ ||
|
| - os == selection_end_) &&
|
| - os->GetSelectionState() != SelectionNone) {
|
| - // Blocks are responsible for painting line gaps and margin gaps. They
|
| - // must be examined as well.
|
| - sel_rect.Unite(SelectionRectForLayoutObject(os));
|
| - const LayoutBlock* cb = os->ContainingBlock();
|
| - while (cb && !cb->IsLayoutView()) {
|
| - sel_rect.Unite(SelectionRectForLayoutObject(cb));
|
| - VisitedContainingBlockSet::AddResult add_result =
|
| - visited_containing_blocks.insert(cb);
|
| - if (!add_result.is_new_entry)
|
| - break;
|
| - cb = cb->ContainingBlock();
|
| - }
|
| - }
|
| -
|
| - os = os->NextInPreOrder();
|
| - }
|
| -
|
| - return PixelSnappedIntRect(sel_rect);
|
| -}
|
| -
|
| -// TODO(yoichio): Move this to LayoutSelection.
|
| -void LayoutSelection::InvalidatePaintForSelection() {
|
| - LayoutObject* end =
|
| - LayoutObjectAfterPosition(selection_end_, selection_end_pos_);
|
| - for (LayoutObject* o = selection_start_; o && o != end;
|
| - o = o->NextInPreOrder()) {
|
| - if (!o->CanBeSelectionLeaf() && o != selection_start_ &&
|
| - o != selection_end_)
|
| - continue;
|
| - if (o->GetSelectionState() == SelectionNone)
|
| - continue;
|
| -
|
| - o->SetShouldInvalidateSelection();
|
| - }
|
| -}
|
| -
|
| -// When exploring the LayoutTree looking for the nodes involved in the
|
| -// Selection, sometimes it's required to change the traversing direction because
|
| -// the "start" position is below the "end" one.
|
| -static inline LayoutObject* GetNextOrPrevLayoutObjectBasedOnDirection(
|
| - const LayoutObject* o,
|
| - const LayoutObject* stop,
|
| - bool& continue_exploring,
|
| - bool& exploring_backwards) {
|
| - LayoutObject* next;
|
| - if (exploring_backwards) {
|
| - next = o->PreviousInPreOrder();
|
| - continue_exploring = next && !(next)->IsLayoutView();
|
| - } else {
|
| - next = o->NextInPreOrder();
|
| - continue_exploring = next && next != stop;
|
| - exploring_backwards = !next && (next != stop);
|
| - if (exploring_backwards) {
|
| - next = stop->PreviousInPreOrder();
|
| - continue_exploring = next && !next->IsLayoutView();
|
| - }
|
| - }
|
| -
|
| - return next;
|
| -}
|
| -
|
| -// TODO(yoichio): Move this to LayoutSelection.
|
| -void LayoutSelection::SetSelection(
|
| - LayoutObject* start,
|
| - int start_pos,
|
| - LayoutObject* end,
|
| - int end_pos,
|
| - SelectionPaintInvalidationMode block_paint_invalidation_mode) {
|
| - // This code makes no assumptions as to if the layout tree is up to date or
|
| - // not and will not try to update it. Currently clearSelection calls this
|
| - // (intentionally) without updating the layout tree as it doesn't care.
|
| - // Other callers may want to force recalc style before calling this.
|
| -
|
| - // Make sure both our start and end objects are defined.
|
| - // Check www.msnbc.com and try clicking around to find the case where this
|
| - // happened.
|
| - if ((start && !end) || (end && !start))
|
| - return;
|
| -
|
| - // Just return if the selection hasn't changed.
|
| - if (selection_start_ == start && selection_start_pos_ == start_pos &&
|
| - selection_end_ == end && selection_end_pos_ == end_pos)
|
| - return;
|
| -
|
| - // Record the old selected objects. These will be used later when we compare
|
| - // against the new selected objects.
|
| - int old_start_pos = selection_start_pos_;
|
| - int old_end_pos = selection_end_pos_;
|
| -
|
| - // Objects each have a single selection rect to examine.
|
| - typedef HashMap<LayoutObject*, SelectionState> SelectedObjectMap;
|
| - SelectedObjectMap old_selected_objects;
|
| - // FIXME: |newSelectedObjects| doesn't really need to store the
|
| - // SelectionState, it's just more convenient to have it use the same data
|
| - // structure as |oldSelectedObjects|.
|
| - SelectedObjectMap new_selected_objects;
|
| -
|
| - // Blocks contain selected objects and fill gaps between them, either on the
|
| - // left, right, or in between lines and blocks.
|
| - // In order to get the visual rect right, we have to examine left, middle, and
|
| - // right rects individually, since otherwise the union of those rects might
|
| - // remain the same even when changes have occurred.
|
| - typedef HashMap<LayoutBlock*, SelectionState> SelectedBlockMap;
|
| - SelectedBlockMap old_selected_blocks;
|
| - // FIXME: |newSelectedBlocks| doesn't really need to store the SelectionState,
|
| - // it's just more convenient to have it use the same data structure as
|
| - // |oldSelectedBlocks|.
|
| - SelectedBlockMap new_selected_blocks;
|
| -
|
| - LayoutObject* os = selection_start_;
|
| - LayoutObject* stop =
|
| - LayoutObjectAfterPosition(selection_end_, selection_end_pos_);
|
| - bool exploring_backwards = false;
|
| - bool continue_exploring = os && (os != stop);
|
| - while (continue_exploring) {
|
| - if ((os->CanBeSelectionLeaf() || os == selection_start_ ||
|
| - os == selection_end_) &&
|
| - os->GetSelectionState() != SelectionNone) {
|
| - // Blocks are responsible for painting line gaps and margin gaps. They
|
| - // must be examined as well.
|
| - old_selected_objects.Set(os, os->GetSelectionState());
|
| - if (block_paint_invalidation_mode == kPaintInvalidationNewXOROld) {
|
| - LayoutBlock* cb = os->ContainingBlock();
|
| - while (cb && !cb->IsLayoutView()) {
|
| - SelectedBlockMap::AddResult result =
|
| - old_selected_blocks.insert(cb, cb->GetSelectionState());
|
| - if (!result.is_new_entry)
|
| - break;
|
| - cb = cb->ContainingBlock();
|
| - }
|
| - }
|
| - }
|
| -
|
| - os = GetNextOrPrevLayoutObjectBasedOnDirection(os, stop, continue_exploring,
|
| - exploring_backwards);
|
| - }
|
| -
|
| - // Now clear the selection.
|
| - SelectedObjectMap::iterator old_objects_end = old_selected_objects.end();
|
| - for (SelectedObjectMap::iterator i = old_selected_objects.begin();
|
| - i != old_objects_end; ++i)
|
| - i->key->SetSelectionStateIfNeeded(SelectionNone);
|
| -
|
| - // set selection start and end
|
| - selection_start_ = start;
|
| - selection_start_pos_ = start_pos;
|
| - selection_end_ = end;
|
| - selection_end_pos_ = end_pos;
|
| -
|
| - // Update the selection status of all objects between m_selectionStart and
|
| - // m_selectionEnd
|
| - if (start && start == end) {
|
| - start->SetSelectionStateIfNeeded(SelectionBoth);
|
| - } else {
|
| - if (start)
|
| - start->SetSelectionStateIfNeeded(SelectionStart);
|
| - if (end)
|
| - end->SetSelectionStateIfNeeded(SelectionEnd);
|
| - }
|
| -
|
| - LayoutObject* o = start;
|
| - stop = LayoutObjectAfterPosition(end, end_pos);
|
| -
|
| - while (o && o != stop) {
|
| - if (o != start && o != end && o->CanBeSelectionLeaf())
|
| - o->SetSelectionStateIfNeeded(SelectionInside);
|
| - o = o->NextInPreOrder();
|
| - }
|
| -
|
| - // Now that the selection state has been updated for the new objects, walk
|
| - // them again and put them in the new objects list.
|
| - o = start;
|
| - exploring_backwards = false;
|
| - continue_exploring = o && (o != stop);
|
| - while (continue_exploring) {
|
| - if ((o->CanBeSelectionLeaf() || o == start || o == end) &&
|
| - o->GetSelectionState() != SelectionNone) {
|
| - new_selected_objects.Set(o, o->GetSelectionState());
|
| - LayoutBlock* cb = o->ContainingBlock();
|
| - while (cb && !cb->IsLayoutView()) {
|
| - SelectedBlockMap::AddResult result =
|
| - new_selected_blocks.insert(cb, cb->GetSelectionState());
|
| - if (!result.is_new_entry)
|
| - break;
|
| - cb = cb->ContainingBlock();
|
| - }
|
| - }
|
| -
|
| - o = GetNextOrPrevLayoutObjectBasedOnDirection(o, stop, continue_exploring,
|
| - exploring_backwards);
|
| - }
|
| -
|
| - // TODO(yoichio): DCHECK(frame_selection_->,,,->GetFrameView());
|
| - if (!frame_selection_->GetDocument().GetLayoutView()->GetFrameView())
|
| - return;
|
| -
|
| - // Have any of the old selected objects changed compared to the new selection?
|
| - for (SelectedObjectMap::iterator i = old_selected_objects.begin();
|
| - i != old_objects_end; ++i) {
|
| - LayoutObject* obj = i->key;
|
| - SelectionState new_selection_state = obj->GetSelectionState();
|
| - SelectionState old_selection_state = i->value;
|
| - if (new_selection_state != old_selection_state ||
|
| - (selection_start_ == obj && old_start_pos != selection_start_pos_) ||
|
| - (selection_end_ == obj && old_end_pos != selection_end_pos_)) {
|
| - obj->SetShouldInvalidateSelection();
|
| - new_selected_objects.erase(obj);
|
| - }
|
| - }
|
| -
|
| - // Any new objects that remain were not found in the old objects dict, and so
|
| - // they need to be updated.
|
| - SelectedObjectMap::iterator new_objects_end = new_selected_objects.end();
|
| - for (SelectedObjectMap::iterator i = new_selected_objects.begin();
|
| - i != new_objects_end; ++i)
|
| - i->key->SetShouldInvalidateSelection();
|
| -
|
| - // Have any of the old blocks changed?
|
| - SelectedBlockMap::iterator old_blocks_end = old_selected_blocks.end();
|
| - for (SelectedBlockMap::iterator i = old_selected_blocks.begin();
|
| - i != old_blocks_end; ++i) {
|
| - LayoutBlock* block = i->key;
|
| - SelectionState new_selection_state = block->GetSelectionState();
|
| - SelectionState old_selection_state = i->value;
|
| - if (new_selection_state != old_selection_state) {
|
| - block->SetShouldInvalidateSelection();
|
| - new_selected_blocks.erase(block);
|
| - }
|
| - }
|
| -
|
| - // Any new blocks that remain were not found in the old blocks dict, and so
|
| - // they need to be updated.
|
| - SelectedBlockMap::iterator new_blocks_end = new_selected_blocks.end();
|
| - for (SelectedBlockMap::iterator i = new_selected_blocks.begin();
|
| - i != new_blocks_end; ++i)
|
| - i->key->SetShouldInvalidateSelection();
|
| -}
|
| -
|
| -// TODO(yoichio): Move this to LayoutSelection.
|
| -void LayoutSelection::ClearSelection() {
|
| - // For querying Layer::compositingState()
|
| - // This is correct, since destroying layout objects needs to cause eager paint
|
| - // invalidations.
|
| - DisableCompositingQueryAsserts disabler;
|
| -
|
| - SetSelection(0, -1, 0, -1, kPaintInvalidationNewMinusOld);
|
| -}
|
| -
|
| void LayoutView::ClearSelection() {
|
| frame_view_->GetFrame().Selection().ClearLayoutSelection();
|
| }
|
| @@ -911,13 +627,6 @@ void LayoutView::SelectionStartEnd(int& start_pos, int& end_pos) {
|
| end_pos);
|
| }
|
|
|
| -// TODO(yoichio): Move this to LayoutSelection.
|
| -void LayoutSelection::SelectionStartEnd(int& start_pos, int& end_pos) {
|
| - Commit(*frame_selection_->GetDocument().GetLayoutView());
|
| - start_pos = selection_start_pos_;
|
| - end_pos = selection_end_pos_;
|
| -}
|
| -
|
| bool LayoutView::ShouldUsePrintingLayout() const {
|
| if (!GetDocument().Printing() || !frame_view_)
|
| return false;
|
|
|