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