Skip to content

Commit c1949a8

Browse files
[[ libbrowser ]] Added progress, isSecure and allowUserInteraction.
1 parent c05123a commit c1949a8

14 files changed

+534
-18
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Progress, isSecure and allowUserInteractin features added to browser widget
2+
3+
The message `browserProgressChanged` has been added to the browser widget to allow monitoring the progress of page loads.
4+
5+
The property `isSecure` has been added to the browser widget to determine if the content of the current URL has been loaded securely.
6+
7+
The property `allowUserInteraction` has been added to the browser widget to control if the browser should respond to user input.
8+
9+
See the dictionary for full documentation.

engine/src/java/com/runrev/android/libraries/LibBrowser.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ class LibBrowserWebView extends WebView
169169
private String m_js_handlers = "";
170170
private List<String> m_js_handler_list = null;
171171

172+
private boolean m_allow_user_interaction = true;
173+
172174
public LibBrowserWebView(Context p_context)
173175
{
174176
super(p_context);
@@ -231,7 +233,7 @@ public boolean onTouch(View v, MotionEvent event)
231233
}
232234
break;
233235
}
234-
return false;
236+
return !m_allow_user_interaction;
235237
}
236238
});
237239

@@ -353,6 +355,13 @@ else if (p_which == DialogInterface.BUTTON_NEGATIVE)
353355
public void onGeolocationPermissionsShowPrompt( String origin, GeolocationPermissions.Callback callback) {
354356
showRequestAccessDialog(origin, callback, "Location Access", origin + " would like to use your Current Location", "Allow", "Don't Allow");
355357
}
358+
359+
@Override
360+
public void onProgressChanged(WebView p_view, int p_progress)
361+
{
362+
doProgressChanged(p_view.getUrl(), p_progress);
363+
wakeEngineThread();
364+
}
356365

357366
};
358367

@@ -504,6 +513,21 @@ public void setUserAgent(String p_useragent)
504513
{
505514
getSettings().setUserAgentString(p_useragent);
506515
}
516+
517+
public boolean getIsSecure()
518+
{
519+
return getCertificate() != null;
520+
}
521+
522+
public boolean getAllowUserInteraction()
523+
{
524+
return m_allow_user_interaction;
525+
}
526+
527+
public void setAllowUserInteraction(boolean p_value)
528+
{
529+
m_allow_user_interaction = p_value;
530+
}
507531

508532
/* ACTIONS */
509533

@@ -651,4 +675,5 @@ public static String escapeJSString(String p_string)
651675
public native void doFinishedLoading(String url);
652676
public native void doLoadingError(String url, String error);
653677
public native void doUnsupportedScheme(String url);
678+
public native void doProgressChanged(String url, int progress);
654679
}

libbrowser/include/libbrowser.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@ class MCBrowserJavaScriptHandler : public MCBrowserRefCounted
5959
virtual void OnJavaScriptCall(MCBrowser *p_browser, const char *p_handler, MCBrowserListRef p_params) = 0;
6060
};
6161

