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