Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 57e46ac

Browse files
S1artiemagreenblatt
authored andcommitted
Fix more JNI memory leaks (issue chromiumembedded#167)
1 parent af30919 commit 57e46ac

23 files changed

+217
-80
lines changed

native/client_app.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ void ClientApp::OnBeforeCommandLineProcessing(
5757
SetCefForJNIObject<CefCommandLine>(env, jcommand_line, NULL,
5858
"CefCommandLine");
5959
}
60+
env->DeleteLocalRef(jcommand_line);
61+
env->DeleteLocalRef(jprocess_type);
6062
END_ENV(env)
6163
}
6264

@@ -104,6 +106,7 @@ void ClientApp::OnRegisterCustomSchemes(
104106
SetCefForJNIObject<CefSchemeRegistrar>(env, jregistrar, NULL,
105107
"CefSchemeRegistrar");
106108
}
109+
env->DeleteLocalRef(jregistrar);
107110
END_ENV(env)
108111
}
109112

native/context_menu_handler.cpp

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,30 @@ void ContextMenuHandler::OnBeforeContextMenu(
3131
if (!jparams)
3232
return;
3333
jobject jmodel = NewJNIObject(env, "org/cef/callback/CefMenuModel_N");
34-
if (!jmodel)
34+
if (!jmodel) {
35+
env->DeleteLocalRef(jparams);
3536
return;
37+
}
3638

3739
SetCefForJNIObject(env, jparams, params.get(), "CefContextMenuParams");
3840
SetCefForJNIObject(env, jmodel, model.get(), "CefMenuModel");
3941

42+
jobject jframe = GetJNIFrame(env, frame);
43+
4044
JNI_CALL_VOID_METHOD(env, jhandler_, "onBeforeContextMenu",
4145
"(Lorg/cef/browser/CefBrowser;Lorg/cef/browser/"
4246
"CefFrame;Lorg/cef/callback/CefContextMenuParams;"
4347
"Lorg/cef/callback/CefMenuModel;)V",
44-
GetJNIBrowser(browser), GetJNIFrame(env, frame), jparams,
45-
jmodel);
48+
GetJNIBrowser(browser), jframe, jparams, jmodel);
4649

4750
// Do not keep references to |params| or |model| outside of this callback.
4851
SetCefForJNIObject<CefContextMenuParams>(env, jparams, NULL,
4952
"CefContextMenuParams");
5053
SetCefForJNIObject<CefMenuModel>(env, jmodel, NULL, "CefMenuModel");
54+
55+
env->DeleteLocalRef(jparams);
56+
env->DeleteLocalRef(jmodel);
57+
env->DeleteLocalRef(jframe);
5158
}
5259

5360
bool ContextMenuHandler::OnContextMenuCommand(
@@ -67,17 +74,19 @@ bool ContextMenuHandler::OnContextMenuCommand(
6774
SetCefForJNIObject(env, jparams, params.get(), "CefContextMenuParams");
6875

6976
jboolean result = JNI_FALSE;
77+
jobject jframe = GetJNIFrame(env, frame);
7078
JNI_CALL_METHOD(env, jhandler_, "onContextMenuCommand",
7179
"(Lorg/cef/browser/CefBrowser;Lorg/cef/browser/CefFrame;Lorg/"
7280
"cef/callback/"
7381
"CefContextMenuParams;II)Z",
74-
Boolean, result, GetJNIBrowser(browser),
75-
GetJNIFrame(env, frame), jparams, (jint)command_id,
76-
(jint)event_flags);
82+
Boolean, result, GetJNIBrowser(browser), jframe, jparams,
83+
(jint)command_id, (jint)event_flags);
7784

7885
// Do not keep references to |params| or |model| outside of this callback.
7986
SetCefForJNIObject<CefContextMenuParams>(env, jparams, NULL,
8087
"CefContextMenuParams");
88+
env->DeleteLocalRef(jparams);
89+
env->DeleteLocalRef(jframe);
8190
return (result != JNI_FALSE);
8291
}
8392

@@ -87,8 +96,10 @@ void ContextMenuHandler::OnContextMenuDismissed(CefRefPtr<CefBrowser> browser,
8796
if (!env)
8897
return;
8998

99+
jobject jframe = GetJNIFrame(env, frame);
90100
JNI_CALL_VOID_METHOD(
91101
env, jhandler_, "onContextMenuDismissed",
92102
"(Lorg/cef/browser/CefBrowser;Lorg/cef/browser/CefFrame;)V",
93-
GetJNIBrowser(browser), GetJNIFrame(env, frame));
103+
GetJNIBrowser(browser), jframe);
104+
env->DeleteLocalRef(jframe);
94105
}

