[M108 Migration][MM] Show permission pop-up to access IO device. 82/287482/6
authorKoyyani Maheswari <m.koyyani@samsung.com>
Mon, 30 Jan 2023 12:59:15 +0000 (18:29 +0530)
committerBot Blink <blinkbot@samsung.com>
Mon, 20 Feb 2023 10:10:53 +0000 (10:10 +0000)
1) Permission pop-up to access IO device.
2) Fix usage of public ewk api for media permission.

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

Change-Id: I8aa2aed68c0dc4f0c94dd0b5e02e6aa42d8d6d01
Signed-off-by: Koyyani Maheswari <m.koyyani@samsung.com>
tizen_src/chromium_impl/content/browser/speech/tizen_speech_recognition_manager_delegate.cc
tizen_src/chromium_impl/content/browser/speech/tizen_speech_recognition_manager_delegate.h
tizen_src/ewk/efl_integration/private/ewk_user_media_private.h
tizen_src/ewk/efl_integration/private/ewk_view_private.cc
tizen_src/ewk/efl_integration/private/ewk_view_private.h
tizen_src/ewk/efl_integration/public/ewk_user_media.cc
tizen_src/ewk/efl_integration/public/ewk_view.cc

index 8435e66..e48d98b 100644 (file)
@@ -17,11 +17,6 @@ void TizenSpeechRecognitionManagerDelegate::CheckRecognitionIsAllowed(
     int session_id,
     base::OnceCallback<void(bool ask_user, bool is_allowed)> callback) {
   // For tizen, we expect speech recognition to happen when requested.
-
-  // Therefore we simply authorize it by calling back with is_allowed=true. The
-  // first parameter, ask_user, is set to false because we don't want to prompt
-  // the user for permission with an infobar.
-
   // In browser, a pop-up for permission to use microphone will show up.
   // In web app, however, the user agrees on the access to microphone
   // when the app is installed on device. So the pop-up will not show up.
@@ -30,7 +25,7 @@ void TizenSpeechRecognitionManagerDelegate::CheckRecognitionIsAllowed(
       FROM_HERE, base::BindOnce(std::move(callback), IsTIZENWRT(), false));
 #else
   GetIOThreadTaskRunner({})->PostTask(
-      FROM_HERE, base::BindOnce(std::move(callback), false, true));
+      FROM_HERE, base::BindOnce(std::move(callback), true, false));
 #endif
 }
 
