| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Google Inc. All Rights Reserved. | 2 * Copyright (C) 2011 Google Inc. All Rights Reserved. |
| 3 * Copyright (C) 2012 Apple Inc. All rights reserved. | 3 * Copyright (C) 2012 Apple 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 * 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 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 return elementsFromHitTestResult(result); | 317 return elementsFromHitTestResult(result); |
| 318 } | 318 } |
| 319 | 319 |
| 320 DOMSelection* TreeScope::getSelection() const { | 320 DOMSelection* TreeScope::getSelection() const { |
| 321 if (!rootNode().document().frame()) | 321 if (!rootNode().document().frame()) |
| 322 return nullptr; | 322 return nullptr; |
| 323 | 323 |
| 324 if (m_selection) | 324 if (m_selection) |
| 325 return m_selection.get(); | 325 return m_selection.get(); |
| 326 | 326 |
| 327 // FIXME: The correct selection in Shadow DOM requires that Position can have
a ShadowRoot | 327 // FIXME: The correct selection in Shadow DOM requires that Position can have |
| 328 // as a container. | 328 // a ShadowRoot as a container. See |
| 329 // See https://bugs.webkit.org/show_bug.cgi?id=82697 | 329 // https://bugs.webkit.org/show_bug.cgi?id=82697 |
| 330 m_selection = DOMSelection::create(this); | 330 m_selection = DOMSelection::create(this); |
| 331 return m_selection.get(); | 331 return m_selection.get(); |
| 332 } | 332 } |
| 333 | 333 |
| 334 Element* TreeScope::findAnchor(const String& name) { | 334 Element* TreeScope::findAnchor(const String& name) { |
| 335 if (name.isEmpty()) | 335 if (name.isEmpty()) |
| 336 return nullptr; | 336 return nullptr; |
| 337 if (Element* element = getElementById(AtomicString(name))) | 337 if (Element* element = getElementById(AtomicString(name))) |
| 338 return element; | 338 return element; |
| 339 for (HTMLAnchorElement& anchor : | 339 for (HTMLAnchorElement& anchor : |
| 340 Traversal<HTMLAnchorElement>::startsAfter(rootNode())) { | 340 Traversal<HTMLAnchorElement>::startsAfter(rootNode())) { |
| 341 if (rootNode().document().inQuirksMode()) { | 341 if (rootNode().document().inQuirksMode()) { |
| 342 // Quirks mode, case insensitive comparison of names. | 342 // Quirks mode, case insensitive comparison of names. |
| 343 if (equalIgnoringCase(anchor.name(), name)) | 343 if (equalIgnoringCase(anchor.name(), name)) |
| 344 return &anchor; | 344 return &anchor; |
| 345 } else { | 345 } else { |
| 346 // Strict mode, names need to match exactly. | 346 // Strict mode, names need to match exactly. |
| 347 if (anchor.name() == name) | 347 if (anchor.name() == name) |
| 348 return &anchor; | 348 return &anchor; |
| 349 } | 349 } |
| 350 } | 350 } |
| 351 return nullptr; | 351 return nullptr; |
| 352 } | 352 } |
| 353 | 353 |
| 354 void TreeScope::adoptIfNeeded(Node& node) { | 354 void TreeScope::adoptIfNeeded(Node& node) { |
| 355 // Script is forbidden to protect against event handlers firing in the middle
of rescoping | 355 // Script is forbidden to protect against event handlers firing in the middle |
| 356 // in |didMoveToNewDocument| callbacks. See https://crbug.com/605766 and https
://crbug.com/606651. | 356 // of rescoping in |didMoveToNewDocument| callbacks. See |
| 357 // https://crbug.com/605766 and https://crbug.com/606651. |
| 357 ScriptForbiddenScope forbidScript; | 358 ScriptForbiddenScope forbidScript; |
| 358 DCHECK(this); | 359 DCHECK(this); |
| 359 DCHECK(!node.isDocumentNode()); | 360 DCHECK(!node.isDocumentNode()); |
| 360 TreeScopeAdopter adopter(node, *this); | 361 TreeScopeAdopter adopter(node, *this); |
| 361 if (adopter.needsScopeChange()) | 362 if (adopter.needsScopeChange()) |
| 362 adopter.execute(); | 363 adopter.execute(); |
| 363 } | 364 } |
| 364 | 365 |
| 365 Element* TreeScope::retarget(const Element& target) const { | 366 Element* TreeScope::retarget(const Element& target) const { |
| 366 for (const Element* ancestor = ⌖ ancestor; | 367 for (const Element* ancestor = ⌖ ancestor; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 398 return toElement(eventPath->at(i).target()->toNode()); | 399 return toElement(eventPath->at(i).target()->toNode()); |
| 399 } | 400 } |
| 400 } | 401 } |
| 401 return nullptr; | 402 return nullptr; |
| 402 } | 403 } |
| 403 | 404 |
| 404 Element* TreeScope::adjustedElement(const Element& target) const { | 405 Element* TreeScope::adjustedElement(const Element& target) const { |
| 405 const Element* adjustedTarget = ⌖ | 406 const Element* adjustedTarget = ⌖ |
| 406 for (const Element* ancestor = ⌖ ancestor; | 407 for (const Element* ancestor = ⌖ ancestor; |
| 407 ancestor = ancestor->ownerShadowHost()) { | 408 ancestor = ancestor->ownerShadowHost()) { |
| 408 // This adjustment is done only for V1 shadows, and is skipped for V0 or UA
shadows, | 409 // This adjustment is done only for V1 shadows, and is skipped for V0 or UA |
| 409 // because .pointerLockElement and .(webkit)fullscreenElement is not availab
le for | 410 // shadows, because .pointerLockElement and .(webkit)fullscreenElement is |
| 410 // non-V1 shadow roots. | 411 // not available for non-V1 shadow roots. |
| 411 // TODO(kochi): Once V0 code is removed, use the same logic as .activeElemen
t for V1. | 412 // TODO(kochi): Once V0 code is removed, use the same logic as |
| 413 // .activeElement for V1. |
| 412 if (ancestor->shadowRootIfV1()) | 414 if (ancestor->shadowRootIfV1()) |
| 413 adjustedTarget = ancestor; | 415 adjustedTarget = ancestor; |
| 414 if (this == ancestor->treeScope()) | 416 if (this == ancestor->treeScope()) |
| 415 return const_cast<Element*>(adjustedTarget); | 417 return const_cast<Element*>(adjustedTarget); |
| 416 } | 418 } |
| 417 return nullptr; | 419 return nullptr; |
| 418 } | 420 } |
| 419 | 421 |
| 420 unsigned short TreeScope::comparePosition(const TreeScope& otherScope) const { | 422 unsigned short TreeScope::comparePosition(const TreeScope& otherScope) const { |
| 421 if (otherScope == this) | 423 if (otherScope == this) |
| (...skipping 27 matching lines...) Expand all Loading... |
| 449 toShadowRoot(child2->rootNode()).olderShadowRoot(); | 451 toShadowRoot(child2->rootNode()).olderShadowRoot(); |
| 450 child; child = child->olderShadowRoot()) { | 452 child; child = child->olderShadowRoot()) { |
| 451 if (child == child1) | 453 if (child == child1) |
| 452 return Node::kDocumentPositionFollowing; | 454 return Node::kDocumentPositionFollowing; |
| 453 } | 455 } |
| 454 | 456 |
| 455 return Node::kDocumentPositionPreceding; | 457 return Node::kDocumentPositionPreceding; |
| 456 } | 458 } |
| 457 } | 459 } |
| 458 | 460 |
| 459 // There was no difference between the two parent chains, i.e., one was a subs
et of the other. The shorter | 461 // There was no difference between the two parent chains, i.e., one was a |
| 460 // chain is the ancestor. | 462 // subset of the other. The shorter chain is the ancestor. |
| 461 return index1 < index2 | 463 return index1 < index2 |
| 462 ? Node::kDocumentPositionFollowing | | 464 ? Node::kDocumentPositionFollowing | |
| 463 Node::kDocumentPositionContainedBy | 465 Node::kDocumentPositionContainedBy |
| 464 : Node::kDocumentPositionPreceding | | 466 : Node::kDocumentPositionPreceding | |
| 465 Node::kDocumentPositionContains; | 467 Node::kDocumentPositionContains; |
| 466 } | 468 } |
| 467 | 469 |
| 468 const TreeScope* TreeScope::commonAncestorTreeScope( | 470 const TreeScope* TreeScope::commonAncestorTreeScope( |
| 469 const TreeScope& other) const { | 471 const TreeScope& other) const { |
| 470 HeapVector<Member<const TreeScope>, 16> thisChain; | 472 HeapVector<Member<const TreeScope>, 16> thisChain; |
| 471 for (const TreeScope* tree = this; tree; tree = tree->parentTreeScope()) | 473 for (const TreeScope* tree = this; tree; tree = tree->parentTreeScope()) |
| 472 thisChain.append(tree); | 474 thisChain.append(tree); |
| 473 | 475 |
| 474 HeapVector<Member<const TreeScope>, 16> otherChain; | 476 HeapVector<Member<const TreeScope>, 16> otherChain; |
| 475 for (const TreeScope* tree = &other; tree; tree = tree->parentTreeScope()) | 477 for (const TreeScope* tree = &other; tree; tree = tree->parentTreeScope()) |
| 476 otherChain.append(tree); | 478 otherChain.append(tree); |
| 477 | 479 |
| 478 // Keep popping out the last elements of these chains until a mismatched pair
is found. If |this| and |other| | 480 // Keep popping out the last elements of these chains until a mismatched pair |
| 479 // belong to different documents, null will be returned. | 481 // is found. If |this| and |other| belong to different documents, null will be |
| 482 // returned. |
| 480 const TreeScope* lastAncestor = nullptr; | 483 const TreeScope* lastAncestor = nullptr; |
| 481 while (!thisChain.isEmpty() && !otherChain.isEmpty() && | 484 while (!thisChain.isEmpty() && !otherChain.isEmpty() && |
| 482 thisChain.last() == otherChain.last()) { | 485 thisChain.last() == otherChain.last()) { |
| 483 lastAncestor = thisChain.last(); | 486 lastAncestor = thisChain.last(); |
| 484 thisChain.removeLast(); | 487 thisChain.removeLast(); |
| 485 otherChain.removeLast(); | 488 otherChain.removeLast(); |
| 486 } | 489 } |
| 487 return lastAncestor; | 490 return lastAncestor; |
| 488 } | 491 } |
| 489 | 492 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 538 visitor->trace(m_parentTreeScope); | 541 visitor->trace(m_parentTreeScope); |
| 539 visitor->trace(m_idTargetObserverRegistry); | 542 visitor->trace(m_idTargetObserverRegistry); |
| 540 visitor->trace(m_selection); | 543 visitor->trace(m_selection); |
| 541 visitor->trace(m_elementsById); | 544 visitor->trace(m_elementsById); |
| 542 visitor->trace(m_imageMapsByName); | 545 visitor->trace(m_imageMapsByName); |
| 543 visitor->trace(m_scopedStyleResolver); | 546 visitor->trace(m_scopedStyleResolver); |
| 544 visitor->trace(m_radioButtonGroupScope); | 547 visitor->trace(m_radioButtonGroupScope); |
| 545 } | 548 } |
| 546 | 549 |
| 547 } // namespace blink | 550 } // namespace blink |
| OLD | NEW |