"http://tizen.org/privilege/location";
const char* kStoragePrivilege =
"http://tizen.org/privilege/unlimitedstorage";
+const char* kUsermediaPrivilege =
+ "http://tizen.org/privilege/mediacapture";
const char* kNotiIconFile = "noti_icon.png";
const char* kVisibilitySuspendFeature = "visibility,suspend";
const char* kNotificationPermissionPrefix = "__WRT_NOTIPERM_";
const char* kQuotaPermissionPrefix = "__WRT_QUOTAPERM_";
const char* kCertificateAllowPrefix = "__WRT_CERTIPERM_";
+const char* kUsermediaPermissionPrefix = "__WRT_USERMEDIAPERM_";
const char* kDBPrivateSection = "private";
const char* kDefaultCSPRule =
popup->Show();
}
+void WebApplication::OnUsermediaPermissionRequest(
+ WebView*,
+ const std::string& url,
+ std::function<void(bool)> result_handler) {
+ auto db = common::AppDB::GetInstance();
+ std::string reminder = db->Get(kDBPrivateSection,
+ kUsermediaPermissionPrefix + url);
+ if (reminder == "allowed") {
+ result_handler(true);
+ return;
+ } else if (reminder == "denied") {
+ result_handler(false);
+ return;
+ }
+
+ // Local Domain: Grant permission if defined, otherwise block execution.
+ // Remote Domain: Popup user prompt if defined, otherwise block execution.
+ if (!FindPrivilege(app_data_.get(), kUsermediaPrivilege)) {
+ result_handler(false);
+ return;
+ }
+
+ if (common::utils::StartsWith(url, "file://")) {
+ result_handler(true);
+ return;
+ }
+
+ Popup* popup = Popup::CreatePopup(window_);
+ popup->SetButtonType(Popup::ButtonType::AllowDenyButton);
+ popup->SetTitle(popup_string::kPopupTitleUserMedia);
+ popup->SetBody(popup_string::kPopupBodyUserMedia);
+ popup->SetCheckBox(popup_string::kPopupCheckRememberPreference);
+ popup->SetResultHandler(
+ [db, result_handler, url](Popup* popup, void* /*user_data*/) {
+ bool result = popup->GetButtonResult();
+ bool remember = popup->GetCheckBoxResult();
+ if (remember) {
+ db->Set(kDBPrivateSection, kUsermediaPermissionPrefix + url,
+ result ? "allowed" : "denied");
+ }
+ result_handler(result);
+ }, this);
+ popup->Show();
+}
+
} // namespace runtime
const std::string& url,
const std::string& pem,
std::function<void(bool allow)> result_handler);
+ virtual void OnUsermediaPermissionRequest(
+ WebView* view,
+ const std::string& url,
+ std::function<void(bool)> result_handler);
private:
bool Initialize();
std::function<void(bool allow)> result_handler) {
result_handler(false);
}
+ virtual void OnUsermediaPermissionRequest(
+ WebView* /*view*/,
+ const std::string& /*url*/,
+ std::function<void(bool)> /*result_handler*/) {}
};
WebView(NativeWindow* window, Ewk_Context* context);
InitAuthenticationCallback();
InitCertificateAllowCallback();
InitPopupWaitCallback();
+ InitUsermediaCallback();
Ewk_Settings* settings = ewk_view_settings_get(ewk_view_);
ewk_settings_scripts_can_open_windows_set(settings, EINA_TRUE);
// TODO(sngn.lee): "protocolhandler,registration,requested"
// custom protocol handler
- // TODO(sngn.lee): ewk_view_user_media_permission_callback_set
// Show webview
evas_object_show(ewk_view_);
ewk_view_,
NULL,
NULL);
+ ewk_view_user_media_permission_callback_set(
+ ewk_view_,
+ NULL,
+ NULL);
window_->RemoveRotationHandler(rotation_handler_id_);
}
}, this);
}
+void WebViewImpl::InitUsermediaCallback() {
+ auto callback = [](Evas_Object*,
+ Ewk_User_Media_Permission_Request* request,
+ void* user_data) {
+ WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
+ if (self == NULL || self->listener_ == NULL) {
+ ewk_user_media_permission_reply(request, EINA_FALSE);
+ return EINA_TRUE;
+ }
+
+ ewk_user_media_permission_request_suspend(request);
+ const Ewk_Security_Origin* origin =
+ ewk_user_media_permission_request_origin_get(request);
+ std::stringstream url;
+ url << ewk_security_origin_protocol_get(origin)
+ << "://"
+ << ewk_security_origin_host_get(origin)
+ << ":"
+ << ewk_security_origin_port_get(origin);
+
+ auto result_handler = [request](bool result) {
+ LOGGER(DEBUG) << "Getusermedia Permission Result : " << result;
+ ewk_user_media_permission_reply(request, result);
+ };
+ std::string test = url.str();
+ self->listener_->OnUsermediaPermissionRequest(self->view_,
+ url.str(),
+ result_handler);
+ return EINA_TRUE;
+ };
+ ewk_view_user_media_permission_callback_set(ewk_view_, callback, this);
+}
+
std::string WebViewImpl::GetUrl() {
return std::string(ewk_view_url_get(ewk_view_));
}
void InitAuthenticationCallback();
void InitCertificateAllowCallback();
void InitPopupWaitCallback();
+ void InitUsermediaCallback();
NativeWindow* window_;
Ewk_Context* context_;