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