Chromium Code Reviews| Index: Source/core/page/FrameView.cpp |
| diff --git a/Source/core/page/FrameView.cpp b/Source/core/page/FrameView.cpp |
| index a369ca46cebbc67fa6798531fedb145f5e0c648e..f7d5d41b8d1afe413268633602238af08f70116d 100644 |
| --- a/Source/core/page/FrameView.cpp |
| +++ b/Source/core/page/FrameView.cpp |
| @@ -222,6 +222,9 @@ PassRefPtr<FrameView> FrameView::create(Frame* frame, const IntSize& initialSize |
| FrameView::~FrameView() |
| { |
| + // Avoid scrollbar updates during destruction. |
| + setProhibitsScrolling(true); |
| + |
| if (m_postLayoutTasksTimer.isActive()) { |
| m_postLayoutTasksTimer.stop(); |
| m_actionScheduler->clear(); |
| @@ -502,17 +505,6 @@ void FrameView::setCanHaveScrollbars(bool canHaveScrollbars) |
| ScrollView::setCanHaveScrollbars(canHaveScrollbars); |
| } |
| -void FrameView::updateCanHaveScrollbars() |
| -{ |
| - ScrollbarMode hMode; |
| - ScrollbarMode vMode; |
| - scrollbarModes(hMode, vMode); |
| - if (hMode == ScrollbarAlwaysOff && vMode == ScrollbarAlwaysOff) |
| - setCanHaveScrollbars(false); |
| - else |
| - setCanHaveScrollbars(true); |
| -} |
| - |
| PassRefPtr<Scrollbar> FrameView::createScrollbar(ScrollbarOrientation orientation) |
| { |
| if (Settings* settings = m_frame->settings()) { |
| @@ -575,9 +567,20 @@ void FrameView::adjustViewSize() |
| ASSERT(m_frame->view() == this); |
| const IntRect rect = renderView->documentRect(); |
| - const IntSize& size = rect.size(); |
| + IntSize size = rect.size(); |
| + |
| + // For originally unscrollable content, may still allow scrolling in case that the page |
| + // is scaled up, but only allow scrolling around the layout size, not the whole content size. |
| + ScrollbarMode hMode; |
| + ScrollbarMode vMode; |
| + calculateScrollbarModesForLayout(hMode, vMode, RulesFromWebContent); |
| + if (hMode == ScrollbarAlwaysOff) |
| + size.setWidth(layoutWidth()); |
| + if (vMode == ScrollbarAlwaysOff) |
| + size.setHeight(layoutHeight()); |
|
Xianzhu
2013/05/03 20:52:41
Change 1: let contentsSize() be the layout size if
|
| + |
| ScrollView::setScrollOrigin(IntPoint(-rect.x(), -rect.y()), !m_frame->document()->printing(), size == contentsSize()); |
| - |
| + |
| setContentsSize(size); |
| } |
| @@ -673,7 +676,7 @@ void FrameView::calculateScrollbarModesForLayout(ScrollbarMode& hMode, Scrollbar |
| return; |
| } |
| - if (m_canHaveScrollbars || strategy == RulesFromWebContentOnly) { |
| + if (m_canHaveScrollbars || !(strategy & RulesFromClient)) { |
| hMode = ScrollbarAuto; |
| // Seamless documents begin with heights of 0; we special case that here |
| // to correctly render documents that don't need scrollbars. |
| @@ -681,10 +684,11 @@ void FrameView::calculateScrollbarModesForLayout(ScrollbarMode& hMode, Scrollbar |
| bool isSeamlessDocument = frame() && frame()->document() && frame()->document()->shouldDisplaySeamlesslyWithParent(); |
| vMode = (isSeamlessDocument && !fullVisibleSize.height()) ? ScrollbarAlwaysOff : ScrollbarAuto; |
| } else { |
| + // The client disallows scrolling of this frame. |
| hMode = ScrollbarAlwaysOff; |
| vMode = ScrollbarAlwaysOff; |
| } |
| - |
| + |
| if (!m_layoutRoot) { |
| Document* document = m_frame->document(); |
| Node* documentElement = document->documentElement(); |
| @@ -702,7 +706,18 @@ void FrameView::calculateScrollbarModesForLayout(ScrollbarMode& hMode, Scrollbar |
| } |
| } else if (rootRenderer) |
| applyOverflowToViewport(rootRenderer, hMode, vMode); |
| - } |
| + } |
| + |
| + if (visibleContentScaleFactor() > 1 && (strategy & RulesFromVisibleContentScaleFactor)) { |
| + // When the page is scaled up, for pages originally not allowed to scroll, |
| + // the viewport may become smaller than its originally not-scrollable contents. |
| + // Should allow scrolling to so that the user can pan around to see all the contents |
| + // when the page is not scaled. |
| + if (hMode == ScrollbarAlwaysOff) |
| + hMode = ScrollbarAuto; |
| + if (vMode == ScrollbarAlwaysOff) |
| + vMode = ScrollbarAuto; |
| + } |
|
Xianzhu
2013/05/03 20:52:41
Change 2: Allow scrolling of originally not-scroll
|
| } |
| void FrameView::updateCompositingLayersAfterStyleChange() |
| @@ -2610,6 +2625,7 @@ bool FrameView::isScrollable() |
| // 2) display:none or visibility:hidden set to self or inherited. |
| // 3) overflow{-x,-y}: hidden; |
| // 4) scrolling: no; |
| + // 5) visibleContentScaleFactor |
| // Covers #1 |
| IntSize contentsSize = this->contentsSize(); |
| @@ -2622,10 +2638,11 @@ bool FrameView::isScrollable() |
| if (owner && (!owner->renderer() || !owner->renderer()->visibleToHitTesting())) |
| return false; |
| - // Cover #3 and #4. |
| + // Cover #3, #4 and #5. |
| ScrollbarMode horizontalMode; |
| ScrollbarMode verticalMode; |
| - calculateScrollbarModesForLayout(horizontalMode, verticalMode, RulesFromWebContentOnly); |
| + calculateScrollbarModesForLayout(horizontalMode, verticalMode, |
| + static_cast<ScrollbarModesCalculationStrategy>(RulesFromWebContent | RulesFromVisibleContentScaleFactor)); |
|
Xianzhu
2013/05/03 20:52:41
This is not the key change, just to let isScrollab
|
| if (horizontalMode == ScrollbarAlwaysOff && verticalMode == ScrollbarAlwaysOff) |
| return false; |