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