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
3 // found in the LICENSE file.
5 #include "android_webview/native/permission/permission_request_handler.h"
7 #include "android_webview/native/permission/aw_permission_request.h"
8 #include "android_webview/native/permission/aw_permission_request_delegate.h"
9 #include "android_webview/native/permission/permission_request_handler_client.h"
10 #include "base/android/scoped_java_ref.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"
16 using base::android::ScopedJavaLocalRef
;
18 namespace android_webview
{
22 int GetActiveEntryID(content::WebContents
* web_contents
) {
23 if (!web_contents
) return 0;
25 content::NavigationEntry
* active_entry
=
26 web_contents
->GetController().GetActiveEntry();
27 return active_entry
? active_entry
->GetUniqueID() : 0;
32 PermissionRequestHandler::PermissionRequestHandler(
33 PermissionRequestHandlerClient
* client
, content::WebContents
* web_contents
)
34 : content::WebContentsObserver(web_contents
),
36 contents_unique_id_(GetActiveEntryID(web_contents
)) {
39 PermissionRequestHandler::~PermissionRequestHandler() {
43 void PermissionRequestHandler::SendRequest(
44 scoped_ptr
<AwPermissionRequestDelegate
> request
) {
45 if (Preauthorized(request
->GetOrigin(), request
->GetResources())) {
46 request
->NotifyRequestResult(true);
50 base::WeakPtr
<AwPermissionRequest
> weak_request
;
51 base::android::ScopedJavaLocalRef
<jobject
> java_peer
=
52 AwPermissionRequest::Create(request
.Pass(), &weak_request
);
53 requests_
.push_back(weak_request
);
54 client_
->OnPermissionRequest(java_peer
, weak_request
.get());
58 void PermissionRequestHandler::CancelRequest(const GURL
& origin
,
60 // The request list might have multiple requests with same origin and
62 RequestIterator i
= FindRequest(origin
, resources
);
63 while (i
!= requests_
.end()) {
64 CancelRequestInternal(i
);
66 i
= FindRequest(origin
, resources
);
70 void PermissionRequestHandler::PreauthorizePermission(const GURL
& origin
,
75 std::string key
= origin
.GetOrigin().spec();
77 LOG(ERROR
) << "The origin of preauthorization is empty, ignore it.";
81 preauthorized_permission_
[key
] |= resources
;
84 void PermissionRequestHandler::NavigationEntryCommitted(
85 const content::LoadCommittedDetails
& details
) {
86 const ui::PageTransition transition
= details
.entry
->GetTransitionType();
87 if (details
.is_navigation_to_different_page() ||
88 ui::PageTransitionStripQualifier(transition
) ==
89 ui::PAGE_TRANSITION_RELOAD
||
90 contents_unique_id_
!= details
.entry
->GetUniqueID()) {
92 contents_unique_id_
= details
.entry
->GetUniqueID();
96 PermissionRequestHandler::RequestIterator
97 PermissionRequestHandler::FindRequest(const GURL
& origin
,
100 for (i
= requests_
.begin(); i
!= requests_
.end(); ++i
) {
101 if (i
->get() && i
->get()->GetOrigin() == origin
&&
102 i
->get()->GetResources() == resources
) {
109 void PermissionRequestHandler::CancelRequestInternal(RequestIterator i
) {
110 AwPermissionRequest
* request
= i
->get();
112 client_
->OnPermissionRequestCanceled(request
);
113 request
->CancelAndDelete();
117 void PermissionRequestHandler::CancelAllRequests() {
118 for (RequestIterator i
= requests_
.begin(); i
!= requests_
.end(); ++i
)
119 CancelRequestInternal(i
);
122 void PermissionRequestHandler::PruneRequests() {
123 for (RequestIterator i
= requests_
.begin(); i
!= requests_
.end();) {
125 i
= requests_
.erase(i
);
131 bool PermissionRequestHandler::Preauthorized(const GURL
& origin
,
133 std::map
<std::string
, int64
>::iterator i
=
134 preauthorized_permission_
.find(origin
.GetOrigin().spec());
136 return i
!= preauthorized_permission_
.end() &&
137 (resources
& i
->second
) == resources
;
140 } // namespace android_webivew