// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.webview_shell; import android.app.Activity; import android.os.Bundle; import android.webkit.ConsoleMessage; import android.webkit.GeolocationPermissions; import android.webkit.PermissionRequest; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; /** * This activity is used for running layout tests using webview. The activity * creates a webview instance, loads url and captures console messages from * JavaScript until the test is finished. * provides a blocking callback. */ public class WebViewLayoutTestActivity extends Activity { private final StringBuilder mConsoleLog = new StringBuilder(); private final Object mLock = new Object(); private static final String TEST_FINISHED_SENTINEL = "TEST FINISHED"; private WebView mWebView; private boolean mFinished = false; private static final String[] AUTOMATICALLY_GRANT = { PermissionRequest.RESOURCE_VIDEO_CAPTURE, PermissionRequest.RESOURCE_AUDIO_CAPTURE }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_webview); mWebView = (WebView) findViewById(R.id.webview); WebSettings settings = mWebView.getSettings(); initializeSettings(settings); mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView webView, String url) { return false; } }); mWebView.setWebChromeClient(new WebChromeClient() { @Override public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { callback.invoke(origin, true, false); } @Override public void onPermissionRequest(PermissionRequest request) { request.grant(AUTOMATICALLY_GRANT); } @Override public boolean onConsoleMessage(ConsoleMessage consoleMessage) { // TODO(timvolodine): put log and warnings in separate string builders. mConsoleLog.append(consoleMessage.message() + "\n"); if (consoleMessage.message().equals(TEST_FINISHED_SENTINEL)) { finishTest(); } return true; } }); } public void waitForFinish(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException { synchronized (mLock) { long deadline = System.currentTimeMillis() + unit.toMillis(timeout); while (!mFinished && System.currentTimeMillis() < deadline) { mLock.wait(deadline - System.currentTimeMillis()); } if (!mFinished) { throw new TimeoutException("timeout"); } } } public String getTestResult() { return mConsoleLog.toString(); } public void loadUrl(String url) { mWebView.loadUrl(url); mWebView.requestFocus(); } private void initializeSettings(WebSettings settings) { settings.setJavaScriptEnabled(true); settings.setGeolocationEnabled(true); } private void finishTest() { mFinished = true; synchronized (mLock) { mLock.notifyAll(); } } }