| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/download/download_danger_prompt.h" | 5 #include "chrome/browser/download/download_danger_prompt.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "chrome/browser/download/chrome_download_manager_delegate.h" | 8 #include "chrome/browser/download/chrome_download_manager_delegate.h" |
| 9 #include "chrome/browser/ui/tab_modal_confirm_dialog.h" | 9 #include "chrome/browser/ui/tab_modal_confirm_dialog.h" |
| 10 #include "chrome/browser/ui/tab_modal_confirm_dialog_delegate.h" | 10 #include "chrome/browser/ui/tab_modal_confirm_dialog_delegate.h" |
| 11 #include "chrome/common/chrome_notification_types.h" |
| 11 #include "content/public/browser/download_danger_type.h" | 12 #include "content/public/browser/download_danger_type.h" |
| 12 #include "content/public/browser/download_item.h" | 13 #include "content/public/browser/download_item.h" |
| 13 #include "grit/generated_resources.h" | 14 #include "grit/generated_resources.h" |
| 14 #include "ui/base/l10n/l10n_util.h" | 15 #include "ui/base/l10n/l10n_util.h" |
| 15 | 16 |
| 16 namespace { | 17 namespace { |
| 17 | 18 |
| 18 // Implements DownloadDangerPrompt using a TabModalConfirmDialog. | 19 // Implements DownloadDangerPrompt using a TabModalConfirmDialog. |
| 19 class DownloadDangerPromptImpl | 20 class DownloadDangerPromptImpl |
| 20 : public DownloadDangerPrompt, | 21 : public DownloadDangerPrompt, |
| 21 public content::DownloadItem::Observer, | 22 public content::DownloadItem::Observer, |
| 22 public TabModalConfirmDialogDelegate { | 23 public TabModalConfirmDialogDelegate { |
| 23 public: | 24 public: |
| 24 DownloadDangerPromptImpl(content::DownloadItem* item, | 25 DownloadDangerPromptImpl(content::DownloadItem* item, |
| 25 content::WebContents* web_contents, | 26 content::WebContents* web_contents, |
| 26 bool show_context, | 27 bool show_context, |
| 27 const base::Closure& accepted, | 28 const OnDone& done); |
| 28 const base::Closure& canceled); | |
| 29 virtual ~DownloadDangerPromptImpl(); | 29 virtual ~DownloadDangerPromptImpl(); |
| 30 | 30 |
| 31 // DownloadDangerPrompt | 31 // DownloadDangerPrompt |
| 32 virtual void InvokeActionForTesting(Action action) OVERRIDE; | 32 virtual void InvokeActionForTesting(Action action) OVERRIDE; |
| 33 | 33 |
| 34 private: | 34 private: |
| 35 // content::DownloadItem::Observer | 35 // content::DownloadItem::Observer |
| 36 virtual void OnDownloadUpdated(content::DownloadItem* download) OVERRIDE; | 36 virtual void OnDownloadUpdated(content::DownloadItem* download) OVERRIDE; |
| 37 virtual void OnDownloadOpened(content::DownloadItem* download) OVERRIDE; | |
| 38 | 37 |
| 39 // TabModalConfirmDialogDelegate | 38 // TabModalConfirmDialogDelegate |
| 40 virtual string16 GetTitle() OVERRIDE; | 39 virtual string16 GetTitle() OVERRIDE; |
| 41 virtual string16 GetMessage() OVERRIDE; | 40 virtual string16 GetMessage() OVERRIDE; |
| 42 virtual string16 GetAcceptButtonTitle() OVERRIDE; | 41 virtual string16 GetAcceptButtonTitle() OVERRIDE; |
| 43 virtual void OnAccepted() OVERRIDE; | 42 virtual void OnAccepted() OVERRIDE; |
| 44 virtual void OnCanceled() OVERRIDE; | 43 virtual void OnCanceled() OVERRIDE; |
| 45 | 44 |
| 46 // Runs |callback|. PrepareToClose() is called beforehand. Doing so prevents | 45 // content::NotificationObserver implementation. |
| 47 // this object from responding to state changes in |download_| that might | 46 virtual void Observe( |
| 48 // result from invoking the callback. |callback| must refer to either | 47 int type, |
| 49 // |accepted_| or |canceled_|. | 48 const content::NotificationSource& source, |
| 50 void RunCallback(const base::Closure& callback); | 49 const content::NotificationDetails& details) OVERRIDE; |
| 51 | 50 |
| 52 // Resets |accepted_|, |canceled_| and removes the observer from |download_|, | 51 void RunDone(Action action); |
| 53 // in preparation for closing the prompt. | |
| 54 void PrepareToClose(); | |
| 55 | 52 |
| 56 content::DownloadItem* download_; | 53 content::DownloadItem* download_; |
| 57 bool show_context_; | 54 bool show_context_; |
| 58 base::Closure accepted_; | 55 OnDone done_; |
| 59 base::Closure canceled_; | |
| 60 | 56 |
| 61 DISALLOW_COPY_AND_ASSIGN(DownloadDangerPromptImpl); | 57 DISALLOW_COPY_AND_ASSIGN(DownloadDangerPromptImpl); |
| 62 }; | 58 }; |
| 63 | 59 |
| 64 DownloadDangerPromptImpl::DownloadDangerPromptImpl( | 60 DownloadDangerPromptImpl::DownloadDangerPromptImpl( |
| 65 content::DownloadItem* download, | 61 content::DownloadItem* download, |
| 66 content::WebContents* web_contents, | 62 content::WebContents* web_contents, |
| 67 bool show_context, | 63 bool show_context, |
| 68 const base::Closure& accepted, | 64 const OnDone& done) |
| 69 const base::Closure& canceled) | |
| 70 : TabModalConfirmDialogDelegate(web_contents), | 65 : TabModalConfirmDialogDelegate(web_contents), |
| 71 download_(download), | 66 download_(download), |
| 72 show_context_(show_context), | 67 show_context_(show_context), |
| 73 accepted_(accepted), | 68 done_(done) { |
| 74 canceled_(canceled) { | 69 DCHECK(!done_.is_null()); |
| 75 DCHECK(!accepted_.is_null()); | |
| 76 // canceled_ is allowed to be null. | |
| 77 DCHECK(download_); | |
| 78 download_->AddObserver(this); | 70 download_->AddObserver(this); |
| 79 } | 71 } |
| 80 | 72 |
| 81 DownloadDangerPromptImpl::~DownloadDangerPromptImpl() { | 73 DownloadDangerPromptImpl::~DownloadDangerPromptImpl() { |
| 82 // |this| might be deleted without invoking any callbacks. E.g. pressing Esc | 74 // |this| might be deleted without invoking any callbacks. E.g. pressing Esc |
| 83 // on GTK or if the user navigates away from the page showing the prompt. | 75 // on GTK or if the user navigates away from the page showing the prompt. |
| 84 PrepareToClose(); | 76 RunDone(DISMISS); |
| 85 } | 77 } |
| 86 | 78 |
| 87 void DownloadDangerPromptImpl::InvokeActionForTesting(Action action) { | 79 void DownloadDangerPromptImpl::InvokeActionForTesting(Action action) { |
| 88 if (action == ACCEPT) | 80 switch (action) { |
| 89 Accept(); | 81 case ACCEPT: Accept(); break; |
| 90 else | 82 case CANCEL: Cancel(); break; |
| 91 Cancel(); | 83 case DISMISS: |
| 84 RunDone(DISMISS); |
| 85 Cancel(); |
| 86 break; |
| 87 } |
| 92 } | 88 } |
| 93 | 89 |
| 94 void DownloadDangerPromptImpl::OnDownloadUpdated( | 90 void DownloadDangerPromptImpl::OnDownloadUpdated( |
| 95 content::DownloadItem* download) { | 91 content::DownloadItem* download) { |
| 96 // If the download is nolonger dangerous (accepted externally) or the download | 92 // If the download is nolonger dangerous (accepted externally) or the download |
| 97 // is in a terminal state, then the download danger prompt is no longer | 93 // is in a terminal state, then the download danger prompt is no longer |
| 98 // necessary. | 94 // necessary. |
| 99 if (!download->IsDangerous() || download->IsDone()) | 95 if (!download->IsDangerous() || download->IsDone()) { |
| 96 RunDone(DISMISS); |
| 100 Cancel(); | 97 Cancel(); |
| 101 } | 98 } |
| 102 | |
| 103 void DownloadDangerPromptImpl::OnDownloadOpened( | |
| 104 content::DownloadItem* download) { | |
| 105 } | 99 } |
| 106 | 100 |
| 107 string16 DownloadDangerPromptImpl::GetTitle() { | 101 string16 DownloadDangerPromptImpl::GetTitle() { |
| 108 return l10n_util::GetStringUTF16(IDS_CONFIRM_KEEP_DANGEROUS_DOWNLOAD_TITLE); | 102 return l10n_util::GetStringUTF16(IDS_CONFIRM_KEEP_DANGEROUS_DOWNLOAD_TITLE); |
| 109 } | 103 } |
| 110 | 104 |
| 111 string16 DownloadDangerPromptImpl::GetMessage() { | 105 string16 DownloadDangerPromptImpl::GetMessage() { |
| 112 if (!show_context_) | 106 if (!show_context_) |
| 113 return l10n_util::GetStringUTF16( | 107 return l10n_util::GetStringUTF16( |
| 114 IDS_PROMPT_CONFIRM_KEEP_DANGEROUS_DOWNLOAD); | 108 IDS_PROMPT_CONFIRM_KEEP_DANGEROUS_DOWNLOAD); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 132 return string16(); | 126 return string16(); |
| 133 } | 127 } |
| 134 } | 128 } |
| 135 | 129 |
| 136 string16 DownloadDangerPromptImpl::GetAcceptButtonTitle() { | 130 string16 DownloadDangerPromptImpl::GetAcceptButtonTitle() { |
| 137 return l10n_util::GetStringUTF16( | 131 return l10n_util::GetStringUTF16( |
| 138 show_context_ ? IDS_CONFIRM_DOWNLOAD : IDS_CONFIRM_DOWNLOAD_AGAIN); | 132 show_context_ ? IDS_CONFIRM_DOWNLOAD : IDS_CONFIRM_DOWNLOAD_AGAIN); |
| 139 } | 133 } |
| 140 | 134 |
| 141 void DownloadDangerPromptImpl::OnAccepted() { | 135 void DownloadDangerPromptImpl::OnAccepted() { |
| 142 RunCallback(accepted_); | 136 RunDone(ACCEPT); |
| 143 } | 137 } |
| 144 | 138 |
| 145 void DownloadDangerPromptImpl::OnCanceled() { | 139 void DownloadDangerPromptImpl::OnCanceled() { |
| 146 RunCallback(canceled_); | 140 RunDone(CANCEL); |
| 147 } | 141 } |
| 148 | 142 |
| 149 void DownloadDangerPromptImpl::RunCallback(const base::Closure& callback) { | 143 void DownloadDangerPromptImpl::Observe( |
| 144 int type, |
| 145 const content::NotificationSource& source, |
| 146 const content::NotificationDetails& details) { |
| 147 DCHECK(type == content::NOTIFICATION_LOAD_START || |
| 148 type == chrome::NOTIFICATION_TAB_CLOSING); |
| 149 RunDone(DISMISS); |
| 150 Cancel(); |
| 151 } |
| 152 |
| 153 void DownloadDangerPromptImpl::RunDone(Action action) { |
| 150 // Invoking the callback can cause the download item state to change or cause | 154 // Invoking the callback can cause the download item state to change or cause |
| 151 // the constrained window to close, and |callback| refers to a member | 155 // the constrained window to close, and |callback| refers to a member |
| 152 // variable. | 156 // variable. |
| 153 base::Closure callback_copy = callback; | 157 OnDone done = done_; |
| 154 PrepareToClose(); | 158 done_.Reset(); |
| 155 if (!callback_copy.is_null()) | |
| 156 callback_copy.Run(); | |
| 157 } | |
| 158 | |
| 159 void DownloadDangerPromptImpl::PrepareToClose() { | |
| 160 accepted_.Reset(); | |
| 161 canceled_.Reset(); | |
| 162 if (download_ != NULL) { | 159 if (download_ != NULL) { |
| 163 download_->RemoveObserver(this); | 160 download_->RemoveObserver(this); |
| 164 download_ = NULL; | 161 download_ = NULL; |
| 165 } | 162 } |
| 163 if (!done.is_null()) |
| 164 done.Run(action); |
| 166 } | 165 } |
| 167 | 166 |
| 168 } // namespace | 167 } // namespace |
| 169 | 168 |
| 170 // static | 169 // static |
| 171 DownloadDangerPrompt* DownloadDangerPrompt::Create( | 170 DownloadDangerPrompt* DownloadDangerPrompt::Create( |
| 172 content::DownloadItem* item, | 171 content::DownloadItem* item, |
| 173 content::WebContents* web_contents, | 172 content::WebContents* web_contents, |
| 174 bool show_context, | 173 bool show_context, |
| 175 const base::Closure& accepted, | 174 const OnDone& done) { |
| 176 const base::Closure& canceled) { | |
| 177 DownloadDangerPromptImpl* prompt = new DownloadDangerPromptImpl( | 175 DownloadDangerPromptImpl* prompt = new DownloadDangerPromptImpl( |
| 178 item, web_contents, show_context, accepted, canceled); | 176 item, web_contents, show_context, done); |
| 179 // |prompt| will be deleted when the dialog is done. | 177 // |prompt| will be deleted when the dialog is done. |
| 180 TabModalConfirmDialog::Create(prompt, web_contents); | 178 TabModalConfirmDialog::Create(prompt, web_contents); |
| 181 return prompt; | 179 return prompt; |
| 182 } | 180 } |
| OLD | NEW |