New issue
Advanced search Search tips

Issue 699912 link

Starred by 2 users

Issue metadata

Status: Fixed
Owner:
Closed: Mar 2017
Cc:
Components:
EstimatedDays: ----
NextAction: ----
OS: Linux , Windows , Chrome , Mac
Pri: 2
Type: Bug


Show other hotlists

Hotlists containing this issue:
Hotlist-1


Sign in to add a comment

GridLayout (and others?) should guard against Layout()/Size() requests when adding views

Project Member Reported by tapted@chromium.org, Mar 9 2017

Issue description

Chrome Version       : 58.0.3026.3

This came out of a regression -  Issue 699390  - fixed in https://codereview.chromium.org/2737913002/

the Edit Bookmark dialog lost its buttons because LabelButton detects when it gets added to a Widget (via NativeThemeChanged) and decides to redesign itself. Part of this includes changing its preferred size, which would trigger a Layout call.

GridLayout had added the view, but hadn't updated any of its internal state so gave a bogus Layout(), which then "stuck".

I think to catch things like this we should add a scoped guard in GridLayout::AddView(..) which makes any request for GridLayout::Layout(..) or GridLayout::GetPreferredSize(..) to fail fast.

A regression test specifically targeting what happened in DialogClientView in  Issue 699390  doesn't really address the root cause, and doesn't help Layout() calls that DialogClientView doesn't have control over. (also it will be kinda obsolete when switching to Harmony since those buttons don't tickle this).

Stack looks like:
        views::DialogClientView::Layout [0x00000000205702C6+182] (c:\src\devel\git\chromium\src\ui\views\window\dialog_client_view.cc:166)
        views::DialogClientView::ChildPreferredSizeChanged [0x0000000020564084+52] (c:\src\devel\git\chromium\src\ui\views\window\dialog_client_view.cc:251)
        views::DialogClientView::ButtonRowContainer::ChildPreferredSizeChanged [0x0000000020564034+52] (c:\src\devel\git\chromium\src\ui\views\window\dialog_client_view.cc:62)
        views::View::PreferredSizeChanged [0x000000002052E968+72] (c:\src\devel\git\chromium\src\ui\views\view.cc:1488)
        views::LabelButton::ChildPreferredSizeChanged [0x00000000203F093B+43] (c:\src\devel\git\chromium\src\ui\views\controls\button\label_button.cc:559)
        views::View::PreferredSizeChanged [0x000000002052E968+72] (c:\src\devel\git\chromium\src\ui\views\view.cc:1488)
        views::Label::ResetLayout [0x0000000020414A16+38] (c:\src\devel\git\chromium\src\ui\views\controls\label.cc:834)
        views::Label::SetShadows [0x00000000204158D5+69] (c:\src\devel\git\chromium\src\ui\views\controls\label.cc:137)
        views::PlatformStyle::ApplyLabelButtonTextStyle [0x000000002051BA36+166] (c:\src\devel\git\chromium\src\ui\views\style\platform_style.cc:93)
        views::LabelButton::ResetColorsFromNativeTheme [0x00000000203F2DD3+531] (c:\src\devel\git\chromium\src\ui\views\controls\button\label_button.cc:517)
        views::LabelButton::OnNativeThemeChanged [0x00000000203F2981+33] (c:\src\devel\git\chromium\src\ui\views\controls\button\label_button.cc:420)
        views::View::PropagateNativeThemeChanged [0x000000002052F698+264] (c:\src\devel\git\chromium\src\ui\views\view.cc:2039)
        views::View::AddChildViewAt [0x00000000205257AF+1295] (c:\src\devel\git\chromium\src\ui\views\view.cc:235)
        views::View::AddChildView [0x000000002052527F+63] (c:\src\devel\git\chromium\src\ui\views\view.cc:183)
        views::GridLayout::AddViewState [0x0000000020505952+306] (c:\src\devel\git\chromium\src\ui\views\layout\grid_layout.cc:941)
        views::GridLayout::AddView [0x0000000020505660+560] (c:\src\devel\git\chromium\src\ui\views\layout\grid_layout.cc:736)
        views::GridLayout::AddView [0x0000000020505411+81] (c:\src\devel\git\chromium\src\ui\views\layout\grid_layout.cc:723)
        views::GridLayout::AddView [0x0000000020505361+321] (c:\src\devel\git\chromium\src\ui\views\layout\grid_layout.cc:718)
        views::GridLayout::AddView [0x0000000020505209+41] (c:\src\devel\git\chromium\src\ui\views\layout\grid_layout.cc:711)
        views::DialogClientView::SetupLayout [0x000000002067F754+2244] (c:\src\devel\git\chromium\src\ui\views\window\dialog_client_view.cc:400)
        views::DialogClientView::UpdateDialogButtons [0x00000000205655F3+19] (c:\src\devel\git\chromium\src\ui\views\window\dialog_client_view.cc:107)
        views::DialogClientView::ViewHierarchyChanged [0x000000002056565D+77] (c:\src\devel\git\chromium\src\ui\views\window\dialog_client_view.cc:192)
        views::View::ViewHierarchyChangedImpl [0x0000000020533B8F+127] (c:\src\devel\git\chromium\src\ui\views\view.cc:2026)
        views::View::PropagateAddNotifications [0x000000002052F29C+220] (c:\src\devel\git\chromium\src\ui\views\view.cc:1997)
        views::View::AddChildViewAt [0x0000000020525854+1460] (c:\src\devel\git\chromium\src\ui\views\view.cc:242)
        views::NonClientView::ViewHierarchyChanged [0x000000002056A502+130] (c:\src\devel\git\chromium\src\ui\views\window\non_client_view.cc:198)
        views::View::ViewHierarchyChangedImpl [0x0000000020533B8F+127] (c:\src\devel\git\chromium\src\ui\views\view.cc:2026)
        views::View::PropagateAddNotifications [0x000000002052F29C+220] (c:\src\devel\git\chromium\src\ui\views\view.cc:1997)
        views::View::AddChildViewAt [0x0000000020525854+1460] (c:\src\devel\git\chromium\src\ui\views\view.cc:242)
        views::View::AddChildView [0x000000002052527F+63] (c:\src\devel\git\chromium\src\ui\views\view.cc:183)
        views::internal::RootView::SetContentsView [0x0000000020544DB8+328] (c:\src\devel\git\chromium\src\ui\views\widget\root_view.cc:196)
        views::Widget::Init [0x0000000020551CDE+1438] (c:\src\devel\git\chromium\src\ui\views\widget\widget.cc:355)
        views::DialogDelegate::CreateDialogWidget [0x00000000205663A6+182] (c:\src\devel\git\chromium\src\ui\views\window\dialog_delegate.cc:46)
 

 
