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: 28 HtmlDialogWithoutContextMenuView(Profile* profile, 29 HtmlDialogUIDelegate* delegate) 30 : HtmlDialogView(profile, delegate) {} 31 virtual ~HtmlDialogWithoutContextMenuView() {} 32 33 // TabContentsDelegate implementation. 34 bool HandleContextMenu(const ContextMenuParams& params) { 35 // Disable context menu. 36 return true; 37 } 38 }; 39 40 } // namespace 41 42 /////////////////////////////////////////////////////////////////////////////// 43 // LoginHtmlDialog, public: 44 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 62 LoginHtmlDialog::~LoginHtmlDialog() { 63 delegate_ = NULL; 64 } 65 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 92 void LoginHtmlDialog::SetDialogSize(int width, int height) { 93 DCHECK(width >= 0 && height >= 0); 94 width_ = width; 95 height_ = height; 96 } 97 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 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 116 void LoginHtmlDialog::OnCloseContents(TabContents* source, 117 bool* out_close_dialog) { 118 if (out_close_dialog) 119 *out_close_dialog = true; 120 } 121 122 void LoginHtmlDialog::GetDialogSize(gfx::Size* size) const { 123 size->SetSize(width_, height_); 124 } 125 126 } // namespace chromeos 127