diff options
author | erg@chromium.org <erg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-04 12:17:18 +0000 |
---|---|---|
committer | erg@chromium.org <erg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-04 12:17:18 +0000 |
commit | e7b183112403e43ddd53a1d18d37544e7dc65295 (patch) | |
tree | 9d7b1ede3f0e37451a1ada56f111403be87d635a /ui | |
parent | 0a9d20cfe00f6efbba9bd3c4ecf132594655f1d3 (diff) | |
download | chromium_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.cc | 25 | ||||
-rw-r--r-- | ui/views/test/desktop_test_views_delegate.h | 7 | ||||
-rw-r--r-- | ui/views/test/test_views_delegate.cc | 9 | ||||
-rw-r--r-- | ui/views/test/test_views_delegate.h | 7 | ||||
-rw-r--r-- | ui/views/views_delegate.h | 10 | ||||
-rw-r--r-- | ui/views/widget/widget.cc | 34 | ||||
-rw-r--r-- | ui/views/widget/widget.h | 3 |
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(¶ms, 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. |