Commit 70e7d12a authored by oshima@google.com's avatar oshima@google.com

Fix for black-hole on views desktop with compositor.

 Child widget should not be parented to desktop.
 This was causing tab contents for prerendering be parented to desktop.
Fix for DCHECK failure in NativeWidgetViews::OnKeyEvent
 Child widget should not be activated.
Reset non_client_view_ when new contentview is set.

BUG=none
TEST=updated widget_unittests

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@102389 0039d316-1c4b-4281-b951-d872f2087c98
parent 8ad82bac
...@@ -118,7 +118,8 @@ void NativeWidgetViews::InitNativeWidget(const Widget::InitParams& params) { ...@@ -118,7 +118,8 @@ void NativeWidgetViews::InitNativeWidget(const Widget::InitParams& params) {
if (params.parent_widget) { if (params.parent_widget) {
parent_view = params.parent_widget->GetChildViewParent(); parent_view = params.parent_widget->GetChildViewParent();
} else if (ViewsDelegate::views_delegate && } else if (ViewsDelegate::views_delegate &&
ViewsDelegate::views_delegate->GetDefaultParentView()) { ViewsDelegate::views_delegate->GetDefaultParentView() &&
!params.child) {
parent_view = ViewsDelegate::views_delegate->GetDefaultParentView(); parent_view = ViewsDelegate::views_delegate->GetDefaultParentView();
} else if (params.parent) { } else if (params.parent) {
Widget* widget = Widget::GetWidgetForNativeView(params.parent); Widget* widget = Widget::GetWidgetForNativeView(params.parent);
......
...@@ -73,7 +73,8 @@ class DefaultWidgetDelegate : public WidgetDelegate { ...@@ -73,7 +73,8 @@ class DefaultWidgetDelegate : public WidgetDelegate {
public: public:
DefaultWidgetDelegate(Widget* widget, const Widget::InitParams& params) DefaultWidgetDelegate(Widget* widget, const Widget::InitParams& params)
: widget_(widget), : widget_(widget),
can_activate_(params.type != Widget::InitParams::TYPE_POPUP) { can_activate_(!params.child &&
params.type != Widget::InitParams::TYPE_POPUP) {
} }
virtual ~DefaultWidgetDelegate() {} virtual ~DefaultWidgetDelegate() {}
...@@ -398,6 +399,8 @@ const Widget* Widget::GetTopLevelWidget() const { ...@@ -398,6 +399,8 @@ const Widget* Widget::GetTopLevelWidget() const {
void Widget::SetContentsView(View* view) { void Widget::SetContentsView(View* view) {
root_view_->SetContentsView(view); root_view_->SetContentsView(view);
if (non_client_view_ != view)
non_client_view_ = NULL;
} }
View* Widget::GetContentsView() { View* Widget::GetContentsView() {
...@@ -1074,6 +1077,7 @@ internal::RootView* Widget::CreateRootView() { ...@@ -1074,6 +1077,7 @@ internal::RootView* Widget::CreateRootView() {
} }
void Widget::DestroyRootView() { void Widget::DestroyRootView() {
non_client_view_ = NULL;
root_view_.reset(); root_view_.reset();
// Input method has to be destroyed before focus manager. // Input method has to be destroyed before focus manager.
input_method_.reset(); input_method_.reset();
......
...@@ -132,6 +132,15 @@ Widget* CreateChildPlatformWidget(gfx::NativeView parent_native_view) { ...@@ -132,6 +132,15 @@ Widget* CreateChildPlatformWidget(gfx::NativeView parent_native_view) {
return child; return child;
} }
Widget* CreateTopLevelNativeWidgetViews() {
Widget* toplevel = new Widget;
Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
params.native_widget = new NativeWidgetViews(toplevel);
toplevel->Init(params);
toplevel->SetContentsView(new View);
return toplevel;
}
Widget* CreateChildNativeWidgetViewsWithParent(Widget* parent) { Widget* CreateChildNativeWidgetViewsWithParent(Widget* parent) {
Widget* child = new Widget; Widget* child = new Widget;
Widget::InitParams params(Widget::InitParams::TYPE_CONTROL); Widget::InitParams params(Widget::InitParams::TYPE_CONTROL);
...@@ -178,7 +187,7 @@ TEST_F(WidgetTest, GetTopLevelWidget_Synthetic) { ...@@ -178,7 +187,7 @@ TEST_F(WidgetTest, GetTopLevelWidget_Synthetic) {
// child NativeWidgetViews. // child NativeWidgetViews.
Widget* toplevel = CreateTopLevelPlatformWidget(); Widget* toplevel = CreateTopLevelPlatformWidget();
widget_views_delegate().set_default_parent_view(toplevel->GetRootView()); widget_views_delegate().set_default_parent_view(toplevel->GetRootView());
Widget* child = CreateChildNativeWidgetViews(); Widget* child = CreateTopLevelNativeWidgetViews();
EXPECT_EQ(toplevel, toplevel->GetTopLevelWidget()); EXPECT_EQ(toplevel, toplevel->GetTopLevelWidget());
EXPECT_EQ(child, child->GetTopLevelWidget()); EXPECT_EQ(child, child->GetTopLevelWidget());
...@@ -187,23 +196,26 @@ TEST_F(WidgetTest, GetTopLevelWidget_Synthetic) { ...@@ -187,23 +196,26 @@ TEST_F(WidgetTest, GetTopLevelWidget_Synthetic) {
// |child| should be automatically destroyed with |toplevel|. // |child| should be automatically destroyed with |toplevel|.
} }
// Creates a hierarchy consisting of a top level platform native widget, a child // Creates a hierarchy consisting of a desktop platform native widget, a
// NativeWidgetViews, and a child of that child, another NativeWidgetViews. // toplevel NativeWidgetViews, and a child of that toplevel, another
TEST_F(WidgetTest, GetTopLevelWidget_SyntheticParent) { // NativeWidgetViews.
Widget* toplevel = CreateTopLevelPlatformWidget(); TEST_F(WidgetTest, GetTopLevelWidget_SyntheticDesktop) {
widget_views_delegate().set_default_parent_view(toplevel->GetRootView()); // Create a hierarchy consisting of a desktop platform native widget,
// a toplevel NativeWidgetViews and a chlid NativeWidgetViews.
Widget* child1 = CreateChildNativeWidgetViews(); // Will be parented Widget* desktop = CreateTopLevelPlatformWidget();
// automatically to widget_views_delegate().set_default_parent_view(desktop->GetRootView());
// |toplevel|. Widget* toplevel = CreateTopLevelNativeWidgetViews(); // Will be parented
Widget* child11 = CreateChildNativeWidgetViewsWithParent(child1); // automatically to
// |toplevel|.
Widget* child = CreateChildNativeWidgetViewsWithParent(toplevel);
EXPECT_EQ(desktop, desktop->GetTopLevelWidget());
EXPECT_EQ(toplevel, toplevel->GetTopLevelWidget()); EXPECT_EQ(toplevel, toplevel->GetTopLevelWidget());
EXPECT_EQ(child1, child1->GetTopLevelWidget()); EXPECT_EQ(toplevel, child->GetTopLevelWidget());
EXPECT_EQ(child1, child11->GetTopLevelWidget());
toplevel->CloseNow(); desktop->CloseNow();
// |child1| and |child11| should be destroyed with |toplevel|. // |toplevel|, |child| should be automatically destroyed with |toplevel|.
} }
// This is flaky on touch build. See crbug.com/94137. // This is flaky on touch build. See crbug.com/94137.
...@@ -215,12 +227,8 @@ TEST_F(WidgetTest, GetTopLevelWidget_SyntheticParent) { ...@@ -215,12 +227,8 @@ TEST_F(WidgetTest, GetTopLevelWidget_SyntheticParent) {
// Tests some grab/ungrab events. // Tests some grab/ungrab events.
TEST_F(WidgetTest, MAYBE_GrabUngrab) { TEST_F(WidgetTest, MAYBE_GrabUngrab) {
Widget* toplevel = CreateTopLevelPlatformWidget(); Widget* toplevel = CreateTopLevelPlatformWidget();
widget_views_delegate().set_default_parent_view(toplevel->GetRootView()); Widget* child1 = CreateChildNativeWidgetViewsWithParent(toplevel);
Widget* child2 = CreateChildNativeWidgetViewsWithParent(toplevel);
Widget* child1 = CreateChildNativeWidgetViews(); // Will be parented
// automatically to
// |toplevel|.
Widget* child2 = CreateChildNativeWidgetViews();
toplevel->SetBounds(gfx::Rect(0, 0, 500, 500)); toplevel->SetBounds(gfx::Rect(0, 0, 500, 500));
...@@ -650,7 +658,7 @@ class WidgetObserverTest : public WidgetTest, ...@@ -650,7 +658,7 @@ class WidgetObserverTest : public WidgetTest,
} }
Widget* NewWidget() { Widget* NewWidget() {
Widget* widget = CreateChildNativeWidgetViews(); Widget* widget = CreateTopLevelNativeWidgetViews();
widget->AddObserver(this); widget->AddObserver(this);
return widget; return widget;
} }
...@@ -677,18 +685,26 @@ TEST_F(WidgetObserverTest, ActivationChange) { ...@@ -677,18 +685,26 @@ TEST_F(WidgetObserverTest, ActivationChange) {
Widget* toplevel = CreateTopLevelPlatformWidget(); Widget* toplevel = CreateTopLevelPlatformWidget();
widget_views_delegate().set_default_parent_view(toplevel->GetRootView()); widget_views_delegate().set_default_parent_view(toplevel->GetRootView());
Widget* child1 = NewWidget(); Widget* toplevel1 = NewWidget();
Widget* child2 = NewWidget(); Widget* toplevel2 = NewWidget();
toplevel1->Show();
toplevel2->Show();
reset(); reset();
child1->Activate(); toplevel1->Activate();
EXPECT_EQ(child1, widget_activated());
RunPendingMessages();
EXPECT_EQ(toplevel1, widget_activated());
child2->Activate(); toplevel2->Activate();
EXPECT_EQ(child1, widget_deactivated()); RunPendingMessages();
EXPECT_EQ(child2, widget_activated()); EXPECT_EQ(toplevel1, widget_deactivated());
EXPECT_EQ(child2, active()); EXPECT_EQ(toplevel2, widget_activated());
EXPECT_EQ(toplevel2, active());
toplevel->CloseNow();
} }
TEST_F(WidgetObserverTest, VisibilityChange) { TEST_F(WidgetObserverTest, VisibilityChange) {
...@@ -711,6 +727,8 @@ TEST_F(WidgetObserverTest, VisibilityChange) { ...@@ -711,6 +727,8 @@ TEST_F(WidgetObserverTest, VisibilityChange) {
child2->Show(); child2->Show();
EXPECT_EQ(child2, widget_shown()); EXPECT_EQ(child2, widget_shown());
toplevel->CloseNow();
} }
} // namespace } // namespace
......
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