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 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
99 | 99 |
100 if (didFullRepaint) { | 100 if (didFullRepaint) { |
101 flags &= ~RenderLayer::CheckForRepaint; | 101 flags &= ~RenderLayer::CheckForRepaint; |
102 flags |= RenderLayer::NeedsFullRepaintInBacking; | 102 flags |= RenderLayer::NeedsFullRepaintInBacking; |
103 } | 103 } |
104 if (isRelayoutingSubtree && layer->isPaginated()) | 104 if (isRelayoutingSubtree && layer->isPaginated()) |
105 flags |= RenderLayer::UpdatePagination; | 105 flags |= RenderLayer::UpdatePagination; |
106 return flags; | 106 return flags; |
107 } | 107 } |
108 | 108 |
109 Pagination::Mode paginationModeForRenderStyle(RenderStyle* style) | |
110 { | |
111 EOverflow overflow = style->overflowY(); | |
112 if (overflow != OPAGEDX && overflow != OPAGEDY) | |
113 return Pagination::Unpaginated; | |
114 | |
115 bool isHorizontalWritingMode = style->isHorizontalWritingMode(); | |
116 TextDirection textDirection = style->direction(); | |
117 WritingMode writingMode = style->writingMode(); | |
118 | |
119 // paged-x always corresponds to LeftToRightPaginated or RightToLeftPaginate d. If the WritingMode | |
120 // is horizontal, then we use TextDirection to choose between those options. If the WritingMode | |
121 // is vertical, then the direction of the verticality dictates the choice. | |
122 if (overflow == OPAGEDX) { | |
123 if ((isHorizontalWritingMode && textDirection == LTR) || writingMode == LeftToRightWritingMode) | |
124 return Pagination::LeftToRightPaginated; | |
125 return Pagination::RightToLeftPaginated; | |
126 } | |
127 | |
128 // paged-y always corresponds to TopToBottomPaginated or BottomToTopPaginate d. If the WritingMode | |
129 // is horizontal, then the direction of the horizontality dictates the choic e. If the WritingMode | |
130 // is vertical, then we use TextDirection to choose between those options. | |
131 if (writingMode == TopToBottomWritingMode || (!isHorizontalWritingMode && te xtDirection == LTR)) | |
132 return Pagination::TopToBottomPaginated; | |
133 return Pagination::BottomToTopPaginated; | |
134 } | |
135 | |
136 FrameView::FrameView(Frame* frame) | 109 FrameView::FrameView(Frame* frame) |
137 : m_frame(frame) | 110 : m_frame(frame) |
138 , m_canHaveScrollbars(true) | 111 , m_canHaveScrollbars(true) |
139 , m_slowRepaintObjectCount(0) | 112 , m_slowRepaintObjectCount(0) |
140 , m_hasPendingLayout(false) | 113 , m_hasPendingLayout(false) |
141 , m_layoutSubtreeRoot(0) | 114 , m_layoutSubtreeRoot(0) |
142 , m_inSynchronousPostLayout(false) | 115 , m_inSynchronousPostLayout(false) |
143 , m_postLayoutTasksTimer(this, &FrameView::postLayoutTimerFired) | 116 , m_postLayoutTasksTimer(this, &FrameView::postLayoutTimerFired) |
144 , m_updateWidgetsTimer(this, &FrameView::updateWidgetsTimerFired) | 117 , m_updateWidgetsTimer(this, &FrameView::updateWidgetsTimerFired) |
145 , m_isTransparent(false) | 118 , m_isTransparent(false) |
(...skipping 398 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* o = viewportElement->renderer()) { |
ojan
2014/02/08 01:40:19
Nit: while you're in this code, s/o/viewportRender
mstensho (USE GERRIT)
2014/02/11 10:44:14
Done.
| |
618 // It's sufficient to just check the X overflow, | |
619 // since it's illegal to have visible in only one direction. | |
620 RenderObject* o = rootRenderer->style()->overflowX() == OVISIBLE && document->documentElement()->hasTagName(htmlTag) ? body->renderer() : rootRe nderer; | |
621 if (o->style()) | 561 if (o->style()) |
622 applyOverflowToViewportAndSetRenderer(o, hMode, vMode); | 562 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 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
796 document->styleResolverChanged(RecalcStyleDeferred); | 734 document->styleResolverChanged(RecalcStyleDeferred); |
797 document->mediaQueryAffectingValueChanged(); | 735 document->mediaQueryAffectingValueChanged(); |
798 | 736 |
799 // FIXME: This instrumentation event is not strictly accurate since cach ed media query results | 737 // FIXME: This instrumentation event is not strictly accurate since cach ed media query results |
800 // do not persist across StyleResolver rebuilds. | 738 // do not persist across StyleResolver rebuilds. |
801 InspectorInstrumentation::mediaQueryResultChanged(document); | 739 InspectorInstrumentation::mediaQueryResultChanged(document); |
802 } else { | 740 } else { |
803 document->evaluateMediaQueryList(); | 741 document->evaluateMediaQueryList(); |
804 } | 742 } |
805 | 743 |
806 // If there is any pagination to apply, it will affect the RenderView's styl e, so we should | |
807 // take care of that now. | |
808 applyPaginationToViewport(); | |
809 | |
810 // Always ensure our style info is up-to-date. This can happen in situations where | 744 // Always ensure our style info is up-to-date. This can happen in situations where |
811 // the layout beats any sort of style recalc update that needs to occur. | 745 // the layout beats any sort of style recalc update that needs to occur. |
812 TemporaryChange<bool> changeDoingPreLayoutStyleUpdate(m_doingPreLayoutStyleU pdate, true); | 746 TemporaryChange<bool> changeDoingPreLayoutStyleUpdate(m_doingPreLayoutStyleU pdate, true); |
813 document->updateStyleIfNeeded(); | 747 document->updateStyleIfNeeded(); |
814 } | 748 } |
815 | 749 |
816 void FrameView::performLayout(RenderObject* rootForThisLayout, bool inSubtreeLay out) | 750 void FrameView::performLayout(RenderObject* rootForThisLayout, bool inSubtreeLay out) |
817 { | 751 { |
818 ASSERT(!m_inPerformLayout); | 752 ASSERT(!m_inPerformLayout); |
819 | 753 |
(...skipping 1414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2234 m_horizontalOverflow = horizontalOverflow; | 2168 m_horizontalOverflow = horizontalOverflow; |
2235 m_verticalOverflow = verticalOverflow; | 2169 m_verticalOverflow = verticalOverflow; |
2236 | 2170 |
2237 RefPtr<OverflowEvent> event = OverflowEvent::create(horizontalOverflowCh anged, horizontalOverflow, verticalOverflowChanged, verticalOverflow); | 2171 RefPtr<OverflowEvent> event = OverflowEvent::create(horizontalOverflowCh anged, horizontalOverflow, verticalOverflowChanged, verticalOverflow); |
2238 event->setTarget(m_viewportRenderer->node()); | 2172 event->setTarget(m_viewportRenderer->node()); |
2239 m_frame->document()->enqueueAnimationFrameEvent(event.release()); | 2173 m_frame->document()->enqueueAnimationFrameEvent(event.release()); |
2240 } | 2174 } |
2241 | 2175 |
2242 } | 2176 } |
2243 | 2177 |
2244 void FrameView::setPagination(const Pagination& pagination) | |
2245 { | |
2246 if (m_pagination == pagination) | |
2247 return; | |
2248 | |
2249 m_pagination = pagination; | |
2250 m_frame->document()->styleResolverChanged(RecalcStyleDeferred); | |
2251 } | |
2252 | |
2253 IntRect FrameView::windowClipRect(bool clipToContents) const | 2178 IntRect FrameView::windowClipRect(bool clipToContents) const |
2254 { | 2179 { |
2255 ASSERT(m_frame->view() == this); | 2180 ASSERT(m_frame->view() == this); |
2256 | 2181 |
2257 if (paintsEntireContents()) | 2182 if (paintsEntireContents()) |
2258 return IntRect(IntPoint(), contentsSize()); | 2183 return IntRect(IntPoint(), contentsSize()); |
2259 | 2184 |
2260 // Set our clip rect to be our contents. | 2185 // Set our clip rect to be our contents. |
2261 IntRect clipRect = contentsToWindow(visibleContentRect(clipToContents ? Excl udeScrollbars : IncludeScrollbars)); | 2186 IntRect clipRect = contentsToWindow(visibleContentRect(clipToContents ? Excl udeScrollbars : IncludeScrollbars)); |
2262 if (!m_frame->ownerElement()) | 2187 if (!m_frame->ownerElement()) |
(...skipping 956 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3219 void FrameView::willRemoveScrollbar(Scrollbar* scrollbar, ScrollbarOrientation o rientation) | 3144 void FrameView::willRemoveScrollbar(Scrollbar* scrollbar, ScrollbarOrientation o rientation) |
3220 { | 3145 { |
3221 ScrollableArea::willRemoveScrollbar(scrollbar, orientation); | 3146 ScrollableArea::willRemoveScrollbar(scrollbar, orientation); |
3222 if (AXObjectCache* cache = axObjectCache()) { | 3147 if (AXObjectCache* cache = axObjectCache()) { |
3223 cache->remove(scrollbar); | 3148 cache->remove(scrollbar); |
3224 cache->handleScrollbarUpdate(this); | 3149 cache->handleScrollbarUpdate(this); |
3225 } | 3150 } |
3226 } | 3151 } |
3227 | 3152 |
3228 } // namespace WebCore | 3153 } // namespace WebCore |
OLD | NEW |