native/dialog_handler.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,19 @@ bool DialogHandler::OnFileDialog(CefRefPtr<CefBrowser> browser,
4646
SetCefForJNIObject(env, jcallback, callback.get(), "CefFileDialogCallback");
4747

4848
jboolean jreturn = JNI_FALSE;
49+
jstring jtitle = NewJNIString(env, title);
50+
jstring jdefault_file_path = NewJNIString(env, default_file_path);
51+
jobject jaccept_filters = NewJNIStringVector(env, accept_filters);
4952
JNI_CALL_METHOD(
5053
env, jhandler_, "onFileDialog",
5154
"(Lorg/cef/browser/CefBrowser;Lorg/cef/handler/"
5255
"CefDialogHandler$FileDialogMode;Ljava/lang/String;Ljava/lang/"
5356
"String;Ljava/util/Vector;ILorg/cef/callback/CefFileDialogCallback;)Z",
54-
Boolean, jreturn, GetJNIBrowser(browser), jmode, NewJNIString(env, title),
55-
NewJNIString(env, default_file_path),
56-
NewJNIStringVector(env, accept_filters), selected_accept_filter,
57-
jcallback);
57+
Boolean, jreturn, GetJNIBrowser(browser), jmode, jtitle,
58+
jdefault_file_path, jaccept_filters, selected_accept_filter, jcallback);
59+
env->DeleteLocalRef(jaccept_filters);
60+
env->DeleteLocalRef(jdefault_file_path);
61+
env->DeleteLocalRef(jtitle);
62+
env->DeleteLocalRef(jcallback);
5863
return (jreturn != JNI_FALSE);
5964
}

native/display_handler.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ void DisplayHandler::OnAddressChange(CefRefPtr<CefBrowser> browser,
2828
JNI_CALL_VOID_METHOD(env, jhandler_, "onAddressChange",
2929
"(Lorg/cef/browser/CefBrowser;Lorg/cef/browser/"
3030
"CefFrame;Ljava/lang/String;)V",
31-
GetJNIBrowser(browser), jframe,
32-
jurl);
31+
GetJNIBrowser(browser), jframe, jurl);
3332
env->DeleteLocalRef(jurl);
3433
env->DeleteLocalRef(jframe);
3534
}
@@ -101,8 +100,8 @@ bool DisplayHandler::OnConsoleMessage(CefRefPtr<CefBrowser> browser,
101100
env, jhandler_, "onConsoleMessage",
102101
"(Lorg/cef/browser/CefBrowser;Lorg/cef/CefSettings$LogSeverity;"
103102
"Ljava/lang/String;Ljava/lang/String;I)Z",
104-
Boolean, jreturn, GetJNIBrowser(browser), jlevel,
105-
jmessage, jsource, line);
103+
Boolean, jreturn, GetJNIBrowser(browser), jlevel, jmessage, jsource,
104+
line);
106105
env->DeleteLocalRef(jsource);
107106
env->DeleteLocalRef(jmessage);
108107
return (jreturn != JNI_FALSE);

native/download_handler.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,22 +35,27 @@ void DownloadHandler::OnBeforeDownload(
3535

3636
jobject jcallback =
3737
NewJNIObject(env, "org/cef/callback/CefBeforeDownloadCallback_N");
38-
if (!jcallback)
38+
if (!jcallback) {
39+
env->DeleteLocalRef(jdownloadItem);
3940
return;
41+
}
4042
SetCefForJNIObject(env, jcallback, callback.get(),
4143
"CefBeforeDownloadCallback");
4244

45+
jstring jsuggested_name = NewJNIString(env, suggested_name);
4346
JNI_CALL_VOID_METHOD(
4447
env, jhandler_, "onBeforeDownload",
4548
"(Lorg/cef/browser/CefBrowser;Lorg/cef/callback/CefDownloadItem;"
4649
"Ljava/lang/String;Lorg/cef/callback/CefBeforeDownloadCallback;)V",
47-
GetJNIBrowser(browser), jdownloadItem, NewJNIString(env, suggested_name),
48-
jcallback);
50+
GetJNIBrowser(browser), jdownloadItem, jsuggested_name, jcallback);
4951

5052
// delete CefDownloadItem reference from Java because the object
5153
// is only valid within this call
5254
SetCefForJNIObject<CefDownloadItem>(env, jdownloadItem, NULL,
5355
"CefDownloadItem");
56+
env->DeleteLocalRef(jdownloadItem);
57+
env->DeleteLocalRef(jcallback);
58+
env->DeleteLocalRef(jsuggested_name);
5459
}
5560

