aboutsummaryrefslogtreecommitdiff
path: root/staging/adblock/options.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'staging/adblock/options.cpp')
-rw-r--r--staging/adblock/options.cpp148
1 files changed, 67 insertions, 81 deletions
diff --git a/staging/adblock/options.cpp b/staging/adblock/options.cpp
index a748a68..08f30ee 100644
--- a/staging/adblock/options.cpp
+++ b/staging/adblock/options.cpp
@@ -10,99 +10,85 @@
using namespace AdblockPlus;
-bool Options::parseAbp(QStringRef &option)
+constexpr std::array abpTypeOptions = {
+ "document", // ResourceTypeMainFrame 0 Top level page.
+ "subdocument", // ResourceTypeSubFrame 1 Frame or iframe.
+ "stylesheet", // ResourceTypeStylesheet 2 A CSS stylesheet.
+ "script", // ResourceTypeScript 3 An external script.
+ "image", // ResourceTypeImage 4 An image (JPG, GIF, PNG, and so on).
+ "font", // ResourceTypeFontResource 5 A font.
+ "other", // ResourceTypeSubResource 6 An "other" subresource.
+ "object", // ResourceTypeObject 7 An object (or embed) tag for a plugin or a resource that a plugin requested.
+ "media", // ResourceTypeMedia 8 A media resource.
+ "__worker", // ResourceTypeWorker 9 The main resource of a dedicated worker.
+ "__sharedworker", // ResourceTypeSharedWorker 10 The main resource of a shared worker.
+ "__prefetch", // ResourceTypePrefetch 11 An explicitly requested prefetch.
+ "__favicon", // ResourceTypeFavicon 12 A favicon.
+ "xmlhttprequest", // ResourceTypeXhr 13 An XMLHttpRequest.
+ "ping", // ResourceTypePing 14 A ping request for <a ping>.
+ "__serviceworker", // ResourceTypeServiceWorker 15 The main resource of a service worker.
+ "__cspreport", // ResourceTypeCspReport 16 A report of Content Security Policy (CSP) violations.
+ "__pluginresource", // ResourceTypePluginResource 17 A resource requested by a plugin.
+ "__preloadmainframe", // ResourceTypeNavigationPreloadMainFrame 19 A main-frame service worker navigation preload request.
+ "__preloadsubframe", // ResourceTypeNavigationPreloadSubFrame 20 A sub-frame service worker navigation preload request.
+ "__unknown" // ResourceTypeUnknown 255 Unknown request type.
+};
+
+auto parseTypeOption(QStringRef &option)
{
- // pattern options
- if(option == "match-case") {
- matchcase = true;
- return true;
- }
+ struct {
+ bool found = false;
+ int index = -1;
+ bool exception = false;
+ } ret;
// Possible inverse type options include ~script, ~image, ~stylesheet, ~object,
// ~xmlhttprequest, ~subdocument, ~ping, ~websocket, ~webrtc, ~document, ~elemhide, ~other
- const bool exception = option.startsWith('~');
- if(exception) {
+ if(option[0] == '~') {
+ ret.exception = true;
option = option.mid(1);
}
// TODO: map all ResourceType's to their respective strings
// TODO: websocket, webrtc, elemhide, generichide, genericblock, popup
- if(option == "document") {
- resource_options[QWebEngineUrlRequestInfo::ResourceTypeMainFrame] = !exception;
- return true;
- }
-
- else if(option == "subdocument") {
- resource_options[QWebEngineUrlRequestInfo::ResourceTypeSubFrame] = !exception;
- return true;
- }
-
- else if(option == "stylesheet") {
- resource_options[QWebEngineUrlRequestInfo::ResourceTypeStylesheet] = !exception;
- return true;
- }
-
- else if(option == "script") {
- resource_options[QWebEngineUrlRequestInfo::ResourceTypeScript] = !exception;
- return true;
- }
-
- else if(option == "image") {
- resource_options[QWebEngineUrlRequestInfo::ResourceTypeImage] = !exception;
- return true;
- }
-
- else if(option == "font") {
- resource_options[QWebEngineUrlRequestInfo::ResourceTypeFontResource] = !exception;
- return true;
- }
-
- else if(option == "other") {
- // An "other" subresource.
- resource_options[QWebEngineUrlRequestInfo::ResourceTypeSubResource] = !exception;
- return true;
- }
-
- else if(option == "object") {
- resource_options[QWebEngineUrlRequestInfo::ResourceTypeObject] = !exception;
- return true;
- }
-
- else if(option == "media") {
- resource_options[QWebEngineUrlRequestInfo::ResourceTypeMedia] = !exception;
- return true;
- }
- /*
-QWebEngineUrlRequestInfo::ResourceTypeWorker 9 The main resource of a dedicated worker.
-QWebEngineUrlRequestInfo::ResourceTypeSharedWorker 10 The main resource of a shared worker.
-QWebEngineUrlRequestInfo::ResourceTypePrefetch 11 An explicitly requested prefetch.
-QWebEngineUrlRequestInfo::ResourceTypeFavicon 12 A favicon.
-*/
- else if(option == "xmlhttprequest") {
- resource_options[QWebEngineUrlRequestInfo::ResourceTypeXhr] = !exception;
- return true;
- }
-
- else if(option == "ping") {
- resource_options[QWebEngineUrlRequestInfo::ResourceTypePing] = !exception;
- return true;
+ for(std::size_t i = 0; i < std::size(abpTypeOptions); ++i) {
+ if(option == abpTypeOptions[i]) {
+ ret.index = i;
+ ret.found = true;
+ return ret;
+ }
}
+ return ret;
+}
- /*
-QWebEngineUrlRequestInfo::ResourceTypeServiceWorker 15 The main resource of a service worker.
-QWebEngineUrlRequestInfo::ResourceTypeCspReport 16 A report of Content Security Policy (CSP) violations. CSP reports are in JSON format and they are delivered by HTTP POST requests to specified servers. (Added in Qt 5.7)
-QWebEngineUrlRequestInfo::ResourceTypePluginResource 17 A resource requested by a plugin. (Added in Qt 5.7)
-QWebEngineUrlRequestInfo::ResourceTypeNavigationPreloadMainFrame 19 A main-frame service worker navigation preload request. (Added in Qt 5.14)
-QWebEngineUrlRequestInfo::ResourceTypeNavigationPreloadSubFrame 20 A sub-frame service worker navigation preload request. (Added in Qt 5.14)
-QWebEngineUrlRequestInfo::ResourceTypeUnknown 255 Unknown request type.
- */
-
- // Restriction to third-party/first-party requests
- else if(option == "third-party") {
- thirdparty = !exception;
- return true;
+bool Options::parseAbp(const QStringRef &options)
+{
+ std::bitset<32> checked_flags;
+
+ for(auto &option : options.split(',')) {
+ if(option == "match-case") {
+ matchcase = true;
+
+ } else if(option == "third-party") {
+ thirdparty = !exception;
+ } else if(const auto r = parseTypeOption(option); r.found) {
+ if(!r.exception) {
+ flags.set(r.index, true);
+ checked_flags.set(r.index, true);
+ } else {
+ flags.set(r.index, false);
+ checked_flags.set(r.index, true);
+ for(auto i = 0; i < 32; ++i) {
+ if(!checked_flags[i]) {
+ flags.set(i, true);
+ }
+ }
+ }
+ } else {
+ return false;
+ }
}
- return false;
+ return true;
}