62+
// Progress update handler
63+
class MCBrowserProgressHandler : public MCBrowserRefCounted
64+
{
65+
public:
66+
virtual void OnProgressChanged(MCBrowser *p_browser, const char *p_url, uint32_t p_progress) = 0;
67+
};
68+
6269
// Properties
6370
enum MCBrowserProperty
6471
{
@@ -68,6 +75,8 @@ enum MCBrowserProperty
6875
kMCBrowserHorizontalScrollbarEnabled,
6976
kMCBrowserAllowNewWindows,
7077
kMCBrowserEnableContextMenu,
78+
kMCBrowserAllowUserInteraction,
79+
kMCBrowserIsSecure,
7180

7281
// String properties
7382
kMCBrowserURL,
@@ -88,7 +97,8 @@ class MCBrowser : public MCBrowserRefCounted
8897
public:
8998
virtual void SetEventHandler(MCBrowserEventHandler *p_handler) = 0;
9099
virtual void SetJavaScriptHandler(MCBrowserJavaScriptHandler *p_handler) = 0;
91-
100+
virtual void SetProgressHandler(MCBrowserProgressHandler *p_handler) = 0;
101+
92102
virtual void *GetNativeLayer() = 0;
93103

94104
virtual bool GetRect(MCBrowserRect &r_rect) = 0;
@@ -277,9 +287,11 @@ enum MCBrowserRequestState
277287

278288
typedef void (*MCBrowserRequestCallback)(void *p_context, MCBrowserRef p_browser, MCBrowserRequestType p_type, MCBrowserRequestState p_state, bool p_in_frame, const char *p_url, const char *p_error);
279289
typedef void (*MCBrowserJavaScriptCallback)(void *p_context, MCBrowserRef p_browser, const char *p_handler, MCBrowserListRef p_params);
290+
typedef void (*MCBrowserProgressCallback)(void *p_context, MCBrowserRef p_browser, const char *p_url, uint32_t p_progress);
280291

281292
MC_BROWSER_DLLEXPORT bool MCBrowserSetRequestHandler(MCBrowserRef p_browser, MCBrowserRequestCallback p_callback, void *p_context);
282293
MC_BROWSER_DLLEXPORT bool MCBrowserSetJavaScriptHandler(MCBrowserRef p_browser, MCBrowserJavaScriptCallback p_callback, void *p_context);
294+
MC_BROWSER_DLLEXPORT bool MCBrowserSetProgressHandler(MCBrowserRef p_browser, MCBrowserProgressCallback p_callback, void *p_context);
283295

284296
}
285297

libbrowser/src/libbrowser.cpp

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ MCBrowserBase::~MCBrowserBase(void)
6363

6464
if (m_javascript_handler)
6565
m_javascript_handler->Release();
66+
67+
if (m_progress_handler)
68+
m_progress_handler->Release();
6669
}
6770

