| 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 * (C) 2001 Peter Kelly (pmk@post.com) | 4 * (C) 2001 Peter Kelly (pmk@post.com) |
| 5 * (C) 2001 Dirk Mueller (mueller@kde.org) | 5 * (C) 2001 Dirk Mueller (mueller@kde.org) |
| 6 * (C) 2007 David Smith (catfish.man@gmail.com) | 6 * (C) 2007 David Smith (catfish.man@gmail.com) |
| 7 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc.
All rights reserved. | 7 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc.
All rights reserved. |
| 8 * (C) 2007 Eric Seidel (eric@webkit.org) | 8 * (C) 2007 Eric Seidel (eric@webkit.org) |
| 9 * | 9 * |
| 10 * This library is free software; you can redistribute it and/or | 10 * This library is free software; you can redistribute it and/or |
| (...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 return nullAtom; | 437 return nullAtom; |
| 438 } | 438 } |
| 439 | 439 |
| 440 bool Element::shouldIgnoreAttributeCase() const | 440 bool Element::shouldIgnoreAttributeCase() const |
| 441 { | 441 { |
| 442 return isHTMLElement() && document().isHTMLDocument(); | 442 return isHTMLElement() && document().isHTMLDocument(); |
| 443 } | 443 } |
| 444 | 444 |
| 445 void Element::scrollIntoView(bool alignToTop) | 445 void Element::scrollIntoView(bool alignToTop) |
| 446 { | 446 { |
| 447 if (!inActiveDocument()) |
| 448 return; |
| 449 |
| 447 document().updateLayoutIgnorePendingStylesheets(); | 450 document().updateLayoutIgnorePendingStylesheets(); |
| 448 | 451 |
| 449 if (!layoutObject()) | 452 if (!layoutObject()) |
| 450 return; | 453 return; |
| 451 | 454 |
| 452 LayoutRect bounds = boundingBox(); | 455 LayoutRect bounds = boundingBox(); |
| 453 // Align to the top / bottom and to the closest edge. | 456 // Align to the top / bottom and to the closest edge. |
| 454 if (alignToTop) | 457 if (alignToTop) |
| 455 layoutObject()->scrollRectToVisible(bounds, ScrollAlignment::alignToEdge
IfNeeded, ScrollAlignment::alignTopAlways); | 458 layoutObject()->scrollRectToVisible(bounds, ScrollAlignment::alignToEdge
IfNeeded, ScrollAlignment::alignTopAlways); |
| 456 else | 459 else |
| 457 layoutObject()->scrollRectToVisible(bounds, ScrollAlignment::alignToEdge
IfNeeded, ScrollAlignment::alignBottomAlways); | 460 layoutObject()->scrollRectToVisible(bounds, ScrollAlignment::alignToEdge
IfNeeded, ScrollAlignment::alignBottomAlways); |
| 458 } | 461 } |
| 459 | 462 |
| 460 void Element::scrollIntoViewIfNeeded(bool centerIfNeeded) | 463 void Element::scrollIntoViewIfNeeded(bool centerIfNeeded) |
| 461 { | 464 { |
| 465 if (!inActiveDocument()) |
| 466 return; |
| 467 |
| 462 document().updateLayoutIgnorePendingStylesheets(); | 468 document().updateLayoutIgnorePendingStylesheets(); |
| 463 | 469 |
| 464 if (!layoutObject()) | 470 if (!layoutObject()) |
| 465 return; | 471 return; |
| 466 | 472 |
| 467 LayoutRect bounds = boundingBox(); | 473 LayoutRect bounds = boundingBox(); |
| 468 if (centerIfNeeded) | 474 if (centerIfNeeded) |
| 469 layoutObject()->scrollRectToVisible(bounds, ScrollAlignment::alignCenter
IfNeeded, ScrollAlignment::alignCenterIfNeeded); | 475 layoutObject()->scrollRectToVisible(bounds, ScrollAlignment::alignCenter
IfNeeded, ScrollAlignment::alignCenterIfNeeded); |
| 470 else | 476 else |
| 471 layoutObject()->scrollRectToVisible(bounds, ScrollAlignment::alignToEdge
IfNeeded, ScrollAlignment::alignToEdgeIfNeeded); | 477 layoutObject()->scrollRectToVisible(bounds, ScrollAlignment::alignToEdge
IfNeeded, ScrollAlignment::alignToEdgeIfNeeded); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 static double adjustForLocalZoom(LayoutUnit value, LayoutObject& layoutObject) | 577 static double adjustForLocalZoom(LayoutUnit value, LayoutObject& layoutObject) |
| 572 { | 578 { |
| 573 float zoomFactor = localZoomForLayoutObject(layoutObject); | 579 float zoomFactor = localZoomForLayoutObject(layoutObject); |
| 574 if (zoomFactor == 1) | 580 if (zoomFactor == 1) |
| 575 return value.toDouble(); | 581 return value.toDouble(); |
| 576 return value.toDouble() / zoomFactor; | 582 return value.toDouble() / zoomFactor; |
| 577 } | 583 } |
| 578 | 584 |
| 579 int Element::offsetLeft() | 585 int Element::offsetLeft() |
| 580 { | 586 { |
| 587 if (inActiveDocument()) |
| 588 return 0; |
| 581 document().updateLayoutIgnorePendingStylesheets(); | 589 document().updateLayoutIgnorePendingStylesheets(); |
| 582 if (LayoutBoxModelObject* layoutObject = layoutBoxModelObject()) | 590 if (LayoutBoxModelObject* layoutObject = layoutBoxModelObject()) |
| 583 return lroundf(adjustForLocalZoom(layoutObject->offsetLeft(), *layoutObj
ect)); | 591 return lroundf(adjustForLocalZoom(layoutObject->offsetLeft(), *layoutObj
ect)); |
| 584 return 0; | 592 return 0; |
| 585 } | 593 } |
| 586 | 594 |
| 587 int Element::offsetTop() | 595 int Element::offsetTop() |
| 588 { | 596 { |
| 597 if (inActiveDocument()) |
| 598 return 0; |
| 589 document().updateLayoutIgnorePendingStylesheets(); | 599 document().updateLayoutIgnorePendingStylesheets(); |
| 590 if (LayoutBoxModelObject* layoutObject = layoutBoxModelObject()) | 600 if (LayoutBoxModelObject* layoutObject = layoutBoxModelObject()) |
| 591 return lroundf(adjustForLocalZoom(layoutObject->pixelSnappedOffsetTop(),
*layoutObject)); | 601 return lroundf(adjustForLocalZoom(layoutObject->pixelSnappedOffsetTop(),
*layoutObject)); |
| 592 return 0; | 602 return 0; |
| 593 } | 603 } |
| 594 | 604 |
| 595 int Element::offsetWidth() | 605 int Element::offsetWidth() |
| 596 { | 606 { |
| 607 if (inActiveDocument()) |
| 608 return 0; |
| 597 document().updateLayoutIgnorePendingStylesheets(); | 609 document().updateLayoutIgnorePendingStylesheets(); |
| 598 if (LayoutBoxModelObject* layoutObject = layoutBoxModelObject()) | 610 if (LayoutBoxModelObject* layoutObject = layoutBoxModelObject()) |
| 599 return adjustLayoutUnitForAbsoluteZoom(layoutObject->pixelSnappedOffsetW
idth(), *layoutObject).round(); | 611 return adjustLayoutUnitForAbsoluteZoom(layoutObject->pixelSnappedOffsetW
idth(), *layoutObject).round(); |
| 600 return 0; | 612 return 0; |
| 601 } | 613 } |
| 602 | 614 |
| 603 int Element::offsetHeight() | 615 int Element::offsetHeight() |
| 604 { | 616 { |
| 617 if (inActiveDocument()) |
| 618 return 0; |
| 605 document().updateLayoutIgnorePendingStylesheets(); | 619 document().updateLayoutIgnorePendingStylesheets(); |
| 606 if (LayoutBoxModelObject* layoutObject = layoutBoxModelObject()) | 620 if (LayoutBoxModelObject* layoutObject = layoutBoxModelObject()) |
| 607 return adjustLayoutUnitForAbsoluteZoom(layoutObject->pixelSnappedOffsetH
eight(), *layoutObject).round(); | 621 return adjustLayoutUnitForAbsoluteZoom(layoutObject->pixelSnappedOffsetH
eight(), *layoutObject).round(); |
| 608 return 0; | 622 return 0; |
| 609 } | 623 } |
| 610 | 624 |
| 611 Element* Element::offsetParent() | 625 Element* Element::offsetParent() |
| 612 { | 626 { |
| 627 if (inActiveDocument()) |
| 628 return nullptr; |
| 629 |
| 613 document().updateLayoutIgnorePendingStylesheets(); | 630 document().updateLayoutIgnorePendingStylesheets(); |
| 614 | 631 |
| 615 LayoutObject* layoutObject = this->layoutObject(); | 632 LayoutObject* layoutObject = this->layoutObject(); |
| 616 if (!layoutObject) | 633 if (!layoutObject) |
| 617 return nullptr; | 634 return nullptr; |
| 618 | 635 |
| 619 Element* element = layoutObject->offsetParent(); | 636 Element* element = layoutObject->offsetParent(); |
| 620 if (!element) | 637 if (!element) |
| 621 return nullptr; | 638 return nullptr; |
| 622 | 639 |
| 623 if (element->isInShadowTree() && !element->containingShadowRoot()->isOpen()) | 640 if (element->isInShadowTree() && !element->containingShadowRoot()->isOpen()) |
| 624 return nullptr; | 641 return nullptr; |
| 625 | 642 |
| 626 return element; | 643 return element; |
| 627 } | 644 } |
| 628 | 645 |
| 629 int Element::clientLeft() | 646 int Element::clientLeft() |
| 630 { | 647 { |
| 648 if (inActiveDocument()) |
| 649 return 0; |
| 650 |
| 631 document().updateLayoutIgnorePendingStylesheets(); | 651 document().updateLayoutIgnorePendingStylesheets(); |
| 632 | 652 |
| 633 if (LayoutBox* layoutObject = layoutBox()) | 653 if (LayoutBox* layoutObject = layoutBox()) |
| 634 return adjustLayoutUnitForAbsoluteZoom(roundToInt(layoutObject->clientLe
ft()), *layoutObject); | 654 return adjustLayoutUnitForAbsoluteZoom(roundToInt(layoutObject->clientLe
ft()), *layoutObject); |
| 635 return 0; | 655 return 0; |
| 636 } | 656 } |
| 637 | 657 |
| 638 int Element::clientTop() | 658 int Element::clientTop() |
| 639 { | 659 { |
| 660 if (inActiveDocument()) |
| 661 return 0; |
| 662 |
| 640 document().updateLayoutIgnorePendingStylesheets(); | 663 document().updateLayoutIgnorePendingStylesheets(); |
| 641 | 664 |
| 642 if (LayoutBox* layoutObject = layoutBox()) | 665 if (LayoutBox* layoutObject = layoutBox()) |
| 643 return adjustLayoutUnitForAbsoluteZoom(roundToInt(layoutObject->clientTo
p()), *layoutObject); | 666 return adjustLayoutUnitForAbsoluteZoom(roundToInt(layoutObject->clientTo
p()), *layoutObject); |
| 644 return 0; | 667 return 0; |
| 645 } | 668 } |
| 646 | 669 |
| 647 int Element::clientWidth() | 670 int Element::clientWidth() |
| 648 { | 671 { |
| 672 if (inActiveDocument()) |
| 673 return 0; |
| 674 |
| 649 document().updateLayoutIgnorePendingStylesheets(); | 675 document().updateLayoutIgnorePendingStylesheets(); |
| 650 | 676 |
| 651 // When in strict mode, clientWidth for the document element should return t
he width of the containing frame. | 677 // When in strict mode, clientWidth for the document element should return t
he width of the containing frame. |
| 652 // When in quirks mode, clientWidth for the body element should return the w
idth of the containing frame. | 678 // When in quirks mode, clientWidth for the body element should return the w
idth of the containing frame. |
| 653 bool inQuirksMode = document().inQuirksMode(); | 679 bool inQuirksMode = document().inQuirksMode(); |
| 654 if ((!inQuirksMode && document().documentElement() == this) | 680 if ((!inQuirksMode && document().documentElement() == this) |
| 655 || (inQuirksMode && isHTMLElement() && document().body() == this)) { | 681 || (inQuirksMode && isHTMLElement() && document().body() == this)) { |
| 656 if (FrameView* view = document().view()) { | 682 if (FrameView* view = document().view()) { |
| 657 if (LayoutView* layoutView = document().layoutView()) { | 683 if (LayoutView* layoutView = document().layoutView()) { |
| 658 if (document().page()->settings().forceZeroLayoutHeight()) | 684 if (document().page()->settings().forceZeroLayoutHeight()) |
| 659 return adjustLayoutUnitForAbsoluteZoom(view->visibleContentS
ize().width(), *layoutView); | 685 return adjustLayoutUnitForAbsoluteZoom(view->visibleContentS
ize().width(), *layoutView); |
| 660 return adjustLayoutUnitForAbsoluteZoom(view->layoutSize().width(
), *layoutView); | 686 return adjustLayoutUnitForAbsoluteZoom(view->layoutSize().width(
), *layoutView); |
| 661 } | 687 } |
| 662 } | 688 } |
| 663 } | 689 } |
| 664 | 690 |
| 665 if (LayoutBox* layoutObject = layoutBox()) | 691 if (LayoutBox* layoutObject = layoutBox()) |
| 666 return adjustLayoutUnitForAbsoluteZoom(layoutObject->pixelSnappedClientW
idth(), *layoutObject).round(); | 692 return adjustLayoutUnitForAbsoluteZoom(layoutObject->pixelSnappedClientW
idth(), *layoutObject).round(); |
| 667 return 0; | 693 return 0; |
| 668 } | 694 } |
| 669 | 695 |
| 670 int Element::clientHeight() | 696 int Element::clientHeight() |
| 671 { | 697 { |
| 698 if (inActiveDocument()) |
| 699 return 0; |
| 700 |
| 672 document().updateLayoutIgnorePendingStylesheets(); | 701 document().updateLayoutIgnorePendingStylesheets(); |
| 673 | 702 |
| 674 // When in strict mode, clientHeight for the document element should return
the height of the containing frame. | 703 // When in strict mode, clientHeight for the document element should return
the height of the containing frame. |
| 675 // When in quirks mode, clientHeight for the body element should return the
height of the containing frame. | 704 // When in quirks mode, clientHeight for the body element should return the
height of the containing frame. |
| 676 bool inQuirksMode = document().inQuirksMode(); | 705 bool inQuirksMode = document().inQuirksMode(); |
| 677 | 706 |
| 678 if ((!inQuirksMode && document().documentElement() == this) | 707 if ((!inQuirksMode && document().documentElement() == this) |
| 679 || (inQuirksMode && isHTMLElement() && document().body() == this)) { | 708 || (inQuirksMode && isHTMLElement() && document().body() == this)) { |
| 680 if (FrameView* view = document().view()) { | 709 if (FrameView* view = document().view()) { |
| 681 if (LayoutView* layoutView = document().layoutView()) { | 710 if (LayoutView* layoutView = document().layoutView()) { |
| 682 if (document().page()->settings().forceZeroLayoutHeight()) | 711 if (document().page()->settings().forceZeroLayoutHeight()) |
| 683 return adjustLayoutUnitForAbsoluteZoom(view->visibleContentS
ize().height(), *layoutView); | 712 return adjustLayoutUnitForAbsoluteZoom(view->visibleContentS
ize().height(), *layoutView); |
| 684 return adjustLayoutUnitForAbsoluteZoom(view->layoutSize().height
(), *layoutView); | 713 return adjustLayoutUnitForAbsoluteZoom(view->layoutSize().height
(), *layoutView); |
| 685 } | 714 } |
| 686 } | 715 } |
| 687 } | 716 } |
| 688 | 717 |
| 689 if (LayoutBox* layoutObject = layoutBox()) | 718 if (LayoutBox* layoutObject = layoutBox()) |
| 690 return adjustLayoutUnitForAbsoluteZoom(layoutObject->pixelSnappedClientH
eight(), *layoutObject).round(); | 719 return adjustLayoutUnitForAbsoluteZoom(layoutObject->pixelSnappedClientH
eight(), *layoutObject).round(); |
| 691 return 0; | 720 return 0; |
| 692 } | 721 } |
| 693 | 722 |
| 694 double Element::scrollLeft() | 723 double Element::scrollLeft() |
| 695 { | 724 { |
| 725 if (inActiveDocument()) |
| 726 return 0; |
| 727 |
| 696 document().updateLayoutIgnorePendingStylesheets(); | 728 document().updateLayoutIgnorePendingStylesheets(); |
| 697 | 729 |
| 698 if (document().scrollingElement() == this) { | 730 if (document().scrollingElement() == this) { |
| 699 if (document().domWindow()) | 731 if (document().domWindow()) |
| 700 return document().domWindow()->scrollX(); | 732 return document().domWindow()->scrollX(); |
| 701 return 0; | 733 return 0; |
| 702 } | 734 } |
| 703 | 735 |
| 704 if (LayoutBox* box = layoutBox()) | 736 if (LayoutBox* box = layoutBox()) |
| 705 return adjustScrollForAbsoluteZoom(box->scrollLeft(), *box); | 737 return adjustScrollForAbsoluteZoom(box->scrollLeft(), *box); |
| 706 | 738 |
| 707 return 0; | 739 return 0; |
| 708 } | 740 } |
| 709 | 741 |
| 710 double Element::scrollTop() | 742 double Element::scrollTop() |
| 711 { | 743 { |
| 744 if (inActiveDocument()) |
| 745 return 0; |
| 746 |
| 712 document().updateLayoutIgnorePendingStylesheets(); | 747 document().updateLayoutIgnorePendingStylesheets(); |
| 713 | 748 |
| 714 if (document().scrollingElement() == this) { | 749 if (document().scrollingElement() == this) { |
| 715 if (document().domWindow()) | 750 if (document().domWindow()) |
| 716 return document().domWindow()->scrollY(); | 751 return document().domWindow()->scrollY(); |
| 717 return 0; | 752 return 0; |
| 718 } | 753 } |
| 719 | 754 |
| 720 if (LayoutBox* box = layoutBox()) | 755 if (LayoutBox* box = layoutBox()) |
| 721 return adjustScrollForAbsoluteZoom(box->scrollTop(), *box); | 756 return adjustScrollForAbsoluteZoom(box->scrollTop(), *box); |
| 722 | 757 |
| 723 return 0; | 758 return 0; |
| 724 } | 759 } |
| 725 | 760 |
| 726 void Element::setScrollLeft(double newLeft) | 761 void Element::setScrollLeft(double newLeft) |
| 727 { | 762 { |
| 763 if (!inActiveDocument()) |
| 764 return; |
| 765 |
| 728 document().updateLayoutIgnorePendingStylesheets(); | 766 document().updateLayoutIgnorePendingStylesheets(); |
| 729 | 767 |
| 730 newLeft = ScrollableArea::normalizeNonFiniteScroll(newLeft); | 768 newLeft = ScrollableArea::normalizeNonFiniteScroll(newLeft); |
| 731 | 769 |
| 732 if (document().scrollingElement() == this) { | 770 if (document().scrollingElement() == this) { |
| 733 if (LocalDOMWindow* window = document().domWindow()) | 771 if (LocalDOMWindow* window = document().domWindow()) |
| 734 window->scrollTo(newLeft, window->scrollY()); | 772 window->scrollTo(newLeft, window->scrollY()); |
| 735 } else { | 773 } else { |
| 736 LayoutBox* box = layoutBox(); | 774 LayoutBox* box = layoutBox(); |
| 737 if (box) | 775 if (box) |
| 738 box->setScrollLeft(LayoutUnit::fromFloatRound(newLeft * box->style()
->effectiveZoom())); | 776 box->setScrollLeft(LayoutUnit::fromFloatRound(newLeft * box->style()
->effectiveZoom())); |
| 739 } | 777 } |
| 740 } | 778 } |
| 741 | 779 |
| 742 void Element::setScrollTop(double newTop) | 780 void Element::setScrollTop(double newTop) |
| 743 { | 781 { |
| 782 if (!inActiveDocument()) |
| 783 return; |
| 784 |
| 744 document().updateLayoutIgnorePendingStylesheets(); | 785 document().updateLayoutIgnorePendingStylesheets(); |
| 745 | 786 |
| 746 newTop = ScrollableArea::normalizeNonFiniteScroll(newTop); | 787 newTop = ScrollableArea::normalizeNonFiniteScroll(newTop); |
| 747 | 788 |
| 748 if (document().scrollingElement() == this) { | 789 if (document().scrollingElement() == this) { |
| 749 if (LocalDOMWindow* window = document().domWindow()) | 790 if (LocalDOMWindow* window = document().domWindow()) |
| 750 window->scrollTo(window->scrollX(), newTop); | 791 window->scrollTo(window->scrollX(), newTop); |
| 751 } else { | 792 } else { |
| 752 LayoutBox* box = layoutBox(); | 793 LayoutBox* box = layoutBox(); |
| 753 if (box) | 794 if (box) |
| 754 box->setScrollTop(LayoutUnit::fromFloatRound(newTop * box->style()->
effectiveZoom())); | 795 box->setScrollTop(LayoutUnit::fromFloatRound(newTop * box->style()->
effectiveZoom())); |
| 755 } | 796 } |
| 756 } | 797 } |
| 757 | 798 |
| 758 int Element::scrollWidth() | 799 int Element::scrollWidth() |
| 759 { | 800 { |
| 801 if (!inActiveDocument()) |
| 802 return 0; |
| 803 |
| 760 document().updateLayoutIgnorePendingStylesheets(); | 804 document().updateLayoutIgnorePendingStylesheets(); |
| 761 | 805 |
| 762 if (document().scrollingElement() == this) { | 806 if (document().scrollingElement() == this) { |
| 763 if (document().view()) | 807 if (document().view()) |
| 764 return adjustForAbsoluteZoom(document().view()->contentsWidth(), doc
ument().frame()->pageZoomFactor()); | 808 return adjustForAbsoluteZoom(document().view()->contentsWidth(), doc
ument().frame()->pageZoomFactor()); |
| 765 return 0; | 809 return 0; |
| 766 } | 810 } |
| 767 | 811 |
| 768 if (LayoutBox* box = layoutBox()) | 812 if (LayoutBox* box = layoutBox()) |
| 769 return adjustLayoutUnitForAbsoluteZoom(box->scrollWidth(), *box).round()
; | 813 return adjustLayoutUnitForAbsoluteZoom(box->scrollWidth(), *box).round()
; |
| 770 return 0; | 814 return 0; |
| 771 } | 815 } |
| 772 | 816 |
| 773 int Element::scrollHeight() | 817 int Element::scrollHeight() |
| 774 { | 818 { |
| 819 if (!inActiveDocument()) |
| 820 return 0; |
| 821 |
| 775 document().updateLayoutIgnorePendingStylesheets(); | 822 document().updateLayoutIgnorePendingStylesheets(); |
| 776 | 823 |
| 777 if (document().scrollingElement() == this) { | 824 if (document().scrollingElement() == this) { |
| 778 if (document().view()) | 825 if (document().view()) |
| 779 return adjustForAbsoluteZoom(document().view()->contentsHeight(), do
cument().frame()->pageZoomFactor()); | 826 return adjustForAbsoluteZoom(document().view()->contentsHeight(), do
cument().frame()->pageZoomFactor()); |
| 780 return 0; | 827 return 0; |
| 781 } | 828 } |
| 782 | 829 |
| 783 if (LayoutBox* box = layoutBox()) | 830 if (LayoutBox* box = layoutBox()) |
| 784 return adjustLayoutUnitForAbsoluteZoom(box->scrollHeight(), *box).round(
); | 831 return adjustLayoutUnitForAbsoluteZoom(box->scrollHeight(), *box).round(
); |
| 785 return 0; | 832 return 0; |
| 786 } | 833 } |
| 787 | 834 |
| 788 void Element::scrollBy(double x, double y) | 835 void Element::scrollBy(double x, double y) |
| 789 { | 836 { |
| 790 ScrollToOptions scrollToOptions; | 837 ScrollToOptions scrollToOptions; |
| 791 scrollToOptions.setLeft(x); | 838 scrollToOptions.setLeft(x); |
| 792 scrollToOptions.setTop(y); | 839 scrollToOptions.setTop(y); |
| 793 scrollBy(scrollToOptions); | 840 scrollBy(scrollToOptions); |
| 794 } | 841 } |
| 795 | 842 |
| 796 void Element::scrollBy(const ScrollToOptions& scrollToOptions) | 843 void Element::scrollBy(const ScrollToOptions& scrollToOptions) |
| 797 { | 844 { |
| 845 if (!inActiveDocument()) |
| 846 return; |
| 847 |
| 798 // FIXME: This should be removed once scroll updates are processed only afte
r | 848 // FIXME: This should be removed once scroll updates are processed only afte
r |
| 799 // the compositing update. See http://crbug.com/420741. | 849 // the compositing update. See http://crbug.com/420741. |
| 800 document().updateLayoutIgnorePendingStylesheets(); | 850 document().updateLayoutIgnorePendingStylesheets(); |
| 801 | 851 |
| 802 if (document().scrollingElement() == this) { | 852 if (document().scrollingElement() == this) { |
| 803 scrollFrameBy(scrollToOptions); | 853 scrollFrameBy(scrollToOptions); |
| 804 } else { | 854 } else { |
| 805 scrollLayoutBoxBy(scrollToOptions); | 855 scrollLayoutBoxBy(scrollToOptions); |
| 806 } | 856 } |
| 807 } | 857 } |
| 808 | 858 |
| 809 void Element::scrollTo(double x, double y) | 859 void Element::scrollTo(double x, double y) |
| 810 { | 860 { |
| 811 ScrollToOptions scrollToOptions; | 861 ScrollToOptions scrollToOptions; |
| 812 scrollToOptions.setLeft(x); | 862 scrollToOptions.setLeft(x); |
| 813 scrollToOptions.setTop(y); | 863 scrollToOptions.setTop(y); |
| 814 scrollTo(scrollToOptions); | 864 scrollTo(scrollToOptions); |
| 815 } | 865 } |
| 816 | 866 |
| 817 void Element::scrollTo(const ScrollToOptions& scrollToOptions) | 867 void Element::scrollTo(const ScrollToOptions& scrollToOptions) |
| 818 { | 868 { |
| 869 if (!inActiveDocument()) |
| 870 return; |
| 871 |
| 819 // FIXME: This should be removed once scroll updates are processed only afte
r | 872 // FIXME: This should be removed once scroll updates are processed only afte
r |
| 820 // the compositing update. See http://crbug.com/420741. | 873 // the compositing update. See http://crbug.com/420741. |
| 821 document().updateLayoutIgnorePendingStylesheets(); | 874 document().updateLayoutIgnorePendingStylesheets(); |
| 822 | 875 |
| 823 if (document().scrollingElement() == this) { | 876 if (document().scrollingElement() == this) { |
| 824 scrollFrameTo(scrollToOptions); | 877 scrollFrameTo(scrollToOptions); |
| 825 } else { | 878 } else { |
| 826 scrollLayoutBoxTo(scrollToOptions); | 879 scrollLayoutBoxTo(scrollToOptions); |
| 827 } | 880 } |
| 828 } | 881 } |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 907 } | 960 } |
| 908 | 961 |
| 909 void Element::decrementProxyCount() | 962 void Element::decrementProxyCount() |
| 910 { | 963 { |
| 911 if (ensureElementRareData().decrementProxyCount() == 0) | 964 if (ensureElementRareData().decrementProxyCount() == 0) |
| 912 setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::creat
e(StyleChangeReason::CompositorProxy)); | 965 setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::creat
e(StyleChangeReason::CompositorProxy)); |
| 913 } | 966 } |
| 914 | 967 |
| 915 bool Element::hasNonEmptyLayoutSize() const | 968 bool Element::hasNonEmptyLayoutSize() const |
| 916 { | 969 { |
| 970 if (!inActiveDocument()) |
| 971 return false; |
| 972 |
| 917 document().updateLayoutIgnorePendingStylesheets(); | 973 document().updateLayoutIgnorePendingStylesheets(); |
| 918 | 974 |
| 919 if (LayoutBoxModelObject* box = layoutBoxModelObject()) | 975 if (LayoutBoxModelObject* box = layoutBoxModelObject()) |
| 920 return box->hasNonEmptyLayoutSize(); | 976 return box->hasNonEmptyLayoutSize(); |
| 921 return false; | 977 return false; |
| 922 } | 978 } |
| 923 | 979 |
| 924 IntRect Element::boundsInViewportSpace() | 980 IntRect Element::boundsInViewportSpace() |
| 925 { | 981 { |
| 982 if (!inActiveDocument()) |
| 983 return IntRect(); |
| 984 |
| 926 document().updateLayoutIgnorePendingStylesheets(); | 985 document().updateLayoutIgnorePendingStylesheets(); |
| 927 | 986 |
| 928 FrameView* view = document().view(); | 987 FrameView* view = document().view(); |
| 929 if (!view) | 988 if (!view) |
| 930 return IntRect(); | 989 return IntRect(); |
| 931 | 990 |
| 932 Vector<FloatQuad> quads; | 991 Vector<FloatQuad> quads; |
| 933 if (isSVGElement() && layoutObject()) { | 992 if (isSVGElement() && layoutObject()) { |
| 934 // Get the bounding rectangle from the SVG model. | 993 // Get the bounding rectangle from the SVG model. |
| 935 SVGElement* svgElement = toSVGElement(this); | 994 SVGElement* svgElement = toSVGElement(this); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 947 | 1006 |
| 948 IntRect result = quads[0].enclosingBoundingBox(); | 1007 IntRect result = quads[0].enclosingBoundingBox(); |
| 949 for (size_t i = 1; i < quads.size(); ++i) | 1008 for (size_t i = 1; i < quads.size(); ++i) |
| 950 result.unite(quads[i].enclosingBoundingBox()); | 1009 result.unite(quads[i].enclosingBoundingBox()); |
| 951 | 1010 |
| 952 return view->soonToBeRemovedContentsToUnscaledViewport(result); | 1011 return view->soonToBeRemovedContentsToUnscaledViewport(result); |
| 953 } | 1012 } |
| 954 | 1013 |
| 955 ClientRectList* Element::getClientRects() | 1014 ClientRectList* Element::getClientRects() |
| 956 { | 1015 { |
| 1016 if (!inActiveDocument()) |
| 1017 return ClientRectList::create(); |
| 1018 |
| 957 document().updateLayoutIgnorePendingStylesheets(); | 1019 document().updateLayoutIgnorePendingStylesheets(); |
| 958 | 1020 |
| 959 LayoutObject* elementLayoutObject = layoutObject(); | 1021 LayoutObject* elementLayoutObject = layoutObject(); |
| 960 if (!elementLayoutObject || (!elementLayoutObject->isBoxModelObject() && !el
ementLayoutObject->isBR())) | 1022 if (!elementLayoutObject || (!elementLayoutObject->isBoxModelObject() && !el
ementLayoutObject->isBR())) |
| 961 return ClientRectList::create(); | 1023 return ClientRectList::create(); |
| 962 | 1024 |
| 963 // FIXME: Handle SVG elements. | 1025 // FIXME: Handle SVG elements. |
| 964 // FIXME: Handle table/inline-table with a caption. | 1026 // FIXME: Handle table/inline-table with a caption. |
| 965 | 1027 |
| 966 Vector<FloatQuad> quads; | 1028 Vector<FloatQuad> quads; |
| 967 elementLayoutObject->absoluteQuads(quads); | 1029 elementLayoutObject->absoluteQuads(quads); |
| 968 document().adjustFloatQuadsForScrollAndAbsoluteZoom(quads, *elementLayoutObj
ect); | 1030 document().adjustFloatQuadsForScrollAndAbsoluteZoom(quads, *elementLayoutObj
ect); |
| 969 return ClientRectList::create(quads); | 1031 return ClientRectList::create(quads); |
| 970 } | 1032 } |
| 971 | 1033 |
| 972 ClientRect* Element::getBoundingClientRect() | 1034 ClientRect* Element::getBoundingClientRect() |
| 973 { | 1035 { |
| 1036 if (!inActiveDocument()) |
| 1037 return ClientRect::create(); |
| 1038 |
| 974 document().updateLayoutIgnorePendingStylesheets(); | 1039 document().updateLayoutIgnorePendingStylesheets(); |
| 975 | 1040 |
| 976 Vector<FloatQuad> quads; | 1041 Vector<FloatQuad> quads; |
| 977 LayoutObject* elementLayoutObject = layoutObject(); | 1042 LayoutObject* elementLayoutObject = layoutObject(); |
| 978 if (elementLayoutObject) { | 1043 if (elementLayoutObject) { |
| 979 if (isSVGElement() && !elementLayoutObject->isSVGRoot()) { | 1044 if (isSVGElement() && !elementLayoutObject->isSVGRoot()) { |
| 980 // Get the bounding rectangle from the SVG model. | 1045 // Get the bounding rectangle from the SVG model. |
| 981 SVGElement* svgElement = toSVGElement(this); | 1046 SVGElement* svgElement = toSVGElement(this); |
| 982 FloatRect localRect; | 1047 FloatRect localRect; |
| 983 if (svgElement->getBoundingBox(localRect)) | 1048 if (svgElement->getBoundingBox(localRect)) |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1002 IntRect Element::screenRect() const | 1067 IntRect Element::screenRect() const |
| 1003 { | 1068 { |
| 1004 if (!layoutObject()) | 1069 if (!layoutObject()) |
| 1005 return IntRect(); | 1070 return IntRect(); |
| 1006 // FIXME: this should probably respect transforms | 1071 // FIXME: this should probably respect transforms |
| 1007 return document().view()->contentsToScreen(layoutObject()->absoluteBoundingB
oxRectIgnoringTransforms()); | 1072 return document().view()->contentsToScreen(layoutObject()->absoluteBoundingB
oxRectIgnoringTransforms()); |
| 1008 } | 1073 } |
| 1009 | 1074 |
| 1010 const AtomicString& Element::computedRole() | 1075 const AtomicString& Element::computedRole() |
| 1011 { | 1076 { |
| 1012 document().updateLayoutIgnorePendingStylesheets(); | 1077 if (inActiveDocument()) |
| 1078 document().updateLayoutIgnorePendingStylesheets(); |
| 1013 OwnPtr<ScopedAXObjectCache> cache = ScopedAXObjectCache::create(document()); | 1079 OwnPtr<ScopedAXObjectCache> cache = ScopedAXObjectCache::create(document()); |
| 1014 return cache->get()->computedRoleForNode(this); | 1080 return cache->get()->computedRoleForNode(this); |
| 1015 } | 1081 } |
| 1016 | 1082 |
| 1017 String Element::computedName() | 1083 String Element::computedName() |
| 1018 { | 1084 { |
| 1019 document().updateLayoutIgnorePendingStylesheets(); | 1085 if (inActiveDocument()) |
| 1086 document().updateLayoutIgnorePendingStylesheets(); |
| 1020 OwnPtr<ScopedAXObjectCache> cache = ScopedAXObjectCache::create(document()); | 1087 OwnPtr<ScopedAXObjectCache> cache = ScopedAXObjectCache::create(document()); |
| 1021 return cache->get()->computedNameForNode(this); | 1088 return cache->get()->computedNameForNode(this); |
| 1022 } | 1089 } |
| 1023 | 1090 |
| 1024 const AtomicString& Element::getAttribute(const AtomicString& localName) const | 1091 const AtomicString& Element::getAttribute(const AtomicString& localName) const |
| 1025 { | 1092 { |
| 1026 if (!elementData()) | 1093 if (!elementData()) |
| 1027 return nullAtom; | 1094 return nullAtom; |
| 1028 synchronizeAttribute(localName); | 1095 synchronizeAttribute(localName); |
| 1029 if (const Attribute* attribute = elementData()->attributes().find(localName,
shouldIgnoreAttributeCase())) | 1096 if (const Attribute* attribute = elementData()->attributes().find(localName,
shouldIgnoreAttributeCase())) |
| (...skipping 1233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2263 { | 2330 { |
| 2264 if (!elementData()) | 2331 if (!elementData()) |
| 2265 return false; | 2332 return false; |
| 2266 QualifiedName qName(nullAtom, localName, namespaceURI); | 2333 QualifiedName qName(nullAtom, localName, namespaceURI); |
| 2267 synchronizeAttribute(qName); | 2334 synchronizeAttribute(qName); |
| 2268 return elementData()->attributes().find(qName); | 2335 return elementData()->attributes().find(qName); |
| 2269 } | 2336 } |
| 2270 | 2337 |
| 2271 void Element::focus(bool restorePreviousSelection, WebFocusType type, InputDevic
eCapabilities* sourceCapabilities) | 2338 void Element::focus(bool restorePreviousSelection, WebFocusType type, InputDevic
eCapabilities* sourceCapabilities) |
| 2272 { | 2339 { |
| 2273 if (!inDocument()) | 2340 if (!inActiveDocument()) |
| 2274 return; | 2341 return; |
| 2275 | 2342 |
| 2276 if (document().focusedElement() == this) | 2343 if (document().focusedElement() == this) |
| 2277 return; | 2344 return; |
| 2278 | 2345 |
| 2279 if (!document().isActive()) | |
| 2280 return; | |
| 2281 | |
| 2282 document().updateLayoutIgnorePendingStylesheets(); | 2346 document().updateLayoutIgnorePendingStylesheets(); |
| 2283 if (!isFocusable()) | 2347 if (!isFocusable()) |
| 2284 return; | 2348 return; |
| 2285 | 2349 |
| 2286 if (authorShadowRoot() && authorShadowRoot()->delegatesFocus()) { | 2350 if (authorShadowRoot() && authorShadowRoot()->delegatesFocus()) { |
| 2287 if (containsIncludingShadowDOM(document().focusedElement())) | 2351 if (containsIncludingShadowDOM(document().focusedElement())) |
| 2288 return; | 2352 return; |
| 2289 | 2353 |
| 2290 // Slide the focus to its inner node. | 2354 // Slide the focus to its inner node. |
| 2291 Element* next = document().page()->focusController().findFocusableElemen
t(WebFocusTypeForward, *this); | 2355 Element* next = document().page()->focusController().findFocusableElemen
t(WebFocusTypeForward, *this); |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2550 | 2614 |
| 2551 RefPtrWillBeRawPtr<DocumentFragment> fragment = createFragmentForInnerOuterH
TML(markup, contextElement.get(), AllowScriptingContent, "insertAdjacentHTML", e
xceptionState); | 2615 RefPtrWillBeRawPtr<DocumentFragment> fragment = createFragmentForInnerOuterH
TML(markup, contextElement.get(), AllowScriptingContent, "insertAdjacentHTML", e
xceptionState); |
| 2552 if (!fragment) | 2616 if (!fragment) |
| 2553 return; | 2617 return; |
| 2554 insertAdjacent(where, fragment.get(), exceptionState); | 2618 insertAdjacent(where, fragment.get(), exceptionState); |
| 2555 } | 2619 } |
| 2556 | 2620 |
| 2557 String Element::innerText() | 2621 String Element::innerText() |
| 2558 { | 2622 { |
| 2559 // We need to update layout, since plainText uses line boxes in the layout t
ree. | 2623 // We need to update layout, since plainText uses line boxes in the layout t
ree. |
| 2560 document().updateLayoutIgnorePendingStylesheets(); | 2624 if (inActiveDocument()) |
| 2625 document().updateLayoutIgnorePendingStylesheets(); |
| 2561 | 2626 |
| 2562 if (!layoutObject()) | 2627 if (!layoutObject()) |
| 2563 return textContent(true); | 2628 return textContent(true); |
| 2564 | 2629 |
| 2565 return plainText(EphemeralRange::rangeOfContents(*this), TextIteratorForInne
rText); | 2630 return plainText(EphemeralRange::rangeOfContents(*this), TextIteratorForInne
rText); |
| 2566 } | 2631 } |
| 2567 | 2632 |
| 2568 String Element::outerText() | 2633 String Element::outerText() |
| 2569 { | 2634 { |
| 2570 // Getting outerText is the same as getting innerText, only | 2635 // Getting outerText is the same as getting innerText, only |
| (...skipping 927 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3498 { | 3563 { |
| 3499 #if ENABLE(OILPAN) | 3564 #if ENABLE(OILPAN) |
| 3500 if (hasRareData()) | 3565 if (hasRareData()) |
| 3501 visitor->trace(elementRareData()); | 3566 visitor->trace(elementRareData()); |
| 3502 visitor->trace(m_elementData); | 3567 visitor->trace(m_elementData); |
| 3503 #endif | 3568 #endif |
| 3504 ContainerNode::trace(visitor); | 3569 ContainerNode::trace(visitor); |
| 3505 } | 3570 } |
| 3506 | 3571 |
| 3507 } // namespace blink | 3572 } // namespace blink |
| OLD | NEW |