12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set>
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/platform_util.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/views/constrained_window_views.h"
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/web_modal/native_web_contents_modal_dialog_manager.h"
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "components/web_modal/web_contents_modal_dialog_host.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/web_modal/web_contents_modal_dialog_manager.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/web_contents_view.h"
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ui/gfx/point.h"
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ui/gfx/size.h"
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ui/views/border.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget_delegate.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget_observer.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/window/dialog_delegate.h"
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ui/views/window/non_client_view.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/aura_constants.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/visibility_controller.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/window_animations.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/window_modality_controller.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch// TODO(wittman): this code should not depend on ash.
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/ash_constants.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/custom_frame_view_ash.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using web_modal::NativeWebContentsModalDialog;
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using web_modal::NativeWebContentsModalDialogManager;
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using web_modal::NativeWebContentsModalDialogManagerDelegate;
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using web_modal::WebContentsModalDialogHost;
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using web_modal::ModalDialogHostObserver;
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NativeWebContentsModalDialogManagerViews
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public NativeWebContentsModalDialogManager,
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      public ModalDialogHostObserver,
49424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      public views::WidgetObserver {
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NativeWebContentsModalDialogManagerViews(
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NativeWebContentsModalDialogManagerDelegate* native_delegate)
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      : native_delegate_(native_delegate),
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        host_(NULL) {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~NativeWebContentsModalDialogManagerViews() {
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (host_)
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      host_->RemoveObserver(this);
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (std::set<views::Widget*>::iterator it = observed_widgets_.begin();
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         it != observed_widgets_.end();
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ++it) {
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (*it)->RemoveObserver(this);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NativeWebContentsModalDialogManager overrides
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ManageDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::Widget* widget = GetWidget(dialog);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget->AddObserver(this);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observed_widgets_.insert(widget);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget->set_movement_disabled(true);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(wittman): remove once the new visual style is complete
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget->GetNativeWindow()->SetProperty(aura::client::kConstrainedWindowKey,
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           true);
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    views::corewm::SetWindowVisibilityAnimationType(
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        widget->GetNativeWindow(),
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        views::corewm::WINDOW_VISIBILITY_ANIMATION_TYPE_ROTATE);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeView parent = platform_util::GetParent(widget->GetNativeView());
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::corewm::SetChildWindowVisibilityChangesAnimated(parent);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // No animations should get performed on the window since that will re-order
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the window stack which will then cause many problems.
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (parent && parent->parent()) {
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent->parent()->SetProperty(aura::client::kAnimationsDisabledKey, true);
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::corewm::SetModalParent(
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        widget->GetNativeWindow(),
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        platform_util::GetParent(widget->GetNativeView()));
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ShowDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    views::Widget* widget = GetWidget(dialog);
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(USE_AURA)
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<views::corewm::SuspendChildWindowVisibilityAnimations> suspend;
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (shown_widgets_.find(widget) != shown_widgets_.end()) {
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      suspend.reset(new views::corewm::SuspendChildWindowVisibilityAnimations(
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          widget->GetNativeWindow()->parent()));
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Host may be NULL during tab drag on Views/Win32.
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (host_)
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      UpdateWebContentsModalDialogPosition(widget, host_);
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    widget->Show();
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusDialog(dialog);
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(USE_AURA)
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // TODO(pkotwicz): Control the z-order of the constrained dialog via
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // views::kHostViewKey. We will need to ensure that the parent window's
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // shadows are below the constrained dialog in z-order when we do this.
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    shown_widgets_.insert(widget);
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void HideDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    views::Widget* widget = GetWidget(dialog);
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(USE_AURA)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<views::corewm::SuspendChildWindowVisibilityAnimations> suspend;
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    suspend.reset(new views::corewm::SuspendChildWindowVisibilityAnimations(
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        widget->GetNativeWindow()->parent()));
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    widget->Hide();
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CloseDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWidget(dialog)->Close();
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FocusDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::Widget* widget = GetWidget(dialog);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (widget->widget_delegate() &&
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        widget->widget_delegate()->GetInitiallyFocusedView())
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      widget->widget_delegate()->GetInitiallyFocusedView()->RequestFocus();
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We don't necessarily have a RootWindow yet.
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (widget->GetNativeView()->GetRootWindow())
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      widget->GetNativeView()->Focus();
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void PulseDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // WebContentsModalDialogHostObserver overrides
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void OnPositionRequiresUpdate() OVERRIDE {
1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DCHECK(host_);
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    for (std::set<views::Widget*>::iterator it = observed_widgets_.begin();
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         it != observed_widgets_.end();
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         ++it) {
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      UpdateWebContentsModalDialogPosition(*it, host_);
1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void OnHostDestroying() OVERRIDE {
1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    host_->RemoveObserver(this);
1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    host_ = NULL;
1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // views::WidgetObserver overrides
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // NOTE(wittman): OnWidgetClosing is overriden to ensure that, when the widget
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // is explicitly closed, the destruction occurs within the same call
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // stack. This avoids event races that lead to non-deterministic destruction
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // ordering in e.g. the print preview dialog. OnWidgetDestroying is overridden
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // because OnWidgetClosing is *only* invoked on explicit close, not when the
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // widget is implicitly destroyed due to its parent being closed. This
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // situation occurs with app windows.  WidgetClosing removes the observer, so
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // only one of these two functions is ever invoked for a given widget.
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWidgetClosing(views::Widget* widget) OVERRIDE {
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WidgetClosing(widget);
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE {
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WidgetClosing(widget);
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void HostChanged(
1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      web_modal::WebContentsModalDialogHost* new_host) OVERRIDE {
1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (host_)
1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      host_->RemoveObserver(this);
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    host_ = new_host;
1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // |host_| may be null during WebContents destruction or Win32 tab dragging.
194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (host_) {
1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      host_->AddObserver(this);
1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
197424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      for (std::set<views::Widget*>::iterator it = observed_widgets_.begin();
198424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)           it != observed_widgets_.end();
199424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)           ++it) {
200424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        views::Widget::ReparentNativeView((*it)->GetNativeView(),
201424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                          host_->GetHostView());
202fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      }
2033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
204424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      OnPositionRequiresUpdate();
205fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    }
206fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  }
207fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
208424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) private:
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static views::Widget* GetWidget(NativeWebContentsModalDialog dialog) {
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    views::Widget* widget = views::Widget::GetWidgetForNativeWindow(dialog);
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK(widget);
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return widget;
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void WidgetClosing(views::Widget* widget) {
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeView view = platform_util::GetParent(widget->GetNativeView());
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Allow the parent to animate again.
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (view && view->parent())
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view->parent()->ClearProperty(aura::client::kAnimationsDisabledKey);
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    widget->RemoveObserver(this);
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    native_delegate_->WillClose(widget->GetNativeView());
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observed_widgets_.erase(widget);
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(USE_AURA)
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    shown_widgets_.erase(widget);
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NativeWebContentsModalDialogManagerDelegate* native_delegate_;
2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  WebContentsModalDialogHost* host_;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::set<views::Widget*> observed_widgets_;
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::set<views::Widget*> shown_widgets_;
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NativeWebContentsModalDialogManagerViews);
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace web_modal {
24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NativeWebContentsModalDialogManager* WebContentsModalDialogManager::
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CreateNativeManager(
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NativeWebContentsModalDialogManagerDelegate* native_delegate) {
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new NativeWebContentsModalDialogManagerViews(native_delegate);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace web_modal
249