platform_verification_dialog.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/chromeos/attestation/platform_verification_dialog.h"
6
7#include "base/strings/utf_string_conversions.h"
8#include "chrome/browser/ui/browser_finder.h"
9#include "chrome/browser/ui/browser_window.h"
10#include "chrome/browser/ui/singleton_tabs.h"
11#include "chrome/common/url_constants.h"
12#include "components/web_modal/web_contents_modal_dialog_host.h"
13#include "components/web_modal/web_contents_modal_dialog_manager.h"
14#include "components/web_modal/web_contents_modal_dialog_manager_delegate.h"
15#include "content/public/browser/web_contents.h"
16#include "extensions/browser/extension_registry.h"
17#include "extensions/common/extension.h"
18#include "grit/generated_resources.h"
19#include "ui/aura/window.h"
20#include "ui/base/l10n/l10n_util.h"
21#include "ui/views/border.h"
22#include "ui/views/controls/styled_label.h"
23#include "ui/views/layout/fill_layout.h"
24#include "ui/views/layout/layout_constants.h"
25#include "ui/views/widget/widget.h"
26
27namespace chromeos {
28namespace attestation {
29
30namespace {
31
32const int kDialogMaxWidthInPixel = 400;
33
34}  // namespace
35
36// static
37void PlatformVerificationDialog::ShowDialog(
38    content::WebContents* web_contents,
39    const PlatformVerificationFlow::Delegate::ConsentCallback& callback) {
40  GURL url = web_contents->GetLastCommittedURL();
41  // In the case of an extension or hosted app, the origin of the request is
42  // best described by the extension / app name.
43  const extensions::Extension* extension =
44      extensions::ExtensionRegistry::Get(web_contents->GetBrowserContext())->
45          enabled_extensions().GetExtensionOrAppByURL(url);
46  std::string origin = extension ? extension->name() : url.GetOrigin().spec();
47
48  PlatformVerificationDialog* dialog = new PlatformVerificationDialog(
49      chrome::FindBrowserWithWebContents(web_contents),
50      base::UTF8ToUTF16(origin),
51      callback);
52
53  // Sets up the dialog widget and shows it.
54  web_modal::WebContentsModalDialogManager* web_contents_modal_dialog_manager =
55      web_modal::WebContentsModalDialogManager::FromWebContents(web_contents);
56  web_modal::WebContentsModalDialogManagerDelegate* modal_delegate =
57      web_contents_modal_dialog_manager->delegate();
58  views::Widget* widget = views::Widget::CreateWindowAsFramelessChild(
59      dialog, modal_delegate->GetWebContentsModalDialogHost()->GetHostView());
60  web_contents_modal_dialog_manager->ShowDialog(widget->GetNativeView());
61  widget->Show();
62}
63
64PlatformVerificationDialog::~PlatformVerificationDialog() {
65}
66
67PlatformVerificationDialog::PlatformVerificationDialog(
68    Browser* browser,
69    const base::string16& domain,
70    const PlatformVerificationFlow::Delegate::ConsentCallback& callback)
71    : browser_(browser),
72      domain_(domain),
73      callback_(callback) {
74  SetLayoutManager(new views::FillLayout());
75  SetBorder(views::Border::CreateEmptyBorder(
76      0, views::kButtonHEdgeMarginNew, 0, views::kButtonHEdgeMarginNew));
77  const base::string16 learn_more = l10n_util::GetStringUTF16(IDS_LEARN_MORE);
78  std::vector<size_t> offsets;
79  base::string16 headline = l10n_util::GetStringFUTF16(
80      IDS_PLATFORM_VERIFICATION_DIALOG_HEADLINE, domain_, learn_more, &offsets);
81  views::StyledLabel* headline_label = new views::StyledLabel(headline, this);
82  headline_label->AddStyleRange(
83      gfx::Range(offsets[1], offsets[1] + learn_more.size()),
84      views::StyledLabel::RangeStyleInfo::CreateForLink());
85  AddChildView(headline_label);
86}
87
88bool PlatformVerificationDialog::Cancel() {
89  callback_.Run(PlatformVerificationFlow::CONSENT_RESPONSE_DENY);
90  return true;
91}
92
93bool PlatformVerificationDialog::Accept() {
94  callback_.Run(PlatformVerificationFlow::CONSENT_RESPONSE_ALLOW);
95  return true;
96}
97
98bool PlatformVerificationDialog::Close() {
99  // This method is called when the tab is closed and in that case the decision
100  // hasn't been made yet.
101  callback_.Run(PlatformVerificationFlow::CONSENT_RESPONSE_NONE);
102  return true;
103}
104
105base::string16 PlatformVerificationDialog::GetDialogButtonLabel(
106    ui::DialogButton button) const {
107  switch (button) {
108    case ui::DIALOG_BUTTON_OK:
109      return l10n_util::GetStringUTF16(IDS_PLATFORM_VERIFICATION_DIALOG_ALLOW);
110    case ui::DIALOG_BUTTON_CANCEL:
111      return l10n_util::GetStringFUTF16(
112          IDS_PLATFORM_VERIFICATION_DIALOG_DENY, domain_);
113    default:
114      NOTREACHED();
115  }
116  return base::string16();
117}
118
119ui::ModalType PlatformVerificationDialog::GetModalType() const {
120  return ui::MODAL_TYPE_CHILD;
121}
122
123gfx::Size PlatformVerificationDialog::GetPreferredSize() {
124  return gfx::Size(kDialogMaxWidthInPixel,
125                   GetHeightForWidth(kDialogMaxWidthInPixel));
126}
127
128void PlatformVerificationDialog::StyledLabelLinkClicked(const gfx::Range& range,
129                                                        int event_flags) {
130  chrome::ShowSingletonTab(browser_, GURL(
131      chrome::kEnhancedPlaybackNotificationLearnMoreURL));
132}
133
134}  // namespace attestation
135}  // namespace chromeos
136