OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 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/permissions/permission_queue_controller.h" | 5 #include "chrome/browser/permissions/permission_queue_controller.h" |
6 | 6 |
7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
8 #include "chrome/browser/chrome_notification_types.h" | 8 #include "chrome/browser/chrome_notification_types.h" |
9 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" | 9 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" |
10 #include "chrome/browser/infobars/infobar_service.h" | 10 #include "chrome/browser/infobars/infobar_service.h" |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 content::WebContents* other_web_contents = tab_util::GetWebContentsByFrameID( | 47 content::WebContents* other_web_contents = tab_util::GetWebContentsByFrameID( |
48 other_request.render_process_id(), other_request.render_frame_id()); | 48 other_request.render_process_id(), other_request.render_frame_id()); |
49 | 49 |
50 return web_contents == other_web_contents; | 50 return web_contents == other_web_contents; |
51 } | 51 } |
52 | 52 |
53 } // anonymous namespace | 53 } // anonymous namespace |
54 | 54 |
55 class PermissionQueueController::PendingInfobarRequest { | 55 class PermissionQueueController::PendingInfobarRequest { |
56 public: | 56 public: |
57 PendingInfobarRequest(content::PermissionType type, | 57 PendingInfobarRequest(ContentSettingsType type, |
58 const PermissionRequestID& id, | 58 const PermissionRequestID& id, |
59 const GURL& requesting_frame, | 59 const GURL& requesting_frame, |
60 const GURL& embedder, | 60 const GURL& embedder, |
61 bool user_gesture, | 61 bool user_gesture, |
62 Profile* profile, | 62 Profile* profile, |
63 const PermissionDecidedCallback& callback); | 63 const PermissionDecidedCallback& callback); |
64 ~PendingInfobarRequest(); | 64 ~PendingInfobarRequest(); |
65 | 65 |
66 bool IsForPair(const GURL& requesting_frame, | 66 bool IsForPair(const GURL& requesting_frame, |
67 const GURL& embedder) const; | 67 const GURL& embedder) const; |
(...skipping 10 matching lines...) Expand all Loading... |
78 const GURL& requesting_frame() const { return requesting_frame_; } | 78 const GURL& requesting_frame() const { return requesting_frame_; } |
79 bool has_gesture() const { return user_gesture_; } | 79 bool has_gesture() const { return user_gesture_; } |
80 bool has_infobar() const { return !!infobar_; } | 80 bool has_infobar() const { return !!infobar_; } |
81 bool has_dialog() const { return has_dialog_; } | 81 bool has_dialog() const { return has_dialog_; } |
82 infobars::InfoBar* infobar() { return infobar_; } | 82 infobars::InfoBar* infobar() { return infobar_; } |
83 | 83 |
84 void RunCallback(ContentSetting content_setting); | 84 void RunCallback(ContentSetting content_setting); |
85 void CreatePrompt(PermissionQueueController* controller, bool show_dialog); | 85 void CreatePrompt(PermissionQueueController* controller, bool show_dialog); |
86 | 86 |
87 private: | 87 private: |
88 content::PermissionType type_; | 88 ContentSettingsType type_; |
89 PermissionRequestID id_; | 89 PermissionRequestID id_; |
90 GURL requesting_frame_; | 90 GURL requesting_frame_; |
91 GURL embedder_; | 91 GURL embedder_; |
92 bool user_gesture_; | 92 bool user_gesture_; |
93 Profile* profile_; | 93 Profile* profile_; |
94 PermissionDecidedCallback callback_; | 94 PermissionDecidedCallback callback_; |
95 infobars::InfoBar* infobar_; | 95 infobars::InfoBar* infobar_; |
96 bool has_dialog_; | 96 bool has_dialog_; |
97 | 97 |
98 // Purposefully do not disable copying, as this is stored in STL containers. | 98 // Purposefully do not disable copying, as this is stored in STL containers. |
99 }; | 99 }; |
100 | 100 |
101 PermissionQueueController::PendingInfobarRequest::PendingInfobarRequest( | 101 PermissionQueueController::PendingInfobarRequest::PendingInfobarRequest( |
102 content::PermissionType type, | 102 ContentSettingsType type, |
103 const PermissionRequestID& id, | 103 const PermissionRequestID& id, |
104 const GURL& requesting_frame, | 104 const GURL& requesting_frame, |
105 const GURL& embedder, | 105 const GURL& embedder, |
106 bool user_gesture, | 106 bool user_gesture, |
107 Profile* profile, | 107 Profile* profile, |
108 const PermissionDecidedCallback& callback) | 108 const PermissionDecidedCallback& callback) |
109 : type_(type), | 109 : type_(type), |
110 id_(id), | 110 id_(id), |
111 requesting_frame_(requesting_frame), | 111 requesting_frame_(requesting_frame), |
112 embedder_(embedder), | 112 embedder_(embedder), |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 callback); | 153 callback); |
154 } else { | 154 } else { |
155 infobar_ = PermissionInfoBarDelegate::Create( | 155 infobar_ = PermissionInfoBarDelegate::Create( |
156 GetInfoBarService(id_), type_, requesting_frame_, user_gesture_, | 156 GetInfoBarService(id_), type_, requesting_frame_, user_gesture_, |
157 profile_, callback); | 157 profile_, callback); |
158 } | 158 } |
159 } | 159 } |
160 | 160 |
161 PermissionQueueController::PermissionQueueController( | 161 PermissionQueueController::PermissionQueueController( |
162 Profile* profile, | 162 Profile* profile, |
163 content::PermissionType permission_type, | |
164 ContentSettingsType content_settings_type) | 163 ContentSettingsType content_settings_type) |
165 : profile_(profile), | 164 : profile_(profile), |
166 permission_type_(permission_type), | |
167 content_settings_type_(content_settings_type), | 165 content_settings_type_(content_settings_type), |
168 in_shutdown_(false) {} | 166 in_shutdown_(false) {} |
169 | 167 |
170 PermissionQueueController::~PermissionQueueController() { | 168 PermissionQueueController::~PermissionQueueController() { |
171 // Cancel all outstanding requests. | 169 // Cancel all outstanding requests. |
172 in_shutdown_ = true; | 170 in_shutdown_ = true; |
173 while (!pending_infobar_requests_.empty()) | 171 while (!pending_infobar_requests_.empty()) |
174 CancelInfoBarRequest(pending_infobar_requests_.front().id()); | 172 CancelInfoBarRequest(pending_infobar_requests_.front().id()); |
175 } | 173 } |
176 | 174 |
177 void PermissionQueueController::CreateInfoBarRequest( | 175 void PermissionQueueController::CreateInfoBarRequest( |
178 const PermissionRequestID& id, | 176 const PermissionRequestID& id, |
179 const GURL& requesting_frame, | 177 const GURL& requesting_frame, |
180 const GURL& embedder, | 178 const GURL& embedder, |
181 bool user_gesture, | 179 bool user_gesture, |
182 const PermissionDecidedCallback& callback) { | 180 const PermissionDecidedCallback& callback) { |
183 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 181 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
184 | 182 |
185 if (requesting_frame.SchemeIs(content::kChromeUIScheme) || | 183 if (requesting_frame.SchemeIs(content::kChromeUIScheme) || |
186 embedder.SchemeIs(content::kChromeUIScheme)) | 184 embedder.SchemeIs(content::kChromeUIScheme)) |
187 return; | 185 return; |
188 | 186 |
189 pending_infobar_requests_.push_back( | 187 pending_infobar_requests_.push_back( |
190 PendingInfobarRequest(permission_type_, id, requesting_frame, embedder, | 188 PendingInfobarRequest(content_settings_type_, id, requesting_frame, |
191 user_gesture, profile_, callback)); | 189 embedder, user_gesture, profile_, callback)); |
192 if (!AlreadyShowingInfoBarForTab(id)) | 190 if (!AlreadyShowingInfoBarForTab(id)) |
193 ShowQueuedInfoBarForTab(id); | 191 ShowQueuedInfoBarForTab(id); |
194 } | 192 } |
195 | 193 |
196 void PermissionQueueController::CancelInfoBarRequest( | 194 void PermissionQueueController::CancelInfoBarRequest( |
197 const PermissionRequestID& id) { | 195 const PermissionRequestID& id) { |
198 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 196 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
199 | 197 |
200 for (PendingInfobarRequests::iterator i(pending_infobar_requests_.begin()); | 198 for (PendingInfobarRequests::iterator i(pending_infobar_requests_.begin()); |
201 i != pending_infobar_requests_.end(); ++i) { | 199 i != pending_infobar_requests_.end(); ++i) { |
(...skipping 11 matching lines...) Expand all Loading... |
213 | 211 |
214 void PermissionQueueController::OnPermissionSet(const PermissionRequestID& id, | 212 void PermissionQueueController::OnPermissionSet(const PermissionRequestID& id, |
215 const GURL& requesting_frame, | 213 const GURL& requesting_frame, |
216 const GURL& embedder, | 214 const GURL& embedder, |
217 bool user_gesture, | 215 bool user_gesture, |
218 bool update_content_setting, | 216 bool update_content_setting, |
219 PermissionAction decision) { | 217 PermissionAction decision) { |
220 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 218 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
221 | 219 |
222 PermissionRequestType request_type = | 220 PermissionRequestType request_type = |
223 PermissionUtil::GetRequestType(permission_type_); | 221 PermissionUtil::GetRequestType(content_settings_type_); |
224 PermissionRequestGestureType gesture_type = | 222 PermissionRequestGestureType gesture_type = |
225 PermissionUtil::GetGestureType(user_gesture); | 223 PermissionUtil::GetGestureType(user_gesture); |
226 switch (decision) { | 224 switch (decision) { |
227 case GRANTED: | 225 case GRANTED: |
228 PermissionUmaUtil::PermissionGranted(permission_type_, gesture_type, | 226 PermissionUmaUtil::PermissionGranted(content_settings_type_, gesture_type, |
229 requesting_frame, profile_); | 227 requesting_frame, profile_); |
230 PermissionUmaUtil::RecordPermissionPromptAccepted(request_type, | 228 PermissionUmaUtil::RecordPermissionPromptAccepted(request_type, |
231 gesture_type); | 229 gesture_type); |
232 PermissionUmaUtil::RecordPermissionEmbargoStatus( | 230 PermissionUmaUtil::RecordPermissionEmbargoStatus( |
233 PermissionEmbargoStatus::NOT_EMBARGOED); | 231 PermissionEmbargoStatus::NOT_EMBARGOED); |
234 break; | 232 break; |
235 case DENIED: | 233 case DENIED: |
236 PermissionUmaUtil::PermissionDenied(permission_type_, gesture_type, | 234 PermissionUmaUtil::PermissionDenied(content_settings_type_, gesture_type, |
237 requesting_frame, profile_); | 235 requesting_frame, profile_); |
238 PermissionUmaUtil::RecordPermissionPromptDenied(request_type, | 236 PermissionUmaUtil::RecordPermissionPromptDenied(request_type, |
239 gesture_type); | 237 gesture_type); |
240 PermissionUmaUtil::RecordPermissionEmbargoStatus( | 238 PermissionUmaUtil::RecordPermissionEmbargoStatus( |
241 PermissionEmbargoStatus::NOT_EMBARGOED); | 239 PermissionEmbargoStatus::NOT_EMBARGOED); |
242 break; | 240 break; |
243 case DISMISSED: | 241 case DISMISSED: |
244 PermissionUmaUtil::PermissionDismissed(permission_type_, gesture_type, | 242 PermissionUmaUtil::PermissionDismissed( |
245 requesting_frame, profile_); | 243 content_settings_type_, gesture_type, requesting_frame, profile_); |
246 if (PermissionDecisionAutoBlocker::GetForProfile(profile_) | 244 if (PermissionDecisionAutoBlocker::GetForProfile(profile_) |
247 ->RecordDismissAndEmbargo(requesting_frame, permission_type_)) { | 245 ->RecordDismissAndEmbargo(requesting_frame, |
| 246 content_settings_type_)) { |
248 PermissionUmaUtil::RecordPermissionEmbargoStatus( | 247 PermissionUmaUtil::RecordPermissionEmbargoStatus( |
249 PermissionEmbargoStatus::REPEATED_DISMISSALS); | 248 PermissionEmbargoStatus::REPEATED_DISMISSALS); |
250 } else { | 249 } else { |
251 PermissionUmaUtil::RecordPermissionEmbargoStatus( | 250 PermissionUmaUtil::RecordPermissionEmbargoStatus( |
252 PermissionEmbargoStatus::NOT_EMBARGOED); | 251 PermissionEmbargoStatus::NOT_EMBARGOED); |
253 } | 252 } |
254 break; | 253 break; |
255 default: | 254 default: |
256 NOTREACHED(); | 255 NOTREACHED(); |
257 } | 256 } |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 if (requesting_frame.GetOrigin().SchemeIsFile()) { | 440 if (requesting_frame.GetOrigin().SchemeIsFile()) { |
442 // Chrome can be launched with --disable-web-security which allows | 441 // Chrome can be launched with --disable-web-security which allows |
443 // geolocation requests from file:// URLs. We don't want to store these | 442 // geolocation requests from file:// URLs. We don't want to store these |
444 // in the host content settings map. | 443 // in the host content settings map. |
445 return; | 444 return; |
446 } | 445 } |
447 | 446 |
448 ContentSetting content_setting = | 447 ContentSetting content_setting = |
449 (decision == GRANTED) ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; | 448 (decision == GRANTED) ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; |
450 | 449 |
| 450 // TODO(timloh): Remove this logic when push and notification permissions |
| 451 // are reconciled, see crbug.com/563297. |
| 452 ContentSettingsType type_for_map = content_settings_type_; |
| 453 if (type_for_map == CONTENT_SETTINGS_TYPE_PUSH_MESSAGING) |
| 454 type_for_map = CONTENT_SETTINGS_TYPE_NOTIFICATIONS; |
451 HostContentSettingsMapFactory::GetForProfile(profile_) | 455 HostContentSettingsMapFactory::GetForProfile(profile_) |
452 ->SetContentSettingDefaultScope( | 456 ->SetContentSettingDefaultScope( |
453 requesting_frame.GetOrigin(), embedder.GetOrigin(), | 457 requesting_frame.GetOrigin(), embedder.GetOrigin(), |
454 content_settings_type_, std::string(), content_setting); | 458 type_for_map, std::string(), content_setting); |
455 } | 459 } |
OLD | NEW |