Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2011, 2012 Apple Inc. All r ights reserved. | 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2011, 2012 Apple Inc. All r ights reserved. |
| 5 * Copyright (C) 2014 Samsung Electronics. All rights reserved. | 5 * Copyright (C) 2014 Samsung Electronics. All rights reserved. |
| 6 * | 6 * |
| 7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 269 template <> inline bool isMatchingElement(const ClassCollection& collection, con st Element& element) | 269 template <> inline bool isMatchingElement(const ClassCollection& collection, con st Element& element) |
| 270 { | 270 { |
| 271 return collection.elementMatches(element); | 271 return collection.elementMatches(element); |
| 272 } | 272 } |
| 273 | 273 |
| 274 template <> inline bool isMatchingElement(const HTMLTagCollection& collection, c onst Element& element) | 274 template <> inline bool isMatchingElement(const HTMLTagCollection& collection, c onst Element& element) |
| 275 { | 275 { |
| 276 return collection.elementMatches(element); | 276 return collection.elementMatches(element); |
| 277 } | 277 } |
| 278 | 278 |
| 279 Element* HTMLCollection::itemBefore(const Element* previous) const | |
| 280 { | |
| 281 return LiveNodeListBase::itemBefore(*this, previous); | |
| 282 } | |
| 283 | |
| 284 Element* HTMLCollection::virtualItemAfter(Element*) const | 279 Element* HTMLCollection::virtualItemAfter(Element*) const |
| 285 { | 280 { |
| 286 ASSERT_NOT_REACHED(); | 281 ASSERT_NOT_REACHED(); |
| 287 return 0; | 282 return 0; |
| 288 } | 283 } |
| 289 | 284 |
| 290 static inline bool nameShouldBeVisibleInDocumentAll(const HTMLElement& element) | 285 static inline bool nameShouldBeVisibleInDocumentAll(const HTMLElement& element) |
| 291 { | 286 { |
| 292 // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-in terfaces.html#dom-htmlallcollection-nameditem: | 287 // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-in terfaces.html#dom-htmlallcollection-nameditem: |
| 293 // The document.all collection returns only certain types of elements by nam e, | 288 // The document.all collection returns only certain types of elements by nam e, |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 307 } | 302 } |
| 308 | 303 |
| 309 inline Element* firstMatchingChildElement(const HTMLCollection& nodeList) | 304 inline Element* firstMatchingChildElement(const HTMLCollection& nodeList) |
| 310 { | 305 { |
| 311 Element* element = ElementTraversal::firstChild(nodeList.rootNode()); | 306 Element* element = ElementTraversal::firstChild(nodeList.rootNode()); |
| 312 while (element && !isMatchingElement(nodeList, *element)) | 307 while (element && !isMatchingElement(nodeList, *element)) |
| 313 element = ElementTraversal::nextSibling(*element); | 308 element = ElementTraversal::nextSibling(*element); |
| 314 return element; | 309 return element; |
| 315 } | 310 } |
| 316 | 311 |
| 312 inline Element* lastMatchingChildElement(const HTMLCollection& nodeList) | |
| 313 { | |
| 314 Element* element = ElementTraversal::lastChild(nodeList.rootNode()); | |
| 315 while (element && !isMatchingElement(nodeList, *element)) | |
| 316 element = ElementTraversal::previousSibling(*element); | |
| 317 return element; | |
| 318 } | |
| 319 | |
| 317 inline Element* nextMatchingChildElement(const HTMLCollection& nodeList, Element & current) | 320 inline Element* nextMatchingChildElement(const HTMLCollection& nodeList, Element & current) |
| 318 { | 321 { |
| 319 Element* next = ¤t; | 322 Element* next = ¤t; |
| 320 do { | 323 do { |
| 321 next = ElementTraversal::nextSibling(*next); | 324 next = ElementTraversal::nextSibling(*next); |
| 322 } while (next && !isMatchingElement(nodeList, *next)); | 325 } while (next && !isMatchingElement(nodeList, *next)); |
| 323 return next; | 326 return next; |
| 324 } | 327 } |
| 325 | 328 |
| 329 inline Element* previousMatchingChildElement(const HTMLCollection& nodeList, Ele ment& current) | |
| 330 { | |
| 331 Element* previous = ¤t; | |
| 332 do { | |
| 333 previous = ElementTraversal::previousSibling(*previous); | |
| 334 } while (previous && !isMatchingElement(nodeList, *previous)); | |
| 335 return previous; | |
| 336 } | |
| 337 | |
| 326 Element* HTMLCollection::traverseToFirstElement() const | 338 Element* HTMLCollection::traverseToFirstElement() const |
| 327 { | 339 { |
| 328 switch (type()) { | 340 switch (type()) { |
| 329 case HTMLTagCollectionType: | 341 case HTMLTagCollectionType: |
| 330 return firstMatchingElement(static_cast<const HTMLTagCollection&>(*this) ); | 342 return firstMatchingElement(static_cast<const HTMLTagCollection&>(*this) ); |
| 331 case ClassCollectionType: | 343 case ClassCollectionType: |
| 332 return firstMatchingElement(static_cast<const ClassCollection&>(*this)); | 344 return firstMatchingElement(static_cast<const ClassCollection&>(*this)); |
| 333 default: | 345 default: |
| 334 if (overridesItemAfter()) | 346 if (overridesItemAfter()) |
| 335 return virtualItemAfter(0); | 347 return virtualItemAfter(0); |
| 336 if (shouldOnlyIncludeDirectChildren()) | 348 if (shouldOnlyIncludeDirectChildren()) |
| 337 return firstMatchingChildElement(*this); | 349 return firstMatchingChildElement(*this); |
| 338 return firstMatchingElement(*this); | 350 return firstMatchingElement(*this); |
| 339 } | 351 } |
| 340 } | 352 } |
| 341 | 353 |
| 354 Element* HTMLCollection::traverseToLastElement() const | |
| 355 { | |
| 356 ASSERT(canTraverseBackward()); | |
| 357 if (shouldOnlyIncludeDirectChildren()) | |
| 358 return lastMatchingChildElement(*this); | |
| 359 return lastMatchingElement(*this); | |
| 360 } | |
| 361 | |
| 342 inline Element* HTMLCollection::traverseNextElement(Element& previous) const | 362 inline Element* HTMLCollection::traverseNextElement(Element& previous) const |
| 343 { | 363 { |
| 344 if (overridesItemAfter()) | 364 if (overridesItemAfter()) |
| 345 return virtualItemAfter(&previous); | 365 return virtualItemAfter(&previous); |
| 346 if (shouldOnlyIncludeDirectChildren()) | 366 if (shouldOnlyIncludeDirectChildren()) |
| 347 return nextMatchingChildElement(*this, previous); | 367 return nextMatchingChildElement(*this, previous); |
| 348 return nextMatchingElement(*this, previous); | 368 return nextMatchingElement(*this, previous); |
| 349 } | 369 } |
| 350 | 370 |
| 351 Element* HTMLCollection::traverseForwardToOffset(unsigned offset, Element& curre ntElement, unsigned& currentOffset) const | 371 Element* HTMLCollection::traverseForwardToOffset(unsigned offset, Element& curre ntElement, unsigned& currentOffset) const |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 370 while ((next = nextMatchingChildElement(*this, *next))) { | 390 while ((next = nextMatchingChildElement(*this, *next))) { |
| 371 if (++currentOffset == offset) | 391 if (++currentOffset == offset) |
| 372 return next; | 392 return next; |
| 373 } | 393 } |
| 374 return 0; | 394 return 0; |
| 375 } | 395 } |
| 376 return traverseMatchingElementsForwardToOffset(*this, offset, currentEle ment, currentOffset); | 396 return traverseMatchingElementsForwardToOffset(*this, offset, currentEle ment, currentOffset); |
| 377 } | 397 } |
| 378 } | 398 } |
| 379 | 399 |
| 400 Element* HTMLCollection::traverseBackwardToOffset(unsigned offset, Element& curr entElement, unsigned& currentOffset) const | |
| 401 { | |
| 402 ASSERT(currentOffset > offset); | |
| 403 ASSERT(canTraverseBackward()); | |
| 404 if (shouldOnlyIncludeDirectChildren()) { | |
|
Inactive
2014/04/09 23:08:58
Now we do this check once and then traverse to the
| |
| 405 Element* previous = ¤tElement; | |
| 406 while ((previous = previousMatchingChildElement(*this, *previous))) { | |
| 407 if (--currentOffset == offset) | |
| 408 return previous; | |
| 409 } | |
| 410 return 0; | |
| 411 } | |
| 412 return traverseMatchingElementsBackwardToOffset(*this, offset, currentElemen t, currentOffset); | |
| 413 } | |
| 414 | |
| 380 Element* HTMLCollection::namedItem(const AtomicString& name) const | 415 Element* HTMLCollection::namedItem(const AtomicString& name) const |
| 381 { | 416 { |
| 382 // http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/namedit em.asp | 417 // http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/namedit em.asp |
| 383 // This method first searches for an object with a matching id | 418 // This method first searches for an object with a matching id |
| 384 // attribute. If a match is not found, the method then searches for an | 419 // attribute. If a match is not found, the method then searches for an |
| 385 // object with a matching name attribute, but only on those elements | 420 // object with a matching name attribute, but only on those elements |
| 386 // that are allowed a name attribute. | 421 // that are allowed a name attribute. |
| 387 updateIdNameCache(); | 422 updateIdNameCache(); |
| 388 | 423 |
| 389 const NamedItemCache& cache = namedItemCache(); | 424 const NamedItemCache& cache = namedItemCache(); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 474 | 509 |
| 475 for (unsigned i = 0; nameResults && i < nameResults->size(); ++i) | 510 for (unsigned i = 0; nameResults && i < nameResults->size(); ++i) |
| 476 result.append(nameResults->at(i)); | 511 result.append(nameResults->at(i)); |
| 477 } | 512 } |
| 478 | 513 |
| 479 HTMLCollection::NamedItemCache::NamedItemCache() | 514 HTMLCollection::NamedItemCache::NamedItemCache() |
| 480 { | 515 { |
| 481 } | 516 } |
| 482 | 517 |
| 483 } // namespace WebCore | 518 } // namespace WebCore |
| OLD | NEW |