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

Side by Side Diff: libadblockplus-android-webview/src/org/adblockplus/libadblockplus/android/webview/AdblockWebView.java

Issue 29691582: Issue 6366 - Elemhide thread is accessing released engine (Closed)
Patch Set: added doc Created Feb. 7, 2018, 1:53 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | libadblockplus-android/src/org/adblockplus/libadblockplus/android/AdblockEngineProvider.java » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 800 matching lines...) Expand 10 before | Expand all | Expand 10 after
811 else 811 else
812 { 812 {
813 super.onReceivedLoginRequest(view, realm, account, args); 813 super.onReceivedLoginRequest(view, realm, account, args);
814 } 814 }
815 } 815 }
816 816
817 protected WebResourceResponse shouldInterceptRequest( 817 protected WebResourceResponse shouldInterceptRequest(
818 WebView webview, String url, boolean isMainFrame, 818 WebView webview, String url, boolean isMainFrame,
819 boolean isXmlHttpRequest, String[] referrerChainArray) 819 boolean isXmlHttpRequest, String[] referrerChainArray)
820 { 820 {
821 // if dispose() was invoke, but the page is still loading then just let it go 821 synchronized (provider.getEngineLock())
822 if (provider.getCounter() == 0)
823 { 822 {
824 e("FilterEngine already disposed, allow loading"); 823 // if dispose() was invoke, but the page is still loading then just let it go
824 if (provider.getCounter() == 0)
825 {
826 e("FilterEngine already disposed, allow loading");
825 827
826 // allow loading by returning null 828 // allow loading by returning null
827 return null; 829 return null;
828 }
829 else
830 {
831 provider.waitForReady();
832 }
833
834 if (isMainFrame)
835 {
836 // never blocking main frame requests, just subrequests
837 w(url + " is main frame, allow loading");
838
839 // allow loading by returning null
840 return null;
841 }
842
843 // whitelisted
844 if (provider.getEngine().isDomainWhitelisted(url, referrerChainArray))
845 {
846 w(url + " domain is whitelisted, allow loading");
847
848 // allow loading by returning null
849 return null;
850 }
851
852 if (provider.getEngine().isDocumentWhitelisted(url, referrerChainArray))
853 {
854 w(url + " document is whitelisted, allow loading");
855
856 // allow loading by returning null
857 return null;
858 }
859
860 // determine the content
861 FilterEngine.ContentType contentType;
862 if (isXmlHttpRequest)
863 {
864 contentType = FilterEngine.ContentType.XMLHTTPREQUEST;
865 }
866 else
867 {
868 if (RE_JS.matcher(url).find())
869 {
870 contentType = FilterEngine.ContentType.SCRIPT;
871 }
872 else if (RE_CSS.matcher(url).find())
873 {
874 contentType = FilterEngine.ContentType.STYLESHEET;
875 }
876 else if (RE_IMAGE.matcher(url).find())
877 {
878 contentType = FilterEngine.ContentType.IMAGE;
879 }
880 else if (RE_FONT.matcher(url).find())
881 {
882 contentType = FilterEngine.ContentType.FONT;
883 }
884 else if (RE_HTML.matcher(url).find())
885 {
886 contentType = FilterEngine.ContentType.SUBDOCUMENT;
887 } 830 }
888 else 831 else
889 { 832 {
890 contentType = FilterEngine.ContentType.OTHER; 833 provider.waitForReady();
891 } 834 }
835
836 if (isMainFrame)
837 {
838 // never blocking main frame requests, just subrequests
839 w(url + " is main frame, allow loading");
840
841 // allow loading by returning null
842 return null;
843 }
844
845 // whitelisted
846 if (provider.getEngine().isDomainWhitelisted(url, referrerChainArray))
847 {
848 w(url + " domain is whitelisted, allow loading");
849
850 // allow loading by returning null
851 return null;
852 }
853
854 if (provider.getEngine().isDocumentWhitelisted(url, referrerChainArray))
855 {
856 w(url + " document is whitelisted, allow loading");
857
858 // allow loading by returning null
859 return null;
860 }
861
862 // determine the content
863 FilterEngine.ContentType contentType;
864 if (isXmlHttpRequest)
865 {
866 contentType = FilterEngine.ContentType.XMLHTTPREQUEST;
867 }
868 else
869 {
870 if (RE_JS.matcher(url).find())
871 {
872 contentType = FilterEngine.ContentType.SCRIPT;
873 }
874 else if (RE_CSS.matcher(url).find())
875 {
876 contentType = FilterEngine.ContentType.STYLESHEET;
877 }
878 else if (RE_IMAGE.matcher(url).find())
879 {
880 contentType = FilterEngine.ContentType.IMAGE;
881 }
882 else if (RE_FONT.matcher(url).find())
883 {
884 contentType = FilterEngine.ContentType.FONT;
885 }
886 else if (RE_HTML.matcher(url).find())
887 {
888 contentType = FilterEngine.ContentType.SUBDOCUMENT;
889 }
890 else
891 {
892 contentType = FilterEngine.ContentType.OTHER;
893 }
894 }
895
896 // check if we should block
897 if (provider.getEngine().matches(url, contentType, referrerChainArray))
898 {
899 w("Blocked loading " + url);
900
901 // if we should block, return empty response which results in 'errorLo ading' callback
902 return new WebResourceResponse("text/plain", "UTF-8", null);
903 }
904
905 d("Allowed loading " + url);
906
907 // continue by returning null
908 return null;
892 } 909 }
893
894 // check if we should block
895 if (provider.getEngine().matches(url, contentType, referrerChainArray))
896 {
897 w("Blocked loading " + url);
898
899 // if we should block, return empty response which results in 'errorLoad ing' callback
900 return new WebResourceResponse("text/plain", "UTF-8", null);
901 }
902
903 d("Allowed loading " + url);
904
905 // continue by returning null
906 return null;
907 } 910 }
908 911
909 @TargetApi(Build.VERSION_CODES.LOLLIPOP) 912 @TargetApi(Build.VERSION_CODES.LOLLIPOP)
910 @Override 913 @Override
911 public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceR equest request) 914 public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceR equest request)
912 { 915 {
913 // here we just trying to fill url -> referrer map 916 // here we just trying to fill url -> referrer map
914 // blocking/allowing loading will happen in `shouldInterceptRequest(WebVie w,String)` 917 // blocking/allowing loading will happen in `shouldInterceptRequest(WebVie w,String)`
915 String url = request.getUrl().toString(); 918 String url = request.getUrl().toString();
916 919
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
964 public ElemHideThread(CountDownLatch finishedLatch) 967 public ElemHideThread(CountDownLatch finishedLatch)
965 { 968 {
966 this.finishedLatch = finishedLatch; 969 this.finishedLatch = finishedLatch;
967 isFinished = new AtomicBoolean(false); 970 isFinished = new AtomicBoolean(false);
968 isCancelled = new AtomicBoolean(false); 971 isCancelled = new AtomicBoolean(false);
969 } 972 }
970 973
971 @Override 974 @Override
972 public void run() 975 public void run()
973 { 976 {
974 try 977 synchronized (provider.getEngineLock())
975 { 978 {
976 if (provider.getCounter() == 0) 979 try
977 { 980 {
978 w("FilterEngine already disposed"); 981 if (provider.getCounter() == 0)
979 selectorsString = EMPTY_ELEMHIDE_ARRAY_STRING;
980 }
981 else
982 {
983 provider.waitForReady();
984 String[] referrers = new String[]
985 {
986 url
987 };
988
989 List<Subscription> subscriptions = provider
990 .getEngine()
991 .getFilterEngine()
992 .getListedSubscriptions();
993
994 try
995 { 982 {
996 d("Listed subscriptions: " + subscriptions.size()); 983 w("FilterEngine already disposed");
997 if (debugMode)
998 {
999 for (Subscription eachSubscription : subscriptions)
1000 {
1001 d("Subscribed to "
1002 + (eachSubscription.isDisabled() ? "disabled" : "enabled")
1003 + " " + eachSubscription);
1004 }
1005 }
1006 }
1007 finally
1008 {
1009 for (Subscription eachSubscription : subscriptions)
1010 {
1011 eachSubscription.dispose();
1012 }
1013 }
1014
1015 final String domain = provider.getEngine().getFilterEngine().getHostFr omURL(url);
1016 if (domain == null)
1017 {
1018 e("Failed to extract domain from " + url);
1019 selectorsString = EMPTY_ELEMHIDE_ARRAY_STRING; 984 selectorsString = EMPTY_ELEMHIDE_ARRAY_STRING;
1020 } 985 }
1021 else 986 else
1022 { 987 {
1023 d("Requesting elemhide selectors from AdblockEngine for " + url + " in " + this); 988 provider.waitForReady();
1024 List<String> selectors = provider 989 String[] referrers = new String[]
990 {
991 url
992 };
993
994 List<Subscription> subscriptions = provider
1025 .getEngine() 995 .getEngine()
1026 .getElementHidingSelectors(url, domain, referrers); 996 .getFilterEngine()
997 .getListedSubscriptions();
1027 998
1028 d("Finished requesting elemhide selectors, got " + selectors.size() + " in " + this); 999 try
1029 selectorsString = Utils.stringListToJsonArray(selectors); 1000 {
1001 d("Listed subscriptions: " + subscriptions.size());
1002 if (debugMode)
1003 {
1004 for (Subscription eachSubscription : subscriptions)
1005 {
1006 d("Subscribed to "
1007 + (eachSubscription.isDisabled() ? "disabled" : "enabled")
1008 + " " + eachSubscription);
1009 }
1010 }
1011 }
1012 finally
1013 {
1014 for (Subscription eachSubscription : subscriptions)
1015 {
1016 eachSubscription.dispose();
1017 }
1018 }
1019
1020 final String domain = provider.getEngine().getFilterEngine().getHost FromURL(url);
1021 if (domain == null)
1022 {
1023 e("Failed to extract domain from " + url);
1024 selectorsString = EMPTY_ELEMHIDE_ARRAY_STRING;
1025 }
1026 else
1027 {
1028 d("Requesting elemhide selectors from AdblockEngine for " + url + " in " + this);
1029 List<String> selectors = provider
1030 .getEngine()
1031 .getElementHidingSelectors(url, domain, referrers);
1032
1033 d("Finished requesting elemhide selectors, got " + selectors.size( ) + " in " + this);
1034 selectorsString = Utils.stringListToJsonArray(selectors);
1035 }
1030 } 1036 }
1031 } 1037 }
1032 } 1038 finally
1033 finally
1034 {
1035 if (isCancelled.get())
1036 { 1039 {
1037 w("This thread is cancelled, exiting silently " + this); 1040 if (isCancelled.get())
1038 } 1041 {
1039 else 1042 w("This thread is cancelled, exiting silently " + this);
1040 { 1043 }
1041 finish(selectorsString); 1044 else
1045 {
1046 finish(selectorsString);
1047 }
1042 } 1048 }
1043 } 1049 }
1044 } 1050 }
1045 1051
1046 private void onFinished() 1052 private void onFinished()
1047 { 1053 {
1048 finishedLatch.countDown(); 1054 finishedLatch.countDown();
1049 synchronized (finishedRunnableLockObject) 1055 synchronized (finishedRunnableLockObject)
1050 { 1056 {
1051 if (finishedRunnable != null) 1057 if (finishedRunnable != null)
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
1432 w("Busy with elemhide selectors, delayed disposing scheduled"); 1438 w("Busy with elemhide selectors, delayed disposing scheduled");
1433 elemHideThread.setFinishedRunnable(disposeRunnable); 1439 elemHideThread.setFinishedRunnable(disposeRunnable);
1434 } 1440 }
1435 else 1441 else
1436 { 1442 {
1437 disposeRunnable.run(); 1443 disposeRunnable.run();
1438 } 1444 }
1439 } 1445 }
1440 } 1446 }
1441 } 1447 }
OLDNEW
« no previous file with comments | « no previous file | libadblockplus-android/src/org/adblockplus/libadblockplus/android/AdblockEngineProvider.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld