Home | History | Annotate | Download | only in ui
      1 // Copyright 2014 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/ui/login_web_dialog.h"
      6 
      7 #include <deque>
      8 
      9 #include "base/lazy_instance.h"
     10 #include "base/strings/utf_string_conversions.h"
     11 #include "chrome/browser/chromeos/login/helper.h"
     12 #include "chrome/browser/ui/browser_dialogs.h"
     13 #include "content/public/browser/browser_context.h"
     14 #include "content/public/browser/notification_source.h"
     15 #include "content/public/browser/notification_types.h"
     16 #include "content/public/browser/web_contents.h"
     17 #include "ui/gfx/native_widget_types.h"
     18 #include "ui/gfx/rect.h"
     19 #include "ui/gfx/size.h"
     20 #include "ui/views/widget/widget.h"
     21 
     22 using content::WebContents;
     23 using content::WebUIMessageHandler;
     24 
     25 namespace chromeos {
     26 
     27 namespace {
     28 
     29 // Default width/height ratio of screen size.
     30 const double kDefaultWidthRatio = 0.6;
     31 const double kDefaultHeightRatio = 0.6;
     32 
     33 // Default width/height ratio of minimal dialog size.
     34 const double kMinimumWidthRatio = 0.25;
     35 const double kMinimumHeightRatio = 0.25;
     36 
     37 static base::LazyInstance<std::deque<content::WebContents*> >
     38     g_web_contents_stack = LAZY_INSTANCE_INITIALIZER;
     39 
     40 }  // namespace
     41 
     42 ///////////////////////////////////////////////////////////////////////////////
     43 // LoginWebDialog, public:
     44 
     45 void LoginWebDialog::Delegate::OnDialogClosed() {
     46 }
     47 
     48 LoginWebDialog::LoginWebDialog(content::BrowserContext* browser_context,
     49                                Delegate* delegate,
     50                                gfx::NativeWindow parent_window,
     51                                const base::string16& title,
     52                                const GURL& url,
     53                                Style style)
     54     : browser_context_(browser_context),
     55       parent_window_(parent_window),
     56       delegate_(delegate),
     57       title_(title),
     58       url_(url),
     59       style_(style),
     60       is_open_(false) {
     61   gfx::Rect screen_bounds(chromeos::CalculateScreenBounds(gfx::Size()));
     62   width_ = static_cast<int>(kDefaultWidthRatio * screen_bounds.width());
     63   height_ = static_cast<int>(kDefaultHeightRatio * screen_bounds.height());
     64 }
     65 
     66 LoginWebDialog::~LoginWebDialog() {
     67   delegate_ = NULL;
     68 }
     69 
     70 void LoginWebDialog::Show() {
     71   chrome::ShowWebDialog(parent_window_, browser_context_, this);
     72   is_open_ = true;
     73 }
     74 
     75 void LoginWebDialog::SetDialogSize(int width, int height) {
     76   DCHECK(width >= 0 && height >= 0);
     77   width_ = width;
     78   height_ = height;
     79 }
     80 
     81 void LoginWebDialog::SetDialogTitle(const base::string16& title) {
     82   title_ = title;
     83 }
     84 
     85 ///////////////////////////////////////////////////////////////////////////////
     86 // LoginWebDialog, protected:
     87 
     88 ui::ModalType LoginWebDialog::GetDialogModalType() const {
     89   return ui::MODAL_TYPE_SYSTEM;
     90 }
     91 
     92 base::string16 LoginWebDialog::GetDialogTitle() const {
     93   return title_;
     94 }
     95 
     96 GURL LoginWebDialog::GetDialogContentURL() const {
     97   return url_;
     98 }
     99 
    100 void LoginWebDialog::GetWebUIMessageHandlers(
    101     std::vector<WebUIMessageHandler*>* handlers) const {
    102 }
    103 
    104 void LoginWebDialog::GetDialogSize(gfx::Size* size) const {
    105   size->SetSize(width_, height_);
    106 }
    107 
    108 void LoginWebDialog::GetMinimumDialogSize(gfx::Size* size) const {
    109   gfx::Rect screen_bounds(chromeos::CalculateScreenBounds(gfx::Size()));
    110   size->SetSize(kMinimumWidthRatio * screen_bounds.width(),
    111                 kMinimumHeightRatio * screen_bounds.height());
    112 }
    113 
    114 std::string LoginWebDialog::GetDialogArgs() const {
    115   return std::string();
    116 }
    117 
    118 // static.
    119 content::WebContents* LoginWebDialog::GetCurrentWebContents() {
    120   if (!g_web_contents_stack.Pointer()->size())
    121     return NULL;
    122 
    123   return g_web_contents_stack.Pointer()->front();
    124 }
    125 
    126 void LoginWebDialog::OnDialogShown(content::WebUI* webui,
    127                                    content::RenderViewHost* render_view_host) {
    128   g_web_contents_stack.Pointer()->push_front(webui->GetWebContents());
    129 }
    130 
    131 void LoginWebDialog::OnDialogClosed(const std::string& json_retval) {
    132   is_open_ = false;
    133   notification_registrar_.RemoveAll();
    134   if (delegate_)
    135     delegate_->OnDialogClosed();
    136   delete this;
    137 }
    138 
    139 void LoginWebDialog::OnCloseContents(WebContents* source,
    140                                      bool* out_close_dialog) {
    141   if (out_close_dialog)
    142     *out_close_dialog = true;
    143 
    144   if (g_web_contents_stack.Pointer()->size() &&
    145       source == g_web_contents_stack.Pointer()->front()) {
    146     g_web_contents_stack.Pointer()->pop_front();
    147   } else {
    148     NOTREACHED();
    149   }
    150 }
    151 
    152 bool LoginWebDialog::ShouldShowDialogTitle() const {
    153   return true;
    154 }
    155 
    156 bool LoginWebDialog::HandleContextMenu(
    157     const content::ContextMenuParams& params) {
    158   // Disable context menu.
    159   return true;
    160 }
    161 
    162 void LoginWebDialog::Observe(int type,
    163                              const content::NotificationSource& source,
    164                              const content::NotificationDetails& details) {
    165   DCHECK(type == content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME);
    166   // TODO(saintlou): Do we need a throbber for Aura?
    167   NOTIMPLEMENTED();
    168 }
    169 
    170 }  // namespace chromeos
    171