From f0c289e24cc2315f5570f5643456ad8191c1216b Mon Sep 17 00:00:00 2001 From: Steve Block Date: Fri, 17 Sep 2010 12:49:45 +0100 Subject: Fix DumpRenderTree2 to correctly add JavaScript interfaces to new windows When adding JavaScript interfaces to a WebView, they must be passed to the WebView constructor, rather than to WebView.addJavascriptInterface() if they are to be used immediately without the risk of race conditions. This fixes LayoutTest http/tests/appcache/crash-when-navigating-away-then-back.html This was fixed for DumpRenderTree in https://android-git.corp.google.com/g/23804 Change-Id: I1581d6d6cfc1b35be1ec2f2e5b5b944da2b4b935 --- .../dumprendertree2/LayoutTestsExecutor.java | 23 ++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) (limited to 'tests/DumpRenderTree2/src') diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java index b9fc274..20687e5 100644 --- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java +++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java @@ -236,7 +236,7 @@ public class LayoutTestsExecutor extends Activity { * We never display the new window, just create the view and allow it's content to * execute and be recorded by the executor. */ - newWindowWebView = new WebView(LayoutTestsExecutor.this); + newWindowWebView = createWebViewWithJavascriptInterfaces(); setupWebView(newWindowWebView); } @@ -317,7 +317,7 @@ public class LayoutTestsExecutor extends Activity { mCurrentResult = null; mCurrentAdditionalTextOutput = null; - mCurrentWebView = new WebView(this); + mCurrentWebView = createWebViewWithJavascriptInterfaces(); setupWebView(mCurrentWebView); mEventSender.reset(mCurrentWebView); @@ -329,11 +329,26 @@ public class LayoutTestsExecutor extends Activity { } } + private static class WebViewWithJavascriptInterfaces extends WebView { + public WebViewWithJavascriptInterfaces( + Context context, Map javascriptInterfaces) { + super(context, + null, // attribute set + 0, // default style resource ID + javascriptInterfaces, + false); // is private browsing + } + } + private WebView createWebViewWithJavascriptInterfaces() { + Map javascriptInterfaces = new HashMap(); + javascriptInterfaces.put("layoutTestController", mLayoutTestController); + javascriptInterfaces.put("eventSender", mEventSender); + return new WebViewWithJavascriptInterfaces(this, javascriptInterfaces); + } + private void setupWebView(WebView webView) { webView.setWebViewClient(mWebViewClient); webView.setWebChromeClient(mWebChromeClient); - webView.addJavascriptInterface(mLayoutTestController, "layoutTestController"); - webView.addJavascriptInterface(mEventSender, "eventSender"); /** * Setting a touch interval of -1 effectively disables the optimisation in WebView -- cgit v1.1