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

Side by Side Diff: Source/core/editing/iterators/TextIterator.cpp

Issue 1213213004: Introduce use counters for shadow DOM handling in plainText() (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: 2015-07-03T14:40:27 Rebase Created 5 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All r ights reserved. 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All r ights reserved.
3 * Copyright (C) 2005 Alexey Proskuryakov. 3 * Copyright (C) 2005 Alexey Proskuryakov.
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 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 21 matching lines...) Expand all
32 #include "core/dom/Document.h" 32 #include "core/dom/Document.h"
33 #include "core/dom/FirstLetterPseudoElement.h" 33 #include "core/dom/FirstLetterPseudoElement.h"
34 #include "core/dom/Position.h" 34 #include "core/dom/Position.h"
35 #include "core/dom/shadow/ShadowRoot.h" 35 #include "core/dom/shadow/ShadowRoot.h"
36 #include "core/editing/VisiblePosition.h" 36 #include "core/editing/VisiblePosition.h"
37 #include "core/editing/VisibleUnits.h" 37 #include "core/editing/VisibleUnits.h"
38 #include "core/editing/htmlediting.h" 38 #include "core/editing/htmlediting.h"
39 #include "core/editing/iterators/CharacterIterator.h" 39 #include "core/editing/iterators/CharacterIterator.h"
40 #include "core/editing/iterators/WordAwareIterator.h" 40 #include "core/editing/iterators/WordAwareIterator.h"
41 #include "core/frame/FrameView.h" 41 #include "core/frame/FrameView.h"
42 #include "core/frame/UseCounter.h"
42 #include "core/html/HTMLElement.h" 43 #include "core/html/HTMLElement.h"
43 #include "core/html/HTMLImageElement.h" 44 #include "core/html/HTMLImageElement.h"
44 #include "core/html/HTMLInputElement.h" 45 #include "core/html/HTMLInputElement.h"
45 #include "core/html/HTMLTextFormControlElement.h" 46 #include "core/html/HTMLTextFormControlElement.h"
46 #include "core/layout/LayoutTableCell.h" 47 #include "core/layout/LayoutTableCell.h"
47 #include "core/layout/LayoutTableRow.h" 48 #include "core/layout/LayoutTableRow.h"
48 #include "core/layout/LayoutTextControl.h" 49 #include "core/layout/LayoutTextControl.h"
49 #include "core/layout/LayoutTextFragment.h" 50 #include "core/layout/LayoutTextFragment.h"
50 #include "core/layout/line/InlineTextBox.h" 51 #include "core/layout/line/InlineTextBox.h"
51 #include "platform/fonts/Font.h" 52 #include "platform/fonts/Font.h"
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 , m_needsAnotherNewline(false) 127 , m_needsAnotherNewline(false)
127 , m_textBox(nullptr) 128 , m_textBox(nullptr)
128 , m_remainingTextBox(nullptr) 129 , m_remainingTextBox(nullptr)
129 , m_firstLetterText(nullptr) 130 , m_firstLetterText(nullptr)
130 , m_lastTextNode(nullptr) 131 , m_lastTextNode(nullptr)
131 , m_lastTextNodeEndedWithCollapsedSpace(false) 132 , m_lastTextNodeEndedWithCollapsedSpace(false)
132 , m_sortedTextBoxesPosition(0) 133 , m_sortedTextBoxesPosition(0)
133 , m_behavior(adjustBehaviorFlags<Strategy>(behavior)) 134 , m_behavior(adjustBehaviorFlags<Strategy>(behavior))
134 , m_handledFirstLetter(false) 135 , m_handledFirstLetter(false)
135 , m_shouldStop(false) 136 , m_shouldStop(false)
137 , m_handleShadowRoot(false)
136 // The call to emitsOriginalText() must occur after m_behavior is initialize d. 138 // The call to emitsOriginalText() must occur after m_behavior is initialize d.
137 , m_textState(emitsOriginalText()) 139 , m_textState(emitsOriginalText())
138 { 140 {
139 ASSERT(start.isNotNull()); 141 ASSERT(start.isNotNull());
140 ASSERT(end.isNotNull()); 142 ASSERT(end.isNotNull());
141 if (start.compareTo(end) > 0) { 143 if (start.compareTo(end) > 0) {
142 initialize(end.containerNode(), end.computeOffsetInContainerNode(), star t.containerNode(), start.computeOffsetInContainerNode()); 144 initialize(end.containerNode(), end.computeOffsetInContainerNode(), star t.containerNode(), start.computeOffsetInContainerNode());
143 return; 145 return;
144 } 146 }
145 initialize(start.containerNode(), start.computeOffsetInContainerNode(), end. containerNode(), end.computeOffsetInContainerNode()); 147 initialize(start.containerNode(), start.computeOffsetInContainerNode(), end. containerNode(), end.computeOffsetInContainerNode());
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 // Calculate first out of bounds node. 183 // Calculate first out of bounds node.
182 m_pastEndNode = endContainer? pastLastNode<Strategy>(*endContainer, endOffse t) : nullptr; 184 m_pastEndNode = endContainer? pastLastNode<Strategy>(*endContainer, endOffse t) : nullptr;
183 185
184 // Identify the first run. 186 // Identify the first run.
185 advance(); 187 advance();
186 } 188 }
187 189
188 template<typename Strategy> 190 template<typename Strategy>
189 TextIteratorAlgorithm<Strategy>::~TextIteratorAlgorithm() 191 TextIteratorAlgorithm<Strategy>::~TextIteratorAlgorithm()
190 { 192 {
193 if (!m_handleShadowRoot)
194 return;
195 Document* document = ownerDocument();
196 if (!document)
197 return;
198 if (m_behavior & TextIteratorForInnerText)
199 UseCounter::count(document, UseCounter::InnerTextWithShadowTree);
200 if (m_behavior & TextIteratorForSelectionToString)
201 UseCounter::count(document, UseCounter::SelectionToStringWithShadowTree) ;
202 if (m_behavior & TextIteratorForWindowFind)
203 UseCounter::count(document, UseCounter::WindowFindWithShadowTree);
191 } 204 }
192 205
193 template<typename Strategy> 206 template<typename Strategy>
194 bool TextIteratorAlgorithm<Strategy>::isInsideReplacedElement() const 207 bool TextIteratorAlgorithm<Strategy>::isInsideReplacedElement() const
195 { 208 {
196 if (atEnd() || length() != 1 || !m_node) 209 if (atEnd() || length() != 1 || !m_node)
197 return false; 210 return false;
198 211
199 LayoutObject* layoutObject = m_node->layoutObject(); 212 LayoutObject* layoutObject = m_node->layoutObject();
200 return layoutObject && layoutObject->isReplaced(); 213 return layoutObject && layoutObject->isReplaced();
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 representNodeOffsetZero(); 263 representNodeOffsetZero();
251 m_node = nullptr; 264 m_node = nullptr;
252 return; 265 return;
253 } 266 }
254 267
255 LayoutObject* layoutObject = m_node->layoutObject(); 268 LayoutObject* layoutObject = m_node->layoutObject();
256 if (!layoutObject) { 269 if (!layoutObject) {
257 if (m_node->isShadowRoot()) { 270 if (m_node->isShadowRoot()) {
258 // A shadow root doesn't have a layoutObject, but we want to vis it children anyway. 271 // A shadow root doesn't have a layoutObject, but we want to vis it children anyway.
259 m_iterationProgress = m_iterationProgress < HandledNode ? Handle dNode : m_iterationProgress; 272 m_iterationProgress = m_iterationProgress < HandledNode ? Handle dNode : m_iterationProgress;
273 m_handleShadowRoot = true;
260 } else { 274 } else {
261 m_iterationProgress = HandledChildren; 275 m_iterationProgress = HandledChildren;
262 } 276 }
263 } else { 277 } else {
264 // Enter author shadow roots, from youngest, if any and if necessary . 278 // Enter author shadow roots, from youngest, if any and if necessary .
265 if (m_iterationProgress < HandledOpenShadowRoots) { 279 if (m_iterationProgress < HandledOpenShadowRoots) {
266 if (entersOpenShadowRoots() && m_node->isElementNode() && toElem ent(m_node)->hasOpenShadowRoot()) { 280 if (entersOpenShadowRoots() && m_node->isElementNode() && toElem ent(m_node)->hasOpenShadowRoot()) {
267 ShadowRoot* youngestShadowRoot = toElement(m_node)->shadowRo ot(); 281 ShadowRoot* youngestShadowRoot = toElement(m_node)->shadowRo ot();
268 ASSERT(youngestShadowRoot->type() == ShadowRoot::OpenShadowR oot); 282 ASSERT(youngestShadowRoot->type() == ShadowRoot::OpenShadowR oot);
269 m_node = youngestShadowRoot; 283 m_node = youngestShadowRoot;
(...skipping 826 matching lines...) Expand 10 before | Expand all | Expand 10 after
1096 1110
1097 String plainText(const PositionInComposedTree& start, const PositionInComposedTr ee& end, TextIteratorBehaviorFlags behavior) 1111 String plainText(const PositionInComposedTree& start, const PositionInComposedTr ee& end, TextIteratorBehaviorFlags behavior)
1098 { 1112 {
1099 return createPlainText<EditingInComposedTreeStrategy>(start, end, behavior); 1113 return createPlainText<EditingInComposedTreeStrategy>(start, end, behavior);
1100 } 1114 }
1101 1115
1102 template class CORE_TEMPLATE_EXPORT TextIteratorAlgorithm<EditingStrategy>; 1116 template class CORE_TEMPLATE_EXPORT TextIteratorAlgorithm<EditingStrategy>;
1103 template class CORE_TEMPLATE_EXPORT TextIteratorAlgorithm<EditingInComposedTreeS trategy>; 1117 template class CORE_TEMPLATE_EXPORT TextIteratorAlgorithm<EditingInComposedTreeS trategy>;
1104 1118
1105 } // namespace blink 1119 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/editing/iterators/TextIterator.h ('k') | Source/core/editing/iterators/TextIteratorFlags.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698