172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/html_dialog_view.h"
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <vector>
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/browser_dialogs.h"
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/window.h"
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/native_web_keyboard_event.h"
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/keycodes/keyboard_codes.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/events/event.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/widget/root_view.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/widget/widget.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/window/window.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_LINUX)
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "views/window/window_gtk.h"
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace browser {
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Declared in browser_dialogs.h so that others don't need to depend on our .h.
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsengfx::NativeWindow ShowHtmlDialog(gfx::NativeWindow parent, Profile* profile,
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                 HtmlDialogUIDelegate* delegate) {
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HtmlDialogView* html_view =
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      new HtmlDialogView(profile, delegate);
30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  browser::CreateViewsWindow(parent, gfx::Rect(), html_view);
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  html_view->InitDialog();
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  html_view->window()->Show();
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return html_view->window()->GetNativeWindow();
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace browser
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HtmlDialogView, public:
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochHtmlDialogView::HtmlDialogView(Profile* profile,
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               HtmlDialogUIDelegate* delegate)
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : DOMView(),
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HtmlDialogTabContentsDelegate(profile),
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      delegate_(delegate) {
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochHtmlDialogView::~HtmlDialogView() {
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HtmlDialogView, views::View implementation:
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochgfx::Size HtmlDialogView::GetPreferredSize() {
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Size out;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (delegate_)
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delegate_->GetDialogSize(&out);
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return out;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool HtmlDialogView::AcceleratorPressed(const views::Accelerator& accelerator) {
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Pressing ESC closes the dialog.
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK_EQ(ui::VKEY_ESCAPE, accelerator.GetKeyCode());
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  OnWindowClosed();
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OnDialogClosed(std::string());
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HtmlDialogView, views::WindowDelegate implementation:
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool HtmlDialogView::CanResize() const {
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool HtmlDialogView::IsModal() const {
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (delegate_)
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return delegate_->IsDialogModal();
79201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return false;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::wstring HtmlDialogView::GetWindowTitle() const {
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (delegate_)
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return delegate_->GetDialogTitle();
85201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return std::wstring();
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid HtmlDialogView::WindowClosing() {
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If we still have a delegate that means we haven't notified it of the
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // dialog closing. This happens if the user clicks the Close button on the
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // dialog.
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (delegate_) {
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    OnWindowClosed();
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OnDialogClosed("");
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochviews::View* HtmlDialogView::GetContentsView() {
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return this;
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochviews::View* HtmlDialogView::GetInitiallyFocusedView() {
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return this;
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
106513209b27ff55e2841eac0e4120199c23acce758Ben Murdochbool HtmlDialogView::ShouldShowWindowTitle() const {
107513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return ShouldShowDialogTitle();
108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HtmlDialogUIDelegate implementation:
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool HtmlDialogView::IsDialogModal() const {
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return IsModal();
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::wstring HtmlDialogView::GetDialogTitle() const {
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return GetWindowTitle();
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGURL HtmlDialogView::GetDialogContentURL() const {
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (delegate_)
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return delegate_->GetDialogContentURL();
124201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return GURL();
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid HtmlDialogView::GetWebUIMessageHandlers(
12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    std::vector<WebUIMessageHandler*>* handlers) const {
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (delegate_)
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    delegate_->GetWebUIMessageHandlers(handlers);
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid HtmlDialogView::GetDialogSize(gfx::Size* size) const {
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (delegate_)
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delegate_->GetDialogSize(size);
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::string HtmlDialogView::GetDialogArgs() const {
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (delegate_)
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return delegate_->GetDialogArgs();
141201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return std::string();
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid HtmlDialogView::OnDialogClosed(const std::string& json_retval) {
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HtmlDialogTabContentsDelegate::Detach();
1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (delegate_) {
1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    HtmlDialogUIDelegate* dialog_delegate = delegate_;
1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    delegate_ = NULL;  // We will not communicate further with the delegate.
1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    dialog_delegate->OnDialogClosed(json_retval);
1503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  window()->CloseWindow();
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid HtmlDialogView::OnWindowClosed() {
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (delegate_)
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      delegate_->OnWindowClosed();
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid HtmlDialogView::OnCloseContents(TabContents* source,
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     bool* out_close_dialog) {
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (delegate_)
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delegate_->OnCloseContents(source, out_close_dialog);
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
165513209b27ff55e2841eac0e4120199c23acce758Ben Murdochbool HtmlDialogView::ShouldShowDialogTitle() const {
166513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (delegate_)
167513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return delegate_->ShouldShowDialogTitle();
168201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
169201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
170201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
171201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool HtmlDialogView::HandleContextMenu(const ContextMenuParams& params) {
172201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (delegate_)
173201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return delegate_->HandleContextMenu(params);
174201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return HtmlDialogTabContentsDelegate::HandleContextMenu(params);
175513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
176513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TabContentsDelegate implementation:
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid HtmlDialogView::MoveContents(TabContents* source, const gfx::Rect& pos) {
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The contained web page wishes to resize itself. We let it do this because
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // if it's a dialog we know about, we trust it not to be mean to the user.
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GetWidget()->SetBounds(pos);
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A simplified version of BrowserView::HandleKeyboardEvent().
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// We don't handle global keyboard shortcuts here, but that's fine since
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// they're all browser-specific. (This may change in the future.)
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid HtmlDialogView::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Any unhandled keyboard/character messages should be defproced.
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This allows stuff like F10, etc to work correctly.
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DefWindowProc(event.os_event.hwnd, event.os_event.message,
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  event.os_event.wParam, event.os_event.lParam);
1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#elif defined(OS_LINUX)
1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::WindowGtk* window_gtk = static_cast<views::WindowGtk*>(window());
197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (event.os_event && !event.skip_in_browser) {
198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    views::KeyEvent views_event(reinterpret_cast<GdkEvent*>(event.os_event));
199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    window_gtk->HandleKeyboardEvent(views_event);
200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid HtmlDialogView::CloseContents(TabContents* source) {
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool close_dialog = false;
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OnCloseContents(source, &close_dialog);
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (close_dialog)
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OnDialogClosed(std::string());
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HtmlDialogView:
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid HtmlDialogView::InitDialog() {
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now Init the DOMView. This view runs in its own process to render the html.
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DOMView::Init(profile(), NULL);
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab_contents_->set_delegate(this);
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set the delegate. This must be done before loading the page. See
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the comment above HtmlDialogUI in its header file for why.
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HtmlDialogUI::GetPropertyAccessor().SetProperty(tab_contents_->property_bag(),
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                  this);
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Pressing the ESC key will close the dialog.
22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  AddAccelerator(views::Accelerator(ui::VKEY_ESCAPE, false, false, false));
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DOMView::LoadURL(GetDialogContentURL());
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
230