From 908ab1e805d98cd79a36ba6bda3c3a9c8d0a99ca Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Thu, 16 Apr 2020 22:09:58 +0300 Subject: Parse type options into std::bitset --- staging/adblock/options.cpp | 148 ++++++++++++++++++++------------------------ 1 file changed, 67 insertions(+), 81 deletions(-) (limited to 'staging/adblock/options.cpp') 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 . + "__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; } -- cgit v1.2.1