Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(90)

Side by Side Diff: chrome/browser/download/download_request_manager.cc

Issue 275011: Make the multiple download request dialog an infobar.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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_request_manager.h" 5 #include "chrome/browser/download/download_request_manager.h"
6 6
7 #include "base/message_loop.h" 7 #include "base/message_loop.h"
8 #include "base/thread.h" 8 #include "base/thread.h"
9 #include "chrome/browser/download/download_request_dialog_delegate.h" 9 #include "chrome/browser/download/download_request_infobar_delegate.h"
10 #include "chrome/browser/tab_contents/navigation_controller.h" 10 #include "chrome/browser/tab_contents/navigation_controller.h"
11 #include "chrome/browser/tab_contents/navigation_entry.h" 11 #include "chrome/browser/tab_contents/navigation_entry.h"
12 #include "chrome/browser/tab_contents/tab_contents_delegate.h" 12 #include "chrome/browser/tab_contents/tab_contents_delegate.h"
13 #include "chrome/browser/tab_contents/tab_util.h" 13 #include "chrome/browser/tab_contents/tab_util.h"
14 #include "chrome/browser/tab_contents/tab_contents.h" 14 #include "chrome/browser/tab_contents/tab_contents.h"
15 #include "chrome/common/notification_service.h" 15 #include "chrome/common/notification_service.h"
16 16
17 // TabDownloadState ------------------------------------------------------------ 17 // TabDownloadState ------------------------------------------------------------
18 18
19 DownloadRequestManager::TabDownloadState::TabDownloadState( 19 DownloadRequestManager::TabDownloadState::TabDownloadState(
20 DownloadRequestManager* host, 20 DownloadRequestManager* host,
21 NavigationController* controller, 21 NavigationController* controller,
22 NavigationController* originating_controller) 22 NavigationController* originating_controller)
23 : host_(host), 23 : host_(host),
24 controller_(controller), 24 controller_(controller),
25 status_(DownloadRequestManager::ALLOW_ONE_DOWNLOAD), 25 status_(DownloadRequestManager::ALLOW_ONE_DOWNLOAD),
26 dialog_delegate_(NULL) { 26 infobar_(NULL) {
27 Source<NavigationController> notification_source(controller); 27 Source<NavigationController> notification_source(controller);
28 registrar_.Add(this, NotificationType::NAV_ENTRY_PENDING, 28 registrar_.Add(this, NotificationType::NAV_ENTRY_PENDING,
29 notification_source); 29 notification_source);
30 registrar_.Add(this, NotificationType::TAB_CLOSED, notification_source); 30 registrar_.Add(this, NotificationType::TAB_CLOSED, notification_source);
31 31
32 NavigationEntry* active_entry = originating_controller ? 32 NavigationEntry* active_entry = originating_controller ?
33 originating_controller->GetActiveEntry() : controller->GetActiveEntry(); 33 originating_controller->GetActiveEntry() : controller->GetActiveEntry();
34 if (active_entry) 34 if (active_entry)
35 initial_page_host_ = active_entry->url().host(); 35 initial_page_host_ = active_entry->url().host();
36 } 36 }
37 37
38 DownloadRequestManager::TabDownloadState::~TabDownloadState() { 38 DownloadRequestManager::TabDownloadState::~TabDownloadState() {
39 // We should only be destroyed after the callbacks have been notified. 39 // We should only be destroyed after the callbacks have been notified.
40 DCHECK(callbacks_.empty()); 40 DCHECK(callbacks_.empty());
41 41
42 // And we should have closed the message box. 42 // And we should have closed the infobar.
43 DCHECK(!dialog_delegate_); 43 DCHECK(!infobar_);
44 } 44 }
45 45
46 void DownloadRequestManager::TabDownloadState::OnUserGesture() { 46 void DownloadRequestManager::TabDownloadState::OnUserGesture() {
47 if (is_showing_prompt()) { 47 if (is_showing_prompt()) {
48 // Don't change the state if the user clicks on the page some where. 48 // Don't change the state if the user clicks on the page some where.
49 return; 49 return;
50 } 50 }
51 51
52 if (status_ != DownloadRequestManager::ALLOW_ALL_DOWNLOADS && 52 if (status_ != DownloadRequestManager::ALLOW_ALL_DOWNLOADS &&
53 status_ != DownloadRequestManager::DOWNLOADS_NOT_ALLOWED) { 53 status_ != DownloadRequestManager::DOWNLOADS_NOT_ALLOWED) {
54 // Revert to default status. 54 // Revert to default status.
55 host_->Remove(this); 55 host_->Remove(this);
56 // WARNING: We've been deleted. 56 // WARNING: We've been deleted.
57 return; 57 return;
58 } 58 }
59 } 59 }
60 60
61 void DownloadRequestManager::TabDownloadState::PromptUserForDownload( 61 void DownloadRequestManager::TabDownloadState::PromptUserForDownload(
62 TabContents* tab, 62 TabContents* tab,
63 DownloadRequestManager::Callback* callback) { 63 DownloadRequestManager::Callback* callback) {
64 callbacks_.push_back(callback); 64 callbacks_.push_back(callback);
65 65
66 if (is_showing_prompt()) 66 if (is_showing_prompt())
67 return; // Already showing prompt. 67 return; // Already showing prompt.
68 68
69 if (DownloadRequestManager::delegate_) { 69 if (DownloadRequestManager::delegate_) {
70 NotifyCallbacks(DownloadRequestManager::delegate_->ShouldAllowDownload()); 70 NotifyCallbacks(DownloadRequestManager::delegate_->ShouldAllowDownload());
71 } else { 71 } else {
72 dialog_delegate_ = DownloadRequestDialogDelegate::Create(tab, this); 72 infobar_ = new DownloadRequestInfoBarDelegate(tab, this);
73 } 73 }
74 } 74 }
75 75
76 void DownloadRequestManager::TabDownloadState::Cancel() { 76 void DownloadRequestManager::TabDownloadState::Cancel() {
77 NotifyCallbacks(false); 77 NotifyCallbacks(false);
78 } 78 }
79 79
80 void DownloadRequestManager::TabDownloadState::Accept() { 80 void DownloadRequestManager::TabDownloadState::Accept() {
81 NotifyCallbacks(true); 81 NotifyCallbacks(true);
82 } 82 }
(...skipping 19 matching lines...) Expand all
102 // 100% right, so we don't deal with it. 102 // 100% right, so we don't deal with it.
103 NavigationEntry* entry = controller_->pending_entry(); 103 NavigationEntry* entry = controller_->pending_entry();
104 if (!entry) 104 if (!entry)
105 return; 105 return;
106 106
107 if (PageTransition::IsRedirect(entry->transition_type())) { 107 if (PageTransition::IsRedirect(entry->transition_type())) {
108 // Redirects don't count. 108 // Redirects don't count.
109 return; 109 return;
110 } 110 }
111 111
112 if (is_showing_prompt()) { 112 if (status_ == DownloadRequestManager::ALLOW_ALL_DOWNLOADS ||
113 // We're prompting the user and they navigated away. Close the popup and 113 status_ == DownloadRequestManager::DOWNLOADS_NOT_ALLOWED) {
114 // cancel the downloads.
115 dialog_delegate_->CloseWindow();
116 // After switch we'll notify callbacks and get deleted.
117 } else if (status_ == DownloadRequestManager::ALLOW_ALL_DOWNLOADS ||
118 status_ == DownloadRequestManager::DOWNLOADS_NOT_ALLOWED) {
119 // User has either allowed all downloads or canceled all downloads. Only 114 // User has either allowed all downloads or canceled all downloads. Only
120 // reset the download state if the user is navigating to a different 115 // reset the download state if the user is navigating to a different
121 // host (or host is empty). 116 // host (or host is empty).
122 if (!initial_page_host_.empty() && !entry->url().host().empty() && 117 if (!initial_page_host_.empty() && !entry->url().host().empty() &&
123 entry->url().host() == initial_page_host_) { 118 entry->url().host() == initial_page_host_) {
124 return; 119 return;
125 } 120 }
126 } // else case: we're not prompting user and user hasn't allowed or 121 }
127 // disallowed downloads, break so that we get deleted after switch.
128 break; 122 break;
129 } 123 }
130 124
131 case NotificationType::TAB_CLOSED: 125 case NotificationType::TAB_CLOSED:
132 // Tab closed, no need to handle closing the dialog as it's owned by the 126 // Tab closed, no need to handle closing the dialog as it's owned by the
133 // TabContents, break so that we get deleted after switch. 127 // TabContents, break so that we get deleted after switch.
134 break; 128 break;
135 129
136 default: 130 default:
137 NOTREACHED(); 131 NOTREACHED();
138 } 132 }
139 133
140 NotifyCallbacks(false); 134 NotifyCallbacks(false);
141 host_->Remove(this); 135 host_->Remove(this);
142 } 136 }
143 137
144 void DownloadRequestManager::TabDownloadState::NotifyCallbacks(bool allow) { 138 void DownloadRequestManager::TabDownloadState::NotifyCallbacks(bool allow) {
145 if (dialog_delegate_) { 139 if (infobar_) {
146 // Reset the delegate so we don't get notified again. 140 // Reset the delegate so we don't get notified again.
147 dialog_delegate_->set_host(NULL); 141 infobar_->set_host(NULL);
148 dialog_delegate_ = NULL; 142 infobar_ = NULL;
149 } 143 }
150 status_ = allow ? 144 status_ = allow ?
151 DownloadRequestManager::ALLOW_ALL_DOWNLOADS : 145 DownloadRequestManager::ALLOW_ALL_DOWNLOADS :
152 DownloadRequestManager::DOWNLOADS_NOT_ALLOWED; 146 DownloadRequestManager::DOWNLOADS_NOT_ALLOWED;
153 std::vector<DownloadRequestManager::Callback*> callbacks; 147 std::vector<DownloadRequestManager::Callback*> callbacks;
154 callbacks.swap(callbacks_); 148 callbacks.swap(callbacks_);
155 for (size_t i = 0; i < callbacks.size(); ++i) 149 for (size_t i = 0; i < callbacks.size(); ++i)
156 host_->ScheduleNotification(callbacks[i], allow); 150 host_->ScheduleNotification(callbacks[i], allow);
157 } 151 }
158 152
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 285
292 void DownloadRequestManager::Remove(TabDownloadState* state) { 286 void DownloadRequestManager::Remove(TabDownloadState* state) {
293 DCHECK(state_map_.find(state->controller()) != state_map_.end()); 287 DCHECK(state_map_.find(state->controller()) != state_map_.end());
294 state_map_.erase(state->controller()); 288 state_map_.erase(state->controller());
295 delete state; 289 delete state;
296 } 290 }
297 291
298 // static 292 // static
299 DownloadRequestManager::TestingDelegate* DownloadRequestManager::delegate_ = 293 DownloadRequestManager::TestingDelegate* DownloadRequestManager::delegate_ =
300 NULL; 294 NULL;
OLDNEW
« no previous file with comments | « chrome/browser/download/download_request_manager.h ('k') | chrome/browser/extensions/extension_disabled_infobar_delegate.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698