summaryrefslogtreecommitdiffstats
path: root/android_webview
diff options
context:
space:
mode:
authormichaelbai@chromium.org <michaelbai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-23 20:36:58 +0000
committermichaelbai@chromium.org <michaelbai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-23 20:36:58 +0000
commit88d18876460bd62651df29f824a1cd638414835d (patch)
treee7e8128c3421b28c1017c0520bf46c7e28a39d72 /android_webview
parentd4fe425eef79e04cb7b8c948f6ba3f379ef3c4f9 (diff)
downloadchromium_src-88d18876460bd62651df29f824a1cd638414835d.zip
chromium_src-88d18876460bd62651df29f824a1cd638414835d.tar.gz
chromium_src-88d18876460bd62651df29f824a1cd638414835d.tar.bz2
Make Geolocation permission request use new API if possible.
To make the backward compatibility, only use the new Permission API if the application is target to the APIs level which the new Permission API release to. BUG=387265 Review URL: https://codereview.chromium.org/342063002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@279169 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'android_webview')
-rw-r--r--android_webview/browser/aw_browser_permission_request_delegate.h6
-rw-r--r--android_webview/browser/aw_content_browser_client.cc35
-rw-r--r--android_webview/browser/aw_contents_client_bridge_base.h6
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwContents.java7
-rw-r--r--android_webview/native/aw_contents.cc37
-rw-r--r--android_webview/native/aw_contents.h13
-rw-r--r--android_webview/native/aw_contents_client_bridge.cc31
-rw-r--r--android_webview/native/aw_contents_client_bridge.h5
-rw-r--r--android_webview/native/permission/simple_permission_request.cc (renamed from android_webview/native/permission/protected_media_id_permission_request.cc)16
-rw-r--r--android_webview/native/permission/simple_permission_request.h (renamed from android_webview/native/permission/protected_media_id_permission_request.h)22
-rw-r--r--android_webview/native/webview_native.gyp4
11 files changed, 107 insertions, 75 deletions
diff --git a/android_webview/browser/aw_browser_permission_request_delegate.h b/android_webview/browser/aw_browser_permission_request_delegate.h
index 035f0e2..501ea90 100644
--- a/android_webview/browser/aw_browser_permission_request_delegate.h
+++ b/android_webview/browser/aw_browser_permission_request_delegate.h
@@ -25,6 +25,12 @@ class AwBrowserPermissionRequestDelegate {
virtual void CancelProtectedMediaIdentifierPermissionRequests(
const GURL& origin) = 0;
+ virtual void RequestGeolocationPermission(
+ const GURL& origin,
+ const base::Callback<void(bool)>& callback) = 0;
+
+ virtual void CancelGeolocationPermissionRequests(const GURL& origin) = 0;
+
protected:
AwBrowserPermissionRequestDelegate() {}
};
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc
index cce4e8c..9181ce5 100644
--- a/android_webview/browser/aw_content_browser_client.cc
+++ b/android_webview/browser/aw_content_browser_client.cc
@@ -148,8 +148,19 @@ void CancelProtectedMediaIdentifierPermissionRequests(
delegate->CancelProtectedMediaIdentifierPermissionRequests(origin);
}
+void CancelGeolocationPermissionRequests(
+ int render_process_id,
+ int render_view_id,
+ const GURL& origin) {
+ AwBrowserPermissionRequestDelegate* delegate =
+ AwBrowserPermissionRequestDelegate::FromID(render_process_id,
+ render_view_id);
+ if (delegate)
+ delegate->CancelGeolocationPermissionRequests(origin);
}
+} // namespace
+
std::string AwContentBrowserClient::GetAcceptLangsImpl() {
// Start with the currnet locale.
std::string langs = l10n_util::GetDefaultLocale();
@@ -405,16 +416,24 @@ void AwContentBrowserClient::RequestGeolocationPermission(
bool user_gesture,
base::Callback<void(bool)> result_callback,
base::Closure* cancel_callback) {
- AwContentsClientBridgeBase* client =
- AwContentsClientBridgeBase::FromWebContents(web_contents);
- if (client) {
- client->RequestGeolocationPermission(
- web_contents, requesting_frame, result_callback, cancel_callback);
- } else {
- LOG(WARNING) << "Failed to find the associated bridge for geolocation "
- << "permission request.";
+ int render_process_id = web_contents->GetRenderProcessHost()->GetID();
+ int render_view_id = web_contents->GetRenderViewHost()->GetRoutingID();
+ AwBrowserPermissionRequestDelegate* delegate =
+ AwBrowserPermissionRequestDelegate::FromID(render_process_id,
+ render_view_id);
+ if (delegate == NULL) {
+ DVLOG(0) << "Dropping GeolocationPermission request";
result_callback.Run(false);
+ return;
+ }
+
+ GURL origin = requesting_frame.GetOrigin();
+ if (cancel_callback) {
+ *cancel_callback = base::Bind(
+ CancelGeolocationPermissionRequests, render_process_id, render_view_id,
+ origin);
}
+ delegate->RequestGeolocationPermission(origin, result_callback);
}
void AwContentBrowserClient::RequestMidiSysExPermission(
diff --git a/android_webview/browser/aw_contents_client_bridge_base.h b/android_webview/browser/aw_contents_client_bridge_base.h
index 1ce1542..a24aa4b 100644
--- a/android_webview/browser/aw_contents_client_bridge_base.h
+++ b/android_webview/browser/aw_contents_client_bridge_base.h
@@ -65,12 +65,6 @@ class AwContentsClientBridgeBase {
= 0;
virtual bool ShouldOverrideUrlLoading(const base::string16& url) = 0;
-
- virtual void RequestGeolocationPermission(
- content::WebContents* web_contents,
- const GURL& requesting_frame,
- base::Callback<void(bool)> result_callback,
- base::Closure* cancel_callback) = 0;
};
} // namespace android_webview
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java
index 340e18cc..df19d57 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -2195,6 +2195,13 @@ public class AwContents {
}
}
+ // Return true if the GeolocationPermissionAPI should be used.
+ @CalledByNative
+ private boolean useLegacyGeolocationPermissionAPI() {
+ // TODO (michaelbai): Need to verify whether this is correct when release.
+ return mContext.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.KITKAT;
+ }
+
//--------------------------------------------------------------------------------------------
// Native methods
//--------------------------------------------------------------------------------------------
diff --git a/android_webview/native/aw_contents.cc b/android_webview/native/aw_contents.cc
index 9ae3a21..dd673ad 100644
--- a/android_webview/native/aw_contents.cc
+++ b/android_webview/native/aw_contents.cc
@@ -28,7 +28,7 @@
#include "android_webview/native/java_browser_view_renderer_helper.h"
#include "android_webview/native/permission/aw_permission_request.h"
#include "android_webview/native/permission/permission_request_handler.h"
-#include "android_webview/native/permission/protected_media_id_permission_request.h"
+#include "android_webview/native/permission/simple_permission_request.h"
#include "android_webview/native/state_serializer.h"
#include "android_webview/public/browser/draw_gl.h"
#include "base/android/jni_android.h"
@@ -598,8 +598,8 @@ void AwContents::RequestProtectedMediaIdentifierPermission(
const GURL& origin,
const base::Callback<void(bool)>& callback) {
permission_request_handler_->SendRequest(
- scoped_ptr<AwPermissionRequestDelegate>(
- new ProtectedMediaIdPermissionRequest(origin, callback)));
+ scoped_ptr<AwPermissionRequestDelegate>(new SimplePermissionRequest(
+ origin, AwPermissionRequest::ProtectedMediaId, callback)));
}
void AwContents::CancelProtectedMediaIdentifierPermissionRequests(
@@ -608,6 +608,37 @@ void AwContents::CancelProtectedMediaIdentifierPermissionRequests(
origin, AwPermissionRequest::ProtectedMediaId);
}
+void AwContents::RequestGeolocationPermission(
+ const GURL& origin,
+ const base::Callback<void(bool)>& callback) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
+ if (obj.is_null())
+ return;
+
+ if (Java_AwContents_useLegacyGeolocationPermissionAPI(env, obj.obj())) {
+ ShowGeolocationPrompt(origin, callback);
+ return;
+ }
+ permission_request_handler_->SendRequest(
+ scoped_ptr<AwPermissionRequestDelegate>(new SimplePermissionRequest(
+ origin, AwPermissionRequest::Geolocation, callback)));
+}
+
+void AwContents::CancelGeolocationPermissionRequests(const GURL& origin) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
+ if (obj.is_null())
+ return;
+
+ if (Java_AwContents_useLegacyGeolocationPermissionAPI(env, obj.obj())) {
+ HideGeolocationPrompt(origin);
+ return;
+ }
+ permission_request_handler_->CancelRequest(
+ origin, AwPermissionRequest::Geolocation);
+}
+
void AwContents::FindAllAsync(JNIEnv* env, jobject obj, jstring search_string) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
GetFindHelper()->FindAllAsync(ConvertJavaStringToUTF16(env, search_string));
diff --git a/android_webview/native/aw_contents.h b/android_webview/native/aw_contents.h
index da49a8e..8f69b619 100644
--- a/android_webview/native/aw_contents.h
+++ b/android_webview/native/aw_contents.h
@@ -134,9 +134,6 @@ class AwContents : public FindHelper::Listener,
void DrawGL(AwDrawGLInfo* draw_info);
- // Geolocation API support
- void ShowGeolocationPrompt(const GURL& origin, base::Callback<void(bool)>);
- void HideGeolocationPrompt(const GURL& origin);
void InvokeGeolocationCallback(JNIEnv* env,
jobject obj,
jboolean value,
@@ -162,6 +159,12 @@ class AwContents : public FindHelper::Listener,
const base::Callback<void(bool)>& callback) OVERRIDE;
virtual void CancelProtectedMediaIdentifierPermissionRequests(
const GURL& origin) OVERRIDE;
+ virtual void RequestGeolocationPermission(
+ const GURL& origin,
+ const base::Callback<void(bool)>& callback) OVERRIDE;
+ virtual void CancelGeolocationPermissionRequests(
+ const GURL& origin) OVERRIDE;
+
// Find-in-page API and related methods.
void FindAllAsync(JNIEnv* env, jobject obj, jstring search_string);
@@ -229,6 +232,10 @@ class AwContents : public FindHelper::Listener,
void InitializeHardwareDrawIfNeeded();
+ // Geolocation API support
+ void ShowGeolocationPrompt(const GURL& origin, base::Callback<void(bool)>);
+ void HideGeolocationPrompt(const GURL& origin);
+
JavaObjectWeakGlobalRef java_ref_;
scoped_ptr<content::WebContents> web_contents_;
scoped_ptr<AwWebContentsDelegate> web_contents_delegate_;
diff --git a/android_webview/native/aw_contents_client_bridge.cc b/android_webview/native/aw_contents_client_bridge.cc
index a241e40..a4f87d3 100644
--- a/android_webview/native/aw_contents_client_bridge.cc
+++ b/android_webview/native/aw_contents_client_bridge.cc
@@ -46,15 +46,6 @@ void RecordClientCertificateKey(
client_cert.get(), private_key.get());
}
-void CancelGeolocationPermission(int render_process_id,
- int render_view_id,
- const GURL& requesting_frame) {
- AwContents* aw_contents = AwContents::FromID(
- render_process_id, render_view_id);
- if (aw_contents)
- aw_contents->HideGeolocationPrompt(requesting_frame);
-}
-
} // namespace
AwContentsClientBridge::AwContentsClientBridge(JNIEnv* env, jobject obj)
@@ -349,28 +340,6 @@ bool AwContentsClientBridge::ShouldOverrideUrlLoading(
jurl.obj());
}
-void AwContentsClientBridge::RequestGeolocationPermission(
- content::WebContents* web_contents,
- const GURL& requesting_frame,
- base::Callback<void(bool)> result_callback,
- base::Closure* cancel_callback) {
- AwContents* aw_contents = AwContents::FromWebContents(web_contents);
- if (!aw_contents) {
- result_callback.Run(false);
- return;
- }
-
- if (cancel_callback) {
- *cancel_callback = base::Bind(
- CancelGeolocationPermission,
- web_contents->GetRenderProcessHost()->GetID(),
- web_contents->GetRenderViewHost()->GetRoutingID(),
- requesting_frame);
- }
-
- aw_contents->ShowGeolocationPrompt(requesting_frame, result_callback);
-}
-
void AwContentsClientBridge::ConfirmJsResult(JNIEnv* env,
jobject,
int id,
diff --git a/android_webview/native/aw_contents_client_bridge.h b/android_webview/native/aw_contents_client_bridge.h
index cb51ec1..3c97f33 100644
--- a/android_webview/native/aw_contents_client_bridge.h
+++ b/android_webview/native/aw_contents_client_bridge.h
@@ -55,11 +55,6 @@ class AwContentsClientBridge : public AwContentsClientBridgeBase {
const content::JavaScriptDialogManager::DialogClosedCallback& callback)
OVERRIDE;
virtual bool ShouldOverrideUrlLoading(const base::string16& url) OVERRIDE;
- virtual void RequestGeolocationPermission(
- content::WebContents* web_contents,
- const GURL& requesting_frame,
- base::Callback<void(bool)> result_callback,
- base::Closure* cancel_callback) OVERRIDE;
// Methods called from Java.
void ProceedSslError(JNIEnv* env, jobject obj, jboolean proceed, jint id);
diff --git a/android_webview/native/permission/protected_media_id_permission_request.cc b/android_webview/native/permission/simple_permission_request.cc
index 77b09d2..42ddcb4 100644
--- a/android_webview/native/permission/protected_media_id_permission_request.cc
+++ b/android_webview/native/permission/simple_permission_request.cc
@@ -2,33 +2,35 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "android_webview/native/permission/protected_media_id_permission_request.h"
+#include "android_webview/native/permission/simple_permission_request.h"
#include "android_webview/native/permission/aw_permission_request.h"
#include "base/callback.h"
namespace android_webview {
-ProtectedMediaIdPermissionRequest::ProtectedMediaIdPermissionRequest(
+SimplePermissionRequest::SimplePermissionRequest(
const GURL& origin,
+ int64 resources,
const base::Callback<void(bool)>& callback)
: origin_(origin),
+ resources_(resources),
callback_(callback) {
}
-ProtectedMediaIdPermissionRequest::~ProtectedMediaIdPermissionRequest() {
+SimplePermissionRequest::~SimplePermissionRequest() {
}
-void ProtectedMediaIdPermissionRequest::NotifyRequestResult(bool allowed) {
+void SimplePermissionRequest::NotifyRequestResult(bool allowed) {
callback_.Run(allowed);
}
-const GURL& ProtectedMediaIdPermissionRequest::GetOrigin() {
+const GURL& SimplePermissionRequest::GetOrigin() {
return origin_;
}
-int64 ProtectedMediaIdPermissionRequest::GetResources() {
- return AwPermissionRequest::ProtectedMediaId;
+int64 SimplePermissionRequest::GetResources() {
+ return resources_;
}
} // namespace android_webview
diff --git a/android_webview/native/permission/protected_media_id_permission_request.h b/android_webview/native/permission/simple_permission_request.h
index 2a63365..25ba540 100644
--- a/android_webview/native/permission/protected_media_id_permission_request.h
+++ b/android_webview/native/permission/simple_permission_request.h
@@ -2,21 +2,22 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef ANDROID_WEBVIEW_NATIVE_PERMISSION_PROTECTED_MEDIA_ID_PERMISSION_REQUEST_H
-#define ANDROID_WEBVIEW_NATIVE_PERMISSION_PROTECTED_MEDIA_ID_PERMISSION_REQUEST_H
+#ifndef ANDROID_WEBVIEW_NATIVE_PERMISSION_SIMPLE_PERMISSION_REQUEST_H
+#define ANDROID_WEBVIEW_NATIVE_PERMISSION_SIMPLE_PERMISSION_REQUEST_H
-#include "base/callback.h"
#include "android_webview/native/permission/aw_permission_request_delegate.h"
+#include "base/callback.h"
namespace android_webview {
-// The AwPermissionRequestDelegate implementation for protected media id
-// permission request.
-class ProtectedMediaIdPermissionRequest : public AwPermissionRequestDelegate {
+// The class is used to handle the simple permission request which just needs
+// a callback with bool parameter to indicate the permission granted or not.
+class SimplePermissionRequest : public AwPermissionRequestDelegate {
public:
- ProtectedMediaIdPermissionRequest(const GURL& origin,
- const base::Callback<void(bool)>& callback);
- virtual ~ProtectedMediaIdPermissionRequest();
+ SimplePermissionRequest(const GURL& origin,
+ int64 resources,
+ const base::Callback<void(bool)>& callback);
+ virtual ~SimplePermissionRequest();
// AwPermissionRequestDelegate implementation.
virtual const GURL& GetOrigin() OVERRIDE;
@@ -25,9 +26,10 @@ class ProtectedMediaIdPermissionRequest : public AwPermissionRequestDelegate {
private:
const GURL origin_;
+ int64 resources_;
const base::Callback<void(bool)> callback_;
- DISALLOW_COPY_AND_ASSIGN(ProtectedMediaIdPermissionRequest);
+ DISALLOW_COPY_AND_ASSIGN(SimplePermissionRequest);
};
} // namespace android_webview
diff --git a/android_webview/native/webview_native.gyp b/android_webview/native/webview_native.gyp
index 3a332ec..efb8a15 100644
--- a/android_webview/native/webview_native.gyp
+++ b/android_webview/native/webview_native.gyp
@@ -89,8 +89,8 @@
'permission/permission_request_handler.h',
'permission/permission_request_handler_client.cc',
'permission/permission_request_handler_client.h',
- 'permission/protected_media_id_permission_request.cc',
- 'permission/protected_media_id_permission_request.h',
+ 'permission/simple_permission_request.cc',
+ 'permission/simple_permission_request.h',
'state_serializer.cc',
'state_serializer.h',
],