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