web_dialog_view.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// Copyright (c) 2012 The Chromium Authors. All rights reserved.
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// Use of this source code is governed by a BSD-style license that can be
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// found in the LICENSE file.
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#include "ui/views/controls/webview/web_dialog_view.h"
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <vector>
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "base/utf_string_conversions.h"
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "content/public/browser/browser_context.h"
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "content/public/browser/native_web_keyboard_event.h"
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "content/public/browser/notification_details.h"
132e67f06149ff649fb6f8782bad041d3d9124685eDmitry Shmidt#include "content/public/browser/notification_source.h"
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "content/public/browser/notification_types.h"
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "content/public/browser/web_contents.h"
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ui/base/keycodes/keyboard_codes.h"
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ui/views/controls/webview/webview.h"
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ui/views/layout/fill_layout.h"
1975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen#include "ui/views/widget/root_view.h"
2061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#include "ui/views/widget/widget.h"
2161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#include "ui/web_dialogs/web_dialog_delegate.h"
2275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen#include "ui/web_dialogs/web_dialog_ui.h"
23d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
2475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen#if defined(USE_AURA)
2575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen#include "ui/base/events/event.h"
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ui/views/widget/native_widget_aura.h"
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing content::NativeWebKeyboardEvent;
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing content::WebContents;
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing content::WebUIMessageHandler;
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing ui::WebDialogDelegate;
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing ui::WebDialogUI;
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing ui::WebDialogWebContentsDelegate;
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnamespace views {
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt////////////////////////////////////////////////////////////////////////////////
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// WebDialogView, public:
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWebDialogView::WebDialogView(
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    content::BrowserContext* context,
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    WebDialogDelegate* delegate,
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    WebContentsHandler* handler)
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    : ClientView(NULL, NULL),
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      WebDialogWebContentsDelegate(context, handler),
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      initialized_(false),
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      delegate_(delegate),
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      web_view_(new views::WebView(context)) {
5061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  web_view_->set_allow_accelerators(true);
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  AddChildView(web_view_);
5261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  set_contents_view(web_view_);
5361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  SetLayoutManager(new views::FillLayout);
5461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // Pressing the ESC key will close the dialog.
5561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE));
5661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
572e67f06149ff649fb6f8782bad041d3d9124685eDmitry Shmidt
582e67f06149ff649fb6f8782bad041d3d9124685eDmitry ShmidtWebDialogView::~WebDialogView() {
592e67f06149ff649fb6f8782bad041d3d9124685eDmitry Shmidt}
6061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtcontent::WebContents* WebDialogView::web_contents() {
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return web_view_->web_contents();
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt////////////////////////////////////////////////////////////////////////////////
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// WebDialogView, views::View implementation:
6704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
6804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtgfx::Size WebDialogView::GetPreferredSize() {
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  gfx::Size out;
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (delegate_)
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    delegate_->GetMinimumDialogSize(&out);
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return out;
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtbool WebDialogView::AcceleratorPressed(const ui::Accelerator& accelerator) {
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // Pressing ESC closes the dialog.
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  DCHECK_EQ(ui::VKEY_ESCAPE, accelerator.key_code());
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  OnDialogClosed(std::string());
7961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  return true;
8061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
8161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
8261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtvoid WebDialogView::ViewHierarchyChanged(bool is_add,
8361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                                         views::View* parent,
842e67f06149ff649fb6f8782bad041d3d9124685eDmitry Shmidt                                         views::View* child) {
852e67f06149ff649fb6f8782bad041d3d9124685eDmitry Shmidt  if (is_add && GetWidget())
862e67f06149ff649fb6f8782bad041d3d9124685eDmitry Shmidt    InitDialog();
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtbool WebDialogView::CanClose() {
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  bool close_dialog = true;
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (delegate_)
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    delegate_->OnCloseContents(web_view_->web_contents(),
9361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                               &close_dialog);
9461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
9561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  return close_dialog;
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt////////////////////////////////////////////////////////////////////////////////
9961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt// WebDialogView, views::WidgetDelegate implementation:
10061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
10161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtbool WebDialogView::CanResize() const {
10261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  return true;
10361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
10461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
10561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtui::ModalType WebDialogView::GetModalType() const {
10661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  return GetDialogModalType();
10761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
10861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
10961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstring16 WebDialogView::GetWindowTitle() const {
11061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (delegate_)
11161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return delegate_->GetDialogTitle();
11261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  return string16();
11361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
11461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
11561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstd::string WebDialogView::GetWindowName() const {
11661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (delegate_)
11761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return delegate_->GetDialogName();
11861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  return std::string();
11961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1212e67f06149ff649fb6f8782bad041d3d9124685eDmitry Shmidtvoid WebDialogView::WindowClosing() {
1222e67f06149ff649fb6f8782bad041d3d9124685eDmitry Shmidt  // If we still have a delegate that means we haven't notified it of the
1232e67f06149ff649fb6f8782bad041d3d9124685eDmitry Shmidt  // dialog closing. This happens if the user clicks the Close button on the
12461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // dialog.
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (delegate_)
1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    OnDialogClosed("");
1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtviews::View* WebDialogView::GetContentsView() {
1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return this;
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtviews::ClientView* WebDialogView::CreateClientView(views::Widget* widget) {
13461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  return this;
13561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
13661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
13761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtviews::View* WebDialogView::GetInitiallyFocusedView() {
1382e67f06149ff649fb6f8782bad041d3d9124685eDmitry Shmidt  return web_view_;
1392e67f06149ff649fb6f8782bad041d3d9124685eDmitry Shmidt}
1402e67f06149ff649fb6f8782bad041d3d9124685eDmitry Shmidt
1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtbool WebDialogView::ShouldShowWindowTitle() const {
1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return ShouldShowDialogTitle();
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtviews::Widget* WebDialogView::GetWidget() {
1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return View::GetWidget();
1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst views::Widget* WebDialogView::GetWidget() const {
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return View::GetWidget();
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt////////////////////////////////////////////////////////////////////////////////
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// WebDialogDelegate implementation:
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtui::ModalType WebDialogView::GetDialogModalType() const {
157b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt  if (delegate_)
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return delegate_->GetDialogModalType();
1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return ui::MODAL_TYPE_NONE;
1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstring16 WebDialogView::GetDialogTitle() const {
163b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt  return GetWindowTitle();
164b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt}
165a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt
166f86232838cf712377867cb42417c1613ab5dc425Dmitry ShmidtGURL WebDialogView::GetDialogContentURL() const {
167a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt  if (delegate_)
168b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt    return delegate_->GetDialogContentURL();
169b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt  return GURL();
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
17261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtvoid WebDialogView::GetWebUIMessageHandlers(
17361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    std::vector<WebUIMessageHandler*>* handlers) const {
1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (delegate_)
1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    delegate_->GetWebUIMessageHandlers(handlers);
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WebDialogView::GetDialogSize(gfx::Size* size) const {
179b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt  if (delegate_)
1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    delegate_->GetDialogSize(size);
1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18304949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid WebDialogView::GetMinimumDialogSize(gfx::Size* size) const {
18404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  if (delegate_)
18504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    delegate_->GetMinimumDialogSize(size);
18604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
18704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
18804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstd::string WebDialogView::GetDialogArgs() const {
18904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  if (delegate_)
19004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    return delegate_->GetDialogArgs();
19104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  return std::string();
192b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt}
19304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
19404949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid WebDialogView::OnDialogShown(content::WebUI* webui,
19504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt                                  content::RenderViewHost* render_view_host) {
19604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  if (delegate_)
1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    delegate_->OnDialogShown(webui, render_view_host);
1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WebDialogView::OnDialogClosed(const std::string& json_retval) {
201b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt  Detach();
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (delegate_) {
2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    // Store the dialog content area size.
2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    delegate_->StoreDialogSize(GetContentsBounds().size());
2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
206b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt
2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (GetWidget())
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    GetWidget()->Close();
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (delegate_) {
2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    delegate_->OnDialogClosed(json_retval);
2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    delegate_ = NULL;  // We will not communicate further with the delegate.
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WebDialogView::OnCloseContents(WebContents* source,
21761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                                    bool* out_close_dialog) {
21861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (delegate_)
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    delegate_->OnCloseContents(source, out_close_dialog);
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtbool WebDialogView::ShouldShowDialogTitle() const {
223b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt  if (delegate_)
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return delegate_->ShouldShowDialogTitle();
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return true;
2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2274b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtbool WebDialogView::HandleContextMenu(
2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const content::ContextMenuParams& params) {
230b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt  if (delegate_)
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return delegate_->HandleContextMenu(params);
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return WebDialogWebContentsDelegate::HandleContextMenu(params);
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt////////////////////////////////////////////////////////////////////////////////
2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// content::WebContentsDelegate implementation:
2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WebDialogView::MoveContents(WebContents* source, const gfx::Rect& pos) {
239b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt  // The contained web page wishes to resize itself. We let it do this because
2404582d2a5dd8180c52eb95b1100fb183b9a289708Dmitry Shmidt  // if it's a dialog we know about, we trust it not to be mean to the user.
2414582d2a5dd8180c52eb95b1100fb183b9a289708Dmitry Shmidt  GetWidget()->SetBounds(pos);
2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// A simplified version of BrowserView::HandleKeyboardEvent().
2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// We don't handle global keyboard shortcuts here, but that's fine since
2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// they're all browser-specific. (This may change in the future.)
2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WebDialogView::HandleKeyboardEvent(content::WebContents* source,
2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                        const NativeWebKeyboardEvent& event) {
2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#if defined(USE_AURA)
2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  ui::KeyEvent aura_event(event.os_event->native_event(), false);
2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  views::NativeWidgetAura* aura_widget =
2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      static_cast<views::NativeWidgetAura*>(GetWidget()->native_widget());
2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  aura_widget->OnKeyEvent(&aura_event);
2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#elif defined(OS_WIN)
2551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt  // Any unhandled keyboard/character messages should be defproced.
2561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt  // This allows stuff like F10, etc to work correctly.
2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  DefWindowProc(event.os_event.hwnd, event.os_event.message,
2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                  event.os_event.wParam, event.os_event.lParam);
2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif
2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WebDialogView::CloseContents(WebContents* source) {
2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  bool close_dialog = false;
2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  OnCloseContents(source, &close_dialog);
2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (close_dialog)
2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    OnDialogClosed(std::string());
267444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt}
26804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtcontent::WebContents* WebDialogView::OpenURLFromTab(
2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    content::WebContents* source,
2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const content::OpenURLParams& params) {
2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  content::WebContents* new_contents = NULL;
273b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt  if (delegate_ &&
2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      delegate_->HandleOpenURLFromTab(source, params, &new_contents)) {
2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return new_contents;
2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return WebDialogWebContentsDelegate::OpenURLFromTab(source, params);
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
279b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt
280b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidtvoid WebDialogView::AddNewContents(content::WebContents* source,
2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                   content::WebContents* new_contents,
2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                   WindowOpenDisposition disposition,
2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                   const gfx::Rect& initial_pos,
2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                   bool user_gesture,
2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                   bool* was_blocked) {
286b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt  if (delegate_ && delegate_->HandleAddNewContents(
2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt          source, new_contents, disposition, initial_pos, user_gesture)) {
2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return;
2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  WebDialogWebContentsDelegate::AddNewContents(
2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      source, new_contents, disposition, initial_pos, user_gesture,
29291c40cdce17424d9a4718876becf0b7811cf68f2Dmitry Shmidt      was_blocked);
29391c40cdce17424d9a4718876becf0b7811cf68f2Dmitry Shmidt}
29491c40cdce17424d9a4718876becf0b7811cf68f2Dmitry Shmidt
29591c40cdce17424d9a4718876becf0b7811cf68f2Dmitry Shmidtvoid WebDialogView::LoadingStateChanged(content::WebContents* source) {
29691c40cdce17424d9a4718876becf0b7811cf68f2Dmitry Shmidt  if (delegate_)
29775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen    delegate_->OnLoadingStateChanged(source);
298444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt}
299444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt
300444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt////////////////////////////////////////////////////////////////////////////////
301444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt// WebDialogView, private:
302444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt
303444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidtvoid WebDialogView::InitDialog() {
30475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen  content::WebContents* web_contents = web_view_->GetWebContents();
30575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen  if (web_contents->GetDelegate() == this)
30675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen    return;
30775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
30875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen  web_contents->SetDelegate(this);
30975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
31075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen  // Set the delegate. This must be done before loading the page. See
311444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt  // the comment above WebDialogUI in its header file for why.
312b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt  WebDialogUI::SetDelegate(web_contents, this);
313444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt
31475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen  if (delegate_) {
31575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen    gfx::Size out;
31675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen    delegate_->GetDialogSize(&out);
3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    if (!out.IsEmpty() && GetWidget())
3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      GetWidget()->CenterWindow(out);
3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
321444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt  web_view_->LoadInitialURL(GetDialogContentURL());
3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
324444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt}  // namespace views
325b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt