diff --git a/resources/desktop/com.github.rssguard.appdata.xml b/resources/desktop/com.github.rssguard.appdata.xml index f978777d0..40446f40d 100644 --- a/resources/desktop/com.github.rssguard.appdata.xml +++ b/resources/desktop/com.github.rssguard.appdata.xml @@ -26,7 +26,7 @@ https://github.com/sponsors/martinrotter - + none diff --git a/resources/scripts/github-actions/build-windows.ps1 b/resources/scripts/github-actions/build-windows.ps1 index 81c9afa87..af9229020 100755 --- a/resources/scripts/github-actions/build-windows.ps1 +++ b/resources/scripts/github-actions/build-windows.ps1 @@ -80,7 +80,7 @@ cd "$old_pwd" # Build application. mkdir "rssguard-build" cd "rssguard-build" -& "$cmake_path" ".." -G Ninja -DCMAKE_BUILD_TYPE="Release" -DBUILD_WITH_QT6="$with_qt6" -DREVISION_FROM_GIT=ON -DUSE_WEBENGINE="$webengine" -DFEEDLY_CLIENT_ID="$env:FEEDLY_CLIENT_ID" -DFEEDLY_CLIENT_SECRET="$env:FEEDLY_CLIENT_SECRET" -DGMAIL_CLIENT_ID="$env:GMAIL_CLIENT_ID" -DGMAIL_CLIENT_SECRET="$env:GMAIL_CLIENT_SECRET" -DINOREADER_CLIENT_ID="$env:INOREADER_CLIENT_ID" -DINOREADER_CLIENT_SECRET="$env:INOREADER_CLIENT_SECRET" +& "$cmake_path" ".." -G Ninja -DCMAKE_BUILD_TYPE="RelWithDebInfo" -DBUILD_WITH_QT6="$with_qt6" -DREVISION_FROM_GIT=ON -DUSE_WEBENGINE="$webengine" -DFEEDLY_CLIENT_ID="$env:FEEDLY_CLIENT_ID" -DFEEDLY_CLIENT_SECRET="$env:FEEDLY_CLIENT_SECRET" -DGMAIL_CLIENT_ID="$env:GMAIL_CLIENT_ID" -DGMAIL_CLIENT_SECRET="$env:GMAIL_CLIENT_SECRET" -DINOREADER_CLIENT_ID="$env:INOREADER_CLIENT_ID" -DINOREADER_CLIENT_SECRET="$env:INOREADER_CLIENT_SECRET" & "$cmake_path" --build . & "$cmake_path" --install . --prefix app diff --git a/src/librssguard/definitions/definitions.h b/src/librssguard/definitions/definitions.h index 0593142cc..fe00d12a8 100644 --- a/src/librssguard/definitions/definitions.h +++ b/src/librssguard/definitions/definitions.h @@ -6,306 +6,308 @@ #include #include -#define SERVICE_CODE_STD_RSS "std-rss" -#define SERVICE_CODE_TT_RSS "tt-rss" -#define SERVICE_CODE_OWNCLOUD "owncloud" -#define SERVICE_CODE_GREADER "greader" -#define SERVICE_CODE_FEEDLY "feedly" -#define SERVICE_CODE_INOREADER "inoreader" -#define SERVICE_CODE_GMAIL "gmail" -#define SERVICE_CODE_REDDIT "reddit" -#define SERVICE_CODE_NEWSBLUR "newsblur" +#define SERVICE_CODE_STD_RSS "std-rss" +#define SERVICE_CODE_TT_RSS "tt-rss" +#define SERVICE_CODE_OWNCLOUD "owncloud" +#define SERVICE_CODE_GREADER "greader" +#define SERVICE_CODE_FEEDLY "feedly" +#define SERVICE_CODE_INOREADER "inoreader" +#define SERVICE_CODE_GMAIL "gmail" +#define SERVICE_CODE_REDDIT "reddit" +#define SERVICE_CODE_NEWSBLUR "newsblur" -#define ADBLOCK_SERVER_PORT 48484 -#define ADBLOCK_HOWTO "https://github.com/martinrotter/rssguard/blob/master/resources/docs/Documentation.md#adbl" -#define ADBLOCK_ICON_ACTIVE "adblock" -#define ADBLOCK_ICON_DISABLED "adblock-disabled" +#define ADBLOCK_SERVER_PORT 48484 +#define ADBLOCK_HOWTO "https://github.com/martinrotter/rssguard/blob/master/resources/docs/Documentation.md#adbl" +#define ADBLOCK_ICON_ACTIVE "adblock" +#define ADBLOCK_ICON_DISABLED "adblock-disabled" -#define OAUTH_DECRYPTION_KEY 11451167756100761335ul -#define OAUTH_REDIRECT_URI "http://localhost" +#define OAUTH_DECRYPTION_KEY 11451167756100761335ul +#define OAUTH_REDIRECT_URI "http://localhost" -#define ENCLOSURES_OUTER_SEPARATOR '#' -#define ECNLOSURES_INNER_SEPARATOR '&' +#define ENCLOSURES_OUTER_SEPARATOR '#' +#define ECNLOSURES_INNER_SEPARATOR '&' -#define URI_SCHEME_FEED_SHORT "feed:" -#define URI_SCHEME_FEED "feed://" +#define URI_SCHEME_FEED_SHORT "feed:" +#define URI_SCHEME_FEED "feed://" -#define URI_SCHEME_HTTP_SHORT "http:" -#define URI_SCHEME_HTTP "http://" +#define URI_SCHEME_HTTP_SHORT "http:" +#define URI_SCHEME_HTTP "http://" -#define URI_SCHEME_HTTPS_SHORT "https:" -#define URI_SCHEME_HTTPS "https://" +#define URI_SCHEME_HTTPS_SHORT "https:" +#define URI_SCHEME_HTTPS "https://" -#define DEFAULT_LOCALE "en_US" +#define DEFAULT_LOCALE "en_US" -#define NO_PARENT_CATEGORY -1 -#define ID_RECYCLE_BIN -2 -#define ID_IMPORTANT -3 -#define ID_LABELS -4 -#define ID_UNREAD -5 +#define NO_PARENT_CATEGORY -1 +#define ID_RECYCLE_BIN -2 +#define ID_IMPORTANT -3 +#define ID_LABELS -4 +#define ID_UNREAD -5 -#define MSG_SCORE_MAX 100.0 -#define MSG_SCORE_MIN 0.0 +#define MSG_SCORE_MAX 100.0 +#define MSG_SCORE_MIN 0.0 -#define LOWER_TITLE_ROLE 64 -#define HIGHLIGHTED_FOREGROUND_TITLE_ROLE 128 +#define LOWER_TITLE_ROLE 64 +#define HIGHLIGHTED_FOREGROUND_TITLE_ROLE 128 -#define SOUNDS_BUILTIN_DIRECTORY ":/sounds" -#define ARGUMENTS_LIST_SEPARATOR "\n" -#define IS_IN_ARRAY(offset, \ - array) ((offset >= 0) && (offset < array.count())) -#define DEFAULT_SQL_MESSAGES_FILTER "0 > 1" -#define MAX_MULTICOLUMN_SORT_STATES 3 -#define RELEASES_LIST "https://api.github.com/repos/martinrotter/rssguard/releases" -#define MSG_FILTERING_HELP "https://github.com/martinrotter/rssguard/blob/master/resources/docs/Documentation.md#fltr" -#define URL_REGEXP "^(http|https|feed|ftp):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#])?$" -#define SCRIPT_SOURCE_TYPE_REGEXP "^.+#.*$" -#define TEXT_TITLE_LIMIT 30 -#define TEXT_TOOLTIP_LIMIT 50 -#define RESELECT_MESSAGE_THRESSHOLD 500 -#define ICON_SIZE_SETTINGS 16 -#define TRAY_ICON_BUBBLE_TIMEOUT 20000 -#define CLOSE_LOCK_TIMEOUT 500 -#define DOWNLOAD_TIMEOUT 30000 -#define MESSAGES_VIEW_DEFAULT_COL 100 -#define MESSAGES_VIEW_MINIMUM_COL 16 -#define FEEDS_VIEW_COLUMN_COUNT 2 -#define DEFAULT_DAYS_TO_DELETE_MSG 14 -#define ELLIPSIS_LENGTH 3 -#define DEFAULT_AUTO_UPDATE_INTERVAL 15 -#define AUTO_UPDATE_INTERVAL 60000 -#define STARTUP_UPDATE_DELAY 15.0 // In seconds. -#define TIMEZONE_OFFSET_LIMIT 6 -#define CHANGE_EVENT_DELAY 250 -#define FLAG_ICON_SUBFOLDER "flags" -#define SEARCH_BOX_ACTION_NAME "search" -#define HIGHLIGHTER_ACTION_NAME "highlighter" -#define FILTER_ACTION_NAME "filter" -#define SPACER_ACTION_NAME "spacer" -#define SEPARATOR_ACTION_NAME "separator" -#define FILTER_WIDTH 125 -#define FILTER_RIGHT_MARGIN 5 -#define FEEDS_VIEW_INDENTATION 10 -#define MIME_TYPE_ITEM_POINTER "rssguard/itempointer" -#define DOWNLOADER_ICON_SIZE 48 -#define ENCRYPTION_FILE_NAME "key.private" -#define RELOAD_MODEL_BORDER_NUM 10 -#define COOKIE_URL_IDENTIFIER ":COOKIE:" -#define DEFAULT_NOTIFICATION_VOLUME 50 +#define SOUNDS_BUILTIN_DIRECTORY ":/sounds" +#define ARGUMENTS_LIST_SEPARATOR "\n" +#define IS_IN_ARRAY(offset, array) ((offset >= 0) && (offset < array.count())) +#define DEFAULT_SQL_MESSAGES_FILTER "0 > 1" +#define MAX_MULTICOLUMN_SORT_STATES 3 +#define RELEASES_LIST "https://api.github.com/repos/martinrotter/rssguard/releases" +#define MSG_FILTERING_HELP "https://github.com/martinrotter/rssguard/blob/master/resources/docs/Documentation.md#fltr" +#define URL_REGEXP \ + "^(http|https|feed|ftp):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/" \ + "~\\+#])?$" +#define SCRIPT_SOURCE_TYPE_REGEXP "^.+#.*$" +#define TEXT_TITLE_LIMIT 30 +#define TEXT_TOOLTIP_LIMIT 50 +#define RESELECT_MESSAGE_THRESSHOLD 500 +#define ICON_SIZE_SETTINGS 16 +#define TRAY_ICON_BUBBLE_TIMEOUT 20000 +#define CLOSE_LOCK_TIMEOUT 500 +#define DOWNLOAD_TIMEOUT 30000 +#define MESSAGES_VIEW_DEFAULT_COL 100 +#define MESSAGES_VIEW_MINIMUM_COL 16 +#define FEEDS_VIEW_COLUMN_COUNT 2 +#define DEFAULT_DAYS_TO_DELETE_MSG 14 +#define ELLIPSIS_LENGTH 3 +#define DEFAULT_AUTO_UPDATE_INTERVAL 15 +#define AUTO_UPDATE_INTERVAL 60000 +#define STARTUP_UPDATE_DELAY 15.0 // In seconds. +#define TIMEZONE_OFFSET_LIMIT 6 +#define CHANGE_EVENT_DELAY 250 +#define FLAG_ICON_SUBFOLDER "flags" +#define SEARCH_BOX_ACTION_NAME "search" +#define HIGHLIGHTER_ACTION_NAME "highlighter" +#define FILTER_ACTION_NAME "filter" +#define SPACER_ACTION_NAME "spacer" +#define SEPARATOR_ACTION_NAME "separator" +#define FILTER_WIDTH 125 +#define FILTER_RIGHT_MARGIN 5 +#define FEEDS_VIEW_INDENTATION 10 +#define MIME_TYPE_ITEM_POINTER "rssguard/itempointer" +#define DOWNLOADER_ICON_SIZE 48 +#define ENCRYPTION_FILE_NAME "key.private" +#define RELOAD_MODEL_BORDER_NUM 10 +#define COOKIE_URL_IDENTIFIER ":COOKIE:" +#define DEFAULT_NOTIFICATION_VOLUME 50 -#define GOOGLE_SEARCH_URL "https://www.google.com/search?q=%1&ie=utf-8&oe=utf-8" -#define GOOGLE_SUGGEST_URL "http://suggestqueries.google.com/complete/search?output=toolbar&hl=en&q=%1" +#define GOOGLE_SEARCH_URL "https://www.google.com/search?q=%1&ie=utf-8&oe=utf-8" +#define GOOGLE_SUGGEST_URL "http://suggestqueries.google.com/complete/search?output=toolbar&hl=en&q=%1" -#define EXECUTION_LINE_SEPARATOR "#" -#define EXTERNAL_TOOL_SEPARATOR "|||" +#define EXTERNAL_TOOL_SEPARATOR "|||" -#define USER_DATA_PLACEHOLDER "%data%" +#define USER_DATA_PLACEHOLDER "%data%" #define SKIN_STYLE_PLACEHOLDER "%style%" -#define CLI_VER_SHORT "v" -#define CLI_VER_LONG "version" +#define CLI_VER_SHORT "v" +#define CLI_VER_LONG "version" -#define CLI_HELP_SHORT "h" -#define CLI_HELP_LONG "help" +#define CLI_HELP_SHORT "h" +#define CLI_HELP_LONG "help" -#define CLI_LOG_SHORT "l" -#define CLI_LOG_LONG "log" +#define CLI_LOG_SHORT "l" +#define CLI_LOG_LONG "log" -#define CLI_DAT_SHORT "d" -#define CLI_DAT_LONG "data" +#define CLI_DAT_SHORT "d" +#define CLI_DAT_LONG "data" -#define CLI_SIN_SHORT "s" -#define CLI_SIN_LONG "no-single-instance" +#define CLI_SIN_SHORT "s" +#define CLI_SIN_LONG "no-single-instance" -#define CLI_NSTDOUTERR_SHORT "n" -#define CLI_NSTDOUTERR_LONG "no-standard-output" +#define CLI_NSTDOUTERR_SHORT "n" +#define CLI_NSTDOUTERR_LONG "no-standard-output" -#define CLI_STYLE_SHORT "t" -#define CLI_STYLE_LONG "style" +#define CLI_STYLE_SHORT "t" +#define CLI_STYLE_LONG "style" -#define CLI_NDEBUG_SHORT "g" -#define CLI_NDEBUG_LONG "no-debug-output" +#define CLI_NDEBUG_SHORT "g" +#define CLI_NDEBUG_LONG "no-debug-output" -#define CLI_FORCE_NOWEBENGINE_SHORT "w" -#define CLI_FORCE_NOWEBENGINE_LONG "no-web-engine" +#define CLI_FORCE_NOWEBENGINE_SHORT "w" +#define CLI_FORCE_NOWEBENGINE_LONG "no-web-engine" #define CLI_QUIT_INSTANCE "q" -#define CLI_IS_RUNNING "a" +#define CLI_IS_RUNNING "a" -#define HTTP_HEADERS_ACCEPT "Accept" -#define HTTP_HEADERS_CONTENT_TYPE "Content-Type" +#define HTTP_HEADERS_ACCEPT "Accept" +#define HTTP_HEADERS_CONTENT_TYPE "Content-Type" #define HTTP_HEADERS_CONTENT_LENGTH "Content-Length" -#define HTTP_HEADERS_AUTHORIZATION "Authorization" -#define HTTP_HEADERS_USER_AGENT "User-Agent" -#define HTTP_HEADERS_COOKIE "Cookie" +#define HTTP_HEADERS_AUTHORIZATION "Authorization" +#define HTTP_HEADERS_USER_AGENT "User-Agent" +#define HTTP_HEADERS_COOKIE "Cookie" -#define LOGSEC_NETWORK "network: " -#define LOGSEC_ADBLOCK "adblock: " -#define LOGSEC_FEEDMODEL "feed-model: " -#define LOGSEC_FEEDDOWNLOADER "feed-downloader: " -#define LOGSEC_MESSAGEMODEL "message-model: " -#define LOGSEC_JS "javascript: " -#define LOGSEC_GUI "gui: " -#define LOGSEC_CORE "core: " -#define LOGSEC_NODEJS "nodejs: " -#define LOGSEC_DB "database: " -#define LOGSEC_NEXTCLOUD "nextcloud: " -#define LOGSEC_GREADER "greader: " -#define LOGSEC_FEEDLY "feedly: " -#define LOGSEC_TTRSS "tt-rss: " -#define LOGSEC_GMAIL "gmail: " -#define LOGSEC_OAUTH "oauth: " -#define LOGSEC_REDDIT "reddit: " -#define LOGSEC_NEWSBLUR "newsblur: " +#define LOGSEC_NETWORK "network: " +#define LOGSEC_ADBLOCK "adblock: " +#define LOGSEC_FEEDMODEL "feed-model: " +#define LOGSEC_FEEDDOWNLOADER "feed-downloader: " +#define LOGSEC_MESSAGEMODEL "message-model: " +#define LOGSEC_JS "javascript: " +#define LOGSEC_GUI "gui: " +#define LOGSEC_CORE "core: " +#define LOGSEC_NODEJS "nodejs: " +#define LOGSEC_DB "database: " +#define LOGSEC_NEXTCLOUD "nextcloud: " +#define LOGSEC_GREADER "greader: " +#define LOGSEC_FEEDLY "feedly: " +#define LOGSEC_TTRSS "tt-rss: " +#define LOGSEC_GMAIL "gmail: " +#define LOGSEC_OAUTH "oauth: " +#define LOGSEC_REDDIT "reddit: " +#define LOGSEC_NEWSBLUR "newsblur: " -#define MAX_ZOOM_FACTOR 5.0f -#define MIN_ZOOM_FACTOR 0.25f +#define MAX_ZOOM_FACTOR 5.0f +#define MIN_ZOOM_FACTOR 0.25f #define DEFAULT_ZOOM_FACTOR 1.0f -#define ZOOM_FACTOR_STEP 0.05f +#define ZOOM_FACTOR_STEP 0.05f #if defined(USE_WEBENGINE) -#define HTTP_COMPLETE_USERAGENT (QWebEngineProfile::defaultProfile()->httpUserAgent().toLocal8Bit() + QByteArrayLiteral(" ") + QByteArrayLiteral(APP_USERAGENT)) +#define HTTP_COMPLETE_USERAGENT \ + (QWebEngineProfile::defaultProfile()->httpUserAgent().toLocal8Bit() + QByteArrayLiteral(" ") + \ + QByteArrayLiteral(APP_USERAGENT)) #else -#define HTTP_COMPLETE_USERAGENT (QByteArrayLiteral( \ - "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.15.2 Chrome/83.0.4103.122 Safari/537.36 ") \ - + \ - QByteArrayLiteral(APP_USERAGENT)) +#define HTTP_COMPLETE_USERAGENT \ + (QByteArrayLiteral("Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " \ + "QtWebEngine/5.15.2 Chrome/83.0.4103.122 Safari/537.36 ") + \ + QByteArrayLiteral(APP_USERAGENT)) #endif -#define INTERNAL_URL_MESSAGE "http://rssguard.message" -#define INTERNAL_URL_BLANK "http://rssguard.blank" -#define INTERNAL_URL_ADBLOCKED "http://rssguard.adblocked" -#define INTERNAL_URL_MESSAGE_HOST "rssguard.message" +#define INTERNAL_URL_MESSAGE "http://rssguard.message" +#define INTERNAL_URL_BLANK "http://rssguard.blank" +#define INTERNAL_URL_ADBLOCKED "http://rssguard.adblocked" +#define INTERNAL_URL_MESSAGE_HOST "rssguard.message" -#define FEED_REGEX_MATCHER "]+type=\"application\\/(?:atom\\+xml|rss\\+xml|feed\\+json|json)\"[^>]*>" -#define FEED_HREF_REGEX_MATCHER "href=\"([^\"]+)\"" +#define FEED_REGEX_MATCHER "]+type=\"application\\/(?:atom\\+xml|rss\\+xml|feed\\+json|json)\"[^>]*>" +#define FEED_HREF_REGEX_MATCHER "href=\"([^\"]+)\"" -#define PLACEHOLDER_UNREAD_COUNTS "%unread" -#define PLACEHOLDER_ALL_COUNTS "%all" +#define PLACEHOLDER_UNREAD_COUNTS "%unread" +#define PLACEHOLDER_ALL_COUNTS "%all" -#define BACKUP_NAME_SETTINGS "config" -#define BACKUP_SUFFIX_SETTINGS ".ini.backup" -#define BACKUP_NAME_DATABASE "database" -#define BACKUP_SUFFIX_DATABASE ".db.backup" +#define BACKUP_NAME_SETTINGS "config" +#define BACKUP_SUFFIX_SETTINGS ".ini.backup" +#define BACKUP_NAME_DATABASE "database" +#define BACKUP_SUFFIX_DATABASE ".db.backup" -#define APP_DB_MYSQL_DRIVER "QMYSQL" -#define APP_DB_MYSQL_INIT "db_init_mysql.sql" -#define APP_DB_MYSQL_TEST "MySQLTest" -#define APP_DB_MYSQL_PORT 3306 +#define APP_DB_MYSQL_DRIVER "QMYSQL" +#define APP_DB_MYSQL_INIT "db_init_mysql.sql" +#define APP_DB_MYSQL_TEST "MySQLTest" +#define APP_DB_MYSQL_PORT 3306 -#define APP_DB_SQLITE_DRIVER "QSQLITE" -#define APP_DB_SQLITE_INIT "db_init_sqlite.sql" -#define APP_DB_SQLITE_PATH "database" -#define APP_DB_SQLITE_FILE "database.db" +#define APP_DB_SQLITE_DRIVER "QSQLITE" +#define APP_DB_SQLITE_INIT "db_init_sqlite.sql" +#define APP_DB_SQLITE_PATH "database" +#define APP_DB_SQLITE_FILE "database.db" // Keep this in sync with schema versions declared in SQL initialization code. -#define APP_DB_SCHEMA_VERSION "2" -#define APP_DB_UPDATE_FILE_PATTERN "db_update_%1_%2_%3.sql" -#define APP_DB_COMMENT_SPLIT "-- !\n" -#define APP_DB_INCLUDE_PLACEHOLDER "!!" -#define APP_DB_NAME_PLACEHOLDER "##" -#define APP_DB_AUTO_INC_PRIM_KEY_PLACEHOLDER "$$" -#define APP_DB_BLOB_PLACEHOLDER "^^" +#define APP_DB_SCHEMA_VERSION "2" +#define APP_DB_UPDATE_FILE_PATTERN "db_update_%1_%2_%3.sql" +#define APP_DB_COMMENT_SPLIT "-- !\n" +#define APP_DB_INCLUDE_PLACEHOLDER "!!" +#define APP_DB_NAME_PLACEHOLDER "##" +#define APP_DB_AUTO_INC_PRIM_KEY_PLACEHOLDER "$$" +#define APP_DB_BLOB_PLACEHOLDER "^^" -#define APP_CFG_PATH "config" -#define APP_CFG_FILE "config.ini" +#define APP_CFG_PATH "config" +#define APP_CFG_FILE "config.ini" #define APP_SKIN_USER_FOLDER "skins" -#define APP_SKIN_DEFAULT "nudus-light" +#define APP_SKIN_DEFAULT "nudus-light" #define APP_SKIN_METADATA_FILE "metadata.xml" -#define APP_STYLE_DEFAULT "Fusion" +#define APP_STYLE_DEFAULT "Fusion" #if defined(Q_OS_UNIX) && !defined(Q_OS_MACOS) -#define APP_THEME_DEFAULT "" +#define APP_THEME_DEFAULT "" #else -#define APP_THEME_DEFAULT "Breeze" +#define APP_THEME_DEFAULT "Breeze" #endif -#define APP_LOCAL_THEME_FOLDER "icons" -#define APP_NO_THEME "" +#define APP_LOCAL_THEME_FOLDER "icons" +#define APP_NO_THEME "" // Indexes of columns as they are DEFINED IN THE TABLE for MESSAGES. -#define MSG_DB_ID_INDEX 0 -#define MSG_DB_READ_INDEX 1 -#define MSG_DB_IMPORTANT_INDEX 2 -#define MSG_DB_DELETED_INDEX 3 -#define MSG_DB_PDELETED_INDEX 4 -#define MSG_DB_FEED_CUSTOM_ID_INDEX 5 -#define MSG_DB_TITLE_INDEX 6 -#define MSG_DB_URL_INDEX 7 -#define MSG_DB_AUTHOR_INDEX 8 -#define MSG_DB_DCREATED_INDEX 9 -#define MSG_DB_CONTENTS_INDEX 10 -#define MSG_DB_ENCLOSURES_INDEX 11 -#define MSG_DB_SCORE_INDEX 12 -#define MSG_DB_ACCOUNT_ID_INDEX 13 -#define MSG_DB_CUSTOM_ID_INDEX 14 -#define MSG_DB_CUSTOM_HASH_INDEX 15 -#define MSG_DB_FEED_TITLE_INDEX 16 -#define MSG_DB_HAS_ENCLOSURES 17 +#define MSG_DB_ID_INDEX 0 +#define MSG_DB_READ_INDEX 1 +#define MSG_DB_IMPORTANT_INDEX 2 +#define MSG_DB_DELETED_INDEX 3 +#define MSG_DB_PDELETED_INDEX 4 +#define MSG_DB_FEED_CUSTOM_ID_INDEX 5 +#define MSG_DB_TITLE_INDEX 6 +#define MSG_DB_URL_INDEX 7 +#define MSG_DB_AUTHOR_INDEX 8 +#define MSG_DB_DCREATED_INDEX 9 +#define MSG_DB_CONTENTS_INDEX 10 +#define MSG_DB_ENCLOSURES_INDEX 11 +#define MSG_DB_SCORE_INDEX 12 +#define MSG_DB_ACCOUNT_ID_INDEX 13 +#define MSG_DB_CUSTOM_ID_INDEX 14 +#define MSG_DB_CUSTOM_HASH_INDEX 15 +#define MSG_DB_FEED_TITLE_INDEX 16 +#define MSG_DB_HAS_ENCLOSURES 17 // Indexes of columns as they are DEFINED IN THE TABLE for CATEGORIES. -#define CAT_DB_ID_INDEX 0 -#define CAT_DB_ORDER_INDEX 1 -#define CAT_DB_PARENT_ID_INDEX 2 -#define CAT_DB_TITLE_INDEX 3 -#define CAT_DB_DESCRIPTION_INDEX 4 -#define CAT_DB_DCREATED_INDEX 5 -#define CAT_DB_ICON_INDEX 6 -#define CAT_DB_ACCOUNT_ID_INDEX 7 -#define CAT_DB_CUSTOM_ID_INDEX 8 +#define CAT_DB_ID_INDEX 0 +#define CAT_DB_ORDER_INDEX 1 +#define CAT_DB_PARENT_ID_INDEX 2 +#define CAT_DB_TITLE_INDEX 3 +#define CAT_DB_DESCRIPTION_INDEX 4 +#define CAT_DB_DCREATED_INDEX 5 +#define CAT_DB_ICON_INDEX 6 +#define CAT_DB_ACCOUNT_ID_INDEX 7 +#define CAT_DB_CUSTOM_ID_INDEX 8 // Indexes of columns as they are DEFINED IN THE TABLE for FEEDS. -#define FDS_DB_ID_INDEX 0 -#define FDS_DB_ORDER_INDEX 1 -#define FDS_DB_TITLE_INDEX 2 -#define FDS_DB_DESCRIPTION_INDEX 3 -#define FDS_DB_DCREATED_INDEX 4 -#define FDS_DB_ICON_INDEX 5 -#define FDS_DB_CATEGORY_INDEX 6 -#define FDS_DB_SOURCE_INDEX 7 -#define FDS_DB_UPDATE_TYPE_INDEX 8 -#define FDS_DB_UPDATE_INTERVAL_INDEX 9 -#define FDS_DB_IS_OFF_INDEX 10 -#define FDS_DB_OPEN_ARTICLES_INDEX 11 -#define FDS_DB_ACCOUNT_ID_INDEX 12 -#define FDS_DB_CUSTOM_ID_INDEX 13 -#define FDS_DB_CUSTOM_DATA_INDEX 14 +#define FDS_DB_ID_INDEX 0 +#define FDS_DB_ORDER_INDEX 1 +#define FDS_DB_TITLE_INDEX 2 +#define FDS_DB_DESCRIPTION_INDEX 3 +#define FDS_DB_DCREATED_INDEX 4 +#define FDS_DB_ICON_INDEX 5 +#define FDS_DB_CATEGORY_INDEX 6 +#define FDS_DB_SOURCE_INDEX 7 +#define FDS_DB_UPDATE_TYPE_INDEX 8 +#define FDS_DB_UPDATE_INTERVAL_INDEX 9 +#define FDS_DB_IS_OFF_INDEX 10 +#define FDS_DB_OPEN_ARTICLES_INDEX 11 +#define FDS_DB_ACCOUNT_ID_INDEX 12 +#define FDS_DB_CUSTOM_ID_INDEX 13 +#define FDS_DB_CUSTOM_DATA_INDEX 14 // Indexes of columns for feed models. -#define FDS_MODEL_TITLE_INDEX 0 -#define FDS_MODEL_COUNTS_INDEX 1 +#define FDS_MODEL_TITLE_INDEX 0 +#define FDS_MODEL_COUNTS_INDEX 1 // Indexes of columns for message filter manager models. -#define MFM_MODEL_ISREAD 0 -#define MFM_MODEL_ISIMPORTANT 1 -#define MFM_MODEL_ISDELETED 2 -#define MFM_MODEL_TITLE 3 -#define MFM_MODEL_URL 4 -#define MFM_MODEL_AUTHOR 5 -#define MFM_MODEL_CREATED 6 -#define MFM_MODEL_SCORE 7 +#define MFM_MODEL_ISREAD 0 +#define MFM_MODEL_ISIMPORTANT 1 +#define MFM_MODEL_ISDELETED 2 +#define MFM_MODEL_TITLE 3 +#define MFM_MODEL_URL 4 +#define MFM_MODEL_AUTHOR 5 +#define MFM_MODEL_CREATED 6 +#define MFM_MODEL_SCORE 7 #if defined(Q_OS_LINUX) -#define OS_ID "Linux" +#define OS_ID "Linux" #elif defined(Q_OS_FREEBSD) -#define OS_ID "FreeBSD" +#define OS_ID "FreeBSD" #elif defined(Q_OS_NETBSD) -#define OS_ID "NetBSD" +#define OS_ID "NetBSD" #elif defined(Q_OS_OPENBSD) -#define OS_ID "OpenBSD" +#define OS_ID "OpenBSD" #elif defined(Q_OS_OS2) -#define OS_ID "OS2" +#define OS_ID "OS2" #elif defined(Q_OS_OSX) -#define OS_ID "macOS" +#define OS_ID "macOS" #elif defined(Q_OS_WIN) -#define OS_ID "Windows" +#define OS_ID "Windows" #elif defined(Q_OS_ANDROID) -#define OS_ID "Android" +#define OS_ID "Android" #elif defined(Q_OS_UNIX) -#define OS_ID "Unix" +#define OS_ID "Unix" #else -#define OS_ID "" +#define OS_ID "" #endif // Paths. diff --git a/src/librssguard/gui/notifications/singlenotificationeditor.cpp b/src/librssguard/gui/notifications/singlenotificationeditor.cpp index 0a66538eb..e60c4994a 100644 --- a/src/librssguard/gui/notifications/singlenotificationeditor.cpp +++ b/src/librssguard/gui/notifications/singlenotificationeditor.cpp @@ -35,11 +35,15 @@ SingleNotificationEditor::SingleNotificationEditor(const Notification& notificat } Notification SingleNotificationEditor::notification() const { - return Notification(m_notificationEvent, m_ui.m_cbBalloon->isChecked(), m_ui.m_txtSound->text(), m_ui.m_slidVolume->value()); + return Notification(m_notificationEvent, + m_ui.m_cbBalloon->isChecked(), + m_ui.m_txtSound->text(), + m_ui.m_slidVolume->value()); } void SingleNotificationEditor::selectSoundFile() { - auto fil = QFileDialog::getOpenFileName(window(), tr("Select sound file"), + auto fil = QFileDialog::getOpenFileName(window(), + tr("Select sound file"), qApp->homeFolder(), tr("WAV files (*.wav);;MP3 files (*.mp3)")); diff --git a/src/librssguard/gui/notifications/singlenotificationeditor.ui b/src/librssguard/gui/notifications/singlenotificationeditor.ui index a4f72c35c..505147f1f 100644 --- a/src/librssguard/gui/notifications/singlenotificationeditor.ui +++ b/src/librssguard/gui/notifications/singlenotificationeditor.ui @@ -82,6 +82,9 @@ + + 100 + Qt::Horizontal diff --git a/src/librssguard/miscellaneous/externaltool.cpp b/src/librssguard/miscellaneous/externaltool.cpp index dd27238aa..a7925b809 100644 --- a/src/librssguard/miscellaneous/externaltool.cpp +++ b/src/librssguard/miscellaneous/externaltool.cpp @@ -71,9 +71,14 @@ void ExternalTool::setToolsToSettings(QVector& tools) { bool ExternalTool::run(const QString& target) { if (parameters().isEmpty()) { - return IOFactory::startProcessDetached(executable(), { target }); + return IOFactory::startProcessDetached(executable(), {target}); } else { - return IOFactory::startProcessDetached(executable(), QStringList() << parameters() << target); + auto pars = parameters(); + pars += QSL(" \"%1\"").arg(target); + + auto params = TextFactory::tokenizeProcessArguments(pars); + + return IOFactory::startProcessDetached(executable(), params); } } diff --git a/src/librssguard/miscellaneous/iofactory.cpp b/src/librssguard/miscellaneous/iofactory.cpp index a837904b6..60e5123f5 100644 --- a/src/librssguard/miscellaneous/iofactory.cpp +++ b/src/librssguard/miscellaneous/iofactory.cpp @@ -72,23 +72,13 @@ QString IOFactory::filterBadCharsFromFilename(const QString& name) { return value; } -bool IOFactory::startProcessDetached(const QString& program, const QStringList& arguments, - const QString& native_arguments, const QString& working_directory) { +bool IOFactory::startProcessDetached(const QString& executable, + const QStringList& arguments, + const QString& working_directory) { QProcess process; - process.setProgram(program); + process.setProgram(executable); process.setArguments(arguments); - -#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC) - if (!native_arguments.isEmpty()) { - process.setNativeArguments(native_arguments); - } -#else - if (arguments.isEmpty() && !native_arguments.isEmpty()) { - process.setArguments({ native_arguments }); - } -#endif - process.setWorkingDirectory(working_directory); return process.startDetached(nullptr); @@ -134,8 +124,7 @@ QString IOFactory::startProcessGetOutput(const QString& executable, proc.start(); - if (proc.waitForFinished() && - proc.exitStatus() == QProcess::ExitStatus::NormalExit && + if (proc.waitForFinished() && proc.exitStatus() == QProcess::ExitStatus::NormalExit && proc.exitCode() == EXIT_SUCCESS) { return proc.readAllStandardOutput(); } @@ -179,11 +168,8 @@ bool IOFactory::copyFile(const QString& source, const QString& destination) { if (QFile::exists(destination)) { QFile file(destination); - file.setPermissions(file.permissions() | - QFileDevice::WriteOwner | - QFileDevice::WriteUser | - QFileDevice::WriteGroup | - QFileDevice::WriteOther); + file.setPermissions(file.permissions() | QFileDevice::WriteOwner | QFileDevice::WriteUser | + QFileDevice::WriteGroup | QFileDevice::WriteOther); if (!QFile::remove(destination)) { return false; diff --git a/src/librssguard/miscellaneous/iofactory.h b/src/librssguard/miscellaneous/iofactory.h index c23594a18..713740f0c 100644 --- a/src/librssguard/miscellaneous/iofactory.h +++ b/src/librssguard/miscellaneous/iofactory.h @@ -11,7 +11,7 @@ #include class IOFactory { - Q_DECLARE_TR_FUNCTIONS(IOFactory) + Q_DECLARE_TR_FUNCTIONS(IOFactory) private: IOFactory(); @@ -28,9 +28,8 @@ class IOFactory { // Filters out shit characters from filename. static QString filterBadCharsFromFilename(const QString& name); - static bool startProcessDetached(const QString& program, - const QStringList& arguments, - const QString& native_arguments = {}, + static bool startProcessDetached(const QString& executable, + const QStringList& arguments = {}, const QString& working_directory = {}); static void startProcess(QProcess* const proc, const QString& executable, diff --git a/src/librssguard/miscellaneous/notification.cpp b/src/librssguard/miscellaneous/notification.cpp index 235a54778..e243b478a 100644 --- a/src/librssguard/miscellaneous/notification.cpp +++ b/src/librssguard/miscellaneous/notification.cpp @@ -50,14 +50,15 @@ void Notification::playSound(Application* app) const { if (m_soundPath.startsWith(QSL(":"))) { play->setSource(QUrl(QSL("qrc") + m_soundPath)); - } else { - play->setSource(QUrl::fromLocalFile( - QDir::toNativeSeparators(app->replaceDataUserDataFolderPlaceholder(m_soundPath)))); + play + ->setSource(QUrl:: + fromLocalFile(QDir::toNativeSeparators(app + ->replaceDataUserDataFolderPlaceholder(m_soundPath)))); } - play->setVolume(m_volume); + play->setVolume(fractionalVolume()); play->play(); } else { @@ -79,13 +80,15 @@ void Notification::playSound(Application* app) const { if (m_soundPath.startsWith(QSL(":"))) { play->setSource(QUrl(QSL("qrc") + m_soundPath)); - } else { - play->setSource(QUrl::fromLocalFile(QDir::toNativeSeparators(app->replaceDataUserDataFolderPlaceholder(m_soundPath)))); + play + ->setSource(QUrl:: + fromLocalFile(QDir::toNativeSeparators(app + ->replaceDataUserDataFolderPlaceholder(m_soundPath)))); } - play->audioOutput()->setVolume((m_volume * 1.0f) / 100.0f); + play->audioOutput()->setVolume(fractionalVolume()); play->play(); #else QObject::connect(play, &QMediaPlayer::stateChanged, play, [play](QMediaPlayer::State state) { @@ -96,12 +99,10 @@ void Notification::playSound(Application* app) const { if (m_soundPath.startsWith(QSL(":"))) { play->setMedia(QMediaContent(QUrl(QSL("qrc") + m_soundPath))); - } else { play->setMedia(QMediaContent( - QUrl::fromLocalFile( - QDir::toNativeSeparators(app->replaceDataUserDataFolderPlaceholder(m_soundPath))))); + QUrl::fromLocalFile(QDir::toNativeSeparators(app->replaceDataUserDataFolderPlaceholder(m_soundPath))))); } play->setVolume(m_volume); @@ -113,16 +114,14 @@ void Notification::playSound(Application* app) const { } QList Notification::allEvents() { - return { - Event::GeneralEvent, - Event::NewUnreadArticlesFetched, - Event::ArticlesFetchingStarted, - Event::LoginDataRefreshed, - Event::LoginFailure, - Event::NewAppVersionAvailable, - Event::NodePackageUpdated, - Event::NodePackageFailedToUpdate - }; + return {Event::GeneralEvent, + Event::NewUnreadArticlesFetched, + Event::ArticlesFetchingStarted, + Event::LoginDataRefreshed, + Event::LoginFailure, + Event::NewAppVersionAvailable, + Event::NodePackageUpdated, + Event::NodePackageFailedToUpdate}; } QString Notification::nameForEvent(Notification::Event event) { @@ -160,6 +159,10 @@ int Notification::volume() const { return m_volume; } +qreal Notification::fractionalVolume() const { + return (m_volume * 1.0f) / 100.0f; +} + void Notification::setVolume(int volume) { m_volume = volume; } diff --git a/src/librssguard/miscellaneous/notification.h b/src/librssguard/miscellaneous/notification.h index 13727e185..443fe8da7 100644 --- a/src/librssguard/miscellaneous/notification.h +++ b/src/librssguard/miscellaneous/notification.h @@ -43,7 +43,9 @@ class Notification { NodePackageFailedToUpdate = 8 }; - explicit Notification(Event event = Event::NoEvent, bool balloon = {}, const QString& sound_path = {}, + explicit Notification(Event event = Event::NoEvent, + bool balloon = {}, + const QString& sound_path = {}, int volume = DEFAULT_NOTIFICATION_VOLUME); bool balloonEnabled() const; @@ -52,6 +54,7 @@ class Notification { void setEvent(Event event); int volume() const; + qreal fractionalVolume() const; void setVolume(int volume); // Returns full path to audio file which should be played when notification @@ -69,7 +72,7 @@ class Notification { Event m_event; bool m_balloonEnabled; QString m_soundPath; - int m_volume; + qreal m_volume; }; #endif // NOTIFICATION_H diff --git a/src/librssguard/network-web/webfactory.cpp b/src/librssguard/network-web/webfactory.cpp index aea07948f..4116c9192 100644 --- a/src/librssguard/network-web/webfactory.cpp +++ b/src/librssguard/network-web/webfactory.cpp @@ -28,8 +28,7 @@ #include #endif -WebFactory::WebFactory(QObject* parent) - : QObject(parent) { +WebFactory::WebFactory(QObject* parent) : QObject(parent) { m_adBlock = new AdBlockManager(this); #if defined(USE_WEBENGINE) @@ -63,17 +62,21 @@ WebFactory::~WebFactory() { bool WebFactory::sendMessageViaEmail(const Message& message) { if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailEnabled)).toBool()) { - const QString browser = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailExecutable)).toString(); - const QString arguments = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailArguments)).toString(); + const QString browser = + qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailExecutable)).toString(); + const QString arguments = + qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailArguments)).toString(); + const QStringList tokenized_arguments = + TextFactory::tokenizeProcessArguments(arguments.arg(message.m_title, stripTags(message.m_contents))); - return IOFactory::startProcessDetached(browser, {}, arguments.arg(message.m_title, stripTags(message.m_contents))); + return IOFactory::startProcessDetached(browser, tokenized_arguments); } else { // Send it via mailto protocol. // NOTE: http://en.wikipedia.org/wiki/Mailto - return QDesktopServices::openUrl(QSL("mailto:?subject=%1&body=%2").arg(QString(QUrl::toPercentEncoding(message.m_title)), - QString(QUrl::toPercentEncoding(stripTags( - message.m_contents))))); + return QDesktopServices::openUrl(QSL("mailto:?subject=%1&body=%2") + .arg(QString(QUrl::toPercentEncoding(message.m_title)), + QString(QUrl::toPercentEncoding(stripTags(message.m_contents))))); } } @@ -83,13 +86,15 @@ bool WebFactory::openUrlInExternalBrowser(const QString& url) const { bool result = false; if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserEnabled)).toBool()) { - const QString browser = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserExecutable)).toString(); - const QString arguments = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserArguments)).toString(); - auto nice_args = arguments.arg(url); + const QString browser = + qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserExecutable)).toString(); + const QString arguments = + qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserArguments)).toString(); + const auto nice_args = arguments.arg(url); qDebugNN << LOGSEC_NETWORK << "Arguments for external browser:" << QUOTE_W_SPACE_DOT(nice_args); - result = IOFactory::startProcessDetached(browser, {}, nice_args); + result = IOFactory::startProcessDetached(browser, TextFactory::tokenizeProcessArguments(nice_args)); if (!result) { qDebugNN << LOGSEC_NETWORK << "External web browser call failed."; @@ -105,7 +110,8 @@ bool WebFactory::openUrlInExternalBrowser(const QString& url) const { QMessageBox::Icon::Critical, tr("Navigate to website manually"), tr("%1 was unable to launch your web browser with the given URL, you need to open the " - "below website URL in your web browser manually.").arg(QSL(APP_NAME)), + "below website URL in your web browser manually.") + .arg(QSL(APP_NAME)), {}, url, QMessageBox::StandardButton::Ok); @@ -127,10 +133,11 @@ QString WebFactory::unescapeHtml(const QString& html) { generateUnescapes(); } - QString output; output.reserve(html.size()); + QString output; + output.reserve(html.size()); // Traverse input HTML string and replace named/number entities. - for (int pos = 0; pos < html.size(); ) { + for (int pos = 0; pos < html.size();) { const QChar first = html.at(pos); if (first == QChar('&')) { @@ -223,9 +230,8 @@ QString WebFactory::processFeedUriScheme(const QString& url) { } void WebFactory::updateProxy() { - const QNetworkProxy::ProxyType selected_proxy_type = static_cast(qApp->settings()->value(GROUP(Proxy), - SETTING(Proxy::Type)). - toInt()); + const QNetworkProxy::ProxyType selected_proxy_type = + static_cast(qApp->settings()->value(GROUP(Proxy), SETTING(Proxy::Type)).toInt()); if (selected_proxy_type == QNetworkProxy::NoProxy) { qDebugNN << LOGSEC_NETWORK << "Disabling application-wide proxy completely."; @@ -249,10 +255,8 @@ void WebFactory::updateProxy() { new_proxy.setPassword(settings->password(GROUP(Proxy), SETTING(Proxy::Password)).toString()); qWarningNN << LOGSEC_NETWORK - << "Activating application-wide custom proxy, address:" - << QUOTE_W_SPACE_COMMA(new_proxy.hostName()) - << " type:" - << QUOTE_W_SPACE_DOT(new_proxy.type()); + << "Activating application-wide custom proxy, address:" << QUOTE_W_SPACE_COMMA(new_proxy.hostName()) + << " type:" << QUOTE_W_SPACE_DOT(new_proxy.type()); QNetworkProxy::setApplicationProxy(new_proxy); } @@ -269,7 +273,8 @@ NetworkUrlInterceptor* WebFactory::urlIinterceptor() const { QAction* WebFactory::engineSettingsAction() { if (m_engineSettings == nullptr) { - m_engineSettings = new QAction(qApp->icons()->fromTheme(QSL("applications-internet")), tr("Web engine settings"), this); + m_engineSettings = + new QAction(qApp->icons()->fromTheme(QSL("applications-internet")), tr("Web engine settings"), this); m_engineSettings->setMenu(new QMenu()); createMenu(m_engineSettings->menu()); connect(m_engineSettings->menu(), &QMenu::aboutToShow, this, [this]() { @@ -294,35 +299,56 @@ void WebFactory::createMenu(QMenu* menu) { actions << createEngineSettingsAction(tr("Auto-load images"), QWebEngineSettings::WebAttribute::AutoLoadImages); actions << createEngineSettingsAction(tr("JS enabled"), QWebEngineSettings::WebAttribute::JavascriptEnabled); - actions << createEngineSettingsAction(tr("JS can open popup windows"), QWebEngineSettings::WebAttribute::JavascriptCanOpenWindows); - actions << createEngineSettingsAction(tr("JS can access clipboard"), QWebEngineSettings::WebAttribute::JavascriptCanAccessClipboard); - actions << createEngineSettingsAction(tr("Hyperlinks can get focus"), QWebEngineSettings::WebAttribute::LinksIncludedInFocusChain); - actions << createEngineSettingsAction(tr("Local storage enabled"), QWebEngineSettings::WebAttribute::LocalStorageEnabled); - actions << createEngineSettingsAction(tr("Local content can access remote URLs"), QWebEngineSettings::WebAttribute::LocalContentCanAccessRemoteUrls); - actions << createEngineSettingsAction(tr("XSS auditing enabled"), QWebEngineSettings::WebAttribute::XSSAuditingEnabled); - actions << createEngineSettingsAction(tr("Spatial navigation enabled"), QWebEngineSettings::WebAttribute::SpatialNavigationEnabled); - actions << createEngineSettingsAction(tr("Local content can access local files"), QWebEngineSettings::WebAttribute::LocalContentCanAccessFileUrls); - actions << createEngineSettingsAction(tr("Hyperlink auditing enabled"), QWebEngineSettings::WebAttribute::HyperlinkAuditingEnabled); - actions << createEngineSettingsAction(tr("Animate scrolling"), QWebEngineSettings::WebAttribute::ScrollAnimatorEnabled); + actions << createEngineSettingsAction(tr("JS can open popup windows"), + QWebEngineSettings::WebAttribute::JavascriptCanOpenWindows); + actions << createEngineSettingsAction(tr("JS can access clipboard"), + QWebEngineSettings::WebAttribute::JavascriptCanAccessClipboard); + actions << createEngineSettingsAction(tr("Hyperlinks can get focus"), + QWebEngineSettings::WebAttribute::LinksIncludedInFocusChain); + actions << createEngineSettingsAction(tr("Local storage enabled"), + QWebEngineSettings::WebAttribute::LocalStorageEnabled); + actions << createEngineSettingsAction(tr("Local content can access remote URLs"), + QWebEngineSettings::WebAttribute::LocalContentCanAccessRemoteUrls); + actions << createEngineSettingsAction(tr("XSS auditing enabled"), + QWebEngineSettings::WebAttribute::XSSAuditingEnabled); + actions << createEngineSettingsAction(tr("Spatial navigation enabled"), + QWebEngineSettings::WebAttribute::SpatialNavigationEnabled); + actions << createEngineSettingsAction(tr("Local content can access local files"), + QWebEngineSettings::WebAttribute::LocalContentCanAccessFileUrls); + actions << createEngineSettingsAction(tr("Hyperlink auditing enabled"), + QWebEngineSettings::WebAttribute::HyperlinkAuditingEnabled); + actions << createEngineSettingsAction(tr("Animate scrolling"), + QWebEngineSettings::WebAttribute::ScrollAnimatorEnabled); actions << createEngineSettingsAction(tr("Error pages enabled"), QWebEngineSettings::WebAttribute::ErrorPageEnabled); actions << createEngineSettingsAction(tr("Plugins enabled"), QWebEngineSettings::WebAttribute::PluginsEnabled); - actions << createEngineSettingsAction(tr("Fullscreen enabled"), QWebEngineSettings::WebAttribute::FullScreenSupportEnabled); + actions << createEngineSettingsAction(tr("Fullscreen enabled"), + QWebEngineSettings::WebAttribute::FullScreenSupportEnabled); #if !defined(Q_OS_UNIX) && !defined(Q_OS_MACOS) - actions << createEngineSettingsAction(tr("Screen capture enabled"), QWebEngineSettings::WebAttribute::ScreenCaptureEnabled); + actions << createEngineSettingsAction(tr("Screen capture enabled"), + QWebEngineSettings::WebAttribute::ScreenCaptureEnabled); actions << createEngineSettingsAction(tr("WebGL enabled"), QWebEngineSettings::WebAttribute::WebGLEnabled); - actions << createEngineSettingsAction(tr("Accelerate 2D canvas"), QWebEngineSettings::WebAttribute::Accelerated2dCanvasEnabled); - actions << createEngineSettingsAction(tr("Print element backgrounds"), QWebEngineSettings::WebAttribute::PrintElementBackgrounds); - actions << createEngineSettingsAction(tr("Allow running insecure content"), QWebEngineSettings::WebAttribute::AllowRunningInsecureContent); - actions << createEngineSettingsAction(tr("Allow geolocation on insecure origins"), QWebEngineSettings::WebAttribute::AllowGeolocationOnInsecureOrigins); + actions << createEngineSettingsAction(tr("Accelerate 2D canvas"), + QWebEngineSettings::WebAttribute::Accelerated2dCanvasEnabled); + actions << createEngineSettingsAction(tr("Print element backgrounds"), + QWebEngineSettings::WebAttribute::PrintElementBackgrounds); + actions << createEngineSettingsAction(tr("Allow running insecure content"), + QWebEngineSettings::WebAttribute::AllowRunningInsecureContent); + actions << createEngineSettingsAction(tr("Allow geolocation on insecure origins"), + QWebEngineSettings::WebAttribute::AllowGeolocationOnInsecureOrigins); #endif - actions << createEngineSettingsAction(tr("JS can activate windows"), QWebEngineSettings::WebAttribute::AllowWindowActivationFromJavaScript); + actions << createEngineSettingsAction(tr("JS can activate windows"), + QWebEngineSettings::WebAttribute::AllowWindowActivationFromJavaScript); actions << createEngineSettingsAction(tr("Show scrollbars"), QWebEngineSettings::WebAttribute::ShowScrollBars); - actions << createEngineSettingsAction(tr("Media playback with gestures"), QWebEngineSettings::WebAttribute::PlaybackRequiresUserGesture); - actions << createEngineSettingsAction(tr("WebRTC uses only public interfaces"), QWebEngineSettings::WebAttribute::WebRTCPublicInterfacesOnly); - actions << createEngineSettingsAction(tr("JS can paste from clipboard"), QWebEngineSettings::WebAttribute::JavascriptCanPaste); - actions << createEngineSettingsAction(tr("DNS prefetch enabled"), QWebEngineSettings::WebAttribute::DnsPrefetchEnabled); + actions << createEngineSettingsAction(tr("Media playback with gestures"), + QWebEngineSettings::WebAttribute::PlaybackRequiresUserGesture); + actions << createEngineSettingsAction(tr("WebRTC uses only public interfaces"), + QWebEngineSettings::WebAttribute::WebRTCPublicInterfacesOnly); + actions << createEngineSettingsAction(tr("JS can paste from clipboard"), + QWebEngineSettings::WebAttribute::JavascriptCanPaste); + actions << createEngineSettingsAction(tr("DNS prefetch enabled"), + QWebEngineSettings::WebAttribute::DnsPrefetchEnabled); #if QT_VERSION >= 0x050D00 // Qt >= 5.13.0 actions << createEngineSettingsAction(tr("PDF viewer enabled"), QWebEngineSettings::WebAttribute::PdfViewerEnabled); @@ -345,7 +371,9 @@ QAction* WebFactory::createEngineSettingsAction(const QString& title, QWebEngine act->setData(attribute); act->setCheckable(true); - act->setChecked(qApp->settings()->value(WebEngineAttributes::ID, QString::number(static_cast(attribute)), true).toBool()); + act->setChecked(qApp->settings() + ->value(WebEngineAttributes::ID, QString::number(static_cast(attribute)), true) + .toBool()); QWebEngineProfile::defaultProfile()->settings()->setAttribute(attribute, act->isChecked()); connect(act, &QAction::toggled, this, &WebFactory::webEngineSettingChanged); return act;