Chromium Code Reviews| 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 autoSizeInfo().autoSizeIfEnabled(); |
|
eseidel
2014/08/19 16:31:18
This caused us to allocate the AutosizeInfo. I wo
Shanmuga Pandi
2014/08/20 14:54:12
Done.
| |
| 862 | 859 |
| 863 ScrollbarMode hMode; | 860 ScrollbarMode hMode; |
| 864 ScrollbarMode vMode; | 861 ScrollbarMode vMode; |
| 865 calculateScrollbarModesForLayoutAndSetViewportRenderer(hMode, vMode); | 862 calculateScrollbarModesForLayoutAndSetViewportRenderer(hMode, vMode); |
| 866 | 863 |
| 867 if (!inSubtreeLayout) { | 864 if (!inSubtreeLayout) { |
| 868 // Now set our scrollbar state for the layout. | 865 // Now set our scrollbar state for the layout. |
| 869 ScrollbarMode currentHMode = horizontalScrollbarMode(); | 866 ScrollbarMode currentHMode = horizontalScrollbarMode(); |
| 870 ScrollbarMode currentVMode = verticalScrollbarMode(); | 867 ScrollbarMode currentVMode = verticalScrollbarMode(); |
| 871 | 868 |
| (...skipping 793 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1665 | 1662 |
| 1666 if (!useOverlayScrollbars) | 1663 if (!useOverlayScrollbars) |
| 1667 renderView()->compositor()->frameViewDidChangeSize(); | 1664 renderView()->compositor()->frameViewDidChangeSize(); |
| 1668 } | 1665 } |
| 1669 } | 1666 } |
| 1670 | 1667 |
| 1671 void FrameView::handleLoadCompleted() | 1668 void FrameView::handleLoadCompleted() |
| 1672 { | 1669 { |
| 1673 // Once loading has completed, allow autoSize one last opportunity to | 1670 // Once loading has completed, allow autoSize one last opportunity to |
| 1674 // reduce the size of the frame. | 1671 // reduce the size of the frame. |
| 1675 autoSizeIfEnabled(); | 1672 autoSizeInfo().autoSizeIfEnabled(); |
| 1676 } | 1673 } |
| 1677 | 1674 |
| 1678 void FrameView::scheduleRelayout() | 1675 void FrameView::scheduleRelayout() |
| 1679 { | 1676 { |
| 1680 ASSERT(m_frame->view() == this); | 1677 ASSERT(m_frame->view() == this); |
| 1681 | 1678 |
| 1682 if (isSubtreeLayout()) { | 1679 if (isSubtreeLayout()) { |
| 1683 m_layoutSubtreeRoot->markContainingBlocksForLayout(false); | 1680 m_layoutSubtreeRoot->markContainingBlocksForLayout(false); |
| 1684 m_layoutSubtreeRoot = 0; | 1681 m_layoutSubtreeRoot = 0; |
| 1685 } | 1682 } |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2022 return; | 2019 return; |
| 2023 | 2020 |
| 2024 for (RenderObject* renderer = view; renderer; renderer = renderer->nextInPre Order()) { | 2021 for (RenderObject* renderer = view; renderer; renderer = renderer->nextInPre Order()) { |
| 2025 if (!renderer->isCounter()) | 2022 if (!renderer->isCounter()) |
| 2026 continue; | 2023 continue; |
| 2027 | 2024 |
| 2028 toRenderCounter(renderer)->updateCounter(); | 2025 toRenderCounter(renderer)->updateCounter(); |
| 2029 } | 2026 } |
| 2030 } | 2027 } |
| 2031 | 2028 |
| 2032 void FrameView::autoSizeIfEnabled() | |
| 2033 { | |
| 2034 if (!m_shouldAutoSize) | |
| 2035 return; | |
| 2036 | |
| 2037 if (m_inAutoSize) | |
| 2038 return; | |
| 2039 | |
| 2040 TemporaryChange<bool> changeInAutoSize(m_inAutoSize, true); | |
| 2041 | |
| 2042 Document* document = frame().document(); | |
| 2043 if (!document || !document->isActive()) | |
| 2044 return; | |
| 2045 | |
| 2046 Element* documentElement = document->documentElement(); | |
| 2047 if (!documentElement) | |
| 2048 return; | |
| 2049 | |
| 2050 // If this is the first time we run autosize, start from small height and | |
| 2051 // allow it to grow. | |
| 2052 if (!m_didRunAutosize) | |
| 2053 resize(frameRect().width(), m_minAutoSize.height()); | |
| 2054 | |
| 2055 IntSize size = frameRect().size(); | |
| 2056 | |
| 2057 // Do the resizing twice. The first time is basically a rough calculation us ing the preferred width | |
| 2058 // which may result in a height change during the second iteration. | |
| 2059 for (int i = 0; i < 2; i++) { | |
| 2060 // Update various sizes including contentsSize, scrollHeight, etc. | |
| 2061 document->updateLayoutIgnorePendingStylesheets(); | |
| 2062 | |
| 2063 RenderView* renderView = document->renderView(); | |
| 2064 if (!renderView) | |
| 2065 return; | |
| 2066 | |
| 2067 int width = renderView->minPreferredLogicalWidth(); | |
| 2068 | |
| 2069 RenderBox* documentRenderBox = documentElement->renderBox(); | |
| 2070 if (!documentRenderBox) | |
| 2071 return; | |
| 2072 | |
| 2073 int height = documentRenderBox->scrollHeight(); | |
| 2074 IntSize newSize(width, height); | |
| 2075 | |
| 2076 // Check to see if a scrollbar is needed for a given dimension and | |
| 2077 // if so, increase the other dimension to account for the scrollbar. | |
| 2078 // Since the dimensions are only for the view rectangle, once a | |
| 2079 // dimension exceeds the maximum, there is no need to increase it furthe r. | |
| 2080 if (newSize.width() > m_maxAutoSize.width()) { | |
| 2081 RefPtr<Scrollbar> localHorizontalScrollbar = horizontalScrollbar(); | |
| 2082 if (!localHorizontalScrollbar) | |
| 2083 localHorizontalScrollbar = createScrollbar(HorizontalScrollbar); | |
| 2084 if (!localHorizontalScrollbar->isOverlayScrollbar()) | |
| 2085 newSize.setHeight(newSize.height() + localHorizontalScrollbar->h eight()); | |
| 2086 | |
| 2087 // Don't bother checking for a vertical scrollbar because the width is at | |
| 2088 // already greater the maximum. | |
| 2089 } else if (newSize.height() > m_maxAutoSize.height()) { | |
| 2090 RefPtr<Scrollbar> localVerticalScrollbar = verticalScrollbar(); | |
| 2091 if (!localVerticalScrollbar) | |
| 2092 localVerticalScrollbar = createScrollbar(VerticalScrollbar); | |
| 2093 if (!localVerticalScrollbar->isOverlayScrollbar()) | |
| 2094 newSize.setWidth(newSize.width() + localVerticalScrollbar->width ()); | |
| 2095 | |
| 2096 // Don't bother checking for a horizontal scrollbar because the heig ht is | |
| 2097 // already greater the maximum. | |
| 2098 } | |
| 2099 | |
| 2100 // Ensure the size is at least the min bounds. | |
| 2101 newSize = newSize.expandedTo(m_minAutoSize); | |
| 2102 | |
| 2103 // Bound the dimensions by the max bounds and determine what scrollbars to show. | |
| 2104 ScrollbarMode horizonalScrollbarMode = ScrollbarAlwaysOff; | |
| 2105 if (newSize.width() > m_maxAutoSize.width()) { | |
| 2106 newSize.setWidth(m_maxAutoSize.width()); | |
| 2107 horizonalScrollbarMode = ScrollbarAlwaysOn; | |
| 2108 } | |
| 2109 ScrollbarMode verticalScrollbarMode = ScrollbarAlwaysOff; | |
| 2110 if (newSize.height() > m_maxAutoSize.height()) { | |
| 2111 newSize.setHeight(m_maxAutoSize.height()); | |
| 2112 verticalScrollbarMode = ScrollbarAlwaysOn; | |
| 2113 } | |
| 2114 | |
| 2115 if (newSize == size) | |
| 2116 continue; | |
| 2117 | |
| 2118 // While loading only allow the size to increase (to avoid twitching dur ing intermediate smaller states) | |
| 2119 // unless autoresize has just been turned on or the maximum size is smal ler than the current size. | |
| 2120 if (m_didRunAutosize && size.height() <= m_maxAutoSize.height() && size. width() <= m_maxAutoSize.width() | |
| 2121 && !m_frame->document()->loadEventFinished() && (newSize.height() < size.height() || newSize.width() < size.width())) | |
| 2122 break; | |
| 2123 | |
| 2124 resize(newSize.width(), newSize.height()); | |
| 2125 // Force the scrollbar state to avoid the scrollbar code adding them and causing them to be needed. For example, | |
| 2126 // a vertical scrollbar may cause text to wrap and thus increase the hei ght (which is the only reason the scollbar is needed). | |
| 2127 setVerticalScrollbarLock(false); | |
| 2128 setHorizontalScrollbarLock(false); | |
| 2129 setScrollbarModes(horizonalScrollbarMode, verticalScrollbarMode, true, t rue); | |
| 2130 } | |
| 2131 m_didRunAutosize = true; | |
| 2132 } | |
| 2133 | |
| 2134 void FrameView::updateOverflowStatus(bool horizontalOverflow, bool verticalOverf low) | 2029 void FrameView::updateOverflowStatus(bool horizontalOverflow, bool verticalOverf low) |
| 2135 { | 2030 { |
| 2136 if (!m_viewportRenderer) | 2031 if (!m_viewportRenderer) |
| 2137 return; | 2032 return; |
| 2138 | 2033 |
| 2139 if (m_overflowStatusDirty) { | 2034 if (m_overflowStatusDirty) { |
| 2140 m_horizontalOverflow = horizontalOverflow; | 2035 m_horizontalOverflow = horizontalOverflow; |
| 2141 m_verticalOverflow = verticalOverflow; | 2036 m_verticalOverflow = verticalOverflow; |
| 2142 m_overflowStatusDirty = false; | 2037 m_overflowStatusDirty = false; |
| 2143 return; | 2038 return; |
| (...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2736 lifecycle().advanceTo(DocumentLifecycle::PaintInvalidationClean); | 2631 lifecycle().advanceTo(DocumentLifecycle::PaintInvalidationClean); |
| 2737 | 2632 |
| 2738 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()) { |
| 2739 if (!child->isLocalFrame()) | 2634 if (!child->isLocalFrame()) |
| 2740 continue; | 2635 continue; |
| 2741 | 2636 |
| 2742 toLocalFrame(child)->view()->invalidateTreeIfNeededRecursive(); | 2637 toLocalFrame(child)->view()->invalidateTreeIfNeededRecursive(); |
| 2743 } | 2638 } |
| 2744 } | 2639 } |
| 2745 | 2640 |
| 2746 void FrameView::enableAutoSizeMode(bool enable, const IntSize& minSize, const In tSize& maxSize) | 2641 void FrameView::enableAutoSizeMode(bool enable, const IntSize& minSize, const In tSize& maxSize) |
|
eseidel
2014/08/19 16:35:00
I suspect we want to split enableAutoSizeMode out
Shanmuga Pandi
2014/08/20 14:54:12
Done.
| |
| 2747 { | 2642 { |
| 2748 ASSERT(!enable || !minSize.isEmpty()); | 2643 autoSizeInfo().enableAutoSizeMode(enable, minSize, maxSize); |
| 2749 ASSERT(minSize.width() <= maxSize.width()); | |
| 2750 ASSERT(minSize.height() <= maxSize.height()); | |
| 2751 | |
| 2752 if (m_shouldAutoSize == enable && m_minAutoSize == minSize && m_maxAutoSize == maxSize) | |
| 2753 return; | |
| 2754 | |
| 2755 | |
| 2756 m_shouldAutoSize = enable; | |
| 2757 m_minAutoSize = minSize; | |
| 2758 m_maxAutoSize = maxSize; | |
| 2759 m_didRunAutosize = false; | |
| 2760 | |
| 2761 setLayoutSizeFixedToFrameSize(enable); | |
| 2762 setNeedsLayout(); | |
| 2763 scheduleRelayout(); | |
| 2764 if (m_shouldAutoSize) | |
| 2765 return; | |
| 2766 | |
| 2767 // Since autosize mode forces the scrollbar mode, change them to being auto. | |
| 2768 setVerticalScrollbarLock(false); | |
| 2769 setHorizontalScrollbarLock(false); | |
| 2770 setScrollbarModes(ScrollbarAuto, ScrollbarAuto); | |
| 2771 } | 2644 } |
| 2772 | 2645 |
| 2773 void FrameView::forceLayout(bool allowSubtree) | 2646 void FrameView::forceLayout(bool allowSubtree) |
| 2774 { | 2647 { |
| 2775 layout(allowSubtree); | 2648 layout(allowSubtree); |
| 2776 } | 2649 } |
| 2777 | 2650 |
| 2778 void FrameView::forceLayoutForPagination(const FloatSize& pageSize, const FloatS ize& originalPageSize, float maximumShrinkFactor) | 2651 void FrameView::forceLayoutForPagination(const FloatSize& pageSize, const FloatS ize& originalPageSize, float maximumShrinkFactor) |
| 2779 { | 2652 { |
| 2780 // Dumping externalRepresentation(m_frame->renderer()).ascii() is a good tri ck to see | 2653 // 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... | |
| 3133 void FrameView::willRemoveScrollbar(Scrollbar* scrollbar, ScrollbarOrientation o rientation) | 3006 void FrameView::willRemoveScrollbar(Scrollbar* scrollbar, ScrollbarOrientation o rientation) |
| 3134 { | 3007 { |
| 3135 ScrollableArea::willRemoveScrollbar(scrollbar, orientation); | 3008 ScrollableArea::willRemoveScrollbar(scrollbar, orientation); |
| 3136 if (AXObjectCache* cache = axObjectCache()) { | 3009 if (AXObjectCache* cache = axObjectCache()) { |
| 3137 cache->remove(scrollbar); | 3010 cache->remove(scrollbar); |
| 3138 cache->handleScrollbarUpdate(this); | 3011 cache->handleScrollbarUpdate(this); |
| 3139 } | 3012 } |
| 3140 } | 3013 } |
| 3141 | 3014 |
| 3142 } // namespace blink | 3015 } // namespace blink |
| OLD | NEW |