blob: 41cf589dde142d84d4aadc561ad9e0b2c3e62e36 [file] [log] [blame]
/*
* Copyright (C) 2020 Igalia S.L.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2,1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "config.h"
#include "WebKitWebsitePolicies.h"
#include "APIWebsitePolicies.h"
#include "WebKitEnumTypes.h"
#include "WebsitePoliciesData.h"
#include <glib/gi18n-lib.h>
#include <wtf/glib/WTFGType.h>
using namespace WebKit;
/**
* SECTION: WebKitWebsitePolicies
* @Short_description: View specific website policies
* @Title: WebKitWebsitePolicies
* @See_also: #WebKitWebView
*
* WebKitWebsitePolicies allows you to configure per-page policies,
* currently only autoplay policies are supported.
*
* Since: 2.30
*/
using namespace WebKit;
enum {
PROP_0,
PROP_AUTOPLAY_POLICY
};
struct _WebKitWebsitePoliciesPrivate {
_WebKitWebsitePoliciesPrivate()
: websitePolicies(API::WebsitePolicies::create())
{
}
RefPtr<API::WebsitePolicies> websitePolicies;
};
WEBKIT_DEFINE_TYPE(WebKitWebsitePolicies, webkit_website_policies, G_TYPE_OBJECT)
API::WebsitePolicies& webkitWebsitePoliciesGetWebsitePolicies(WebKitWebsitePolicies* policies)
{
return *policies->priv->websitePolicies.get();
}
WebsitePoliciesData webkitWebsitePoliciesGetPoliciesData(WebKitWebsitePolicies* policies)
{
WebsitePoliciesData policiesData;
switch (webkit_website_policies_get_autoplay_policy(policies)) {
case WEBKIT_AUTOPLAY_ALLOW:
policiesData.autoplayPolicy = WebsiteAutoplayPolicy::Allow;
break;
case WEBKIT_AUTOPLAY_ALLOW_WITHOUT_SOUND:
policiesData.autoplayPolicy = WebsiteAutoplayPolicy::AllowWithoutSound;
break;
case WEBKIT_AUTOPLAY_DENY:
policiesData.autoplayPolicy = WebsiteAutoplayPolicy::Deny;
break;
default:
policiesData.autoplayPolicy = WebsiteAutoplayPolicy::Default;
}
return policiesData;
}
static void webkitWebsitePoliciesGetProperty(GObject* object, guint propID, GValue* value, GParamSpec* paramSpec)
{
WebKitWebsitePolicies* policies = WEBKIT_WEBSITE_POLICIES(object);
switch (propID) {
case PROP_AUTOPLAY_POLICY:
g_value_set_enum(value, webkit_website_policies_get_autoplay_policy(policies));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propID, paramSpec);
}
}
void webkitWebsitePoliciesSetAutoplayPolicy(WebKitWebsitePolicies* policies, WebKitAutoplayPolicy policy)
{
g_return_if_fail(WEBKIT_IS_WEBSITE_POLICIES(policies));
switch (policy) {
case WEBKIT_AUTOPLAY_ALLOW:
policies->priv->websitePolicies->setAutoplayPolicy(WebsiteAutoplayPolicy::Allow);
break;
case WEBKIT_AUTOPLAY_ALLOW_WITHOUT_SOUND:
policies->priv->websitePolicies->setAutoplayPolicy(WebsiteAutoplayPolicy::AllowWithoutSound);
break;
case WEBKIT_AUTOPLAY_DENY:
policies->priv->websitePolicies->setAutoplayPolicy(WebsiteAutoplayPolicy::Deny);
break;
}
}
static void webkitWebsitePoliciesSetProperty(GObject* object, guint propID, const GValue* value, GParamSpec* paramSpec)
{
WebKitWebsitePolicies* policies = WEBKIT_WEBSITE_POLICIES(object);
switch (propID) {
case PROP_AUTOPLAY_POLICY:
webkitWebsitePoliciesSetAutoplayPolicy(policies, static_cast<WebKitAutoplayPolicy>(g_value_get_enum(value)));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propID, paramSpec);
}
}
static void webkit_website_policies_class_init(WebKitWebsitePoliciesClass* findClass)
{
GObjectClass* gObjectClass = G_OBJECT_CLASS(findClass);
gObjectClass->get_property = webkitWebsitePoliciesGetProperty;
gObjectClass->set_property = webkitWebsitePoliciesSetProperty;
/**
* WebKitWebsitePolicies:autoplay:
*
* The #WebKitAutoplayPolicy of #WebKitWebsitePolicies.
*
* Since: 2.30
*/
g_object_class_install_property(
gObjectClass,
PROP_AUTOPLAY_POLICY,
g_param_spec_enum(
"autoplay",
"Autoplay Policy",
_("The policy to use when deciding to autoplay media"),
WEBKIT_TYPE_AUTOPLAY_POLICY,
WEBKIT_AUTOPLAY_ALLOW_WITHOUT_SOUND,
static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
}
/**
* webkit_website_policies_new:
*
* Create a new #WebKitWebsitePolicies
*
* Returns: (transfer full): the newly created #WebKitWebsitePolicies
*
* Since: 2.30
*/
WebKitWebsitePolicies* webkit_website_policies_new(void)
{
return WEBKIT_WEBSITE_POLICIES(g_object_new(WEBKIT_TYPE_WEBSITE_POLICIES, nullptr));
}
/**
* webkit_website_policies_new_with_policies:
* @first_policy_name: name of the first policy to set
* @...: value of first policy, followed by more policies, %NULL-terminated
*
* Create a new #WebKitWebsitePolicies with policies given as variadic
* arguments.
*
* Returns: (transfer full): the newly created #WebKitWebsitePolicies
*
* <informalexample><programlisting>
* WebKitWebsitePolicies *default_website_policies = webkit_website_policies_new_with_policies(
* "autoplay", WEBKIT_AUTOPLAY_DENY,
* NULL);
* ...
* WebKitWebView *view = WEBKIT_WEB_VIEW(g_object_new(WEBKIT_TYPE_WEB_VIEW,
* "web-context", ctx,
* "settings", settings,
* "user-content-manager", content_manager,
* "website-policies", default_website_policies,
* NULL));
* ...
* </programlisting></informalexample>
*
* Since: 2.30
*/
WebKitWebsitePolicies* webkit_website_policies_new_with_policies(const gchar* firstPolicyName, ...)
{
va_list args;
va_start(args, firstPolicyName);
WebKitWebsitePolicies* policies = WEBKIT_WEBSITE_POLICIES(g_object_new_valist(WEBKIT_TYPE_WEBSITE_POLICIES, firstPolicyName, args));
va_end(args);
return policies;
}
/**
* webkit_website_policies_get_autoplay_policy:
* @policies: a #WebKitWebsitePolicies
*
* Get the #WebKitWebsitePolicies:autoplay property.
*
* Returns: #WebKitAutoplayPolicy
*
* Since: 2.30
*/
WebKitAutoplayPolicy webkit_website_policies_get_autoplay_policy(WebKitWebsitePolicies* policies)
{
g_return_val_if_fail(WEBKIT_IS_WEBSITE_POLICIES(policies), WEBKIT_AUTOPLAY_ALLOW_WITHOUT_SOUND);
auto apiAutoplayPolicyType = policies->priv->websitePolicies->autoplayPolicy();
switch (apiAutoplayPolicyType) {
case WebsiteAutoplayPolicy::Allow:
return WEBKIT_AUTOPLAY_ALLOW;
case WebsiteAutoplayPolicy::AllowWithoutSound:
return WEBKIT_AUTOPLAY_ALLOW_WITHOUT_SOUND;
case WebsiteAutoplayPolicy::Deny:
return WEBKIT_AUTOPLAY_DENY;
default:
return WEBKIT_AUTOPLAY_ALLOW_WITHOUT_SOUND;
}
}