5661
void DownloadHandler::OnDownloadUpdated(
@@ -70,8 +75,10 @@ void DownloadHandler::OnDownloadUpdated(
7075

7176
jobject jcallback =
7277
NewJNIObject(env, "org/cef/callback/CefDownloadItemCallback_N");
73-
if (!jcallback)
78+
if (!jcallback) {
79+
env->DeleteLocalRef(jdownloadItem);
7480
return;
81+
}
7582
SetCefForJNIObject(env, jcallback, callback.get(), "CefDownloadItemCallback");
7683

7784
JNI_CALL_VOID_METHOD(
@@ -84,4 +91,6 @@ void DownloadHandler::OnDownloadUpdated(
8491
// is only valid within this call
8592
SetCefForJNIObject<CefDownloadItem>(env, jdownloadItem, NULL,
8693
"CefDownloadItem");
94+
env->DeleteLocalRef(jdownloadItem);
95+
env->DeleteLocalRef(jcallback);
8796
}

native/drag_handler.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,6 @@ bool DragHandler::OnDragEnter(CefRefPtr<CefBrowser> browser,
3737

3838
// Remove native reference from java class
3939
SetCefForJNIObject<CefDragData>(env, jdragdata, NULL, "CefDragData");
40+
env->DeleteLocalRef(jdragdata);
4041
return (result != JNI_FALSE);
4142
}

native/jsdialog_handler.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,17 @@ bool JSDialogHandler::OnJSDialog(CefRefPtr<CefBrowser> browser,
5050
SetCefForJNIObject(env, jcallback, callback.get(), "CefJSDialogCallback");
5151

5252
jboolean jresult = JNI_FALSE;
53+
jstring jorigin_url = NewJNIString(env, origin_url);
54+
jstring jmessage_text = NewJNIString(env, message_text);
55+
jstring jdefault_prompt_text = NewJNIString(env, default_prompt_text);
5356
JNI_CALL_METHOD(
5457
env, jhandler_, "onJSDialog",
5558
"(Lorg/cef/browser/CefBrowser;Ljava/lang/String;"
5659
"Lorg/cef/handler/CefJSDialogHandler$JSDialogType;Ljava/lang/String;"
5760
"Ljava/lang/String;Lorg/cef/callback/CefJSDialogCallback;Lorg/cef/misc/"
5861
"BoolRef;)Z",
59-
Boolean, jresult, GetJNIBrowser(browser), NewJNIString(env, origin_url),
60-
jdialogType, NewJNIString(env, message_text),
61-
NewJNIString(env, default_prompt_text), jcallback, jboolRef);
62+
Boolean, jresult, GetJNIBrowser(browser), jorigin_url, jdialogType,
63+
jmessage_text, jdefault_prompt_text, jcallback, jboolRef);
6264

6365
suppress_message = GetJNIBoolRef(env, jboolRef);
6466

@@ -68,6 +70,11 @@ bool JSDialogHandler::OnJSDialog(CefRefPtr<CefBrowser> browser,
6870
SetCefForJNIObject<CefJSDialogCallback>(env, jcallback, NULL,
6971
"CefJSDialogCallback");
7072
}
73+
env->DeleteLocalRef(jcallback);
74+
env->DeleteLocalRef(jorigin_url);
75+
env->DeleteLocalRef(jmessage_text);
76+
env->DeleteLocalRef(jdefault_prompt_text);
77+
env->DeleteLocalRef(jboolRef);
7178
return (jresult != JNI_FALSE);
7279
}
7380

@@ -87,11 +94,11 @@ bool JSDialogHandler::OnBeforeUnloadDialog(
8794
SetCefForJNIObject(env, jcallback, callback.get(), "CefJSDialogCallback");
8895

8996
jboolean jresult = JNI_FALSE;
97+
jstring jmessage_text = NewJNIString(env, message_text);
9098
JNI_CALL_METHOD(env, jhandler_, "onBeforeUnloadDialog",
9199
"(Lorg/cef/browser/CefBrowser;Ljava/lang/String;ZLorg/cef/"
92100
"callback/CefJSDialogCallback;)Z",
93-
Boolean, jresult, GetJNIBrowser(browser),
94-
NewJNIString(env, message_text),
101+
Boolean, jresult, GetJNIBrowser(browser), jmessage_text,
95102
(is_reload ? JNI_TRUE : JNI_FALSE), jcallback);
96103

97104
if (jresult == JNI_FALSE) {
@@ -100,6 +107,8 @@ bool JSDialogHandler::OnBeforeUnloadDialog(
100107
SetCefForJNIObject<CefJSDialogCallback>(env, jcallback, NULL,
101108
"CefJSDialogCallback");
102109
}
110+
env->DeleteLocalRef(jcallback);
111+
env->DeleteLocalRef(jmessage_text);
103112
return (jresult != JNI_FALSE);
104113
}
105114

native/keyboard_handler.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,10 @@ bool KeyboardHandler::OnPreKeyEvent(CefRefPtr<CefBrowser> browser,
5454
return false;
5555

5656
jobject jboolRef = NewJNIBoolRef(env, *is_keyboard_shortcut);
57-
if (!jboolRef)
57+
if (!jboolRef) {
58+
env->DeleteLocalRef(jevent);
5859
return false;
60+
}
5961

6062
jboolean jresult = JNI_FALSE;
6163
JNI_CALL_METHOD(env, jhandler_, "onPreKeyEvent",
@@ -64,6 +66,8 @@ bool KeyboardHandler::OnPreKeyEvent(CefRefPtr<CefBrowser> browser,
6466
Boolean, jresult, GetJNIBrowser(browser), jevent, jboolRef);
6567

6668
*is_keyboard_shortcut = GetJNIBoolRef(env, jboolRef);
69+
env->DeleteLocalRef(jevent);
70+
env->DeleteLocalRef(jboolRef);
6771
return (jresult != JNI_FALSE);
6872
}
6973

@@ -84,5 +88,6 @@ bool KeyboardHandler::OnKeyEvent(CefRefPtr<CefBrowser> browser,
8488
"CefKeyboardHandler$CefKeyEvent;)Z",
8589
Boolean, jresult, GetJNIBrowser(browser), jevent);
8690

91+
env->DeleteLocalRef(jevent);
8792
return (jresult != JNI_FALSE);
8893
}

native/life_span_handler.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,18 @@ bool LifeSpanHandler::OnBeforePopup(CefRefPtr<CefBrowser> browser,
3737
if (!env)
3838
return false;
3939
jboolean jreturn = JNI_FALSE;
40+
jobject jframe = GetJNIFrame(env, frame);
41+
jstring jtarget_url = NewJNIString(env, target_url);
42+
jstring jtarget_frame_name = NewJNIString(env, target_frame_name);
4043
JNI_CALL_METHOD(env, jhandler_, "onBeforePopup",
4144
"(Lorg/cef/browser/CefBrowser;Lorg/cef/browser/"
4245
"CefFrame;Ljava/lang/String;Ljava/lang/String;)Z",
43-
Boolean, jreturn, GetJNIBrowser(browser),
44-
GetJNIFrame(env, frame), NewJNIString(env, target_url),
45-
NewJNIString(env, target_frame_name));
46+
Boolean, jreturn, GetJNIBrowser(browser), jframe, jtarget_url,
47+
jtarget_frame_name);
48+
if (jframe)
49+
env->DeleteLocalRef(jframe);
50+
env->DeleteLocalRef(jtarget_url);
51+
env->DeleteLocalRef(jtarget_frame_name);
4652
return (jreturn != JNI_FALSE);
4753
}
4854

native/load_handler.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,15 @@ void LoadHandler::OnLoadStart(CefRefPtr<CefBrowser> browser,
3939
if (!env)
4040
return;
4141

42-
jobject jframe = GetJNIFrame(env, frame);
43-
4442
jobject jtransitionType = NewJNITransitionType(env, transition_type);
4543
if (!jtransitionType)
4644
return;
4745

46+
jobject jframe = GetJNIFrame(env, frame);
4847
JNI_CALL_VOID_METHOD(env, jhandler_, "onLoadStart",
4948
"(Lorg/cef/browser/CefBrowser;Lorg/cef/browser/"
5049
"CefFrame;Lorg/cef/network/CefRequest$TransitionType;)V",
51-
GetJNIBrowser(browser), jframe,
52-
jtransitionType);
50+
GetJNIBrowser(browser), jframe, jtransitionType);
5351

5452
if (jframe)
5553
env->DeleteLocalRef(jframe);
@@ -81,7 +79,7 @@ void LoadHandler::OnLoadError(CefRefPtr<CefBrowser> browser,
8179
JNIEnv* env = GetJNIEnv();
8280
if (!env)
8381
return;
84-
82+
8583
jobject jframe = GetJNIFrame(env, frame);
8684
jobject jerrorText = NewJNIString(env, errorText);
8785
jobject jfailedUrl = NewJNIString(env, failedUrl);
@@ -90,9 +88,8 @@ void LoadHandler::OnLoadError(CefRefPtr<CefBrowser> browser,
9088
env, jhandler_, "onLoadError",
9189
"(Lorg/cef/browser/CefBrowser;Lorg/cef/browser/CefFrame;Lorg/cef/handler/"
9290
"CefLoadHandler$ErrorCode;Ljava/lang/String;Ljava/lang/String;)V",
93-
GetJNIBrowser(browser), jframe,
94-
NewJNIErrorCode(env, errorCode), jerrorText,
95-
jfailedUrl);
91+
GetJNIBrowser(browser), jframe, NewJNIErrorCode(env, errorCode),
92+
jerrorText, jfailedUrl);
9693

9794
env->DeleteLocalRef(jfailedUrl);
9895
env->DeleteLocalRef(jerrorText);

0 commit comments

Comments
 (0)