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

Side by Side Diff: third_party/WebKit/Source/core/editing/DOMSelection.cpp

Issue 2783103002: Dispose temporary and not-cached Range in DOMSelection
Patch Set: update Created 3 years, 8 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 unified diff | Download patch
« no previous file with comments | « third_party/WebKit/Source/core/editing/DOMSelection.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2007, 2009 Apple Inc. All rights reserved. 2 * Copyright (C) 2007, 2009 Apple Inc. All rights reserved.
3 * Copyright (C) 2012 Google Inc. All rights reserved. 3 * Copyright (C) 2012 Google Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 8 *
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 } 118 }
119 119
120 static Position basePosition(const VisibleSelection& selection) { 120 static Position basePosition(const VisibleSelection& selection) {
121 return selection.base().parentAnchoredEquivalent(); 121 return selection.base().parentAnchoredEquivalent();
122 } 122 }
123 123
124 static Position extentPosition(const VisibleSelection& selection) { 124 static Position extentPosition(const VisibleSelection& selection) {
125 return selection.extent().parentAnchoredEquivalent(); 125 return selection.extent().parentAnchoredEquivalent();
126 } 126 }
127 127
128 class ScopedRange {
yosin_UTC9 2017/03/30 08:58:17 Please introduce a function acts like primaryRange
129 STACK_ALLOCATED();
130
131 public:
132 ScopedRange(Range* range, bool dispose)
133 : m_range(range), m_dispose(dispose) {}
134 ~ScopedRange() {
135 if (m_dispose)
136 m_range->dispose();
137 }
138
139 private:
140 Member<Range> m_range;
141 bool m_dispose;
142 };
143
128 Node* DOMSelection::anchorNode() const { 144 Node* DOMSelection::anchorNode() const {
129 if (Range* range = primaryRangeOrNull()) { 145 if (Range* range = primaryRangeOrNull()) {
146 ScopedRange scope(range, !isSelectionOfDocument());
130 if (!frame() || isBaseFirstInSelection()) 147 if (!frame() || isBaseFirstInSelection())
131 return range->startContainer(); 148 return range->startContainer();
132 return range->endContainer(); 149 return range->endContainer();
133 } 150 }
134 return nullptr; 151 return nullptr;
135 } 152 }
136 153
137 unsigned DOMSelection::anchorOffset() const { 154 unsigned DOMSelection::anchorOffset() const {
138 if (Range* range = primaryRangeOrNull()) { 155 if (Range* range = primaryRangeOrNull()) {
156 ScopedRange scope(range, !isSelectionOfDocument());
139 if (!frame() || isBaseFirstInSelection()) 157 if (!frame() || isBaseFirstInSelection())
140 return range->startOffset(); 158 return range->startOffset();
141 return range->endOffset(); 159 return range->endOffset();
142 } 160 }
143 return 0; 161 return 0;
144 } 162 }
145 163
146 Node* DOMSelection::focusNode() const { 164 Node* DOMSelection::focusNode() const {
147 if (Range* range = primaryRangeOrNull()) { 165 if (Range* range = primaryRangeOrNull()) {
166 ScopedRange scope(range, !isSelectionOfDocument());
148 if (!frame() || isBaseFirstInSelection()) 167 if (!frame() || isBaseFirstInSelection())
149 return range->endContainer(); 168 return range->endContainer();
150 return range->startContainer(); 169 return range->startContainer();
151 } 170 }
152 return nullptr; 171 return nullptr;
153 } 172 }
154 173
155 unsigned DOMSelection::focusOffset() const { 174 unsigned DOMSelection::focusOffset() const {
156 if (Range* range = primaryRangeOrNull()) { 175 if (Range* range = primaryRangeOrNull()) {
176 ScopedRange scope(range, !isSelectionOfDocument());
157 if (!frame() || isBaseFirstInSelection()) 177 if (!frame() || isBaseFirstInSelection())
158 return range->endOffset(); 178 return range->endOffset();
159 return range->startOffset(); 179 return range->startOffset();
160 } 180 }
161 return 0; 181 return 0;
162 } 182 }
163 183
164 Node* DOMSelection::baseNode() const { 184 Node* DOMSelection::baseNode() const {
165 if (!isAvailable()) 185 if (!isAvailable())
166 return 0; 186 return 0;
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after
582 void DOMSelection::clearCachedRangeIfSelectionOfDocument() { 602 void DOMSelection::clearCachedRangeIfSelectionOfDocument() {
583 if (!isSelectionOfDocument()) 603 if (!isSelectionOfDocument())
584 return; 604 return;
585 frame()->selection().clearDocumentCachedRange(); 605 frame()->selection().clearDocumentCachedRange();
586 } 606 }
587 607
588 void DOMSelection::removeRange(Range* range) { 608 void DOMSelection::removeRange(Range* range) {
589 DCHECK(range); 609 DCHECK(range);
590 if (!isAvailable()) 610 if (!isAvailable())
591 return; 611 return;
592 if (range == primaryRangeOrNull()) 612 Range* originalRange = primaryRangeOrNull();
613 ScopedRange scope(originalRange, !isSelectionOfDocument());
614 if (range == originalRange)
593 frame()->selection().clear(); 615 frame()->selection().clear();
594 } 616 }
595 617
596 void DOMSelection::removeAllRanges() { 618 void DOMSelection::removeAllRanges() {
597 if (!isAvailable()) 619 if (!isAvailable())
598 return; 620 return;
599 frame()->selection().clear(); 621 frame()->selection().clear();
600 } 622 }
601 623
602 void DOMSelection::addRange(Range* newRange) { 624 void DOMSelection::addRange(Range* newRange) {
(...skipping 21 matching lines...) Expand all
624 updateFrameSelection(SelectionInDOMTree::Builder() 646 updateFrameSelection(SelectionInDOMTree::Builder()
625 .collapse(newRange->startPosition()) 647 .collapse(newRange->startPosition())
626 .extend(newRange->endPosition()) 648 .extend(newRange->endPosition())
627 .build(), 649 .build(),
628 newRange); 650 newRange);
629 return; 651 return;
630 } 652 }
631 653
632 Range* originalRange = primaryRangeOrNull(); 654 Range* originalRange = primaryRangeOrNull();
633 DCHECK(originalRange); 655 DCHECK(originalRange);
656 ScopedRange scope(originalRange, !isSelectionOfDocument());
634 657
635 if (originalRange->startContainer()->treeScope() != 658 if (originalRange->startContainer()->treeScope() !=
636 newRange->startContainer()->treeScope()) { 659 newRange->startContainer()->treeScope()) {
637 return; 660 return;
638 } 661 }
639 662
640 if (originalRange->compareBoundaryPoints(Range::kStartToEnd, newRange, 663 if (originalRange->compareBoundaryPoints(Range::kStartToEnd, newRange,
641 ASSERT_NO_EXCEPTION) < 0 || 664 ASSERT_NO_EXCEPTION) < 0 ||
642 newRange->compareBoundaryPoints(Range::kStartToEnd, originalRange, 665 newRange->compareBoundaryPoints(Range::kStartToEnd, originalRange,
643 ASSERT_NO_EXCEPTION) < 0) { 666 ASSERT_NO_EXCEPTION) < 0) {
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
822 m_treeScope->document().addConsoleMessage( 845 m_treeScope->document().addConsoleMessage(
823 ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, message)); 846 ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, message));
824 } 847 }
825 848
826 DEFINE_TRACE(DOMSelection) { 849 DEFINE_TRACE(DOMSelection) {
827 visitor->trace(m_treeScope); 850 visitor->trace(m_treeScope);
828 ContextClient::trace(visitor); 851 ContextClient::trace(visitor);
829 } 852 }
830 853
831 } // namespace blink 854 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/editing/DOMSelection.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698