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 800 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |