• 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/views/tab_contents/tab_contents_container.h"
9 #include "chrome/browser/ui/webui/html_dialog_tab_contents_delegate.h"
10 #include "chrome/browser/ui/webui/html_dialog_ui.h"
11 #include "content/browser/tab_contents/tab_contents.h"
12 #include "ui/gfx/rect.h"
13 #include "views/view.h"
14 #include "views/widget/widget_win.h"
15 #include "views/window/window_delegate.h"
16 
17 class ConstrainedHtmlDelegateWin : public TabContentsContainer,
18                                    public ConstrainedHtmlUIDelegate,
19                                    public ConstrainedWindowDelegate,
20                                    public HtmlDialogTabContentsDelegate {
21  public:
22   ConstrainedHtmlDelegateWin(Profile* profile,
23                              HtmlDialogUIDelegate* delegate);
24   ~ConstrainedHtmlDelegateWin();
25 
26   // ConstrainedHtmlUIDelegate interface.
27   virtual HtmlDialogUIDelegate* GetHtmlDialogUIDelegate();
28   virtual void OnDialogClose();
29 
30   // ConstrainedWindowDelegate (aka views::WindowDelegate) interface.
CanResize() const31   virtual bool CanResize() const { return true; }
GetContentsView()32   virtual views::View* GetContentsView() {
33     return this;
34   }
WindowClosing()35   virtual void WindowClosing() {
36     html_delegate_->OnWindowClosed();
37     html_delegate_->OnDialogClosed("");
38   }
39 
40   // HtmlDialogTabContentsDelegate interface.
MoveContents(TabContents * source,const gfx::Rect & pos)41   void MoveContents(TabContents* source, const gfx::Rect& pos) {}
HandleKeyboardEvent(const NativeWebKeyboardEvent & event)42   void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {}
43 
44   // Overridden from TabContentsContainer.
GetPreferredSize()45   virtual gfx::Size GetPreferredSize() {
46     gfx::Size size;
47     html_delegate_->GetDialogSize(&size);
48     return size;
49   }
50 
ViewHierarchyChanged(bool is_add,views::View * parent,views::View * child)51   virtual void ViewHierarchyChanged(bool is_add,
52                                     views::View* parent,
53                                     views::View* child) {
54     TabContentsContainer::ViewHierarchyChanged(is_add, parent, child);
55     if (is_add && child == this) {
56       ChangeTabContents(&html_tab_contents_);
57     }
58   }
59 
set_window(ConstrainedWindow * window)60   void set_window(ConstrainedWindow* window) {
61     window_ = window;
62   }
63 
64  private:
65   TabContents html_tab_contents_;
66 
67   HtmlDialogUIDelegate* html_delegate_;
68 
69   // The constrained window that owns |this|.  Saved so we can close it later.
70   ConstrainedWindow* window_;
71 };
72 
ConstrainedHtmlDelegateWin(Profile * profile,HtmlDialogUIDelegate * delegate)73 ConstrainedHtmlDelegateWin::ConstrainedHtmlDelegateWin(
74     Profile* profile,
75     HtmlDialogUIDelegate* delegate)
76     : HtmlDialogTabContentsDelegate(profile),
77       html_tab_contents_(profile, NULL, MSG_ROUTING_NONE, NULL, NULL),
78       html_delegate_(delegate),
79       window_(NULL) {
80   CHECK(delegate);
81   html_tab_contents_.set_delegate(this);
82 
83   // Set |this| as a property so the ConstrainedHtmlUI can retrieve it.
84   ConstrainedHtmlUI::GetPropertyAccessor().SetProperty(
85       html_tab_contents_.property_bag(), this);
86   html_tab_contents_.controller().LoadURL(delegate->GetDialogContentURL(),
87                                           GURL(),
88                                           PageTransition::START_PAGE);
89 }
90 
~ConstrainedHtmlDelegateWin()91 ConstrainedHtmlDelegateWin::~ConstrainedHtmlDelegateWin() {
92 }
93 
GetHtmlDialogUIDelegate()94 HtmlDialogUIDelegate* ConstrainedHtmlDelegateWin::GetHtmlDialogUIDelegate() {
95   return html_delegate_;
96 }
97 
OnDialogClose()98 void ConstrainedHtmlDelegateWin::OnDialogClose() {
99   window_->CloseConstrainedWindow();
100 }
101 
102 // static
CreateConstrainedHtmlDialog(Profile * profile,HtmlDialogUIDelegate * delegate,TabContents * container)103 ConstrainedWindow* ConstrainedHtmlUI::CreateConstrainedHtmlDialog(
104     Profile* profile,
105     HtmlDialogUIDelegate* delegate,
106     TabContents* container) {
107   ConstrainedHtmlDelegateWin* constrained_delegate =
108       new ConstrainedHtmlDelegateWin(profile, delegate);
109   ConstrainedWindow* constrained_window =
110       container->CreateConstrainedDialog(constrained_delegate);
111   constrained_delegate->set_window(constrained_window);
112   return constrained_window;
113 }
114