native/context_menu_handler.cpp (113 lines of code) (raw):
// 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 "context_menu_handler.h"
#include "jni_util.h"
namespace {
// JNI CefContextMenuParams object.
class ScopedJNIContextMenuParams
: public ScopedJNIObject<CefContextMenuParams> {
public:
ScopedJNIContextMenuParams(JNIEnv* env, CefRefPtr<CefContextMenuParams> obj)
: ScopedJNIObject<CefContextMenuParams>(
env,
obj,
"org/cef/callback/CefContextMenuParams_N",
"CefContextMenuParams") {}
};
class ScopedJNIRunContextMenuCallback
: public ScopedJNIObject<CefRunContextMenuCallback> {
public:
ScopedJNIRunContextMenuCallback(JNIEnv* env,
CefRefPtr<CefRunContextMenuCallback> obj)
: ScopedJNIObject<CefRunContextMenuCallback>(
env,
obj,
"org/cef/callback/CefRunContextMenuCallback_N",
"CefRunContextMenuCallback") {}
};
} // namespace
ContextMenuHandler::ContextMenuHandler(JNIEnv* env, jobject handler)
: handle_(env, handler) {}
void ContextMenuHandler::OnBeforeContextMenu(
CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefContextMenuParams> params,
CefRefPtr<CefMenuModel> model) {
ScopedJNIEnv env;
if (!env)
return;
ScopedJNIBrowser jbrowser(env, browser);
ScopedJNIFrame jframe(env, frame);
jframe.SetTemporary();
ScopedJNIContextMenuParams jparams(env, params);
jparams.SetTemporary();
ScopedJNIMenuModel jmodel(env, model);
jmodel.SetTemporary();
JNI_CALL_VOID_METHOD(env, handle_, "onBeforeContextMenu",
"(Lorg/cef/browser/CefBrowser;Lorg/cef/browser/"
"CefFrame;Lorg/cef/callback/CefContextMenuParams;"
"Lorg/cef/callback/CefMenuModel;)V",
jbrowser.get(), jframe.get(), jparams.get(),
jmodel.get());
}
bool ContextMenuHandler::RunContextMenu(
CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefContextMenuParams> params,
CefRefPtr<CefMenuModel> model,
CefRefPtr<CefRunContextMenuCallback> callback) {
ScopedJNIEnv env;
if (!env)
return false;
ScopedJNIBrowser jBrowser(env, browser);
ScopedJNIFrame jFrame(env, frame);
jFrame.SetTemporary();
ScopedJNIContextMenuParams jParams(env, params);
jParams.SetTemporary();
ScopedJNIMenuModel jModel(env, model);
jModel.SetTemporary();
ScopedJNIRunContextMenuCallback jCallback(env, callback);
jboolean jresult = JNI_FALSE;
JNI_CALL_BOOLEAN_METHOD(jresult, env, handle_, "runContextMenu",
"(Lorg/cef/browser/CefBrowser;"
"Lorg/cef/browser/CefFrame;"
"Lorg/cef/callback/CefContextMenuParams;"
"Lorg/cef/callback/CefMenuModel;"
"Lorg/cef/callback/CefRunContextMenuCallback;)"
"Z",
jBrowser.get(), jFrame.get(), jParams.get(), jModel.get(), jCallback.get());
return jresult;
}
bool ContextMenuHandler::OnContextMenuCommand(
CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefContextMenuParams> params,
int command_id,
EventFlags event_flags) {
ScopedJNIEnv env;
if (!env)
return false;
ScopedJNIBrowser jbrowser(env, browser);
ScopedJNIFrame jframe(env, frame);
jframe.SetTemporary();
ScopedJNIContextMenuParams jparams(env, params);
jparams.SetTemporary();
jboolean result = JNI_FALSE;
JNI_CALL_METHOD(env, handle_, "onContextMenuCommand",
"(Lorg/cef/browser/CefBrowser;Lorg/cef/browser/CefFrame;Lorg/"
"cef/callback/"
"CefContextMenuParams;II)Z",
Boolean, result, jbrowser.get(), jframe.get(), jparams.get(),
(jint)command_id, (jint)event_flags);
return (result != JNI_FALSE);
}
void ContextMenuHandler::OnContextMenuDismissed(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame) {
ScopedJNIEnv env;
if (!env)
return;
ScopedJNIBrowser jbrowser(env, browser);
ScopedJNIFrame jframe(env, frame);
jframe.SetTemporary();
JNI_CALL_VOID_METHOD(
env, handle_, "onContextMenuDismissed",
"(Lorg/cef/browser/CefBrowser;Lorg/cef/browser/CefFrame;)V",
jbrowser.get(), jframe.get());
}