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

Side by Side Diff: android_webview/native/permission/permission_request_handler.cc

Issue 288463003: Cancel the permission request (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix unittests Created 6 years, 7 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 "android_webview/native/permission/permission_request_handler.h" 5 #include "android_webview/native/permission/permission_request_handler.h"
6 6
7 #include "android_webview/native/permission/aw_permission_request.h" 7 #include "android_webview/native/permission/aw_permission_request.h"
8 #include "android_webview/native/permission/aw_permission_request_delegate.h" 8 #include "android_webview/native/permission/aw_permission_request_delegate.h"
9 #include "android_webview/native/permission/permission_request_handler_client.h" 9 #include "android_webview/native/permission/permission_request_handler_client.h"
10 #include "base/android/scoped_java_ref.h" 10 #include "base/android/scoped_java_ref.h"
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "content/public/browser/navigation_details.h"
13 #include "content/public/browser/navigation_entry.h"
14 #include "content/public/browser/web_contents.h"
12 15
13 using base::android::ScopedJavaLocalRef; 16 using base::android::ScopedJavaLocalRef;
14 17
15 namespace android_webview { 18 namespace android_webview {
16 19
20 namespace {
21
22 int GetActiveEntryID(content::WebContents* web_contents) {
23 if (!web_contents) return 0;
24
25 content::NavigationEntry* active_entry =
26 web_contents->GetController().GetActiveEntry();
27 return active_entry ? active_entry->GetUniqueID() : 0;
28 }
29
30 } // namespace
31
17 PermissionRequestHandler::PermissionRequestHandler( 32 PermissionRequestHandler::PermissionRequestHandler(
18 PermissionRequestHandlerClient* client) 33 PermissionRequestHandlerClient* client, content::WebContents* web_contents)
19 : client_(client) { 34 : content::WebContentsObserver(web_contents),
35 client_(client),
36 contents_unique_id_(GetActiveEntryID(web_contents)) {
20 } 37 }
21 38
22 PermissionRequestHandler::~PermissionRequestHandler() { 39 PermissionRequestHandler::~PermissionRequestHandler() {
23 for (RequestIterator i = requests_.begin(); i != requests_.end(); ++i) 40 CancelAllRequests();
24 CancelRequest(i);
25 } 41 }
26 42
27 void PermissionRequestHandler::SendRequest( 43 void PermissionRequestHandler::SendRequest(
28 scoped_ptr<AwPermissionRequestDelegate> request) { 44 scoped_ptr<AwPermissionRequestDelegate> request) {
29 if (Preauthorized(request->GetOrigin(), request->GetResources())) { 45 if (Preauthorized(request->GetOrigin(), request->GetResources())) {
30 request->NotifyRequestResult(true); 46 request->NotifyRequestResult(true);
31 return; 47 return;
32 } 48 }
33 49
34 AwPermissionRequest* aw_request = new AwPermissionRequest(request.Pass()); 50 AwPermissionRequest* aw_request = new AwPermissionRequest(request.Pass());
(...skipping 22 matching lines...) Expand all
57 73
58 std::string key = origin.GetOrigin().spec(); 74 std::string key = origin.GetOrigin().spec();
59 if (key.empty()) { 75 if (key.empty()) {
60 LOG(ERROR) << "The origin of preauthorization is empty, ignore it."; 76 LOG(ERROR) << "The origin of preauthorization is empty, ignore it.";
61 return; 77 return;
62 } 78 }
63 79
64 preauthorized_permission_[key] |= resources; 80 preauthorized_permission_[key] |= resources;
65 } 81 }
66 82
83 void PermissionRequestHandler::NavigationEntryCommitted(
84 const content::LoadCommittedDetails& details) {
85 const content::PageTransition transition = details.entry->GetTransitionType();
86 if (details.is_navigation_to_different_page() ||
87 content::PageTransitionStripQualifier(transition) ==
88 content::PAGE_TRANSITION_RELOAD ||
89 contents_unique_id_ != details.entry->GetUniqueID()) {
90 CancelAllRequests();
91 contents_unique_id_ = details.entry->GetUniqueID();
92 }
93 }
94
67 PermissionRequestHandler::RequestIterator 95 PermissionRequestHandler::RequestIterator
68 PermissionRequestHandler::FindRequest(const GURL& origin, 96 PermissionRequestHandler::FindRequest(const GURL& origin,
69 int64 resources) { 97 int64 resources) {
70 RequestIterator i; 98 RequestIterator i;
71 for (i = requests_.begin(); i != requests_.end(); ++i) { 99 for (i = requests_.begin(); i != requests_.end(); ++i) {
72 if (i->get() && i->get()->GetOrigin() == origin && 100 if (i->get() && i->get()->GetOrigin() == origin &&
73 i->get()->GetResources() == resources) { 101 i->get()->GetResources() == resources) {
74 break; 102 break;
75 } 103 }
76 } 104 }
77 return i; 105 return i;
78 } 106 }
79 107
80 void PermissionRequestHandler::CancelRequest(RequestIterator i) { 108 void PermissionRequestHandler::CancelRequest(RequestIterator i) {
81 if (i->get()) 109 if (i->get())
82 client_->OnPermissionRequestCanceled(i->get()); 110 client_->OnPermissionRequestCanceled(i->get());
83 // The request's grant()/deny() could be called upon 111 // The request's grant()/deny() could be called upon
84 // OnPermissionRequestCanceled. Delete AwPermissionRequest if it still 112 // OnPermissionRequestCanceled. Delete AwPermissionRequest if it still
85 // exists. 113 // exists.
86 if (i->get()) 114 if (i->get())
87 delete i->get(); 115 delete i->get();
88 } 116 }
89 117
118 void PermissionRequestHandler::CancelAllRequests() {
119 for (RequestIterator i = requests_.begin(); i != requests_.end(); ++i)
120 CancelRequest(i);
121 }
122
90 void PermissionRequestHandler::PruneRequests() { 123 void PermissionRequestHandler::PruneRequests() {
91 for (RequestIterator i = requests_.begin(); i != requests_.end();) { 124 for (RequestIterator i = requests_.begin(); i != requests_.end();) {
92 if (!i->get()) 125 if (!i->get())
93 i = requests_.erase(i); 126 i = requests_.erase(i);
94 else 127 else
95 ++i; 128 ++i;
96 } 129 }
97 } 130 }
98 131
99 bool PermissionRequestHandler::Preauthorized(const GURL& origin, 132 bool PermissionRequestHandler::Preauthorized(const GURL& origin,
100 int64 resources) { 133 int64 resources) {
101 std::map<std::string, int64>::iterator i = 134 std::map<std::string, int64>::iterator i =
102 preauthorized_permission_.find(origin.GetOrigin().spec()); 135 preauthorized_permission_.find(origin.GetOrigin().spec());
103 136
104 return i != preauthorized_permission_.end() && 137 return i != preauthorized_permission_.end() &&
105 (resources & i->second) == resources; 138 (resources & i->second) == resources;
106 } 139 }
107 140
108 } // namespace android_webivew 141 } // namespace android_webivew
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698