index 6ac79bb..30a584a 100644 (file)
@@ -12,8 +12,7 @@ namespace content {
 
 class SpeechRecognitionEventListener;
 // This delegate is used by the speech recognition manager to
-// check for permission to record audio. For tizen, we always authorize
-// speech recognition.
+// check for permission to record audio.
 class TizenSpeechRecognitionManagerDelegate
     : public SpeechRecognitionManagerDelegate {
  public:
index 8b347c7..6ed456c 100644 (file)
@@ -30,6 +30,12 @@ class _Ewk_User_Media_Permission_Request {
   bool IsDecided() const { return decided_; }
   void Suspend() { suspended_ = true; };
   bool IsSuspended() const { return suspended_; }
+  bool IsAudioRequested() const {
+    return blink::IsAudioInputMediaType(request_.audio_type);
+  }
+  bool IsVideoRequested() const {
+    return blink::IsVideoInputMediaType(request_.video_type);
+  }
 
  private:
   content::WebContentsDelegateEfl* web_contents_;
index febd993..c12ed9a 100644 (file)
@@ -314,3 +314,42 @@ bool InitSmartClassInterface(Ewk_View_Smart_Class& api)
 
   return true;
 }
+
+std::string CreatePermissionMessageRequest(
+    const Ewk_User_Media_Permission_Request* user_media_permission_request) {
+  const char msgid_both[] =
+      "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA_"
+      "AND_MICROPHONE";
+  const char msgid_camera[] =
+      "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA";
+  const char msgid_mic[] =
+      "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_"
+      "MICROPHONE";
+
+  std::string value = std::string(
+      ewk_security_origin_host_get(ewk_user_media_permission_request_origin_get(
+          user_media_permission_request)));
+
+  bool isAudioRequested = user_media_permission_request->IsAudioRequested();
+  bool isVideoRequested = user_media_permission_request->IsVideoRequested();
+
+  const char* msgid =
+      (isAudioRequested && !isVideoRequested)
+          ? msgid_mic
+          : (!isAudioRequested && isVideoRequested) ? msgid_camera : msgid_both;
+
+  std::string message = dgettext("WebKit", msgid);
+
+  std::string replace_str = std::string("%1$s");
+  size_t pos = message.find(replace_str.c_str());
+  if (pos != std::string::npos)
+    message.replace(pos, replace_str.length(), value.c_str());
+
+  replace_str = std::string("(%2$s)");
+  pos = message.find(replace_str.c_str());
+  if (pos != std::string::npos)
+    message.replace(pos, replace_str.length(), "");
+
+  return message;
+}
+
index e71b01d..f77c09a 100644 (file)
@@ -6,6 +6,7 @@
 #define ewk_view_private_h
 
 #include <Evas.h>
+#include <string>
 
 #include "eweb_view.h"
 #include "ewk_view.h"
@@ -25,6 +26,10 @@ Ewk_View_Smart_Data* GetEwkViewSmartDataFromEvasObject(const Evas_Object* evas_o
 EWebView* GetWebViewFromSmartData(const Ewk_View_Smart_Data* smartData);
 EWebView* GetWebViewFromEvasObject(const Evas_Object* eo);
 
+// permission message request creator
+std::string CreatePermissionMessageRequest(
+    const Ewk_User_Media_Permission_Request* user_media_permission_request);
+
 // helper macro
 // TODO: "EINA_LOG_ERR" should be changed to "EINA_LOG_CRIT"
 // (http://web.sec.samsung.net/bugzilla/show_bug.cgi?id=15311)
index 78f6012..ee71eb0 100644 (file)
@@ -28,6 +28,7 @@
 #include "private/ewk_private.h"
 #include "private/ewk_security_origin_private.h"
 #include "private/ewk_user_media_private.h"
+#include "private/ewk_view_private.h"
 
 Eina_Bool ewk_user_media_permission_request_suspend(
     Ewk_User_Media_Permission_Request* request) {
@@ -78,16 +79,36 @@ const Ewk_Security_Origin* ewk_user_media_permission_query_origin_get(
 #endif
 }
 
+/* LCOV_EXCL_START */
 const char* ewk_user_media_permission_request_message_get(const Ewk_User_Media_Permission_Request* request)
 {
-  LOG_EWK_API_MOCKUP();
+#if defined(TIZEN_MULTIMEDIA) && BUILDFLAG(IS_TIZEN_TV)
+  std::string message = CreatePermissionMessageRequest(request);
+  return eina_stringshare_add(message.c_str());
+#else
+  LOG_EWK_API_MOCKUP("This API is deprecated");
   return NULL;
+#endif
 }
 
-Ewk_User_Media_Device_Type ewk_user_media_permission_request_device_type_get(const Ewk_User_Media_Permission_Request* request)
-{
-  LOG_EWK_API_MOCKUP();
+Ewk_User_Media_Device_Type ewk_user_media_permission_request_device_type_get(
+    const Ewk_User_Media_Permission_Request* 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;
+
+  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
 }
 
 Ewk_User_Media_Device_Type ewk_user_media_permission_query_device_type_get(
@@ -108,3 +129,4 @@ Ewk_User_Media_Device_Type ewk_user_media_permission_query_device_type_get(
   return EWK_USER_MEDIA_DEVICE_TYPE_NONE;
 #endif
 }
+/* LCOV_EXCL_STOP */
index aec5ec1..c3407d8 100644 (file)
@@ -102,8 +102,10 @@ Evas_Object* ewk_view_add_with_context(Evas* e, Ewk_Context* context)
   Evas_Object* ewk_view = CreateWebViewAsEvasObject(context, e);
 
   if (ewk_view) {
+#if !BUILDFLAG(IS_TIZEN_TV)
     ewk_view_user_media_permission_callback_set(ewk_view,
         _ewk_view_default_user_media_permission, 0);
+#endif
     ewk_view_geolocation_permission_callback_set(ewk_view,
         _ewk_view_default_geolocation_permission, 0);
     ewk_view_notification_permission_callback_set(ewk_view,
@@ -950,23 +952,8 @@ static Eina_Bool _ewk_view_default_user_media_permission(
 {
   EWK_VIEW_IMPL_GET_OR_RETURN(ewk_view, impl, EINA_FALSE);
 
-  std::string value = std::string(ewk_security_origin_host_get(
-      ewk_user_media_permission_request_origin_get(
-          user_media_permission_request)));
-
-  std::string message = std::string(dgettext(
-      "WebKit",
-      "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA"));
-
-  std::string replace_str = std::string("%1$s");
-  size_t pos = message.find(replace_str.c_str());
-  if (pos != std::string::npos)
-    message.replace(pos, replace_str.length(), value.c_str());
-
-  replace_str = std::string("(%2$s)");
-  pos = message.find(replace_str.c_str());
-  if (pos != std::string::npos)
-    message.replace(pos, replace_str.length(), "");
+  std::string message =
+    CreatePermissionMessageRequest(user_media_permission_request);
 
   // add for suspending
   ewk_user_media_permission_request_suspend(user_media_permission_request);