1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/login_web_dialog.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <deque>
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/lazy_instance.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/helper.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_dialogs.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/browser_context.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/web_contents.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebUIMessageHandler;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Default width/height ratio of screen size.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const double kDefaultWidthRatio = 0.6;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const double kDefaultHeightRatio = 0.6;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Default width/height ratio of minimal dialog size.
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const double kMinimumWidthRatio = 0.25;
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const double kMinimumHeightRatio = 0.25;
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static base::LazyInstance<std::deque<content::WebContents*> >
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    g_web_contents_stack = LAZY_INSTANCE_INITIALIZER;
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LoginWebDialog, public:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginWebDialog::Delegate::OnDialogClosed() {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)LoginWebDialog::LoginWebDialog(content::BrowserContext* browser_context,
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                               Delegate* delegate,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               gfx::NativeWindow parent_window,
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               const base::string16& title,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const GURL& url,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               Style style)
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : browser_context_(browser_context),
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      parent_window_(parent_window),
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      delegate_(delegate),
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      title_(title),
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url_(url),
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      style_(style),
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_open_(false) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect screen_bounds(chromeos::CalculateScreenBounds(gfx::Size()));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  width_ = static_cast<int>(kDefaultWidthRatio * screen_bounds.width());
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  height_ = static_cast<int>(kDefaultHeightRatio * screen_bounds.height());
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LoginWebDialog::~LoginWebDialog() {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = NULL;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginWebDialog::Show() {
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  chrome::ShowWebDialog(parent_window_, browser_context_, this);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_open_ = true;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginWebDialog::SetDialogSize(int width, int height) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(width >= 0 && height >= 0);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  width_ = width;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  height_ = height;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void LoginWebDialog::SetDialogTitle(const base::string16& title) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  title_ = title;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LoginWebDialog, protected:
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::ModalType LoginWebDialog::GetDialogModalType() const {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ui::MODAL_TYPE_SYSTEM;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 LoginWebDialog::GetDialogTitle() const {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return title_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL LoginWebDialog::GetDialogContentURL() const {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return url_;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginWebDialog::GetWebUIMessageHandlers(
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<WebUIMessageHandler*>* handlers) const {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginWebDialog::GetDialogSize(gfx::Size* size) const {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size->SetSize(width_, height_);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void LoginWebDialog::GetMinimumDialogSize(gfx::Size* size) const {
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect screen_bounds(chromeos::CalculateScreenBounds(gfx::Size()));
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  size->SetSize(kMinimumWidthRatio * screen_bounds.width(),
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                kMinimumHeightRatio * screen_bounds.height());
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string LoginWebDialog::GetDialogArgs() const {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::string();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// static.
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)content::WebContents* LoginWebDialog::GetCurrentWebContents() {
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!g_web_contents_stack.Pointer()->size())
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return NULL;
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return g_web_contents_stack.Pointer()->front();
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void LoginWebDialog::OnDialogShown(content::WebUI* webui,
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   content::RenderViewHost* render_view_host) {
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  g_web_contents_stack.Pointer()->push_front(webui->GetWebContents());
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginWebDialog::OnDialogClosed(const std::string& json_retval) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_open_ = false;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notification_registrar_.RemoveAll();
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->OnDialogClosed();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete this;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginWebDialog::OnCloseContents(WebContents* source,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     bool* out_close_dialog) {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (out_close_dialog)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *out_close_dialog = true;
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (g_web_contents_stack.Pointer()->size() &&
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      source == g_web_contents_stack.Pointer()->front()) {
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    g_web_contents_stack.Pointer()->pop_front();
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    NOTREACHED();
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LoginWebDialog::ShouldShowDialogTitle() const {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LoginWebDialog::HandleContextMenu(
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::ContextMenuParams& params) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable context menu.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginWebDialog::Observe(int type,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const content::NotificationSource& source,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const content::NotificationDetails& details) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(type == content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(saintlou): Do we need a throbber for Aura?
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
171