Browse Source

Release 72.0.3626.120

csagan5 6 years ago
parent
commit
a672f8d057

+ 7 - 0
CHANGELOG.md

@@ -1,3 +1,10 @@
+# 72.0.3626.120
+* add support for resource type in adblock engine (fixes https://github.com/bromite/bromite/issues/115)
+* adblock engine speed optimizations
+* use adblock engine also in SystemWebView
+* add back uBlock Origin and EasyList filters
+* added Fanboy's Annoyance List
+
 # 72.0.3626.119
 # 72.0.3626.119
 * use AdGuard filters
 * use AdGuard filters
 * fixes for new tile rows usage
 * fixes for new tile rows usage

+ 4 - 2
README.md

@@ -151,8 +151,10 @@ The patches are to be applied second the order specified in the `patches_list.tx
 * [Vadim Pleshkov](http://vadimpleshkov.me/) for Bromite's logo
 * [Vadim Pleshkov](http://vadimpleshkov.me/) for Bromite's logo
 
 
 # Filters credits
 # Filters credits
-* [AdGuard](https://kb.adguard.com/en/general/adguard-ad-filters) for the English, Malware, Social media and Mobile filters
-* [uBlock Origin](https://github.com/uBlockOrigin) for the privacy filter
+* [EasyList](https://easylist.to/#easylist)
+* [EasyPrivacy](https://easylist.to/#easyprivacy)
+* [Fanboy's Annoyance List](https://easylist.to/#fanboy-s-annoyance-list)
+* [uBlock Origin](https://github.com/uBlockOrigin)
 * [Peter Lowe's adservers list](https://pgl.yoyo.org/adservers/)
 * [Peter Lowe's adservers list](https://pgl.yoyo.org/adservers/)
 
 
 # License
 # License

File diff suppressed because it is too large
+ 325 - 139
build/filters/adblock_entries.h


+ 267 - 119
build/patches/Bromite-adblock-engine.patch

@@ -10,23 +10,127 @@ Add menu option to toggle global Adblock preference
 Allow toggling Chromium's "ads enabled" content settings option together with Bromite adblock engine.
 Allow toggling Chromium's "ads enabled" content settings option together with Bromite adblock engine.
 Perform adblock interception in StartJob to address lagging issues
 Perform adblock interception in StartJob to address lagging issues
 New mechanism for adblocking based on Brave's adblocking hook
 New mechanism for adblocking based on Brave's adblocking hook
+Add support for Webview content blocking
 ---
 ---
+ android_webview/browser/net/aw_network_delegate.cc |  68 ++++
+ android_webview/browser/net/aw_network_delegate.h  |   3 +
  chrome/android/java/res/menu/custom_tabs_menu.xml  |  12 +
  chrome/android/java/res/menu/custom_tabs_menu.xml  |  12 +
  chrome/android/java/res/menu/main_menu.xml         |  11 +
  chrome/android/java/res/menu/main_menu.xml         |  11 +
  .../chromium/chrome/browser/ChromeActivity.java    |   8 +
  .../chromium/chrome/browser/ChromeActivity.java    |   8 +
  .../chrome/browser/ChromeTabbedActivity.java       |   8 +
  .../chrome/browser/ChromeTabbedActivity.java       |   8 +
- .../browser/appmenu/AppMenuPropertiesDelegate.java |  38 +++
+ .../browser/appmenu/AppMenuPropertiesDelegate.java |  38 ++
  .../CustomTabAppMenuPropertiesDelegate.java        |   2 +
  .../CustomTabAppMenuPropertiesDelegate.java        |   2 +
  .../java/strings/android_chrome_strings.grd        |  11 +
  .../java/strings/android_chrome_strings.grd        |  11 +
- chrome/browser/net/chrome_network_delegate.cc      |  75 +++++
+ chrome/browser/net/chrome_network_delegate.cc      |  83 +++++
  .../subresource_filter_content_settings_manager.cc |   1 +
  .../subresource_filter_content_settings_manager.cc |   1 +
  net/BUILD.gn                                       |   7 +
  net/BUILD.gn                                       |   7 +
- net/url_request/adblock_intercept.cc               | 341 +++++++++++++++++++++
- net/url_request/adblock_intercept.h                |  41 +++
- 12 files changed, 555 insertions(+)
+ net/url_request/adblock_intercept.cc               | 389 +++++++++++++++++++++
+ net/url_request/adblock_intercept.h                |  35 ++
+ 14 files changed, 676 insertions(+)
  create mode 100644 net/url_request/adblock_intercept.cc
  create mode 100644 net/url_request/adblock_intercept.cc
  create mode 100644 net/url_request/adblock_intercept.h
  create mode 100644 net/url_request/adblock_intercept.h
 
 
+diff --git a/android_webview/browser/net/aw_network_delegate.cc b/android_webview/browser/net/aw_network_delegate.cc
+--- a/android_webview/browser/net/aw_network_delegate.cc
++++ b/android_webview/browser/net/aw_network_delegate.cc
+@@ -19,9 +19,11 @@
+ #include "net/base/proxy_server.h"
+ #include "net/http/http_response_headers.h"
+ #include "net/proxy_resolution/proxy_info.h"
++#include "net/url_request/adblock_intercept.h"
+ #include "net/url_request/url_request.h"
+ 
+ using content::BrowserThread;
++using content::ResourceRequestInfo;
+ 
+ namespace android_webview {
+ 
+@@ -48,6 +50,72 @@ AwNetworkDelegate::AwNetworkDelegate() {}
+ AwNetworkDelegate::~AwNetworkDelegate() {
+ }
+ 
++#define TRANSPARENT1PXGIF "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
++#define EMPTYJS "data:text/javascript;base64,Cg=="
++#define EMPTYCSS "data:text/css;base64,Cg=="
++
++static bool requestIntercepted(net::URLRequest* request, GURL* new_url) {
++    bool block = false, isValidUrl;
++
++    isValidUrl = request->url().is_valid();
++    std::string scheme = request->url().scheme();
++    if (isValidUrl && scheme.length()) {
++      std::transform(scheme.begin(), scheme.end(), scheme.begin(), ::tolower);
++        if ("http" != scheme && "https" != scheme) {
++          isValidUrl = false;
++        }
++    }
++    const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request);
++
++    // there are no per-site nor global ad/content settings when using the SystemWebView
++    bool adblock_enabled = true;
++    if (isValidUrl && info) {
++      auto resource_type = info->GetResourceType();
++
++      if (adblock_enabled
++        && content::RESOURCE_TYPE_MAIN_FRAME != resource_type
++        && net::adblock_intercept(request->url(),
++                                request->initiator()->host(),
++                                resource_type)) {
++        block = true;
++      }
++
++      if (block) {
++        switch (resource_type) {
++          case content::RESOURCE_TYPE_IMAGE:
++          case content::RESOURCE_TYPE_FAVICON:
++            *new_url = GURL(TRANSPARENT1PXGIF);
++            break;
++          case content::RESOURCE_TYPE_SCRIPT:
++            *new_url = GURL(EMPTYJS);
++            break;
++          case content::RESOURCE_TYPE_STYLESHEET:
++            *new_url = GURL(EMPTYCSS);
++            break;
++          default:
++            *new_url = GURL("");
++            return true;
++        }
++      }
++    } // valid URL and info
++  return false;
++}
++#undef TRANSPARENT1PXGIF
++#undef EMPTYJS
++#undef EMPTYCSS
++
++int AwNetworkDelegate::OnBeforeURLRequest(net::URLRequest* request,
++                         net::CompletionOnceCallback callback,
++                         GURL* new_url) {
++  if (request) {
++    // most requests will be modified rather than intercepted
++    if (requestIntercepted(request, new_url))
++      return net::ERR_BLOCKED_BY_ADMINISTRATOR;
++  } // request
++
++  return net::OK;
++}
++
+ int AwNetworkDelegate::OnBeforeStartTransaction(
+     net::URLRequest* request,
+     net::CompletionOnceCallback callback,
+diff --git a/android_webview/browser/net/aw_network_delegate.h b/android_webview/browser/net/aw_network_delegate.h
+--- a/android_webview/browser/net/aw_network_delegate.h
++++ b/android_webview/browser/net/aw_network_delegate.h
+@@ -22,6 +22,9 @@ class AwNetworkDelegate : public net::NetworkDelegateImpl {
+ 
+  private:
+   // NetworkDelegate implementation.
++  int OnBeforeURLRequest(net::URLRequest* request,
++                         net::CompletionOnceCallback callback,
++                         GURL* new_url) override;
+   int OnBeforeStartTransaction(net::URLRequest* request,
+                                net::CompletionOnceCallback callback,
+                                net::HttpRequestHeaders* headers) override;
 diff --git a/chrome/android/java/res/menu/custom_tabs_menu.xml b/chrome/android/java/res/menu/custom_tabs_menu.xml
 diff --git a/chrome/android/java/res/menu/custom_tabs_menu.xml b/chrome/android/java/res/menu/custom_tabs_menu.xml
 --- a/chrome/android/java/res/menu/custom_tabs_menu.xml
 --- a/chrome/android/java/res/menu/custom_tabs_menu.xml
 +++ b/chrome/android/java/res/menu/custom_tabs_menu.xml
 +++ b/chrome/android/java/res/menu/custom_tabs_menu.xml
@@ -213,7 +317,7 @@ diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/
  #endif
  #endif
  
  
  #if defined(OS_CHROMEOS)
  #if defined(OS_CHROMEOS)
-@@ -193,16 +195,89 @@ void ChromeNetworkDelegate::set_cookie_settings(
+@@ -193,10 +195,91 @@ void ChromeNetworkDelegate::set_cookie_settings(
    cookie_settings_ = cookie_settings;
    cookie_settings_ = cookie_settings;
  }
  }
  
  
@@ -221,13 +325,7 @@ diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/
 +#define EMPTYJS "data:text/javascript;base64,Cg=="
 +#define EMPTYJS "data:text/javascript;base64,Cg=="
 +#define EMPTYCSS "data:text/css;base64,Cg=="
 +#define EMPTYCSS "data:text/css;base64,Cg=="
 +
 +
- int ChromeNetworkDelegate::OnBeforeURLRequest(
-     net::URLRequest* request,
-     net::CompletionOnceCallback callback,
-     GURL* new_url) {
-+
-+#if defined(OS_ANDROID)
-+  if (request) {
++static bool requestIntercepted(net::URLRequest* request, GURL* new_url) {
 +    bool block = false, isValidUrl;
 +    bool block = false, isValidUrl;
 +
 +
 +    isValidUrl = request->url().is_valid();
 +    isValidUrl = request->url().is_valid();
@@ -261,16 +359,18 @@ diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/
 +        }
 +        }
 +      }
 +      }
 +
 +
++      auto resource_type = info->GetResourceType();
++
 +      if (adblock_enabled
 +      if (adblock_enabled
-+        && content::RESOURCE_TYPE_MAIN_FRAME != info->GetResourceType()
++        && content::RESOURCE_TYPE_MAIN_FRAME != resource_type
 +        && net::adblock_intercept(request->url(),
 +        && net::adblock_intercept(request->url(),
 +                                request->initiator()->host(),
 +                                request->initiator()->host(),
-+                                info->GetResourceType())) {
++                                resource_type)) {
 +        block = true;
 +        block = true;
 +      }
 +      }
 +
 +
 +      if (block) {
 +      if (block) {
-+        switch (info->GetResourceType()) {
++        switch (resource_type) {
 +          case content::RESOURCE_TYPE_IMAGE:
 +          case content::RESOURCE_TYPE_IMAGE:
 +          case content::RESOURCE_TYPE_FAVICON:
 +          case content::RESOURCE_TYPE_FAVICON:
 +            *new_url = GURL(TRANSPARENT1PXGIF);
 +            *new_url = GURL(TRANSPARENT1PXGIF);
@@ -283,26 +383,32 @@ diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/
 +            break;
 +            break;
 +          default:
 +          default:
 +            *new_url = GURL("");
 +            *new_url = GURL("");
-+            return net::ERR_BLOCKED_BY_ADMINISTRATOR;
++            return true;
 +        }
 +        }
 +      }
 +      }
 +    } // valid URL and info
 +    } // valid URL and info
-+  } // request
-+#endif // OS_ANDROID
-+
-   extensions_delegate_->ForwardStartRequestStatus(request);
- 
-   return extensions_delegate_->NotifyBeforeURLRequest(
-       request, std::move(callback), new_url);
- }
- 
++  return false;
++}
 +#undef TRANSPARENT1PXGIF
 +#undef TRANSPARENT1PXGIF
 +#undef EMPTYJS
 +#undef EMPTYJS
 +#undef EMPTYCSS
 +#undef EMPTYCSS
 +
 +
- int ChromeNetworkDelegate::OnBeforeStartTransaction(
+ int ChromeNetworkDelegate::OnBeforeURLRequest(
      net::URLRequest* request,
      net::URLRequest* request,
      net::CompletionOnceCallback callback,
      net::CompletionOnceCallback callback,
+     GURL* new_url) {
++
++#if defined(OS_ANDROID)
++  if (request) {
++    // most requests will be modified rather than intercepted
++    if (requestIntercepted(request, new_url))
++      return net::ERR_BLOCKED_BY_ADMINISTRATOR;
++  } // request
++#endif // OS_ANDROID
++
+   extensions_delegate_->ForwardStartRequestStatus(request);
+ 
+   return extensions_delegate_->NotifyBeforeURLRequest(
 diff --git a/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc
 diff --git a/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc
 --- a/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc
 --- a/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc
 +++ b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc
 +++ b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc
@@ -335,7 +441,7 @@ diff --git a/net/url_request/adblock_intercept.cc b/net/url_request/adblock_inte
 new file mode 100644
 new file mode 100644
 --- /dev/null
 --- /dev/null
 +++ b/net/url_request/adblock_intercept.cc
 +++ b/net/url_request/adblock_intercept.cc
-@@ -0,0 +1,341 @@
+@@ -0,0 +1,389 @@
 +/*
 +/*
 +    This file is part of Bromite.
 +    This file is part of Bromite.
 +
 +
@@ -352,7 +458,7 @@ new file mode 100644
 +    You should have received a copy of the GNU General Public License
 +    You should have received a copy of the GNU General Public License
 +    along with Bromite. If not, see <https://www.gnu.org/licenses/>.
 +    along with Bromite. If not, see <https://www.gnu.org/licenses/>.
 +*/
 +*/
-+#include "url/gurl.h"
++#include "adblock_intercept.h"
 +
 +
 +#ifdef ADB_TESTER
 +#ifdef ADB_TESTER
 +#include <cstddef>
 +#include <cstddef>
@@ -364,7 +470,6 @@ new file mode 100644
 +
 +
 +#else
 +#else
 +
 +
-+#include "content/public/common/resource_type.h"
 +#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
 +#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
 +#include <android/log.h>
 +#include <android/log.h>
 +
 +
@@ -384,7 +489,8 @@ new file mode 100644
 +// with a valid TLD. If |subdomain_permission| is ALLOW_SUBDOMAIN, we check
 +// with a valid TLD. If |subdomain_permission| is ALLOW_SUBDOMAIN, we check
 +// against host "*.<domain_in_lower_case>.<TLD>" instead. Will return the TLD
 +// against host "*.<domain_in_lower_case>.<TLD>" instead. Will return the TLD
 +// string in |tld|, if specified and the |host| can be parsed.
 +// string in |tld|, if specified and the |host| can be parsed.
-+static bool is_first_party(char *l_host, char *l_url_host) {
++static bool is_first_party(const char *l_host, int len, const char *l_url_host,
++                           int b_len) {
 +  size_t tld_length;
 +  size_t tld_length;
 +
 +
 +#ifdef ADB_TESTER
 +#ifdef ADB_TESTER
@@ -403,15 +509,14 @@ new file mode 100644
 +    return false;
 +    return false;
 +#endif
 +#endif
 +
 +
-+  int len = strlen(l_host);
-+  char *tld = l_host + len - tld_length;
++  const char *tld = l_host + len - tld_length;
 +
 +
 +  // Removes any subdomain from origin host.
 +  // Removes any subdomain from origin host.
 +  int i = len - tld_length - 2, top_i = i;
 +  int i = len - tld_length - 2, top_i = i;
 +  if (i < 0) {
 +  if (i < 0) {
 +    return false;
 +    return false;
 +  }
 +  }
-+  char *domain = l_host;
++  const char *domain = l_host;
 +  for (; i >= 0; i--) {
 +  for (; i >= 0; i--) {
 +    if (l_host[i] == '.') {
 +    if (l_host[i] == '.') {
 +      int p_len = top_i - i;
 +      int p_len = top_i - i;
@@ -435,7 +540,6 @@ new file mode 100644
 +#endif
 +#endif
 +
 +
 +  // Check if supplied URL host matches, including the dot.
 +  // Check if supplied URL host matches, including the dot.
-+  int b_len = strlen(l_url_host);
 +  if (b_len < len) {
 +  if (b_len < len) {
 +    return false;
 +    return false;
 +  }
 +  }
@@ -448,26 +552,38 @@ new file mode 100644
 +  return true;
 +  return true;
 +}
 +}
 +
 +
-+static char *strtolower(const char *str) {
-+  int len = strlen(str);
-+  char *ret = (char *)malloc(len + 1);
-+  ret[len] = '\0';
++static char *strtolower(const char *str, int len, bool &should_free) {
++  char *ret = NULL;
 +  for (int i = 0; i < len; i++) {
 +  for (int i = 0; i < len; i++) {
 +    if ((65 <= str[i]) && (str[i] <= 90)) {
 +    if ((65 <= str[i]) && (str[i] <= 90)) {
++      // first time a difference is found, allocate buffer and copy previous
++      // characters (if any)
++      if (ret == NULL) {
++        ret = (char *)malloc(len + 1);
++        if (i != 0)
++          memcpy(ret, str, i);
++      }
++      // convert character to lower case
 +      ret[i] = str[i] + 32;
 +      ret[i] = str[i] + 32;
 +    } else {
 +    } else {
-+      ret[i] = str[i];
++      if (ret != NULL)
++        ret[i] = str[i];
 +    }
 +    }
 +  }
 +  }
-+  return ret;
++
++  if (ret != NULL) {
++    ret[len] = '\0';
++    should_free = true;
++    return ret;
++  }
++
++  // return source, unchanged
++  return (char *)str;
 +}
 +}
 +
 +
-+static char *strtosep(const char *str) {
-+  int len = strlen(str);
++static char *strtosep(const char *str, int len) {
 +  char *ret = (char *)malloc(len + 3);
 +  char *ret = (char *)malloc(len + 3);
 +  ret[0] = '^';
 +  ret[0] = '^';
-+  ret[len + 1] = '^';
-+  ret[len + 2] = '\0';
 +  for (int i = 0; i < len; i++) {
 +  for (int i = 0; i < len; i++) {
 +    if ((str[i] == ':') || (str[i] == '/') || (str[i] == '?') ||
 +    if ((str[i] == ':') || (str[i] == '/') || (str[i] == '?') ||
 +        (str[i] == '&') || (str[i] == '=')) {
 +        (str[i] == '&') || (str[i] == '=')) {
@@ -476,6 +592,9 @@ new file mode 100644
 +      ret[i + 1] = str[i];
 +      ret[i + 1] = str[i];
 +    }
 +    }
 +  }
 +  }
++  // the index 'len' character is set by the previous loop
++  ret[len + 1] = '^';
++  ret[len + 2] = '\0';
 +  return ret;
 +  return ret;
 +}
 +}
 +
 +
@@ -562,9 +681,9 @@ new file mode 100644
 +  return match_domain;
 +  return match_domain;
 +}
 +}
 +
 +
-+static bool url_match_party(adblock_entry *entry, const GURL &url,
-+                            const std::string &origin_host, bool &checked_fp,
-+                            bool &fp) {
++static bool url_match_party(adblock_entry *entry, const char *l_origin_host,
++                            int origin_host_len, const char *l_url_host,
++                            int url_host_len, bool &checked_fp, bool &fp) {
 +  bool wanted_fp;
 +  bool wanted_fp;
 +  if ((entry->flags & ADBLOCK_FLAG_THIRD_PARTY) != 0) {
 +  if ((entry->flags & ADBLOCK_FLAG_THIRD_PARTY) != 0) {
 +    wanted_fp = false;
 +    wanted_fp = false;
@@ -575,104 +694,139 @@ new file mode 100644
 +    return true;
 +    return true;
 +  }
 +  }
 +
 +
-+  if (origin_host.empty()) {
++  if (origin_host_len == 0) {
 +    // cannot match this rule, no origin host to determine first/third party
 +    // cannot match this rule, no origin host to determine first/third party
 +    return false;
 +    return false;
 +  }
 +  }
 +
 +
-+#ifdef ADB_TESTER
-+//__android_log_print(ANDROID_LOG_INFO, LOG_TAG, "matchFirst=%d matchThird=%d",
-+// matchFirstParty, matchThirdParty);
-+#endif
 +  if (!checked_fp) {
 +  if (!checked_fp) {
-+    // lower-case version
-+    char *l_host = strtolower(origin_host.c_str()),
-+         *l_url_host = strtolower(url.host().c_str());
-+
 +    // is the URL a first-party to the current page's host?
 +    // is the URL a first-party to the current page's host?
-+    fp = is_first_party(l_host, l_url_host);
++    fp = is_first_party(l_origin_host, origin_host_len, l_url_host,
++                        url_host_len);
 +
 +
 +    checked_fp = true;
 +    checked_fp = true;
 +#ifdef ADB_TESTER
 +#ifdef ADB_TESTER
 +    __android_log_print(ANDROID_LOG_INFO, LOG_TAG,
 +    __android_log_print(ANDROID_LOG_INFO, LOG_TAG,
-+                        "is_first_party(\"%s\", \"%s\") = %s", l_host,
++                        "is_first_party(\"%s\", \"%s\") = %s", l_origin_host,
 +                        l_url_host, fp ? "true" : "false");
 +                        l_url_host, fp ? "true" : "false");
 +#endif
 +#endif
-+    free(l_host);
-+    free(l_url_host);
 +  }
 +  }
 +
 +
 +  return fp == wanted_fp;
 +  return fp == wanted_fp;
 +}
 +}
 +
 +
-+int adblock_intercept(const GURL &url, const std::string &origin_host
-+#ifndef ADB_TESTER
-+, content::ResourceType resource_type
++static bool resource_type_match(adblock_entry *entry,
++                                content::ResourceType resource_type) {
++  bool exclude;
++  if ((entry->flags & ADBLOCK_FLAG_RESOURCE_TYPE_IN) != 0) {
++    exclude = false;
++  } else if ((entry->flags & ADBLOCK_FLAG_RESOURCE_TYPE_NOT_IN) != 0) {
++    exclude = true;
++  } else {
++    // no resource type matching
++    return true;
++  }
++
++  // use a bitwise trick to test for the current resource type
++  bool found = (entry->flags & (resource_type << 16));
++  if (!exclude)
++    return found;
++  return !found;
++}
++
++int adblock_intercept(const GURL &url, const std::string &origin_host,
++                      content::ResourceType resource_type) {
++  // these are verified on caller when not testing
++#ifdef ADB_TESTER
++  if (!url.is_valid() || !url.SchemeIsHTTPOrHTTPS()) {
++    return 0;
++  }
 +#endif
 +#endif
-+) {
-+  if (url.is_valid() && url.SchemeIsHTTPOrHTTPS()) {
-+    const char *c_url = url.spec().c_str();
-+    char *c_url_lower = strtolower(c_url);
-+    char *c_url_sep = strtosep(c_url);
-+    char *c_url_lower_sep = strtosep(c_url_lower);
++
++  bool free1 = false, free2 = false, free3 = false, free4 = false;
++  int url_len = url.spec().size();
++  const char *c_url = url.spec().c_str();
++  char *c_url_lower = strtolower(c_url, url_len, free1);
++  char *c_url_sep = strtosep(c_url, url_len);
++  char *c_url_lower_sep = strtolower(c_url_sep, url_len + 2, free4);
++
++  // might be empty in case of no host
++  const char *origin_host_cstr = origin_host.c_str();
++  int origin_host_len = origin_host.size(), url_host_len = url.host().size();
++
++  // lower-case version of origin and url hosts
++  const char *c_origin_host_lower =
++                 strtolower(origin_host_cstr, origin_host_len, free2),
++             *c_url_host_lower =
++                 strtolower(url.host().c_str(), url_host_len, free3);
 +
 +
 +#ifdef ADBLOCK_LOG
 +#ifdef ADBLOCK_LOG
-+    __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[%s with host '%s'] [%s]",
-+                        c_url, url.host().c_str(), origin_host.c_str());
++  __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[%s with host '%s'] [%s]",
++                      c_url, url.host().c_str(), origin_host_cstr);
 +#endif
 +#endif
 +
 +
-+    bool checked_fp = false, fp = false;
++  bool checked_fp = false, fp = false;
 +
 +
-+    bool intercept = false;
-+    for (int i = 0; i < ADBLOCK_ENTRY_COUNT; i++) {
-+      adblock_entry *entry = &ADBLOCK_ENTRIES[i];
++  bool intercept = false;
++  for (int i = 0; i < ADBLOCK_ENTRY_COUNT; i++) {
++    adblock_entry *entry = &ADBLOCK_ENTRIES[i];
 +
 +
-+      // no use checking rules when we're intercepting, or exceptions when not
-+      bool check =
-+          (!intercept && ((entry->flags & ADBLOCK_FLAG_EXCEPTION) == 0)) ||
-+          (intercept && ((entry->flags & ADBLOCK_FLAG_EXCEPTION) != 0));
-+      if (!check)
-+        continue;
++    // no use checking rules when we're intercepting, or exceptions when not
++    bool check =
++        (!intercept && ((entry->flags & ADBLOCK_FLAG_EXCEPTION) == 0)) ||
++        (intercept && ((entry->flags & ADBLOCK_FLAG_EXCEPTION) != 0));
++    if (!check)
++      continue;
 +
 +
-+      // first check for domain matches, a quick branch out if matching
-+      if (!url_match_domain(entry, origin_host))
-+        continue;
++    // check for resource type
++    if (!resource_type_match(entry, resource_type))
++      continue;
 +
 +
-+      // check on the URL matcher
-+      if (!url_matches(c_url, c_url_sep, c_url_lower, c_url_lower_sep, entry))
-+        continue;
++    // check for domain matches, a quick branch out if not matching
++    if (!url_match_domain(entry, origin_host))
++      continue;
 +
 +
-+      // finally check first/third-party
-+      if (!url_match_party(entry, url, origin_host, checked_fp, fp))
-+        continue;
++    // check on the URL matcher
++    if (!url_matches(c_url, c_url_sep, c_url_lower, c_url_lower_sep, entry))
++      continue;
++
++    // finally check first/third-party
++    if (!url_match_party(entry, c_origin_host_lower, origin_host_len,
++                         c_url_host_lower, url_host_len, checked_fp, fp))
++      continue;
 +
 +
 +#ifdef ADBLOCK_LOG
 +#ifdef ADBLOCK_LOG
-+      if (!intercept) {
-+        __android_log_print(ANDROID_LOG_INFO, LOG_TAG,
-+                            "--> intercept (#%d: \"%s\") (%x)", i,
-+                            entry->matches[0], entry->flags);
-+      } else {
-+        __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "--> pass (%d) (#%d)", i,
-+                            entry->flags);
-+      }
++    if (!intercept) {
++      __android_log_print(ANDROID_LOG_INFO, LOG_TAG,
++                          "--> intercept (#%d: \"%s\") (%x)", i,
++                          entry->matches[0], entry->flags);
++    } else {
++      __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "--> pass (%d) (#%d)", i,
++                          entry->flags);
++    }
 +#endif
 +#endif
-+      intercept = !intercept;
-+    } // for each entry
-+
-+    free(c_url_sep);
++    intercept = !intercept;
++  } // for each entry
++
++  if (free3)
++    free((void *)c_url_host_lower);
++  if (free2)
++    free((void *)c_origin_host_lower);
++  free(c_url_sep);
++  if (free1)
 +    free(c_url_lower);
 +    free(c_url_lower);
++  if (free4)
 +    free(c_url_lower_sep);
 +    free(c_url_lower_sep);
 +
 +
-+    if (intercept) {
++  if (intercept) {
 +#ifdef ADBLOCK_LOG
 +#ifdef ADBLOCK_LOG
-+      __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "blocked");
++    __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "blocked");
 +#endif
 +#endif
-+      return 1;
-+    }
++    return 1;
++  }
 +#ifdef ADBLOCK_LOG
 +#ifdef ADBLOCK_LOG
-+    __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "pass");
++  __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "pass");
 +#endif
 +#endif
-+  }
 +  return 0;
 +  return 0;
 +}
 +}
 +
 +
@@ -681,7 +835,7 @@ diff --git a/net/url_request/adblock_intercept.h b/net/url_request/adblock_inter
 new file mode 100644
 new file mode 100644
 --- /dev/null
 --- /dev/null
 +++ b/net/url_request/adblock_intercept.h
 +++ b/net/url_request/adblock_intercept.h
-@@ -0,0 +1,41 @@
+@@ -0,0 +1,35 @@
 +/*
 +/*
 +    This file is part of Bromite.
 +    This file is part of Bromite.
 +
 +
@@ -702,11 +856,8 @@ new file mode 100644
 +#ifndef NET_URL_REQUEST_ADBLOCK_INTERCEPT_H_
 +#ifndef NET_URL_REQUEST_ADBLOCK_INTERCEPT_H_
 +#define NET_URL_REQUEST_ADBLOCK_INTERCEPT_H_
 +#define NET_URL_REQUEST_ADBLOCK_INTERCEPT_H_
 +
 +
-+#include "url/gurl.h"
-+
-+#ifndef ADB_TESTER
 +#include "content/public/common/resource_type.h"
 +#include "content/public/common/resource_type.h"
-+#endif
++#include "url/gurl.h"
 +
 +
 +namespace net {
 +namespace net {
 +
 +
@@ -714,11 +865,8 @@ new file mode 100644
 +int adblock_rules_count();
 +int adblock_rules_count();
 +#endif
 +#endif
 +
 +
-+int adblock_intercept(const GURL &url, const std::string &origin_host
-+#ifndef ADB_TESTER
-+, content::ResourceType resource_type
-+#endif
-+);
++int adblock_intercept(const GURL &url, const std::string &origin_host,
++                      content::ResourceType resource_type);
 +
 +
 +} // namespace net
 +} // namespace net
 +
 +

+ 1 - 1
build/patches/ungoogled-chromium-disable-safe-browsing.patch

@@ -41,7 +41,7 @@ Subject: ungoogled-chromium: disable safe browsing
 diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
 diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
 --- a/chrome/browser/BUILD.gn
 --- a/chrome/browser/BUILD.gn
 +++ b/chrome/browser/BUILD.gn
 +++ b/chrome/browser/BUILD.gn
-@@ -2649,8 +2649,6 @@ jumbo_split_static_library("browser") {
+@@ -2647,8 +2647,6 @@ jumbo_split_static_library("browser") {
        "download/download_commands.h",
        "download/download_commands.h",
        "download/download_crx_util.cc",
        "download/download_crx_util.cc",
        "download/download_crx_util.h",
        "download/download_crx_util.h",

Some files were not shown because too many files changed in this diff