summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorerg@chromium.org <erg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-04 12:17:18 +0000
committererg@chromium.org <erg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-04 12:17:18 +0000
commite7b183112403e43ddd53a1d18d37544e7dc65295 (patch)
tree9d7b1ede3f0e37451a1ada56f111403be87d635a /ui
parent0a9d20cfe00f6efbba9bd3c4ecf132594655f1d3 (diff)
downloadchromium_src-e7b183112403e43ddd53a1d18d37544e7dc65295.zip
chromium_src-e7b183112403e43ddd53a1d18d37544e7dc65295.tar.gz
chromium_src-e7b183112403e43ddd53a1d18d37544e7dc65295.tar.bz2
Desktop aura: Expand what the ViewsDelegate can do to new windows.
(This is a reland of r173539, adding early bails to some implementations of OnBeforeWidgetInit so that we don't clobber an already set Widget::InitParams::native_widget.) There are actual cases where we have to show dialogs with no parent or context, when there are no browser windows. All of the cases that I can find go through the CreateWindow() interface. CreateWindow() now explicitly sets InitParams::top_level to true. The ViewsDelegate now can do arbitrary manipulations on the InitParams so that when top_level is true and we have no context, we either create a native_widget or set the context based on desktop type. BUG=165759 TBR=ben@chromium.org (who did the original review) First Review URL: https://chromiumcodereview.appspot.com/11578014 Review URL: https://chromiumcodereview.appspot.com/11758002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@175131 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
-rw-r--r--ui/views/test/desktop_test_views_delegate.cc25
-rw-r--r--ui/views/test/desktop_test_views_delegate.h7
-rw-r--r--ui/views/test/test_views_delegate.cc9
-rw-r--r--ui/views/test/test_views_delegate.h7
-rw-r--r--ui/views/views_delegate.h10
-rw-r--r--ui/views/widget/widget.cc34
-rw-r--r--ui/views/widget/widget.h3
7 files changed, 42 insertions, 53 deletions
diff --git a/ui/views/test/desktop_test_views_delegate.cc b/ui/views/test/desktop_test_views_delegate.cc
index fedcb79d..4dc0bb5 100644
--- a/ui/views/test/desktop_test_views_delegate.cc
+++ b/ui/views/test/desktop_test_views_delegate.cc
@@ -13,20 +13,21 @@ DesktopTestViewsDelegate::DesktopTestViewsDelegate() {}
DesktopTestViewsDelegate::~DesktopTestViewsDelegate() {}
-NativeWidget* DesktopTestViewsDelegate::CreateNativeWidget(
- Widget::InitParams::Type type,
- internal::NativeWidgetDelegate* delegate,
- gfx::NativeView parent,
- gfx::NativeView context) {
+void DesktopTestViewsDelegate::OnBeforeWidgetInit(
+ Widget::InitParams* params,
+ internal::NativeWidgetDelegate* delegate) {
#if defined(USE_AURA) && !defined(OS_CHROMEOS)
- if (parent && type != views::Widget::InitParams::TYPE_MENU)
- return new views::NativeWidgetAura(delegate);
-
- if (!parent && !context)
- return new views::DesktopNativeWidgetAura(delegate);
+ // If we already have a native_widget, we don't have to try to come
+ // up with one.
+ if (params->native_widget)
+ return;
+
+ if (params->parent && params->type != views::Widget::InitParams::TYPE_MENU) {
+ params->native_widget = new views::NativeWidgetAura(delegate);
+ } else if (!params->parent && !params->context) {
+ params->native_widget = new views::DesktopNativeWidgetAura(delegate);
+ }
#endif
-
- return NULL;
}
} // namespace views
diff --git a/ui/views/test/desktop_test_views_delegate.h b/ui/views/test/desktop_test_views_delegate.h
index 3a96256..32f2ad7 100644
--- a/ui/views/test/desktop_test_views_delegate.h
+++ b/ui/views/test/desktop_test_views_delegate.h
@@ -18,11 +18,8 @@ class DesktopTestViewsDelegate : public TestViewsDelegate {
virtual ~DesktopTestViewsDelegate();
// Overridden from ViewsDelegate:
- virtual NativeWidget* CreateNativeWidget(
- Widget::InitParams::Type type,
- internal::NativeWidgetDelegate* delegate,
- gfx::NativeView parent,
- gfx::NativeView context) OVERRIDE;
+ virtual void OnBeforeWidgetInit(Widget::InitParams* params,
+ internal::NativeWidgetDelegate* delegate) OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(DesktopTestViewsDelegate);
diff --git a/ui/views/test/test_views_delegate.cc b/ui/views/test/test_views_delegate.cc
index cf8f1e1..39380cdd 100644
--- a/ui/views/test/test_views_delegate.cc
+++ b/ui/views/test/test_views_delegate.cc
@@ -61,12 +61,9 @@ content::WebContents* TestViewsDelegate::CreateWebContents(
return NULL;
}
-NativeWidget* TestViewsDelegate::CreateNativeWidget(
- Widget::InitParams::Type type,
- internal::NativeWidgetDelegate* delegate,
- gfx::NativeView parent,
- gfx::NativeView context) {
- return NULL;
+void TestViewsDelegate::OnBeforeWidgetInit(
+ Widget::InitParams* params,
+ internal::NativeWidgetDelegate* delegate) {
}
} // namespace views
diff --git a/ui/views/test/test_views_delegate.h b/ui/views/test/test_views_delegate.h
index b6ec851..9b8455c 100644
--- a/ui/views/test/test_views_delegate.h
+++ b/ui/views/test/test_views_delegate.h
@@ -59,11 +59,8 @@ class TestViewsDelegate : public ViewsDelegate {
virtual content::WebContents* CreateWebContents(
content::BrowserContext* browser_context,
content::SiteInstance* site_instance) OVERRIDE;
- virtual NativeWidget* CreateNativeWidget(
- Widget::InitParams::Type type,
- internal::NativeWidgetDelegate* delegate,
- gfx::NativeView parent,
- gfx::NativeView context) OVERRIDE;
+ virtual void OnBeforeWidgetInit(Widget::InitParams* params,
+ internal::NativeWidgetDelegate* delegate) OVERRIDE;
private:
bool use_transparent_windows_;
diff --git a/ui/views/views_delegate.h b/ui/views/views_delegate.h
index 79e4794..b594124 100644
--- a/ui/views/views_delegate.h
+++ b/ui/views/views_delegate.h
@@ -106,13 +106,9 @@ class VIEWS_EXPORT ViewsDelegate {
content::BrowserContext* browser_context,
content::SiteInstance* site_instance) = 0;
- // Creates a NativeWidget implementation. Returning NULL means Widget will
- // create a default implementation for the platform.
- virtual NativeWidget* CreateNativeWidget(
- Widget::InitParams::Type type,
- internal::NativeWidgetDelegate* delegate,
- gfx::NativeView parent,
- gfx::NativeView context) = 0;
+ // Gives the platform a chance to modify the properties of a Widget.
+ virtual void OnBeforeWidgetInit(Widget::InitParams* params,
+ internal::NativeWidgetDelegate* delegate) = 0;
};
} // namespace views
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc
index 6818aca..8aaa88a 100644
--- a/ui/views/widget/widget.cc
+++ b/ui/views/widget/widget.cc
@@ -50,22 +50,12 @@ void BuildRootLayers(View* view, std::vector<ui::Layer*>* layers) {
// Create a native widget implementation.
// First, use the supplied one if non-NULL.
-// Second, ask the delegate.
// Finally, make a default one.
NativeWidget* CreateNativeWidget(NativeWidget* native_widget,
- internal::NativeWidgetDelegate* delegate,
- Widget::InitParams::Type type,
- gfx::NativeView parent,
- gfx::NativeView context) {
+ internal::NativeWidgetDelegate* delegate) {
if (!native_widget) {
- if (ViewsDelegate::views_delegate) {
- native_widget = ViewsDelegate::views_delegate->CreateNativeWidget(
- type, delegate, parent, context);
- }
- if (!native_widget) {
- native_widget =
- internal::NativeWidgetPrivate::CreateNativeWidget(delegate);
- }
+ native_widget =
+ internal::NativeWidgetPrivate::CreateNativeWidget(delegate);
}
return native_widget;
}
@@ -231,7 +221,12 @@ Widget::~Widget() {
// static
Widget* Widget::CreateWindow(WidgetDelegate* delegate) {
- return CreateWindowWithParentAndBounds(delegate, NULL, gfx::Rect());
+ Widget* widget = new Widget;
+ Widget::InitParams params;
+ params.delegate = delegate;
+ params.top_level = true;
+ widget->Init(params);
+ return widget;
}
// static
@@ -339,7 +334,11 @@ bool Widget::RequiresNonClientView(InitParams::Type type) {
type == InitParams::TYPE_BUBBLE;
}
-void Widget::Init(const InitParams& params) {
+void Widget::Init(const InitParams& in_params) {
+ InitParams params = in_params;
+ if (ViewsDelegate::views_delegate)
+ ViewsDelegate::views_delegate->OnBeforeWidgetInit(&params, this);
+
is_top_level_ = params.top_level ||
(!params.child &&
params.type != InitParams::TYPE_CONTROL &&
@@ -347,9 +346,8 @@ void Widget::Init(const InitParams& params) {
widget_delegate_ = params.delegate ?
params.delegate : new DefaultWidgetDelegate(this, params);
ownership_ = params.ownership;
- native_widget_ = CreateNativeWidget(
- params.native_widget, this, params.type, params.parent, params.context)->
- AsNativeWidgetPrivate();
+ native_widget_ = CreateNativeWidget(params.native_widget, this)->
+ AsNativeWidgetPrivate();
GetRootView();
default_theme_provider_.reset(new DefaultThemeProvider);
if (params.type == InitParams::TYPE_MENU) {
diff --git a/ui/views/widget/widget.h b/ui/views/widget/widget.h
index 07b4657f..0eaa78a 100644
--- a/ui/views/widget/widget.h
+++ b/ui/views/widget/widget.h
@@ -187,6 +187,9 @@ class VIEWS_EXPORT Widget : public internal::NativeWidgetDelegate,
// TODO(beng): Figure out if there's a better way to expose this, e.g. get
// rid of NW subclasses and do this all via message handling.
DesktopRootWindowHost* desktop_root_window_host;
+ // Whether this window is intended to be a toplevel window with no
+ // attachment to any other window. (This may be a transient window is
+ // |parent| is set.)
bool top_level;
// Only used by NativeWidgetAura. Specifies the type of layer for the
// aura::Window. Default is LAYER_TEXTURED.