Left: | ||
Right: |
OLD | NEW |
---|---|
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-present eyeo GmbH | 3 * Copyright (C) 2006-present 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 30 matching lines...) Expand all Loading... | |
41 import android.webkit.WebChromeClient; | 41 import android.webkit.WebChromeClient; |
42 import android.webkit.WebResourceRequest; // makes android min version to be 21 | 42 import android.webkit.WebResourceRequest; // makes android min version to be 21 |
43 import android.webkit.WebResourceResponse; | 43 import android.webkit.WebResourceResponse; |
44 import android.webkit.WebStorage; | 44 import android.webkit.WebStorage; |
45 import android.webkit.WebView; | 45 import android.webkit.WebView; |
46 import android.webkit.WebViewClient; | 46 import android.webkit.WebViewClient; |
47 | 47 |
48 import org.adblockplus.libadblockplus.FilterEngine; | 48 import org.adblockplus.libadblockplus.FilterEngine; |
49 import org.adblockplus.libadblockplus.Subscription; | 49 import org.adblockplus.libadblockplus.Subscription; |
50 import org.adblockplus.libadblockplus.android.AdblockEngine; | 50 import org.adblockplus.libadblockplus.android.AdblockEngine; |
51 import org.adblockplus.libadblockplus.android.AdblockEngineProvider; | |
52 import org.adblockplus.libadblockplus.android.SingleInstanceEngineProvider; | |
51 import org.adblockplus.libadblockplus.android.Utils; | 53 import org.adblockplus.libadblockplus.android.Utils; |
52 | 54 |
53 import java.io.IOException; | 55 import java.io.IOException; |
54 import java.util.Collections; | 56 import java.util.Collections; |
55 import java.util.HashMap; | 57 import java.util.HashMap; |
56 import java.util.List; | 58 import java.util.List; |
57 import java.util.Map; | 59 import java.util.Map; |
58 import java.util.concurrent.CountDownLatch; | 60 import java.util.concurrent.CountDownLatch; |
59 import java.util.concurrent.atomic.AtomicBoolean; | 61 import java.util.concurrent.atomic.AtomicBoolean; |
60 import java.util.regex.Pattern; | 62 import java.util.regex.Pattern; |
(...skipping 27 matching lines...) Expand all Loading... | |
88 | 90 |
89 private static final Pattern RE_JS = Pattern.compile("\\.js$", Pattern.CASE_IN SENSITIVE); | 91 private static final Pattern RE_JS = Pattern.compile("\\.js$", Pattern.CASE_IN SENSITIVE); |
90 private static final Pattern RE_CSS = Pattern.compile("\\.css$", Pattern.CASE_ INSENSITIVE); | 92 private static final Pattern RE_CSS = Pattern.compile("\\.css$", Pattern.CASE_ INSENSITIVE); |
91 private static final Pattern RE_IMAGE = Pattern.compile("\\.(?:gif|png|jpe?g|b mp|ico)$", Pattern.CASE_INSENSITIVE); | 93 private static final Pattern RE_IMAGE = Pattern.compile("\\.(?:gif|png|jpe?g|b mp|ico)$", Pattern.CASE_INSENSITIVE); |
92 private static final Pattern RE_FONT = Pattern.compile("\\.(?:ttf|woff)$", Pat tern.CASE_INSENSITIVE); | 94 private static final Pattern RE_FONT = Pattern.compile("\\.(?:ttf|woff)$", Pat tern.CASE_INSENSITIVE); |
93 private static final Pattern RE_HTML = Pattern.compile("\\.html?$", Pattern.CA SE_INSENSITIVE); | 95 private static final Pattern RE_HTML = Pattern.compile("\\.html?$", Pattern.CA SE_INSENSITIVE); |
94 | 96 |
95 private volatile boolean addDomListener = true; | 97 private volatile boolean addDomListener = true; |
96 private boolean adblockEnabled = true; | 98 private boolean adblockEnabled = true; |
97 private boolean debugMode; | 99 private boolean debugMode; |
98 private AdblockEngine adblockEngine; | 100 private AdblockEngineProvider provider; |
99 private boolean disposeEngine; | |
100 private Integer loadError; | 101 private Integer loadError; |
101 private int allowDrawDelay = ALLOW_DRAW_DELAY; | 102 private int allowDrawDelay = ALLOW_DRAW_DELAY; |
102 private WebChromeClient extWebChromeClient; | 103 private WebChromeClient extWebChromeClient; |
103 private WebViewClient extWebViewClient; | 104 private WebViewClient extWebViewClient; |
104 private WebViewClient intWebViewClient; | 105 private WebViewClient intWebViewClient; |
105 private Map<String, String> url2Referrer = Collections.synchronizedMap(new Has hMap<String, String>()); | 106 private Map<String, String> url2Referrer = Collections.synchronizedMap(new Has hMap<String, String>()); |
106 private String url; | 107 private String url; |
107 private String domain; | 108 private String domain; |
108 private String injectJs; | 109 private String injectJs; |
109 private CountDownLatch elemHideLatch; | 110 private CountDownLatch elemHideLatch; |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
177 applyAdblockEnabled(); | 178 applyAdblockEnabled(); |
178 } | 179 } |
179 | 180 |
180 public boolean isDebugMode() | 181 public boolean isDebugMode() |
181 { | 182 { |
182 return debugMode; | 183 return debugMode; |
183 } | 184 } |
184 | 185 |
185 /** | 186 /** |
186 * Set to true to see debug log output int AdblockWebView and JS console | 187 * Set to true to see debug log output int AdblockWebView and JS console |
188 * Should be set before first URL loading if using internal AdblockEngineProvi der | |
187 * @param debugMode is debug mode | 189 * @param debugMode is debug mode |
188 */ | 190 */ |
189 public void setDebugMode(boolean debugMode) | 191 public void setDebugMode(boolean debugMode) |
190 { | 192 { |
191 this.debugMode = debugMode; | 193 this.debugMode = debugMode; |
192 } | 194 } |
193 | 195 |
194 private void d(String message) | 196 private void d(String message) |
195 { | 197 { |
196 if (debugMode) | 198 if (debugMode) |
(...skipping 28 matching lines...) Expand all Loading... | |
225 .replace(DEBUG_TOKEN, (debugMode ? "" : "//")); | 227 .replace(DEBUG_TOKEN, (debugMode ? "" : "//")); |
226 } | 228 } |
227 | 229 |
228 private void runScript(String script) | 230 private void runScript(String script) |
229 { | 231 { |
230 d("runScript started"); | 232 d("runScript started"); |
231 evaluateJavascript(script, null); | 233 evaluateJavascript(script, null); |
232 d("runScript finished"); | 234 d("runScript finished"); |
233 } | 235 } |
234 | 236 |
235 public AdblockEngine getAdblockEngine() | 237 public void setProvider(final AdblockEngineProvider provider) |
236 { | 238 { |
237 return adblockEngine; | 239 if (this.provider != null && provider != null && this.provider == provider) |
sergei
2018/01/19 13:56:41
So, if both this.provider and provider are null th
diegocarloslima
2018/01/19 15:56:11
We can add the @NonNull annotation for AdblockEngi
anton
2018/01/22 06:17:36
I'd prefer to fix it by adding `null` check.
| |
238 } | |
239 | |
240 /** | |
241 * Set external adblockEngine. A new (internal) is created automatically if no t set | |
242 * Don't forget to invoke {@link #dispose(Runnable)} later and dispose externa l adblockEngine | |
243 * @param adblockEngine external adblockEngine | |
244 */ | |
245 public void setAdblockEngine(final AdblockEngine adblockEngine) | |
246 { | |
247 if (this.adblockEngine != null && adblockEngine != null && this.adblockEngin e == adblockEngine) | |
248 { | 240 { |
249 return; | 241 return; |
250 } | 242 } |
251 | 243 |
252 final Runnable setRunnable = new Runnable() | 244 final Runnable setRunnable = new Runnable() |
253 { | 245 { |
254 @Override | 246 @Override |
255 public void run() | 247 public void run() |
256 { | 248 { |
257 AdblockWebView.this.adblockEngine = adblockEngine; | 249 AdblockWebView.this.provider = provider; |
258 AdblockWebView.this.disposeEngine = false; | 250 AdblockWebView.this.provider.retain(true); // asynchronously |
259 } | 251 } |
260 }; | 252 }; |
261 | 253 |
262 if (this.adblockEngine != null && disposeEngine) | 254 if (this.provider != null) |
263 { | 255 { |
264 // as adblockEngine can be busy with elemhide thread we need to use callba ck | 256 // as adblockEngine can be busy with elemhide thread we need to use callba ck |
265 this.dispose(setRunnable); | 257 this.dispose(setRunnable); |
266 } | 258 } |
267 else | 259 else |
268 { | 260 { |
269 setRunnable.run(); | 261 setRunnable.run(); |
270 } | 262 } |
271 } | 263 } |
272 | 264 |
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
818 { | 810 { |
819 super.onReceivedLoginRequest(view, realm, account, args); | 811 super.onReceivedLoginRequest(view, realm, account, args); |
820 } | 812 } |
821 } | 813 } |
822 | 814 |
823 protected WebResourceResponse shouldInterceptRequest( | 815 protected WebResourceResponse shouldInterceptRequest( |
824 WebView webview, String url, boolean isMainFrame, | 816 WebView webview, String url, boolean isMainFrame, |
825 boolean isXmlHttpRequest, String[] referrerChainArray) | 817 boolean isXmlHttpRequest, String[] referrerChainArray) |
826 { | 818 { |
827 // if dispose() was invoke, but the page is still loading then just let it go | 819 // if dispose() was invoke, but the page is still loading then just let it go |
828 if (adblockEngine == null) | 820 if (provider.getCounter() == 0) |
829 { | 821 { |
830 e("FilterEngine already disposed, allow loading"); | 822 e("FilterEngine already disposed, allow loading"); |
831 | 823 |
832 // allow loading by returning null | 824 // allow loading by returning null |
833 return null; | 825 return null; |
834 } | 826 } |
835 | 827 |
836 if (isMainFrame) | 828 if (isMainFrame) |
837 { | 829 { |
838 // never blocking main frame requests, just subrequests | 830 // never blocking main frame requests, just subrequests |
839 w(url + " is main frame, allow loading"); | 831 w(url + " is main frame, allow loading"); |
840 | 832 |
841 // allow loading by returning null | 833 // allow loading by returning null |
842 return null; | 834 return null; |
843 } | 835 } |
844 | 836 |
845 // whitelisted | 837 // whitelisted |
846 if (adblockEngine.isDomainWhitelisted(url, referrerChainArray)) | 838 if (provider.getEngine().isDomainWhitelisted(url, referrerChainArray)) |
847 { | 839 { |
848 w(url + " domain is whitelisted, allow loading"); | 840 w(url + " domain is whitelisted, allow loading"); |
849 | 841 |
850 // allow loading by returning null | 842 // allow loading by returning null |
851 return null; | 843 return null; |
852 } | 844 } |
853 | 845 |
854 if (adblockEngine.isDocumentWhitelisted(url, referrerChainArray)) | 846 if (provider.getEngine().isDocumentWhitelisted(url, referrerChainArray)) |
855 { | 847 { |
856 w(url + " document is whitelisted, allow loading"); | 848 w(url + " document is whitelisted, allow loading"); |
857 | 849 |
858 // allow loading by returning null | 850 // allow loading by returning null |
859 return null; | 851 return null; |
860 } | 852 } |
861 | 853 |
862 // determine the content | 854 // determine the content |
863 FilterEngine.ContentType contentType; | 855 FilterEngine.ContentType contentType; |
864 if (isXmlHttpRequest) | 856 if (isXmlHttpRequest) |
(...skipping 22 matching lines...) Expand all Loading... | |
887 { | 879 { |
888 contentType = FilterEngine.ContentType.SUBDOCUMENT; | 880 contentType = FilterEngine.ContentType.SUBDOCUMENT; |
889 } | 881 } |
890 else | 882 else |
891 { | 883 { |
892 contentType = FilterEngine.ContentType.OTHER; | 884 contentType = FilterEngine.ContentType.OTHER; |
893 } | 885 } |
894 } | 886 } |
895 | 887 |
896 // check if we should block | 888 // check if we should block |
897 if (adblockEngine.matches(url, contentType, referrerChainArray)) | 889 if (provider.getEngine().matches(url, contentType, referrerChainArray)) |
898 { | 890 { |
899 w("Blocked loading " + url); | 891 w("Blocked loading " + url); |
900 | 892 |
901 // if we should block, return empty response which results in 'errorLoad ing' callback | 893 // if we should block, return empty response which results in 'errorLoad ing' callback |
902 return new WebResourceResponse("text/plain", "UTF-8", null); | 894 return new WebResourceResponse("text/plain", "UTF-8", null); |
903 } | 895 } |
904 | 896 |
905 d("Allowed loading " + url); | 897 d("Allowed loading " + url); |
906 | 898 |
907 // continue by returning null | 899 // continue by returning null |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
949 addJavascriptInterface(this, BRIDGE); | 941 addJavascriptInterface(this, BRIDGE); |
950 initClients(); | 942 initClients(); |
951 } | 943 } |
952 | 944 |
953 private void initClients() | 945 private void initClients() |
954 { | 946 { |
955 intWebViewClient = new AdblockWebViewClient(); | 947 intWebViewClient = new AdblockWebViewClient(); |
956 applyAdblockEnabled(); | 948 applyAdblockEnabled(); |
957 } | 949 } |
958 | 950 |
959 private void createAdblockEngine() | |
960 { | |
961 w("Creating AdblockEngine"); | |
962 | |
963 // assuming `this.debugMode` can be used as `developmentBuild` value | |
964 adblockEngine = AdblockEngine | |
965 .builder( | |
966 AdblockEngine.generateAppInfo(this.getContext(), debugMode), | |
967 this.getContext().getDir(AdblockEngine.BASE_PATH_DIRECTORY, Context.MODE _PRIVATE).getAbsolutePath()) | |
968 .enableElementHiding(true) | |
969 .build(); | |
970 } | |
971 | |
972 private class ElemHideThread extends Thread | 951 private class ElemHideThread extends Thread |
973 { | 952 { |
974 private String selectorsString; | 953 private String selectorsString; |
975 private CountDownLatch finishedLatch; | 954 private CountDownLatch finishedLatch; |
976 private AtomicBoolean isCancelled; | 955 private AtomicBoolean isCancelled; |
977 | 956 |
978 public ElemHideThread(CountDownLatch finishedLatch) | 957 public ElemHideThread(CountDownLatch finishedLatch) |
979 { | 958 { |
980 this.finishedLatch = finishedLatch; | 959 this.finishedLatch = finishedLatch; |
981 isCancelled = new AtomicBoolean(false); | 960 isCancelled = new AtomicBoolean(false); |
982 } | 961 } |
983 | 962 |
984 @Override | 963 @Override |
985 public void run() | 964 public void run() |
986 { | 965 { |
987 try | 966 try |
988 { | 967 { |
989 if (adblockEngine == null) | 968 if (provider.getCounter() == 0) |
sergei
2018/01/19 13:56:41
Can it actually happen and if so, why it cannot ha
anton
2018/01/22 06:17:36
I've just reviewed the code and it seems that it c
| |
990 { | 969 { |
991 w("FilterEngine already disposed"); | 970 w("FilterEngine already disposed"); |
992 selectorsString = EMPTY_ELEMHIDE_ARRAY_STRING; | 971 selectorsString = EMPTY_ELEMHIDE_ARRAY_STRING; |
993 } | 972 } |
994 else | 973 else |
995 { | 974 { |
996 String[] referrers = new String[] | 975 String[] referrers = new String[] |
997 { | 976 { |
998 url | 977 url |
999 }; | 978 }; |
1000 | 979 |
1001 List<Subscription> subscriptions = adblockEngine.getFilterEngine().get ListedSubscriptions(); | 980 List<Subscription> subscriptions = provider |
981 .getEngine() | |
982 .getFilterEngine() | |
983 .getListedSubscriptions(); | |
984 | |
1002 try | 985 try |
1003 { | 986 { |
1004 d("Listed subscriptions: " + subscriptions.size()); | 987 d("Listed subscriptions: " + subscriptions.size()); |
1005 if (debugMode) | 988 if (debugMode) |
1006 { | 989 { |
1007 for (Subscription eachSubscription : subscriptions) | 990 for (Subscription eachSubscription : subscriptions) |
1008 { | 991 { |
1009 d("Subscribed to " | 992 d("Subscribed to " |
1010 + (eachSubscription.isDisabled() ? "disabled" : "enabled") | 993 + (eachSubscription.isDisabled() ? "disabled" : "enabled") |
1011 + " " + eachSubscription); | 994 + " " + eachSubscription); |
1012 } | 995 } |
1013 } | 996 } |
1014 } | 997 } |
1015 finally | 998 finally |
1016 { | 999 { |
1017 for (Subscription eachSubscription : subscriptions) | 1000 for (Subscription eachSubscription : subscriptions) |
1018 { | 1001 { |
1019 eachSubscription.dispose(); | 1002 eachSubscription.dispose(); |
1020 } | 1003 } |
1021 } | 1004 } |
1022 | 1005 |
1023 d("Requesting elemhide selectors from AdblockEngine for " + url + " in " + this); | 1006 d("Requesting elemhide selectors from AdblockEngine for " + url + " in " + this); |
1024 List<String> selectors = adblockEngine.getElementHidingSelectors(url, domain, referrers); | 1007 List<String> selectors = provider |
1008 .getEngine() | |
1009 .getElementHidingSelectors(url, domain, referrers); | |
1010 | |
1025 d("Finished requesting elemhide selectors, got " + selectors.size() + " in " + this); | 1011 d("Finished requesting elemhide selectors, got " + selectors.size() + " in " + this); |
1026 selectorsString = Utils.stringListToJsonArray(selectors); | 1012 selectorsString = Utils.stringListToJsonArray(selectors); |
1027 } | 1013 } |
1028 } | 1014 } |
1029 finally | 1015 finally |
1030 { | 1016 { |
1031 if (!isCancelled.get()) | 1017 if (!isCancelled.get()) |
1032 { | 1018 { |
1033 finish(selectorsString); | 1019 finish(selectorsString); |
1034 } | 1020 } |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1088 w("elemHideThread set to null"); | 1074 w("elemHideThread set to null"); |
1089 elemHideThread = null; | 1075 elemHideThread = null; |
1090 } | 1076 } |
1091 } | 1077 } |
1092 }; | 1078 }; |
1093 | 1079 |
1094 private void initAbpLoading() | 1080 private void initAbpLoading() |
1095 { | 1081 { |
1096 getSettings().setJavaScriptEnabled(true); | 1082 getSettings().setJavaScriptEnabled(true); |
1097 buildInjectJs(); | 1083 buildInjectJs(); |
1084 initProvider(); | |
1085 } | |
1098 | 1086 |
1099 if (adblockEngine == null) | 1087 private void initProvider() |
sergei
2018/01/19 13:56:41
Would it be better to call it ensureAbpProvider()?
anton
2018/01/22 06:17:36
Acknowledged.
| |
1088 { | |
1089 // if AdblockWebView works as drop-in replacement for WebView 'provider' is not set. | |
1090 // Thus AdblockWebView is using SingleInstanceEngineProvider instance | |
1091 if (provider == null) | |
1100 { | 1092 { |
1101 createAdblockEngine(); | 1093 setProvider(new SingleInstanceEngineProvider( |
1102 disposeEngine = true; | 1094 getContext(), AdblockEngine.BASE_PATH_DIRECTORY, debugMode)); |
1103 } | 1095 } |
1104 } | 1096 } |
1105 | 1097 |
1106 private void startAbpLoading(String newUrl) | 1098 private void startAbpLoading(String newUrl) |
1107 { | 1099 { |
1108 d("Start loading " + newUrl); | 1100 d("Start loading " + newUrl); |
1109 | 1101 |
1110 loading = true; | 1102 loading = true; |
1111 addDomListener = true; | 1103 addDomListener = true; |
1112 elementsHidden = false; | 1104 elementsHidden = false; |
1113 loadError = null; | 1105 loadError = null; |
1114 url = newUrl; | 1106 url = newUrl; |
1115 | 1107 |
1116 if (url != null && adblockEngine != null) | 1108 if (url != null) |
1117 { | 1109 { |
1118 try | 1110 try |
1119 { | 1111 { |
1120 domain = adblockEngine.getFilterEngine().getHostFromURL(url); | 1112 d("Waiting for adblock engine"); |
1113 provider.waitForReady(); | |
1114 | |
1115 domain = provider.getEngine().getFilterEngine().getHostFromURL(url); | |
1121 if (domain == null) | 1116 if (domain == null) |
1122 { | 1117 { |
1123 throw new RuntimeException("Failed to extract domain from " + url); | 1118 throw new RuntimeException("Failed to extract domain from " + url); |
1124 } | 1119 } |
1125 | 1120 |
1126 d("Extracted domain " + domain + " from " + url); | 1121 d("Extracted domain " + domain + " from " + url); |
1127 } | 1122 } |
1128 catch (Throwable t) | 1123 catch (Throwable t) |
1129 { | 1124 { |
1130 e("Failed to extract domain from " + url, t); | 1125 e("Failed to extract domain from " + url, t); |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1373 { | 1368 { |
1374 w("Interrupted, returning empty selectors list"); | 1369 w("Interrupted, returning empty selectors list"); |
1375 return EMPTY_ELEMHIDE_ARRAY_STRING; | 1370 return EMPTY_ELEMHIDE_ARRAY_STRING; |
1376 } | 1371 } |
1377 } | 1372 } |
1378 } | 1373 } |
1379 | 1374 |
1380 private void doDispose() | 1375 private void doDispose() |
1381 { | 1376 { |
1382 w("Disposing AdblockEngine"); | 1377 w("Disposing AdblockEngine"); |
1383 adblockEngine.dispose(); | 1378 provider.release(); |
1384 adblockEngine = null; | |
1385 | |
1386 disposeEngine = false; | |
1387 } | 1379 } |
1388 | 1380 |
1389 private class DisposeRunnable implements Runnable | 1381 private class DisposeRunnable implements Runnable |
1390 { | 1382 { |
1391 private Runnable disposeFinished; | 1383 private Runnable disposeFinished; |
1392 | 1384 |
1393 private DisposeRunnable(Runnable disposeFinished) | 1385 private DisposeRunnable(Runnable disposeFinished) |
1394 { | 1386 { |
1395 this.disposeFinished = disposeFinished; | 1387 this.disposeFinished = disposeFinished; |
1396 } | 1388 } |
1397 | 1389 |
1398 @Override | 1390 @Override |
1399 public void run() | 1391 public void run() |
1400 { | 1392 { |
1401 if (disposeEngine) | 1393 doDispose(); |
1402 { | |
1403 doDispose(); | |
1404 } | |
1405 | 1394 |
1406 if (disposeFinished != null) | 1395 if (disposeFinished != null) |
1407 { | 1396 { |
1408 disposeFinished.run(); | 1397 disposeFinished.run(); |
1409 } | 1398 } |
1410 } | 1399 } |
1411 } | 1400 } |
1412 | 1401 |
1413 /** | 1402 /** |
1414 * Dispose AdblockWebView and internal adblockEngine if it was created | 1403 * Dispose AdblockWebView and internal adblockEngine if it was created |
1415 * If external AdblockEngine was passed using `setAdblockEngine()` it should b e disposed explicitly | 1404 * If external AdblockEngine was passed using `setAdblockEngine()` it should b e disposed explicitly |
1416 * Warning: runnable can be invoked from background thread | 1405 * Warning: runnable can be invoked from background thread |
1417 * @param disposeFinished runnable to run when AdblockWebView is disposed | 1406 * @param disposeFinished runnable to run when AdblockWebView is disposed |
1418 */ | 1407 */ |
1419 public void dispose(final Runnable disposeFinished) | 1408 public void dispose(final Runnable disposeFinished) |
1420 { | 1409 { |
1421 d("Dispose invoked"); | 1410 d("Dispose invoked"); |
1422 | 1411 |
1412 if (provider == null) | |
1413 { | |
1414 d("No internal AdblockEngineProvider created"); | |
1415 return; | |
1416 } | |
1417 | |
1423 stopLoading(); | 1418 stopLoading(); |
1424 | 1419 |
1425 removeJavascriptInterface(BRIDGE); | |
1426 if (!disposeEngine) | |
1427 { | |
1428 adblockEngine = null; | |
1429 } | |
1430 | |
1431 DisposeRunnable disposeRunnable = new DisposeRunnable(disposeFinished); | 1420 DisposeRunnable disposeRunnable = new DisposeRunnable(disposeFinished); |
1432 synchronized (elemHideThreadLockObject) | 1421 synchronized (elemHideThreadLockObject) |
1433 { | 1422 { |
1434 if (elemHideThread != null) | 1423 if (elemHideThread != null) |
1435 { | 1424 { |
1436 w("Busy with elemhide selectors, delayed disposing scheduled"); | 1425 w("Busy with elemhide selectors, delayed disposing scheduled"); |
1437 elemHideThread.setFinishedRunnable(disposeRunnable); | 1426 elemHideThread.setFinishedRunnable(disposeRunnable); |
1438 } | 1427 } |
1439 else | 1428 else |
1440 { | 1429 { |
1441 disposeRunnable.run(); | 1430 disposeRunnable.run(); |
1442 } | 1431 } |
1443 } | 1432 } |
1444 } | 1433 } |
1445 } | 1434 } |
OLD | NEW |