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