| Index: chrome/browser/chromeos/enrollment_dialog_view.cc
|
| diff --git a/chrome/browser/chromeos/enrollment_dialog_view.cc b/chrome/browser/chromeos/enrollment_dialog_view.cc
|
| index 28eb08772fd3f7a757a995540242fc508e3fcbcb..8f581c64cbd5e165638d195502d767e669846fb8 100644
|
| --- a/chrome/browser/chromeos/enrollment_dialog_view.cc
|
| +++ b/chrome/browser/chromeos/enrollment_dialog_view.cc
|
| @@ -6,8 +6,13 @@
|
|
|
| #include "base/bind.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/themes/theme_service.h"
|
| +#include "chrome/browser/ui/views/extensions/extension_dialog.h"
|
| +#include "chrome/browser/ui/views/extensions/extension_dialog_observer.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"
|
| @@ -30,120 +35,69 @@ namespace chromeos {
|
| namespace {
|
|
|
| // Default width/height of the dialog.
|
| -const int kDefaultWidth = 640;
|
| -const int kDefaultHeight = 480;
|
| +const int kDefaultWidth = 400;
|
| +const int kDefaultHeight = 200;
|
|
|
| -// Border around the WebView
|
| -const int kWebViewBorderSize = 1;
|
| -
|
| -// TODO(gspencer): Move this into ui/views/layout, perhaps just adding insets
|
| -// to FillLayout.
|
| -class BorderLayout : public LayoutManager {
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// Dialog for certificate enrollment. This displays the content from the
|
| +// certificate enrollment URI.
|
| +class EnrollmentDialogView : public views::DialogDelegateView {
|
| public:
|
| - explicit BorderLayout(const gfx::Insets& insets) : insets_(insets) {}
|
| - virtual ~BorderLayout() {}
|
| -
|
| - // Overridden from LayoutManager:
|
| - virtual void Layout(View* host) OVERRIDE {
|
| - if (!host->has_children())
|
| - return;
|
| + virtual ~EnrollmentDialogView();
|
|
|
| - View* frame_view = host->child_at(0);
|
| - frame_view->SetBounds(insets_.left(),
|
| - insets_.top(),
|
| - host->width() - insets_.right() - insets_.left(),
|
| - host->height() - insets_.bottom() - insets_.top());
|
| - }
|
| + static void ShowDialog(gfx::NativeWindow owning_window,
|
| + Profile* profile,
|
| + const GURL& target_uri,
|
| + const base::Closure& connect);
|
|
|
| - virtual gfx::Size GetPreferredSize(View* host) OVERRIDE {
|
| - DCHECK_EQ(1, host->child_count());
|
| - gfx::Size child_size = host->child_at(0)->GetPreferredSize();
|
| - child_size.Enlarge(insets_.left() + insets_.right(),
|
| - insets_.top() + insets_.bottom());
|
| - return child_size;
|
| - }
|
| + // views::DialogDelegateView overrides
|
| + virtual int GetDialogButtons() const OVERRIDE;
|
| + virtual bool Accept() OVERRIDE;
|
|
|
| - private:
|
| - gfx::Insets insets_;
|
| - DISALLOW_COPY_AND_ASSIGN(BorderLayout);
|
| -};
|
| + // views::WidgetDelegate overrides
|
| + virtual ui::ModalType GetModalType() const OVERRIDE;
|
| + virtual string16 GetWindowTitle() const OVERRIDE;
|
|
|
| -// Handler for certificate enrollment. This displays the content from the
|
| -// certificate enrollment URI and listens for a certificate to be added. If a
|
| -// certificate is added, then it invokes the closure to allow the network to
|
| -// continue to connect.
|
| -class DialogEnrollmentDelegate : public EnrollmentDelegate {
|
| - public:
|
| - // |owning_window| is the window that will own the dialog.
|
| - explicit DialogEnrollmentDelegate(gfx::NativeWindow owning_window);
|
| - virtual ~DialogEnrollmentDelegate();
|
| + // views::View overrides
|
| + virtual gfx::Size GetPreferredSize() OVERRIDE;
|
|
|
| - // EnrollmentDelegate overrides
|
| - virtual void Enroll(const std::vector<std::string>& uri_list,
|
| - const base::Closure& connect) OVERRIDE;
|
| + // views::Widget overrides
|
| + virtual views::View* GetContentsView() OVERRIDE;
|
|
|
| private:
|
| - gfx::NativeWindow owning_window_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(DialogEnrollmentDelegate);
|
| + EnrollmentDialogView(Profile* profile,
|
| + const GURL& target_uri,
|
| + const base::Closure& connect);
|
| + void InitDialog();
|
| +
|
| + Profile* profile_;
|
| + GURL target_uri_;
|
| + base::Closure connect_;
|
| + bool added_cert_;
|
| };
|
|
|
| -DialogEnrollmentDelegate::DialogEnrollmentDelegate(
|
| - gfx::NativeWindow owning_window)
|
| - : owning_window_(owning_window) {}
|
| -
|
| -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.
|
| - 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-extension") {
|
| - // If this is a "standard" scheme, like http, ftp, etc., then open that in
|
| - // the enrollment dialog. If this is a chrome extension, then just open
|
| - // that extension in a tab and let it provide any UI that it needs to
|
| - // complete.
|
| - EnrollmentDialogView::ShowDialog(owning_window_, 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.
|
| - VLOG(1) << "Couldn't find usable scheme in enrollment URI(s)";
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // EnrollmentDialogView implementation.
|
|
|
| -EnrollmentDialogView::EnrollmentDialogView(const GURL& target_uri,
|
| +EnrollmentDialogView::EnrollmentDialogView(Profile* profile,
|
| + const GURL& target_uri,
|
| const base::Closure& connect)
|
| - : target_uri_(target_uri),
|
| + : profile_(profile),
|
| + target_uri_(target_uri),
|
| connect_(connect),
|
| added_cert_(false) {
|
| - net::CertDatabase::AddObserver(this);
|
| }
|
|
|
| EnrollmentDialogView::~EnrollmentDialogView() {
|
| - net::CertDatabase::RemoveObserver(this);
|
| -}
|
| -
|
| -// static
|
| -EnrollmentDelegate* EnrollmentDialogView::CreateEnrollmentDelegate(
|
| - gfx::NativeWindow owning_window) {
|
| - return new DialogEnrollmentDelegate(owning_window);
|
| }
|
|
|
| // static
|
| void EnrollmentDialogView::ShowDialog(gfx::NativeWindow owning_window,
|
| + Profile* profile,
|
| const GURL& target_uri,
|
| const base::Closure& connect) {
|
| EnrollmentDialogView* dialog_view =
|
| - new EnrollmentDialogView(target_uri, connect);
|
| + new EnrollmentDialogView(profile, target_uri, connect);
|
| views::Widget::CreateWindowWithParent(dialog_view, owning_window);
|
| dialog_view->InitDialog();
|
| views::Widget* widget = dialog_view->GetWidget();
|
| @@ -151,17 +105,22 @@ void EnrollmentDialogView::ShowDialog(gfx::NativeWindow owning_window,
|
| widget->Show();
|
| }
|
|
|
| -void EnrollmentDialogView::Close() {
|
| - GetWidget()->Close();
|
| -}
|
| -
|
| int EnrollmentDialogView::GetDialogButtons() const {
|
| - return ui::DIALOG_BUTTON_CANCEL;
|
| + return ui::DIALOG_BUTTON_CANCEL | ui::DIALOG_BUTTON_OK;
|
| }
|
|
|
| -void EnrollmentDialogView::OnClose() {
|
| - if (added_cert_)
|
| - connect_.Run();
|
| +bool EnrollmentDialogView::Accept() {
|
| + // Navigate to the target URI in a browser tab.
|
| + Browser* browser = BrowserList::FindTabbedBrowser(profile_, false);
|
| + if (!browser) {
|
| + // Couldn't find a tabbed browser: create one.
|
| + browser = Browser::Create(profile_);
|
| + }
|
| + DCHECK(browser);
|
| + browser->AddSelectedTabWithURL(
|
| + target_uri_,
|
| + content::PAGE_TRANSITION_LINK);
|
| + return true;
|
| }
|
|
|
| ui::ModalType EnrollmentDialogView::GetModalType() const {
|
| @@ -180,42 +139,17 @@ views::View* EnrollmentDialogView::GetContentsView() {
|
| return this;
|
| }
|
|
|
| -void EnrollmentDialogView::OnUserCertAdded(
|
| - const net::X509Certificate* cert) {
|
| - added_cert_ = true;
|
| - Close();
|
| -}
|
| -
|
| void EnrollmentDialogView::InitDialog() {
|
| added_cert_ = false;
|
| // Create the views and layout manager and set them up.
|
| Label* label = new Label(
|
| - l10n_util::GetStringUTF16(
|
| - IDS_NETWORK_ENROLLMENT_HANDLER_EMBEDDED_ENROLL));
|
| + l10n_util::GetStringUTF16(IDS_NETWORK_ENROLLMENT_HANDLER_TAB_ENROLL));
|
| label->SetFont(
|
| ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont));
|
| label->SetHorizontalAlignment(Label::ALIGN_LEFT);
|
| label->SetMultiLine(true);
|
| label->SetAllowCharacterBreak(true);
|
|
|
| - // In order to get a border that shows around the WebView, we need to embed it
|
| - // into another view because it hosts a native window that fills the view.
|
| - View* web_view_border_view = new View();
|
| - web_view_border_view->SetLayoutManager(
|
| - new BorderLayout(gfx::Insets(kWebViewBorderSize,
|
| - kWebViewBorderSize,
|
| - kWebViewBorderSize,
|
| - kWebViewBorderSize)));
|
| - SkColor frame_color = ThemeService::GetDefaultColor(
|
| - ThemeService::COLOR_FRAME);
|
| - Border* border = views::Border::CreateSolidBorder(kWebViewBorderSize,
|
| - frame_color);
|
| - web_view_border_view->set_border(border);
|
| - views::WebView* web_view =
|
| - new views::WebView(ProfileManager::GetLastUsedProfile());
|
| - web_view_border_view->AddChildView(web_view);
|
| - web_view->SetVisible(true);
|
| -
|
| GridLayout* grid_layout = GridLayout::CreatePanel(this);
|
| SetLayoutManager(grid_layout);
|
|
|
| @@ -226,8 +160,6 @@ void EnrollmentDialogView::InitDialog() {
|
| views::GridLayout::USE_PREF, // Size type.
|
| 0, // Ignored for USE_PREF.
|
| 0); // Minimum size.
|
| - // Add a column set for aligning the text when it has no icons (such as the
|
| - // help center link).
|
| columns = grid_layout->AddColumnSet(1);
|
| columns->AddPaddingColumn(
|
| 0, views::kUnrelatedControlHorizontalSpacing);
|
| @@ -241,11 +173,70 @@ void EnrollmentDialogView::InitDialog() {
|
| grid_layout->StartRow(0, 0);
|
| grid_layout->AddView(label);
|
| grid_layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
|
| - grid_layout->StartRow(100.0f, 0);
|
| - grid_layout->AddView(web_view_border_view);
|
| - grid_layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
|
| grid_layout->Layout(this);
|
| - web_view->LoadInitialURL(target_uri_);
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// 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,
|
| + 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_;
|
| + Profile* profile_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(DialogEnrollmentDelegate);
|
| +};
|
| +
|
| +DialogEnrollmentDelegate::DialogEnrollmentDelegate(
|
| + gfx::NativeWindow owning_window,
|
| + Profile* profile) : owning_window_(owning_window), 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_, 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,
|
| + Profile* profile) {
|
| + return new DialogEnrollmentDelegate(owning_window, profile);
|
| }
|
|
|
| } // namespace chromeos
|
|
|