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

Side by Side Diff: chrome/browser/permissions/permission_request_manager.cc

Issue 2123653006: Rename PermissionBubbleRequest to PermissionRequest (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@permission_manager_rename
Patch Set: Fix missed file Created 4 years, 5 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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_request_manager.h" 5 #include "chrome/browser/permissions/permission_request_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/metrics/user_metrics_action.h" 10 #include "base/metrics/user_metrics_action.h"
11 #include "build/build_config.h" 11 #include "build/build_config.h"
12 #include "chrome/browser/permissions/permission_request.h"
12 #include "chrome/browser/permissions/permission_uma_util.h" 13 #include "chrome/browser/permissions/permission_uma_util.h"
13 #include "chrome/browser/ui/website_settings/permission_bubble_request.h"
14 #include "chrome/common/chrome_switches.h" 14 #include "chrome/common/chrome_switches.h"
15 #include "content/public/browser/browser_thread.h" 15 #include "content/public/browser/browser_thread.h"
16 #include "content/public/browser/navigation_details.h" 16 #include "content/public/browser/navigation_details.h"
17 #include "content/public/browser/user_metrics.h" 17 #include "content/public/browser/user_metrics.h"
18 #include "url/origin.h" 18 #include "url/origin.h"
19 19
20 #if !defined(OS_ANDROID) 20 #if !defined(OS_ANDROID)
21 #include "chrome/browser/ui/browser_finder.h" 21 #include "chrome/browser/ui/browser_finder.h"
22 #endif 22 #endif
23 23
24 namespace { 24 namespace {
25 25
26 class CancelledRequest : public PermissionBubbleRequest { 26 class CancelledRequest : public PermissionRequest {
27 public: 27 public:
28 explicit CancelledRequest(PermissionBubbleRequest* cancelled) 28 explicit CancelledRequest(PermissionRequest* cancelled)
29 : icon_(cancelled->GetIconId()), 29 : icon_(cancelled->GetIconId()),
30 message_fragment_(cancelled->GetMessageTextFragment()), 30 message_fragment_(cancelled->GetMessageTextFragment()),
31 origin_(cancelled->GetOrigin()) {} 31 origin_(cancelled->GetOrigin()) {}
32 ~CancelledRequest() override {} 32 ~CancelledRequest() override {}
33 33
34 int GetIconId() const override { return icon_; } 34 int GetIconId() const override { return icon_; }
35 base::string16 GetMessageTextFragment() const override { 35 base::string16 GetMessageTextFragment() const override {
36 return message_fragment_; 36 return message_fragment_;
37 } 37 }
38 GURL GetOrigin() const override { return origin_; } 38 GURL GetOrigin() const override { return origin_; }
39 39
40 // These are all no-ops since the placeholder is non-forwarding. 40 // These are all no-ops since the placeholder is non-forwarding.
41 void PermissionGranted() override {} 41 void PermissionGranted() override {}
42 void PermissionDenied() override {} 42 void PermissionDenied() override {}
43 void Cancelled() override {} 43 void Cancelled() override {}
44 44
45 void RequestFinished() override { delete this; } 45 void RequestFinished() override { delete this; }
46 46
47 private: 47 private:
48 int icon_; 48 int icon_;
49 base::string16 message_fragment_; 49 base::string16 message_fragment_;
50 GURL origin_; 50 GURL origin_;
51 }; 51 };
52 52
53 bool IsMessageTextEqual(PermissionBubbleRequest* a, 53 bool IsMessageTextEqual(PermissionRequest* a,
54 PermissionBubbleRequest* b) { 54 PermissionRequest* b) {
55 if (a == b) 55 if (a == b)
56 return true; 56 return true;
57 if (a->GetMessageTextFragment() == b->GetMessageTextFragment() && 57 if (a->GetMessageTextFragment() == b->GetMessageTextFragment() &&
58 a->GetOrigin() == b->GetOrigin()) { 58 a->GetOrigin() == b->GetOrigin()) {
59 return true; 59 return true;
60 } 60 }
61 return false; 61 return false;
62 } 62 }
63 63
64 } // namespace 64 } // namespace
(...skipping 19 matching lines...) Expand all
84 view_(nullptr), 84 view_(nullptr),
85 main_frame_has_fully_loaded_(false), 85 main_frame_has_fully_loaded_(false),
86 auto_response_for_test_(NONE), 86 auto_response_for_test_(NONE),
87 weak_factory_(this) { 87 weak_factory_(this) {
88 } 88 }
89 89
90 PermissionRequestManager::~PermissionRequestManager() { 90 PermissionRequestManager::~PermissionRequestManager() {
91 if (view_ != NULL) 91 if (view_ != NULL)
92 view_->SetDelegate(NULL); 92 view_->SetDelegate(NULL);
93 93
94 for (PermissionBubbleRequest* request : requests_) 94 for (PermissionRequest* request : requests_)
95 request->RequestFinished(); 95 request->RequestFinished();
96 for (PermissionBubbleRequest* request : queued_requests_) 96 for (PermissionRequest* request : queued_requests_)
97 request->RequestFinished(); 97 request->RequestFinished();
98 for (PermissionBubbleRequest* request : queued_frame_requests_) 98 for (PermissionRequest* request : queued_frame_requests_)
99 request->RequestFinished(); 99 request->RequestFinished();
100 for (const auto& entry : duplicate_requests_) 100 for (const auto& entry : duplicate_requests_)
101 entry.second->RequestFinished(); 101 entry.second->RequestFinished();
102 } 102 }
103 103
104 void PermissionRequestManager::AddRequest(PermissionBubbleRequest* request) { 104 void PermissionRequestManager::AddRequest(PermissionRequest* request) {
105 // TODO(tsergeant): change the UMA to no longer mention bubbles.
105 content::RecordAction(base::UserMetricsAction("PermissionBubbleRequest")); 106 content::RecordAction(base::UserMetricsAction("PermissionBubbleRequest"));
107
106 // TODO(gbillock): is there a race between an early request on a 108 // TODO(gbillock): is there a race between an early request on a
107 // newly-navigated page and the to-be-cleaned-up requests on the previous 109 // newly-navigated page and the to-be-cleaned-up requests on the previous
108 // page? We should maybe listen to DidStartNavigationToPendingEntry (and 110 // page? We should maybe listen to DidStartNavigationToPendingEntry (and
109 // any other renderer-side nav initiations?). Double-check this for 111 // any other renderer-side nav initiations?). Double-check this for
110 // correct behavior on interstitials -- we probably want to basically queue 112 // correct behavior on interstitials -- we probably want to basically queue
111 // any request for which GetVisibleURL != GetLastCommittedURL. 113 // any request for which GetVisibleURL != GetLastCommittedURL.
112 request_url_ = web_contents()->GetLastCommittedURL(); 114 request_url_ = web_contents()->GetLastCommittedURL();
113 bool is_main_frame = url::Origin(request_url_) 115 bool is_main_frame = url::Origin(request_url_)
114 .IsSameOriginWith(url::Origin(request->GetOrigin())); 116 .IsSameOriginWith(url::Origin(request->GetOrigin()));
115 117
116 // Don't re-add an existing request or one with a duplicate text request. 118 // Don't re-add an existing request or one with a duplicate text request.
117 PermissionBubbleRequest* existing_request = GetExistingRequest(request); 119 PermissionRequest* existing_request = GetExistingRequest(request);
118 if (existing_request) { 120 if (existing_request) {
119 // |request| is a duplicate. Add it to |duplicate_requests_| unless it's the 121 // |request| is a duplicate. Add it to |duplicate_requests_| unless it's the
120 // same object as |existing_request| or an existing duplicate. 122 // same object as |existing_request| or an existing duplicate.
121 if (request == existing_request) 123 if (request == existing_request)
122 return; 124 return;
123 auto range = duplicate_requests_.equal_range(existing_request); 125 auto range = duplicate_requests_.equal_range(existing_request);
124 for (auto it = range.first; it != range.second; ++it) { 126 for (auto it = range.first; it != range.second; ++it) {
125 if (request == it->second) 127 if (request == it->second)
126 return; 128 return;
127 } 129 }
(...skipping 19 matching lines...) Expand all
147 accept_states_.push_back(true); 149 accept_states_.push_back(true);
148 } else { 150 } else {
149 content::RecordAction( 151 content::RecordAction(
150 base::UserMetricsAction("PermissionBubbleIFrameRequestQueued")); 152 base::UserMetricsAction("PermissionBubbleIFrameRequestQueued"));
151 queued_frame_requests_.push_back(request); 153 queued_frame_requests_.push_back(request);
152 } 154 }
153 155
154 ScheduleShowBubble(); 156 ScheduleShowBubble();
155 } 157 }
156 158
157 void PermissionRequestManager::CancelRequest(PermissionBubbleRequest* request) { 159 void PermissionRequestManager::CancelRequest(PermissionRequest* request) {
158 // First look in the queued requests, where we can simply finish the request 160 // First look in the queued requests, where we can simply finish the request
159 // and go on. 161 // and go on.
160 std::vector<PermissionBubbleRequest*>::iterator requests_iter; 162 std::vector<PermissionRequest*>::iterator requests_iter;
161 for (requests_iter = queued_requests_.begin(); 163 for (requests_iter = queued_requests_.begin();
162 requests_iter != queued_requests_.end(); 164 requests_iter != queued_requests_.end();
163 requests_iter++) { 165 requests_iter++) {
164 if (*requests_iter == request) { 166 if (*requests_iter == request) {
165 RequestFinishedIncludingDuplicates(*requests_iter); 167 RequestFinishedIncludingDuplicates(*requests_iter);
166 queued_requests_.erase(requests_iter); 168 queued_requests_.erase(requests_iter);
167 return; 169 return;
168 } 170 }
169 } 171 }
170 for (requests_iter = queued_frame_requests_.begin(); 172 for (requests_iter = queued_frame_requests_.begin();
(...skipping 22 matching lines...) Expand all
193 195
194 if (IsBubbleVisible()) { 196 if (IsBubbleVisible()) {
195 view_->Hide(); 197 view_->Hide();
196 // Will redraw the bubble if it is being shown. 198 // Will redraw the bubble if it is being shown.
197 TriggerShowBubble(); 199 TriggerShowBubble();
198 } 200 }
199 return; 201 return;
200 } 202 }
201 203
202 // Cancel the existing request and replace it with a dummy. 204 // Cancel the existing request and replace it with a dummy.
203 PermissionBubbleRequest* cancelled_request = 205 PermissionRequest* cancelled_request =
204 new CancelledRequest(*requests_iter); 206 new CancelledRequest(*requests_iter);
205 RequestFinishedIncludingDuplicates(*requests_iter); 207 RequestFinishedIncludingDuplicates(*requests_iter);
206 *requests_iter = cancelled_request; 208 *requests_iter = cancelled_request;
207 return; 209 return;
208 } 210 }
209 211
210 // Since |request| wasn't found in queued_requests_, queued_frame_requests_ or 212 // Since |request| wasn't found in queued_requests_, queued_frame_requests_ or
211 // requests_ it must have been marked as a duplicate. We can't search 213 // requests_ it must have been marked as a duplicate. We can't search
212 // duplicate_requests_ by value, so instead use GetExistingRequest to find the 214 // duplicate_requests_ by value, so instead use GetExistingRequest to find the
213 // key (request it was duped against), and iterate through duplicates of that. 215 // key (request it was duped against), and iterate through duplicates of that.
214 PermissionBubbleRequest* existing_request = GetExistingRequest(request); 216 PermissionRequest* existing_request = GetExistingRequest(request);
215 auto range = duplicate_requests_.equal_range(existing_request); 217 auto range = duplicate_requests_.equal_range(existing_request);
216 for (auto it = range.first; it != range.second; ++it) { 218 for (auto it = range.first; it != range.second; ++it) {
217 if (request == it->second) { 219 if (request == it->second) {
218 it->second->RequestFinished(); 220 it->second->RequestFinished();
219 duplicate_requests_.erase(it); 221 duplicate_requests_.erase(it);
220 return; 222 return;
221 } 223 }
222 } 224 }
223 225
224 NOTREACHED(); // Callers should not cancel requests that are not pending. 226 NOTREACHED(); // Callers should not cancel requests that are not pending.
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 } 306 }
305 307
306 void PermissionRequestManager::ToggleAccept(int request_index, bool new_value) { 308 void PermissionRequestManager::ToggleAccept(int request_index, bool new_value) {
307 DCHECK(request_index < static_cast<int>(accept_states_.size())); 309 DCHECK(request_index < static_cast<int>(accept_states_.size()));
308 accept_states_[request_index] = new_value; 310 accept_states_[request_index] = new_value;
309 } 311 }
310 312
311 void PermissionRequestManager::Accept() { 313 void PermissionRequestManager::Accept() {
312 PermissionUmaUtil::PermissionPromptAccepted(requests_, accept_states_); 314 PermissionUmaUtil::PermissionPromptAccepted(requests_, accept_states_);
313 315
314 std::vector<PermissionBubbleRequest*>::iterator requests_iter; 316 std::vector<PermissionRequest*>::iterator requests_iter;
315 std::vector<bool>::iterator accepts_iter = accept_states_.begin(); 317 std::vector<bool>::iterator accepts_iter = accept_states_.begin();
316 for (requests_iter = requests_.begin(), accepts_iter = accept_states_.begin(); 318 for (requests_iter = requests_.begin(), accepts_iter = accept_states_.begin();
317 requests_iter != requests_.end(); 319 requests_iter != requests_.end();
318 requests_iter++, accepts_iter++) { 320 requests_iter++, accepts_iter++) {
319 if (*accepts_iter) { 321 if (*accepts_iter) {
320 PermissionGrantedIncludingDuplicates(*requests_iter); 322 PermissionGrantedIncludingDuplicates(*requests_iter);
321 } else { 323 } else {
322 PermissionDeniedIncludingDuplicates(*requests_iter); 324 PermissionDeniedIncludingDuplicates(*requests_iter);
323 } 325 }
324 } 326 }
325 FinalizeBubble(); 327 FinalizeBubble();
326 } 328 }
327 329
328 void PermissionRequestManager::Deny() { 330 void PermissionRequestManager::Deny() {
329 PermissionUmaUtil::PermissionPromptDenied(requests_); 331 PermissionUmaUtil::PermissionPromptDenied(requests_);
330 332
331 std::vector<PermissionBubbleRequest*>::iterator requests_iter; 333 std::vector<PermissionRequest*>::iterator requests_iter;
332 for (requests_iter = requests_.begin(); 334 for (requests_iter = requests_.begin();
333 requests_iter != requests_.end(); 335 requests_iter != requests_.end();
334 requests_iter++) { 336 requests_iter++) {
335 PermissionDeniedIncludingDuplicates(*requests_iter); 337 PermissionDeniedIncludingDuplicates(*requests_iter);
336 } 338 }
337 FinalizeBubble(); 339 FinalizeBubble();
338 } 340 }
339 341
340 void PermissionRequestManager::Closing() { 342 void PermissionRequestManager::Closing() {
341 std::vector<PermissionBubbleRequest*>::iterator requests_iter; 343 std::vector<PermissionRequest*>::iterator requests_iter;
342 for (requests_iter = requests_.begin(); 344 for (requests_iter = requests_.begin();
343 requests_iter != requests_.end(); 345 requests_iter != requests_.end();
344 requests_iter++) { 346 requests_iter++) {
345 CancelledIncludingDuplicates(*requests_iter); 347 CancelledIncludingDuplicates(*requests_iter);
346 } 348 }
347 FinalizeBubble(); 349 FinalizeBubble();
348 } 350 }
349 351
350 void PermissionRequestManager::ScheduleShowBubble() { 352 void PermissionRequestManager::ScheduleShowBubble() {
351 // ::ScheduleShowBubble() will be called again when the main frame will be 353 // ::ScheduleShowBubble() will be called again when the main frame will be
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 390
389 // If in testing mode, automatically respond to the bubble that was shown. 391 // If in testing mode, automatically respond to the bubble that was shown.
390 if (auto_response_for_test_ != NONE) 392 if (auto_response_for_test_ != NONE)
391 DoAutoResponseForTesting(); 393 DoAutoResponseForTesting();
392 } 394 }
393 395
394 void PermissionRequestManager::FinalizeBubble() { 396 void PermissionRequestManager::FinalizeBubble() {
395 if (view_) 397 if (view_)
396 view_->Hide(); 398 view_->Hide();
397 399
398 std::vector<PermissionBubbleRequest*>::iterator requests_iter; 400 std::vector<PermissionRequest*>::iterator requests_iter;
399 for (requests_iter = requests_.begin(); 401 for (requests_iter = requests_.begin();
400 requests_iter != requests_.end(); 402 requests_iter != requests_.end();
401 requests_iter++) { 403 requests_iter++) {
402 RequestFinishedIncludingDuplicates(*requests_iter); 404 RequestFinishedIncludingDuplicates(*requests_iter);
403 } 405 }
404 requests_.clear(); 406 requests_.clear();
405 accept_states_.clear(); 407 accept_states_.clear();
406 if (queued_requests_.size() || queued_frame_requests_.size()) 408 if (queued_requests_.size() || queued_frame_requests_.size())
407 TriggerShowBubble(); 409 TriggerShowBubble();
408 else 410 else
409 request_url_ = GURL(); 411 request_url_ = GURL();
410 } 412 }
411 413
412 void PermissionRequestManager::CancelPendingQueues() { 414 void PermissionRequestManager::CancelPendingQueues() {
413 std::vector<PermissionBubbleRequest*>::iterator requests_iter; 415 std::vector<PermissionRequest*>::iterator requests_iter;
414 for (requests_iter = queued_requests_.begin(); 416 for (requests_iter = queued_requests_.begin();
415 requests_iter != queued_requests_.end(); 417 requests_iter != queued_requests_.end();
416 requests_iter++) { 418 requests_iter++) {
417 RequestFinishedIncludingDuplicates(*requests_iter); 419 RequestFinishedIncludingDuplicates(*requests_iter);
418 } 420 }
419 for (requests_iter = queued_frame_requests_.begin(); 421 for (requests_iter = queued_frame_requests_.begin();
420 requests_iter != queued_frame_requests_.end(); 422 requests_iter != queued_frame_requests_.end();
421 requests_iter++) { 423 requests_iter++) {
422 RequestFinishedIncludingDuplicates(*requests_iter); 424 RequestFinishedIncludingDuplicates(*requests_iter);
423 } 425 }
424 queued_requests_.clear(); 426 queued_requests_.clear();
425 queued_frame_requests_.clear(); 427 queued_frame_requests_.clear();
426 } 428 }
427 429
428 PermissionBubbleRequest* PermissionRequestManager::GetExistingRequest( 430 PermissionRequest* PermissionRequestManager::GetExistingRequest(
429 PermissionBubbleRequest* request) { 431 PermissionRequest* request) {
430 for (PermissionBubbleRequest* existing_request : requests_) 432 for (PermissionRequest* existing_request : requests_)
431 if (IsMessageTextEqual(existing_request, request)) 433 if (IsMessageTextEqual(existing_request, request))
432 return existing_request; 434 return existing_request;
433 for (PermissionBubbleRequest* existing_request : queued_requests_) 435 for (PermissionRequest* existing_request : queued_requests_)
434 if (IsMessageTextEqual(existing_request, request)) 436 if (IsMessageTextEqual(existing_request, request))
435 return existing_request; 437 return existing_request;
436 for (PermissionBubbleRequest* existing_request : queued_frame_requests_) 438 for (PermissionRequest* existing_request : queued_frame_requests_)
437 if (IsMessageTextEqual(existing_request, request)) 439 if (IsMessageTextEqual(existing_request, request))
438 return existing_request; 440 return existing_request;
439 return nullptr; 441 return nullptr;
440 } 442 }
441 443
442 void PermissionRequestManager::PermissionGrantedIncludingDuplicates( 444 void PermissionRequestManager::PermissionGrantedIncludingDuplicates(
443 PermissionBubbleRequest* request) { 445 PermissionRequest* request) {
444 DCHECK_EQ(request, GetExistingRequest(request)) 446 DCHECK_EQ(request, GetExistingRequest(request))
445 << "Only requests in [queued_[frame_]]requests_ can have duplicates"; 447 << "Only requests in [queued_[frame_]]requests_ can have duplicates";
446 request->PermissionGranted(); 448 request->PermissionGranted();
447 auto range = duplicate_requests_.equal_range(request); 449 auto range = duplicate_requests_.equal_range(request);
448 for (auto it = range.first; it != range.second; ++it) 450 for (auto it = range.first; it != range.second; ++it)
449 it->second->PermissionGranted(); 451 it->second->PermissionGranted();
450 } 452 }
451 void PermissionRequestManager::PermissionDeniedIncludingDuplicates( 453 void PermissionRequestManager::PermissionDeniedIncludingDuplicates(
452 PermissionBubbleRequest* request) { 454 PermissionRequest* request) {
453 DCHECK_EQ(request, GetExistingRequest(request)) 455 DCHECK_EQ(request, GetExistingRequest(request))
454 << "Only requests in [queued_[frame_]]requests_ can have duplicates"; 456 << "Only requests in [queued_[frame_]]requests_ can have duplicates";
455 request->PermissionDenied(); 457 request->PermissionDenied();
456 auto range = duplicate_requests_.equal_range(request); 458 auto range = duplicate_requests_.equal_range(request);
457 for (auto it = range.first; it != range.second; ++it) 459 for (auto it = range.first; it != range.second; ++it)
458 it->second->PermissionDenied(); 460 it->second->PermissionDenied();
459 } 461 }
460 void PermissionRequestManager::CancelledIncludingDuplicates( 462 void PermissionRequestManager::CancelledIncludingDuplicates(
461 PermissionBubbleRequest* request) { 463 PermissionRequest* request) {
462 DCHECK_EQ(request, GetExistingRequest(request)) 464 DCHECK_EQ(request, GetExistingRequest(request))
463 << "Only requests in [queued_[frame_]]requests_ can have duplicates"; 465 << "Only requests in [queued_[frame_]]requests_ can have duplicates";
464 request->Cancelled(); 466 request->Cancelled();
465 auto range = duplicate_requests_.equal_range(request); 467 auto range = duplicate_requests_.equal_range(request);
466 for (auto it = range.first; it != range.second; ++it) 468 for (auto it = range.first; it != range.second; ++it)
467 it->second->Cancelled(); 469 it->second->Cancelled();
468 } 470 }
469 void PermissionRequestManager::RequestFinishedIncludingDuplicates( 471 void PermissionRequestManager::RequestFinishedIncludingDuplicates(
470 PermissionBubbleRequest* request) { 472 PermissionRequest* request) {
471 // We can't call GetExistingRequest here, because other entries in requests_, 473 // We can't call GetExistingRequest here, because other entries in requests_,
472 // queued_requests_ or queued_frame_requests_ might already have been deleted. 474 // queued_requests_ or queued_frame_requests_ might already have been deleted.
473 DCHECK_EQ(1, std::count(requests_.begin(), requests_.end(), request) + 475 DCHECK_EQ(1, std::count(requests_.begin(), requests_.end(), request) +
474 std::count(queued_requests_.begin(), queued_requests_.end(), 476 std::count(queued_requests_.begin(), queued_requests_.end(),
475 request) + 477 request) +
476 std::count(queued_frame_requests_.begin(), 478 std::count(queued_frame_requests_.begin(),
477 queued_frame_requests_.end(), request)) 479 queued_frame_requests_.end(), request))
478 << "Only requests in [queued_[frame_]]requests_ can have duplicates"; 480 << "Only requests in [queued_[frame_]]requests_ can have duplicates";
479 request->RequestFinished(); 481 request->RequestFinished();
480 // Beyond this point, |request| has probably been deleted. 482 // Beyond this point, |request| has probably been deleted.
(...skipping 24 matching lines...) Expand all
505 case DENY_ALL: 507 case DENY_ALL:
506 Deny(); 508 Deny();
507 break; 509 break;
508 case DISMISS: 510 case DISMISS:
509 Closing(); 511 Closing();
510 break; 512 break;
511 case NONE: 513 case NONE:
512 NOTREACHED(); 514 NOTREACHED();
513 } 515 }
514 } 516 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698