15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/mobile_setup_dialog.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/singleton.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_shutdown.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/webui_login_view.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/mobile/mobile_activator.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/platform_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_dialogs.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/simple_message_box.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/web_dialogs/web_dialog_delegate.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using chromeos::MobileActivator; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebUIMessageHandler; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ui::WebDialogDelegate; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class MobileSetupDialogDelegate : public WebDialogDelegate { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static MobileSetupDialogDelegate* GetInstance(); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ShowDialog(const std::string& service_path); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend struct DefaultSingletonTraits<MobileSetupDialogDelegate>; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MobileSetupDialogDelegate(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MobileSetupDialogDelegate(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCloseDialog(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebDialogDelegate overrides. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ui::ModalType GetDialogModalType() const OVERRIDE; 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual base::string16 GetDialogTitle() const OVERRIDE; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual GURL GetDialogContentURL() const OVERRIDE; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetWebUIMessageHandlers( 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<WebUIMessageHandler*>* handlers) const OVERRIDE; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetDialogSize(gfx::Size* size) const OVERRIDE; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual std::string GetDialogArgs() const OVERRIDE; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnDialogClosed(const std::string& json_retval) OVERRIDE; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnCloseContents(WebContents* source, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* out_close_dialog) OVERRIDE; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool ShouldShowDialogTitle() const OVERRIDE; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool HandleContextMenu( 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::ContextMenuParams& params) OVERRIDE; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow dialog_window_; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cellular network service path. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string service_path_; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MobileSetupDialogDelegate); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MobileSetupDialog::Show(const std::string& service_path) { 69e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::UI); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MobileSetupDialogDelegate::GetInstance()->ShowDialog(service_path); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MobileSetupDialogDelegate* MobileSetupDialogDelegate::GetInstance() { 75e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::UI); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Singleton<MobileSetupDialogDelegate>::get(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MobileSetupDialogDelegate::MobileSetupDialogDelegate() : dialog_window_(NULL) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MobileSetupDialogDelegate::~MobileSetupDialogDelegate() { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MobileSetupDialogDelegate::ShowDialog(const std::string& service_path) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_path_ = service_path; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow parent = NULL; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we're on the login screen. 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (chromeos::LoginDisplayHostImpl::default_host()) { 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::LoginDisplayHostImpl* webui_host = 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<chromeos::LoginDisplayHostImpl*>( 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::LoginDisplayHostImpl::default_host()); 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::WebUILoginView* login_view = webui_host->GetWebUILoginView(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (login_view) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent = login_view->GetNativeWindow(); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only the primary user can change this. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_window_ = chrome::ShowWebDialog( 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent, 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileManager::GetPrimaryUserProfile(), 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::ModalType MobileSetupDialogDelegate::GetDialogModalType() const { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::MODAL_TYPE_SYSTEM; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 MobileSetupDialogDelegate::GetDialogTitle() const { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16(IDS_MOBILE_SETUP_TITLE); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL MobileSetupDialogDelegate::GetDialogContentURL() const { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url(chrome::kChromeUIMobileSetupURL); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url.append(service_path_); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(url); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MobileSetupDialogDelegate::GetWebUIMessageHandlers( 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<WebUIMessageHandler*>* handlers) const { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MobileSetupDialogDelegate::GetDialogSize(gfx::Size* size) const { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size->SetSize(850, 650); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string MobileSetupDialogDelegate::GetDialogArgs() const { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MobileSetupDialogDelegate::OnDialogClosed(const std::string& json_retval) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_window_ = NULL; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MobileSetupDialogDelegate::OnCloseContents(WebContents* source, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* out_close_dialog) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we're exiting, popping up the confirmation dialog can cause a 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // crash. Note: IsTryingToQuit can be cancelled on other platforms by the 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // onbeforeunload handler, except on ChromeOS. So IsTryingToQuit is the 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // appropriate check to use here. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dialog_window_ || 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !MobileActivator::GetInstance()->RunningActivation() || 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_shutdown::IsTryingToQuit()) { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_close_dialog = true; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_close_dialog = chrome::ShowMessageBox(dialog_window_, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_MOBILE_SETUP_TITLE), 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_MOBILE_CANCEL_ACTIVATION), 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::MESSAGE_BOX_TYPE_QUESTION); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MobileSetupDialogDelegate::ShouldShowDialogTitle() const { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MobileSetupDialogDelegate::HandleContextMenu( 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::ContextMenuParams& params) { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 162