Chromium Code Reviews| Index: chrome/browser/ui/views/web_contents_modal_dialog_manager_views.cc |
| diff --git a/chrome/browser/ui/views/web_contents_modal_dialog_manager_views.cc b/chrome/browser/ui/views/web_contents_modal_dialog_manager_views.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..6a06f01fc114d4bb3c319ac7d12218c97d41c4ca |
| --- /dev/null |
| +++ b/chrome/browser/ui/views/web_contents_modal_dialog_manager_views.cc |
| @@ -0,0 +1,111 @@ |
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include <set> |
| + |
| +#include "chrome/browser/platform_util.h" |
| +#include "chrome/browser/ui/views/constrained_window_views.h" |
| +#include "chrome/browser/ui/web_contents_modal_dialog_manager.h" |
| +#include "chrome/browser/ui/web_contents_modal_dialog_manager_ui_delegate.h" |
| +#include "ui/views/widget/widget.h" |
| +#include "ui/views/widget/widget_observer.h" |
| + |
| +#if defined(USE_AURA) |
| +#include "ui/aura/client/aura_constants.h" |
| +#include "ui/aura/window.h" |
| +#include "ui/views/corewm/visibility_controller.h" |
| +#include "ui/views/corewm/window_animations.h" |
| +#include "ui/views/corewm/window_modality_controller.h" |
| +#endif |
| + |
| +#if defined(USE_ASH) |
| +#include "ash/ash_constants.h" |
| +#include "ash/shell.h" |
| +#include "ash/wm/custom_frame_view_ash.h" |
| +#endif |
| + |
| +namespace { |
| + |
| +class WebContentsModalDialogManagerUIDelegateViews |
| + : public WebContentsModalDialogManagerUIDelegate, |
| + public views::WidgetObserver { |
| + public: |
| + WebContentsModalDialogManagerUIDelegateViews( |
| + WebContentsModalDialogManager* manager) |
| + : manager_(manager) { |
| + } |
| + |
| + virtual ~WebContentsModalDialogManagerUIDelegateViews() { |
| + for (std::set<views::Widget*>::iterator it = observed_widgets_.begin(); |
| + it != observed_widgets_.end(); |
| + ++it) { |
| + (*it)->RemoveObserver(this); |
| + } |
| + } |
| + |
| + // WebContentsModalDialogManagerUIDelegateViews overrides |
| + |
|
Ben Goodger (Google)
2013/01/23 19:10:46
nit: remove line
Mike Wittman
2013/01/23 21:52:31
Done.
|
| + virtual void ManageDialog(gfx::NativeWindow window) OVERRIDE { |
| + views::Widget* widget = GetWidget(window); |
| + widget->AddObserver(this); |
| + observed_widgets_.insert(widget); |
| + widget->set_movement_disabled(true); |
| + |
| +#if defined(USE_AURA) |
| + widget->GetNativeWindow()->SetProperty(aura::client::kConstrainedWindowKey, |
|
Ben Goodger (Google)
2013/01/23 19:10:46
Add a
// TODO: remove once the new visual style
Mike Wittman
2013/01/23 21:52:31
Done.
|
| + true); |
| +#endif |
| + |
| +#if defined(USE_ASH) |
| + gfx::NativeView parent = platform_util::GetParent(widget->GetNativeView()); |
| + views::corewm::SetChildWindowVisibilityChangesAnimated(parent); |
| + // No animations should get performed on the window since that will re-order |
| + // the window stack which will then cause many problems. |
| + if (parent && parent->parent()) { |
| + parent->parent()->SetProperty(aura::client::kAnimationsDisabledKey, true); |
| + } |
| + |
| + widget->GetNativeWindow()->SetProperty(ash::kConstrainedWindowKey, true); |
|
Ben Goodger (Google)
2013/01/23 19:10:46
this line seems redundant with above?
Mike Wittman
2013/01/23 21:52:31
For whatever reason, there are separate keys for A
|
| + views::corewm::SetModalParent( |
| + widget->GetNativeWindow(), |
| + platform_util::GetParent(widget->GetNativeView())); |
| +#endif |
| + } |
| + |
| + virtual void CloseDialog(gfx::NativeWindow window) OVERRIDE { |
| + views::Widget* widget = GetWidget(window); |
| +#if defined(USE_ASH) |
| + gfx::NativeView view = platform_util::GetParent(widget->GetNativeView()); |
| + // Allow the parent to animate again. |
| + if (view && view->parent()) |
| + view->parent()->ClearProperty(aura::client::kAnimationsDisabledKey); |
| +#endif |
| + widget->Close(); |
| + } |
| + |
| + // views::WidgetObserver overrides |
| + virtual void OnWidgetClosing(views::Widget* widget) OVERRIDE { |
| + manager_->WillClose(static_cast<ConstrainedWindowViews*>(widget)); |
| + observed_widgets_.erase(widget); |
| + } |
| + |
| + private: |
| + static views::Widget* GetWidget(gfx::NativeWindow window) { |
| + views::Widget* widget = views::Widget::GetWidgetForNativeWindow(window); |
| + DCHECK(widget); |
| + return widget; |
| + } |
| + |
| + WebContentsModalDialogManager* manager_; |
| + std::set<views::Widget*> observed_widgets_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(WebContentsModalDialogManagerUIDelegateViews); |
| +}; |
| + |
| +} // namespace |
| + |
| +WebContentsModalDialogManagerUIDelegate* WebContentsModalDialogManager:: |
| +CreateUIDelegate(WebContentsModalDialogManager* manager) { |
| + return new WebContentsModalDialogManagerUIDelegateViews(manager); |
| +} |