Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.

Commit ef2b04a

Browse files
committed
[[ BrowserWidget ]] Fix view -> browser lookup for Android
1 parent 61c0da8 commit ef2b04a

File tree

3 files changed

+50
-12
lines changed

3 files changed

+50
-12
lines changed

libbrowser/src/libbrowser.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -155,18 +155,15 @@ void MCBrowserBase::BrowserListRemove(MCBrowser *p_browser)
155155
MCBrowserMemoryDelete(t_entry);
156156
}
157157

158-
bool MCBrowserBase::BrowserListFindWithView(void *p_view, MCBrowser *&r_browser)
158+
bool MCBrowserBase::BrowserListIterate(MCBrowserIterateCallback p_callback, void *p_context)
159159
{
160160
for (MCBrowserListEntry *t_entry = s_browser_list; t_entry != nil; t_entry = t_entry->next)
161161
{
162-
if (t_entry->browser->GetNativeLayer() == p_view)
163-
{
164-
r_browser = t_entry->browser;
165-
return true;
166-
}
162+
if (!p_callback(t_entry->browser, p_context))
163+
return false;
167164
}
168165

169-
return false;
166+
return true;
170167
}
171168

172169
////////////////////////////////////////////////////////////////////////////////

libbrowser/src/libbrowser_android.cpp

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,43 @@ class MCAndroidWebViewBrowser : public MCBrowserBase
298298

299299
//////////
300300

301+
struct __browser_find_with_java_view_context
302+
{
303+
JNIEnv* env;
304+
jobject view;
305+
MCBrowser *browser;
306+
};
307+
308+
static bool __browser_find_with_java_view_callback(MCBrowser *p_browser, void *p_context)
309+
{
310+
__browser_find_with_java_view_context *context;
311+
context = (__browser_find_with_java_view_context*)p_context;
312+
313+
if (context->env->IsSameObject(context->view, (jobject)p_browser->GetNativeLayer()))
314+
{
315+
context->browser = p_browser;
316+
return false; // End iterator once browser found
317+
}
318+
319+
return true;
320+
}
321+
322+
bool MCBrowserFindWithJavaView(JNIEnv *env, jobject p_view, MCBrowser *&r_browser)
323+
{
324+
__browser_find_with_java_view_context context;
325+
context.env = env;
326+
context.view = p_view;
327+
context.browser = nil;
328+
329+
MCBrowserBase::BrowserListIterate(__browser_find_with_java_view_callback, &context);
330+
331+
if (context.browser == nil)
332+
return false;
333+
334+
r_browser = context.browser;
335+
return true;
336+
}
337+
301338
extern "C" JNIEXPORT void JNICALL Java_com_runrev_android_libraries_LibBrowserWebView_doJSExecutionResult(JNIEnv *env, jobject object, jstring tag, jstring result) __attribute__((visibility("default")));
302339
JNIEXPORT void JNICALL Java_com_runrev_android_libraries_LibBrowserWebView_doJSExecutionResult(JNIEnv *env, jobject object, jstring tag, jstring result)
303340
{
@@ -308,7 +345,7 @@ JNIEXPORT void JNICALL Java_com_runrev_android_libraries_LibBrowserWebView_doJSE
308345
/* UNCHECKED */ MCBrowserJavaStringToUtf8String(env, result, t_result);
309346

310347
MCBrowser *t_browser;
311-
if (MCBrowserBase::BrowserListFindWithView(object, t_browser))
348+
if (MCBrowserFindWithJavaView(env, object, t_browser))
312349
((MCAndroidWebViewBrowser*)t_browser)->SetJavaScriptResult(t_tag, t_result);
313350

314351
MCCStringFree(t_tag);
@@ -323,7 +360,7 @@ JNIEXPORT void JNICALL Java_com_runrev_android_libraries_LibBrowserWebView_doSta
323360
/* UNCHECKED */ MCBrowserJavaStringToUtf8String(env, url, t_url);
324361

325362
MCBrowser *t_browser;
326-
if (MCBrowserBase::BrowserListFindWithView(object, t_browser))
363+
if (MCBrowserFindWithJavaView(env, object, t_browser))
327364
((MCAndroidWebViewBrowser*)t_browser)->OnDocumentLoadBegin(false, t_url);
328365

329366
MCCStringFree(t_url);
@@ -337,7 +374,7 @@ JNIEXPORT void JNICALL Java_com_runrev_android_libraries_LibBrowserWebView_doFin
337374
/* UNCHECKED */ MCBrowserJavaStringToUtf8String(env, url, t_url);
338375

339376
MCBrowser *t_browser;
340-
if (MCBrowserBase::BrowserListFindWithView(object, t_browser))
377+
if (MCBrowserFindWithJavaView(env, object, t_browser))
341378
((MCAndroidWebViewBrowser*)t_browser)->OnDocumentLoadComplete(false, t_url);
342379

343380
MCCStringFree(t_url);
@@ -355,7 +392,7 @@ JNIEXPORT void JNICALL Java_com_runrev_android_libraries_LibBrowserWebView_doLoa
355392
/* UNCHECKED */ MCBrowserJavaStringToUtf8String(env, error, t_error);
356393

357394
MCBrowser *t_browser;
358-
if (MCBrowserBase::BrowserListFindWithView(object, t_browser))
395+
if (MCBrowserFindWithJavaView(env, object, t_browser))
359396
((MCAndroidWebViewBrowser*)t_browser)->OnDocumentLoadFailed(false, t_url, t_error);
360397

361398
MCCStringFree(t_url);

libbrowser/src/libbrowser_internal.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919

2020
#include <libbrowser.h>
2121

22+
////////////////////////////////////////////////////////////////////////////////
23+
24+
typedef bool (*MCBrowserIterateCallback)(MCBrowser *p_browser, void *p_context);
25+
2226
////////////////////////////////////////////////////////////////////////////////
2327
// C++ Implementation Class
2428

@@ -48,7 +52,7 @@ class MCBrowserBase : public MCBrowser
4852

4953
static bool BrowserListAdd(MCBrowser *p_browser);
5054
static void BrowserListRemove(MCBrowser *p_browser);
51-
static bool BrowserListFindWithView(void *p_view, MCBrowser *&r_browser);
55+
static bool BrowserListIterate(MCBrowserIterateCallback p_callback, void *p_context);
5256

5357
private:
5458
struct MCBrowserListEntry

0 commit comments

Comments
 (0)