Commit 4ea32eca authored by msw@chromium.org's avatar msw@chromium.org

Patch AvatarMenuBubbleView crash; only SizeToContents if GetBubbleFrameView.

Showing the avatar menu crashes after crrev.com/114330.
SizeToContents was called before BubbleFrameView init.

This workaround checks GetBubbleFrameView before calling SizeToContents.
Also, run OnAvatarMenuModelChanged on Init, not ctor.

BUG=106989,107574
TEST=No crash and doesn't regress crbug.com/106989.

Review URL: http://codereview.chromium.org/8909013

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@114538 0039d316-1c4b-4281-b951-d872f2087c98
parent ccfc8a21
...@@ -432,16 +432,6 @@ bool AvatarMenuBubbleView::AcceleratorPressed( ...@@ -432,16 +432,6 @@ bool AvatarMenuBubbleView::AcceleratorPressed(
return true; return true;
} }
void AvatarMenuBubbleView::ViewHierarchyChanged(bool is_add,
views::View* parent,
views::View* child) {
// Build the menu for the first time.
if (!add_profile_link_ && is_add && child == this)
OnAvatarMenuModelChanged(avatar_menu_model_.get());
views::BubbleDelegateView::ViewHierarchyChanged(is_add, parent, child);
}
void AvatarMenuBubbleView::ButtonPressed(views::Button* sender, void AvatarMenuBubbleView::ButtonPressed(views::Button* sender,
const views::Event& event) { const views::Event& event) {
for (size_t i = 0; i < item_views_.size(); ++i) { for (size_t i = 0; i < item_views_.size(); ++i) {
...@@ -475,6 +465,8 @@ gfx::Rect AvatarMenuBubbleView::GetAnchorRect() { ...@@ -475,6 +465,8 @@ gfx::Rect AvatarMenuBubbleView::GetAnchorRect() {
} }
void AvatarMenuBubbleView::Init() { void AvatarMenuBubbleView::Init() {
// Build the menu for the first time.
OnAvatarMenuModelChanged(avatar_menu_model_.get());
AddAccelerator(ui::Accelerator(ui::VKEY_DOWN, 0)); AddAccelerator(ui::Accelerator(ui::VKEY_DOWN, 0));
AddAccelerator(ui::Accelerator(ui::VKEY_UP, 0)); AddAccelerator(ui::Accelerator(ui::VKEY_UP, 0));
} }
...@@ -510,5 +502,6 @@ void AvatarMenuBubbleView::OnAvatarMenuModelChanged( ...@@ -510,5 +502,6 @@ void AvatarMenuBubbleView::OnAvatarMenuModelChanged(
// If the bubble has already been shown then resize and reposition the bubble. // If the bubble has already been shown then resize and reposition the bubble.
Layout(); Layout();
SizeToContents(); if (GetBubbleFrameView())
SizeToContents();
} }
...@@ -41,8 +41,6 @@ class AvatarMenuBubbleView : public views::BubbleDelegateView, ...@@ -41,8 +41,6 @@ class AvatarMenuBubbleView : public views::BubbleDelegateView,
virtual gfx::Size GetPreferredSize() OVERRIDE; virtual gfx::Size GetPreferredSize() OVERRIDE;
virtual void Layout() OVERRIDE; virtual void Layout() OVERRIDE;
virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE; virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE;
virtual void ViewHierarchyChanged(bool is_add, View* parent, View* child)
OVERRIDE;
// views::ButtonListener implementation. // views::ButtonListener implementation.
virtual void ButtonPressed(views::Button* sender, virtual void ButtonPressed(views::Button* sender,
......
...@@ -279,7 +279,8 @@ void BubbleDelegateView::SizeToContents() { ...@@ -279,7 +279,8 @@ void BubbleDelegateView::SizeToContents() {
BubbleFrameView* BubbleDelegateView::GetBubbleFrameView() const { BubbleFrameView* BubbleDelegateView::GetBubbleFrameView() const {
const Widget* widget = border_widget_ ? border_widget_ : GetWidget(); const Widget* widget = border_widget_ ? border_widget_ : GetWidget();
return static_cast<BubbleFrameView*>(widget->non_client_view()->frame_view()); const NonClientView* view = widget ? widget->non_client_view() : NULL;
return view ? static_cast<BubbleFrameView*>(view->frame_view()) : NULL;
} }
gfx::Rect BubbleDelegateView::GetBubbleBounds() { gfx::Rect BubbleDelegateView::GetBubbleBounds() {
......
...@@ -107,12 +107,12 @@ class VIEWS_EXPORT BubbleDelegateView : public WidgetDelegateView, ...@@ -107,12 +107,12 @@ class VIEWS_EXPORT BubbleDelegateView : public WidgetDelegateView,
// contents preferred size. // contents preferred size.
void SizeToContents(); void SizeToContents();
BubbleFrameView* GetBubbleFrameView() const;
private: private:
FRIEND_TEST_ALL_PREFIXES(BubbleFrameViewBasicTest, NonClientHitTest); FRIEND_TEST_ALL_PREFIXES(BubbleFrameViewBasicTest, NonClientHitTest);
FRIEND_TEST_ALL_PREFIXES(BubbleDelegateTest, CreateDelegate); FRIEND_TEST_ALL_PREFIXES(BubbleDelegateTest, CreateDelegate);
BubbleFrameView* GetBubbleFrameView() const;
// Get bubble bounds from the anchor point and client view's preferred size. // Get bubble bounds from the anchor point and client view's preferred size.
gfx::Rect GetBubbleBounds(); gfx::Rect GetBubbleBounds();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment