[epiphany/gnome-3-18] uri-tester: process patterns synchronously at startup
- From: Michael Catanzaro <mcatanzaro src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [epiphany/gnome-3-18] uri-tester: process patterns synchronously at startup
- Date: Sun, 18 Dec 2016 18:02:30 +0000 (UTC)
commit e2682919393143088a4e0475fd33b7618d686a97
Author: Michael Catanzaro <mcatanzaro gnome org>
Date: Sun Dec 18 12:01:35 2016 -0600
uri-tester: process patterns synchronously at startup
Currently the URI tester loads filters and patterns asynchronously,
which is racy as it means ads will sometimes not be blocked when a new
web process is loading its first page. Filter processing must always
complete before the first resource is requested, so do it synchronously.
This is already fixed in a better way on the master branch, so this
commit is for backports only.
https://bugzilla.gnome.org/show_bug.cgi?id=775736
embed/web-extension/uri-tester.c | 111 ++++++++++++--------------------------
1 files changed, 34 insertions(+), 77 deletions(-)
---
diff --git a/embed/web-extension/uri-tester.c b/embed/web-extension/uri-tester.c
index 8758719..271ae80 100644
--- a/embed/web-extension/uri-tester.c
+++ b/embed/web-extension/uri-tester.c
@@ -113,35 +113,12 @@ uri_tester_get_fileuri_for_url (UriTester *tester,
return uri;
}
-typedef struct {
- UriTester *tester;
- char *dest_uri;
-} RetrieveFilterAsyncData;
-
-static void
-uri_tester_retrieve_filter_finished (GFile *src,
- GAsyncResult *result,
- RetrieveFilterAsyncData *data)
-{
- GError *error = NULL;
-
- if (!g_file_copy_finish (src, result, &error)) {
- LOG ("Error retrieving filter: %s\n", error->message);
- g_error_free (error);
- } else
- uri_tester_parse_file_at_uri (data->tester, data->dest_uri);
-
- g_object_unref (data->tester);
- g_free (data->dest_uri);
- g_slice_free (RetrieveFilterAsyncData, data);
-}
-
static void
uri_tester_retrieve_filter (UriTester *tester, const char *url, const char *fileuri)
{
GFile *src;
GFile *dest;
- RetrieveFilterAsyncData *data;
+ GError *error = NULL;
g_return_if_fail (IS_URI_TESTER (tester));
g_return_if_fail (url != NULL);
@@ -150,16 +127,17 @@ uri_tester_retrieve_filter (UriTester *tester, const char *url, const char *file
src = g_file_new_for_uri (url);
dest = g_file_new_for_uri (fileuri);
- data = g_slice_new (RetrieveFilterAsyncData);
- data->tester = g_object_ref (tester);
- data->dest_uri = g_file_get_uri (dest);
+ g_file_copy (src, dest,
+ G_FILE_COPY_OVERWRITE,
+ NULL, NULL, NULL,
+ &error);
- g_file_copy_async (src, dest,
- G_FILE_COPY_OVERWRITE,
- G_PRIORITY_DEFAULT,
- NULL, NULL, NULL,
- (GAsyncReadyCallback)uri_tester_retrieve_filter_finished,
- data);
+ if (error != NULL) {
+ g_warning ("Error retrieving adblock filter: %s\n", error->message);
+ g_error_free (error);
+ } else {
+ uri_tester_parse_file_at_uri (tester, fileuri);
+ }
g_object_unref (src);
g_object_unref (dest);
@@ -259,7 +237,7 @@ uri_tester_load_filters (UriTester *tester)
if (error)
{
- LOG ("Error loading filters from %s: %s", filepath, error->message);
+ g_warning ("Error loading filters from %s: %s", filepath, error->message);
g_error_free (error);
}
@@ -767,64 +745,43 @@ uri_tester_parse_line (UriTester *tester, char *line, gboolean whitelist)
}
static void
-file_parse_cb (GDataInputStream *stream, GAsyncResult *result, UriTester *tester)
+uri_tester_parse_file_at_uri (UriTester *tester, const char *fileuri)
{
+ GFile *file;
+ GFileInputStream *stream;
+ GDataInputStream *data_stream = NULL;
char *line;
GError *error = NULL;
- line = g_data_input_stream_read_line_finish (stream, result, NULL, &error);
- if (!line) {
- if (error) {
- LOG ("Error parsing file: %s\n", error->message);
- g_error_free (error);
- }
-
- return;
- }
-
- uri_tester_parse_line (tester, line, FALSE);
- g_free (line);
-
- g_data_input_stream_read_line_async (stream, G_PRIORITY_DEFAULT_IDLE, NULL,
- (GAsyncReadyCallback)file_parse_cb, tester);
-}
-
-static void
-file_read_cb (GFile *file, GAsyncResult *result, UriTester *tester)
-{
- GFileInputStream *stream;
- GDataInputStream *data_stream;
- GError *error = NULL;
+ file = g_file_new_for_uri (fileuri);
+ stream = g_file_read (file, NULL, &error);
+ g_object_unref (file);
- stream = g_file_read_finish (file, result, &error);
if (!stream) {
- char *path;
-
- path = g_file_get_path (file);
- LOG ("Error opening file %s for parsing: %s\n", path, error->message);
- g_free (path);
+ g_warning ("Error opening %s for parsing: %s\n", fileuri, error->message);
g_error_free (error);
-
return;
}
data_stream = g_data_input_stream_new (G_INPUT_STREAM (stream));
g_object_unref (stream);
- g_data_input_stream_read_line_async (data_stream, G_PRIORITY_DEFAULT_IDLE, NULL,
- (GAsyncReadyCallback)file_parse_cb, tester);
- g_object_unref (data_stream);
-}
+ for (;;) {
+ line = g_data_input_stream_read_line (data_stream, NULL, NULL, &error);
+ if (!line) {
+ if (error) {
+ g_warning ("Error parsing file: %s\n", error->message);
+ g_error_free (error);
+ }
-static void
-uri_tester_parse_file_at_uri (UriTester *tester, const char *fileuri)
-{
- GFile *file;
- GFileInputStream *stream;
+ break;
+ }
- file = g_file_new_for_uri (fileuri);
- g_file_read_async (file, G_PRIORITY_DEFAULT_IDLE, NULL, (GAsyncReadyCallback)file_read_cb, tester);
- g_object_unref (file);
+ uri_tester_parse_line (tester, line, FALSE);
+ g_free (line);
+ }
+
+ g_object_unref (data_stream);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]