web_dialog_view.cc revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/webview/web_dialog_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/native_web_keyboard_event.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_view_host.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/keycodes/keyboard_codes.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/webview/webview.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/fill_layout.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/root_view.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/web_dialogs/web_dialog_delegate.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/web_dialogs/web_dialog_ui.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event.h"
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/native_widget_aura.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NativeWebKeyboardEvent;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebUIMessageHandler;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ui::WebDialogDelegate;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ui::WebDialogUI;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ui::WebDialogWebContentsDelegate;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebDialogView, public:
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebDialogView::WebDialogView(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::BrowserContext* context,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebDialogDelegate* delegate,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsHandler* handler)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ClientView(NULL, NULL),
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebDialogWebContentsDelegate(context, handler),
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      initialized_(false),
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_(delegate),
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_view_(new views::WebView(context)),
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      is_attempting_close_dialog_(false),
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      before_unload_fired_(false),
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      closed_via_webui_(false),
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      close_contents_called_(false) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_view_->set_allow_accelerators(true);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(web_view_);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_contents_view(web_view_);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetLayoutManager(new views::FillLayout);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pressing the ESC key will close the dialog.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebDialogView::~WebDialogView() {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::WebContents* WebDialogView::web_contents() {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_view_->web_contents();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebDialogView, views::View implementation:
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size WebDialogView::GetPreferredSize() {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size out;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->GetMinimumDialogSize(&out);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return out;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebDialogView::AcceleratorPressed(const ui::Accelerator& accelerator) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pressing ESC closes the dialog.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(ui::VKEY_ESCAPE, accelerator.key_code());
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetWidget())
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWidget()->Close();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void WebDialogView::ViewHierarchyChanged(
90a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const ViewHierarchyChangedDetails& details) {
91a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (details.is_add && GetWidget())
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InitDialog();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebDialogView::CanClose() {
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If CloseContents() is called before CanClose(), which is called by
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // RenderViewHostImpl::ClosePageIgnoringUnloadEvents, it indicates
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // beforeunload event should not be fired during closing.
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((is_attempting_close_dialog_ && before_unload_fired_) ||
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      close_contents_called_) {
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    is_attempting_close_dialog_ = false;
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    before_unload_fired_ = false;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!is_attempting_close_dialog_) {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Fire beforeunload event when user attempts to close the dialog.
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    is_attempting_close_dialog_ = true;
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_view_->
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        web_contents()->GetRenderViewHost()->FirePageBeforeUnload(false);
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebDialogView, views::WidgetDelegate implementation:
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebDialogView::CanResize() const {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::ModalType WebDialogView::GetModalType() const {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetDialogModalType();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 WebDialogView::GetWindowTitle() const {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delegate_->GetDialogTitle();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return string16();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string WebDialogView::GetWindowName() const {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delegate_->GetDialogName();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::string();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::WindowClosing() {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we still have a delegate that means we haven't notified it of the
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dialog closing. This happens if the user clicks the Close button on the
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dialog.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnDialogClosed("");
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* WebDialogView::GetContentsView() {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::ClientView* WebDialogView::CreateClientView(views::Widget* widget) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* WebDialogView::GetInitiallyFocusedView() {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_view_;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebDialogView::ShouldShowWindowTitle() const {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ShouldShowDialogTitle();
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::Widget* WebDialogView::GetWidget() {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return View::GetWidget();
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const views::Widget* WebDialogView::GetWidget() const {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return View::GetWidget();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebDialogDelegate implementation:
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::ModalType WebDialogView::GetDialogModalType() const {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delegate_->GetDialogModalType();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ui::MODAL_TYPE_NONE;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 WebDialogView::GetDialogTitle() const {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetWindowTitle();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL WebDialogView::GetDialogContentURL() const {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delegate_->GetDialogContentURL();
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GURL();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::GetWebUIMessageHandlers(
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<WebUIMessageHandler*>* handlers) const {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->GetWebUIMessageHandlers(handlers);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::GetDialogSize(gfx::Size* size) const {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->GetDialogSize(size);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::GetMinimumDialogSize(gfx::Size* size) const {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->GetMinimumDialogSize(size);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string WebDialogView::GetDialogArgs() const {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delegate_->GetDialogArgs();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::string();
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::OnDialogShown(content::WebUI* webui,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  content::RenderViewHost* render_view_host) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->OnDialogShown(webui, render_view_host);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::OnDialogClosed(const std::string& json_retval) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Detach();
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Store the dialog content area size.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->StoreDialogSize(GetContentsBounds().size());
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetWidget())
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetWidget()->Close();
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->OnDialogClosed(json_retval);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_ = NULL;  // We will not communicate further with the delegate.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebDialogView::OnDialogCloseFromWebUI(const std::string& json_retval) {
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  closed_via_webui_ = true;
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dialog_close_retval_ = json_retval;
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetWidget())
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWidget()->Close();
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::OnCloseContents(WebContents* source,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    bool* out_close_dialog) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->OnCloseContents(source, out_close_dialog);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebDialogView::ShouldShowDialogTitle() const {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delegate_->ShouldShowDialogTitle();
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebDialogView::HandleContextMenu(
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::ContextMenuParams& params) {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delegate_->HandleContextMenu(params);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WebDialogWebContentsDelegate::HandleContextMenu(params);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content::WebContentsDelegate implementation:
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::MoveContents(WebContents* source, const gfx::Rect& pos) {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The contained web page wishes to resize itself. We let it do this because
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if it's a dialog we know about, we trust it not to be mean to the user.
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWidget()->SetBounds(pos);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simplified version of BrowserView::HandleKeyboardEvent().
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We don't handle global keyboard shortcuts here, but that's fine since
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// they're all browser-specific. (This may change in the future.)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::HandleKeyboardEvent(content::WebContents* source,
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const NativeWebKeyboardEvent& event) {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA)
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!event.os_event)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::KeyEvent aura_event(event.os_event->native_event(), false);
2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ui::EventHandler* event_handler =
2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GetWidget()->native_widget()->GetEventHandler();
2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(event_handler);
2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (event_handler)
2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    event_handler->OnKeyEvent(&aura_event);
2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Any unhandled keyboard/character messages should be defproced.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This allows stuff like F10, etc to work correctly.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DefWindowProc(event.os_event.hwnd, event.os_event.message,
2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                event.os_event.wParam, event.os_event.lParam);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::CloseContents(WebContents* source) {
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  close_contents_called_ = true;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool close_dialog = false;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnCloseContents(source, &close_dialog);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (close_dialog)
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OnDialogClosed(closed_via_webui_ ? dialog_close_retval_ : std::string());
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::WebContents* WebDialogView::OpenURLFromTab(
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WebContents* source,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::OpenURLParams& params) {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WebContents* new_contents = NULL;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_ &&
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_->HandleOpenURLFromTab(source, params, &new_contents)) {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new_contents;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WebDialogWebContentsDelegate::OpenURLFromTab(source, params);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::AddNewContents(content::WebContents* source,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   content::WebContents* new_contents,
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   WindowOpenDisposition disposition,
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const gfx::Rect& initial_pos,
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   bool user_gesture,
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   bool* was_blocked) {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_ && delegate_->HandleAddNewContents(
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          source, new_contents, disposition, initial_pos, user_gesture)) {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebDialogWebContentsDelegate::AddNewContents(
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      source, new_contents, disposition, initial_pos, user_gesture,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      was_blocked);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::LoadingStateChanged(content::WebContents* source) {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->OnLoadingStateChanged(source);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebDialogView::BeforeUnloadFired(content::WebContents* tab,
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      bool proceed,
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      bool* proceed_to_fire_unload) {
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  before_unload_fired_ = true;
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *proceed_to_fire_unload = proceed;
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebDialogView, private:
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::InitDialog() {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WebContents* web_contents = web_view_->GetWebContents();
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents->GetDelegate() == this)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents->SetDelegate(this);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the delegate. This must be done before loading the page. See
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the comment above WebDialogUI in its header file for why.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebDialogUI::SetDelegate(web_contents, this);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_view_->LoadInitialURL(GetDialogContentURL());
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
356