Internalization for user_media
authorDongJun Kim <djmix.kim@samsung.com>
Wed, 17 Jun 2015 11:30:13 +0000 (20:30 +0900)
committerYoungsoo Choi <kenshin.choi@samsung.com>
Tue, 10 Jul 2018 06:57:09 +0000 (06:57 +0000)
This patch is internalization for user media on tizen 3.0.

In Previous version, permission request popups are
implemented on application side like WRT or browser.
Now we change to internalize this on web-engine.

Permission request callback is set to web-engine by default.
If do not set any permission callback by user,
it will be shown up by web engine side.

In this procedure, web-engine can manage request popup via below classes.
- UserMediaPermissionPopup
- PermissionPopupManager

On the other hand,
application can set to callback function and reply to result via below APIs.
- ewk_view_user_media_permission_callback_set()
- ewk_user_media_permission_reply()
- ewk_user_media_permission_request_origin_get()

Bug: http://web.sec.samsung.net/bugzilla/show_bug.cgi?id=13067
Reviewed by: Antonio Gomes, Hyunhak Kim

Change-Id: I652ca1cbda5fd4fe38f5baba06a9c3103d4ac6fd
Signed-off-by: DongJun Kim <djmix.kim@samsung.com>
37 files changed:
tizen_src/ewk/efl_integration/browser/javascript_dialog_manager_efl.h
tizen_src/ewk/efl_integration/efl_integration.gypi
tizen_src/ewk/efl_integration/eweb_view.cc
tizen_src/ewk/efl_integration/eweb_view.h
tizen_src/ewk/efl_integration/eweb_view_callbacks.h
tizen_src/ewk/efl_integration/permission_popup.h [new file with mode: 0644]
tizen_src/ewk/efl_integration/permission_popup_manager.cc [new file with mode: 0755]
tizen_src/ewk/efl_integration/permission_popup_manager.h [new file with mode: 0644]
tizen_src/ewk/efl_integration/private/ewk_user_media_private.cc [new file with mode: 0644]
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.h
tizen_src/ewk/efl_integration/public/ewk_view.cc
tizen_src/ewk/efl_integration/public/ewk_view.h
tizen_src/ewk/efl_integration/usermedia_permission_popup.cc [new file with mode: 0644]
tizen_src/ewk/efl_integration/usermedia_permission_popup.h [new file with mode: 0644]
tizen_src/ewk/efl_integration/web_contents_delegate_efl.cc
tizen_src/ewk/efl_integration/web_contents_delegate_efl.h
tizen_src/ewk/po_tizen/ar.po
tizen_src/ewk/po_tizen/bn.po
tizen_src/ewk/po_tizen/en.po
tizen_src/ewk/po_tizen/en_PH.po
tizen_src/ewk/po_tizen/en_US.po
tizen_src/ewk/po_tizen/fr_FR.po
tizen_src/ewk/po_tizen/gu.po
tizen_src/ewk/po_tizen/hi.po
tizen_src/ewk/po_tizen/kn.po
tizen_src/ewk/po_tizen/ko_KR.po
tizen_src/ewk/po_tizen/ml.po
tizen_src/ewk/po_tizen/pt_BR.po
tizen_src/ewk/po_tizen/pt_PT.po
tizen_src/ewk/po_tizen/si.po
tizen_src/ewk/po_tizen/ta.po
tizen_src/ewk/po_tizen/te.po
tizen_src/ewk/po_tizen/tr_TR.po
tizen_src/ewk/po_tizen/ur.po
tizen_src/ewk/po_tizen/zh_CN.po

index ef9990f..18c457d 100644 (file)
@@ -10,6 +10,7 @@
 #include "content/public/browser/javascript_dialog_manager.h"
 #include "content/public/common/javascript_message_type.h"
 #include "eweb_view.h"
