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 * (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 document().updateLayoutIgnorePendingStylesheets(); | |
|
Ian Vollick
2014/12/08 16:35:23
Eventually, we'll want to process scrolls after co
ajuma
2014/12/08 18:34:13
No, there's nothing smooth-scroll specific that re
| |
| 753 | |
| 754 double left = scrollToOptions.hasLeft() ? scrollToOptions.left() : 0.0; | |
| 755 double top = scrollToOptions.hasTop() ? scrollToOptions.top() : 0.0; | |
| 756 if (std::isnan(left) || std::isnan(top)) | |
| 757 return; | |
| 758 | |
| 759 ScrollBehavior scrollBehavior = ScrollBehaviorAuto; | |
| 760 ScrollableArea::scrollBehaviorFromString(scrollToOptions.behavior(), scrollB ehavior); | |
| 761 | |
| 762 if (document().documentElement() != this) { | |
| 763 RenderBox* rend = renderBox(); | |
| 764 if (rend) { | |
| 765 double currentScaledLeft = rend->scrollLeft(); | |
| 766 double currentScaledTop = rend->scrollTop(); | |
| 767 double newScaledLeft = left * rend->style()->effectiveZoom() + curre ntScaledLeft; | |
| 768 double newScaledTop = top * rend->style()->effectiveZoom() + current ScaledTop; | |
| 769 // FIXME: Use scrollBehavior to decide whether to scroll smoothly or instantly. | |
| 770 rend->scrollToOffset(DoubleSize(newScaledLeft, newScaledTop)); | |
| 771 } | |
| 772 return; | |
| 773 } | |
| 774 | |
| 775 if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { | |
| 776 if (document().inQuirksMode()) | |
| 777 return; | |
| 778 | |
| 779 LocalFrame* frame = document().frame(); | |
| 780 if (!frame) | |
| 781 return; | |
| 782 FrameView* view = frame->view(); | |
| 783 if (!view) | |
| 784 return; | |
| 785 | |
| 786 double newScaledLeft = left * frame->pageZoomFactor() + view->scrollX(); | |
| 787 double newScaledTop = top * frame->pageZoomFactor() + view->scrollY(); | |
| 788 view->setScrollPosition(DoublePoint(newScaledLeft, newScaledTop), scroll Behavior); | |
| 789 } | |
| 790 } | |
| 791 | |
| 792 void Element::scrollTo(double x, double y) | |
| 793 { | |
| 794 ScrollToOptions scrollToOptions; | |
| 795 scrollToOptions.setLeft(x); | |
| 796 scrollToOptions.setTop(y); | |
| 797 scrollTo(scrollToOptions); | |
| 798 } | |
| 799 | |
| 800 void Element::scrollTo(const ScrollToOptions& scrollToOptions) | |
| 801 { | |
| 802 document().updateLayoutIgnorePendingStylesheets(); | |
| 803 if ((scrollToOptions.hasLeft() && std::isnan(scrollToOptions.left())) | |
| 804 || (scrollToOptions.hasTop() && std::isnan(scrollToOptions.top()))) | |
| 805 return; | |
| 806 | |
| 807 ScrollBehavior scrollBehavior = ScrollBehaviorAuto; | |
| 808 ScrollableArea::scrollBehaviorFromString(scrollToOptions.behavior(), scrollB ehavior); | |
| 809 | |
| 810 if (document().documentElement() != this) { | |
| 811 RenderBox* rend = renderBox(); | |
| 812 if (rend) { | |
| 813 double scaledLeft = rend->scrollLeft(); | |
| 814 double scaledTop = rend->scrollTop(); | |
| 815 if (scrollToOptions.hasLeft()) | |
| 816 scaledLeft = scrollToOptions.left() * rend->style()->effectiveZo om(); | |
| 817 if (scrollToOptions.hasTop()) | |
| 818 scaledTop = scrollToOptions.top() * rend->style()->effectiveZoom (); | |
| 819 // FIXME: Use scrollBehavior to decide whether to scroll smoothly or instantly. | |
| 820 rend->scrollToOffset(DoubleSize(scaledLeft, scaledTop)); | |
| 821 } | |
| 822 return; | |
| 823 } | |
| 824 | |
| 825 if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { | |
| 826 if (document().inQuirksMode()) | |
| 827 return; | |
| 828 | |
| 829 LocalFrame* frame = document().frame(); | |
| 830 if (!frame) | |
| 831 return; | |
| 832 FrameView* view = frame->view(); | |
| 833 if (!view) | |
| 834 return; | |
| 835 | |
| 836 double scaledLeft = view->scrollX(); | |
| 837 double scaledTop = view->scrollY(); | |
| 838 if (scrollToOptions.hasLeft()) | |
| 839 scaledLeft = scrollToOptions.left() * frame->pageZoomFactor(); | |
| 840 if (scrollToOptions.hasTop()) | |
| 841 scaledTop = scrollToOptions.top() * frame->pageZoomFactor(); | |
| 842 view->setScrollPosition(DoublePoint(scaledLeft, scaledTop), scrollBehavi or); | |
| 843 } | |
| 844 } | |
| 845 | |
| 783 IntRect Element::boundsInRootViewSpace() | 846 IntRect Element::boundsInRootViewSpace() |
| 784 { | 847 { |
| 785 document().updateLayoutIgnorePendingStylesheets(); | 848 document().updateLayoutIgnorePendingStylesheets(); |
| 786 | 849 |
| 787 FrameView* view = document().view(); | 850 FrameView* view = document().view(); |
| 788 if (!view) | 851 if (!view) |
| 789 return IntRect(); | 852 return IntRect(); |
| 790 | 853 |
| 791 Vector<FloatQuad> quads; | 854 Vector<FloatQuad> quads; |
| 792 if (isSVGElement() && renderer()) { | 855 if (isSVGElement() && renderer()) { |
| (...skipping 2514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3307 return wrapper; | 3370 return wrapper; |
| 3308 | 3371 |
| 3309 CustomElementBinding* binding = perContextData->customElementBinding(customE lementDefinition()); | 3372 CustomElementBinding* binding = perContextData->customElementBinding(customE lementDefinition()); |
| 3310 | 3373 |
| 3311 wrapper->SetPrototype(binding->prototype()); | 3374 wrapper->SetPrototype(binding->prototype()); |
| 3312 | 3375 |
| 3313 return V8DOMWrapper::associateObjectWithWrapper(isolate, this, wrapperType, wrapper); | 3376 return V8DOMWrapper::associateObjectWithWrapper(isolate, this, wrapperType, wrapper); |
| 3314 } | 3377 } |
| 3315 | 3378 |
| 3316 } // namespace blink | 3379 } // namespace blink |
| OLD | NEW |