6871
void MCBrowserBase::SetEventHandler(MCBrowserEventHandler *p_handler)
@@ -147,6 +150,30 @@ void MCBrowserBase::OnJavaScriptCall(const char *p_handler, MCBrowserListRef p_p
147150

148151
//////////
149152

153+
void MCBrowserBase::SetProgressHandler(MCBrowserProgressHandler *p_handler)
154+
{
155+
if (p_handler != nil)
156+
p_handler->Retain();
157+
158+
if (m_progress_handler != nil)
159+
m_progress_handler->Release();
160+
161+
m_progress_handler = p_handler;
162+
}
163+
164+
MCBrowserProgressHandler *MCBrowserBase::GetProgressHandler(void)
165+
{
166+
return m_progress_handler;
167+
}
168+
169+
void MCBrowserBase::OnProgressChanged(const char *p_url, uint32_t p_progress)
170+
{
171+
if (m_progress_handler != nil)
172+
m_progress_handler->OnProgressChanged(this, p_url, p_progress);
173+
}
174+
175+
//////////
176+
150177
MCBrowserBase::MCBrowserListEntry *MCBrowserBase::s_browser_list = nil;
151178

152179
bool MCBrowserBase::BrowserListAdd(MCBrowser *p_browser)
@@ -541,6 +568,53 @@ bool MCBrowserSetJavaScriptHandler(MCBrowserRef p_browser, MCBrowserJavaScriptCa
541568

542569
//////////
543570

571+
class MCBrowserProgressHandlerWrapper : public MCBrowserProgressHandler
572+
{
573+
public:
574+
MCBrowserProgressHandlerWrapper(MCBrowserProgressCallback p_callback, void *p_context)
575+
{
576+
m_callback = p_callback;
577+
m_context = p_context;
578+
}
579+
580+
virtual void OnProgressChanged(MCBrowser *p_browser, const char *p_url, uint32_t p_progress)
581+
{
582+
if (m_callback)
583+
m_callback(m_context, p_browser, p_url, p_progress);
584+
}
585+
586+
private:
587+
MCBrowserProgressCallback m_callback;
588+
void *m_context;
589+
};
590+
591+
MC_BROWSER_DLLEXPORT_DEF
592+
bool MCBrowserSetProgressHandler(MCBrowserRef p_browser, MCBrowserProgressCallback p_callback, void *p_context)
593+
{
594+
if (p_browser == nil)
595+
return false;
596+
597+
if (p_callback == nil)
598+
{
599+
p_browser->SetProgressHandler(nil);
600+
return true;
601+
}
602+
603+
MCBrowserProgressHandlerWrapper *t_wrapper;
604+
t_wrapper = new (nothrow) MCBrowserProgressHandlerWrapper(p_callback, p_context);
605+
606+
if (t_wrapper == nil)
607+
return false;
608+
609+
p_browser->SetProgressHandler(t_wrapper);
610+
611+
t_wrapper->Release();
612+
613+
return true;
614+
}
615+
616+
//////////
617+
544618
static MCBrowserWaitFunction s_browser_wait_func = nil;
545619

546620
extern "C" MC_BROWSER_DLLEXPORT_DEF

libbrowser/src/libbrowser_android.cpp

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,12 @@ class MCAndroidWebViewBrowser : public MCBrowserBase
618618
case kMCBrowserHorizontalScrollbarEnabled:
619619
return GetHorizontalScrollbarEnabled(r_value);
620620

621+
case kMCBrowserIsSecure:
622+
return GetIsSecure(r_value);
623+
624+
case kMCBrowserAllowUserInteraction:
625+
return GetAllowUserInteraction(r_value);
626+
621627
default:
622628
break;
623629
}
@@ -634,7 +640,10 @@ class MCAndroidWebViewBrowser : public MCBrowserBase
634640

635641
case kMCBrowserHorizontalScrollbarEnabled:
636642
return SetHorizontalScrollbarEnabled(p_value);
637-
643+
644+
case kMCBrowserAllowUserInteraction:
645+
return SetAllowUserInteraction(p_value);
646+
638647
default:
639648
break;
640649
}
@@ -834,6 +843,24 @@ class MCAndroidWebViewBrowser : public MCBrowserBase
834843
MCAndroidObjectRemoteCall(m_view, "setJavaScriptHandlers", "vs", nil, p_js_handlers);
835844
return true;
836845
}
846+
847+
bool GetIsSecure(bool &r_value)
848+
{
849+
MCAndroidObjectRemoteCall(m_view, "getIsSecure", "b", &r_value);
850+
return true;
851+
}
852+
853+
bool GetAllowUserInteraction(bool &r_value)
854+
{
855+
MCAndroidObjectRemoteCall(m_view, "getAllowUserInteraction", "b", &r_value);
856+
return true;
857+
}
858+
859+
bool SetAllowUserInteraction(bool p_value)
860+
{
861+
MCAndroidObjectRemoteCall(m_view, "setAllowUserInteraction", "vb", nil, p_value);
862+
return true;
863+
}
837864
};
838865

839866
//////////
@@ -1035,6 +1062,26 @@ JNIEXPORT void JNICALL Java_com_runrev_android_libraries_LibBrowserWebView_doUns
10351062
MCCStringFree(t_url);
10361063
}
10371064

1065+
extern "C" JNIEXPORT void JNICALL Java_com_runrev_android_libraries_LibBrowserWebView_doProgressChanged(JNIEnv *env, jobject object, jstring url, jint progress) __attribute__((visibility("default")));
1066+
JNIEXPORT void JNICALL Java_com_runrev_android_libraries_LibBrowserWebView_doProgressChanged(JNIEnv *env, jobject object, jstring url, jint progress)
1067+
{
1068+
bool t_success = true;
1069+
1070+
char *t_url = nil;
1071+
if (t_success)
1072+
t_success = MCBrowserJavaStringToUtf8String(env, url, t_url);
1073+
1074+
if (t_success && !MCCStringBeginsWith(t_url, LIBBROWSER_DUMMY_URL))
1075+
{
1076+
MCBrowser *t_browser;
1077+
if (MCBrowserFindWithJavaView(env, object, t_browser))
1078+
((MCAndroidWebViewBrowser*)t_browser)->OnProgressChanged(t_url, progress);
1079+
}
1080+
1081+
if (t_url != nil)
1082+
MCCStringFree(t_url);
1083+
}
1084+
10381085
////////////////////////////////////////////////////////////////////////////////
10391086

10401087
class MCAndroidWebViewBrowserFactory : public MCBrowserFactory

