| // 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(); |
| } |
| } |
| } |