• 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/chromeos/login/login_html_dialog.h"
6 
7 #include "chrome/browser/chromeos/frame/bubble_frame_view.h"
8 #include "chrome/browser/chromeos/frame/bubble_window.h"
9 #include "chrome/browser/chromeos/login/helper.h"
10 #include "chrome/browser/profiles/profile_manager.h"
11 #include "chrome/browser/ui/views/html_dialog_view.h"
12 #include "content/common/notification_service.h"
13 #include "ui/gfx/native_widget_types.h"
14 #include "ui/gfx/rect.h"
15 #include "ui/gfx/size.h"
16 #include "views/window/window.h"
17 
18 namespace chromeos {
19 
20 namespace {
21 // Default width/height ratio of screen size.
22 const double kDefaultWidthRatio = 0.6;
23 const double kDefaultHeightRatio = 0.6;
24 
25 // Custom HtmlDialogView with disabled context menu.
26 class HtmlDialogWithoutContextMenuView : public HtmlDialogView {
27  public:
HtmlDialogWithoutContextMenuView(Profile * profile,HtmlDialogUIDelegate * delegate)28   HtmlDialogWithoutContextMenuView(Profile* profile,
29                                    HtmlDialogUIDelegate* delegate)
30       : HtmlDialogView(profile, delegate) {}
~HtmlDialogWithoutContextMenuView()31   virtual ~HtmlDialogWithoutContextMenuView() {}
32 
33   // TabContentsDelegate implementation.
HandleContextMenu(const ContextMenuParams & params)34   bool HandleContextMenu(const ContextMenuParams& params) {
35     // Disable context menu.
36     return true;
37   }
38 };
39 
40 }  // namespace
41 
42 ///////////////////////////////////////////////////////////////////////////////
43 // LoginHtmlDialog, public:
44 
LoginHtmlDialog(Delegate * delegate,gfx::NativeWindow parent_window,const std::wstring & title,const GURL & url,Style style)45 LoginHtmlDialog::LoginHtmlDialog(Delegate* delegate,
46                                  gfx::NativeWindow parent_window,
47                                  const std::wstring& title,
48                                  const GURL& url,
49                                  Style style)
50     : delegate_(delegate),
51       parent_window_(parent_window),
52       title_(title),
53       url_(url),
54       style_(style),
55       bubble_frame_view_(NULL),
56       is_open_(false) {
57   gfx::Rect screen_bounds(chromeos::CalculateScreenBounds(gfx::Size()));
58   width_ = static_cast<int>(kDefaultWidthRatio * screen_bounds.width());
59   height_ = static_cast<int>(kDefaultHeightRatio * screen_bounds.height());
60 }
61 
~LoginHtmlDialog()62 LoginHtmlDialog::~LoginHtmlDialog() {
63   delegate_ = NULL;
64 }
65 
Show()66 void LoginHtmlDialog::Show() {
67   HtmlDialogWithoutContextMenuView* html_view =
68       new HtmlDialogWithoutContextMenuView(ProfileManager::GetDefaultProfile(),
69                                            this);
70   if (style_ & STYLE_BUBBLE) {
71     views::Window* bubble_window = BubbleWindow::Create(
72         parent_window_, gfx::Rect(),
73         static_cast<BubbleWindow::Style>(
74             BubbleWindow::STYLE_XBAR | BubbleWindow::STYLE_THROBBER),
75         html_view);
76     bubble_frame_view_ = static_cast<BubbleFrameView*>(
77         bubble_window->non_client_view()->frame_view());
78   } else {
79     views::Window::CreateChromeWindow(parent_window_, gfx::Rect(), html_view);
80   }
81   if (bubble_frame_view_) {
82     bubble_frame_view_->StartThrobber();
83     notification_registrar_.Add(this,
84                                 NotificationType::LOAD_COMPLETED_MAIN_FRAME,
85                                 NotificationService::AllSources());
86   }
87   html_view->InitDialog();
88   html_view->window()->Show();
89   is_open_ = true;
90 }
91 
SetDialogSize(int width,int height)92 void LoginHtmlDialog::SetDialogSize(int width, int height) {
93   DCHECK(width >= 0 && height >= 0);
94   width_ = width;
95   height_ = height;
96 }
97 
Observe(NotificationType type,const NotificationSource & source,const NotificationDetails & details)98 void LoginHtmlDialog::Observe(NotificationType type,
99                               const NotificationSource& source,
100                               const NotificationDetails& details) {
101   DCHECK(type.value == NotificationType::LOAD_COMPLETED_MAIN_FRAME);
102   if (bubble_frame_view_)
103     bubble_frame_view_->StopThrobber();
104 }
105 
106 ///////////////////////////////////////////////////////////////////////////////
107 // LoginHtmlDialog, protected:
108 
OnDialogClosed(const std::string & json_retval)109 void LoginHtmlDialog::OnDialogClosed(const std::string& json_retval) {
110   is_open_ = false;
111   notification_registrar_.RemoveAll();
112   if (delegate_)
113     delegate_->OnDialogClosed();
114 }
115 
OnCloseContents(TabContents * source,bool * out_close_dialog)116 void LoginHtmlDialog::OnCloseContents(TabContents* source,
117                                       bool* out_close_dialog) {
118   if (out_close_dialog)
119     *out_close_dialog = true;
120 }
121 
GetDialogSize(gfx::Size * size) const122 void LoginHtmlDialog::GetDialogSize(gfx::Size* size) const {
123   size->SetSize(width_, height_);
124 }
125 
126 }  // namespace chromeos
127