// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chromeos/login/enterprise_enrollment_view.h"
#include "base/json/json_writer.h"
#include "base/values.h"
#include "chrome/browser/chromeos/login/enterprise_enrollment_screen.h"
#include "chrome/browser/chromeos/login/helper.h"
#include "chrome/browser/chromeos/login/rounded_rect_painter.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/webui/chromeos/enterprise_enrollment_ui.h"
#include "chrome/common/url_constants.h"
#include "content/browser/renderer_host/render_view_host.h"
#include "content/browser/site_instance.h"
#include "content/browser/tab_contents/tab_contents_delegate.h"
#include "grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
#include "views/border.h"
#include "views/layout/layout_constants.h"
namespace chromeos {
namespace {
// Layout constants.
const int kBorderSize = 30;
// Renders the registration page.
class EnrollmentDomView : public WebPageDomView,
public TabContentsDelegate {
public:
EnrollmentDomView() {}
virtual ~EnrollmentDomView() {}
protected:
// DomView imlementation:
virtual TabContents* CreateTabContents(Profile* profile,
SiteInstance* instance) {
TabContents* contents = new WizardWebPageViewTabContents(profile,
instance,
page_delegate_);
contents->set_delegate(this);
return contents;
}
// TabContentsDelegate implementation:
virtual void OpenURLFromTab(TabContents* source,
const GURL& url, const GURL& referrer,
WindowOpenDisposition disposition,
PageTransition::Type transition) {}
virtual void NavigationStateChanged(const TabContents* source,
unsigned changed_flags) {}
virtual void AddNewContents(TabContents* source,
TabContents* new_contents,
WindowOpenDisposition disposition,
const gfx::Rect& initial_pos,
bool user_gesture) {}
virtual void ActivateContents(TabContents* contents) {}
virtual void DeactivateContents(TabContents* contents) {}
virtual void LoadingStateChanged(TabContents* source) {}
virtual void CloseContents(TabContents* source) {}
virtual bool IsPopup(TabContents* source) { return false; }
virtual void UpdateTargetURL(TabContents* source, const GURL& url) {}
virtual bool ShouldAddNavigationToHistory(
const history::HistoryAddPageArgs& add_page_args,
NavigationType::Type navigation_type) {
return false;
}
virtual void MoveContents(TabContents* source, const gfx::Rect& pos) {}
virtual bool HandleContextMenu(const ContextMenuParams& params) {
return true;
}
private:
DISALLOW_COPY_AND_ASSIGN(EnrollmentDomView);
};
} // namespace
EnterpriseEnrollmentView::EnterpriseEnrollmentView(
EnterpriseEnrollmentController* controller)
: controller_(controller),
editable_user_(true) {}
EnterpriseEnrollmentView::~EnterpriseEnrollmentView() {}
void EnterpriseEnrollmentView::Init() {
// Use rounded rect background.
views::Painter* painter =
CreateWizardPainter(&BorderDefinition::kScreenBorder);
set_background(views::Background::CreateBackgroundPainter(true, painter));
// Create the view that hosts the enrollment page.
enrollment_page_view_ = new EnrollmentDomView();
enrollment_page_view_->set_border(
views::Border::CreateEmptyBorder(kBorderSize, kBorderSize,
kBorderSize, kBorderSize));
AddChildView(enrollment_page_view_);
// Load the enrollment page.
Profile* profile = ProfileManager::GetDefaultProfile();
GURL url(chrome::kChromeUIEnterpriseEnrollmentURL);
enrollment_page_view_->Init(
profile, SiteInstance::CreateSiteInstanceForURL(profile, url));
EnterpriseEnrollmentUI::SetController(enrollment_page_view_->tab_contents(),
this);
enrollment_page_view_->LoadURL(url);
}
void EnterpriseEnrollmentView::ShowConfirmationScreen() {
RenderViewHost* render_view_host =
enrollment_page_view_->tab_contents()->render_view_host();
render_view_host->ExecuteJavascriptInWebFrame(
string16(),
UTF8ToUTF16("enterpriseEnrollment.showScreen('confirmation-screen');"));
}
void EnterpriseEnrollmentView::ShowAuthError(
const GoogleServiceAuthError& error) {
DictionaryValue args;
args.SetInteger("error", error.state());
args.SetBoolean("editable_user", editable_user_);
args.SetString("captchaUrl", error.captcha().image_url.spec());
UpdateGaiaLogin(args);
}
void EnterpriseEnrollmentView::ShowAccountError() {
ShowError(IDS_ENTERPRISE_ENROLLMENT_ACCOUNT_ERROR);
}
void EnterpriseEnrollmentView::ShowFatalAuthError() {
ShowError(IDS_ENTERPRISE_ENROLLMENT_FATAL_AUTH_ERROR);
}
void EnterpriseEnrollmentView::ShowFatalEnrollmentError() {
ShowError(IDS_ENTERPRISE_ENROLLMENT_FATAL_ENROLLMENT_ERROR);
}
void EnterpriseEnrollmentView::ShowNetworkEnrollmentError() {
ShowError(IDS_ENTERPRISE_ENROLLMENT_NETWORK_ENROLLMENT_ERROR);
}
void EnterpriseEnrollmentView::OnAuthSubmitted(const std::string& user,
const std::string& password,
const std::string& captcha,
const std::string& access_code) {
controller_->Authenticate(user, password, captcha, access_code);
}
void EnterpriseEnrollmentView::OnAuthCancelled() {
controller_->CancelEnrollment();
}
void EnterpriseEnrollmentView::OnConfirmationClosed() {
controller_->CloseConfirmation();
}
bool EnterpriseEnrollmentView::GetInitialUser(std::string* user) {
return controller_->GetInitialUser(user);
}
void EnterpriseEnrollmentView::UpdateGaiaLogin(const DictionaryValue& args) {
std::string json;
base::JSONWriter::Write(&args, false, &json);
RenderViewHost* render_view_host =
enrollment_page_view_->tab_contents()->render_view_host();
render_view_host->ExecuteJavascriptInWebFrame(
ASCIIToUTF16("//iframe[@id='gaialogin']"),
UTF8ToUTF16("showGaiaLogin(" + json + ");"));
}
void EnterpriseEnrollmentView::ShowError(int message_id) {
DictionaryValue args;
args.SetInteger("error", GoogleServiceAuthError::NONE);
args.SetBoolean("editable_user", editable_user_);
args.SetString("error_message", l10n_util::GetStringUTF16(message_id));
UpdateGaiaLogin(args);
}
void EnterpriseEnrollmentView::Layout() {
enrollment_page_view_->SetBoundsRect(GetContentsBounds());
}
void EnterpriseEnrollmentView::set_editable_user(bool editable) {
editable_user_ = editable;
}
} // namespace chromeos