native/life_span_handler.cpp (89 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 "life_span_handler.h"
#include "client_handler.h"
#include "jni_util.h"
#include "util.h"
LifeSpanHandler::LifeSpanHandler(JNIEnv* env, jobject handler)
: handle_(env, handler) {}
// TODO(JCEF): Expose all parameters.
bool LifeSpanHandler::OnBeforePopup(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
int popup_id,
const CefString& target_url,
const CefString& target_frame_name,
WindowOpenDisposition target_disposition,
bool user_gesture,
const CefPopupFeatures& popupFeatures,
CefWindowInfo& windowInfo,
CefRefPtr<CefClient>& client,
CefBrowserSettings& settings,
CefRefPtr<CefDictionaryValue>& extra_info,
bool* no_javascript_access) {
/* [tav] CEF does not block it, so there seems to be no reason to be stricter.
if (browser->GetHost()->IsWindowRenderingDisabled()) {
// Cancel popups in off-screen rendering mode.
return true;
}*/
ScopedJNIEnv env;
if (!env)
return false;
ScopedJNIBrowser jbrowser(env, browser);
ScopedJNIFrame jframe(env, frame);
jframe.SetTemporary();
ScopedJNIString jtargetUrl(env, target_url);
ScopedJNIString jtargetFrameName(env, target_frame_name);
jboolean jreturn = JNI_FALSE;
JNI_CALL_METHOD(env, handle_, "onBeforePopup",
"(Lorg/cef/browser/CefBrowser;Lorg/cef/browser/"
"CefFrame;Ljava/lang/String;Ljava/lang/String;)Z",
Boolean, jreturn, jbrowser.get(), jframe.get(),
jtargetUrl.get(), jtargetFrameName.get());
return (jreturn != JNI_FALSE);
}
void LifeSpanHandler::OnAfterCreated(CefRefPtr<CefBrowser> browser) {
ScopedJNIEnv env;
if (!env || jbrowsers_.empty())
return;
util::AddCefBrowser(browser);
jobject jbrowser = jbrowsers_.front();
jbrowsers_.pop_front();
CefRefPtr<ClientHandler> client =
(ClientHandler*)browser->GetHost()->GetClient().get();
client->OnAfterCreated();
// Add a reference to |browser| that will be released in
// LifeSpanHandler::OnBeforeClose.
if (SetCefForJNIObject_sync(env, jbrowser, browser.get(), "CefBrowser")) {
JNI_CALL_VOID_METHOD(env, handle_, "onAfterCreated",
"(Lorg/cef/browser/CefBrowser;)V", jbrowser);
}
// Release the global ref added in CefBrowser_N::create.
env->DeleteGlobalRef(jbrowser);
}
bool LifeSpanHandler::DoClose(CefRefPtr<CefBrowser> browser) {
ScopedJNIEnv env;
if (!env)
return false;
ScopedJNIBrowser jbrowser(env, browser);
jboolean jreturn = JNI_FALSE;
JNI_CALL_METHOD(env, handle_, "doClose", "(Lorg/cef/browser/CefBrowser;)Z",
Boolean, jreturn, jbrowser.get());
return (jreturn != JNI_FALSE);
}
void LifeSpanHandler::OnBeforeClose(CefRefPtr<CefBrowser> browser) {
REQUIRE_UI_THREAD();
ScopedJNIEnv env;
if (!env)
return;
ScopedJNIBrowser jbrowser(env, browser);
JNI_CALL_VOID_METHOD(env, handle_, "onBeforeClose",
"(Lorg/cef/browser/CefBrowser;)V", jbrowser.get());
// Clear the browser pointer member of the Java object. This will
// release the browser reference that was added in
// LifeSpanHandler::OnAfterCreated.
SetCefForJNIObject_sync<CefBrowser>(env, jbrowser, nullptr, "CefBrowser");
CefRefPtr<ClientHandler> client =
(ClientHandler*)browser->GetHost()->GetClient().get();
client->OnBeforeClose(browser);
}
void LifeSpanHandler::OnAfterParentChanged(CefRefPtr<CefBrowser> browser) {
REQUIRE_UI_THREAD();
ScopedJNIEnv env;
if (!env)
return;
ScopedJNIBrowser jbrowser(env, browser);
JNI_CALL_VOID_METHOD(env, handle_, "onAfterParentChanged",
"(Lorg/cef/browser/CefBrowser;)V", jbrowser.get());
}
void LifeSpanHandler::registerJBrowser(jobject browser) {
jbrowsers_.push_back(browser);
}
void LifeSpanHandler::unregisterJBrowser(jobject browser) {
jbrowsers_.remove(browser);
}