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>
#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{
'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',
#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"
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)
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();
// make sure they are released in correct order
web_contents_.reset();
web_contents_delegate_.reset();
+
+ GetPermissionPopupManager()->DeleteAllPermissionRequest();
+ permission_popup_manager_.reset();
}
void EWebView::ReleasePopupMenuList() {
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));
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_);
}
#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;
class WebViewAsyncRequestHitTestDataCallback;
class JavaScriptDialogManagerEfl;
class WebViewGeolocationPermissionCallback;
+class WebViewUserMediaPermissionCallback;
class WebViewUnfocusAllowCallback;
+class PermissionPopupManager;
class EWebView {
public:
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
{
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);
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)
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;
--- /dev/null
+// 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
--- /dev/null
+// 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
--- /dev/null
+// 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
--- /dev/null
+// 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
#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
// 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
}
#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
* @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
*
* @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
}
#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"
#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);
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)
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);
#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" {
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);
/**
--- /dev/null
+// 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
--- /dev/null
+// 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
#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())
}
#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(
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
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,
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_;
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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