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"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/render_frame_host.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/events/event.h"
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/webview/webview.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/fill_layout.h"
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/widget/native_widget_private.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/root_view.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/web_dialogs/web_dialog_delegate.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/web_dialogs/web_dialog_ui.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NativeWebKeyboardEvent;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebUIMessageHandler;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ui::WebDialogDelegate;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ui::WebDialogUI;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ui::WebDialogWebContentsDelegate;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebDialogView, public:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebDialogView::WebDialogView(
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::BrowserContext* context,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebDialogDelegate* delegate,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsHandler* handler)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ClientView(NULL, NULL),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebDialogWebContentsDelegate(context, handler),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_(delegate),
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_view_(new views::WebView(context)),
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      is_attempting_close_dialog_(false),
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      before_unload_fired_(false),
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      closed_via_webui_(false),
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      close_contents_called_(false) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_view_->set_allow_accelerators(true);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(web_view_);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_contents_view(web_view_);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetLayoutManager(new views::FillLayout);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pressing the ESC key will close the dialog.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebDialogView::~WebDialogView() {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::WebContents* WebDialogView::web_contents() {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_view_->web_contents();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebDialogView, views::View implementation:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size WebDialogView::GetPreferredSize() const {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size out;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegate_->GetDialogSize(&out);
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return out;
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size WebDialogView::GetMinimumSize() const {
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Size out;
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (delegate_)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->GetMinimumDialogSize(&out);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return out;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebDialogView::AcceleratorPressed(const ui::Accelerator& accelerator) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pressing ESC closes the dialog.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(ui::VKEY_ESCAPE, accelerator.key_code());
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetWidget())
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWidget()->Close();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void WebDialogView::ViewHierarchyChanged(
92a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const ViewHierarchyChangedDetails& details) {
93a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (details.is_add && GetWidget())
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InitDialog();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebDialogView::CanClose() {
98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Don't close UI if |delegate_| does not allow users to close it by
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // clicking on "x" button or pressing Esc shortcut key on hosting dialog.
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!delegate_->CanCloseDialog() && !close_contents_called_)
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return false;
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If CloseContents() is called before CanClose(), which is called by
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // RenderViewHostImpl::ClosePageIgnoringUnloadEvents, it indicates
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // beforeunload event should not be fired during closing.
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((is_attempting_close_dialog_ && before_unload_fired_) ||
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      close_contents_called_) {
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    is_attempting_close_dialog_ = false;
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    before_unload_fired_ = false;
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!is_attempting_close_dialog_) {
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Fire beforeunload event when user attempts to close the dialog.
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    is_attempting_close_dialog_ = true;
116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    web_view_->web_contents()->DispatchBeforeUnload(false);
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebDialogView, views::WidgetDelegate implementation:
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebDialogView::CanResize() const {
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (delegate_)
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return delegate_->CanResizeDialog();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::ModalType WebDialogView::GetModalType() const {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetDialogModalType();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 WebDialogView::GetWindowTitle() const {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delegate_->GetDialogTitle();
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return base::string16();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string WebDialogView::GetWindowName() const {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delegate_->GetDialogName();
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::string();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::WindowClosing() {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we still have a delegate that means we haven't notified it of the
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dialog closing. This happens if the user clicks the Close button on the
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dialog.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnDialogClosed("");
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* WebDialogView::GetContentsView() {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::ClientView* WebDialogView::CreateClientView(views::Widget* widget) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* WebDialogView::GetInitiallyFocusedView() {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_view_;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebDialogView::ShouldShowWindowTitle() const {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ShouldShowDialogTitle();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::Widget* WebDialogView::GetWidget() {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return View::GetWidget();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const views::Widget* WebDialogView::GetWidget() const {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return View::GetWidget();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebDialogDelegate implementation:
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::ModalType WebDialogView::GetDialogModalType() const {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delegate_->GetDialogModalType();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ui::MODAL_TYPE_NONE;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 WebDialogView::GetDialogTitle() const {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetWindowTitle();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL WebDialogView::GetDialogContentURL() const {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delegate_->GetDialogContentURL();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GURL();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::GetWebUIMessageHandlers(
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<WebUIMessageHandler*>* handlers) const {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->GetWebUIMessageHandlers(handlers);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::GetDialogSize(gfx::Size* size) const {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->GetDialogSize(size);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::GetMinimumDialogSize(gfx::Size* size) const {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->GetMinimumDialogSize(size);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string WebDialogView::GetDialogArgs() const {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delegate_->GetDialogArgs();
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::string();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::OnDialogShown(content::WebUI* webui,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  content::RenderViewHost* render_view_host) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->OnDialogShown(webui, render_view_host);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::OnDialogClosed(const std::string& json_retval) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Detach();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Store the dialog content area size.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->StoreDialogSize(GetContentsBounds().size());
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetWidget())
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetWidget()->Close();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_) {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->OnDialogClosed(json_retval);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_ = NULL;  // We will not communicate further with the delegate.
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebDialogView::OnDialogCloseFromWebUI(const std::string& json_retval) {
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  closed_via_webui_ = true;
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dialog_close_retval_ = json_retval;
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetWidget())
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWidget()->Close();
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::OnCloseContents(WebContents* source,
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    bool* out_close_dialog) {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->OnCloseContents(source, out_close_dialog);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebDialogView::ShouldShowDialogTitle() const {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delegate_->ShouldShowDialogTitle();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebDialogView::HandleContextMenu(
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::ContextMenuParams& params) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delegate_->HandleContextMenu(params);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WebDialogWebContentsDelegate::HandleContextMenu(params);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content::WebContentsDelegate implementation:
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::MoveContents(WebContents* source, const gfx::Rect& pos) {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The contained web page wishes to resize itself. We let it do this because
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if it's a dialog we know about, we trust it not to be mean to the user.
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWidget()->SetBounds(pos);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simplified version of BrowserView::HandleKeyboardEvent().
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We don't handle global keyboard shortcuts here, but that's fine since
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// they're all browser-specific. (This may change in the future.)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::HandleKeyboardEvent(content::WebContents* source,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const NativeWebKeyboardEvent& event) {
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!event.os_event)
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GetWidget()->native_widget_private()->RepostNativeEvent(event.os_event);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::CloseContents(WebContents* source) {
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  close_contents_called_ = true;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool close_dialog = false;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnCloseContents(source, &close_dialog);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (close_dialog)
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OnDialogClosed(closed_via_webui_ ? dialog_close_retval_ : std::string());
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::WebContents* WebDialogView::OpenURLFromTab(
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WebContents* source,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::OpenURLParams& params) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WebContents* new_contents = NULL;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_ &&
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_->HandleOpenURLFromTab(source, params, &new_contents)) {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new_contents;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WebDialogWebContentsDelegate::OpenURLFromTab(source, params);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::AddNewContents(content::WebContents* source,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   content::WebContents* new_contents,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   WindowOpenDisposition disposition,
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const gfx::Rect& initial_pos,
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   bool user_gesture,
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   bool* was_blocked) {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_ && delegate_->HandleAddNewContents(
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          source, new_contents, disposition, initial_pos, user_gesture)) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebDialogWebContentsDelegate::AddNewContents(
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      source, new_contents, disposition, initial_pos, user_gesture,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      was_blocked);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
321effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid WebDialogView::LoadingStateChanged(content::WebContents* source,
322effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    bool to_different_document) {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->OnLoadingStateChanged(source);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebDialogView::BeforeUnloadFired(content::WebContents* tab,
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      bool proceed,
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      bool* proceed_to_fire_unload) {
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  before_unload_fired_ = true;
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *proceed_to_fire_unload = proceed;
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebDialogView, private:
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDialogView::InitDialog() {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WebContents* web_contents = web_view_->GetWebContents();
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents->GetDelegate() == this)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents->SetDelegate(this);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the delegate. This must be done before loading the page. See
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the comment above WebDialogUI in its header file for why.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebDialogUI::SetDelegate(web_contents, this);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_view_->LoadInitialURL(GetDialogContentURL());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
352