summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwittman@chromium.org <wittman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-07 03:58:12 +0000
committerwittman@chromium.org <wittman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-07 03:58:12 +0000
commit07898e034547606c522acd2ec3c92d1a6def7d07 (patch)
treec88d85f47b9577cabce397be71517ccd84e27856
parent329f16b1e79bdf8af4f80a2d10ee26142954a06c (diff)
downloadchromium_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
-rw-r--r--chrome/browser/chromeos/login/simple_web_view_dialog.cc57
-rw-r--r--chrome/browser/chromeos/login/simple_web_view_dialog.h28
-rw-r--r--chrome/browser/chromeos/login/webui_login_view.cc50
-rw-r--r--chrome/browser/chromeos/login/webui_login_view.h25
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);
};