Project Member

Comment 1 by bugdroid1@chromium.org, Mar 14 2017

The following revision refers to this bug:
  https://chromium.googlesource.com/chromium/src.git/+/4d775162580774ccfaed86a8dcf2ac6564198d93

commit 4d775162580774ccfaed86a8dcf2ac6564198d93
Author: tapted <tapted@chromium.org>
Date: Tue Mar 14 06:41:32 2017

GridLayout: Guard against layout queries while adding a view.

Adds a DCHECK to GridLayout to ensure client code doesn't ask it to
perform layout calculations while inside GridLayout::AddViewState().
GridLayout has not yet updated its internal data structures, so it can
only give invalid results at this point.

Adds a BrowserDialogTest for the edit bookmark view which would have
triggered this DCHECK without the fix in r455438.

Adds a DCHECK_DEATH test for GridLayout.

BUG= 699912 ,  699390 

Review-Url: https://codereview.chromium.org/2743743003
Cr-Commit-Position: refs/heads/master@{#456638}

[add] https://crrev.com/4d775162580774ccfaed86a8dcf2ac6564198d93/chrome/browser/ui/views/bookmarks/bookmark_editor_view_browsertest.cc
[modify] https://crrev.com/4d775162580774ccfaed86a8dcf2ac6564198d93/chrome/test/BUILD.gn
[modify] https://crrev.com/4d775162580774ccfaed86a8dcf2ac6564198d93/ui/views/layout/grid_layout.cc
[modify] https://crrev.com/4d775162580774ccfaed86a8dcf2ac6564198d93/ui/views/layout/grid_layout_unittest.cc

Comment 2 by tapted@chromium.org, Mar 14 2017

Status: Fixed (was: Started)

Sign in to add a comment