1 // Copyright 2018 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/download/download_open_prompt.h"
6
7 #include <memory>
8 #include <utility>
9
10 #include "base/callback.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "chrome/browser/ui/browser_dialogs.h"
13 #include "chrome/browser/ui/tab_modal_confirm_dialog.h"
14 #include "chrome/browser/ui/tab_modal_confirm_dialog_delegate.h"
15 #include "chrome/grit/generated_resources.h"
16 #include "content/public/browser/web_contents.h"
17 #include "ui/base/l10n/l10n_util.h"
18
19 namespace {
20
21 // Dialog class for prompting users about opening a download.
22 class DownloadOpenConfirmationDialog : public DownloadOpenPrompt,
23 public TabModalConfirmDialogDelegate {
24 public:
25 DownloadOpenConfirmationDialog(
26 content::WebContents* web_contents,
27 const std::string& extension_name,
28 const base::FilePath& file_path,
29 DownloadOpenPrompt::OpenCallback open_callback);
30 ~DownloadOpenConfirmationDialog() override;
31
32 base::string16 GetTitle() override;
33 base::string16 GetDialogMessage() override;
34 base::string16 GetAcceptButtonTitle() override;
35 base::string16 GetCancelButtonTitle() override;
36
37 private:
38 void OnAccepted() override;
39 void OnCanceled() override;
40 void OnClosed() override;
41
42 DownloadOpenPrompt::OpenCallback open_callback_;
43
44 std::string extension_name_;
45
46 base::FilePath file_path_;
47
48 DISALLOW_COPY_AND_ASSIGN(DownloadOpenConfirmationDialog);
49 };
50
DownloadOpenConfirmationDialog(content::WebContents * web_contents,const std::string & extension_name,const base::FilePath & file_path,DownloadOpenPrompt::OpenCallback open_callback)51 DownloadOpenConfirmationDialog::DownloadOpenConfirmationDialog(
52 content::WebContents* web_contents,
53 const std::string& extension_name,
54 const base::FilePath& file_path,
55 DownloadOpenPrompt::OpenCallback open_callback)
56 : TabModalConfirmDialogDelegate(web_contents),
57 open_callback_(std::move(open_callback)),
58 extension_name_(extension_name),
59 file_path_(file_path) {
60 chrome::RecordDialogCreation(
61 chrome::DialogIdentifier::DOWNLOAD_OPEN_CONFIRMATION);
62 }
63
64 DownloadOpenConfirmationDialog::~DownloadOpenConfirmationDialog() = default;
65
GetTitle()66 base::string16 DownloadOpenConfirmationDialog::GetTitle() {
67 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_OPEN_CONFIRMATION_DIALOG_TITLE);
68 }
69
GetDialogMessage()70 base::string16 DownloadOpenConfirmationDialog::GetDialogMessage() {
71 return l10n_util::GetStringFUTF16(
72 IDS_DOWNLOAD_OPEN_CONFIRMATION_DIALOG_MESSAGE,
73 base::UTF8ToUTF16(extension_name_),
74 file_path_.BaseName().AsUTF16Unsafe());
75 }
76
GetAcceptButtonTitle()77 base::string16 DownloadOpenConfirmationDialog::GetAcceptButtonTitle() {
78 return l10n_util::GetStringUTF16(IDS_CONFIRM_MESSAGEBOX_YES_BUTTON_LABEL);
79 }
80
GetCancelButtonTitle()81 base::string16 DownloadOpenConfirmationDialog::GetCancelButtonTitle() {
82 return l10n_util::GetStringUTF16(IDS_CONFIRM_MESSAGEBOX_NO_BUTTON_LABEL);
83 }
84
OnAccepted()85 void DownloadOpenConfirmationDialog::OnAccepted() {
86 std::move(open_callback_).Run(true);
87 }
88
OnCanceled()89 void DownloadOpenConfirmationDialog::OnCanceled() {
90 std::move(open_callback_).Run(false);
91 }
92
OnClosed()93 void DownloadOpenConfirmationDialog::OnClosed() {
94 std::move(open_callback_).Run(false);
95 }
96
97 } // namespace
98
99 DownloadOpenPrompt::DownloadOpenPrompt() = default;
100
101 DownloadOpenPrompt::~DownloadOpenPrompt() = default;
102
CreateDownloadOpenConfirmationDialog(content::WebContents * web_contents,const std::string & extension_name,const base::FilePath & file_path,DownloadOpenPrompt::OpenCallback open_callback)103 DownloadOpenPrompt* DownloadOpenPrompt::CreateDownloadOpenConfirmationDialog(
104 content::WebContents* web_contents,
105 const std::string& extension_name,
106 const base::FilePath& file_path,
107 DownloadOpenPrompt::OpenCallback open_callback) {
108 auto prompt = std::make_unique<DownloadOpenConfirmationDialog>(
109 web_contents, extension_name, file_path, std::move(open_callback));
110 DownloadOpenConfirmationDialog* prompt_observer = prompt.get();
111 TabModalConfirmDialog::Create(std::move(prompt), web_contents);
112 return prompt_observer;
113 }
114
AcceptConfirmationDialogForTesting(DownloadOpenPrompt * download_open_prompt)115 void DownloadOpenPrompt::AcceptConfirmationDialogForTesting(
116 DownloadOpenPrompt* download_open_prompt) {
117 static_cast<DownloadOpenConfirmationDialog*>(download_open_prompt)->Accept();
118 }
119