Commit 61fce6b4 authored by wittman@chromium.org's avatar wittman@chromium.org

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@202948 0039d316-1c4b-4281-b951-d872f2087c98
parent 467f06d1
......@@ -159,6 +159,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() {
......@@ -234,6 +236,14 @@ void SimpleWebViewDialog::Init() {
Layout();
}
void SimpleWebViewDialog::Layout() {
views::WidgetDelegateView::Layout();
FOR_EACH_OBSERVER(web_modal::WebContentsModalDialogHostObserver,
observer_list_,
OnPositionRequiresUpdate());
}
views::View* SimpleWebViewDialog::GetContentsView() {
return this;
}
......@@ -342,6 +352,33 @@ void SimpleWebViewDialog::ExecuteCommandWithDisposition(
}
}
web_modal::WebContentsModalDialogHost*
SimpleWebViewDialog::GetWebContentsModalDialogHost() {
return this;
}
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(
web_modal::WebContentsModalDialogHostObserver* observer) {
if (observer && !observer_list_.HasObserver(observer))
observer_list_.AddObserver(observer);
}
void SimpleWebViewDialog::RemoveObserver(
web_modal::WebContentsModalDialogHostObserver* observer) {
observer_list_.RemoveObserver(observer);
}
void SimpleWebViewDialog::LoadImages() {
ui::ThemeProvider* tp = GetThemeProvider();
......
......@@ -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/chrome_web_modal_dialog_manager_delegate.h"
#include "chrome/browser/ui/toolbar/toolbar_model_delegate.h"
#include "chrome/browser/ui/views/location_bar/location_bar_view.h"
#include "components/web_modal/web_contents_modal_dialog_host.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 ChromeWebModalDialogManagerDelegate,
public web_modal::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,18 @@ class SimpleWebViewDialog : public views::ButtonListener,
int id,
WindowOpenDisposition) OVERRIDE;
// Implements ChromeWebModalDialogManagerDelegate:
virtual web_modal::WebContentsModalDialogHost*
GetWebContentsModalDialogHost() OVERRIDE;
// Implements web_modal::WebContentsModalDialogHost:
virtual gfx::NativeView GetHostView() const OVERRIDE;
virtual gfx::Point GetDialogPosition(const gfx::Size& size) OVERRIDE;
virtual void AddObserver(
web_modal::WebContentsModalDialogHostObserver* observer) OVERRIDE;
virtual void RemoveObserver(
web_modal::WebContentsModalDialogHostObserver* observer) OVERRIDE;
private:
void LoadImages();
void UpdateButtons();
......@@ -114,6 +134,8 @@ class SimpleWebViewDialog : public views::ButtonListener,
scoped_ptr<StubBubbleModelDelegate> bubble_model_delegate_;
ObserverList<web_modal::WebContentsModalDialogHostObserver> observer_list_;
DISALLOW_COPY_AND_ASSIGN(SimpleWebViewDialog);
};
......
......@@ -198,6 +198,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(
......@@ -213,6 +215,33 @@ const char* WebUILoginView::GetClassName() const {
return kViewClassName;
}
web_modal::WebContentsModalDialogHost*
WebUILoginView::GetWebContentsModalDialogHost() {
return this;
}
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(
web_modal::WebContentsModalDialogHostObserver* observer) {
if (observer && !observer_list_.HasObserver(observer))
observer_list_.AddObserver(observer);
}
void WebUILoginView::RemoveObserver(
web_modal::WebContentsModalDialogHostObserver* observer) {
observer_list_.RemoveObserver(observer);
}
bool WebUILoginView::AcceleratorPressed(
const ui::Accelerator& accelerator) {
AccelMap::const_iterator entry = accel_map_.find(accelerator);
......@@ -299,6 +328,10 @@ void WebUILoginView::SetUIEnabled(bool enabled) {
void WebUILoginView::Layout() {
DCHECK(webui_login_);
webui_login_->SetBoundsRect(bounds());
FOR_EACH_OBSERVER(web_modal::WebContentsModalDialogHostObserver,
observer_list_,
OnPositionRequiresUpdate());
}
void WebUILoginView::OnLocaleChanged() {
......
......@@ -9,7 +9,10 @@
#include <string>
#include "base/memory/scoped_ptr.h"
#include "base/observer_list.h"
#include "chrome/browser/extensions/scoped_gaia_auth_extension.h"
#include "chrome/browser/ui/chrome_web_modal_dialog_manager_delegate.h"
#include "components/web_modal/web_contents_modal_dialog_host.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 ChromeWebModalDialogManagerDelegate,
public web_modal::WebContentsModalDialogHost {
public:
// Internal class name.
static const char kViewClassName[];
......@@ -51,6 +56,18 @@ class WebUILoginView : public views::View,
const ui::Accelerator& accelerator) OVERRIDE;
virtual const char* GetClassName() const OVERRIDE;
// Overridden from ChromeWebModalDialogManagerDelegate:
virtual web_modal::WebContentsModalDialogHost*
GetWebContentsModalDialogHost() OVERRIDE;
// Overridden from web_modal::WebContentsModalDialogHost:
virtual gfx::NativeView GetHostView() const OVERRIDE;
virtual gfx::Point GetDialogPosition(const gfx::Size& size) OVERRIDE;
virtual void AddObserver(
web_modal::WebContentsModalDialogHostObserver* observer) OVERRIDE;
virtual void RemoveObserver(
web_modal::WebContentsModalDialogHostObserver* observer) OVERRIDE;
// Called when WebUI window is created.
virtual void OnWindowCreated();
......@@ -161,6 +178,8 @@ class WebUILoginView : public views::View,
scoped_ptr<ScopedGaiaAuthExtension> auth_extension_;
ObserverList<web_modal::WebContentsModalDialogHostObserver> observer_list_;
DISALLOW_COPY_AND_ASSIGN(WebUILoginView);
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment