| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> | 2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> |
| 3 * 1999 Lars Knoll <knoll@kde.org> | 3 * 1999 Lars Knoll <knoll@kde.org> |
| 4 * 1999 Antti Koivisto <koivisto@kde.org> | 4 * 1999 Antti Koivisto <koivisto@kde.org> |
| 5 * 2000 Dirk Mueller <mueller@kde.org> | 5 * 2000 Dirk Mueller <mueller@kde.org> |
| 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. |
| 7 * (C) 2006 Graham Dennis (graham.dennis@gmail.com) | 7 * (C) 2006 Graham Dennis (graham.dennis@gmail.com) |
| 8 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) | 8 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) |
| 9 * Copyright (C) 2009 Google Inc. All rights reserved. | 9 * Copyright (C) 2009 Google Inc. All rights reserved. |
| 10 * | 10 * |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 , m_isTransparent(false) | 106 , m_isTransparent(false) |
| 107 , m_baseBackgroundColor(Color::white) | 107 , m_baseBackgroundColor(Color::white) |
| 108 , m_mediaType("screen") | 108 , m_mediaType("screen") |
| 109 , m_overflowStatusDirty(true) | 109 , m_overflowStatusDirty(true) |
| 110 , m_viewportRenderer(0) | 110 , m_viewportRenderer(0) |
| 111 , m_wasScrolledByUser(false) | 111 , m_wasScrolledByUser(false) |
| 112 , m_inProgrammaticScroll(false) | 112 , m_inProgrammaticScroll(false) |
| 113 , m_safeToPropagateScrollToParent(true) | 113 , m_safeToPropagateScrollToParent(true) |
| 114 , m_isTrackingPaintInvalidations(false) | 114 , m_isTrackingPaintInvalidations(false) |
| 115 , m_scrollCorner(nullptr) | 115 , m_scrollCorner(nullptr) |
| 116 , m_shouldAutoSize(false) | |
| 117 , m_inAutoSize(false) | |
| 118 , m_didRunAutosize(false) | |
| 119 , m_hasSoftwareFilters(false) | 116 , m_hasSoftwareFilters(false) |
| 120 , m_visibleContentScaleFactor(1) | 117 , m_visibleContentScaleFactor(1) |
| 121 , m_inputEventsScaleFactorForEmulation(1) | 118 , m_inputEventsScaleFactorForEmulation(1) |
| 122 , m_layoutSizeFixedToFrameSize(true) | 119 , m_layoutSizeFixedToFrameSize(true) |
| 123 , m_didScrollTimer(this, &FrameView::didScrollTimerFired) | 120 , m_didScrollTimer(this, &FrameView::didScrollTimerFired) |
| 124 { | 121 { |
| 125 ASSERT(m_frame); | 122 ASSERT(m_frame); |
| 126 init(); | 123 init(); |
| 127 | 124 |
| 128 if (!m_frame->isMainFrame()) | 125 if (!m_frame->isMainFrame()) |
| (...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 851 if (body && body->renderer()) { | 848 if (body && body->renderer()) { |
| 852 if (isHTMLFrameSetElement(*body)) { | 849 if (isHTMLFrameSetElement(*body)) { |
| 853 body->renderer()->setChildNeedsLayout(); | 850 body->renderer()->setChildNeedsLayout(); |
| 854 } else if (isHTMLBodyElement(*body)) { | 851 } else if (isHTMLBodyElement(*body)) { |
| 855 if (!m_firstLayout && m_size.height() != layoutSize().height
() && body->renderer()->enclosingBox()->stretchesToViewport()) | 852 if (!m_firstLayout && m_size.height() != layoutSize().height
() && body->renderer()->enclosingBox()->stretchesToViewport()) |
| 856 body->renderer()->setChildNeedsLayout(); | 853 body->renderer()->setChildNeedsLayout(); |
| 857 } | 854 } |
| 858 } | 855 } |
| 859 } | 856 } |
| 860 updateCounters(); | 857 updateCounters(); |
| 861 autoSizeIfEnabled(); | 858 if (m_autoSizeInfo) |
| 859 m_autoSizeInfo->autoSizeIfNeeded(); |
| 862 | 860 |
| 863 ScrollbarMode hMode; | 861 ScrollbarMode hMode; |
| 864 ScrollbarMode vMode; | 862 ScrollbarMode vMode; |
| 865 calculateScrollbarModesForLayoutAndSetViewportRenderer(hMode, vMode); | 863 calculateScrollbarModesForLayoutAndSetViewportRenderer(hMode, vMode); |
| 866 | 864 |
| 867 if (!inSubtreeLayout) { | 865 if (!inSubtreeLayout) { |
| 868 // Now set our scrollbar state for the layout. | 866 // Now set our scrollbar state for the layout. |
| 869 ScrollbarMode currentHMode = horizontalScrollbarMode(); | 867 ScrollbarMode currentHMode = horizontalScrollbarMode(); |
| 870 ScrollbarMode currentVMode = verticalScrollbarMode(); | 868 ScrollbarMode currentVMode = verticalScrollbarMode(); |
| 871 | 869 |
| (...skipping 792 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1664 | 1662 |
| 1665 if (!useOverlayScrollbars) | 1663 if (!useOverlayScrollbars) |
| 1666 renderView()->compositor()->frameViewDidChangeSize(); | 1664 renderView()->compositor()->frameViewDidChangeSize(); |
| 1667 } | 1665 } |
| 1668 } | 1666 } |
| 1669 | 1667 |
| 1670 void FrameView::handleLoadCompleted() | 1668 void FrameView::handleLoadCompleted() |
| 1671 { | 1669 { |
| 1672 // Once loading has completed, allow autoSize one last opportunity to | 1670 // Once loading has completed, allow autoSize one last opportunity to |
| 1673 // reduce the size of the frame. | 1671 // reduce the size of the frame. |
| 1674 autoSizeIfEnabled(); | 1672 if (m_autoSizeInfo) |
| 1673 m_autoSizeInfo->autoSizeIfNeeded(); |
| 1675 } | 1674 } |
| 1676 | 1675 |
| 1677 void FrameView::scheduleRelayout() | 1676 void FrameView::scheduleRelayout() |
| 1678 { | 1677 { |
| 1679 ASSERT(m_frame->view() == this); | 1678 ASSERT(m_frame->view() == this); |
| 1680 | 1679 |
| 1681 if (isSubtreeLayout()) { | 1680 if (isSubtreeLayout()) { |
| 1682 m_layoutSubtreeRoot->markContainingBlocksForLayout(false); | 1681 m_layoutSubtreeRoot->markContainingBlocksForLayout(false); |
| 1683 m_layoutSubtreeRoot = 0; | 1682 m_layoutSubtreeRoot = 0; |
| 1684 } | 1683 } |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2021 return; | 2020 return; |
| 2022 | 2021 |
| 2023 for (RenderObject* renderer = view; renderer; renderer = renderer->nextInPre
Order()) { | 2022 for (RenderObject* renderer = view; renderer; renderer = renderer->nextInPre
Order()) { |
| 2024 if (!renderer->isCounter()) | 2023 if (!renderer->isCounter()) |
| 2025 continue; | 2024 continue; |
| 2026 | 2025 |
| 2027 toRenderCounter(renderer)->updateCounter(); | 2026 toRenderCounter(renderer)->updateCounter(); |
| 2028 } | 2027 } |
| 2029 } | 2028 } |
| 2030 | 2029 |
| 2031 void FrameView::autoSizeIfEnabled() | |
| 2032 { | |
| 2033 if (!m_shouldAutoSize) | |
| 2034 return; | |
| 2035 | |
| 2036 if (m_inAutoSize) | |
| 2037 return; | |
| 2038 | |
| 2039 TemporaryChange<bool> changeInAutoSize(m_inAutoSize, true); | |
| 2040 | |
| 2041 Document* document = frame().document(); | |
| 2042 if (!document || !document->isActive()) | |
| 2043 return; | |
| 2044 | |
| 2045 Element* documentElement = document->documentElement(); | |
| 2046 if (!documentElement) | |
| 2047 return; | |
| 2048 | |
| 2049 // If this is the first time we run autosize, start from small height and | |
| 2050 // allow it to grow. | |
| 2051 if (!m_didRunAutosize) | |
| 2052 resize(frameRect().width(), m_minAutoSize.height()); | |
| 2053 | |
| 2054 IntSize size = frameRect().size(); | |
| 2055 | |
| 2056 // Do the resizing twice. The first time is basically a rough calculation us
ing the preferred width | |
| 2057 // which may result in a height change during the second iteration. | |
| 2058 for (int i = 0; i < 2; i++) { | |
| 2059 // Update various sizes including contentsSize, scrollHeight, etc. | |
| 2060 document->updateLayoutIgnorePendingStylesheets(); | |
| 2061 | |
| 2062 RenderView* renderView = document->renderView(); | |
| 2063 if (!renderView) | |
| 2064 return; | |
| 2065 | |
| 2066 int width = renderView->minPreferredLogicalWidth(); | |
| 2067 | |
| 2068 RenderBox* documentRenderBox = documentElement->renderBox(); | |
| 2069 if (!documentRenderBox) | |
| 2070 return; | |
| 2071 | |
| 2072 int height = documentRenderBox->scrollHeight(); | |
| 2073 IntSize newSize(width, height); | |
| 2074 | |
| 2075 // Check to see if a scrollbar is needed for a given dimension and | |
| 2076 // if so, increase the other dimension to account for the scrollbar. | |
| 2077 // Since the dimensions are only for the view rectangle, once a | |
| 2078 // dimension exceeds the maximum, there is no need to increase it furthe
r. | |
| 2079 if (newSize.width() > m_maxAutoSize.width()) { | |
| 2080 RefPtr<Scrollbar> localHorizontalScrollbar = horizontalScrollbar(); | |
| 2081 if (!localHorizontalScrollbar) | |
| 2082 localHorizontalScrollbar = createScrollbar(HorizontalScrollbar); | |
| 2083 if (!localHorizontalScrollbar->isOverlayScrollbar()) | |
| 2084 newSize.setHeight(newSize.height() + localHorizontalScrollbar->h
eight()); | |
| 2085 | |
| 2086 // Don't bother checking for a vertical scrollbar because the width
is at | |
| 2087 // already greater the maximum. | |
| 2088 } else if (newSize.height() > m_maxAutoSize.height()) { | |
| 2089 RefPtr<Scrollbar> localVerticalScrollbar = verticalScrollbar(); | |
| 2090 if (!localVerticalScrollbar) | |
| 2091 localVerticalScrollbar = createScrollbar(VerticalScrollbar); | |
| 2092 if (!localVerticalScrollbar->isOverlayScrollbar()) | |
| 2093 newSize.setWidth(newSize.width() + localVerticalScrollbar->width
()); | |
| 2094 | |
| 2095 // Don't bother checking for a horizontal scrollbar because the heig
ht is | |
| 2096 // already greater the maximum. | |
| 2097 } | |
| 2098 | |
| 2099 // Ensure the size is at least the min bounds. | |
| 2100 newSize = newSize.expandedTo(m_minAutoSize); | |
| 2101 | |
| 2102 // Bound the dimensions by the max bounds and determine what scrollbars
to show. | |
| 2103 ScrollbarMode horizonalScrollbarMode = ScrollbarAlwaysOff; | |
| 2104 if (newSize.width() > m_maxAutoSize.width()) { | |
| 2105 newSize.setWidth(m_maxAutoSize.width()); | |
| 2106 horizonalScrollbarMode = ScrollbarAlwaysOn; | |
| 2107 } | |
| 2108 ScrollbarMode verticalScrollbarMode = ScrollbarAlwaysOff; | |
| 2109 if (newSize.height() > m_maxAutoSize.height()) { | |
| 2110 newSize.setHeight(m_maxAutoSize.height()); | |
| 2111 verticalScrollbarMode = ScrollbarAlwaysOn; | |
| 2112 } | |
| 2113 | |
| 2114 if (newSize == size) | |
| 2115 continue; | |
| 2116 | |
| 2117 // While loading only allow the size to increase (to avoid twitching dur
ing intermediate smaller states) | |
| 2118 // unless autoresize has just been turned on or the maximum size is smal
ler than the current size. | |
| 2119 if (m_didRunAutosize && size.height() <= m_maxAutoSize.height() && size.
width() <= m_maxAutoSize.width() | |
| 2120 && !m_frame->document()->loadEventFinished() && (newSize.height() <
size.height() || newSize.width() < size.width())) | |
| 2121 break; | |
| 2122 | |
| 2123 resize(newSize.width(), newSize.height()); | |
| 2124 // Force the scrollbar state to avoid the scrollbar code adding them and
causing them to be needed. For example, | |
| 2125 // a vertical scrollbar may cause text to wrap and thus increase the hei
ght (which is the only reason the scollbar is needed). | |
| 2126 setVerticalScrollbarLock(false); | |
| 2127 setHorizontalScrollbarLock(false); | |
| 2128 setScrollbarModes(horizonalScrollbarMode, verticalScrollbarMode, true, t
rue); | |
| 2129 } | |
| 2130 m_didRunAutosize = true; | |
| 2131 } | |
| 2132 | |
| 2133 void FrameView::updateOverflowStatus(bool horizontalOverflow, bool verticalOverf
low) | 2030 void FrameView::updateOverflowStatus(bool horizontalOverflow, bool verticalOverf
low) |
| 2134 { | 2031 { |
| 2135 if (!m_viewportRenderer) | 2032 if (!m_viewportRenderer) |
| 2136 return; | 2033 return; |
| 2137 | 2034 |
| 2138 if (m_overflowStatusDirty) { | 2035 if (m_overflowStatusDirty) { |
| 2139 m_horizontalOverflow = horizontalOverflow; | 2036 m_horizontalOverflow = horizontalOverflow; |
| 2140 m_verticalOverflow = verticalOverflow; | 2037 m_verticalOverflow = verticalOverflow; |
| 2141 m_overflowStatusDirty = false; | 2038 m_overflowStatusDirty = false; |
| 2142 return; | 2039 return; |
| (...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2734 lifecycle().advanceTo(DocumentLifecycle::PaintInvalidationClean); | 2631 lifecycle().advanceTo(DocumentLifecycle::PaintInvalidationClean); |
| 2735 | 2632 |
| 2736 for (Frame* child = m_frame->tree().firstChild(); child; child = child->tree
().nextSibling()) { | 2633 for (Frame* child = m_frame->tree().firstChild(); child; child = child->tree
().nextSibling()) { |
| 2737 if (!child->isLocalFrame()) | 2634 if (!child->isLocalFrame()) |
| 2738 continue; | 2635 continue; |
| 2739 | 2636 |
| 2740 toLocalFrame(child)->view()->invalidateTreeIfNeededRecursive(); | 2637 toLocalFrame(child)->view()->invalidateTreeIfNeededRecursive(); |
| 2741 } | 2638 } |
| 2742 } | 2639 } |
| 2743 | 2640 |
| 2744 void FrameView::enableAutoSizeMode(bool enable, const IntSize& minSize, const In
tSize& maxSize) | 2641 void FrameView::enableAutoSizeMode(const IntSize& minSize, const IntSize& maxSiz
e) |
| 2745 { | 2642 { |
| 2746 ASSERT(!enable || !minSize.isEmpty()); | 2643 if (!m_autoSizeInfo) |
| 2747 ASSERT(minSize.width() <= maxSize.width()); | 2644 m_autoSizeInfo = adoptPtr(new FrameViewAutoSizeInfo(this)); |
| 2748 ASSERT(minSize.height() <= maxSize.height()); | |
| 2749 | 2645 |
| 2750 if (m_shouldAutoSize == enable && m_minAutoSize == minSize && m_maxAutoSize
== maxSize) | 2646 m_autoSizeInfo->configureAutoSizeMode(minSize, maxSize); |
| 2751 return; | |
| 2752 | |
| 2753 | |
| 2754 m_shouldAutoSize = enable; | |
| 2755 m_minAutoSize = minSize; | |
| 2756 m_maxAutoSize = maxSize; | |
| 2757 m_didRunAutosize = false; | |
| 2758 | |
| 2759 setLayoutSizeFixedToFrameSize(enable); | |
| 2760 setNeedsLayout(); | |
| 2761 scheduleRelayout(); | |
| 2762 if (m_shouldAutoSize) | |
| 2763 return; | |
| 2764 | |
| 2765 // Since autosize mode forces the scrollbar mode, change them to being auto. | |
| 2766 setVerticalScrollbarLock(false); | |
| 2767 setHorizontalScrollbarLock(false); | |
| 2768 setScrollbarModes(ScrollbarAuto, ScrollbarAuto); | |
| 2769 } | 2647 } |
| 2770 | 2648 |
| 2771 void FrameView::forceLayout(bool allowSubtree) | 2649 void FrameView::forceLayout(bool allowSubtree) |
| 2772 { | 2650 { |
| 2773 layout(allowSubtree); | 2651 layout(allowSubtree); |
| 2774 } | 2652 } |
| 2775 | 2653 |
| 2776 void FrameView::forceLayoutForPagination(const FloatSize& pageSize, const FloatS
ize& originalPageSize, float maximumShrinkFactor) | 2654 void FrameView::forceLayoutForPagination(const FloatSize& pageSize, const FloatS
ize& originalPageSize, float maximumShrinkFactor) |
| 2777 { | 2655 { |
| 2778 // Dumping externalRepresentation(m_frame->renderer()).ascii() is a good tri
ck to see | 2656 // Dumping externalRepresentation(m_frame->renderer()).ascii() is a good tri
ck to see |
| (...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3131 void FrameView::willRemoveScrollbar(Scrollbar* scrollbar, ScrollbarOrientation o
rientation) | 3009 void FrameView::willRemoveScrollbar(Scrollbar* scrollbar, ScrollbarOrientation o
rientation) |
| 3132 { | 3010 { |
| 3133 ScrollableArea::willRemoveScrollbar(scrollbar, orientation); | 3011 ScrollableArea::willRemoveScrollbar(scrollbar, orientation); |
| 3134 if (AXObjectCache* cache = axObjectCache()) { | 3012 if (AXObjectCache* cache = axObjectCache()) { |
| 3135 cache->remove(scrollbar); | 3013 cache->remove(scrollbar); |
| 3136 cache->handleScrollbarUpdate(this); | 3014 cache->handleScrollbarUpdate(this); |
| 3137 } | 3015 } |
| 3138 } | 3016 } |
| 3139 | 3017 |
| 3140 } // namespace blink | 3018 } // namespace blink |
| OLD | NEW |