diff options
author | wittman@chromium.org <wittman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-07 03:58:12 +0000 |
---|---|---|
committer | wittman@chromium.org <wittman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-07 03:58:12 +0000 |
commit | 07898e034547606c522acd2ec3c92d1a6def7d07 (patch) | |
tree | c88d85f47b9577cabce397be71517ccd84e27856 | |
parent | 329f16b1e79bdf8af4f80a2d10ee26142954a06c (diff) | |
download | chromium_src-07898e034547606c522acd2ec3c92d1a6def7d07.zip chromium_src-07898e034547606c522acd2ec3c92d1a6def7d07.tar.gz chromium_src-07898e034547606c522acd2ec3c92d1a6def7d07.tar.bz2 |
Manual merge of 202948 "Support web contents modal dialogs within SimpleWe..."
> Support web contents modal dialogs within SimpleWebViewDialog and WebUILoginView
>
> These two dialogs host web contents modal dialogs on their WebContents,
> so they need to implement the WebContentsModalDialogManagerDelegate
> and WebContentsModalDialogHost interfaces to provide dialog host view
> and positioning.
>
> BUG=244173
>
> Review URL: https://chromiumcodereview.appspot.com/15879007
BUG=244173
TBR=wittman@chromium.org
Review URL: https://codereview.chromium.org/16268019
git-svn-id: svn://svn.chromium.org/chrome/branches/1500/src@204702 0039d316-1c4b-4281-b951-d872f2087c98
4 files changed, 158 insertions, 2 deletions
diff --git a/chrome/browser/chromeos/login/simple_web_view_dialog.cc b/chrome/browser/chromeos/login/simple_web_view_dialog.cc index ce6d4c4..ef2da26 100644 --- a/chrome/browser/chromeos/login/simple_web_view_dialog.cc +++ b/chrome/browser/chromeos/login/simple_web_view_dialog.cc @@ -13,6 +13,7 @@ #include "chrome/browser/command_updater.h" #include "chrome/browser/password_manager/password_manager.h" #include "chrome/browser/password_manager/password_manager_delegate_impl.h" +#include "chrome/browser/platform_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/content_settings/content_setting_bubble_model_delegate.h" @@ -21,9 +22,12 @@ #include "chrome/browser/ui/views/location_bar/location_icon_view.h" #include "chrome/browser/ui/views/reload_button.h" #include "chrome/browser/ui/web_contents_modal_dialog_manager.h" +#include "chrome/common/render_messages.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_entry.h" +#include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" +#include "content/public/browser/web_contents_view.h" #include "grit/generated_resources.h" #include "grit/theme_resources.h" #include "ipc/ipc_message.h" @@ -158,6 +162,8 @@ void SimpleWebViewDialog::StartLoad(const GURL& url) { // LoginHandlerViews uses a constrained window for the password manager view. WebContentsModalDialogManager::CreateForWebContents(web_contents); + WebContentsModalDialogManager::FromWebContents(web_contents)-> + set_delegate(this); } void SimpleWebViewDialog::Init() { @@ -237,6 +243,14 @@ void SimpleWebViewDialog::Init() { Layout(); } +void SimpleWebViewDialog::Layout() { + views::WidgetDelegateView::Layout(); + + FOR_EACH_OBSERVER(WebContentsModalDialogHostObserver, + observer_list_, + OnPositionRequiresUpdate()); +} + views::View* SimpleWebViewDialog::GetContentsView() { return this; } @@ -346,6 +360,49 @@ void SimpleWebViewDialog::ExecuteCommandWithDisposition( } } +void SimpleWebViewDialog::SetWebContentsBlocked( + content::WebContents* web_contents, + bool blocked) { + // RenderViewHost may be NULL during shutdown. + content::RenderViewHost* host = web_contents->GetRenderViewHost(); + if (host) { + host->Send(new ChromeViewMsg_SetVisuallyDeemphasized( + host->GetRoutingID(), blocked)); + } +} + +WebContentsModalDialogHost* + SimpleWebViewDialog::GetWebContentsModalDialogHost() { + return this; +} + +bool SimpleWebViewDialog::IsWebContentsVisible( + content::WebContents* web_contents) { + return platform_util::IsVisible(web_contents->GetView()->GetNativeView()); +} + +gfx::NativeView SimpleWebViewDialog::GetHostView() const { + return GetWidget()->GetNativeView(); +} + +gfx::Point SimpleWebViewDialog::GetDialogPosition(const gfx::Size& size) { + // Center the widget. + gfx::Size widget_size = GetWidget()->GetWindowBoundsInScreen().size(); + return gfx::Point(widget_size.width() / 2 - size.width() / 2, + widget_size.height() / 2 - size.height() / 2); +} + +void SimpleWebViewDialog::AddObserver( + WebContentsModalDialogHostObserver* observer) { + if (observer && !observer_list_.HasObserver(observer)) + observer_list_.AddObserver(observer); +} + +void SimpleWebViewDialog::RemoveObserver( + WebContentsModalDialogHostObserver* observer) { + observer_list_.RemoveObserver(observer); +} + void SimpleWebViewDialog::LoadImages() { ui::ThemeProvider* tp = GetThemeProvider(); diff --git a/chrome/browser/chromeos/login/simple_web_view_dialog.h b/chrome/browser/chromeos/login/simple_web_view_dialog.h index 6fb47a7..6478608 100644 --- a/chrome/browser/chromeos/login/simple_web_view_dialog.h +++ b/chrome/browser/chromeos/login/simple_web_view_dialog.h @@ -7,9 +7,12 @@ #include <string> #include "base/memory/scoped_ptr.h" +#include "base/observer_list.h" #include "chrome/browser/command_updater_delegate.h" #include "chrome/browser/ui/toolbar/toolbar_model_delegate.h" #include "chrome/browser/ui/views/location_bar/location_bar_view.h" +#include "chrome/browser/ui/web_contents_modal_dialog_host.h" +#include "chrome/browser/ui/web_contents_modal_dialog_manager_delegate.h" #include "content/public/browser/page_navigator.h" #include "content/public/browser/web_contents_delegate.h" #include "googleurl/src/gurl.h" @@ -41,7 +44,9 @@ class SimpleWebViewDialog : public views::ButtonListener, public ToolbarModelDelegate, public CommandUpdaterDelegate, public content::PageNavigator, - public content::WebContentsDelegate { + public content::WebContentsDelegate, + public WebContentsModalDialogManagerDelegate, + public WebContentsModalDialogHost { public: explicit SimpleWebViewDialog(Profile* profile); virtual ~SimpleWebViewDialog(); @@ -52,6 +57,9 @@ class SimpleWebViewDialog : public views::ButtonListener, // Inits view. Should be attached to a Widget before call. void Init(); + // Overridden from views::View: + virtual void Layout() OVERRIDE; + // Overridden from views::WidgetDelegate: virtual views::View* GetContentsView() OVERRIDE; virtual views::View* GetInitiallyFocusedView() OVERRIDE; @@ -93,6 +101,22 @@ class SimpleWebViewDialog : public views::ButtonListener, int id, WindowOpenDisposition) OVERRIDE; + // Implements WebContentsModalDialogManagerDelegate: + virtual void SetWebContentsBlocked(content::WebContents* web_contents, + bool blocked) OVERRIDE; + virtual WebContentsModalDialogHost* + GetWebContentsModalDialogHost() OVERRIDE; + virtual bool IsWebContentsVisible( + content::WebContents* web_contents) OVERRIDE; + + // Implements WebContentsModalDialogHost: + virtual gfx::NativeView GetHostView() const OVERRIDE; + virtual gfx::Point GetDialogPosition(const gfx::Size& size) OVERRIDE; + virtual void AddObserver( + WebContentsModalDialogHostObserver* observer) OVERRIDE; + virtual void RemoveObserver( + WebContentsModalDialogHostObserver* observer) OVERRIDE; + private: void LoadImages(); void UpdateButtons(); @@ -114,6 +138,8 @@ class SimpleWebViewDialog : public views::ButtonListener, scoped_ptr<StubBubbleModelDelegate> bubble_model_delegate_; + ObserverList<WebContentsModalDialogHostObserver> observer_list_; + DISALLOW_COPY_AND_ASSIGN(SimpleWebViewDialog); }; diff --git a/chrome/browser/chromeos/login/webui_login_view.cc b/chrome/browser/chromeos/login/webui_login_view.cc index fc7ba2a..3e414f0 100644 --- a/chrome/browser/chromeos/login/webui_login_view.cc +++ b/chrome/browser/chromeos/login/webui_login_view.cc @@ -21,6 +21,7 @@ #include "chrome/browser/media/media_stream_infobar_delegate.h" #include "chrome/browser/password_manager/password_manager.h" #include "chrome/browser/password_manager/password_manager_delegate_impl.h" +#include "chrome/browser/platform_util.h" #include "chrome/browser/renderer_preferences_util.h" #include "chrome/browser/ui/web_contents_modal_dialog_manager.h" #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" @@ -194,6 +195,8 @@ void WebUILoginView::Init(views::Widget* login_window) { // LoginHandlerViews uses a constrained window for the password manager view. WebContentsModalDialogManager::CreateForWebContents(web_contents); + WebContentsModalDialogManager::FromWebContents(web_contents)-> + set_delegate(this); web_contents->SetDelegate(this); renderer_preferences_util::UpdateFromSystemSettings( @@ -209,6 +212,49 @@ std::string WebUILoginView::GetClassName() const { return kViewClassName; } +void WebUILoginView::SetWebContentsBlocked( + content::WebContents* web_contents, + bool blocked) { + // RenderViewHost may be NULL during shutdown. + content::RenderViewHost* host = web_contents->GetRenderViewHost(); + if (host) { + host->Send(new ChromeViewMsg_SetVisuallyDeemphasized( + host->GetRoutingID(), blocked)); + } +} + +WebContentsModalDialogHost* + WebUILoginView::GetWebContentsModalDialogHost() { + return this; +} + +bool WebUILoginView::IsWebContentsVisible(content::WebContents* web_contents) { + return platform_util::IsVisible(web_contents->GetView()->GetNativeView()); +} + + +gfx::NativeView WebUILoginView::GetHostView() const { + return GetWidget()->GetNativeView(); +} + +gfx::Point WebUILoginView::GetDialogPosition(const gfx::Size& size) { + // Center the widget. + gfx::Size widget_size = GetWidget()->GetWindowBoundsInScreen().size(); + return gfx::Point(widget_size.width() / 2 - size.width() / 2, + widget_size.height() / 2 - size.height() / 2); +} + +void WebUILoginView::AddObserver( + WebContentsModalDialogHostObserver* observer) { + if (observer && !observer_list_.HasObserver(observer)) + observer_list_.AddObserver(observer); +} + +void WebUILoginView::RemoveObserver( + WebContentsModalDialogHostObserver* observer) { + observer_list_.RemoveObserver(observer); +} + bool WebUILoginView::AcceleratorPressed( const ui::Accelerator& accelerator) { AccelMap::const_iterator entry = accel_map_.find(accelerator); @@ -295,6 +341,10 @@ void WebUILoginView::SetUIEnabled(bool enabled) { void WebUILoginView::Layout() { DCHECK(webui_login_); webui_login_->SetBoundsRect(bounds()); + + FOR_EACH_OBSERVER(WebContentsModalDialogHostObserver, + observer_list_, + OnPositionRequiresUpdate()); } void WebUILoginView::OnLocaleChanged() { diff --git a/chrome/browser/chromeos/login/webui_login_view.h b/chrome/browser/chromeos/login/webui_login_view.h index 6192d0f..9b02a30 100644 --- a/chrome/browser/chromeos/login/webui_login_view.h +++ b/chrome/browser/chromeos/login/webui_login_view.h @@ -9,7 +9,10 @@ #include <string> #include "base/memory/scoped_ptr.h" +#include "base/observer_list.h" #include "chrome/browser/chromeos/login/scoped_gaia_auth_extension.h" +#include "chrome/browser/ui/web_contents_modal_dialog_host.h" +#include "chrome/browser/ui/web_contents_modal_dialog_manager_delegate.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" #include "content/public/browser/web_contents_delegate.h" @@ -35,7 +38,9 @@ namespace chromeos { // WebUI based start up and lock screens. It contains a WebView. class WebUILoginView : public views::View, public content::WebContentsDelegate, - public content::NotificationObserver { + public content::NotificationObserver, + public WebContentsModalDialogManagerDelegate, + public WebContentsModalDialogHost { public: // Internal class name. static const char kViewClassName[]; @@ -51,6 +56,22 @@ class WebUILoginView : public views::View, const ui::Accelerator& accelerator) OVERRIDE; virtual std::string GetClassName() const OVERRIDE; + // Overridden from WebContentsModalDialogManagerDelegate: + virtual void SetWebContentsBlocked(content::WebContents* web_contents, + bool blocked) OVERRIDE; + virtual WebContentsModalDialogHost* + GetWebContentsModalDialogHost() OVERRIDE; + virtual bool IsWebContentsVisible( + content::WebContents* web_contents) OVERRIDE; + + // Overridden from WebContentsModalDialogHost: + virtual gfx::NativeView GetHostView() const OVERRIDE; + virtual gfx::Point GetDialogPosition(const gfx::Size& size) OVERRIDE; + virtual void AddObserver( + WebContentsModalDialogHostObserver* observer) OVERRIDE; + virtual void RemoveObserver( + WebContentsModalDialogHostObserver* observer) OVERRIDE; + // Called when WebUI window is created. virtual void OnWindowCreated(); @@ -161,6 +182,8 @@ class WebUILoginView : public views::View, scoped_ptr<ScopedGaiaAuthExtension> auth_extension_; + ObserverList<WebContentsModalDialogHostObserver> observer_list_; + DISALLOW_COPY_AND_ASSIGN(WebUILoginView); }; |