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

Side by Side Diff: third_party/WebKit/Source/core/frame/LocalFrameView.cpp

Issue 2942163002: [Refactor] Moved scrollbar creation and deletion to ScrollbarManager (Closed)
Patch Set: bokan and skobes comments addressed Created 3 years, 5 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 unified diff | Download patch
OLDNEW
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 459 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 scrollable_area_->DidAddScrollbar(*v_bar_, kVerticalScrollbar); 470 scrollable_area_->DidAddScrollbar(*v_bar_, kVerticalScrollbar);
471 v_bar_->StyleChanged(); 471 v_bar_->StyleChanged();
472 } else { 472 } else {
473 v_bar_is_attached_ = 0; 473 v_bar_is_attached_ = 0;
474 DestroyScrollbar(kVerticalScrollbar); 474 DestroyScrollbar(kVerticalScrollbar);
475 } 475 }
476 476
477 scrollable_area_->SetScrollCornerNeedsPaintInvalidation(); 477 scrollable_area_->SetScrollCornerNeedsPaintInvalidation();
478 } 478 }
479 479
480 Scrollbar* LocalFrameView::ScrollbarManager::CreateScrollbar(
481 ScrollbarOrientation orientation) {
482 Element* custom_scrollbar_element = nullptr;
483 LayoutBox* box = scrollable_area_->GetLayoutBox();
484 if (box->GetDocument().View()->ShouldUseCustomScrollbars(
485 custom_scrollbar_element)) {
486 return LayoutScrollbar::CreateCustomScrollbar(
487 scrollable_area_.Get(), orientation, custom_scrollbar_element);
488 }
489
490 // Nobody set a custom style, so we just use a native scrollbar.
491 return Scrollbar::Create(scrollable_area_.Get(), orientation,
492 kRegularScrollbar,
493 &box->GetFrame()->GetPage()->GetChromeClient());
494 }
495
496 void LocalFrameView::ScrollbarManager::DestroyScrollbar(
497 ScrollbarOrientation orientation) {
498 Member<Scrollbar>& scrollbar =
499 orientation == kHorizontalScrollbar ? h_bar_ : v_bar_;
500 DCHECK(orientation == kHorizontalScrollbar ? !h_bar_is_attached_
501 : !v_bar_is_attached_);
502 if (!scrollbar)
503 return;
504
505 scrollable_area_->WillRemoveScrollbar(*scrollbar, orientation);
506 scrollbar->DisconnectFromScrollableArea();
507 scrollbar = nullptr;
508 }
509
510 void LocalFrameView::RecalculateCustomScrollbarStyle() { 480 void LocalFrameView::RecalculateCustomScrollbarStyle() {
511 bool did_style_change = false; 481 bool did_style_change = false;
512 if (HorizontalScrollbar() && HorizontalScrollbar()->IsCustomScrollbar()) { 482 if (HorizontalScrollbar() && HorizontalScrollbar()->IsCustomScrollbar()) {
513 HorizontalScrollbar()->StyleChanged(); 483 HorizontalScrollbar()->StyleChanged();
514 did_style_change = true; 484 did_style_change = true;
515 } 485 }
516 if (VerticalScrollbar() && VerticalScrollbar()->IsCustomScrollbar()) { 486 if (VerticalScrollbar() && VerticalScrollbar()->IsCustomScrollbar()) {
517 VerticalScrollbar()->StyleChanged(); 487 VerticalScrollbar()->StyleChanged();
518 did_style_change = true; 488 did_style_change = true;
519 } 489 }
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
674 644
675 ScrollbarMode new_horizontal_mode = horizontal_scrollbar_mode_; 645 ScrollbarMode new_horizontal_mode = horizontal_scrollbar_mode_;
676 if (can_have_scrollbars && horizontal_scrollbar_mode_ == kScrollbarAlwaysOff) 646 if (can_have_scrollbars && horizontal_scrollbar_mode_ == kScrollbarAlwaysOff)
677 new_horizontal_mode = kScrollbarAuto; 647 new_horizontal_mode = kScrollbarAuto;
678 else if (!can_have_scrollbars) 648 else if (!can_have_scrollbars)
679 new_horizontal_mode = kScrollbarAlwaysOff; 649 new_horizontal_mode = kScrollbarAlwaysOff;
680 650
681 SetScrollbarModes(new_horizontal_mode, new_vertical_mode); 651 SetScrollbarModes(new_horizontal_mode, new_vertical_mode);
682 } 652 }
683 653
684 bool LocalFrameView::ShouldUseCustomScrollbars( 654 LayoutObject* LocalFrameView::LayoutObjectForScrollbarStyle() const {
685 Element*& custom_scrollbar_element) const { 655 LayoutViewItem layout_view_item = GetLayoutViewItem();
686 custom_scrollbar_element = nullptr; 656 if (layout_view_item.IsNull())
657 return nullptr;
687 658
688 if (Settings* settings = frame_->GetSettings()) { 659 return layout_view_item.GetScrollableArea()->LayoutObjectForScrollbarStyle();
689 if (!settings->GetAllowCustomScrollbarInMainFrame() &&
690 frame_->IsMainFrame())
691 return false;
692 }
693 Document* doc = frame_->GetDocument();
694
695 // Try the <body> element first as a scrollbar source.
696 Element* body = doc ? doc->body() : 0;
697 if (body && body->GetLayoutObject() &&
698 body->GetLayoutObject()->Style()->HasPseudoStyle(kPseudoIdScrollbar)) {
699 custom_scrollbar_element = body;
700 return true;
701 }
702
703 // If the <body> didn't have a custom style, then the root element might.
704 Element* doc_element = doc ? doc->documentElement() : 0;
705 if (doc_element && doc_element->GetLayoutObject() &&
706 doc_element->GetLayoutObject()->Style()->HasPseudoStyle(
707 kPseudoIdScrollbar)) {
708 custom_scrollbar_element = doc_element;
709 return true;
710 }
711
712 return false;
713 } 660 }
714 661
715 Scrollbar* LocalFrameView::CreateScrollbar(ScrollbarOrientation orientation) { 662 Scrollbar* LocalFrameView::CreateScrollbar(ScrollbarOrientation orientation) {
716 return scrollbar_manager_.CreateScrollbar(orientation); 663 return scrollbar_manager_.CreateScrollbar(orientation);
717 } 664 }
718 665
719 void LocalFrameView::SetContentsSize(const IntSize& size) { 666 void LocalFrameView::SetContentsSize(const IntSize& size) {
720 if (size == ContentsSize()) 667 if (size == ContentsSize())
721 return; 668 return;
722 669
(...skipping 1460 matching lines...) Expand 10 before | Expand all | Expand 10 after
2183 2130
2184 void LocalFrameView::ScrollbarExistenceMaybeChanged() { 2131 void LocalFrameView::ScrollbarExistenceMaybeChanged() {
2185 // We check to make sure the view is attached to a frame() as this method can 2132 // We check to make sure the view is attached to a frame() as this method can
2186 // be triggered before the view is attached by LocalFrame::createView(...) 2133 // be triggered before the view is attached by LocalFrame::createView(...)
2187 // setting various values such as setScrollBarModes(...) for example. An 2134 // setting various values such as setScrollBarModes(...) for example. An
2188 // ASSERT is triggered when a view is layout before being attached to a 2135 // ASSERT is triggered when a view is layout before being attached to a
2189 // frame(). 2136 // frame().
2190 if (!GetFrame().View()) 2137 if (!GetFrame().View())
2191 return; 2138 return;
2192 2139
2193 Element* custom_scrollbar_element = nullptr; 2140 LayoutObject* style_source = LayoutObjectForScrollbarStyle();
2194
2195 bool uses_overlay_scrollbars = 2141 bool uses_overlay_scrollbars =
2196 ScrollbarTheme::GetTheme().UsesOverlayScrollbars() && 2142 ScrollbarTheme::GetTheme().UsesOverlayScrollbars() &&
2197 !ShouldUseCustomScrollbars(custom_scrollbar_element); 2143 !(style_source && style_source->HasCustomScrollbarStyle());
2198 2144
2199 if (!uses_overlay_scrollbars && NeedsLayout()) 2145 if (!uses_overlay_scrollbars && NeedsLayout())
2200 UpdateLayout(); 2146 UpdateLayout();
2201 2147
2202 if (!GetLayoutViewItem().IsNull() && GetLayoutViewItem().UsesCompositing()) { 2148 if (!GetLayoutViewItem().IsNull() && GetLayoutViewItem().UsesCompositing()) {
2203 GetLayoutViewItem().Compositor()->FrameViewScrollbarsExistenceDidChange(); 2149 GetLayoutViewItem().Compositor()->FrameViewScrollbarsExistenceDidChange();
2204 2150
2205 if (!uses_overlay_scrollbars) 2151 if (!uses_overlay_scrollbars)
2206 GetLayoutViewItem().Compositor()->FrameViewDidChangeSize(); 2152 GetLayoutViewItem().Compositor()->FrameViewDidChangeSize();
2207 } 2153 }
(...skipping 1788 matching lines...) Expand 10 before | Expand all | Expand 10 after
3996 } 3942 }
3997 3943
3998 void LocalFrameView::SetLayoutSizeInternal(const IntSize& size) { 3944 void LocalFrameView::SetLayoutSizeInternal(const IntSize& size) {
3999 if (layout_size_ == size) 3945 if (layout_size_ == size)
4000 return; 3946 return;
4001 3947
4002 layout_size_ = size; 3948 layout_size_ = size;
4003 ContentsResized(); 3949 ContentsResized();
4004 } 3950 }
4005 3951
4006 void LocalFrameView::DidAddScrollbar(Scrollbar& scrollbar,
4007 ScrollbarOrientation orientation) {
4008 ScrollableArea::DidAddScrollbar(scrollbar, orientation);
4009 }
4010
4011 PaintLayer* LocalFrameView::Layer() const { 3952 PaintLayer* LocalFrameView::Layer() const {
4012 LayoutViewItem layout_view = GetLayoutViewItem(); 3953 LayoutViewItem layout_view = GetLayoutViewItem();
4013 if (layout_view.IsNull() || !layout_view.Compositor()) 3954 if (layout_view.IsNull() || !layout_view.Compositor())
4014 return nullptr; 3955 return nullptr;
4015 3956
4016 return layout_view.Compositor()->RootLayer(); 3957 return layout_view.Compositor()->RootLayer();
4017 } 3958 }
4018 3959
4019 IntSize LocalFrameView::MaximumScrollOffsetInt() const { 3960 IntSize LocalFrameView::MaximumScrollOffsetInt() const {
4020 // Make the same calculation as in CC's LayerImpl::MaxScrollOffset() 3961 // Make the same calculation as in CC's LayerImpl::MaxScrollOffset()
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
4348 has_vertical_scrollbar != new_has_vertical_scrollbar; 4289 has_vertical_scrollbar != new_has_vertical_scrollbar;
4349 if (!scrollbar_existence_changed) 4290 if (!scrollbar_existence_changed)
4350 return false; 4291 return false;
4351 4292
4352 scrollbar_manager_.SetHasHorizontalScrollbar(new_has_horizontal_scrollbar); 4293 scrollbar_manager_.SetHasHorizontalScrollbar(new_has_horizontal_scrollbar);
4353 scrollbar_manager_.SetHasVerticalScrollbar(new_has_vertical_scrollbar); 4294 scrollbar_manager_.SetHasVerticalScrollbar(new_has_vertical_scrollbar);
4354 4295
4355 if (scrollbars_suppressed_) 4296 if (scrollbars_suppressed_)
4356 return true; 4297 return true;
4357 4298
4358 Element* custom_scrollbar_element = nullptr; 4299 LayoutObject* style_source = LayoutObjectForScrollbarStyle();
4359 bool uses_overlay_scrollbars = 4300 bool uses_overlay_scrollbars =
4360 ScrollbarTheme::GetTheme().UsesOverlayScrollbars() && 4301 ScrollbarTheme::GetTheme().UsesOverlayScrollbars() &&
4361 !ShouldUseCustomScrollbars(custom_scrollbar_element); 4302 !(style_source && style_source->HasCustomScrollbarStyle());
4362 4303
4363 if (!uses_overlay_scrollbars) 4304 if (!uses_overlay_scrollbars)
4364 SetNeedsLayout(); 4305 SetNeedsLayout();
4365 4306
4366 ScrollbarExistenceMaybeChanged(); 4307 ScrollbarExistenceMaybeChanged();
4367 return true; 4308 return true;
4368 } 4309 }
4369 4310
4370 bool LocalFrameView::NeedsScrollbarReconstruction() const { 4311 bool LocalFrameView::NeedsScrollbarReconstruction() const {
4371 Scrollbar* scrollbar = HorizontalScrollbar(); 4312 Scrollbar* scrollbar = HorizontalScrollbar();
4372 if (!scrollbar) 4313 if (!scrollbar)
4373 scrollbar = VerticalScrollbar(); 4314 scrollbar = VerticalScrollbar();
4374 if (!scrollbar) { 4315 if (!scrollbar) {
4375 // We have no scrollbar to reconstruct. 4316 // We have no scrollbar to reconstruct.
4376 return false; 4317 return false;
4377 } 4318 }
4378 Element* style_source = nullptr; 4319 LayoutObject* style_source = LayoutObjectForScrollbarStyle();
4379 bool needs_custom = ShouldUseCustomScrollbars(style_source); 4320
4321 bool needs_custom = style_source && style_source->HasCustomScrollbarStyle();
4380 bool is_custom = scrollbar->IsCustomScrollbar(); 4322 bool is_custom = scrollbar->IsCustomScrollbar();
4381 if (needs_custom != is_custom) { 4323 if (needs_custom != is_custom) {
4382 // We have a native scrollbar that should be custom, or vice versa. 4324 // We have a native scrollbar that should be custom, or vice versa.
4383 return true; 4325 return true;
4384 } 4326 }
4385 if (!needs_custom) { 4327 if (!needs_custom) {
4386 // We have a native scrollbar that should remain native. 4328 // We have a native scrollbar that should remain native.
4387 return false; 4329 return false;
4388 } 4330 }
4389 DCHECK(needs_custom && is_custom); 4331 DCHECK(needs_custom && is_custom);
4390 DCHECK(style_source); 4332 DCHECK(style_source);
4391 if (ToLayoutScrollbar(scrollbar)->StyleSource() != 4333 if (ToLayoutScrollbar(scrollbar)->StyleSource() != style_source) {
4392 style_source->GetLayoutObject()) {
4393 // We have a custom scrollbar with a stale m_owner. 4334 // We have a custom scrollbar with a stale m_owner.
4394 return true; 4335 return true;
4395 } 4336 }
4396 return false; 4337 return false;
4397 } 4338 }
4398 4339
4399 bool LocalFrameView::ShouldIgnoreOverflowHidden() const { 4340 bool LocalFrameView::ShouldIgnoreOverflowHidden() const {
4400 return frame_->GetSettings()->GetIgnoreMainFrameOverflowHiddenQuirk() && 4341 return frame_->GetSettings()->GetIgnoreMainFrameOverflowHiddenQuirk() &&
4401 frame_->IsMainFrame(); 4342 frame_->IsMainFrame();
4402 } 4343 }
(...skipping 1070 matching lines...) Expand 10 before | Expand all | Expand 10 after
5473 void LocalFrameView::SetAnimationHost( 5414 void LocalFrameView::SetAnimationHost(
5474 std::unique_ptr<CompositorAnimationHost> host) { 5415 std::unique_ptr<CompositorAnimationHost> host) {
5475 animation_host_ = std::move(host); 5416 animation_host_ = std::move(host);
5476 } 5417 }
5477 5418
5478 LayoutUnit LocalFrameView::CaretWidth() const { 5419 LayoutUnit LocalFrameView::CaretWidth() const {
5479 return LayoutUnit(GetChromeClient()->WindowToViewportScalar(1)); 5420 return LayoutUnit(GetChromeClient()->WindowToViewportScalar(1));
5480 } 5421 }
5481 5422
5482 } // namespace blink 5423 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/frame/LocalFrameView.h ('k') | third_party/WebKit/Source/core/layout/LayoutObject.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698