• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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