Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Delta Between Two Patch Sets: safari/contentBlocking.js

Issue 29340571: Issue 3687 - Add experimental support for Safari content blockers (Closed)
Left Patch Set: Improve comments about buggy behavouir Created May 17, 2016, 6:22 p.m.
Right Patch Set: Addressed Nits Created May 18, 2016, 11:30 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « popup.js ('k') | safari/ext/background.js » ('j') | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
1 /* 1 /*
2 * This file is part of Adblock Plus <https://adblockplus.org/>, 2 * This file is part of Adblock Plus <https://adblockplus.org/>,
3 * Copyright (C) 2006-2016 Eyeo GmbH 3 * Copyright (C) 2006-2016 Eyeo GmbH
4 * 4 *
5 * Adblock Plus is free software: you can redistribute it and/or modify 5 * Adblock Plus is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 3 as 6 * it under the terms of the GNU General Public License version 3 as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
8 * 8 *
9 * Adblock Plus is distributed in the hope that it will be useful, 9 * Adblock Plus is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
(...skipping 20 matching lines...) Expand all
31 function onLegacyAPISupported(msg, sender) 31 function onLegacyAPISupported(msg, sender)
32 { 32 {
33 port.off("safari.legacyAPISupported", onLegacyAPISupported); 33 port.off("safari.legacyAPISupported", onLegacyAPISupported);
34 resolve(msg.legacyAPISupported); 34 resolve(msg.legacyAPISupported);
35 } 35 }
36 port.on("safari.legacyAPISupported", onLegacyAPISupported); 36 port.on("safari.legacyAPISupported", onLegacyAPISupported);
37 }); 37 });
38 let contentBlockingActive = false; 38 let contentBlockingActive = false;
39 let afterContentBlockingFinished = null; 39 let afterContentBlockingFinished = null;
40 let contentBlockListDirty = true; 40 let contentBlockListDirty = true;
41 let lastSetContentBlockerResult; 41 let lastSetContentBlockerError;
42 42
43 function clearBlockCounters() 43 function clearBlockCounters()
44 { 44 {
45 ext.pages.query({}, pages => 45 ext.pages.query({}, pages =>
46 { 46 {
47 for (let page of pages) 47 for (let page of pages)
48 page.browserAction.setBadge(); 48 page.browserAction.setBadge();
49 }); 49 });
50 } 50 }
51 51
52 function setContentBlocker(callback) 52 function setContentBlocker(callback)
53 { 53 {
54 // When given the same rules as last time setContentBlocker will always give 54 // When given the same rules as last time setContentBlocker will always give
55 // null (success) to the callback, even when there was actually an error. We 55 // null (success) to the callback, even when there was actually an error. We
56 // cache the last result therefore so that we can provide a consistent result 56 // cache the last result therefore so that we can provide a consistent result
57 // and also to avoid wastefully regenerating an identical blocklist. 57 // and also to avoid wastefully regenerating an identical blocklist.
58 if (!contentBlockListDirty) 58 if (!contentBlockListDirty)
59 { 59 {
60 callback(lastSetContentBlockerResult); 60 callback(lastSetContentBlockerError);
61 return; 61 return;
62 } 62 }
63 63
64 let contentBlockerList = new ContentBlockerList(); 64 let contentBlockerList = new ContentBlockerList();
65 for (let subscription of FilterStorage.subscriptions) 65 for (let subscription of FilterStorage.subscriptions)
66 if (!subscription.disabled) 66 if (!subscription.disabled)
67 for (let filter of subscription.filters) 67 for (let filter of subscription.filters)
68 contentBlockerList.addFilter(filter); 68 contentBlockerList.addFilter(filter);
69 69
70 contentBlockListDirty = false; 70 contentBlockListDirty = false;
71 safari.extension.setContentBlocker( 71 safari.extension.setContentBlocker(
72 // There is a strange bug in setContentBlocker for Safari 9 where if both 72 // There is a strange bug in setContentBlocker for Safari 9 where if both
73 // the callback parameter is provided and the rules aren't converted to a 73 // the callback parameter is provided and the rules aren't converted to a
74 // JSON string it fails. Worse still it actually performs the callback twice 74 // JSON string it fails. Worse still it actually performs the callback twice
75 // too, firstly with an empty string and then with an Error: 75 // too, firstly with an empty string and then with an Error:
76 // "Extension compilation failed: Failed to parse the JSON String." 76 // "Extension compilation failed: Failed to parse the JSON String."
77 // To mitigate this we convert the rules to JSON here and also ignore 77 // To mitigate this we convert the rules to JSON here and also ignore
78 // callback values of "". (Usually the callback is performed with either 78 // callback values of "". (Usually the callback is performed with either
79 // null for success or an Error on failure.) 79 // null for success or an Error on failure.)
80 // Bug #26322821 filed on bugreport.apple.com 80 // Bug #26322821 filed on bugreport.apple.com
81 JSON.stringify(contentBlockerList.generateRules()), 81 JSON.stringify(contentBlockerList.generateRules()),
82 function (result) 82 function(error)
83 { 83 {
84 if (result == "") 84 if (error == "")
85 return; 85 return;
86 86
87 lastSetContentBlockerResult = result; 87 lastSetContentBlockerError = error;
88 callback(result); 88 callback(error);
89 } 89 }
90 ); 90 );
91 } 91 }
92 92
93 function updateContentBlocker(isStartup, legacyAPISupported) 93 function updateContentBlocker(isStartup, legacyAPISupported)
94 { 94 {
95 afterContentBlockingFinished = new Promise(resolve => 95 afterContentBlockingFinished = new Promise(resolve =>
96 { 96 {
97 setContentBlocker(result => 97 setContentBlocker(error =>
98 { 98 {
99 if (result instanceof Error) 99 if (error instanceof Error)
100 { 100 {
101 let suppressErrorMessage = false; 101 let suppressErrorMessage = false;
102 102
103 // If the content blocking API fails the first time it's used the 103 // If the content blocking API fails the first time it's used the
104 // legacy blocking API (if available) won't have been disabled. 104 // legacy blocking API (if available) won't have been disabled.
105 if (!contentBlockingActive && legacyAPISupported) 105 if (!contentBlockingActive && legacyAPISupported)
106 { 106 {
107 Prefs.safariContentBlocker = false; 107 Prefs.safariContentBlocker = false;
108 // If content blocking failed on startup and we're switching back to 108 // If content blocking failed on startup and we're switching back to
109 // the legacy API anyway we don't need to show an error message. 109 // the legacy API anyway we don't need to show an error message.
110 if (isStartup) 110 if (isStartup)
111 suppressErrorMessage = true; 111 suppressErrorMessage = true;
112 } 112 }
113 113
114 if (!suppressErrorMessage) 114 if (!suppressErrorMessage)
115 alert(result.message); 115 alert(error.message);
116 } 116 }
117 else if (!contentBlockingActive) 117 else if (!contentBlockingActive)
118 { 118 {
119 contentBlockingActive = true; 119 contentBlockingActive = true;
120 clearBlockCounters(); 120 clearBlockCounters();
121 } 121 }
122 122
123 resolve(contentBlockingActive); 123 resolve(contentBlockingActive);
124 afterContentBlockingFinished = null; 124 afterContentBlockingFinished = null;
125 }); 125 });
(...skipping 27 matching lines...) Expand all
153 }); 153 });
154 }); 154 });
155 } 155 }
156 156
157 port.on("safari.contentBlockingActive", (msg, sender) => 157 port.on("safari.contentBlockingActive", (msg, sender) =>
158 { 158 {
159 if (!contentBlockingActive && afterContentBlockingFinished) 159 if (!contentBlockingActive && afterContentBlockingFinished)
160 return afterContentBlockingFinished; 160 return afterContentBlockingFinished;
161 return contentBlockingActive; 161 return contentBlockingActive;
162 }); 162 });
LEFTRIGHT

Powered by Google App Engine
This is Rietveld