in native/CefBrowser_N.cpp [116:239]
void create(std::shared_ptr<JNIObjectsForCreate> objs,
jlong windowHandle,
jboolean osr,
jboolean transparent) {
#if defined(OS_MAC)
WindowHandleHolder windowHandleHolder(windowHandle);
#endif
ScopedJNIEnv env;
CefRefPtr<ClientHandler> clientHandler = GetCefFromJNIObject_sync<ClientHandler>(
env, objs->jclientHandler, "CefClientHandler");
if (!clientHandler.get())
return;
CefRefPtr<LifeSpanHandler> lifeSpanHandler =
(LifeSpanHandler*)clientHandler->GetLifeSpanHandler().get();
if (!lifeSpanHandler.get())
return;
CefRefPtr<CefBrowser> parentBrowser =
GetCefFromJNIObject<CefBrowser>(env, objs->jparentBrowser, "CefBrowser");
CefWindowInfo windowInfo;
CefBrowserSettings settings;
// If parentBrowser is set, we want to show the DEV-Tools for that browser.
// Since that cannot be an Alloy-style window, it cannot be integrated into
// Java UI but must be opened as a pop-up.
if (parentBrowser.get() != nullptr) {
CefPoint inspectAt;
if (objs->jinspectAt != nullptr) {
int x, y;
GetJNIPoint(env, objs->jinspectAt, &x, &y);
inspectAt.Set(x, y);
}
parentBrowser->GetHost()->ShowDevTools(windowInfo, clientHandler.get(),
settings, inspectAt);
JNI_CALL_VOID_METHOD(env, objs->jbrowser, "notifyBrowserCreated", "()V");
return;
}
if (osr == JNI_FALSE) {
CefRect rect;
CefRefPtr<WindowHandler> windowHandler =
(WindowHandler*)clientHandler->GetWindowHandler().get();
if (windowHandler.get()) {
windowHandler->GetRect(objs->jbrowser, rect);
}
#if defined(OS_WIN)
CefWindowHandle parent = TempWindow::GetWindowHandle();
if (objs->canvas != nullptr) {
parent = GetHwndOfCanvas(objs->canvas, env);
} else {
// Do not activate hidden browser windows on creation.
windowInfo.ex_style |= WS_EX_NOACTIVATE;
}
windowInfo.SetAsChild(parent, rect);
#elif defined(OS_MAC)
NSWindow* parent = nullptr;
if (windowHandle != 0) {
parent = (NSWindow*)windowHandle;
} else {
parent = TempWindow::GetWindow();
}
CefWindowHandle browserContentView =
util_mac::CreateBrowserContentView(parent, rect);
windowInfo.SetAsChild(browserContentView, rect);
#elif defined(OS_LINUX)
CefWindowHandle parent = TempWindow::GetWindowHandle();
if (objs->canvas != nullptr) {
parent = GetDrawableOfCanvas(objs->canvas, env);
}
windowInfo.SetAsChild(parent, rect);
#endif
} else {
#if defined(OS_MAC)
windowInfo.SetAsWindowless(
(CefWindowHandle)util_mac::GetNSView((void*)windowHandle));
#else
windowInfo.SetAsWindowless((CefWindowHandle)windowHandle);
#endif
}
ScopedJNIClass cefBrowserSettings(env, "org/cef/CefBrowserSettings");
if (cefBrowserSettings != nullptr &&
objs->jbrowserSettings != nullptr) { // Dev-tools settings are null
GetJNIFieldInt(env, cefBrowserSettings, objs->jbrowserSettings,
"windowless_frame_rate", &settings.windowless_frame_rate);
GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings,
"sharedTexturesEnabled",
&windowInfo.shared_texture_enabled);
}
CefRefPtr<CefBrowser> browserObj;
CefString strUrl = GetJNIString(env, static_cast<jstring>(objs->url.get()));
CefRefPtr<CefRequestContext> context = GetCefFromJNIObject_sync<CefRequestContext>(
env, objs->jcontext, "CefRequestContext");
// Add a global ref that will be released in LifeSpanHandler::OnAfterCreated.
jobject globalRef = env->NewGlobalRef(objs->jbrowser);
lifeSpanHandler->registerJBrowser(globalRef);
CefRefPtr<CefDictionaryValue> extra_info;
auto router_configs = BrowserProcessHandler::GetMessageRouterConfigs();
if (router_configs) {
// Send the message router config to CefHelperApp::OnBrowserCreated.
extra_info = CefDictionaryValue::Create();
extra_info->SetList("router_configs", router_configs);
}
// JCEF requires Alloy runtime style for "normal" browsers in order for them
// to be integratable into Java UI.
windowInfo.runtime_style = CEF_RUNTIME_STYLE_ALLOY;
bool result = CefBrowserHost::CreateBrowser(
windowInfo, clientHandler.get(), strUrl, settings, extra_info, context);
if (!result) {
lifeSpanHandler->unregisterJBrowser(globalRef);
env->DeleteGlobalRef(globalRef);
return;
}
JNI_CALL_VOID_METHOD(env, objs->jbrowser, "notifyBrowserCreated", "()V");
}