正在查看: Top浏览器 v4.6.16 应用的 AdblockWebView.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
正在查看: Top浏览器 v4.6.16 应用的 AdblockWebView.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
package org.adblockplus.libadblockplus.android.webview;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Pair;
import android.webkit.ConsoleMessage;
import android.webkit.JavascriptInterface;
import android.webkit.WebBackForwardList;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.adblockplus.libadblockplus.FilterEngine;
import org.adblockplus.libadblockplus.HttpClient;
import org.adblockplus.libadblockplus.android.AdblockEngine;
import org.adblockplus.libadblockplus.android.AdblockEngineProvider;
import org.adblockplus.libadblockplus.android.SingleInstanceEngineProvider;
import org.adblockplus.libadblockplus.android.Utils;
import org.adblockplus.libadblockplus.android.webview.content_type.ContentTypeDetector;
import org.adblockplus.libadblockplus.android.webview.content_type.HeadersContentTypeDetector;
import org.adblockplus.libadblockplus.android.webview.content_type.OrderedContentTypeDetector;
import org.adblockplus.libadblockplus.android.webview.content_type.UrlFileExtensionTypeDetector;
import org.adblockplus.libadblockplus.sitekey.PublicKeyHolderImpl;
import org.adblockplus.libadblockplus.sitekey.SiteKeysConfiguration;
import q.a.a;
public class AdblockWebView extends WebView {
private static final String ASSETS_CHARSET_NAME = "UTF-8";
private static final String BRIDGE = "jsBridge";
private static final String BRIDGE_TOKEN = "{{BRIDGE}}";
private static final String DEBUG_TOKEN = "{{DEBUG}}";
private static final String EMPTY_ELEMHIDE_ARRAY_STRING = "[]";
private static final String EMPTY_ELEMHIDE_STRING = "";
private static final String HIDDEN_TOKEN = "{{HIDDEN_FLAG}}";
private static final String HIDE_TOKEN = "{{HIDE}}";
private static final String SITEKEY_EXTRACTED_TOKEN = "{{SITEKEY_EXTRACTED_FLAG}}";
private final AtomicReference<OptionalBoolean> adblockEnabled;
private OrderedContentTypeDetector contentTypeDetector;
private String elementsHiddenFlag;
private String elemhideBlockedJs;
private final AdblockEngineProvider.EngineCreatedListener engineCreatedCb;
private final AdblockEngineProvider.EngineDisposedListener engineDisposedCb;
private final AdblockEngine.SettingsChangedListener engineSettingsChangedCb;
private final AtomicReference<EventsListener> eventsListenerAtomicReference;
private String injectJs;
private ProxyWebChromeClient intWebChromeClient;
private ProxyWebViewClient intWebViewClient;
private final AtomicBoolean jsInIframesEnabled;
private Integer loadError;
private boolean loading;
private final AtomicReference<String> navigationUrl;
private final AtomicReference<AdblockEngineProvider> providerReference;
private SiteKeyExtractor siteKeyExtractor;
private final AtomicReference<SiteKeysConfiguration> siteKeysConfiguration;
private String sitekeyExtractedFlag;
private final Map<String, String> url2Referrer;
private final Map<String, Pair<String, String>> url2Stylesheets;
public enum AbpShouldBlockResult {
NOT_ENABLED,
ALLOW_LOAD,
ALLOW_LOAD_NO_SITEKEY_CHECK,
BLOCK_LOAD
}
public class AdblockWebWebChromeClient extends ProxyWebChromeClient {
public AdblockWebWebChromeClient(WebChromeClient webChromeClient) {
super(webChromeClient);
}
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
a.a("JS: level=%s, message=\"%s\", sourceId=\"%s\", line=%d", new Object[]{consoleMessage.messageLevel(), consoleMessage.message(), consoleMessage.sourceId(), Integer.valueOf(consoleMessage.lineNumber())});
return super.onConsoleMessage(consoleMessage);
}
@Override
public void onProgressChanged(WebView webView, int i2) {
a.a("onProgressChanged to %d%% for url: %s", new Object[]{Integer.valueOf(i2), webView.getUrl()});
AdblockWebView.this.tryInjectJs();
super.onProgressChanged(webView, i2);
}
}
public class DisposeRunnable implements Runnable {
private final Runnable disposeFinished;
@Override
public void run() {
AdblockWebView.this.doDispose();
Runnable runnable = this.disposeFinished;
if (runnable != null) {
runnable.run();
}
}
private DisposeRunnable(Runnable runnable) {
this.disposeFinished = runnable;
}
}
public interface EventsListener {
public enum AllowlistReason {
DOCUMENT,
DOMAIN,
FILTER
}
public static final class AllowlistedResourceInfo extends ResourceInfo {
private final AllowlistReason reason;
public AllowlistedResourceInfo(String str, List<String> list, AllowlistReason allowlistReason) {
super(str, list);
this.reason = allowlistReason;
}
public AllowlistReason getReason() {
return this.reason;
}
}
public static final class BlockedResourceInfo extends ResourceInfo {
private final FilterEngine.ContentType contentType;
public BlockedResourceInfo(String str, List<String> list, FilterEngine.ContentType contentType) {
super(str, list);
this.contentType = contentType;
}
public FilterEngine.ContentType getContentType() {
return this.contentType;
}
}
public static class ResourceInfo {
private final List<String> parentFrameUrls;
private final String requestUrl;
public ResourceInfo(String str, List<String> list) {
this.requestUrl = str;
this.parentFrameUrls = new ArrayList(list);
}
public List<String> getParentFrameUrls() {
return this.parentFrameUrls;
}
public String getRequestUrl() {
return this.requestUrl;
}
}
void onNavigation();
void onResourceLoadingAllowlisted(AllowlistedResourceInfo allowlistedResourceInfo);
void onResourceLoadingBlocked(BlockedResourceInfo blockedResourceInfo);
}
public enum OptionalBoolean {
UNDEFINED,
TRUE,
FALSE;
public static OptionalBoolean from(boolean z) {
return z ? TRUE : FALSE;
}
}
public static class WebResponseResult {
public static final WebResourceResponse ALLOW_LOAD = null;
public static final String RESPONSE_CHARSET_NAME = "UTF-8";
public static final String RESPONSE_MIME_TYPE = "text/plain";
public static final WebResourceResponse BLOCK_LOAD = new WebResourceResponse(RESPONSE_MIME_TYPE, "UTF-8", null);
}
public AdblockWebView(Context context) {
super(context);
this.providerReference = new AtomicReference<>();
this.url2Referrer = Collections.synchronizedMap(new HashMap());
this.url2Stylesheets = Collections.synchronizedMap(new HashMap());
this.navigationUrl = new AtomicReference<>();
this.adblockEnabled = new AtomicReference<>(OptionalBoolean.UNDEFINED);
this.eventsListenerAtomicReference = new AtomicReference<>();
this.siteKeysConfiguration = new AtomicReference<>();
this.jsInIframesEnabled = new AtomicBoolean(false);
this.engineSettingsChangedCb = new AdblockEngine.SettingsChangedListener() {
@Override
public void onEnableStateChanged(boolean z) {
OptionalBoolean from = OptionalBoolean.from(z);
OptionalBoolean optionalBoolean = (OptionalBoolean) AdblockWebView.this.adblockEnabled.getAndSet(from);
if (optionalBoolean == OptionalBoolean.UNDEFINED || optionalBoolean == from) {
return;
}
a.a("Filter Engine status changed, enable status is %s", new Object[]{from});
AdblockWebView.this.post(new Runnable() {
@Override
public void run() {
AdblockWebView.this.clearCache(true);
}
});
}
};
this.engineCreatedCb = new AdblockEngineProvider.EngineCreatedListener() {
@Override
public void onAdblockEngineCreated(AdblockEngine adblockEngine) {
AdblockWebView.this.adblockEnabled.set(OptionalBoolean.from(adblockEngine.isEnabled()));
a.a("Filter Engine created, enable status is %s", new Object[]{AdblockWebView.this.adblockEnabled.get()});
adblockEngine.addSettingsChangedListener(AdblockWebView.this.engineSettingsChangedCb);
}
};
this.engineDisposedCb = new AdblockEngineProvider.EngineDisposedListener() {
@Override
public void onAdblockEngineDisposed() {
AdblockWebView.this.adblockEnabled.set(OptionalBoolean.UNDEFINED);
}
};
initAbp();
}
public List<String> buildFramesHierarchy(String str) {
ArrayList arrayList = new ArrayList();
String str2 = str;
while (true) {
str2 = this.url2Referrer.get(str2);
if (str2 == null) {
break;
}
if (arrayList.contains(str2)) {
a.g("Detected referrer loop, finished creating referrers list", new Object[0]);
break;
}
arrayList.add(str2);
}
String str3 = this.navigationUrl.get();
if (TextUtils.isEmpty(str3)) {
return arrayList;
}
String domain = Utils.getDomain(str3);
if (TextUtils.isEmpty(domain)) {
a.b("buildFramesHierarchy() failed to obtain a domain from url " + str3, new Object[0]);
return arrayList;
}
boolean z = (arrayList.isEmpty() || domain.equals(Utils.getDomain((String) arrayList.get(arrayList.size() - 1)))) ? false : true;
if (arrayList.isEmpty() || z) {
a.a("Adding top level referrer `%s` for `%s`", new Object[]{str3, str});
arrayList.add(str3);
}
return arrayList;
}
private void buildInjectJs() {
try {
if (this.injectJs == null) {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(readScriptFile("inject.js").replace(HIDE_TOKEN, readScriptFile("css.js")));
stringBuffer.append(readScriptFile("elemhideemu.js"));
this.injectJs = stringBuffer.toString();
}
if (this.elemhideBlockedJs == null) {
this.elemhideBlockedJs = readScriptFile("elemhideblocked.js");
}
} catch (IOException e2) {
a.d(e2, "Failed to read script", new Object[0]);
}
}
public void clearReferrers() {
a.a("Clearing referrers", new Object[0]);
this.url2Referrer.clear();
}
public void clearStylesheets() {
a.a("Clearing stylesheet", new Object[0]);
this.url2Stylesheets.clear();
}
public void doDispose() {
a.g("Disposing AdblockEngine", new Object[0]);
getProvider().release();
}
public void elemhideBlockedResource(final String str) {
try {
String extractPathWithQuery = Utils.extractPathWithQuery(str);
if (extractPathWithQuery.startsWith("/")) {
extractPathWithQuery = extractPathWithQuery.substring(1);
}
a.a("Trying to elemhide visible blocked resource with url `%s` and path `%s`", new Object[]{str, extractPathWithQuery});
final StringBuilder sb = new StringBuilder();
sb.append("[src$='");
sb.append(extractPathWithQuery);
sb.append("'], [srcset$='");
sb.append(extractPathWithQuery);
sb.append("']");
post(new Runnable() {
@Override
public void run() {
AdblockWebView.this.evaluateJavascript(AdblockWebView.this.elemhideBlockedJs + "\n\nelemhideForSelector(\"" + str + "\", \"" + Utils.escapeJavaScriptString(sb.toString()) + "\", 0)", null);
}
});
} catch (MalformedURLException unused) {
a.b("Failed to parse URI for blocked resource:" + str + ". Skipping element hiding", new Object[0]);
}
}
public ContentTypeDetector ensureContentTypeDetectorCreatedAndGet() {
if (this.contentTypeDetector == null) {
this.contentTypeDetector = new OrderedContentTypeDetector(new HeadersContentTypeDetector(), new UrlFileExtensionTypeDetector());
}
return this.contentTypeDetector;
}
private void ensureProvider() {
if (getProvider() == null) {
setProvider(new SingleInstanceEngineProvider(AdblockEngine.builder(getContext(), AdblockEngine.BASE_PATH_DIRECTORY)));
}
}
private EventsListener getEventsListener() {
return this.eventsListenerAtomicReference.get();
}
public AdblockEngineProvider getProvider() {
return this.providerReference.get();
}
private Pair<String, String> getStylesheetsForUrl(String str) {
return this.url2Stylesheets.get(Utils.getUrlWithoutFragment(str));
}
@SuppressLint({"SetJavaScriptEnabled"})
private void initAbp() {
addJavascriptInterface(this, BRIDGE);
initRandom();
buildInjectJs();
getSettings().setJavaScriptEnabled(true);
this.siteKeyExtractor = new CombinedSiteKeyExtractor(this);
this.intWebChromeClient = new AdblockWebWebChromeClient(null);
this.intWebViewClient = new AdblockWebViewClient(null);
super.setWebChromeClient(this.intWebChromeClient);
super.setWebViewClient(this.intWebViewClient);
}
private void initRandom() {
Random random = new Random();
this.elementsHiddenFlag = "abp" + Math.abs(random.nextLong());
this.sitekeyExtractedFlag = "abp" + Math.abs(random.nextLong());
}
public boolean isVisibleResource(FilterEngine.ContentType contentType) {
return contentType == FilterEngine.ContentType.IMAGE || contentType == FilterEngine.ContentType.MEDIA || contentType == FilterEngine.ContentType.OBJECT || contentType == FilterEngine.ContentType.SUBDOCUMENT;
}
private void loadUrlCommon() {
ensureProvider();
if (this.loading) {
stopAbpLoading();
}
this.siteKeyExtractor.startNewPage();
}
public void notifyNavigation() {
EventsListener eventsListener = getEventsListener();
if (eventsListener != null) {
eventsListener.onNavigation();
}
}
public void notifyResourceAllowlisted(EventsListener.AllowlistedResourceInfo allowlistedResourceInfo) {
EventsListener eventsListener = getEventsListener();
if (eventsListener != null) {
eventsListener.onResourceLoadingAllowlisted(allowlistedResourceInfo);
}
}
public void notifyResourceBlocked(EventsListener.BlockedResourceInfo blockedResourceInfo) {
EventsListener eventsListener = getEventsListener();
if (eventsListener != null) {
eventsListener.onResourceLoadingBlocked(blockedResourceInfo);
}
}
private String readScriptFile(String str) {
return Utils.readAssetAsString(getContext(), str, "UTF-8").replace(BRIDGE_TOKEN, BRIDGE).replace(DEBUG_TOKEN, "//").replace(HIDDEN_TOKEN, this.elementsHiddenFlag).replace(SITEKEY_EXTRACTED_TOKEN, this.sitekeyExtractedFlag);
}
private void runScript(String str) {
a.a("runScript started", new Object[0]);
evaluateJavascript(str, null);
a.a("runScript finished", new Object[0]);
}
public void startAbpLoading(String str) {
a.a("Start loading %s", new Object[]{str});
this.loading = true;
this.loadError = null;
if (str != null) {
String urlWithoutFragment = Utils.getUrlWithoutFragment(str);
if (this.navigationUrl.compareAndSet(null, urlWithoutFragment)) {
generateStylesheetForUrl(urlWithoutFragment, true);
}
}
}
public void stopAbpLoading() {
a.a("Stop abp loading", new Object[0]);
this.loading = false;
clearReferrers();
}
public void tryInjectJs() {
if (this.adblockEnabled.get() == OptionalBoolean.TRUE && this.loadError == null && this.injectJs != null) {
a.a("Injecting script", new Object[0]);
runScript(this.injectJs);
}
}
public void dispose(Runnable runnable) {
a.a("Dispose invoked", new Object[0]);
if (getProvider() == null) {
a.a("No internal AdblockEngineProvider created", new Object[0]);
return;
}
ReentrantReadWriteLock.ReadLock readEngineLock = getProvider().getReadEngineLock();
readEngineLock.lock();
try {
AdblockEngine engine = getProvider().getEngine();
if (engine != null) {
engine.removeSettingsChangedListener(this.engineSettingsChangedCb);
}
getProvider().removeEngineCreatedListener(this.engineCreatedCb);
getProvider().removeEngineDisposedListener(this.engineDisposedCb);
readEngineLock.unlock();
stopLoading();
new DisposeRunnable(runnable).run();
} catch (Throwable th) {
readEngineLock.unlock();
throw th;
}
}
public void enableJsInIframes(boolean z) {
if (z && getSiteKeysConfiguration() == null) {
throw new IllegalStateException("Site Keys configuration must be set (enabled) to use this feature!");
}
this.jsInIframesEnabled.set(z);
}
public boolean generateStylesheetForUrl(String str, boolean z) {
String str2;
boolean z2;
String str3;
boolean jsInIframesEnabled = getJsInIframesEnabled();
a.a("generateStylesheetForUrl() called for url %s, isMainFrame = %b, isJsInIframesEnabled == %b", new Object[]{str, Boolean.valueOf(z), Boolean.valueOf(jsInIframesEnabled)});
if (!z && !jsInIframesEnabled) {
return false;
}
String domain = Utils.getDomain(str);
if (TextUtils.isEmpty(domain)) {
a.b("Failed to extract domain from %s", new Object[]{str});
return false;
}
Pair<String, String> pair = this.url2Stylesheets.get(str);
if (pair != null) {
return (((String) pair.first).equals("") && ((String) pair.second).equals(EMPTY_ELEMHIDE_ARRAY_STRING)) ? false : true;
}
ReentrantReadWriteLock.ReadLock readEngineLock = getProvider().getReadEngineLock();
readEngineLock.lock();
try {
if (getProvider().getCounter() != 0) {
readEngineLock.unlock();
getProvider().waitForReady();
readEngineLock.lock();
if (getProvider().getCounter() != 0) {
z2 = false;
if (!z2 || getProvider().getEngine() == null) {
str3 = EMPTY_ELEMHIDE_ARRAY_STRING;
str2 = "";
} else {
FilterEngine filterEngine = getProvider().getEngine().getFilterEngine();
a.a("Requesting elemhide selectors from AdblockEngine for %s", new Object[]{domain});
List<String> arrayList = z ? new ArrayList<>() : buildFramesHierarchy(str);
arrayList.add(0, str);
SiteKeysConfiguration siteKeysConfiguration = getSiteKeysConfiguration();
String stripPadding = siteKeysConfiguration != null ? PublicKeyHolderImpl.stripPadding(siteKeysConfiguration.getPublicKeyHolder().getAny(arrayList, "")) : null;
if (!z && siteKeysConfiguration != null && stripPadding.isEmpty()) {
a.a("Waiting for a site key when handling %s", new Object[]{str});
if (this.siteKeyExtractor.waitForSitekeyCheck(str, z)) {
stripPadding = PublicKeyHolderImpl.stripPadding(siteKeysConfiguration.getPublicKeyHolder().getAny(arrayList, ""));
}
}
String str4 = stripPadding;
boolean isContentAllowlisted = filterEngine.isContentAllowlisted(str, FilterEngine.ContentType.maskOf(FilterEngine.ContentType.GENERICHIDE), arrayList, str4);
str2 = getProvider().getEngine().getElementHidingStyleSheet(str, domain, arrayList, str4, isContentAllowlisted);
try {
StringBuilder sb = new StringBuilder();
sb.append("Finished requesting elemhide stylesheet, got %d symbols");
sb.append(isContentAllowlisted ? " (specificOnly)" : "");
sb.append(" for %s");
a.a(sb.toString(), new Object[]{Integer.valueOf(str2.length()), domain});
a.a("Requesting elemhideemu selectors from AdblockEngine for %s", new Object[]{domain});
List<FilterEngine.EmulationSelector> elementHidingEmulationSelectors = getProvider().getEngine().getElementHidingEmulationSelectors(str, domain, arrayList, str4);
a.a("Finished requesting elemhideemu selectors, got %d symbols for %s", new Object[]{Integer.valueOf(elementHidingEmulationSelectors.size()), domain});
str3 = Utils.emulationSelectorListToJsonArray(elementHidingEmulationSelectors);
} catch (Throwable unused) {
readEngineLock.unlock();
this.url2Stylesheets.put(str, new Pair<>(str2, EMPTY_ELEMHIDE_ARRAY_STRING));
return !str2.equals("");
}
}
readEngineLock.unlock();
this.url2Stylesheets.put(str, new Pair<>(str2, str3));
return str2.equals("") || !str3.equals(EMPTY_ELEMHIDE_ARRAY_STRING);
}
}
z2 = true;
if (z2) {
}
str3 = EMPTY_ELEMHIDE_ARRAY_STRING;
str2 = "";
readEngineLock.unlock();
this.url2Stylesheets.put(str, new Pair<>(str2, str3));
if (str2.equals("")) {
}
} catch (Throwable unused2) {
str2 = "";
}
}
@JavascriptInterface
public String getElemhideEmulationSelectors(String str) {
Pair<String, String> stylesheetsForUrl = getStylesheetsForUrl(str);
if (stylesheetsForUrl == null) {
return EMPTY_ELEMHIDE_ARRAY_STRING;
}
a.a("Elemhideemu selectors for `%s`, %d bytes", new Object[]{str, Integer.valueOf(((String) stylesheetsForUrl.second).length())});
return (String) stylesheetsForUrl.second;
}
@JavascriptInterface
public String getElemhideStyleSheet(String str) {
Pair<String, String> stylesheetsForUrl = getStylesheetsForUrl(str);
if (stylesheetsForUrl == null) {
return "";
}
a.a("Elemhide selectors for `%s`, %d bytes", new Object[]{str, Integer.valueOf(((String) stylesheetsForUrl.first).length())});
return (String) stylesheetsForUrl.first;
}
public String getInjectJs() {
return this.injectJs;
}
public boolean getJsInIframesEnabled() {
return this.jsInIframesEnabled.get() && getSiteKeysConfiguration() != null;
}
public String getNavigationUrl() {
return this.navigationUrl.get();
}
public SiteKeyExtractor getSiteKeyExtractor() {
return this.siteKeyExtractor;
}
public SiteKeysConfiguration getSiteKeysConfiguration() {
return this.siteKeysConfiguration.get();
}
@Override
public void goBack() {
if (this.loading) {
stopAbpLoading();
}
if (canGoBack()) {
this.navigationUrl.set(null);
this.siteKeyExtractor.startNewPage();
}
super.goBack();
}
@Override
public void goForward() {
if (this.loading) {
stopAbpLoading();
}
if (canGoForward()) {
this.navigationUrl.set(null);
this.siteKeyExtractor.startNewPage();
}
super.goForward();
}
@Override
public void loadData(String str, String str2, String str3) {
loadUrlCommon();
super.loadData(str, str2, str3);
}
@Override
public void loadDataWithBaseURL(String str, String str2, String str3, String str4, String str5) {
loadUrlCommon();
super.loadDataWithBaseURL(str, str2, str3, str4, str5);
}
@Override
public void loadUrl(String str) {
loadUrlCommon();
super.loadUrl(str);
}
@Override
public void reload() {
ensureProvider();
if (this.loading) {
stopAbpLoading();
}
super.reload();
}
@Override
public WebBackForwardList restoreState(Bundle bundle) {
this.siteKeyExtractor.startNewPage();
return super.restoreState(bundle);
}
public void setEventsListener(EventsListener eventsListener) {
this.eventsListenerAtomicReference.set(eventsListener);
}
public void setProvider(final AdblockEngineProvider adblockEngineProvider) {
if (adblockEngineProvider == null) {
throw new IllegalArgumentException("Provider cannot be null");
}
if (getProvider() == adblockEngineProvider) {
return;
}
Runnable runnable = new Runnable() {
@Override
public void run() {
AdblockWebView.this.providerReference.set(adblockEngineProvider);
ReentrantReadWriteLock.ReadLock readEngineLock = adblockEngineProvider.getReadEngineLock();
boolean tryLock = readEngineLock.tryLock();
try {
AdblockWebView.this.getProvider().retain(true);
if (!tryLock || AdblockWebView.this.getProvider().getEngine() == null) {
AdblockWebView.this.getProvider().addEngineCreatedListener(AdblockWebView.this.engineCreatedCb);
AdblockWebView.this.getProvider().addEngineDisposedListener(AdblockWebView.this.engineDisposedCb);
} else {
AdblockWebView.this.adblockEnabled.set(OptionalBoolean.from(AdblockWebView.this.getProvider().getEngine().isEnabled()));
a.a("Filter Engine already created, enable status is %s", new Object[]{AdblockWebView.this.adblockEnabled});
AdblockWebView.this.getProvider().getEngine().addSettingsChangedListener(AdblockWebView.this.engineSettingsChangedCb);
}
} finally {
if (tryLock) {
readEngineLock.unlock();
}
}
}
};
if (getProvider() != null) {
dispose(runnable);
} else {
runnable.run();
}
}
public void setSiteKeyExtractor(SiteKeyExtractor siteKeyExtractor) {
this.siteKeyExtractor = siteKeyExtractor;
}
public void setSiteKeysConfiguration(SiteKeysConfiguration siteKeysConfiguration) {
this.siteKeysConfiguration.set(siteKeysConfiguration);
this.siteKeyExtractor.setSiteKeysConfiguration(siteKeysConfiguration);
}
@Override
public void setWebChromeClient(WebChromeClient webChromeClient) {
this.intWebChromeClient.setExtWebChromeClient(webChromeClient);
}
@Override
public void setWebViewClient(WebViewClient webViewClient) {
this.intWebViewClient.setExtWebViewClient(webViewClient);
}
@Override
public void stopLoading() {
stopAbpLoading();
super.stopLoading();
}
public class AdblockWebViewClient extends ProxyWebViewClient {
public AdblockWebViewClient(WebViewClient webViewClient) {
super(webViewClient);
}
private String getFirstParent(List<String> list) {
return (list == null || list.size() == 0) ? "" : list.get(0);
}
private AbpShouldBlockResult notifyAndReturnBlockingResponse(String str, List<String> list, FilterEngine.ContentType contentType) {
if (AdblockWebView.this.isVisibleResource(contentType)) {
AdblockWebView.this.elemhideBlockedResource(str);
}
AdblockWebView.this.notifyResourceBlocked(new EventsListener.BlockedResourceInfo(str, list, contentType));
return AbpShouldBlockResult.BLOCK_LOAD;
}
private org.adblockplus.libadblockplus.android.webview.AdblockWebView.AbpShouldBlockResult shouldAbpBlockRequest(android.webkit.WebResourceRequest r31) {
throw new UnsupportedOperationException("Method not decompiled: org.adblockplus.libadblockplus.android.webview.AdblockWebView.AdblockWebViewClient.shouldAbpBlockRequest(android.webkit.WebResourceRequest):org.adblockplus.libadblockplus.android.webview.AdblockWebView$AbpShouldBlockResult");
}
@Override
public void onPageFinished(WebView webView, String str) {
a.a("onPageFinished called for url %s", new Object[]{str});
AdblockWebView.this.loading = false;
super.onPageFinished(webView, str);
}
@Override
public void onPageStarted(WebView webView, String str, Bitmap bitmap) {
a.a("onPageStarted called for url %s", new Object[]{str});
if (AdblockWebView.this.loading) {
AdblockWebView.this.stopAbpLoading();
}
AdblockWebView.this.startAbpLoading(str);
AdblockWebView.this.notifyNavigation();
super.onPageStarted(webView, str, bitmap);
}
@Override
public void onReceivedError(WebView webView, int i2, String str, String str2) {
a.b("onReceivedError: code=%d with description=%s for url=%s", new Object[]{Integer.valueOf(i2), str, str2});
AdblockWebView.this.loadError = Integer.valueOf(i2);
super.onReceivedError(webView, i2, str, str2);
}
@Override
@TargetApi(21)
public WebResourceResponse shouldInterceptRequest(WebView webView, WebResourceRequest webResourceRequest) {
WebResourceResponse shouldInterceptRequest;
if (webResourceRequest.isForMainFrame()) {
a.a("Updating navigationUrl to `%s`", new Object[]{webResourceRequest.getUrl().toString()});
AdblockWebView.this.navigationUrl.set(Utils.getUrlWithoutFragment(webResourceRequest.getUrl().toString()));
}
AbpShouldBlockResult shouldAbpBlockRequest = shouldAbpBlockRequest(webResourceRequest);
if (AbpShouldBlockResult.NOT_ENABLED.equals(shouldAbpBlockRequest)) {
AdblockWebView.this.clearStylesheets();
return WebResponseResult.ALLOW_LOAD;
}
if (AbpShouldBlockResult.BLOCK_LOAD.equals(shouldAbpBlockRequest)) {
return WebResponseResult.BLOCK_LOAD;
}
Map<String, String> requestHeaders = webResourceRequest.getRequestHeaders();
String uri = webResourceRequest.getUrl().toString();
WebViewClient extWebViewClient = getExtWebViewClient();
if (extWebViewClient == null || (shouldInterceptRequest = extWebViewClient.shouldInterceptRequest(webView, webResourceRequest)) == null) {
if (AbpShouldBlockResult.ALLOW_LOAD_NO_SITEKEY_CHECK.equals(shouldAbpBlockRequest)) {
return WebResponseResult.ALLOW_LOAD;
}
if (!requestHeaders.containsKey(HttpClient.HEADER_REQUESTED_RANGE)) {
return AdblockWebView.this.siteKeyExtractor.extract(webResourceRequest);
}
a.a("Skipping site key check for the request with a Range header", new Object[0]);
return WebResponseResult.ALLOW_LOAD;
}
if (AbpShouldBlockResult.ALLOW_LOAD_NO_SITEKEY_CHECK.equals(shouldAbpBlockRequest)) {
a.a("Skipped verifying of the site keys with external shouldInterceptRequest response", new Object[0]);
} else {
a.a("Verifying site keys with external shouldInterceptRequest response", new Object[0]);
AdblockWebView.this.getSiteKeysConfiguration().getSiteKeyVerifier().verifyInHeaders(uri, requestHeaders, shouldInterceptRequest.getResponseHeaders());
a.a("Finished verifying, returning external response and stop", new Object[0]);
}
return shouldInterceptRequest;
}
@Override
public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest webResourceRequest) {
a.a("shouldOverrideUrlLoading called for view.getUrl() %s", new Object[]{webView.getUrl()});
AdblockWebView.this.clearReferrers();
return super.shouldOverrideUrlLoading(webView, webResourceRequest);
}
@Override
public boolean shouldOverrideUrlLoading(WebView webView, String str) {
a.a("shouldOverrideUrlLoading called for url %s", new Object[]{str});
AdblockWebView.this.clearReferrers();
return super.shouldOverrideUrlLoading(webView, str);
}
@Override
@TargetApi(23)
public void onReceivedError(WebView webView, WebResourceRequest webResourceRequest, WebResourceError webResourceError) {
a.b("onReceivedError: code=%d with description=%s for url=%s request.isForMainFrame()=%s", new Object[]{Integer.valueOf(webResourceError.getErrorCode()), webResourceError.getDescription(), webResourceRequest.getUrl(), Boolean.valueOf(webResourceRequest.isForMainFrame())});
super.onReceivedError(webView, webResourceRequest, webResourceError);
}
}
@Override
public void loadUrl(String str, Map<String, String> map) {
loadUrlCommon();
super.loadUrl(str, map);
}
public AdblockWebView(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
this.providerReference = new AtomicReference<>();
this.url2Referrer = Collections.synchronizedMap(new HashMap());
this.url2Stylesheets = Collections.synchronizedMap(new HashMap());
this.navigationUrl = new AtomicReference<>();
this.adblockEnabled = new AtomicReference<>(OptionalBoolean.UNDEFINED);
this.eventsListenerAtomicReference = new AtomicReference<>();
this.siteKeysConfiguration = new AtomicReference<>();
this.jsInIframesEnabled = new AtomicBoolean(false);
this.engineSettingsChangedCb = new AdblockEngine.SettingsChangedListener() {
@Override
public void onEnableStateChanged(boolean z) {
OptionalBoolean from = OptionalBoolean.from(z);
OptionalBoolean optionalBoolean = (OptionalBoolean) AdblockWebView.this.adblockEnabled.getAndSet(from);
if (optionalBoolean == OptionalBoolean.UNDEFINED || optionalBoolean == from) {
return;
}
a.a("Filter Engine status changed, enable status is %s", new Object[]{from});
AdblockWebView.this.post(new Runnable() {
@Override
public void run() {
AdblockWebView.this.clearCache(true);
}
});
}
};
this.engineCreatedCb = new AdblockEngineProvider.EngineCreatedListener() {
@Override
public void onAdblockEngineCreated(AdblockEngine adblockEngine) {
AdblockWebView.this.adblockEnabled.set(OptionalBoolean.from(adblockEngine.isEnabled()));
a.a("Filter Engine created, enable status is %s", new Object[]{AdblockWebView.this.adblockEnabled.get()});
adblockEngine.addSettingsChangedListener(AdblockWebView.this.engineSettingsChangedCb);
}
};
this.engineDisposedCb = new AdblockEngineProvider.EngineDisposedListener() {
@Override
public void onAdblockEngineDisposed() {
AdblockWebView.this.adblockEnabled.set(OptionalBoolean.UNDEFINED);
}
};
initAbp();
}
public AdblockWebView(Context context, AttributeSet attributeSet, int i2) {
super(context, attributeSet, i2);
this.providerReference = new AtomicReference<>();
this.url2Referrer = Collections.synchronizedMap(new HashMap());
this.url2Stylesheets = Collections.synchronizedMap(new HashMap());
this.navigationUrl = new AtomicReference<>();
this.adblockEnabled = new AtomicReference<>(OptionalBoolean.UNDEFINED);
this.eventsListenerAtomicReference = new AtomicReference<>();
this.siteKeysConfiguration = new AtomicReference<>();
this.jsInIframesEnabled = new AtomicBoolean(false);
this.engineSettingsChangedCb = new AdblockEngine.SettingsChangedListener() {
@Override
public void onEnableStateChanged(boolean z) {
OptionalBoolean from = OptionalBoolean.from(z);
OptionalBoolean optionalBoolean = (OptionalBoolean) AdblockWebView.this.adblockEnabled.getAndSet(from);
if (optionalBoolean == OptionalBoolean.UNDEFINED || optionalBoolean == from) {
return;
}
a.a("Filter Engine status changed, enable status is %s", new Object[]{from});
AdblockWebView.this.post(new Runnable() {
@Override
public void run() {
AdblockWebView.this.clearCache(true);
}
});
}
};
this.engineCreatedCb = new AdblockEngineProvider.EngineCreatedListener() {
@Override
public void onAdblockEngineCreated(AdblockEngine adblockEngine) {
AdblockWebView.this.adblockEnabled.set(OptionalBoolean.from(adblockEngine.isEnabled()));
a.a("Filter Engine created, enable status is %s", new Object[]{AdblockWebView.this.adblockEnabled.get()});
adblockEngine.addSettingsChangedListener(AdblockWebView.this.engineSettingsChangedCb);
}
};
this.engineDisposedCb = new AdblockEngineProvider.EngineDisposedListener() {
@Override
public void onAdblockEngineDisposed() {
AdblockWebView.this.adblockEnabled.set(OptionalBoolean.UNDEFINED);
}
};
initAbp();
}
}