+#include "public/ewk_view.h"
 #include "url/gurl.h"
 
 namespace content{
index dd61057..5830294 100644 (file)
       'message_pump_for_ui_efl.h',
       'network_delegate_efl.cc',
       'network_delegate_efl.h',
+      'permission_popup.h'
+      'permission_popup_manager.cc'
+      'permission_popup_manager.h',
       'popup_controller_efl.cc',
       'popup_controller_efl.h',
       'scroll_detector.cc',
       'text_encoding_map_efl.h',
       'url_request_context_getter_efl.cc',
       'url_request_context_getter_efl.h',
+      'usermedia_permission_popup.cc',
+      'usermedia_permission_popup.h',
       'web_contents_efl_delegate_ewk.cc',
       'web_contents_efl_delegate_ewk.h',
       'web_contents_delegate_efl.cc',
       'private/ewk_text_style_private.h',
       'private/ewk_tracing_private.cc',
       'private/ewk_tracing_private.h',
+      'private/ewk_user_media_private.cc',
       'private/ewk_user_media_private.h',
       'private/ewk_view_private.cc',
       'private/ewk_view_private.h',
index c7adf2c..97fd92b 100644 (file)
@@ -56,6 +56,7 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/gfx/screen.h"
 #include "devtools_delegate_efl.h"
+#include "permission_popup_manager.cc"
 
 #include "browser/web_view_evas_handler.h"
 
@@ -218,6 +219,28 @@ class WebViewGeolocationPermissionCallback {
   void* user_data;
 };
 
+class WebViewUserMediaPermissionCallback {
+ public:
+  WebViewUserMediaPermissionCallback(
+      Ewk_View_User_Media_Permission_Callback cb, void* data)
+    : callback(cb)
+    , user_data(data) { }
+
+  Eina_Bool Run(Evas_Object* webview, _Ewk_User_Media_Permission_Request* request, Eina_Bool* callback_result) {
+    CHECK(callback_result);
+    if (callback) {
+      Eina_Bool result = callback(webview, request, user_data);
+      *callback_result = result;
+      return true;
+    }
+    return false;
+  }
+
+ private:
+  Ewk_View_User_Media_Permission_Callback callback;
+  void* user_data;
+};
+
 class WebViewUnfocusAllowCallback {
  public:
   WebViewUnfocusAllowCallback(Ewk_View_Unfocus_Allow_Callback cb, void* data)
@@ -288,6 +311,8 @@ void EWebView::Initialize() {
       web_contents_->GetController()));
 
   geolocation_permission_cb_.reset(new WebViewGeolocationPermissionCallback(NULL, NULL));
+  user_media_permission_cb_.reset(
+      new WebViewUserMediaPermissionCallback(NULL, NULL));
   unfocus_allow_cb_.reset(new WebViewUnfocusAllowCallback(NULL, NULL));
 
   base::CommandLine *cmdline = base::CommandLine::ForCurrentProcess();
@@ -349,6 +374,9 @@ EWebView::~EWebView()
   // make sure they are released in correct order
   web_contents_.reset();
   web_contents_delegate_.reset();
+
+  GetPermissionPopupManager()->DeleteAllPermissionRequest();
+  permission_popup_manager_.reset();
 }
 
 void EWebView::ReleasePopupMenuList() {
@@ -1633,6 +1661,20 @@ bool EWebView::InvokeViewGeolocationPermissionCallback(_Ewk_Geolocation_Permissi
   return geolocation_permission_cb_->Run(evas_object_, permission_context, callback_result);
 }
 
+void EWebView::SetViewUserMediaPermissionCallback(
+    Ewk_View_User_Media_Permission_Callback callback,
+    void* user_data) {
+  user_media_permission_cb_.reset(new WebViewUserMediaPermissionCallback(
+      callback, user_data));
+}
+
+bool EWebView::InvokeViewUserMediaPermissionCallback(
+    _Ewk_User_Media_Permission_Request* permission_context,
+    Eina_Bool* callback_result) {
+  return user_media_permission_cb_->Run(evas_object_, permission_context,
+      callback_result);
+}
+
 void EWebView::SetViewUnfocusAllowCallback(
     Ewk_View_Unfocus_Allow_Callback callback, void* user_data) {
   unfocus_allow_cb_.reset(new WebViewUnfocusAllowCallback(callback, user_data));
@@ -1997,6 +2039,8 @@ void EWebView::InitializeContent() {
   back_forward_list_.reset(
     new _Ewk_Back_Forward_List(web_contents_->GetController()));
 
+  permission_popup_manager_.reset(new PermissionPopupManager(evas_object_));
+
   native_view_ = static_cast<Evas_Object*>(web_contents_->GetNativeView());
   evas_object_smart_member_add(native_view_, evas_object_);
 }
index 0bd507b..a9eb838 100644 (file)
 #include <locale.h>
 
 #include "base/callback.h"
+#include "base/id_map.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/synchronization/waitable_event.h"
+#include "browser/inputpicker/InputPicker.h"
+#include "browser/selectpicker/popup_picker.h"
 #include "content/public/common/context_menu_params.h"
 #include "content/public/common/file_chooser_params.h"
 #include "content/browser/renderer_host/event_with_latency_info.h"
 #include "content/public/browser/web_contents_delegate.h"
 #include "content/public/browser/web_contents_efl_delegate.h"
 #include "content/public/common/menu_item.h"
-#include "base/id_map.h"
 #include "context_menu_controller_efl.h"
 #include "eweb_context.h"
+#include "eweb_view_callbacks.h"
 #include "ewk_touch.h"
+#include "file_chooser_controller_efl.h"
+#include "permission_popup_manager.h"
+#include "popup_controller_efl.h"
 #include "private/ewk_history_private.h"
 #include "private/ewk_hit_test_private.h"
 #include "private/ewk_auth_challenge_private.h"
 #include "private/ewk_web_application_icon_data_private.h"
 #include "public/ewk_hit_test.h"
 #include "public/ewk_view.h"
-#include "eweb_view_callbacks.h"
 #include "scroll_detector.h"
-#include "web_contents_delegate_efl.h"
-#include "context_menu_controller_efl.h"
-#include "file_chooser_controller_efl.h"
 #include "ui/gfx/geometry/point.h"
 #include "ui/gfx/geometry/size.h"
-#include "browser/inputpicker/InputPicker.h"
-#include "popup_controller_efl.h"
-
-#include "browser/selectpicker/popup_picker.h"
+#include "web_contents_delegate_efl.h"
 
 namespace content {
 class RenderViewHost;
@@ -201,7 +200,9 @@ private:
 class WebViewAsyncRequestHitTestDataCallback;
 class JavaScriptDialogManagerEfl;
 class WebViewGeolocationPermissionCallback;
+class WebViewUserMediaPermissionCallback;
 class WebViewUnfocusAllowCallback;
+class PermissionPopupManager;
 
 class EWebView {
  public:
@@ -221,6 +222,10 @@ class EWebView {
   Ewk_Context* context() const { return context_.get(); }
   Evas_Object* evas_object() const { return evas_object_; }
   Evas* GetEvas() const { return evas_object_evas_get(evas_object_); }
+  PermissionPopupManager* GetPermissionPopupManager() const
+  {
+    return permission_popup_manager_.get();
+  }
 
   content::WebContents& web_contents() const
   {
@@ -357,6 +362,12 @@ class EWebView {
   int SetEwkViewPlainTextGetCallback(Ewk_View_Plain_Text_Get_Callback callback, void* user_data);
   void SetViewGeolocationPermissionCallback(Ewk_View_Geolocation_Permission_Callback callback, void* user_data);
   bool InvokeViewGeolocationPermissionCallback(_Ewk_Geolocation_Permission_Request* geolocation_permission_request_context, Eina_Bool* result);
+  void SetViewUserMediaPermissionCallback(
+      Ewk_View_User_Media_Permission_Callback callback,
+      void* user_data);
+  bool InvokeViewUserMediaPermissionCallback(
+      _Ewk_User_Media_Permission_Request* user_media_permission_request_context,
+      Eina_Bool* result);
   void SetViewUnfocusAllowCallback(Ewk_View_Unfocus_Allow_Callback callback, void* user_data);
   bool InvokeViewUnfocusAllowCallback(Ewk_Unfocus_Direction direction, Eina_Bool* result);
   void DidChangeContentsSize(int width, int height);
@@ -523,12 +534,14 @@ class EWebView {
   double max_page_scale_factor_;
   scoped_ptr<OrientationLockCallback> orientation_lock_callback_;
   scoped_ptr<WebViewGeolocationPermissionCallback> geolocation_permission_cb_;
+  scoped_ptr<WebViewUserMediaPermissionCallback> user_media_permission_cb_;
   scoped_ptr<WebViewUnfocusAllowCallback> unfocus_allow_cb_;
   scoped_ptr<content::InputPicker> inputPicker_;
   IDMap<WebApplicationIconUrlGetCallback, IDMapOwnPointer> web_app_icon_url_get_callback_map_;
   IDMap<WebApplicationIconUrlsGetCallback, IDMapOwnPointer> web_app_icon_urls_get_callback_map_;
   IDMap<WebApplicationCapableGetCallback, IDMapOwnPointer> web_app_capable_get_callback_map_;
   scoped_ptr<NotificationPermissionCallback> notification_permission_callback_;
+  scoped_ptr<PermissionPopupManager> permission_popup_manager_;
   content::DevToolsDelegateEfl* inspector_server_;
   scoped_ptr<ScrollDetector> scroll_detector_;
 #if defined(OS_TIZEN_MOBILE)
index e231cdd..3e3ebbe 100644 (file)
@@ -41,6 +41,8 @@ typedef struct EwkObject Ewk_Download_Job;
 typedef struct EwkObject Ewk_File_Chooser_Request;
 typedef struct EwkObject Ewk_Form_Submission_Request;
 typedef struct EwkObject Ewk_Navigation_Policy_Decision;
+typedef struct _Ewk_User_Media_Permission_Request
+  Ewk_User_Media_Permission_Request;
 
 class Ewk_Wrt_Message_Data;
 
diff --git a/tizen_src/ewk/efl_integration/permission_popup.h b/tizen_src/ewk/efl_integration/permission_popup.h
new file mode 100644 (file)
index 0000000..cf94d67
--- /dev/null
@@ -0,0 +1,35 @@
+// Copyright 2015 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef PermissionPopup_h
+#define PermissionPopup_h
+
+#include <Evas.h>
+#include <string.h>
+
+#include "base/strings/utf_string_conversions.h"
+#include "private/ewk_security_origin_private.h"
+#include "public/ewk_security_origin.h"
+
+class PermissionPopup {
+ public:
+  PermissionPopup(const Ewk_Security_Origin* origin, const std::string& message) {
+    origin_ = origin;
+    popup_message_ = message;
+  }
+
+  ~PermissionPopup() { }
+
+  std::string GetMessage() const { return popup_message_; }
+  std::string GetOriginHost() const {
+    return std::string(ewk_security_origin_host_get(origin_));
+  }
+  virtual void SendDecidedPermission(Evas_Object*, bool decide) = 0;
+
+ private:
+  const Ewk_Security_Origin* origin_;
+  std::string popup_message_;
+};
+
+#endif // PermissionPopup_h
diff --git a/tizen_src/ewk/efl_integration/permission_popup_manager.cc b/tizen_src/ewk/efl_integration/permission_popup_manager.cc
new file mode 100755 (executable)
index 0000000..bc3c5a2
--- /dev/null
@@ -0,0 +1,254 @@
+// Copyright 2015 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#if defined(OS_TIZEN_MOBILE)
+#include <efl_assist.h>
+#endif
+#include <Elementary.h>
+#include <string.h>
+
+#include "base/strings/utf_string_conversions.h"
+#include "eweb_view.h"
+#include "permission_popup.h"
+#include "permission_popup_manager.h"
+
+PermissionPopupManager::PermissionPopupManager(Evas_Object* eweb_view)
+  : is_decided_(false)
+  , permission_popups_(0)
+  , eweb_view_(eweb_view)
+  , popup_(0)
+  , widget_win_(0)
+  , top_widget_(0) {
+}
+
+PermissionPopupManager::~PermissionPopupManager() {
+  ClosePopup();
+  DeleteAllPermissionRequest();
+}
+
+void PermissionPopupManager::AddPermissionRequest(PermissionPopup* popup) {
+  permission_popups_ = eina_list_append(permission_popups_, popup);
+  ShowPermissionPopup(static_cast<PermissionPopup*>(
+      eina_list_data_get(permission_popups_)));
+}
+
+void PermissionPopupManager::DeletePermissionRequest(PermissionPopup* popup) {
+  permission_popups_ = eina_list_remove(permission_popups_, popup);
+  delete popup;
+
+  if (eina_list_count(permission_popups_) == 0)
+    return;
+
+  ShowPermissionPopup(static_cast<PermissionPopup*>(
+      eina_list_data_get(permission_popups_)));
+}
+
+void PermissionPopupManager::DeleteAllPermissionRequest() {
+  void* data;
+  EINA_LIST_FREE(permission_popups_, data)
+    delete static_cast<PermissionPopup*>(data);
+}
+
+Evas_Object* PermissionPopupManager::CreatePopup() {
+  top_widget_ = elm_object_top_widget_get(elm_object_parent_widget_get(eweb_view_));
+  if (!top_widget_)
+    return 0;
+
+  widget_win_ = elm_win_add(top_widget_, "WebKit Permission Popup", ELM_WIN_BASIC);
+  if (!widget_win_)
+    return 0;
+
+  elm_win_alpha_set(widget_win_, EINA_TRUE);
+#if !defined(WAYLAND_BRINGUP)
+  ecore_x_icccm_name_class_set(elm_win_xwindow_get(widget_win_),
+      "APP_POPUP", "APP_POPUP");
+#endif
+
+  if (elm_win_wm_rotation_supported_get(top_widget_)) {
+    int preferredRotation =
+        elm_win_wm_rotation_preferred_rotation_get(top_widget_);
+    if (preferredRotation == -1) {
+      int rots[4] = {0, 90, 180, 270};
+      elm_win_wm_rotation_available_rotations_set(widget_win_, rots, 4);
+    }
+    else {
+      elm_win_wm_rotation_available_rotations_set(widget_win_,
+          &preferredRotation, 1);
+    }
+  }
+
+  Eina_Rectangle windowRect;
+  Ecore_Evas* ee = ecore_evas_ecore_evas_get(
+    evas_object_evas_get(eweb_view_));
+  ecore_evas_geometry_get(ee, &windowRect.x, &windowRect.y,
+    &windowRect.w, &windowRect.h);
+  evas_object_resize(widget_win_, windowRect.w, windowRect.h);
+
+  Evas_Object* conformant = elm_conformant_add(widget_win_);
+  if (!conformant)
+    return 0;
+
+  evas_object_size_hint_weight_set(conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+  elm_win_resize_object_add(widget_win_, conformant);
+  evas_object_show(conformant);
+
+  Evas_Object* layout = elm_layout_add(conformant);
+  if (!layout)
+    return 0;
+
+  elm_layout_theme_set(layout, "layout", "application", "default");
+  evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+  evas_object_show(layout);
+
+  elm_object_content_set(conformant, layout);
+  elm_win_conformant_set(widget_win_, EINA_TRUE);
+
+  evas_object_show(widget_win_);
+
+  Evas_Object* popup = elm_popup_add(layout);
+  elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
+
+  return popup;
+}
+
+static void permissionPopupFocusInCallback(
+    void* data, Evas_Object* obj, void* event_info) {
+  evas_object_smart_callback_del(obj, "focus,in", permissionPopupFocusInCallback);
+
+  PermissionPopupManager* manager = static_cast<PermissionPopupManager*>(data);
+  if (!manager)
+    return;
+  manager->ClosePopup();
+
+  PermissionPopup* popup = manager->GetPermissionPopup();
+  if (!popup)
+    return;
+
+  popup->SendDecidedPermission(manager->GetEwebView(), manager->IsDecided());
+  manager->DeletePermissionRequest(popup);
+}
+
+static void permissionOkCallback(void* data, Evas_Object* obj, void* event_info) {
+  PermissionPopupManager* manager = static_cast<PermissionPopupManager*>(data);
+  if (!manager)
+    return;
+
+  evas_object_smart_callback_add(manager->GetTopWidget(),
+      "focus,in", permissionPopupFocusInCallback, data);
+  manager->HidePopup();
+  manager->Decide(true);
+}
+
+static void permissionCancelCallback(
+    void* data, Evas_Object* obj, void* event_info) {
+  PermissionPopupManager* manager = static_cast<PermissionPopupManager*>(data);
+  if (!manager)
+    return;
+
+  evas_object_smart_callback_add(manager->GetTopWidget(), "focus,in",
+      permissionPopupFocusInCallback, data);
+  manager->HidePopup();
+  manager->Decide(false);
+}
+
+#if defined(OS_TIZEN_MOBILE)
+static void permissionHwBackKeyCallback(
+    void* data, Evas_Object* obj, void* event_info) {
+  PermissionPopupManager* manager = static_cast<PermissionPopupManager*>(data);
+  if (!manager)
+    return;
+
+  evas_object_smart_callback_add(manager->GetTopWidget(),
+      "focus,in", permissionPopupFocusInCallback, data);
+  manager->HidePopup();
+}
+#endif
+
+void PermissionPopupManager::ShowPermissionPopup(PermissionPopup* popup) {
+  if (popup_)
+    return;
+
+  popup_ = CreatePopup();
+
+  if (!popup_)
+    return;
+
+  if (!SetLabelText(popup->GetMessage()))
+    return;
+
+#if defined(OS_TIZEN_MOBILE)
+  ea_object_event_callback_add(popup_, EA_CALLBACK_BACK,
+      permissionHwBackKeyCallback, this);
+#endif
+
+  Evas_Object* cancelButton = elm_button_add(popup_);
+  elm_object_style_set(cancelButton, "popup");
+  elm_object_domain_translatable_part_text_set(
+      cancelButton, NULL, "WebKit", "Cancel");
+  elm_object_part_content_set(popup_, "button1", cancelButton);
+  evas_object_smart_callback_add(cancelButton, "clicked",
+      permissionCancelCallback, this);
+
+  Evas_Object* okButton = elm_button_add(popup_);
+  elm_object_style_set(okButton, "popup");
+  elm_object_domain_translatable_part_text_set(okButton, NULL, "WebKit", "OK");
+  elm_object_part_content_set(popup_, "button2", okButton);
+  evas_object_focus_set(okButton, true);
+  evas_object_smart_callback_add(okButton, "clicked", permissionOkCallback, this);
+
+  elm_object_part_text_set(popup_, "title,text", GetTitle(popup).c_str());
+  evas_object_show(popup_);
+}
+
+std::string PermissionPopupManager::GetTitle(PermissionPopup* popup) {
+  std::string url = std::string(ewk_view_url_get(eweb_view_));
+
+  if (url.empty())
+    url = std::string(ewk_view_title_get(eweb_view_));
+
+  std::string popupTitle = std::string(dgettext(
+    "WebKit","IDS_WEBVIEW_HEADER_MESSAGE_FROM_PS_M_WEBSITE"));
+  std::string replaceStr = std::string("%s");
+  size_t pos = popupTitle.find(replaceStr.c_str());
+  if (pos != std::string::npos)
+    popupTitle.replace(pos, replaceStr.length(), url.c_str());
+
+  return popupTitle;
+}
+
+bool PermissionPopupManager::SetLabelText(const std::string& message) {
+  if (message.empty())
+    return false;
+
+  std::string labal_text = message;
+  std::string replaceStr = std::string("\n");
+  size_t pos = labal_text.find(replaceStr.c_str());
+  if (pos != std::string::npos)
+    labal_text.replace(pos, replaceStr.length(), "</br>");
+
+  elm_object_text_set(popup_, labal_text.c_str());
+
+  return true;
+}
+
+void PermissionPopupManager::ClosePopup() {
+  if (!widget_win_)
+    return;
+
+  evas_object_del(widget_win_);
+  popup_ = 0;
+  widget_win_ = 0;
+}
+
+void PermissionPopupManager::HidePopup() {
+  if (popup_)
+    evas_object_hide(popup_);
+
+  if (widget_win_)
+    evas_object_hide(widget_win_);
+}
+
+PermissionPopup* PermissionPopupManager::GetPermissionPopup() {
+  return static_cast<PermissionPopup*>(eina_list_data_get(permission_popups_));
+}
\ No newline at end of file
diff --git a/tizen_src/ewk/efl_integration/permission_popup_manager.h b/tizen_src/ewk/efl_integration/permission_popup_manager.h
new file mode 100644 (file)
index 0000000..09fc2f5
--- /dev/null
@@ -0,0 +1,43 @@
+// Copyright 2015 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef PermissionPopupManager_h
+#define PermissionPopupManager_h
+
+#include <Elementary.h>
+#include <string.h>
+
+#include "permission_popup.h"
+
+class PermissionPopupManager {
+ public:
+  PermissionPopupManager(Evas_Object* );
+  ~PermissionPopupManager();
+
+  bool IsDecided() const { return is_decided_; }
+  Evas_Object* GetEwebView() const { return eweb_view_; }
+  Evas_Object* GetTopWidget() const { return top_widget_; }
+  PermissionPopup* GetPermissionPopup();
+  void AddPermissionRequest(PermissionPopup*);
+  void ClosePopup();
+  void DeletePermissionRequest(PermissionPopup*);
+  void DeleteAllPermissionRequest();
+  void HidePopup();
+  void Decide(bool decided) { is_decided_ = decided; }
+
+ private:
+  bool SetLabelText(const std::string& message);
+  Evas_Object* CreatePopup();
+  std::string GetTitle(PermissionPopup* popup);
+  void ShowPermissionPopup(PermissionPopup*);
+
+  bool is_decided_;
+  Eina_List* permission_popups_;
+  Evas_Object* eweb_view_;
+  Evas_Object* popup_;
+  Evas_Object* widget_win_;
+  Evas_Object* top_widget_;
+};
+
+#endif // PermissionPopupManager_h
diff --git a/tizen_src/ewk/efl_integration/private/ewk_user_media_private.cc b/tizen_src/ewk/efl_integration/private/ewk_user_media_private.cc
new file mode 100644 (file)
index 0000000..ecde025
--- /dev/null
@@ -0,0 +1,34 @@
+// Copyright 2015 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ewk_user_media_private.h"
+
+using content::BrowserThread;
+
+_Ewk_User_Media_Permission_Request::_Ewk_User_Media_Permission_Request(
+  content::WebContentsDelegateEfl* web_contents,
+  const content::MediaStreamRequest& media_request,
+  const content::MediaResponseCallback& callback)
+  : web_contents_(web_contents)
+  , request_(media_request)
+  , callback_(callback)
+  , origin_(new _Ewk_Security_Origin(media_request.security_origin)) {
+}
+
+void _Ewk_User_Media_Permission_Request::ProceedPermissionCallback(bool allowed) {
+  CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+  if(allowed)
+    web_contents_->RequestMediaAccessAllow(request_, callback_);
+  else
+    web_contents_->RequestMediaAccessDeny(request_, callback_);
+
+  if (suspended_) {
+    // If decision was suspended, then it was not deleted by the creator
+    // Deletion of this object must be done after decision was made, as
+    // this object will no longer be valid. But if decision was not suspended
+    // it will be deleted right after permission callbacks are executed.
+    BrowserThread::DeleteSoon(BrowserThread::UI, FROM_HERE, this);
+  }
+}
\ No newline at end of file
index 5fe504a..21ec480 100644 (file)
@@ -5,30 +5,39 @@
 #ifndef ewk_user_media_private_h
 #define ewk_user_media_private_h
 
+#include <content/public/browser/browser_thread.h>
+
 #include "base/callback.h"
 #include "content/public/common/media_stream_request.h"
+#include "private/ewk_security_origin_private.h"
+#include "public/ewk_security_origin.h"
 #include "web_contents_delegate_efl.h"
 
-#include <Evas.h>
-
-class EWebView;
+using content::BrowserThread;
 
-struct _Ewk_User_Media_Permission_Request {
+class _Ewk_User_Media_Permission_Request {
+ public:
   _Ewk_User_Media_Permission_Request(
-    EWebView* ewkView,
+    content::WebContentsDelegateEfl* web_contents,
     const content::MediaStreamRequest& media_request,
-    content::WebContentsDelegateEfl* web_contents)
-    : view(ewkView)
-    , request(media_request)
-    , web_contents(web_contents)
-    , isDecided(false)
-    , isSuspended(false) { }
-
-  EWebView* view;
-  const content::MediaStreamRequest& request;
-  content::WebContentsDelegateEfl* web_contents;
-  bool isDecided;
-  bool isSuspended;
+    const content::MediaResponseCallback& callback);
+
+  const _Ewk_Security_Origin* Origin() const { return origin_.get(); }
+  content::WebContentsDelegateEfl* WebContents() const { return web_contents_; }
+  void ProceedPermissionCallback(bool allowed);
+  void Decide(bool allowed) { decided_ = allowed; }
+  bool IsDecided() const { return decided_; }
+  void Suspend() { suspended_ = true; };
+  bool IsSuspended() const { return suspended_; }
+
+ private:
+  content::WebContentsDelegateEfl* web_contents_;
+  content::MediaStreamRequest request_;
+  content::MediaResponseCallback callback_;
+
+  scoped_ptr<_Ewk_Security_Origin> origin_;
+  bool decided_;
+  bool suspended_;
 };
 
-#endif // ewk_user_media_private_h
+#endif // ewk_user_media_private_h
\ No newline at end of file
index 76bf0bb..a5ec92a 100644 (file)
@@ -2,24 +2,40 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "private/ewk_security_origin_private.h"
+#include "private/ewk_user_media_private.h"
+#include "public/ewk_security_origin.h"
 
 #include "ewk_user_media.h"
 
-#include "private/ewk_user_media_private.h"
+Eina_Bool ewk_user_media_permission_request_suspend(
+    Ewk_User_Media_Permission_Request* request) {
+  EINA_SAFETY_ON_NULL_RETURN_VAL(request, false);
+  request->Suspend();
+  return true;
+}
+
+void ewk_user_media_permission_request_set(
+    Ewk_User_Media_Permission_Request* request, Eina_Bool allowed) {
+#if defined(TIZEN_MULTIMEDIA_SUPPORT)
+  if(request && request->WebContents())
+    request->ProceedPermissionCallback(allowed == EINA_TRUE);
+#endif
+}
 
-Eina_Bool ewk_user_media_permission_request_suspend(Ewk_User_Media_Permission_Request* permissionRequest)
-{
-    EINA_SAFETY_ON_NULL_RETURN_VAL(permissionRequest, false);
-    permissionRequest->isSuspended = true;
-    return true;
+void ewk_user_media_permission_reply(
+    Ewk_User_Media_Permission_Request* request, Eina_Bool allowed) {
+#if defined(TIZEN_MULTIMEDIA_SUPPORT)
+  if(request && request->WebContents())
+    request->ProceedPermissionCallback(allowed == EINA_TRUE);
+#endif
 }
 
-void ewk_user_media_permission_request_set(Ewk_User_Media_Permission_Request *request, Eina_Bool allowed)
-{
+const Ewk_Security_Origin* ewk_user_media_permission_request_origin_get(
+    const Ewk_User_Media_Permission_Request* request) {
 #if defined(TIZEN_MULTIMEDIA_SUPPORT)
-  if(request && request->web_contents){
-    request->web_contents->OnAccessRequestResponse(allowed);
-    delete request;
-  }
+  EINA_SAFETY_ON_NULL_RETURN_VAL(request, 0);
+
+  return static_cast<const Ewk_Security_Origin*>(request->Origin());
 #endif
 }
index 60bb712..cd5b939 100644 (file)
@@ -6,13 +6,16 @@
 #define ewk_user_media_h
 
 #include <Eina.h>
+
 #include "ewk_export.h"
+#include "ewk_security_origin.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-typedef struct _Ewk_User_Media_Permission_Request Ewk_User_Media_Permission_Request;
+typedef struct _Ewk_User_Media_Permission_Request
+  Ewk_User_Media_Permission_Request;
 
 /**
  * Sets the permission to access local media
@@ -20,7 +23,8 @@ typedef struct _Ewk_User_Media_Permission_Request Ewk_User_Media_Permission_Requ
  * @param request Ewk_View_User_Media_Permission_Request object for userMedia permission
  * @param allowed decided permission value from user
  */
-EAPI void ewk_user_media_permission_request_set(Ewk_User_Media_Permission_Request *request, Eina_Bool allowed);
+EAPI void ewk_user_media_permission_request_set(
+    Ewk_User_Media_Permission_Request* request, Eina_Bool allowed);
 
 /**
  * Suspend the operation for user media permission
@@ -29,7 +33,29 @@ EAPI void ewk_user_media_permission_request_set(Ewk_User_Media_Permission_Reques
  *
  * @return @c EINA_TRUE on success or @c EINA_FALSE on failure
  */
-EAPI Eina_Bool ewk_user_media_permission_request_suspend(Ewk_User_Media_Permission_Request *request);
+EAPI Eina_Bool ewk_user_media_permission_request_suspend(
+    Ewk_User_Media_Permission_Request* request);
+
+/**
+ * Requests for getting origin of media permission request.
+ *
+ * @param request Ewk_User_Media_Permission_Request object to get origin for
+ *  userMedia permission request
+ *
+ * @return security origin of userMedia permission request
+ */
+EAPI const Ewk_Security_Origin *ewk_user_media_permission_request_origin_get(
+    const Ewk_User_Media_Permission_Request* request);
+
+/**
+ * Reply the result about user media permission.
+ *
+ * @param request Ewk_User_Media_Permission_Request object to get the information
+ *  about user media permission request
+ * @param allow result about user media permission
+ */
+EAPI void ewk_user_media_permission_reply(
+    Ewk_User_Media_Permission_Request* request, Eina_Bool allowed);
 
 #ifdef __cplusplus
 }
index d9aae34..ce0de36 100644 (file)
@@ -33,6 +33,7 @@
 #endif
 #include "eweb_view.h"
 #include "cookie_manager.h"
+#include "usermedia_permission_popup.h"
 #include "public/ewk_back_forward_list.h"
 #include "public/ewk_context.h"
 #include "public/ewk_enums.h"
@@ -49,6 +50,9 @@
 #include "third_party/WebKit/public/web/WebViewModeEnums.h"
 #include "web_contents_delegate_efl.h"
 
+static Eina_Bool _ewk_view_default_user_media_permission(
+    Evas_Object*, Ewk_User_Media_Permission_Request*, void*);
+
 Eina_Bool ewk_view_smart_class_set(Ewk_View_Smart_Class* api)
 {
   EINA_SAFETY_ON_NULL_RETURN_VAL(api, false);
@@ -79,7 +83,13 @@ Evas_Object* ewk_view_add_with_session_data(Evas* canvas, const char* data, unsi
 Evas_Object* ewk_view_add_with_context(Evas* e, Ewk_Context* context)
 {
   EINA_SAFETY_ON_NULL_RETURN_VAL(context, 0);
-  return CreateWebViewAsEvasObject(context, e);
+  Evas_Object* ewk_view = CreateWebViewAsEvasObject(context, e);
+
+  if (ewk_view)
+    ewk_view_user_media_permission_callback_set(ewk_view,
+        _ewk_view_default_user_media_permission, 0);
+
+  return ewk_view;
 }
 
 Evas_Object* ewk_view_add(Evas* e)
@@ -891,6 +901,52 @@ void ewk_view_geolocation_permission_callback_set(Evas_Object* ewk_view, Ewk_Vie
   impl->SetViewGeolocationPermissionCallback(callback, user_data);
 }
 
+void ewk_view_user_media_permission_callback_set(Evas_Object* ewk_view,
+    Ewk_View_User_Media_Permission_Callback callback,
+    void* user_data)
+{
+  EWK_VIEW_IMPL_GET_OR_RETURN(ewk_view, impl);
+  impl->SetViewUserMediaPermissionCallback(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,
+    void* user_data)
+{
+  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(), "");
+
+  // add for suspending
+  ewk_user_media_permission_request_suspend(user_media_permission_request);
+
+  UserMediaPermissionPopup* popup = new UserMediaPermissionPopup(
+      user_media_permission_request,
+      ewk_user_media_permission_request_origin_get(
+          user_media_permission_request), message);
+
+  impl->GetPermissionPopupManager()->AddPermissionRequest(popup);
+
+  return EINA_TRUE;
+}
+
 void ewk_view_use_settings_font(Evas_Object* ewkView)
 {
   EWK_VIEW_IMPL_GET_OR_RETURN(ewkView, impl);
index 215df32..62a77b0 100644 (file)
 #ifndef ewk_view_h
 #define ewk_view_h
 
-//#include "ewk_back_forward_list.h"
+#include "ewk_back_forward_list.h"
 #include "ewk_context.h"
-//#include "ewk_download_job.h"
-//#include "ewk_error.h"
-//#include "ewk_intent.h"
-//#include "ewk_resource.h"
-#include "ewk_settings.h"
-#include "ewk_touch.h"
-//#include "ewk_url_request.h"
-//#include "ewk_url_response.h"
-#include <Evas.h>
-
-//#include "ewk_frame.h"
-#include "ewk_history.h"
-
-//#if ENABLE(TIZEN_WEBKIT2_HIT_TEST)
+#include "ewk_enums.h"
 #include "ewk_export.h"
 #include "ewk_frame.h"
+#include "ewk_geolocation.h"
+#include "ewk_history.h"
 #include "ewk_hit_test.h"
-#include "ewk_enums.h"
-
-#include "ewk_back_forward_list.h"
-#include "ewk_security_origin.h"
-//#include "ewk_web_application_icon_data.h"
 #include "ewk_intercept_request.h"
+#include "ewk_notification.h"
 #include "ewk_page_group.h"
-#include "ewk_window_features.h"
 #include "ewk_quota_permission_request.h"
-#include "ewk_geolocation.h"
-#include "ewk_notification.h"
+#include "ewk_security_origin.h"
+#include "ewk_settings.h"
+#include "ewk_touch.h"
+#include "ewk_user_media.h"
+#include "ewk_window_features.h"
+
+#include <Evas.h>
+#include <string.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -722,6 +712,15 @@ EAPI void ewk_view_unfocus_allow_callback_set (Evas_Object *o, Ewk_View_Unfocus_
 typedef Eina_Bool (*Ewk_View_Geolocation_Permission_Callback)(Evas_Object* ewk_view, Ewk_Geolocation_Permission_Request* geolocation_permission_request, void* user_data);
 EAPI void ewk_view_geolocation_permission_callback_set(Evas_Object* ewk_view, Ewk_View_Geolocation_Permission_Callback callback, void* user_data);
 
+typedef Eina_Bool (*Ewk_View_User_Media_Permission_Callback)(
+    Evas_Object* ewk_view,
+    Ewk_User_Media_Permission_Request* user_media_permission_request,
+    void* user_data);
+EAPI void ewk_view_user_media_permission_callback_set(
+    Evas_Object* ewk_view,
+    Ewk_View_User_Media_Permission_Callback callback,
+    void* user_data);
+
 EAPI Eina_Bool ewk_view_mode_set(Evas_Object* ewkView, Ewk_View_Mode view_mode);
 
 /**
diff --git a/tizen_src/ewk/efl_integration/usermedia_permission_popup.cc b/tizen_src/ewk/efl_integration/usermedia_permission_popup.cc
new file mode 100644 (file)
index 0000000..a02cec2
--- /dev/null
@@ -0,0 +1,18 @@
+// Copyright 2015 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "usermedia_permission_popup.h"
+
+UserMediaPermissionPopup::UserMediaPermissionPopup(
+    Ewk_User_Media_Permission_Request* request,
+    const Ewk_Security_Origin* origin,
+    const std::string& message)
+  : PermissionPopup(origin, message),
+    request_(request) {
+}
+
+void UserMediaPermissionPopup::SendDecidedPermission(
+    Evas_Object* ewk_view, bool decide) {
+  ewk_user_media_permission_reply(request_, decide);
+}
\ No newline at end of file
diff --git a/tizen_src/ewk/efl_integration/usermedia_permission_popup.h b/tizen_src/ewk/efl_integration/usermedia_permission_popup.h
new file mode 100644 (file)
index 0000000..b0bf03f
--- /dev/null
@@ -0,0 +1,24 @@
+// Copyright 2015 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UserMediaPermissionPopup_h
+#define UserMediaPermissionPopup_h
+
+#include <string.h>
+
+#include "private/ewk_user_media_private.h"
+#include "permission_popup.h"
+
+class UserMediaPermissionPopup : public PermissionPopup {
+ public:
+  UserMediaPermissionPopup(Ewk_User_Media_Permission_Request* request,
+    const Ewk_Security_Origin* origin, const std::string& message);
+
+  virtual void SendDecidedPermission(Evas_Object* ewk_view, bool decide);
+
+ private:
+  Ewk_User_Media_Permission_Request* request_;
+};
+
+#endif // UserMediaPermissionPopup_h
\ No newline at end of file
index df7aefc..29892a7 100644 (file)
@@ -68,7 +68,7 @@ void WritePdfDataToFile(printing::PdfMetafileSkia* metafile, const base::FilePat
 
 #if defined(OS_TIZEN)
 static const content::MediaStreamDevice*
-  GetRequestedVideoDevice(std::string& device_id) {
+  GetRequestedVideoDevice(const std::string& device_id) {
   const content::MediaStreamDevices& video_devices =
       MediaCaptureDevices::GetInstance()->GetVideoCaptureDevices();
   if (video_devices.empty())
@@ -210,58 +210,42 @@ void WebContentsDelegateEfl::RegisterProtocolHandler(WebContents* web_contents,
 }
 
 #if defined(TIZEN_MULTIMEDIA_SUPPORT)
-WebContentsDelegateEfl::PendingAccessRequest::PendingAccessRequest(
-  const content::MediaStreamRequest& request,
-  const content::MediaResponseCallback& callback)
-  : request(request)
-  , callback(callback) {
-}
-
-WebContentsDelegateEfl::PendingAccessRequest::~PendingAccessRequest() {
-}
+void WebContentsDelegateEfl::RequestMediaAccessAllow(
+    const MediaStreamRequest& request,
+    const MediaResponseCallback& callback) {
 
-void WebContentsDelegateEfl::OnAccessRequestResponse(bool allowed) {
   MediaStreamDevices devices;
-  if (requests_queue_.empty()) {
-    LOG(ERROR) << __FUNCTION__ << " Empty Queue ";
-    return;
-  }
-  PendingAccessRequest pending_request = requests_queue_.front();
-  if (pending_request.callback.is_null()) {
-    requests_queue_.pop_front();
-    LOG(ERROR) << __FUNCTION__ << " Invalid Callback ";
-    return;
+
+  if (request.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE) {
+    devices.push_back(MediaStreamDevice(request.audio_type,
+        "default", "Default"));
   }
-  if (allowed) {
-    if (pending_request.request.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE) {
-      devices.push_back(MediaStreamDevice(pending_request.request.audio_type,
-                                          "default", "Default"));
-    }
-    if (pending_request.request.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE) {
+
+  if (request.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE) {
 #if defined(OS_TIZEN)
-      const content::MediaStreamDevice* video_device =
-          GetRequestedVideoDevice(pending_request.request.requested_video_device_id);
-      if (video_device) {
-        devices.push_back(*video_device);
-      } else {
-        LOG(ERROR) << "Error in device request, declining request";
-        pending_request.callback.Run(MediaStreamDevices(),
-                                     MEDIA_DEVICE_NOT_SUPPORTED,
-                                     scoped_ptr<MediaStreamUI>());
-      }
+    const content::MediaStreamDevice* video_device =
+        GetRequestedVideoDevice(request.requested_video_device_id);
+    if (video_device) {
+      devices.push_back(*video_device);
+    }
+    else {
+      callback.Run(MediaStreamDevices(), MEDIA_DEVICE_NOT_SUPPORTED,
+          scoped_ptr<MediaStreamUI>());
+    }
 #else
-      devices.push_back(MediaStreamDevice(pending_request.request.video_type,
-                                          "/dev/video0", "1"));
+    devices.push_back(MediaStreamDevice(request.video_type, "/dev/video0", "1"));
 #endif
-    }
-    pending_request.callback.Run(devices, MEDIA_DEVICE_OK,scoped_ptr<MediaStreamUI>());
-  } else {
-    LOG(ERROR) << __FUNCTION__ << " Decline request with empty list";
-    pending_request.callback.Run(MediaStreamDevices(),
-                                 MEDIA_DEVICE_NOT_SUPPORTED,
-                                 scoped_ptr<MediaStreamUI>());
   }
-  requests_queue_.pop_front();
+
+  callback.Run(devices, MEDIA_DEVICE_OK,scoped_ptr<MediaStreamUI>());
+}
+
+void WebContentsDelegateEfl::RequestMediaAccessDeny(
+    const MediaStreamRequest& request,
+    const MediaResponseCallback& callback) {
+  LOG(ERROR) << __FUNCTION__ << " Decline request with empty list";
+  callback.Run(MediaStreamDevices(), MEDIA_DEVICE_NOT_SUPPORTED,
+      scoped_ptr<MediaStreamUI>());
 }
 
 bool WebContentsDelegateEfl::CheckMediaAccessPermission(
@@ -275,12 +259,22 @@ void WebContentsDelegateEfl::RequestMediaAccessPermission(
         WebContents* web_contents,
         const MediaStreamRequest& request,
         const MediaResponseCallback& callback) {
-  //send callback to application to request for user permission.
-  _Ewk_User_Media_Permission_Request* media_permission_request =
-    new _Ewk_User_Media_Permission_Request(web_view_, request,this);
-  requests_queue_.push_back(PendingAccessRequest(request, callback));
-  web_view_->SmartCallback<EWebViewCallbacks::UserMediaPermission>().call(
-    media_permission_request);
+  scoped_ptr<_Ewk_User_Media_Permission_Request> media_permission_request(
+      new _Ewk_User_Media_Permission_Request(this, request, callback));
+
+  Eina_Bool callback_result = EINA_FALSE;
+  if (!web_view_->InvokeViewUserMediaPermissionCallback(
+        media_permission_request.get(), &callback_result)) {
+      web_view_->SmartCallback<EWebViewCallbacks::UserMediaPermission>()
+        .call(media_permission_request.get());
+  }
+
+  if (media_permission_request->IsSuspended())
+    media_permission_request.release();
+  else if (!media_permission_request->IsDecided()) {
+    callback.Run(MediaStreamDevices(), MEDIA_DEVICE_NOT_SUPPORTED,
+        scoped_ptr<MediaStreamUI>());
+  }
 }
 #endif
 
index 4638d31..5a0a3f4 100644 (file)
@@ -74,7 +74,11 @@ class WebContentsDelegateEfl
       const MediaStreamRequest& request,
       const MediaResponseCallback& callback) override;
 
-  void OnAccessRequestResponse(bool allowed);
+  void RequestMediaAccessAllow(const MediaStreamRequest& request,
+    const MediaResponseCallback& callback);
+
+  void RequestMediaAccessDeny(const MediaStreamRequest& request,
+    const MediaResponseCallback& callback);
 #endif
   void RegisterProtocolHandler(WebContents* web_contents,
                                const std::string& protocol,
@@ -174,20 +178,6 @@ class WebContentsDelegateEfl
     Ewk_CSP_Header_Type header_type;
   };
 
-#if defined(TIZEN_MULTIMEDIA_SUPPORT)
-  // Structure to hold media request and its callback.
-  struct PendingAccessRequest {
-    PendingAccessRequest(const content::MediaStreamRequest& request,
-                         const content::MediaResponseCallback& callback);
-    ~PendingAccessRequest();
-    content::MediaStreamRequest request;
-    content::MediaResponseCallback callback;
-  };
-
-  //Queue to hold all pending request for requesting user permissions.
-  std::deque<PendingAccessRequest> requests_queue_;
-#endif
-
   scoped_ptr<ContentSecurityPolicy> pending_content_security_policy_;
   bool document_created_;
   JavaScriptDialogManagerEfl* dialog_manager_;
index 7e4eb5c..4ce02a3 100755 (executable)
@@ -181,3 +181,8 @@ msgstr "ترجمة"
 msgid "IDS_WEBVIEW_OPT_UNMUTE"
 msgstr "إلغاء كتم الصوت"
 
+msgid "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA"
+msgstr "يوجد طلب من %1$s (%2$s) للحصول على إذن من أجل استخدام الكاميرا"
+
+msgid "IDS_WEBVIEW_HEADER_MESSAGE_FROM_PS_M_WEBSITE"
+msgstr "رسالة من %s"
\ No newline at end of file
index 7cfbe70..494c60b 100644 (file)
@@ -264,3 +264,6 @@ msgstr "সময় নির্ধারণ করুন."
 
 msgid "IDS_WEBVIEW_HEADER_SET_WEEK"
 msgstr "সপ্তাহ সেট করুন."
+
+msgid "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA"
+msgstr "%1$s (%2$s) আপনার ক্যামেরা ব্যবহারের জন্য অনুমতি অনুরোধ করছে।"
\ No newline at end of file
index 6825d1a..0dacd30 100644 (file)
@@ -270,3 +270,6 @@ msgstr "JavaScript"
 
 msgid "IDS_WEBVIEW_POP_JAVASCRIPT_ALERT"
 msgstr "JavaScript Alert"
+
+msgid "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA"
+msgstr "%1$s (%2$s) is requesting permission to use your camera."
\ No newline at end of file
index 5bde720..873fe69 100755 (executable)
@@ -181,3 +181,8 @@ msgstr "Translate"
 msgid "IDS_WEBVIEW_OPT_UNMUTE"
 msgstr "Unmute"
 
+msgid "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA"
+msgstr "%1$s (%2$s) is requesting permission to use your camera."
+
+msgid "IDS_WEBVIEW_HEADER_MESSAGE_FROM_PS_M_WEBSITE"
+msgstr "Message from %s"
\ No newline at end of file
index 2171ac9..31827cc 100755 (executable)
@@ -201,3 +201,9 @@ msgstr "Links"
 
 msgid "COM_TV_SID_AUDIO"
 msgstr "Audio"
+
+msgid "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA"
+msgstr "%1$s (%2$s) is requesting permission to use your camera."
+
+msgid "IDS_WEBVIEW_HEADER_MESSAGE_FROM_PS_M_WEBSITE"
+msgstr "Message from %s"
\ No newline at end of file
index 8888a23..48582e9 100755 (executable)
@@ -181,3 +181,8 @@ msgstr "Traduire"
 msgid "IDS_WEBVIEW_OPT_UNMUTE"
 msgstr "Activer le son"
 
+msgid "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA"
+msgstr "%1$s (%2$s) demande l'autorisation d'utiliser votre appareil photo."
+
+msgid "IDS_WEBVIEW_HEADER_MESSAGE_FROM_PS_M_WEBSITE"
+msgstr "Message de %s"
\ No newline at end of file
index d6c53f9..777736d 100644 (file)
@@ -264,3 +264,6 @@ msgstr "સમય સેટ કરો."
 
 msgid "IDS_WEBVIEW_HEADER_SET_WEEK"
 msgstr "અઠવાડિયું સુયોજિત કરો."
+
+msgid "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA"
+msgstr "%1$s (%2$s) તમારા સ્થાનનો ઉપયોગ કરવાની પરવાનગીની વિનંતી કરી રહ્યાં છે."
\ No newline at end of file
index 0aa63c2..35ca617 100644 (file)
@@ -264,3 +264,6 @@ msgstr "निर्धारित समय।"
 
 msgid "IDS_WEBVIEW_HEADER_SET_WEEK"
 msgstr "सप्ताह निर्धारित करें।"
+
+msgid "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA"
+msgstr "%1$s (%2$s) आपके कैमरा उपयोग करने की अनुमति का अनुरोध कर रहा है"
\ No newline at end of file
index d7e8621..8713225 100644 (file)
@@ -264,3 +264,6 @@ msgstr "ಟೈಮ್ ಹೊಂದಿಸಿ."
 
 msgid "IDS_WEBVIEW_HEADER_SET_WEEK"
 msgstr "ವಾರ."
+
+msgid "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA"
+msgstr "ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಬಳಸಲು ಅನುಮತಿಯನ್ನು %1$s (%2$s) ವಿನಂತಿಸುತ್ತಿದೆ."
\ No newline at end of file
index 5ce72e1..36aeed1 100644 (file)
@@ -271,3 +271,5 @@ msgstr "자바 스크립트"
 msgid "IDS_WEBVIEW_POP_JAVASCRIPT_ALERT"
 msgstr "자바 스크립트 경고"
 
+msgid "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA"
+msgstr "%1$s(%2$s)에서 카메라 사용 권한을 요청합니다."
\ No newline at end of file
index 9a0ed35..3ebc0b7 100644 (file)
@@ -264,3 +264,6 @@ msgstr "സമയം സജ്ജമാക്കുക."
 
 msgid "IDS_WEBVIEW_HEADER_SET_WEEK"
 msgstr "ആഴ്ചത്തെ സജ്ജമാക്കുക."
+
+msgid "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA"
+msgstr "നിങ്ങളുടെ ക്യാമറ ആക്സസ്സ് ചെയ്യുന്നതിനുള്ള അനുമതി %1$s (%2$s) അഭ്യര്‍ത്ഥിക്കുന്നു."
\ No newline at end of file
index 386d127..4de3735 100755 (executable)
@@ -181,3 +181,8 @@ msgstr "Traduzir"
 msgid "IDS_WEBVIEW_OPT_UNMUTE"
 msgstr "Com som"
 
+msgid "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA"
+msgstr "%1$s (%2$s) está solicitando permissão para usar a câmera."
+
+msgid "IDS_WEBVIEW_HEADER_MESSAGE_FROM_PS_M_WEBSITE"
+msgstr "Mensagem de %s"
\ No newline at end of file
index 6bda167..80f0061 100755 (executable)
@@ -181,3 +181,8 @@ msgstr "Traduzir"
 msgid "IDS_WEBVIEW_OPT_UNMUTE"
 msgstr "Activar som"
 
+msgid "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA"
+msgstr "%1$s (%2$s) está pedindo permissão para utilizar a sua câmera."
+
+msgid "IDS_WEBVIEW_HEADER_MESSAGE_FROM_PS_M_WEBSITE"
+msgstr "Mensagem de %s"
\ No newline at end of file
index fe05e9f..816d31e 100644 (file)
@@ -264,3 +264,6 @@ msgstr "වේලාව සකසන්න."
 
 msgid "IDS_WEBVIEW_HEADER_SET_WEEK"
 msgstr "සතිය සකසන්න."
+
+msgid "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA"
+msgstr "%1$s (%2$s) ඔබගේ කැමරාව භාවිතා කිරීමට අවසරය ඉල්ලමින් සිටී."
\ No newline at end of file
index cb9bae6..bde0cc6 100644 (file)
@@ -264,3 +264,6 @@ msgstr "நேரம் அமைக்கவும்."
 
 msgid "IDS_WEBVIEW_HEADER_SET_WEEK"
 msgstr "வாரம் அமைந்தது."
+
+msgid "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA"
+msgstr "%1$s (%2$s) உங்கள் கேமராவை உபயோகிக்க அனுமதி கோருகிறது."
\ No newline at end of file
index f5b8d56..5d91e0f 100644 (file)
@@ -264,3 +264,6 @@ msgstr "సమయం కేటాయించారు."
 
 msgid "IDS_WEBVIEW_HEADER_SET_WEEK"
 msgstr "వారం సెట్."
+
+msgid "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA"
+msgstr "%1$s (%2$s) మీ కెమెరాని ఉపయోగించడానికి అనుమతిని అభ్యర్థిస్తోంది."
\ No newline at end of file
index dab467a..3ea5b19 100755 (executable)
@@ -181,3 +181,8 @@ msgstr "Çevir"
 msgid "IDS_WEBVIEW_OPT_UNMUTE"
 msgstr "Sesli"
 
+msgid "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA"
+msgstr "%1$s (%2$s) kameranızı kullanmak için izin istiyor"
+
+msgid "IDS_WEBVIEW_HEADER_MESSAGE_FROM_PS_M_WEBSITE"
+msgstr "%s mesajı"
\ No newline at end of file
index b1be49d..23e3394 100644 (file)
@@ -264,3 +264,6 @@ msgstr "وقت مقرر."
 
 msgid "IDS_WEBVIEW_HEADER_SET_WEEK"
 msgstr "ہفتہ مقرر کریں."
+
+msgid "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA"
+msgstr "%1$s (%2$s) آپ کا کیمرہ استعمال کرنے کی اجازت کی درخواست کررہا ہے"
\ No newline at end of file
index 4f8ca36..94d9218 100755 (executable)
@@ -181,3 +181,8 @@ msgstr "翻译"
 msgid "IDS_WEBVIEW_OPT_UNMUTE"
 msgstr "取消静音"
 
+msgid "IDS_WEBVIEW_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA"
+msgstr "%1$s (%2$s) 正在请求许可使用您的相机。"
+
+msgid "IDS_WEBVIEW_HEADER_MESSAGE_FROM_PS_M_WEBSITE"
+msgstr "来自 %s 的信息"
\ No newline at end of file