| 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..b5371b4dd8bdfdb81af7389cd3b51ce44841d292
|
| --- /dev/null
|
| +++ b/chrome/browser/ui/views/web_contents_modal_dialog_manager_views.cc
|
| @@ -0,0 +1,112 @@
|
| +// 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/native_web_contents_modal_dialog_manager.h"
|
| +#include "chrome/browser/ui/views/constrained_window_views.h"
|
| +#include "chrome/browser/ui/web_contents_modal_dialog_manager.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 NativeWebContentsModalDialogManagerViews
|
| + : public NativeWebContentsModalDialogManager,
|
| + public views::WidgetObserver {
|
| + public:
|
| + NativeWebContentsModalDialogManagerViews(
|
| + WebContentsModalDialogManager* manager)
|
| + : manager_(manager) {
|
| + }
|
| +
|
| + virtual ~NativeWebContentsModalDialogManagerViews() {
|
| + for (std::set<views::Widget*>::iterator it = observed_widgets_.begin();
|
| + it != observed_widgets_.end();
|
| + ++it) {
|
| + (*it)->RemoveObserver(this);
|
| + }
|
| + }
|
| +
|
| + // NativeWebContentsModalDialogManager overrides
|
| + 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)
|
| + // TODO(wittman): remove once the new visual style is complete
|
| + widget->GetNativeWindow()->SetProperty(aura::client::kConstrainedWindowKey,
|
| + 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);
|
| + }
|
| +
|
| + // TODO(wittman): remove once the new visual style is complete
|
| + widget->GetNativeWindow()->SetProperty(ash::kConstrainedWindowKey, true);
|
| + 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(NativeWebContentsModalDialogManagerViews);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +NativeWebContentsModalDialogManager* WebContentsModalDialogManager::
|
| +CreateNativeManager(WebContentsModalDialogManager* manager) {
|
| + return new NativeWebContentsModalDialogManagerViews(manager);
|
| +}
|
|
|