• 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/profiles/profile.h"
8 #include "chrome/browser/ui/gtk/constrained_window_gtk.h"
9 #include "chrome/browser/ui/gtk/gtk_util.h"
10 #include "chrome/browser/ui/views/tab_contents/tab_contents_container.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/tab_contents/tab_contents.h"
14 #include "ui/gfx/rect.h"
15 #include "views/widget/widget_gtk.h"
16 
17 // ConstrainedHtmlDelegateGtk works with ConstrainedWindowGtk to present
18 // a TabContents in a ContraintedHtmlUI.
19 class ConstrainedHtmlDelegateGtk : public views::WidgetGtk,
20                                    public ConstrainedHtmlUIDelegate,
21                                    public ConstrainedWindowDelegate,
22                                    public HtmlDialogTabContentsDelegate {
23  public:
24   ConstrainedHtmlDelegateGtk(Profile* profile,
25                              HtmlDialogUIDelegate* delegate);
26   ~ConstrainedHtmlDelegateGtk();
27 
28   // ConstrainedHtmlUIDelegate interface.
29   virtual HtmlDialogUIDelegate* GetHtmlDialogUIDelegate();
30   virtual void OnDialogClose();
GetBackgroundColor(GdkColor * color)31   virtual bool GetBackgroundColor(GdkColor* color) {
32     *color = gtk_util::kGdkWhite;
33     return true;
34   }
35 
36   // ConstrainedWindowGtkDelegate implementation.
GetWidgetRoot()37   virtual GtkWidget* GetWidgetRoot() {
38     return GetNativeView();
39   }
GetFocusWidget()40   virtual GtkWidget* GetFocusWidget() {
41     return html_tab_contents_.GetContentNativeView();
42   }
DeleteDelegate()43   virtual void DeleteDelegate() {
44     html_delegate_->OnWindowClosed();
45     html_delegate_->OnDialogClosed("");
46     tab_container_->ChangeTabContents(NULL);
47   }
ShouldHaveBorderPadding() const48   virtual bool ShouldHaveBorderPadding() const {
49     return false;
50   }
51 
52   // HtmlDialogTabContentsDelegate interface.
MoveContents(TabContents * source,const gfx::Rect & pos)53   void MoveContents(TabContents* source, const gfx::Rect& pos) {}
HandleKeyboardEvent(const NativeWebKeyboardEvent & event)54   void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {}
55 
set_window(ConstrainedWindow * window)56   void set_window(ConstrainedWindow* window) {
57     window_ = window;
58   }
59 
60  private:
61   TabContents html_tab_contents_;
62   TabContentsContainer* tab_container_;
63 
64   HtmlDialogUIDelegate* html_delegate_;
65 
66   // The constrained window that owns |this|.  Saved so we can close it later.
67   ConstrainedWindow* window_;
68 };
69 
ConstrainedHtmlDelegateGtk(Profile * profile,HtmlDialogUIDelegate * delegate)70 ConstrainedHtmlDelegateGtk::ConstrainedHtmlDelegateGtk(
71     Profile* profile,
72     HtmlDialogUIDelegate* delegate)
73     : views::WidgetGtk(views::WidgetGtk::TYPE_CHILD),
74       HtmlDialogTabContentsDelegate(profile),
75       html_tab_contents_(profile, NULL, MSG_ROUTING_NONE, NULL, NULL),
76       tab_container_(NULL),
77       html_delegate_(delegate),
78       window_(NULL) {
79   CHECK(delegate);
80   html_tab_contents_.set_delegate(this);
81 
82   // Set |this| as a property so the ConstrainedHtmlUI can retrieve it.
83   ConstrainedHtmlUI::GetPropertyAccessor().SetProperty(
84       html_tab_contents_.property_bag(), this);
85   html_tab_contents_.controller().LoadURL(delegate->GetDialogContentURL(),
86                                           GURL(),
87                                           PageTransition::START_PAGE);
88 
89   Init(NULL, gfx::Rect());
90 
91   tab_container_ = new TabContentsContainer;
92   SetContentsView(tab_container_);
93   tab_container_->ChangeTabContents(&html_tab_contents_);
94 
95   gfx::Size dialog_size;
96   html_delegate_->GetDialogSize(&dialog_size);
97   gtk_widget_set_size_request(GetWidgetRoot(),
98                               dialog_size.width(),
99                               dialog_size.height());
100 }
101 
~ConstrainedHtmlDelegateGtk()102 ConstrainedHtmlDelegateGtk::~ConstrainedHtmlDelegateGtk() {
103 }
104 
GetHtmlDialogUIDelegate()105 HtmlDialogUIDelegate* ConstrainedHtmlDelegateGtk::GetHtmlDialogUIDelegate() {
106   return html_delegate_;
107 }
108 
OnDialogClose()109 void ConstrainedHtmlDelegateGtk::OnDialogClose() {
110   window_->CloseConstrainedWindow();
111 }
112 
113 // static
CreateConstrainedHtmlDialog(Profile * profile,HtmlDialogUIDelegate * delegate,TabContents * container)114 ConstrainedWindow* ConstrainedHtmlUI::CreateConstrainedHtmlDialog(
115     Profile* profile,
116     HtmlDialogUIDelegate* delegate,
117     TabContents* container) {
118   ConstrainedHtmlDelegateGtk* constrained_delegate =
119       new ConstrainedHtmlDelegateGtk(profile, delegate);
120   ConstrainedWindow* constrained_window =
121       container->CreateConstrainedDialog(constrained_delegate);
122   constrained_delegate->set_window(constrained_window);
123   return constrained_window;
124 }
125