diff options
Diffstat (limited to 'android_webview/native/aw_contents_client_bridge.cc')
-rw-r--r-- | android_webview/native/aw_contents_client_bridge.cc | 107 |
1 files changed, 101 insertions, 6 deletions
diff --git a/android_webview/native/aw_contents_client_bridge.cc b/android_webview/native/aw_contents_client_bridge.cc index 0c13ebe..213646f 100644 --- a/android_webview/native/aw_contents_client_bridge.cc +++ b/android_webview/native/aw_contents_client_bridge.cc @@ -16,6 +16,7 @@ using base::android::AttachCurrentThread; using base::android::ConvertJavaStringToUTF16; using base::android::ConvertUTF8ToJavaString; +using base::android::ConvertUTF16ToJavaString; using base::android::JavaRef; using base::android::ScopedJavaLocalRef; using content::BrowserThread; @@ -25,8 +26,8 @@ namespace android_webview { AwContentsClientBridge::AwContentsClientBridge(JNIEnv* env, jobject obj) : java_ref_(env, obj) { DCHECK(obj); - Java_AwContentsClientBridge_setNativeContentsClientBridge(env, obj, - reinterpret_cast<jint>(this)); + Java_AwContentsClientBridge_setNativeContentsClientBridge( + env, obj, reinterpret_cast<jint>(this)); } AwContentsClientBridge::~AwContentsClientBridge() { @@ -56,16 +57,18 @@ void AwContentsClientBridge::AllowCertificateError( std::string der_string; net::X509Certificate::GetDEREncoded(cert->os_cert_handle(), &der_string); - ScopedJavaLocalRef<jbyteArray> jcert = base::android::ToJavaByteArray(env, - reinterpret_cast<const uint8*>(der_string.data()), der_string.length()); + ScopedJavaLocalRef<jbyteArray> jcert = base::android::ToJavaByteArray( + env, + reinterpret_cast<const uint8*>(der_string.data()), + der_string.length()); ScopedJavaLocalRef<jstring> jurl(ConvertUTF8ToJavaString( env, request_url.spec())); // We need to add the callback before making the call to java side, // as it may do a synchronous callback prior to returning. int request_id = pending_cert_error_callbacks_.Add( new CertErrorCallback(callback)); - *cancel_request = !Java_AwContentsClientBridge_allowCertificateError(env, - obj.obj(), cert_error, jcert.obj(), jurl.obj(), request_id); + *cancel_request = !Java_AwContentsClientBridge_allowCertificateError( + env, obj.obj(), cert_error, jcert.obj(), jurl.obj(), request_id); // if the request is cancelled, then cancel the stored callback if (*cancel_request) { pending_cert_error_callbacks_.Remove(request_id); @@ -84,6 +87,98 @@ void AwContentsClientBridge::ProceedSslError(JNIEnv* env, jobject obj, pending_cert_error_callbacks_.Remove(id); } +void AwContentsClientBridge::RunJavaScriptDialog( + content::JavaScriptMessageType message_type, + const GURL& origin_url, + const string16& message_text, + const string16& default_prompt_text, + const content::JavaScriptDialogManager::DialogClosedCallback& callback) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + JNIEnv* env = AttachCurrentThread(); + + ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); + if (obj.is_null()) + return; + + int callback_id = pending_js_dialog_callbacks_.Add( + new content::JavaScriptDialogManager::DialogClosedCallback(callback)); + ScopedJavaLocalRef<jstring> jurl( + ConvertUTF8ToJavaString(env, origin_url.spec())); + ScopedJavaLocalRef<jstring> jmessage( + ConvertUTF16ToJavaString(env, message_text)); + + switch (message_type) { + case content::JAVASCRIPT_MESSAGE_TYPE_ALERT: + Java_AwContentsClientBridge_handleJsAlert( + env, obj.obj(), jurl.obj(), jmessage.obj(), callback_id); + break; + case content::JAVASCRIPT_MESSAGE_TYPE_CONFIRM: + Java_AwContentsClientBridge_handleJsConfirm( + env, obj.obj(), jurl.obj(), jmessage.obj(), callback_id); + break; + case content::JAVASCRIPT_MESSAGE_TYPE_PROMPT: { + ScopedJavaLocalRef<jstring> jdefault_value( + ConvertUTF16ToJavaString(env, default_prompt_text)); + Java_AwContentsClientBridge_handleJsPrompt(env, + obj.obj(), + jurl.obj(), + jmessage.obj(), + jdefault_value.obj(), + callback_id); + break; + } + default: + NOTREACHED(); + } +} + +void AwContentsClientBridge::RunBeforeUnloadDialog( + const GURL& origin_url, + const string16& message_text, + const content::JavaScriptDialogManager::DialogClosedCallback& callback) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + JNIEnv* env = AttachCurrentThread(); + + ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); + if (obj.is_null()) + return; + + int callback_id = pending_js_dialog_callbacks_.Add( + new content::JavaScriptDialogManager::DialogClosedCallback(callback)); + ScopedJavaLocalRef<jstring> jurl( + ConvertUTF8ToJavaString(env, origin_url.spec())); + ScopedJavaLocalRef<jstring> jmessage( + ConvertUTF16ToJavaString(env, message_text)); + + Java_AwContentsClientBridge_handleJsBeforeUnload( + env, obj.obj(), jurl.obj(), jmessage.obj(), callback_id); +} + +void AwContentsClientBridge::ConfirmJsResult(JNIEnv* env, + jobject, + int id, + jstring prompt) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + content::JavaScriptDialogManager::DialogClosedCallback* callback = + pending_js_dialog_callbacks_.Lookup(id); + string16 prompt_text; + if (prompt) { + prompt_text = ConvertJavaStringToUTF16(env, prompt); + } + if (callback) + callback->Run(true, prompt_text); + pending_js_dialog_callbacks_.Remove(id); +} + +void AwContentsClientBridge::CancelJsResult(JNIEnv*, jobject, int id) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + content::JavaScriptDialogManager::DialogClosedCallback* callback = + pending_js_dialog_callbacks_.Lookup(id); + if (callback) + callback->Run(false, string16()); + pending_js_dialog_callbacks_.Remove(id); +} + bool RegisterAwContentsClientBridge(JNIEnv* env) { return RegisterNativesImpl(env) >= 0; } |