1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/ui/webui/constrained_html_ui.h"
6
7 #include "chrome/browser/ui/gtk/constrained_window_gtk.h"
8 #include "chrome/browser/ui/gtk/gtk_util.h"
9 #include "chrome/browser/ui/gtk/tab_contents_container_gtk.h"
10 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
11 #include "chrome/browser/ui/webui/html_dialog_tab_contents_delegate.h"
12 #include "chrome/browser/ui/webui/html_dialog_ui.h"
13 #include "content/browser/renderer_host/render_view_host.h"
14 #include "content/browser/tab_contents/tab_contents.h"
15 #include "content/common/notification_source.h"
16 #include "ui/gfx/rect.h"
17
18 class ConstrainedHtmlDelegateGtk : public ConstrainedWindowGtkDelegate,
19 public HtmlDialogTabContentsDelegate,
20 public ConstrainedHtmlUIDelegate {
21 public:
22 ConstrainedHtmlDelegateGtk(Profile* profile,
23 HtmlDialogUIDelegate* delegate);
24
25 virtual ~ConstrainedHtmlDelegateGtk();
26
27 // ConstrainedWindowGtkDelegate ----------------------------------------------
GetWidgetRoot()28 virtual GtkWidget* GetWidgetRoot() {
29 return tab_contents_container_.widget();
30 }
GetFocusWidget()31 virtual GtkWidget* GetFocusWidget() {
32 return tab_.tab_contents()->GetContentNativeView();
33 }
DeleteDelegate()34 virtual void DeleteDelegate() {
35 html_delegate_->OnWindowClosed();
36 html_delegate_->OnDialogClosed("");
37 delete this;
38 }
39
40 // ConstrainedHtmlDelegate ---------------------------------------------
41 virtual HtmlDialogUIDelegate* GetHtmlDialogUIDelegate();
42 virtual void OnDialogClose();
GetBackgroundColor(GdkColor * color)43 virtual bool GetBackgroundColor(GdkColor* color) {
44 *color = gtk_util::kGdkWhite;
45 return true;
46 }
47
48 // HtmlDialogTabContentsDelegate ---------------------------------------------
MoveContents(TabContents * source,const gfx::Rect & pos)49 void MoveContents(TabContents* source, const gfx::Rect& pos) {}
HandleKeyboardEvent(const NativeWebKeyboardEvent & event)50 void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {}
51
set_window(ConstrainedWindow * window)52 void set_window(ConstrainedWindow* window) {
53 window_ = window;
54 }
55
56 private:
57 TabContentsWrapper tab_;
58 TabContentsContainerGtk tab_contents_container_;
59 HtmlDialogUIDelegate* html_delegate_;
60
61 // The constrained window that owns |this|. It's saved here because it needs
62 // to be closed in response to the WebUI OnDialogClose callback.
63 ConstrainedWindow* window_;
64 };
65
ConstrainedHtmlDelegateGtk(Profile * profile,HtmlDialogUIDelegate * delegate)66 ConstrainedHtmlDelegateGtk::ConstrainedHtmlDelegateGtk(
67 Profile* profile,
68 HtmlDialogUIDelegate* delegate)
69 : HtmlDialogTabContentsDelegate(profile),
70 tab_(new TabContents(profile, NULL, MSG_ROUTING_NONE, NULL, NULL)),
71 tab_contents_container_(NULL),
72 html_delegate_(delegate),
73 window_(NULL) {
74 tab_.tab_contents()->set_delegate(this);
75
76 // Set |this| as a property on the tab contents so that the ConstrainedHtmlUI
77 // can get a reference to |this|.
78 ConstrainedHtmlUI::GetPropertyAccessor().SetProperty(
79 tab_.tab_contents()->property_bag(), this);
80
81 tab_.tab_contents()->controller().LoadURL(
82 delegate->GetDialogContentURL(), GURL(), PageTransition::START_PAGE);
83 tab_contents_container_.SetTab(&tab_);
84
85 gfx::Size dialog_size;
86 delegate->GetDialogSize(&dialog_size);
87 gtk_widget_set_size_request(GTK_WIDGET(tab_contents_container_.widget()),
88 dialog_size.width(),
89 dialog_size.height());
90
91 gtk_widget_show_all(GetWidgetRoot());
92 }
93
~ConstrainedHtmlDelegateGtk()94 ConstrainedHtmlDelegateGtk::~ConstrainedHtmlDelegateGtk() {
95 }
96
97 HtmlDialogUIDelegate*
GetHtmlDialogUIDelegate()98 ConstrainedHtmlDelegateGtk::GetHtmlDialogUIDelegate() {
99 return html_delegate_;
100 }
101
OnDialogClose()102 void ConstrainedHtmlDelegateGtk::OnDialogClose() {
103 window_->CloseConstrainedWindow();
104 }
105
106 // static
CreateConstrainedHtmlDialog(Profile * profile,HtmlDialogUIDelegate * delegate,TabContents * overshadowed)107 ConstrainedWindow* ConstrainedHtmlUI::CreateConstrainedHtmlDialog(
108 Profile* profile,
109 HtmlDialogUIDelegate* delegate,
110 TabContents* overshadowed) {
111 ConstrainedHtmlDelegateGtk* constrained_delegate =
112 new ConstrainedHtmlDelegateGtk(profile, delegate);
113 ConstrainedWindow* constrained_window =
114 overshadowed->CreateConstrainedDialog(constrained_delegate);
115 constrained_delegate->set_window(constrained_window);
116 return constrained_window;
117 }
118