| 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 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 | 98 |
| 99 if (didFullRepaint) { | 99 if (didFullRepaint) { |
| 100 flags &= ~RenderLayer::CheckForRepaint; | 100 flags &= ~RenderLayer::CheckForRepaint; |
| 101 flags |= RenderLayer::NeedsFullRepaintInBacking; | 101 flags |= RenderLayer::NeedsFullRepaintInBacking; |
| 102 } | 102 } |
| 103 if (isRelayoutingSubtree && layer->isPaginated()) | 103 if (isRelayoutingSubtree && layer->isPaginated()) |
| 104 flags |= RenderLayer::UpdatePagination; | 104 flags |= RenderLayer::UpdatePagination; |
| 105 return flags; | 105 return flags; |
| 106 } | 106 } |
| 107 | 107 |
| 108 Pagination::Mode paginationModeForRenderStyle(RenderStyle* style) | |
| 109 { | |
| 110 EOverflow overflow = style->overflowY(); | |
| 111 if (overflow != OPAGEDX && overflow != OPAGEDY) | |
| 112 return Pagination::Unpaginated; | |
| 113 | |
| 114 bool isHorizontalWritingMode = style->isHorizontalWritingMode(); | |
| 115 TextDirection textDirection = style->direction(); | |
| 116 WritingMode writingMode = style->writingMode(); | |
| 117 | |
| 118 // paged-x always corresponds to LeftToRightPaginated or RightToLeftPaginate
d. If the WritingMode | |
| 119 // is horizontal, then we use TextDirection to choose between those options.
If the WritingMode | |
| 120 // is vertical, then the direction of the verticality dictates the choice. | |
| 121 if (overflow == OPAGEDX) { | |
| 122 if ((isHorizontalWritingMode && textDirection == LTR) || writingMode ==
LeftToRightWritingMode) | |
| 123 return Pagination::LeftToRightPaginated; | |
| 124 return Pagination::RightToLeftPaginated; | |
| 125 } | |
| 126 | |
| 127 // paged-y always corresponds to TopToBottomPaginated or BottomToTopPaginate
d. If the WritingMode | |
| 128 // is horizontal, then the direction of the horizontality dictates the choic
e. If the WritingMode | |
| 129 // is vertical, then we use TextDirection to choose between those options. | |
| 130 if (writingMode == TopToBottomWritingMode || (!isHorizontalWritingMode && te
xtDirection == LTR)) | |
| 131 return Pagination::TopToBottomPaginated; | |
| 132 return Pagination::BottomToTopPaginated; | |
| 133 } | |
| 134 | |
| 135 FrameView::FrameView(Frame* frame) | 108 FrameView::FrameView(Frame* frame) |
| 136 : m_frame(frame) | 109 : m_frame(frame) |
| 137 , m_canHaveScrollbars(true) | 110 , m_canHaveScrollbars(true) |
| 138 , m_slowRepaintObjectCount(0) | 111 , m_slowRepaintObjectCount(0) |
| 139 , m_hasPendingLayout(false) | 112 , m_hasPendingLayout(false) |
| 140 , m_layoutSubtreeRoot(0) | 113 , m_layoutSubtreeRoot(0) |
| 141 , m_inSynchronousPostLayout(false) | 114 , m_inSynchronousPostLayout(false) |
| 142 , m_postLayoutTasksTimer(this, &FrameView::postLayoutTimerFired) | 115 , m_postLayoutTasksTimer(this, &FrameView::postLayoutTimerFired) |
| 143 , m_updateWidgetsTimer(this, &FrameView::updateWidgetsTimerFired) | 116 , m_updateWidgetsTimer(this, &FrameView::updateWidgetsTimerFired) |
| 144 , m_isTransparent(false) | 117 , m_isTransparent(false) |
| (...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 544 if (!ignoreOverflowHidden) | 517 if (!ignoreOverflowHidden) |
| 545 vMode = ScrollbarAlwaysOff; | 518 vMode = ScrollbarAlwaysOff; |
| 546 break; | 519 break; |
| 547 case OSCROLL: | 520 case OSCROLL: |
| 548 vMode = ScrollbarAlwaysOn; | 521 vMode = ScrollbarAlwaysOn; |
| 549 break; | 522 break; |
| 550 case OAUTO: | 523 case OAUTO: |
| 551 vMode = ScrollbarAuto; | 524 vMode = ScrollbarAuto; |
| 552 break; | 525 break; |
| 553 default: | 526 default: |
| 554 // Don't set it at all. Values of OPAGEDX and OPAGEDY are handled by
applyPaginationToViewPort(). | 527 // Don't set it at all. |
| 555 ; | 528 ; |
| 556 } | 529 } |
| 557 | 530 |
| 558 m_viewportRenderer = o; | 531 m_viewportRenderer = o; |
| 559 } | 532 } |
| 560 | 533 |
| 561 void FrameView::applyPaginationToViewport() | |
| 562 { | |
| 563 Document* document = m_frame->document(); | |
| 564 Node* documentElement = document->documentElement(); | |
| 565 RenderObject* documentRenderer = documentElement ? documentElement->renderer
() : 0; | |
| 566 RenderObject* documentOrBodyRenderer = documentRenderer; | |
| 567 Node* body = document->body(); | |
| 568 if (body && body->renderer()) { | |
| 569 if (body->hasTagName(bodyTag)) | |
| 570 documentOrBodyRenderer = documentRenderer->style()->overflowX() == O
VISIBLE && documentElement->hasTagName(htmlTag) ? body->renderer() : documentRen
derer; | |
| 571 } | |
| 572 | |
| 573 Pagination pagination; | |
| 574 | |
| 575 if (!documentOrBodyRenderer) { | |
| 576 setPagination(pagination); | |
| 577 return; | |
| 578 } | |
| 579 | |
| 580 EOverflow overflowY = documentOrBodyRenderer->style()->overflowY(); | |
| 581 if (overflowY == OPAGEDX || overflowY == OPAGEDY) { | |
| 582 pagination.mode = WebCore::paginationModeForRenderStyle(documentOrBodyRe
nderer->style()); | |
| 583 pagination.gap = static_cast<unsigned>(documentOrBodyRenderer->style()->
columnGap()); | |
| 584 } | |
| 585 | |
| 586 setPagination(pagination); | |
| 587 } | |
| 588 | |
| 589 void FrameView::calculateScrollbarModesForLayoutAndSetViewportRenderer(Scrollbar
Mode& hMode, ScrollbarMode& vMode, ScrollbarModesCalculationStrategy strategy) | 534 void FrameView::calculateScrollbarModesForLayoutAndSetViewportRenderer(Scrollbar
Mode& hMode, ScrollbarMode& vMode, ScrollbarModesCalculationStrategy strategy) |
| 590 { | 535 { |
| 591 m_viewportRenderer = 0; | 536 m_viewportRenderer = 0; |
| 592 | 537 |
| 593 const HTMLFrameOwnerElement* owner = m_frame->ownerElement(); | 538 const HTMLFrameOwnerElement* owner = m_frame->ownerElement(); |
| 594 if (owner && (owner->scrollingMode() == ScrollbarAlwaysOff)) { | 539 if (owner && (owner->scrollingMode() == ScrollbarAlwaysOff)) { |
| 595 hMode = ScrollbarAlwaysOff; | 540 hMode = ScrollbarAlwaysOff; |
| 596 vMode = ScrollbarAlwaysOff; | 541 vMode = ScrollbarAlwaysOff; |
| 597 return; | 542 return; |
| 598 } | 543 } |
| 599 | 544 |
| 600 if (m_canHaveScrollbars || strategy == RulesFromWebContentOnly) { | 545 if (m_canHaveScrollbars || strategy == RulesFromWebContentOnly) { |
| 601 hMode = ScrollbarAuto; | 546 hMode = ScrollbarAuto; |
| 602 vMode = ScrollbarAuto; | 547 vMode = ScrollbarAuto; |
| 603 } else { | 548 } else { |
| 604 hMode = ScrollbarAlwaysOff; | 549 hMode = ScrollbarAlwaysOff; |
| 605 vMode = ScrollbarAlwaysOff; | 550 vMode = ScrollbarAlwaysOff; |
| 606 } | 551 } |
| 607 | 552 |
| 608 if (!isSubtreeLayout()) { | 553 if (!isSubtreeLayout()) { |
| 609 Document* document = m_frame->document(); | 554 Document* document = m_frame->document(); |
| 610 Node* documentElement = document->documentElement(); | |
| 611 RenderObject* rootRenderer = documentElement ? documentElement->renderer
() : 0; | |
| 612 Node* body = document->body(); | 555 Node* body = document->body(); |
| 613 if (body && body->renderer()) { | 556 if (body && body->renderer() && body->hasTagName(framesetTag)) { |
| 614 if (body->hasTagName(framesetTag)) { | 557 vMode = ScrollbarAlwaysOff; |
| 615 vMode = ScrollbarAlwaysOff; | 558 hMode = ScrollbarAlwaysOff; |
| 616 hMode = ScrollbarAlwaysOff; | 559 } else if (Element* viewportElement = document->viewportDefiningElement(
)) { |
| 617 } else if (body->hasTagName(bodyTag)) { | 560 if (RenderObject* viewportRenderer = viewportElement->renderer()) { |
| 618 // It's sufficient to just check the X overflow, | 561 if (viewportRenderer->style()) |
| 619 // since it's illegal to have visible in only one direction. | 562 applyOverflowToViewportAndSetRenderer(viewportRenderer, hMod
e, vMode); |
| 620 RenderObject* o = rootRenderer->style()->overflowX() == OVISIBLE
&& document->documentElement()->hasTagName(htmlTag) ? body->renderer() : rootRe
nderer; | |
| 621 if (o->style()) | |
| 622 applyOverflowToViewportAndSetRenderer(o, hMode, vMode); | |
| 623 } | 563 } |
| 624 } else if (rootRenderer) { | |
| 625 applyOverflowToViewportAndSetRenderer(rootRenderer, hMode, vMode); | |
| 626 } | 564 } |
| 627 } | 565 } |
| 628 } | 566 } |
| 629 | 567 |
| 630 void FrameView::updateCompositingLayersAfterStyleChange() | 568 void FrameView::updateCompositingLayersAfterStyleChange() |
| 631 { | 569 { |
| 632 TRACE_EVENT0("webkit", "FrameView::updateCompositingLayersAfterStyleChange")
; | 570 TRACE_EVENT0("webkit", "FrameView::updateCompositingLayersAfterStyleChange")
; |
| 633 RenderView* renderView = this->renderView(); | 571 RenderView* renderView = this->renderView(); |
| 634 if (!renderView) | 572 if (!renderView) |
| 635 return; | 573 return; |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 797 document->styleResolverChanged(RecalcStyleDeferred); | 735 document->styleResolverChanged(RecalcStyleDeferred); |
| 798 document->mediaQueryAffectingValueChanged(); | 736 document->mediaQueryAffectingValueChanged(); |
| 799 | 737 |
| 800 // FIXME: This instrumentation event is not strictly accurate since cach
ed media query results | 738 // FIXME: This instrumentation event is not strictly accurate since cach
ed media query results |
| 801 // do not persist across StyleResolver rebuilds. | 739 // do not persist across StyleResolver rebuilds. |
| 802 InspectorInstrumentation::mediaQueryResultChanged(document); | 740 InspectorInstrumentation::mediaQueryResultChanged(document); |
| 803 } else { | 741 } else { |
| 804 document->evaluateMediaQueryList(); | 742 document->evaluateMediaQueryList(); |
| 805 } | 743 } |
| 806 | 744 |
| 807 // If there is any pagination to apply, it will affect the RenderView's styl
e, so we should | |
| 808 // take care of that now. | |
| 809 applyPaginationToViewport(); | |
| 810 | |
| 811 // Always ensure our style info is up-to-date. This can happen in situations
where | 745 // Always ensure our style info is up-to-date. This can happen in situations
where |
| 812 // the layout beats any sort of style recalc update that needs to occur. | 746 // the layout beats any sort of style recalc update that needs to occur. |
| 813 TemporaryChange<bool> changeDoingPreLayoutStyleUpdate(m_doingPreLayoutStyleU
pdate, true); | 747 TemporaryChange<bool> changeDoingPreLayoutStyleUpdate(m_doingPreLayoutStyleU
pdate, true); |
| 814 document->updateStyleIfNeeded(); | 748 document->updateStyleIfNeeded(); |
| 815 lifecycle().advanceTo(DocumentLifecycle::StyleClean); | 749 lifecycle().advanceTo(DocumentLifecycle::StyleClean); |
| 816 } | 750 } |
| 817 | 751 |
| 818 void FrameView::performLayout(RenderObject* rootForThisLayout, bool inSubtreeLay
out) | 752 void FrameView::performLayout(RenderObject* rootForThisLayout, bool inSubtreeLay
out) |
| 819 { | 753 { |
| 820 TRACE_EVENT0("webkit", "FrameView::performLayout"); | 754 TRACE_EVENT0("webkit", "FrameView::performLayout"); |
| (...skipping 1432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2253 m_horizontalOverflow = horizontalOverflow; | 2187 m_horizontalOverflow = horizontalOverflow; |
| 2254 m_verticalOverflow = verticalOverflow; | 2188 m_verticalOverflow = verticalOverflow; |
| 2255 | 2189 |
| 2256 RefPtr<OverflowEvent> event = OverflowEvent::create(horizontalOverflowCh
anged, horizontalOverflow, verticalOverflowChanged, verticalOverflow); | 2190 RefPtr<OverflowEvent> event = OverflowEvent::create(horizontalOverflowCh
anged, horizontalOverflow, verticalOverflowChanged, verticalOverflow); |
| 2257 event->setTarget(m_viewportRenderer->node()); | 2191 event->setTarget(m_viewportRenderer->node()); |
| 2258 m_frame->document()->enqueueAnimationFrameEvent(event.release()); | 2192 m_frame->document()->enqueueAnimationFrameEvent(event.release()); |
| 2259 } | 2193 } |
| 2260 | 2194 |
| 2261 } | 2195 } |
| 2262 | 2196 |
| 2263 void FrameView::setPagination(const Pagination& pagination) | |
| 2264 { | |
| 2265 if (m_pagination == pagination) | |
| 2266 return; | |
| 2267 | |
| 2268 m_pagination = pagination; | |
| 2269 m_frame->document()->styleResolverChanged(RecalcStyleDeferred); | |
| 2270 } | |
| 2271 | |
| 2272 IntRect FrameView::windowClipRect(bool clipToContents) const | 2197 IntRect FrameView::windowClipRect(bool clipToContents) const |
| 2273 { | 2198 { |
| 2274 ASSERT(m_frame->view() == this); | 2199 ASSERT(m_frame->view() == this); |
| 2275 | 2200 |
| 2276 if (paintsEntireContents()) | 2201 if (paintsEntireContents()) |
| 2277 return IntRect(IntPoint(), contentsSize()); | 2202 return IntRect(IntPoint(), contentsSize()); |
| 2278 | 2203 |
| 2279 // Set our clip rect to be our contents. | 2204 // Set our clip rect to be our contents. |
| 2280 IntRect clipRect = contentsToWindow(visibleContentRect(clipToContents ? Excl
udeScrollbars : IncludeScrollbars)); | 2205 IntRect clipRect = contentsToWindow(visibleContentRect(clipToContents ? Excl
udeScrollbars : IncludeScrollbars)); |
| 2281 if (!m_frame->ownerElement()) | 2206 if (!m_frame->ownerElement()) |
| (...skipping 956 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3238 void FrameView::willRemoveScrollbar(Scrollbar* scrollbar, ScrollbarOrientation o
rientation) | 3163 void FrameView::willRemoveScrollbar(Scrollbar* scrollbar, ScrollbarOrientation o
rientation) |
| 3239 { | 3164 { |
| 3240 ScrollableArea::willRemoveScrollbar(scrollbar, orientation); | 3165 ScrollableArea::willRemoveScrollbar(scrollbar, orientation); |
| 3241 if (AXObjectCache* cache = axObjectCache()) { | 3166 if (AXObjectCache* cache = axObjectCache()) { |
| 3242 cache->remove(scrollbar); | 3167 cache->remove(scrollbar); |
| 3243 cache->handleScrollbarUpdate(this); | 3168 cache->handleScrollbarUpdate(this); |
| 3244 } | 3169 } |
| 3245 } | 3170 } |
| 3246 | 3171 |
| 3247 } // namespace WebCore | 3172 } // namespace WebCore |
| OLD | NEW |