From 7b0661be9f97f4d2e14e4a35074d378e93cb741c Mon Sep 17 00:00:00 2001 From: Don Date: Fri, 25 Mar 2022 10:25:09 -0700 Subject: [PATCH] Add User Agent API Allow a libwpe application to set user agent information. The libwpe API maps to values exposed by the User-Agent Client Hints API. --- CMakeLists.txt | 12 +++- include/wpe/meson.build | 1 + include/wpe/user-agent.h | 99 ++++++++++++++++++++++++++++++++ include/wpe/wpe.h | 1 + meson.build | 5 ++ meson_options.txt | 5 ++ src/user-agent.c | 121 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 243 insertions(+), 1 deletion(-) create mode 100644 include/wpe/user-agent.h create mode 100644 src/user-agent.c diff --git a/CMakeLists.txt b/CMakeLists.txt index c1bcc950..cf21e317 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,10 @@ set(WPE_BACKEND "" CACHE STRING "Name of the backend library to load, instead of libWPEBackend-default.so" ) +set(WPE_ENABLE_UA + ON + CACHE STRING "Enable user agent platform information" +) set(WPE_ENABLE_XKB ON CACHE STRING "Enable use of libxkbcommon for keyboard input" @@ -70,6 +74,7 @@ set(WPE_PUBLIC_HEADERS include/wpe/pasteboard.h include/wpe/renderer-backend-egl.h include/wpe/renderer-host.h + include/wpe/user-agent.h include/wpe/view-backend.h include/wpe/wpe-egl.h include/wpe/wpe.h @@ -82,6 +87,7 @@ add_library( src/pasteboard.c src/pasteboard-generic.cpp src/pasteboard-noop.cpp + src/user-agent.c src/renderer-backend-egl.c src/renderer-host.c src/version.c @@ -114,9 +120,13 @@ target_compile_definitions( if (WPE_BACKEND) target_compile_definitions(wpe PRIVATE WPE_BACKEND=\"${WPE_BACKEND}\") endif () +if (WPE_ENABLE_UA) + target_compile_definitions(wpe PUBLIC WPE_ENABLE_UA=1) + list(APPEND WPE_PC_CFLAGS -DWPE_ENABLE_UA=1) +endif () if (WPE_ENABLE_XKB) target_compile_definitions(wpe PUBLIC WPE_ENABLE_XKB=1) - set(WPE_PC_CFLAGS -DWPE_ENABLE_XKB=1) + list(APPEND WPE_PC_CFLAGS -DWPE_ENABLE_XKB=1) endif () target_compile_options(wpe PRIVATE $) diff --git a/include/wpe/meson.build b/include/wpe/meson.build index 185619d3..5200a946 100644 --- a/include/wpe/meson.build +++ b/include/wpe/meson.build @@ -9,6 +9,7 @@ api_headers = [ 'pasteboard.h', 'renderer-backend-egl.h', 'renderer-host.h', + 'user-agent.h', 'version.h', 'version-deprecated.h', 'view-backend.h', diff --git a/include/wpe/user-agent.h b/include/wpe/user-agent.h new file mode 100644 index 00000000..1f54fbc4 --- /dev/null +++ b/include/wpe/user-agent.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2022 Igalia S.L. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if !defined(__WPE_H_INSIDE__) && !defined(WPE_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef wpe_user_agent_h +#define wpe_user_agent_h + +/** + * SECTION:user-agent + * @short_description: Library User Agent + * @title: User Agent + */ + +#if defined(WPE_ENABLE_UA) && WPE_ENABLE_UA + +#if defined(WPE_COMPILATION) +#include "export.h" +#endif + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct wpe_user_agent_provider; + +struct wpe_user_agent_provider_interface { + void* (*create)(struct wpe_user_agent_provider*); + void (*destroy)(void*); + const char* (*architecture)(void*); + uint8_t (*bitness)(void*); + bool (*mobile)(void*); + const char* (*model)(void*); + const char* (*platform)(void*); + const char* (*platform_version)(void*); +}; + +WPE_EXPORT +struct wpe_user_agent_provider* wpe_user_agent_provider_create(void); + +WPE_EXPORT +void wpe_user_agent_provider_destroy(struct wpe_user_agent_provider*); + +WPE_EXPORT +const char* wpe_user_agent_get_architecture(struct wpe_user_agent_provider*); + +WPE_EXPORT +uint8_t wpe_user_agent_get_bitness(struct wpe_user_agent_provider*); + +WPE_EXPORT +bool wpe_user_agent_is_mobile(struct wpe_user_agent_provider*); + +WPE_EXPORT +const char* wpe_user_agent_get_model(struct wpe_user_agent_provider*); + +WPE_EXPORT +const char* wpe_user_agent_get_platform(struct wpe_user_agent_provider*); + +WPE_EXPORT +const char* wpe_user_agent_get_platform_version(struct wpe_user_agent_provider*); + +WPE_EXPORT +void wpe_user_agent_register_interface(struct wpe_user_agent_provider_interface*); + +#ifdef __cplusplus +} +#endif + +#endif /* defined(WPE_ENABLE_UA) && WPE_ENABLE_UA */ + +#endif /* wpe_user_agent_h */ diff --git a/include/wpe/wpe.h b/include/wpe/wpe.h index f266a425..c45737b0 100644 --- a/include/wpe/wpe.h +++ b/include/wpe/wpe.h @@ -42,6 +42,7 @@ #include "loader.h" #include "pasteboard.h" #include "renderer-host.h" +#include "user-agent.h" #include "version-deprecated.h" #include "version.h" #include "view-backend.h" diff --git a/meson.build b/meson.build index 490949ea..26046951 100644 --- a/meson.build +++ b/meson.build @@ -46,6 +46,10 @@ endif dependencies = [] pkg_cflags = [] +if get_option('enable-ua') + pkg_cflags += ['-DWPE_ENABLE_UA=1'] +endif + if get_option('enable-xkb') pkg_cflags += ['-DWPE_ENABLE_XKB=1'] dependencies += dependency('xkbcommon', @@ -89,6 +93,7 @@ libwpe = library('wpe-' + api_version, 'src/pasteboard-noop.cpp', 'src/renderer-backend-egl.c', 'src/renderer-host.c', + 'src/user-agent.c', 'src/version.c', 'src/view-backend.c', get_option('default_library') == 'shared' ? 'src/loader.c' : 'src/loader-static.c', diff --git a/meson_options.txt b/meson_options.txt index 635cf091..10d90579 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -3,6 +3,11 @@ option('default-backend', value: '', description: 'Name of the backend library to load, instead of libWPEBackend-default.so' ) +option('enable-ua', + type: 'boolean', + value: true, + description: '(Experimental) Enable user agent api' +) option('enable-xkb', type: 'boolean', value: true, diff --git a/src/user-agent.c b/src/user-agent.c new file mode 100644 index 00000000..b014fe03 --- /dev/null +++ b/src/user-agent.c @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2022 Igalia S.L. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if defined(WPE_ENABLE_UA) && WPE_ENABLE_UA + +#include "../include/wpe/user-agent.h" +#include + +struct wpe_user_agent_provider { + void* backend; +}; + +static struct wpe_user_agent_provider_interface* provider_interface = NULL; + +struct wpe_user_agent_provider* +wpe_user_agent_provider_create() +{ + if (!provider_interface) + return NULL; + + struct wpe_user_agent_provider* provider = calloc(1, sizeof(struct wpe_user_agent_provider)); + if (!provider) + return NULL; + + if (provider_interface->create) + provider->backend = provider_interface->create(provider); + + return provider; +} + +void +wpe_user_agent_provider_destroy(struct wpe_user_agent_provider* provider) +{ + if (!provider) + return; + + if (provider_interface && provider_interface->destroy) + provider_interface->destroy(provider); + provider->backend = NULL; + free(provider); +} + +const char* +wpe_user_agent_get_architecture(struct wpe_user_agent_provider* provider) +{ + if (provider && provider_interface && provider_interface->architecture) + return provider_interface->architecture(provider->backend); + return NULL; +} + +uint8_t +wpe_user_agent_get_bitness(struct wpe_user_agent_provider* provider) +{ + if (provider && provider_interface && provider_interface->bitness) + return provider_interface->bitness(provider->backend); + return 0; +} + +bool +wpe_user_agent_is_mobile(struct wpe_user_agent_provider* provider) +{ + if (provider && provider_interface && provider_interface->mobile) + return provider_interface->mobile(provider->backend); + return false; +} + +const char* +wpe_user_agent_get_model(struct wpe_user_agent_provider* provider) +{ + if (provider && provider_interface && provider_interface->model) + return provider_interface->model(provider->backend); + return NULL; +} + +const char* +wpe_user_agent_get_platform(struct wpe_user_agent_provider* provider) +{ + if (provider && provider_interface && provider_interface->platform) + return provider_interface->platform(provider->backend); + return NULL; +} + +const char* +wpe_user_agent_get_platform_version(struct wpe_user_agent_provider* provider) +{ + if (provider && provider_interface && provider_interface->platform_version) + return provider_interface->platform_version(provider->backend); + return NULL; +} + +void +wpe_user_agent_register_interface(struct wpe_user_agent_provider_interface* provider) +{ + if (provider && !provider_interface) + provider_interface = provider; +} + +#endif /* defined(WPE_ENABLE_UA) && WPE_ENABLE_UA */