| 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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 #include "core/editing/TextIterator.h" | 78 #include "core/editing/TextIterator.h" |
| 79 #include "core/editing/htmlediting.h" | 79 #include "core/editing/htmlediting.h" |
| 80 #include "core/editing/markup.h" | 80 #include "core/editing/markup.h" |
| 81 #include "core/events/EventDispatcher.h" | 81 #include "core/events/EventDispatcher.h" |
| 82 #include "core/events/FocusEvent.h" | 82 #include "core/events/FocusEvent.h" |
| 83 #include "core/frame/FrameHost.h" | 83 #include "core/frame/FrameHost.h" |
| 84 #include "core/frame/FrameView.h" | 84 #include "core/frame/FrameView.h" |
| 85 #include "core/frame/LocalDOMWindow.h" | 85 #include "core/frame/LocalDOMWindow.h" |
| 86 #include "core/frame/LocalFrame.h" | 86 #include "core/frame/LocalFrame.h" |
| 87 #include "core/frame/PinchViewport.h" | 87 #include "core/frame/PinchViewport.h" |
| 88 #include "core/frame/ScrollToOptions.h" |
| 88 #include "core/frame/Settings.h" | 89 #include "core/frame/Settings.h" |
| 89 #include "core/frame/UseCounter.h" | 90 #include "core/frame/UseCounter.h" |
| 90 #include "core/frame/csp/ContentSecurityPolicy.h" | 91 #include "core/frame/csp/ContentSecurityPolicy.h" |
| 91 #include "core/html/ClassList.h" | 92 #include "core/html/ClassList.h" |
| 92 #include "core/html/HTMLCanvasElement.h" | 93 #include "core/html/HTMLCanvasElement.h" |
| 93 #include "core/html/HTMLCollection.h" | 94 #include "core/html/HTMLCollection.h" |
| 94 #include "core/html/HTMLDocument.h" | 95 #include "core/html/HTMLDocument.h" |
| 95 #include "core/html/HTMLElement.h" | 96 #include "core/html/HTMLElement.h" |
| 96 #include "core/html/HTMLFormControlsCollection.h" | 97 #include "core/html/HTMLFormControlsCollection.h" |
| 97 #include "core/html/HTMLFrameElementBase.h" | 98 #include "core/html/HTMLFrameElementBase.h" |
| (...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 682 if (document().inQuirksMode()) | 683 if (document().inQuirksMode()) |
| 683 return; | 684 return; |
| 684 | 685 |
| 685 LocalFrame* frame = document().frame(); | 686 LocalFrame* frame = document().frame(); |
| 686 if (!frame) | 687 if (!frame) |
| 687 return; | 688 return; |
| 688 FrameView* view = frame->view(); | 689 FrameView* view = frame->view(); |
| 689 if (!view) | 690 if (!view) |
| 690 return; | 691 return; |
| 691 | 692 |
| 692 view->setScrollPosition(DoublePoint(newLeft * frame->pageZoomFactor(), v
iew->scrollY())); | 693 view->setScrollPosition(DoublePoint(newLeft * frame->pageZoomFactor(), v
iew->scrollY()), ScrollBehaviorAuto); |
| 693 } | 694 } |
| 694 } | 695 } |
| 695 | 696 |
| 696 void Element::setScrollLeft(const Dictionary& scrollOptionsHorizontal, Exception
State& exceptionState) | |
| 697 { | |
| 698 String scrollBehaviorString; | |
| 699 ScrollBehavior scrollBehavior = ScrollBehaviorAuto; | |
| 700 if (DictionaryHelper::get(scrollOptionsHorizontal, "behavior", scrollBehavio
rString)) { | |
| 701 if (!ScrollableArea::scrollBehaviorFromString(scrollBehaviorString, scro
llBehavior)) { | |
| 702 exceptionState.throwTypeError("The ScrollBehavior provided is invali
d."); | |
| 703 return; | |
| 704 } | |
| 705 } | |
| 706 | |
| 707 double position; | |
| 708 if (!DictionaryHelper::get(scrollOptionsHorizontal, "x", position)) { | |
| 709 exceptionState.throwTypeError("ScrollOptionsHorizontal must include an '
x' member."); | |
| 710 return; | |
| 711 } | |
| 712 | |
| 713 // FIXME: Use scrollBehavior to decide whether to scroll smoothly or instant
ly. | |
| 714 setScrollLeft(position); | |
| 715 } | |
| 716 | |
| 717 void Element::setScrollTop(double newTop) | 697 void Element::setScrollTop(double newTop) |
| 718 { | 698 { |
| 719 document().updateLayoutIgnorePendingStylesheets(); | 699 document().updateLayoutIgnorePendingStylesheets(); |
| 720 | 700 |
| 721 if (std::isnan(newTop)) | 701 if (std::isnan(newTop)) |
| 722 return; | 702 return; |
| 723 | 703 |
| 724 if (document().documentElement() != this) { | 704 if (document().documentElement() != this) { |
| 725 RenderBox* rend = renderBox(); | 705 RenderBox* rend = renderBox(); |
| 726 if (rend) | 706 if (rend) |
| 727 rend->setScrollTop(LayoutUnit::fromFloatRound(newTop * rend->style()
->effectiveZoom())); | 707 rend->setScrollTop(LayoutUnit::fromFloatRound(newTop * rend->style()
->effectiveZoom())); |
| 728 return; | 708 return; |
| 729 } | 709 } |
| 730 | 710 |
| 731 if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { | 711 if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { |
| 732 if (document().inQuirksMode()) | 712 if (document().inQuirksMode()) |
| 733 return; | 713 return; |
| 734 | 714 |
| 735 LocalFrame* frame = document().frame(); | 715 LocalFrame* frame = document().frame(); |
| 736 if (!frame) | 716 if (!frame) |
| 737 return; | 717 return; |
| 738 FrameView* view = frame->view(); | 718 FrameView* view = frame->view(); |
| 739 if (!view) | 719 if (!view) |
| 740 return; | 720 return; |
| 741 | 721 |
| 742 view->setScrollPosition(DoublePoint(view->scrollX(), newTop * frame->pag
eZoomFactor())); | 722 view->setScrollPosition(DoublePoint(view->scrollX(), newTop * frame->pag
eZoomFactor()), ScrollBehaviorAuto); |
| 743 } | 723 } |
| 744 } | 724 } |
| 745 | 725 |
| 746 void Element::setScrollTop(const Dictionary& scrollOptionsVertical, ExceptionSta
te& exceptionState) | |
| 747 { | |
| 748 String scrollBehaviorString; | |
| 749 ScrollBehavior scrollBehavior = ScrollBehaviorAuto; | |
| 750 if (DictionaryHelper::get(scrollOptionsVertical, "behavior", scrollBehaviorS
tring)) { | |
| 751 if (!ScrollableArea::scrollBehaviorFromString(scrollBehaviorString, scro
llBehavior)) { | |
| 752 exceptionState.throwTypeError("The ScrollBehavior provided is invali
d."); | |
| 753 return; | |
| 754 } | |
| 755 } | |
| 756 | |
| 757 double position; | |
| 758 if (!DictionaryHelper::get(scrollOptionsVertical, "y", position)) { | |
| 759 exceptionState.throwTypeError("ScrollOptionsVertical must include a 'y'
member."); | |
| 760 return; | |
| 761 } | |
| 762 | |
| 763 // FIXME: Use scrollBehavior to decide whether to scroll smoothly or instant
ly. | |
| 764 setScrollTop(position); | |
| 765 } | |
| 766 | |
| 767 int Element::scrollWidth() | 726 int Element::scrollWidth() |
| 768 { | 727 { |
| 769 document().updateLayoutIgnorePendingStylesheets(); | 728 document().updateLayoutIgnorePendingStylesheets(); |
| 770 if (RenderBox* rend = renderBox()) | 729 if (RenderBox* rend = renderBox()) |
| 771 return adjustLayoutUnitForAbsoluteZoom(rend->scrollWidth(), *rend).toDou
ble(); | 730 return adjustLayoutUnitForAbsoluteZoom(rend->scrollWidth(), *rend).toDou
ble(); |
| 772 return 0; | 731 return 0; |
| 773 } | 732 } |
| 774 | 733 |
| 775 int Element::scrollHeight() | 734 int Element::scrollHeight() |
| 776 { | 735 { |
| 777 document().updateLayoutIgnorePendingStylesheets(); | 736 document().updateLayoutIgnorePendingStylesheets(); |
| 778 if (RenderBox* rend = renderBox()) | 737 if (RenderBox* rend = renderBox()) |
| 779 return adjustLayoutUnitForAbsoluteZoom(rend->scrollHeight(), *rend).toDo
uble(); | 738 return adjustLayoutUnitForAbsoluteZoom(rend->scrollHeight(), *rend).toDo
uble(); |
| 780 return 0; | 739 return 0; |
| 781 } | 740 } |
| 782 | 741 |
| 742 void Element::scrollBy(double x, double y) |
| 743 { |
| 744 ScrollToOptions scrollToOptions; |
| 745 scrollToOptions.setLeft(x); |
| 746 scrollToOptions.setTop(y); |
| 747 scrollBy(scrollToOptions); |
| 748 } |
| 749 |
| 750 void Element::scrollBy(const ScrollToOptions& scrollToOptions) |
| 751 { |
| 752 // FIXME: This should be removed once scroll updates are processed only afte
r |
| 753 // the compositing update. See http://crbug.com/420741. |
| 754 document().updateLayoutIgnorePendingStylesheets(); |
| 755 |
| 756 if (document().documentElement() != this) { |
| 757 scrollRenderBoxBy(scrollToOptions); |
| 758 return; |
| 759 } |
| 760 |
| 761 if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { |
| 762 if (document().inQuirksMode()) |
| 763 return; |
| 764 scrollFrameBy(scrollToOptions); |
| 765 } |
| 766 } |
| 767 |
| 768 void Element::scrollTo(double x, double y) |
| 769 { |
| 770 ScrollToOptions scrollToOptions; |
| 771 scrollToOptions.setLeft(x); |
| 772 scrollToOptions.setTop(y); |
| 773 scrollTo(scrollToOptions); |
| 774 } |
| 775 |
| 776 void Element::scrollTo(const ScrollToOptions& scrollToOptions) |
| 777 { |
| 778 // FIXME: This should be removed once scroll updates are processed only afte
r |
| 779 // the compositing update. See http://crbug.com/420741. |
| 780 document().updateLayoutIgnorePendingStylesheets(); |
| 781 |
| 782 if (document().documentElement() != this) { |
| 783 scrollRenderBoxTo(scrollToOptions); |
| 784 return; |
| 785 } |
| 786 |
| 787 if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { |
| 788 if (document().inQuirksMode()) |
| 789 return; |
| 790 scrollFrameTo(scrollToOptions); |
| 791 } |
| 792 } |
| 793 |
| 794 void Element::scrollRenderBoxBy(const ScrollToOptions& scrollToOptions) |
| 795 { |
| 796 double left = scrollToOptions.hasLeft() ? scrollToOptions.left() : 0.0; |
| 797 double top = scrollToOptions.hasTop() ? scrollToOptions.top() : 0.0; |
| 798 if (std::isnan(left) || std::isnan(top)) |
| 799 return; |
| 800 |
| 801 ScrollBehavior scrollBehavior = ScrollBehaviorAuto; |
| 802 ScrollableArea::scrollBehaviorFromString(scrollToOptions.behavior(), scrollB
ehavior); |
| 803 RenderBox* rend = renderBox(); |
| 804 if (rend) { |
| 805 double currentScaledLeft = rend->scrollLeft(); |
| 806 double currentScaledTop = rend->scrollTop(); |
| 807 double newScaledLeft = left * rend->style()->effectiveZoom() + currentSc
aledLeft; |
| 808 double newScaledTop = top * rend->style()->effectiveZoom() + currentScal
edTop; |
| 809 // FIXME: Use scrollBehavior to decide whether to scroll smoothly or ins
tantly. |
| 810 rend->scrollToOffset(DoubleSize(newScaledLeft, newScaledTop)); |
| 811 } |
| 812 } |
| 813 |
| 814 void Element::scrollRenderBoxTo(const ScrollToOptions& scrollToOptions) |
| 815 { |
| 816 if ((scrollToOptions.hasLeft() && std::isnan(scrollToOptions.left())) |
| 817 || (scrollToOptions.hasTop() && std::isnan(scrollToOptions.top()))) |
| 818 return; |
| 819 |
| 820 ScrollBehavior scrollBehavior = ScrollBehaviorAuto; |
| 821 ScrollableArea::scrollBehaviorFromString(scrollToOptions.behavior(), scrollB
ehavior); |
| 822 |
| 823 RenderBox* rend = renderBox(); |
| 824 if (rend) { |
| 825 double scaledLeft = rend->scrollLeft(); |
| 826 double scaledTop = rend->scrollTop(); |
| 827 if (scrollToOptions.hasLeft()) |
| 828 scaledLeft = scrollToOptions.left() * rend->style()->effectiveZoom()
; |
| 829 if (scrollToOptions.hasTop()) |
| 830 scaledTop = scrollToOptions.top() * rend->style()->effectiveZoom(); |
| 831 // FIXME: Use scrollBehavior to decide whether to scroll smoothly or ins
tantly. |
| 832 rend->scrollToOffset(DoubleSize(scaledLeft, scaledTop)); |
| 833 } |
| 834 } |
| 835 |
| 836 void Element::scrollFrameBy(const ScrollToOptions& scrollToOptions) |
| 837 { |
| 838 double left = scrollToOptions.hasLeft() ? scrollToOptions.left() : 0.0; |
| 839 double top = scrollToOptions.hasTop() ? scrollToOptions.top() : 0.0; |
| 840 if (std::isnan(left) || std::isnan(top)) |
| 841 return; |
| 842 |
| 843 ScrollBehavior scrollBehavior = ScrollBehaviorAuto; |
| 844 ScrollableArea::scrollBehaviorFromString(scrollToOptions.behavior(), scrollB
ehavior); |
| 845 LocalFrame* frame = document().frame(); |
| 846 if (!frame) |
| 847 return; |
| 848 FrameView* view = frame->view(); |
| 849 if (!view) |
| 850 return; |
| 851 |
| 852 double newScaledLeft = left * frame->pageZoomFactor() + view->scrollX(); |
| 853 double newScaledTop = top * frame->pageZoomFactor() + view->scrollY(); |
| 854 view->setScrollPosition(DoublePoint(newScaledLeft, newScaledTop), scrollBeha
vior); |
| 855 } |
| 856 |
| 857 void Element::scrollFrameTo(const ScrollToOptions& scrollToOptions) |
| 858 { |
| 859 double left = scrollToOptions.hasLeft() ? scrollToOptions.left() : 0.0; |
| 860 double top = scrollToOptions.hasTop() ? scrollToOptions.top() : 0.0; |
| 861 if (std::isnan(left) || std::isnan(top)) |
| 862 return; |
| 863 |
| 864 ScrollBehavior scrollBehavior = ScrollBehaviorAuto; |
| 865 ScrollableArea::scrollBehaviorFromString(scrollToOptions.behavior(), scrollB
ehavior); |
| 866 LocalFrame* frame = document().frame(); |
| 867 if (!frame) |
| 868 return; |
| 869 FrameView* view = frame->view(); |
| 870 if (!view) |
| 871 return; |
| 872 |
| 873 double scaledLeft = view->scrollX(); |
| 874 double scaledTop = view->scrollY(); |
| 875 if (scrollToOptions.hasLeft()) |
| 876 scaledLeft = scrollToOptions.left() * frame->pageZoomFactor(); |
| 877 if (scrollToOptions.hasTop()) |
| 878 scaledTop = scrollToOptions.top() * frame->pageZoomFactor(); |
| 879 view->setScrollPosition(DoublePoint(scaledLeft, scaledTop), scrollBehavior); |
| 880 } |
| 881 |
| 783 IntRect Element::boundsInRootViewSpace() | 882 IntRect Element::boundsInRootViewSpace() |
| 784 { | 883 { |
| 785 document().updateLayoutIgnorePendingStylesheets(); | 884 document().updateLayoutIgnorePendingStylesheets(); |
| 786 | 885 |
| 787 FrameView* view = document().view(); | 886 FrameView* view = document().view(); |
| 788 if (!view) | 887 if (!view) |
| 789 return IntRect(); | 888 return IntRect(); |
| 790 | 889 |
| 791 Vector<FloatQuad> quads; | 890 Vector<FloatQuad> quads; |
| 792 if (isSVGElement() && renderer()) { | 891 if (isSVGElement() && renderer()) { |
| (...skipping 2514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3307 return wrapper; | 3406 return wrapper; |
| 3308 | 3407 |
| 3309 CustomElementBinding* binding = perContextData->customElementBinding(customE
lementDefinition()); | 3408 CustomElementBinding* binding = perContextData->customElementBinding(customE
lementDefinition()); |
| 3310 | 3409 |
| 3311 wrapper->SetPrototype(binding->prototype()); | 3410 wrapper->SetPrototype(binding->prototype()); |
| 3312 | 3411 |
| 3313 return V8DOMWrapper::associateObjectWithWrapper(isolate, this, wrapperType,
wrapper); | 3412 return V8DOMWrapper::associateObjectWithWrapper(isolate, this, wrapperType,
wrapper); |
| 3314 } | 3413 } |
| 3315 | 3414 |
| 3316 } // namespace blink | 3415 } // namespace blink |
| OLD | NEW |