Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(110)

Unified Diff: third_party/WebKit/Source/core/layout/LayoutView.cpp

Issue 2900513002: Move CalculateScrollbarModes from FrameView to LayoutView. (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/LayoutView.cpp
diff --git a/third_party/WebKit/Source/core/layout/LayoutView.cpp b/third_party/WebKit/Source/core/layout/LayoutView.cpp
index 04fd60e700f29ea69fdc099b00fa0ec8a955305e..01a8f8a2bcca4daac1a422f9651c59e33518f5ae 100644
--- a/third_party/WebKit/Source/core/layout/LayoutView.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutView.cpp
@@ -37,6 +37,7 @@
#include "core/layout/api/LayoutPartItem.h"
#include "core/layout/api/LayoutViewItem.h"
#include "core/layout/compositing/PaintLayerCompositor.h"
+#include "core/layout/svg/LayoutSVGRoot.h"
#include "core/page/ChromeClient.h"
#include "core/page/Page.h"
#include "core/paint/PaintLayer.h"
@@ -643,6 +644,87 @@ LayoutRect LayoutView::OverflowClipRect(
return rect;
}
+void LayoutView::CalculateScrollbarModes(ScrollbarMode& h_mode,
+ ScrollbarMode& v_mode) const {
+#define RETURN_SCROLLBAR_MODE(mode) \
+ { \
+ h_mode = v_mode = mode; \
+ return; \
+ }
+
+ LocalFrame* frame = GetFrame();
+ if (!frame)
+ RETURN_SCROLLBAR_MODE(kScrollbarAlwaysOff);
+
+ if (FrameOwner* owner = frame->Owner()) {
+ // Setting scrolling="no" on an iframe element disables scrolling.
+ if (owner->ScrollingMode() == kScrollbarAlwaysOff)
+ RETURN_SCROLLBAR_MODE(kScrollbarAlwaysOff);
+ }
+
+ Document& document = GetDocument();
+ if (Node* body = document.body()) {
+ // Framesets can't scroll.
+ if (isHTMLFrameSetElement(body) && body->GetLayoutObject())
+ RETURN_SCROLLBAR_MODE(kScrollbarAlwaysOff);
+ }
+
+ if (FrameView* frameView = GetFrameView()) {
+ // Scrollbars can be disabled by FrameView::setCanHaveScrollbars.
+ if (!frameView->CanHaveScrollbars())
+ RETURN_SCROLLBAR_MODE(kScrollbarAlwaysOff);
+ }
+
+ Element* viewportDefiningElement = document.ViewportDefiningElement();
+ if (!viewportDefiningElement)
+ RETURN_SCROLLBAR_MODE(kScrollbarAuto);
+
+ LayoutObject* viewport = viewportDefiningElement->GetLayoutObject();
+ if (!viewport)
+ RETURN_SCROLLBAR_MODE(kScrollbarAuto);
+
+ const ComputedStyle* style = viewport->Style();
+ if (!style)
+ RETURN_SCROLLBAR_MODE(kScrollbarAuto);
+
+ if (viewport->IsSVGRoot()) {
+ // Don't allow overflow to affect <img> and css backgrounds
+ if (ToLayoutSVGRoot(viewport)->IsEmbeddedThroughSVGImage())
+ RETURN_SCROLLBAR_MODE(kScrollbarAuto);
+
+ // FIXME: evaluate if we can allow overflow for these cases too.
+ // Overflow is always hidden when stand-alone SVG documents are embedded.
+ if (ToLayoutSVGRoot(viewport)
+ ->IsEmbeddedThroughFrameContainingSVGDocument())
+ RETURN_SCROLLBAR_MODE(kScrollbarAlwaysOff);
+ }
+
+ h_mode = v_mode = kScrollbarAuto;
+
+ EOverflow overflow_x = style->OverflowX();
+ EOverflow overflow_y = style->OverflowY();
+
+ bool shouldIgnoreOverflowHidden = false;
+ if (Settings* settings = document.GetSettings()) {
+ if (settings->GetIgnoreMainFrameOverflowHiddenQuirk() &&
+ frame->IsMainFrame())
+ shouldIgnoreOverflowHidden = true;
+ }
+ if (!shouldIgnoreOverflowHidden) {
+ if (overflow_x == EOverflow::kHidden)
+ h_mode = kScrollbarAlwaysOff;
+ if (overflow_y == EOverflow::kHidden)
+ v_mode = kScrollbarAlwaysOff;
+ }
+
+ if (overflow_x == EOverflow::kScroll)
+ h_mode = kScrollbarAlwaysOn;
+ if (overflow_y == EOverflow::kScroll)
+ v_mode = kScrollbarAlwaysOn;
+
+#undef RETURN_SCROLLBAR_MODE
+}
+
IntRect LayoutView::DocumentRect() const {
LayoutRect overflow_rect(LayoutOverflowRect());
FlipForWritingMode(overflow_rect);

Powered by Google App Engine
This is Rietveld 408576698