blob: ea41927abd0ffe17f2e24498e5422ad683adf762 [file] [log] [blame]
// Copyright (c) 2012 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/enrollment_dialog_view.h"
#include "base/bind.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/chromeos/cros/network_library.h"
#include "chrome/browser/extensions/extension_host.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/common/url_constants.h"
#include "content/public/common/page_transition_types.h"
#include "grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/views/controls/label.h"
#include "ui/views/layout/grid_layout.h"
#include "ui/views/layout/layout_constants.h"
#include "ui/views/widget/widget.h"
namespace chromeos {
namespace {
// Default width/height of the dialog.
const int kDefaultWidth = 350;
const int kDefaultHeight = 100;
////////////////////////////////////////////////////////////////////////////////
// Dialog for certificate enrollment. This displays the content from the
// certificate enrollment URI.
class EnrollmentDialogView : public views::DialogDelegateView {
public:
virtual ~EnrollmentDialogView();
static void ShowDialog(gfx::NativeWindow owning_window,
const std::string& network_name,
Profile* profile,
const GURL& target_uri,
const base::Closure& connect);
// views::DialogDelegateView overrides
virtual int GetDialogButtons() const OVERRIDE;
virtual bool Accept() OVERRIDE;
virtual string16 GetDialogButtonLabel(ui::DialogButton button) const OVERRIDE;
// views::WidgetDelegate overrides
virtual ui::ModalType GetModalType() const OVERRIDE;
virtual string16 GetWindowTitle() const OVERRIDE;
// views::View overrides
virtual gfx::Size GetPreferredSize() OVERRIDE;
// views::Widget overrides
virtual views::View* GetContentsView() OVERRIDE;
private:
EnrollmentDialogView(const std::string& network_name,
Profile* profile,
const GURL& target_uri,
const base::Closure& connect);
void InitDialog();
std::string network_name_;
Profile* profile_;
GURL target_uri_;
base::Closure connect_;
bool added_cert_;
};
////////////////////////////////////////////////////////////////////////////////
// EnrollmentDialogView implementation.
EnrollmentDialogView::EnrollmentDialogView(const std::string& network_name,
Profile* profile,
const GURL& target_uri,
const base::Closure& connect)
: network_name_(network_name),
profile_(profile),
target_uri_(target_uri),
connect_(connect),
added_cert_(false) {
}
EnrollmentDialogView::~EnrollmentDialogView() {
}
// static
void EnrollmentDialogView::ShowDialog(gfx::NativeWindow owning_window,
const std::string& network_name,
Profile* profile,
const GURL& target_uri,
const base::Closure& connect) {
EnrollmentDialogView* dialog_view =
new EnrollmentDialogView(network_name, profile, target_uri, connect);
views::Widget::CreateWindowWithParent(dialog_view, owning_window);
dialog_view->InitDialog();
views::Widget* widget = dialog_view->GetWidget();
DCHECK(widget);
widget->Show();
}
int EnrollmentDialogView::GetDialogButtons() const {
return ui::DIALOG_BUTTON_CANCEL | ui::DIALOG_BUTTON_OK;
}
bool EnrollmentDialogView::Accept() {
// TODO(beng): use Navigate().
// Navigate to the target URI in a browser tab.
Browser* browser = browser::FindTabbedBrowser(profile_, false);
if (!browser) {
// Couldn't find a tabbed browser: create one.
browser = new Browser(Browser::CreateParams(profile_));
}
DCHECK(browser);
chrome::AddSelectedTabWithURL(browser, target_uri_,
content::PAGE_TRANSITION_LINK);
return true;
}
string16 EnrollmentDialogView::GetDialogButtonLabel(
ui::DialogButton button) const {
if (button == ui::DIALOG_BUTTON_OK)
return l10n_util::GetStringUTF16(IDS_NETWORK_ENROLLMENT_HANDLER_BUTTON);
return views::DialogDelegateView::GetDialogButtonLabel(button);
}
ui::ModalType EnrollmentDialogView::GetModalType() const {
return ui::MODAL_TYPE_SYSTEM;
}
string16 EnrollmentDialogView::GetWindowTitle() const {
return l10n_util::GetStringUTF16(IDS_NETWORK_ENROLLMENT_HANDLER_TITLE);
}
gfx::Size EnrollmentDialogView::GetPreferredSize() {
return gfx::Size(kDefaultWidth, kDefaultHeight);
}
views::View* EnrollmentDialogView::GetContentsView() {
return this;
}
void EnrollmentDialogView::InitDialog() {
added_cert_ = false;
// Create the views and layout manager and set them up.
views::Label* label = new views::Label(
l10n_util::GetStringFUTF16(IDS_NETWORK_ENROLLMENT_HANDLER_INSTRUCTIONS,
UTF8ToUTF16(network_name_)));
label->SetFont(ui::ResourceBundle::GetSharedInstance().GetFont(
ui::ResourceBundle::BaseFont));
label->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
label->SetMultiLine(true);
label->SetAllowCharacterBreak(true);
views::GridLayout* grid_layout = views::GridLayout::CreatePanel(this);
SetLayoutManager(grid_layout);
views::ColumnSet* columns = grid_layout->AddColumnSet(0);
columns->AddColumn(views::GridLayout::FILL, // Horizontal resize.
views::GridLayout::FILL, // Vertical resize.
1, // Resize weight.
views::GridLayout::USE_PREF, // Size type.
0, // Ignored for USE_PREF.
0); // Minimum size.
columns = grid_layout->AddColumnSet(1);
columns->AddPaddingColumn(
0, views::kUnrelatedControlHorizontalSpacing);
columns->AddColumn(views::GridLayout::LEADING, // Horizontal leading.
views::GridLayout::FILL, // Vertical resize.
1, // Resize weight.
views::GridLayout::USE_PREF, // Size type.
0, // Ignored for USE_PREF.
0); // Minimum size.
grid_layout->StartRow(0, 0);
grid_layout->AddView(label);
grid_layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
grid_layout->Layout(this);
}
////////////////////////////////////////////////////////////////////////////////
// Handler for certificate enrollment.
class DialogEnrollmentDelegate : public EnrollmentDelegate {
public:
// |owning_window| is the window that will own the dialog.
explicit DialogEnrollmentDelegate(gfx::NativeWindow owning_window,
const std::string& network_name,
Profile* profile);
virtual ~DialogEnrollmentDelegate();
// EnrollmentDelegate overrides
virtual void Enroll(const std::vector<std::string>& uri_list,
const base::Closure& connect) OVERRIDE;
private:
gfx::NativeWindow owning_window_;
std::string network_name_;
Profile* profile_;
DISALLOW_COPY_AND_ASSIGN(DialogEnrollmentDelegate);
};
DialogEnrollmentDelegate::DialogEnrollmentDelegate(
gfx::NativeWindow owning_window,
const std::string& network_name,
Profile* profile) : owning_window_(owning_window),
network_name_(network_name),
profile_(profile) {}
DialogEnrollmentDelegate::~DialogEnrollmentDelegate() {}
void DialogEnrollmentDelegate::Enroll(const std::vector<std::string>& uri_list,
const base::Closure& connect) {
// Keep the closure for later activation if we notice that
// a certificate has been added.
// TODO(gspencer): Do something smart with the closure. At the moment it is
// being ignored because we don't know when the enrollment tab is closed.
// http://crosbug.com/30422
for (std::vector<std::string>::const_iterator iter = uri_list.begin();
iter != uri_list.end(); ++iter) {
GURL uri(*iter);
if (uri.IsStandard() || uri.scheme() == chrome::kExtensionScheme) {
// If this is a "standard" scheme, like http, ftp, etc., then open that in
// the enrollment dialog.
EnrollmentDialogView::ShowDialog(owning_window_,
network_name_,
profile_,
uri, connect);
return;
}
}
// If we didn't find a scheme we could handle, then don't continue connecting.
// TODO(gspencer): provide a path to display this failure to the user. (but
// for the most part they won't know what it means, since it's probably coming
// from a policy-pushed ONC file).
VLOG(1) << "Couldn't find usable scheme in enrollment URI(s)";
}
} // namespace
////////////////////////////////////////////////////////////////////////////////
// Factory function.
EnrollmentDelegate* CreateEnrollmentDelegate(gfx::NativeWindow owning_window,
const std::string& network_name,
Profile* profile) {
return new DialogEnrollmentDelegate(owning_window, network_name, profile);
}
} // namespace chromeos