libbrowser/src/libbrowser_cef.cpp

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1697,6 +1697,39 @@ bool MCCefBrowserBase::GetImage(void*& r_data, int& r_length)
16971697
return false;
16981698
}
16991699

1700+
bool MCCefBrowserBase::GetIsSecure(void)
1701+
{
1702+
CefRefPtr<CefBrowser> t_browser = GetCefBrowser();
1703+
if (t_browser == nil)
1704+
return false;
1705+
1706+
CefRefPtr<CefBrowserHost> t_host = t_browser->GetHost();
1707+
if (t_host == nil)
1708+
return false;
1709+
1710+
CefRefPtr<CefNavigationEntry> t_navigation_entry = t_host->GetVisibleNavigationEntry();
1711+
if (t_navigation_entry == nil)
1712+
return false;
1713+
1714+
CefRefPtr<CefSSLStatus> t_ssl_status = t_navigation_entry->GetSSLStatus();
1715+
if (t_ssl_status == nil)
1716+
return false;
1717+
1718+
return t_ssl_status->IsSecureConnection();
1719+
}
1720+
1721+
bool MCCefBrowserBase::GetAllowUserInteraction(void)
1722+
{
1723+
bool t_value;
1724+
/* UNCHECKED */ PlatformGetAllowUserInteraction(t_value);
1725+
return t_value;
1726+
}
1727+
1728+
void MCCefBrowserBase::SetAllowUserInteraction(bool p_value)
1729+
{
1730+
/* UNCHECKED */ PlatformSetAllowUserInteraction(p_value);
1731+
}
1732+
17001733
////////////////////////////////////////////////////////////////////////////////
17011734

17021735
// Browser Actions
@@ -1874,7 +1907,15 @@ bool MCCefBrowserBase::GetBoolProperty(MCBrowserProperty p_property, bool &r_val
18741907
case kMCBrowserHorizontalScrollbarEnabled:
18751908
r_value = GetHorizontalScrollbarEnabled();
18761909
return true;
1877-
1910+
1911+
case kMCBrowserIsSecure:
1912+
r_value = GetIsSecure();
1913+
return true;
1914+
1915+
case kMCBrowserAllowUserInteraction:
1916+
r_value = GetAllowUserInteraction();
1917+
return true;
1918+
18781919
default:
18791920
break;
18801921
}
@@ -1901,7 +1942,11 @@ bool MCCefBrowserBase::SetBoolProperty(MCBrowserProperty p_property, bool p_valu
19011942
case kMCBrowserHorizontalScrollbarEnabled:
19021943
SetHorizontalScrollbarEnabled(p_value);
19031944
return true;
1904-
1945+
1946+
case kMCBrowserAllowUserInteraction:
1947+
SetAllowUserInteraction(p_value);
1948+
return true;
1949+
19051950
default:
19061951
break;
19071952
}

libbrowser/src/libbrowser_cef.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,12 @@ class MCCefBrowserBase : public MCBrowserBase
124124

125125
virtual char *GetURL(void);
126126
virtual bool GetImage(void*& r_data, int& r_length);
127-
127+
128+
virtual bool GetIsSecure();
129+
130+
virtual bool GetAllowUserInteraction(void);
131+
virtual void SetAllowUserInteraction(bool p_allow);
132+
128133
// Browser Actions
129134

130135
virtual bool SetJavaScriptHandlers(const char *p_handlers);
@@ -140,7 +145,10 @@ class MCCefBrowserBase : public MCBrowserBase
140145
virtual bool PlatformGetNativeLayer(void *&r_layer) = 0;
141146

142147
virtual bool PlatformGetAuthCredentials(bool p_is_proxy, const CefString &p_url, const CefString &p_realm, MCCefAuthScheme p_auth_scheme, CefString &r_user, CefString &r_password) = 0;
143-
148+
149+
virtual bool PlatformGetAllowUserInteraction(bool &r_allow_interaction) = 0;
150+
virtual bool PlatformSetAllowUserInteraction(bool p_allow_interaction) = 0;
151+
144152
// Access methods
145153

146154
CefRefPtr<CefBrowser> GetCefBrowser(void);

0 commit comments

Comments
 (0)