package com.github.seanzor.webgl.detect; import android.annotation.TargetApi; import android.os.Build; import android.webkit.WebView; import android.webkit.WebViewClient; class WebViewClientChecker extends WebViewClient{ final private OnReceiveDetectJsResult mDetectJsResult; private final OnFinishListener mOnFinishListener; private boolean noErrorRaised = true; @TargetApi(Build.VERSION_CODES.KITKAT) WebViewClientChecker(OnReceiveDetectJsResult detectJsResult, OnFinishListener onFinishListener) { mDetectJsResult = detectJsResult; mOnFinishListener = onFinishListener; } @TargetApi(Build.VERSION_CODES.KITKAT) @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // If the page is ready if (noErrorRaised) { // Fire the js function view.evaluateJavascript(JS_CHECKER, new DetectJsCallback(mDetectJsResult, mOnFinishListener)); } else { // Else, this is a dead end, report Unknown status mDetectJsResult.onReceiveDetectJsResult(WebGLSupportLevel.UNKNOWN); } } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { noErrorRaised = false; } /** * Detects if WebGL is enabled. * Inspired from http://www.browserleaks.com/webgl#howto-detect-webgl * Source code available here: https://gist.github.com/SeanZoR/cfa7a6206983b775a858 * <p/> * This code is in here, and not in Android Assets folder as expected because * libraries can't be wrapped with the assets within. * <p/> * returns a { number } -1 for not SUPPORTED, * 0 for disabled * 1 for enabled */ final private String JS_CHECKER = "function detectWebGL()\n" + "{\n" + " // Check for the WebGL rendering context\n" + " if ( !! window.WebGLRenderingContext) {\n" + " var canvas = document.createElement(\"canvas\"),\n" + " names = [\"webgl\", \"experimental-webgl\", \"moz-webgl\", \"webkit-3d\"],\n" + " context = false;\n" + "\n" + " for (var i in names) {\n" + " try {\n" + " context = canvas.getContext(names[i]);\n" + " if (context && typeof context.getParameter === \"function\") {\n" + " // WebGL is enabled.\n" + " return 1;\n" + " }\n" + " } catch (e) {}\n" + " }\n" + "\n" + " // WebGL is supported, but disabled.\n" + " return 0;\n" + " }\n" + "\n" + " // WebGL not supported.\n" + " return -1;\n" + "};" + "detectWebGL();"; }