Index: third_party/WebKit/Source/core/paint/ScrollbarManager.cpp |
diff --git a/third_party/WebKit/Source/core/paint/ScrollbarManager.cpp b/third_party/WebKit/Source/core/paint/ScrollbarManager.cpp |
index 4b270c2fdc07abcc787922c4bb576e195c49fb24..efc464becca6ab2a34e31839962c8b5ddf288d13 100644 |
--- a/third_party/WebKit/Source/core/paint/ScrollbarManager.cpp |
+++ b/third_party/WebKit/Source/core/paint/ScrollbarManager.cpp |
@@ -4,6 +4,16 @@ |
#include "core/paint/ScrollbarManager.h" |
+#include "core/frame/LocalFrame.h" |
+#include "core/frame/LocalFrameView.h" |
+#include "core/layout/LayoutBox.h" |
+#include "core/layout/LayoutObject.h" |
+#include "core/layout/LayoutScrollbar.h" |
+#include "core/layout/LayoutTheme.h" |
+#include "core/page/ChromeClient.h" |
+#include "core/page/Page.h" |
+#include "core/paint/PaintLayerScrollableArea.h" |
+ |
namespace blink { |
ScrollbarManager::ScrollbarManager(ScrollableArea& scrollable_area) |
@@ -23,4 +33,59 @@ void ScrollbarManager::Dispose() { |
DestroyScrollbar(kVerticalScrollbar); |
} |
+Scrollbar* ScrollbarManager::CreateScrollbar(ScrollbarOrientation orientation) { |
+ DCHECK(scrollable_area_->GetLayoutBox()); |
+ DCHECK(orientation == kHorizontalScrollbar ? !h_bar_is_attached_ |
+ : !v_bar_is_attached_); |
+ LayoutObject* layout_object_for_style = |
+ scrollable_area_->LayoutObjectForScrollbarStyle(); |
+ |
+ Scrollbar* scrollbar = nullptr; |
+ if (layout_object_for_style && |
+ layout_object_for_style->HasCustomScrollbarStyle()) { |
+ DCHECK(!layout_object_for_style->IsLayoutView()); |
+ scrollbar = LayoutScrollbar::CreateCustomScrollbar( |
+ scrollable_area_.Get(), orientation, |
+ ToElement(layout_object_for_style->GetNode())); |
+ } else { |
+ ScrollbarControlSize scrollbar_size = kRegularScrollbar; |
+ |
+ if (layout_object_for_style && |
+ layout_object_for_style->StyleRef().HasAppearance() && |
+ scrollable_area_->IsPaintLayerScrollableArea()) { |
+ scrollbar_size = LayoutTheme::GetTheme().ScrollbarControlSizeForPart( |
+ layout_object_for_style->StyleRef().Appearance()); |
+ } |
+ |
+ scrollbar = |
+ Scrollbar::Create(scrollable_area_.Get(), orientation, scrollbar_size, |
+ &scrollable_area_->GetLayoutBox() |
+ ->GetFrame() |
+ ->GetPage() |
+ ->GetChromeClient()); |
+ } |
+ |
+ scrollable_area_->GetLayoutBox()->GetDocument().View()->AddScrollbar( |
+ scrollbar); |
+ |
+ return scrollbar; |
+} |
+ |
+void ScrollbarManager::DestroyScrollbar(ScrollbarOrientation orientation) { |
+ Member<Scrollbar>& scrollbar = |
+ orientation == kHorizontalScrollbar ? h_bar_ : v_bar_; |
+ DCHECK(orientation == kHorizontalScrollbar ? !h_bar_is_attached_ |
+ : !v_bar_is_attached_); |
+ if (!scrollbar) |
+ return; |
+ |
+ scrollable_area_->WillRemoveScrollbar(*scrollbar, orientation); |
+ |
+ scrollable_area_->GetLayoutBox()->GetDocument().View()->RemoveScrollbar( |
+ scrollbar); |
+ |
+ scrollbar->DisconnectFromScrollableArea(); |
+ scrollbar = nullptr; |
+} |
+ |
} // namespace blink |