callback_result);
}
+void EWebView::SetViewUserMediaPermissionQueryCallback(
+ Ewk_View_User_Media_Permission_Query_Callback callback,
+ void* user_data) {
+ user_media_permission_query_cb_.Set(callback, user_data);
+}
+
+Ewk_User_Media_Permission_Query_Result
+EWebView::InvokeViewUserMediaPermissionQueryCallback(
+ _Ewk_User_Media_Permission_Query* permission_context) {
+ return user_media_permission_query_cb_.Run(evas_object_, permission_context);
+}
+
void EWebView::SetViewUnfocusAllowCallback(
Ewk_View_Unfocus_Allow_Callback callback,
void* user_data) {
void* user_data_;
};
+template <typename CallbackReturnValue,
+ typename CallbackPtr,
+ typename CallbackParameter>
+class WebViewCallbackWithReturnValue {
+ public:
+ WebViewCallbackWithReturnValue() { Set(nullptr, nullptr); }
+
+ void Set(CallbackPtr cb, void* data) {
+ callback_ = cb;
+ user_data_ = data;
+ }
+
+ /* LCOV_EXCL_START */
+ bool IsCallbackSet() const { return callback_; }
+
+ CallbackReturnValue Run(Evas_Object* webview, CallbackParameter param) {
+ if (IsCallbackSet())
+ return callback_(webview, param, user_data_);
+
+ return {};
+ }
+ /* LCOV_EXCL_STOP */
+
+ private:
+ CallbackPtr callback_;
+ void* user_data_;
+};
+
template <typename CallbackPtr, typename... CallbackParameter>
class WebViewExceededQuotaCallback {
public:
bool InvokeViewUserMediaPermissionCallback(
_Ewk_User_Media_Permission_Request* user_media_permission_request_context,
Eina_Bool* result);
+ void SetViewUserMediaPermissionQueryCallback(
+ Ewk_View_User_Media_Permission_Query_Callback callback,
+ void* user_data);
+ Ewk_User_Media_Permission_Query_Result
+ InvokeViewUserMediaPermissionQueryCallback(
+ _Ewk_User_Media_Permission_Query* user_media_permission_query_context);
void SetViewUnfocusAllowCallback(Ewk_View_Unfocus_Allow_Callback callback,
void* user_data);
bool InvokeViewUnfocusAllowCallback(Ewk_Unfocus_Direction direction,
WebViewCallback<Ewk_View_User_Media_Permission_Callback,
_Ewk_User_Media_Permission_Request*>
user_media_permission_cb_;
+ WebViewCallbackWithReturnValue<Ewk_User_Media_Permission_Query_Result,
+ Ewk_View_User_Media_Permission_Query_Callback,
+ _Ewk_User_Media_Permission_Query*>
+ user_media_permission_query_cb_;
WebViewCallback<Ewk_View_Unfocus_Allow_Callback, Ewk_Unfocus_Direction>
unfocus_allow_cb_;
WebViewCallback<Ewk_View_Notification_Permission_Callback,
#include "content_main_delegate_efl.h"
#include "ewk_global_data.h"
#include "third_party/blink/public/common/permissions/permission_utils.h"
+#include "web_contents_delegate_efl.h"
using namespace blink::mojom;
RenderFrameHost* render_frame_host) {
if (render_frame_host->IsNestedWithinFencedFrame())
return blink::mojom::PermissionStatus::DENIED;
- return GetPermissionStatus(
- permission,
+
+ const GURL& requesting_origin =
permissions::PermissionUtil::GetLastCommittedOriginAsURL(
- render_frame_host),
+ render_frame_host);
+
+ if (permission == PermissionType::AUDIO_CAPTURE ||
+ permission == PermissionType::VIDEO_CAPTURE) {
+ content::WebContentsDelegateEfl* delegate =
+ static_cast<content::WebContentsDelegateEfl*>(
+ content::WebContents::FromRenderFrameHost(render_frame_host)
+ ->GetDelegate());
+
+ if (!delegate->web_view())
+ return PermissionStatus::DENIED;
+
+ // Non suspendible object.
+ std::unique_ptr<_Ewk_User_Media_Permission_Query> media_permission_query(
+ new _Ewk_User_Media_Permission_Query(delegate, permission,
+ requesting_origin));
+
+ Ewk_User_Media_Permission_Query_Result permission_result;
+ permission_result =
+ delegate->web_view()->InvokeViewUserMediaPermissionQueryCallback(
+ media_permission_query.get());
+ if (permission_result == EWK_USER_MEDIA_PERMISSION_QUERY_RESULT_ASK) {
+ return PermissionStatus::ASK;
+ } else if (permission_result ==
+ EWK_USER_MEDIA_PERMISSION_QUERY_RESULT_GRANTED) {
+ return PermissionStatus::GRANTED;
+ }
+
+ return PermissionStatus::DENIED;
+ }
+
+ return GetPermissionStatus(
+ permission, requesting_origin,
permissions::PermissionUtil::GetLastCommittedOriginAsURL(
render_frame_host->GetMainFrame()));
}
BrowserThread::DeleteSoon(BrowserThread::UI, FROM_HERE, this);
}
}
+
+_Ewk_User_Media_Permission_Query::_Ewk_User_Media_Permission_Query(
+ content::WebContentsDelegateEfl* web_contents,
+ blink::PermissionType permission,
+ const GURL& requesting_origin)
+ : web_contents_(web_contents),
+ permission_type_(permission),
+ origin_(new _Ewk_Security_Origin(requesting_origin)) {}
#include "content/public/browser/media_stream_request.h"
#include "private/ewk_security_origin_private.h"
#include "public/ewk_security_origin.h"
+#include "third_party/blink/public/common/permissions/permission_utils.h"
#include "web_contents_delegate_efl.h"
using content::BrowserThread;
bool suspended_;
};
+// Non suspendible
+class _Ewk_User_Media_Permission_Query {
+ public:
+ _Ewk_User_Media_Permission_Query(
+ content::WebContentsDelegateEfl* web_contents,
+ blink::PermissionType permission,
+ const GURL& requesting_origin);
+
+ const _Ewk_Security_Origin* Origin() const { return origin_.get(); }
+ blink::PermissionType GetPermissionType() { return permission_type_; }
+ content::WebContentsDelegateEfl* WebContents() const { return web_contents_; }
+ bool IsAudioRequested() const {
+ return permission_type_ == blink::PermissionType::AUDIO_CAPTURE;
+ }
+ bool IsVideoRequested() const {
+ return permission_type_ == blink::PermissionType::VIDEO_CAPTURE;
+ }
+
+ private:
+ content::WebContentsDelegateEfl* web_contents_;
+ blink::PermissionType permission_type_;
+ std::unique_ptr<_Ewk_Security_Origin> origin_;
+};
+
#endif // ewk_user_media_private_h
#endif
}
+const Ewk_Security_Origin* ewk_user_media_permission_query_origin_get(
+ const Ewk_User_Media_Permission_Query* request) {
+#if defined(TIZEN_MULTIMEDIA)
+ EINA_SAFETY_ON_NULL_RETURN_VAL(request, 0);
+
+ return static_cast<const Ewk_Security_Origin*>(request->Origin());
+#else
+ return nullptr;
+#endif
+}
+
const char* ewk_user_media_permission_request_message_get(const Ewk_User_Media_Permission_Request* request)
{
LOG_EWK_API_MOCKUP();
LOG_EWK_API_MOCKUP();
return EWK_USER_MEDIA_DEVICE_TYPE_NONE;
}
+
+Ewk_User_Media_Device_Type ewk_user_media_permission_query_device_type_get(
+ const Ewk_User_Media_Permission_Query* request) {
+#if BUILDFLAG(IS_TIZEN_TV)
+ if (!request)
+ return EWK_USER_MEDIA_DEVICE_TYPE_NONE;
+
+ int deviceType = 0;
+ if (request->IsAudioRequested())
+ deviceType = EWK_USER_MEDIA_DEVICE_TYPE_MICROPHONE;
+ else if (request->IsVideoRequested())
+ deviceType = EWK_USER_MEDIA_DEVICE_TYPE_CAMERA;
+
+ return static_cast<Ewk_User_Media_Device_Type>(deviceType);
+#else
+ LOG_EWK_API_MOCKUP("Only for Tizen TV.");
+ return EWK_USER_MEDIA_DEVICE_TYPE_NONE;
+#endif
+}
#endif
typedef struct _Ewk_User_Media_Permission_Request Ewk_User_Media_Permission_Request;
+typedef struct _Ewk_User_Media_Permission_Query Ewk_User_Media_Permission_Query;
/**
* enum _Ewk_User_Media_Device_Type
*/
EXPORT_API Ewk_User_Media_Device_Type ewk_user_media_permission_request_device_type_get(const Ewk_User_Media_Permission_Request* request);
+/**
+ * Requests for getting origin of local media permission query.
+ *
+ * @param request Ewk_User_Media_Permission_Query object to get origin for
+ * userMedia permission query
+ *
+ * @return security origin of userMedia permission query
+ */
+EXPORT_API const Ewk_Security_Origin*
+ewk_user_media_permission_query_origin_get(
+ const Ewk_User_Media_Permission_Query* request);
+
+/**
+ * Get the type of device type for media permission query message.
+ *
+ * @param request Ewk_User_Media_Permission_Request object to get message for
+ * userMedia permission query
+ *
+ * @return The type of device type, MicroPhone or Camera.
+ */
+EXPORT_API Ewk_User_Media_Device_Type
+ewk_user_media_permission_query_device_type_get(
+ const Ewk_User_Media_Permission_Query* request);
+
#ifdef __cplusplus
}
#endif
impl->SetViewUserMediaPermissionCallback(callback, user_data);
}
+void ewk_view_user_media_permission_query_callback_set(
+ Evas_Object* ewk_view,
+ Ewk_View_User_Media_Permission_Query_Callback callback,
+ void* user_data) {
+ EWK_VIEW_IMPL_GET_OR_RETURN(ewk_view, impl);
+ impl->SetViewUserMediaPermissionQueryCallback(callback, user_data);
+}
+
static Eina_Bool _ewk_view_default_user_media_permission(
Evas_Object* ewk_view,
Ewk_User_Media_Permission_Request* user_media_permission_request,
Ewk_View_User_Media_Permission_Callback callback,
void* user_data);
+enum _Ewk_User_Media_Permission_Query_Result {
+ EWK_USER_MEDIA_PERMISSION_QUERY_RESULT_ASK = 0,
+ EWK_USER_MEDIA_PERMISSION_QUERY_RESULT_GRANTED = 1,
+ EWK_USER_MEDIA_PERMISSION_QUERY_RESULT_DENIED = 2,
+};
+typedef enum _Ewk_User_Media_Permission_Query_Result
+ Ewk_User_Media_Permission_Query_Result;
+
+typedef Ewk_User_Media_Permission_Query_Result (
+ *Ewk_View_User_Media_Permission_Query_Callback)(
+ Evas_Object* ewk_view,
+ Ewk_User_Media_Permission_Query* user_media_permission_query,
+ void* user_data);
+EXPORT_API void ewk_view_user_media_permission_query_callback_set(
+ Evas_Object* ewk_view,
+ Ewk_View_User_Media_Permission_Query_Callback callback,
+ void* user_data);
+
/**
* Callback for ewk_view_authentication_callback_set
*
web_view_, &Window::OnThemeColorChanged, this);
ewk_view_exceeded_indexed_database_quota_callback_set(
web_view_, Window::OnQuotaExceededIndexedDB, this);
+ ewk_view_user_media_permission_query_callback_set(
+ web_view_, Window::OnUserMediaPermissionQuery, this);
ewk_settings_form_profile_data_enabled_set(GetEwkSettings(), true);
ewk_settings_form_candidate_data_enabled_set(GetEwkSettings(), true);
ewk_view_quota_permission_request_reply(request, true);
}
+Ewk_User_Media_Permission_Query_Result Window::OnUserMediaPermissionQuery(
+ Evas_Object* ewk_view,
+ Ewk_User_Media_Permission_Query* user_media_permission_query,
+ void* user_data) {
+ const Ewk_Security_Origin* sec_origin =
+ ewk_user_media_permission_query_origin_get(user_media_permission_query);
+ log_info("Ewk_User_Media_Permission_Query origin : %s\n",
+ ewk_security_origin_host_get(sec_origin));
+ log_info("Ewk_User_Media_Device_Type microphone(1) or camera(2) : %d\n",
+ ewk_user_media_permission_query_device_type_get(
+ user_media_permission_query));
+
+ // Check for stored permission status for origin and permission type, and
+ // return status accordingly.
+ return EWK_USER_MEDIA_PERMISSION_QUERY_RESULT_ASK;
+}
+
void Window::OnThemeColorChanged(Evas_Object* o,
int r,
int g,
int b,
int a,
void* data);
+ static Ewk_User_Media_Permission_Query_Result OnUserMediaPermissionQuery(
+ Evas_Object*,
+ Ewk_User_Media_Permission_Query*,
+ void*);
#if BUILDFLAG(IS_TIZEN)
static void OnHWBack(void*, Evas_Object*, void*);
#endif