[M108 Migration] Add ewk apis to support functionality for Permissions.query JS api 99/287999/2
authorGajendra N <gajendra.n@samsung.com>
Wed, 8 Feb 2023 09:52:33 +0000 (15:22 +0530)
committerBot Blink <blinkbot@samsung.com>
Fri, 10 Feb 2023 23:23:49 +0000 (23:23 +0000)
At javascript side, permissions.query() is used to query the exisiting
permission status granted for an origin. The query has to be passed to
web browser to get the status, and hence there is need for introducing
new ewk apis :

ewk_view_user_media_permission_query_callback_set
ewk_user_media_permission_query_origin_get
ewk_user_media_permission_query_device_type_get

Web Browser returns EWK_USER_MEDIA_PERMISSION_QUERY_RESULT_{ASK|GRANTED|DENIED}
enum value, based on which blink::PermissionStatus::{ASK|GRANTED|DENIED} status
is returned to blink.

Reference: https://review.tizen.org/gerrit/280629

Change-Id: Ic54dd1aa379216a31d64255712f21371781c29d1
Signed-off-by: Gajendra N <gajendra.n@samsung.com>
tizen_src/ewk/efl_integration/eweb_view.cc
tizen_src/ewk/efl_integration/eweb_view.h
tizen_src/ewk/efl_integration/permission_controller_delegate_efl.cc
tizen_src/ewk/efl_integration/private/ewk_user_media_private.cc
tizen_src/ewk/efl_integration/private/ewk_user_media_private.h
tizen_src/ewk/efl_integration/public/ewk_user_media.cc
tizen_src/ewk/efl_integration/public/ewk_user_media_internal.h
tizen_src/ewk/efl_integration/public/ewk_view.cc
tizen_src/ewk/efl_integration/public/ewk_view_internal.h
tizen_src/ewk/ubrowser/window.cc
tizen_src/ewk/ubrowser/window.h

index 89770db..a52450d 100644 (file)
@@ -1977,6 +1977,18 @@ bool EWebView::InvokeViewUserMediaPermissionCallback(
                                        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) {
index 79abbc3..08e0c68 100755 (executable)
@@ -118,6 +118,34 @@ class WebViewCallback {
   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:
@@ -409,6 +437,12 @@ class EWebView {
   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,
@@ -664,6 +698,10 @@ class EWebView {
   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,
index f664972..deb1a6a 100644 (file)
@@ -18,6 +18,7 @@
 #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;
 
@@ -244,10 +245,42 @@ PermissionControllerDelegateEfl::GetPermissionStatusForCurrentDocument(
     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()));
 }
index 6c0f637..04b2875 100644 (file)
@@ -35,3 +35,11 @@ void _Ewk_User_Media_Permission_Request::ProceedPermissionCallback(bool allowed)
     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)) {}
index 9e3def5..8b347c7 100644 (file)
@@ -11,6 +11,7 @@
 #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;
@@ -40,4 +41,28 @@ class _Ewk_User_Media_Permission_Request {
   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
index 226090a..ab6eb8d 100644 (file)
@@ -63,6 +63,17 @@ const Ewk_Security_Origin* ewk_user_media_permission_request_origin_get(
 #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();
@@ -74,3 +85,22 @@ Ewk_User_Media_Device_Type ewk_user_media_permission_request_device_type_get(con
   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
+}
index 20ad24d..d6c0ce6 100644 (file)
@@ -35,6 +35,7 @@ extern "C" {
 #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
@@ -110,6 +111,30 @@ EXPORT_API const char* ewk_user_media_permission_request_message_get(const Ewk_U
  */
 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
index d779344..e5ffe46 100644 (file)
@@ -918,6 +918,14 @@ void ewk_view_user_media_permission_callback_set(Evas_Object* ewk_view,
   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,
index 05d81a1..f7a8de7 100644 (file)
@@ -615,6 +615,24 @@ EXPORT_API void ewk_view_user_media_permission_callback_set(
     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
  *
index a414ce0..6dae22b 100644 (file)
@@ -206,6 +206,8 @@ Window::Window(Browser& browser, int width, int height, bool incognito)
       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);
@@ -814,6 +816,23 @@ void Window::OnQuotaPermissionRequest(Evas_Object*, const Ewk_Quota_Permission_R
   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,
index 61c9987..daf1cec 100644 (file)
@@ -89,6 +89,10 @@ class Window {
                                   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