// Copyright (c) 2014 The Chromium Embedded Framework Authors. All rights // reserved. Use of this source code is governed by a BSD-style license that // can be found in the LICENSE file. #include "jsdialog_handler.h" #include "client_handler.h" #include "jni_util.h" #include "util.h" namespace { // JNI CefJSDialogCallback object. class ScopedJNIJSDialogCallback : public ScopedJNIObject { public: ScopedJNIJSDialogCallback(JNIEnv* env, CefRefPtr obj) : ScopedJNIObject( env, obj, "org/cef/callback/CefJSDialogCallback_N", "CefJSDialogCallback") {} }; } // namespace JSDialogHandler::JSDialogHandler(JNIEnv* env, jobject handler) : handle_(env, handler) {} bool JSDialogHandler::OnJSDialog(CefRefPtr browser, const CefString& origin_url, CefJSDialogHandler::JSDialogType dialog_type, const CefString& message_text, const CefString& default_prompt_text, CefRefPtr callback, bool& suppress_message) { ScopedJNIEnv env; if (!env) return false; ScopedJNIBrowser jbrowser(env, browser); ScopedJNIString joriginUrl(env, origin_url); ScopedJNIString jmessageText(env, message_text); ScopedJNIString jdefaultPromptText(env, default_prompt_text); ScopedJNIJSDialogCallback jcallback(env, callback); ScopedJNIBoolRef jsuppressMessage(env, suppress_message); ScopedJNIObjectResult jdialogType(env); switch (dialog_type) { default: JNI_CASE(env, "org/cef/handler/CefJSDialogHandler$JSDialogType", JSDIALOGTYPE_ALERT, jdialogType); JNI_CASE(env, "org/cef/handler/CefJSDialogHandler$JSDialogType", JSDIALOGTYPE_CONFIRM, jdialogType); JNI_CASE(env, "org/cef/handler/CefJSDialogHandler$JSDialogType", JSDIALOGTYPE_PROMPT, jdialogType); } jboolean jresult = JNI_FALSE; JNI_CALL_METHOD( env, handle_, "onJSDialog", "(Lorg/cef/browser/CefBrowser;Ljava/lang/String;" "Lorg/cef/handler/CefJSDialogHandler$JSDialogType;Ljava/lang/String;" "Ljava/lang/String;Lorg/cef/callback/CefJSDialogCallback;Lorg/cef/misc/" "BoolRef;)Z", Boolean, jresult, jbrowser.get(), joriginUrl.get(), jdialogType.get(), jmessageText.get(), jdefaultPromptText.get(), jcallback.get(), jsuppressMessage.get()); suppress_message = jsuppressMessage; if (jresult == JNI_FALSE) { // If the Java method returns "false" the callback won't be used and // the reference can therefore be removed. jcallback.SetTemporary(); } return (jresult != JNI_FALSE); } bool JSDialogHandler::OnBeforeUnloadDialog( CefRefPtr browser, const CefString& message_text, bool is_reload, CefRefPtr callback) { ScopedJNIEnv env; if (!env) return false; ScopedJNIBrowser jbrowser(env, browser); ScopedJNIString jmessageText(env, message_text); ScopedJNIJSDialogCallback jcallback(env, callback); jboolean jresult = JNI_FALSE; JNI_CALL_METHOD(env, handle_, "onBeforeUnloadDialog", "(Lorg/cef/browser/CefBrowser;Ljava/lang/String;ZLorg/cef/" "callback/CefJSDialogCallback;)Z", Boolean, jresult, jbrowser.get(), jmessageText.get(), (is_reload ? JNI_TRUE : JNI_FALSE), jcallback.get()); if (jresult == JNI_FALSE) { // If the Java method returns "false" the callback won't be used and // the reference can therefore be removed. jcallback.SetTemporary(); } return (jresult != JNI_FALSE); } void JSDialogHandler::OnResetDialogState(CefRefPtr browser) { ScopedJNIEnv env; if (!env) return; ScopedJNIBrowser jbrowser(env, browser); JNI_CALL_VOID_METHOD(env, handle_, "onResetDialogState", "(Lorg/cef/browser/CefBrowser;)V", jbrowser.get()); } void JSDialogHandler::OnDialogClosed(CefRefPtr browser) { ScopedJNIEnv env; if (!env) return; ScopedJNIBrowser jbrowser(env, browser); JNI_CALL_VOID_METHOD(env, handle_, "onDialogClosed", "(Lorg/cef/browser/CefBrowser;)V", jbrowser.get()); }