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

Side by Side Diff: third_party/WebKit/Source/core/page/FocusController.cpp

Issue 1840333002: Support slots' fallback contents in focus navigation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add testcases and debug Created 4 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/dom/shadow/SlotScopedTraversal.cpp ('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) 2006, 2007 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
3 * Copyright (C) 2008 Nuanti Ltd. 3 * Copyright (C) 2008 Nuanti Ltd.
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 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 static ScopedFocusNavigation ownedByShadowInsertionPoint(HTMLShadowElement&) ; 88 static ScopedFocusNavigation ownedByShadowInsertionPoint(HTMLShadowElement&) ;
89 static ScopedFocusNavigation ownedByHTMLSlotElement(const HTMLSlotElement&); 89 static ScopedFocusNavigation ownedByHTMLSlotElement(const HTMLSlotElement&);
90 static ScopedFocusNavigation ownedByIFrame(const HTMLFrameOwnerElement&); 90 static ScopedFocusNavigation ownedByIFrame(const HTMLFrameOwnerElement&);
91 91
92 private: 92 private:
93 ScopedFocusNavigation(TreeScope&, const Element*); 93 ScopedFocusNavigation(TreeScope&, const Element*);
94 ScopedFocusNavigation(HTMLSlotElement&, const Element*); 94 ScopedFocusNavigation(HTMLSlotElement&, const Element*);
95 RawPtrWillBeMember<ContainerNode> m_rootNode; 95 RawPtrWillBeMember<ContainerNode> m_rootNode;
96 RawPtrWillBeMember<HTMLSlotElement> m_rootSlot; 96 RawPtrWillBeMember<HTMLSlotElement> m_rootSlot;
97 RawPtrWillBeMember<Element> m_current; 97 RawPtrWillBeMember<Element> m_current;
98 bool m_slotFallbackTraversal;
98 }; 99 };
99 100
100 ScopedFocusNavigation::ScopedFocusNavigation(TreeScope& treeScope, const Element * current) 101 ScopedFocusNavigation::ScopedFocusNavigation(TreeScope& treeScope, const Element * current)
101 : m_rootNode(treeScope.rootNode()) 102 : m_rootNode(treeScope.rootNode())
102 , m_rootSlot(nullptr) 103 , m_rootSlot(nullptr)
103 , m_current(const_cast<Element*>(current)) 104 , m_current(const_cast<Element*>(current))
104 { 105 {
105 } 106 }
106 107
107 ScopedFocusNavigation::ScopedFocusNavigation(HTMLSlotElement& slot, const Elemen t* current) 108 ScopedFocusNavigation::ScopedFocusNavigation(HTMLSlotElement& slot, const Elemen t* current)
108 : m_rootNode(nullptr) 109 : m_rootNode(nullptr)
109 , m_rootSlot(&slot) 110 , m_rootSlot(&slot)
110 , m_current(const_cast<Element*>(current)) 111 , m_current(const_cast<Element*>(current))
112 , m_slotFallbackTraversal(slot.getAssignedNodes().isEmpty())
111 { 113 {
112 } 114 }
113 115
114 Element* ScopedFocusNavigation::currentElement() const 116 Element* ScopedFocusNavigation::currentElement() const
115 { 117 {
116 return m_current; 118 return m_current;
117 } 119 }
118 120
119 void ScopedFocusNavigation::setCurrentElement(Element* element) 121 void ScopedFocusNavigation::setCurrentElement(Element* element)
120 { 122 {
121 m_current = element; 123 m_current = element;
122 } 124 }
123 125
124 void ScopedFocusNavigation::moveToNext() 126 void ScopedFocusNavigation::moveToNext()
125 { 127 {
126 ASSERT(m_current); 128 ASSERT(m_current);
127 if (m_rootSlot) { 129 if (m_rootSlot) {
128 m_current = SlotScopedTraversal::next(*m_current); 130 if (m_slotFallbackTraversal) {
hayato 2016/03/31 09:45:02 I am afraid that the responsibilities of SlotScope
yuzuchan 2016/04/01 04:05:13 Thanks for the advice, actually I was not sure whe
131 m_current = ElementTraversal::next(*m_current, m_rootSlot);
132 while (m_current && (SlotScopedTraversal::isSlotScoped(*m_current) | | SlotScopedTraversal::findFallbackScopeOwnerSlot(*m_current) != m_rootSlot))
hayato 2016/03/31 09:45:02 It looks we have several similar patterns here. Co
yuzuchan 2016/04/01 04:05:13 I created a utility function as you suggested. How
133 m_current = ElementTraversal::next(*m_current, m_rootSlot);
134 } else {
135 m_current = SlotScopedTraversal::next(*m_current);
136 }
129 } else { 137 } else {
130 m_current = ElementTraversal::next(*m_current); 138 m_current = ElementTraversal::next(*m_current);
131 while (m_current && SlotScopedTraversal::isSlotScoped(*m_current)) 139 while (m_current && (SlotScopedTraversal::isSlotScoped(*m_current) || Sl otScopedTraversal::isSlotFallbackScoped(*m_current)))
132 m_current = ElementTraversal::next(*m_current); 140 m_current = ElementTraversal::next(*m_current);
133 } 141 }
134 } 142 }
135 143
136 void ScopedFocusNavigation::moveToPrevious() 144 void ScopedFocusNavigation::moveToPrevious()
137 { 145 {
138 ASSERT(m_current); 146 ASSERT(m_current);
139 if (m_rootSlot) { 147 if (m_rootSlot) {
140 m_current = SlotScopedTraversal::previous(*m_current); 148 if (m_slotFallbackTraversal) {
149 m_current = ElementTraversal::previous(*m_current, m_rootSlot);
150 if (m_current == m_rootSlot)
151 m_current = nullptr;
152 while (m_current && (SlotScopedTraversal::isSlotScoped(*m_current) | | SlotScopedTraversal::findFallbackScopeOwnerSlot(*m_current) != m_rootSlot))
153 m_current = ElementTraversal::previous(*m_current);
154 } else {
155 m_current = SlotScopedTraversal::previous(*m_current);
156 }
141 } else { 157 } else {
142 m_current = ElementTraversal::previous(*m_current); 158 m_current = ElementTraversal::previous(*m_current);
143 while (m_current && SlotScopedTraversal::isSlotScoped(*m_current)) 159 while (m_current && (SlotScopedTraversal::isSlotScoped(*m_current) || Sl otScopedTraversal::isSlotFallbackScoped(*m_current)))
144 m_current = ElementTraversal::previous(*m_current); 160 m_current = ElementTraversal::previous(*m_current);
145 } 161 }
146 } 162 }
147 163
148 void ScopedFocusNavigation::moveToFirst() 164 void ScopedFocusNavigation::moveToFirst()
149 { 165 {
150 if (m_rootSlot) { 166 if (m_rootSlot) {
151 if (!m_rootSlot->getAssignedNodes().isEmpty()) { 167 if (!m_slotFallbackTraversal) {
152 WillBeHeapVector<RefPtrWillBeMember<Node>> assignedNodes = m_rootSlo t->getAssignedNodes(); 168 WillBeHeapVector<RefPtrWillBeMember<Node>> assignedNodes = m_rootSlo t->getAssignedNodes();
153 for (auto assignedNode : assignedNodes) { 169 for (auto assignedNode : assignedNodes) {
154 if (assignedNode->isElementNode()) { 170 if (assignedNode->isElementNode()) {
155 m_current = toElement(assignedNode); 171 m_current = toElement(assignedNode);
156 break; 172 break;
157 } 173 }
158 } 174 }
159 } else { 175 } else {
160 m_current = nullptr; 176 Element* first = ElementTraversal::firstChild(*m_rootSlot);
177 while (first && (SlotScopedTraversal::isSlotScoped(*first) || SlotSc opedTraversal::findFallbackScopeOwnerSlot(*first) != m_rootSlot))
178 first = ElementTraversal::next(*first, m_rootSlot);
179 m_current = first;
161 } 180 }
162 } else { 181 } else {
163 Element* first = m_rootNode->isElementNode() ? &toElement(*m_rootNode) : ElementTraversal::next(*m_rootNode); 182 Element* first = m_rootNode->isElementNode() ? &toElement(*m_rootNode) : ElementTraversal::next(*m_rootNode);
164 while (first && SlotScopedTraversal::isSlotScoped(*first)) 183 while (first && (SlotScopedTraversal::isSlotScoped(*first) || SlotScoped Traversal::isSlotFallbackScoped(*first)))
165 first = ElementTraversal::next(*first, m_rootNode); 184 first = ElementTraversal::next(*first, m_rootNode);
166 m_current = first; 185 m_current = first;
167 } 186 }
187
168 } 188 }
169 189
170 void ScopedFocusNavigation::moveToLast() 190 void ScopedFocusNavigation::moveToLast()
171 { 191 {
172 if (m_rootSlot) { 192 if (m_rootSlot) {
173 if (!m_rootSlot->getAssignedNodes().isEmpty()) { 193 if (!m_slotFallbackTraversal) {
174 WillBeHeapVector<RefPtrWillBeMember<Node>> assignedNodes = m_rootSlo t->getAssignedNodes(); 194 WillBeHeapVector<RefPtrWillBeMember<Node>> assignedNodes = m_rootSlo t->getAssignedNodes();
175 for (auto assignedNode = assignedNodes.rbegin(); assignedNode != ass ignedNodes.rend(); ++assignedNode) { 195 for (auto assignedNode = assignedNodes.rbegin(); assignedNode != ass ignedNodes.rend(); ++assignedNode) {
176 if ((*assignedNode)->isElementNode()) { 196 if ((*assignedNode)->isElementNode()) {
177 m_current = ElementTraversal::lastWithinOrSelf(*toElement(*a ssignedNode)); 197 m_current = ElementTraversal::lastWithinOrSelf(*toElement(*a ssignedNode));
178 break; 198 break;
179 } 199 }
180 } 200 }
181 } else { 201 } else {
182 m_current = nullptr; 202 Element* last = ElementTraversal::lastWithin(*m_rootSlot);
203 while (last && (SlotScopedTraversal::isSlotScoped(*last) || SlotScop edTraversal::findFallbackScopeOwnerSlot(*last) != m_rootSlot))
204 last = ElementTraversal::previous(*last, m_rootSlot);
205 m_current = last;
183 } 206 }
184 } else { 207 } else {
185 Element* last = ElementTraversal::lastWithin(*m_rootNode); 208 Element* last = ElementTraversal::lastWithin(*m_rootNode);
186 while (last && SlotScopedTraversal::isSlotScoped(*last)) 209 while (last && (SlotScopedTraversal::isSlotScoped(*last) || SlotScopedTr aversal::isSlotFallbackScoped(*last)))
187 last = ElementTraversal::previous(*last, m_rootNode); 210 last = ElementTraversal::previous(*last, m_rootNode);
188 m_current = last; 211 m_current = last;
189 } 212 }
190 } 213 }
191 214
192 Element* ScopedFocusNavigation::owner() const 215 Element* ScopedFocusNavigation::owner() const
193 { 216 {
194 if (m_rootSlot) 217 if (m_rootSlot)
195 return m_rootSlot; 218 return m_rootSlot;
219 ASSERT(m_rootNode);
196 if (m_rootNode->isShadowRoot()) { 220 if (m_rootNode->isShadowRoot()) {
197 ShadowRoot& shadowRoot = toShadowRoot(*m_rootNode); 221 ShadowRoot& shadowRoot = toShadowRoot(*m_rootNode);
198 return shadowRoot.isYoungest() ? shadowRoot.host() : shadowRoot.shadowIn sertionPointOfYoungerShadowRoot(); 222 return shadowRoot.isYoungest() ? shadowRoot.host() : shadowRoot.shadowIn sertionPointOfYoungerShadowRoot();
199 } 223 }
200 // FIXME: Figure out the right thing for OOPI here. 224 // FIXME: Figure out the right thing for OOPI here.
201 if (Frame* frame = m_rootNode->document().frame()) 225 if (Frame* frame = m_rootNode->document().frame())
202 return frame->deprecatedLocalOwner(); 226 return frame->deprecatedLocalOwner();
203 return nullptr; 227 return nullptr;
204 } 228 }
205 229
206 ScopedFocusNavigation ScopedFocusNavigation::createFor(const Element& current) 230 ScopedFocusNavigation ScopedFocusNavigation::createFor(const Element& current)
207 { 231 {
208 if (SlotScopedTraversal::isSlotScoped(current)) 232 if (SlotScopedTraversal::isSlotScoped(current))
209 return ScopedFocusNavigation(*SlotScopedTraversal::findScopeOwnerSlot(cu rrent), &current); 233 return ScopedFocusNavigation(*SlotScopedTraversal::findScopeOwnerSlot(cu rrent), &current);
234 if (SlotScopedTraversal::isSlotFallbackScoped(current))
hayato 2016/03/31 09:45:02 It looks a little wasteful to do the same check tw
yuzuchan 2016/04/01 04:05:13 Done.
235 return ScopedFocusNavigation(*SlotScopedTraversal::findFallbackScopeOwne rSlot(current), &current);
210 return ScopedFocusNavigation(current.treeScope(), &current); 236 return ScopedFocusNavigation(current.treeScope(), &current);
211 } 237 }
212 238
213 ScopedFocusNavigation ScopedFocusNavigation::createForDocument(Document& documen t) 239 ScopedFocusNavigation ScopedFocusNavigation::createForDocument(Document& documen t)
214 { 240 {
215 return ScopedFocusNavigation(document, nullptr); 241 return ScopedFocusNavigation(document, nullptr);
216 } 242 }
217 243
218 ScopedFocusNavigation ScopedFocusNavigation::ownedByNonFocusableFocusScopeOwner( Element& element) 244 ScopedFocusNavigation ScopedFocusNavigation::ownedByNonFocusableFocusScopeOwner( Element& element)
219 { 245 {
(...skipping 1037 matching lines...) Expand 10 before | Expand all | Expand 10 after
1257 return consumed; 1283 return consumed;
1258 } 1284 }
1259 1285
1260 DEFINE_TRACE(FocusController) 1286 DEFINE_TRACE(FocusController)
1261 { 1287 {
1262 visitor->trace(m_page); 1288 visitor->trace(m_page);
1263 visitor->trace(m_focusedFrame); 1289 visitor->trace(m_focusedFrame);
1264 } 1290 }
1265 1291
1266 } // namespace blink 1292 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/dom/shadow/SlotScopedTraversal.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698