diff options
-rw-r--r-- | android_webview/browser/aw_browser_permission_request_delegate.h | 6 | ||||
-rw-r--r-- | android_webview/browser/aw_content_browser_client.cc | 35 | ||||
-rw-r--r-- | android_webview/browser/aw_contents_client_bridge_base.h | 6 | ||||
-rw-r--r-- | android_webview/java/src/org/chromium/android_webview/AwContents.java | 7 | ||||
-rw-r--r-- | android_webview/native/aw_contents.cc | 37 | ||||
-rw-r--r-- | android_webview/native/aw_contents.h | 13 | ||||
-rw-r--r-- | android_webview/native/aw_contents_client_bridge.cc | 31 | ||||
-rw-r--r-- | android_webview/native/aw_contents_client_bridge.h | 5 | ||||
-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.gyp | 4 |
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', ], |