TestShellActivity.java revision 977f7691e5c852b188ac9131443bff10bc91c635
19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Copyright (C) 2007 The Android Open Source Project
39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License.
69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at
79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software
119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and
149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License.
159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage com.android.dumprendertree;
189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport com.android.dumprendertree.forwarder.ForwardService;
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.app.Activity;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.app.AlertDialog;
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.content.Context;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.content.DialogInterface;
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.content.Intent;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.content.DialogInterface.OnClickListener;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.graphics.Bitmap;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.net.http.SslError;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.os.Bundle;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.os.Handler;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.os.Message;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.util.Log;
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.view.ViewGroup;
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.webkit.GeolocationPermissions;
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.webkit.HttpAuthHandler;
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.webkit.JsPromptResult;
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.webkit.JsResult;
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.webkit.SslErrorHandler;
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.webkit.WebChromeClient;
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.webkit.WebSettings;
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.webkit.WebStorage;
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.webkit.WebView;
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.webkit.WebViewClient;
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport android.widget.LinearLayout;
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.BufferedReader;
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.File;
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.FileOutputStream;
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.FileReader;
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.IOException;
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.net.MalformedURLException;
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.net.URL;
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.HashMap;
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Map;
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Vector;
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class TestShellActivity extends Activity implements LayoutTestController {
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static enum DumpDataType {DUMP_AS_TEXT, EXT_REPR, NO_OP}
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public class AsyncHandler extends Handler {
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        @Override
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        public void handleMessage(Message msg) {
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (msg.what == MSG_TIMEOUT) {
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                mTimedOut = true;
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if(mCallback != null)
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    mCallback.timedOut(mWebView.getUrl());
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                requestWebKitData();
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return;
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else if (msg.what == MSG_WEBKIT_DATA) {
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                TestShellActivity.this.dump(mTimedOut, (String)msg.obj);
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return;
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            super.handleMessage(msg);
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void requestWebKitData() {
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Message callback = mHandler.obtainMessage(MSG_WEBKIT_DATA);
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (mRequestedWebKitData)
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throw new AssertionError("Requested webkit data twice: " + mWebView.getUrl());
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mRequestedWebKitData = true;
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        switch (mDumpDataType) {
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            case DUMP_AS_TEXT:
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                mWebView.documentAsText(callback);
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                break;
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            case EXT_REPR:
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                mWebView.externalRepresentation(callback);
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                break;
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            default:
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                finished();
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                break;
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void clearCache() {
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      mWebView.freeMemory();
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    @Override
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected void onCreate(Bundle icicle) {
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        super.onCreate(icicle);
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        LinearLayout contentView = new LinearLayout(this);
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        contentView.setOrientation(LinearLayout.VERTICAL);
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setContentView(contentView);
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mWebView = new WebView(this);
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mEventSender = new WebViewEventSender(mWebView);
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mCallbackProxy = new CallbackProxy(mEventSender, this);
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mWebView.addJavascriptInterface(mCallbackProxy, "layoutTestController");
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mWebView.addJavascriptInterface(mCallbackProxy, "eventSender");
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setupWebViewForLayoutTests(mWebView, mCallbackProxy);
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        contentView.addView(mWebView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT, 0.0f));
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mWebView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Expose window.gc function to JavaScript. JSC build exposes
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // this function by default, but V8 requires the flag to turn it on.
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // WebView::setJsFlags is noop in JSC build.
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mWebView.setJsFlags("--expose_gc");
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mHandler = new AsyncHandler();
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Intent intent = getIntent();
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (intent != null) {
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            executeIntent(intent);
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    @Override
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected void onNewIntent(Intent intent) {
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        super.onNewIntent(intent);
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        executeIntent(intent);
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private void executeIntent(Intent intent) {
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        resetTestStatus();
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (!Intent.ACTION_VIEW.equals(intent.getAction())) {
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return;
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mTestUrl = intent.getStringExtra(TEST_URL);
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (mTestUrl == null) {
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mUiAutoTestPath = intent.getStringExtra(UI_AUTO_TEST);
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if(mUiAutoTestPath != null) {
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                beginUiAutoTest();
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return;
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mResultFile = intent.getStringExtra(RESULT_FILE);
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mTimeoutInMillis = intent.getIntExtra(TIMEOUT_IN_MILLIS, 0);
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Log.v(LOGTAG, "  Loading " + mTestUrl);
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mWebView.loadUrl(mTestUrl);
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (mTimeoutInMillis > 0) {
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Create a timeout timer
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            Message m = mHandler.obtainMessage(MSG_TIMEOUT);
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mHandler.sendMessageDelayed(m, mTimeoutInMillis);
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private void beginUiAutoTest() {
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try {
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mTestListReader = new BufferedReader(
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    new FileReader(mUiAutoTestPath));
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } catch (IOException ioe) {
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            Log.e(LOGTAG, "Failed to open test list for read.", ioe);
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            finishUiAutoTest();
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return;
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        moveToNextTest();
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private void finishUiAutoTest() {
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try {
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if(mTestListReader != null)
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                mTestListReader.close();
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } catch (IOException ioe) {
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            Log.w(LOGTAG, "Failed to close test list file.", ioe);
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ForwardService.getForwardService().stopForwardService();
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        finished();
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private void moveToNextTest() {
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String url = null;
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try {
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            url = mTestListReader.readLine();
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } catch (IOException ioe) {
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            Log.e(LOGTAG, "Failed to read next test.", ioe);
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            finishUiAutoTest();
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return;
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (url == null) {
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mUiAutoTestPath = null;
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            finishUiAutoTest();
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            AlertDialog.Builder builder = new AlertDialog.Builder(this);
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            builder.setMessage("All tests finished. Exit?")
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                   .setCancelable(false)
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                   .setPositiveButton("Yes", new OnClickListener(){
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                       public void onClick(DialogInterface dialog, int which) {
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                           TestShellActivity.this.finish();
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                       }
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                   })
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                   .setNegativeButton("No", new OnClickListener(){
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                       public void onClick(DialogInterface dialog, int which) {
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                           dialog.cancel();
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                       }
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                   });
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            builder.create().show();
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return;
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Intent intent = new Intent(Intent.ACTION_VIEW);
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        intent.putExtra(TestShellActivity.TEST_URL, FsUtils.getTestUrl(url));
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        intent.putExtra(TIMEOUT_IN_MILLIS, 10000);
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        executeIntent(intent);
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    @Override
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected void onStop() {
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        super.onStop();
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mWebView.stopLoading();
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    @Override
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected void onDestroy() {
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        super.onDestroy();
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mWebView.destroy();
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mWebView = null;
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    @Override
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void onLowMemory() {
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        super.onLowMemory();
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Log.e(LOGTAG, "Low memory, clearing caches");
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mWebView.freeMemory();
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Dump the page
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void dump(boolean timeout, String webkitData) {
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (mResultFile == null || mResultFile.length() == 0) {
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            finished();
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return;
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try {
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            File parentDir = new File(mResultFile).getParentFile();
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (!parentDir.exists()) {
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                parentDir.mkdirs();
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            FileOutputStream os = new FileOutputStream(mResultFile);
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (timeout) {
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                Log.w("Layout test: Timeout", mResultFile);
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                os.write(TIMEOUT_STR.getBytes());
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                os.write('\n');
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (mDumpTitleChanges)
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                os.write(mTitleChanges.toString().getBytes());
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (mDialogStrings != null)
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                os.write(mDialogStrings.toString().getBytes());
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mDialogStrings = null;
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (mDatabaseCallbackStrings != null)
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                os.write(mDatabaseCallbackStrings.toString().getBytes());
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mDatabaseCallbackStrings = null;
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (mConsoleMessages != null)
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                os.write(mConsoleMessages.toString().getBytes());
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mConsoleMessages = null;
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (webkitData != null)
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                os.write(webkitData.getBytes());
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            os.flush();
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            os.close();
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } catch (IOException ex) {
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            Log.e(LOGTAG, "Cannot write to " + mResultFile + ", " + ex.getMessage());
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        finished();
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setCallback(TestShellCallback callback) {
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mCallback = callback;
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void finished() {
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (mTestPageLoaded) {
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (mUiAutoTestPath != null) {
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                //don't really finish here
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                moveToNextTest();
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else {
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (mCallback != null) {
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    mCallback.finished();
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else {
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // The test is complete but the page has not completed loading. We
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // can't continue to the next test until both the test is finished
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // and the page has stopped loading.
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mReadyForNextTest = true;
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setDefaultDumpDataType(DumpDataType defaultDumpDataType) {
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mDefaultDumpDataType = defaultDumpDataType;
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // .......................................
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // LayoutTestController Functions
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void dumpAsText() {
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mDumpDataType = DumpDataType.DUMP_AS_TEXT;
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (mWebView != null) {
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String url = mWebView.getUrl();
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            Log.v(LOGTAG, "dumpAsText called: "+url);
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void waitUntilDone() {
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mWaitUntilDone = true;
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String url = mWebView.getUrl();
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Log.v(LOGTAG, "waitUntilDone called: " + url);
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void notifyDone() {
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String url = mWebView.getUrl();
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Log.v(LOGTAG, "notifyDone called: " + url);
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (mWaitUntilDone) {
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mWaitUntilDone = false;
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mChromeClient.onProgressChanged(mWebView, 100);
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void display() {
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mWebView.invalidate();
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void clearBackForwardList() {
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mWebView.clearHistory();
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void dumpBackForwardList() {
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //printf("\n============== Back Forward List ==============\n");
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // mWebHistory
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //printf("===============================================\n");
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void dumpChildFrameScrollPositions() {
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // TODO Auto-generated method stub
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void dumpEditingCallbacks() {
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // TODO Auto-generated method stub
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void dumpSelectionRect() {
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // TODO Auto-generated method stub
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void dumpTitleChanges() {
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (!mDumpTitleChanges) {
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mTitleChanges = new StringBuffer();
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mDumpTitleChanges = true;
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void keepWebHistory() {
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (!mKeepWebHistory) {
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mWebHistory = new Vector();
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mKeepWebHistory = true;
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void queueBackNavigation(int howfar) {
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // TODO Auto-generated method stub
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void queueForwardNavigation(int howfar) {
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // TODO Auto-generated method stub
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void queueLoad(String Url, String frameTarget) {
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // TODO Auto-generated method stub
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void queueReload() {
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mWebView.reload();
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void queueScript(String scriptToRunInCurrentContext) {
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mWebView.loadUrl("javascript:"+scriptToRunInCurrentContext);
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void repaintSweepHorizontally() {
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // TODO Auto-generated method stub
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setAcceptsEditing(boolean b) {
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // TODO Auto-generated method stub
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setMainFrameIsFirstResponder(boolean b) {
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // TODO Auto-generated method stub
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setWindowIsKey(boolean b) {
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // This is meant to show/hide the window. The best I can find
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // is setEnabled()
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mWebView.setEnabled(b);
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void testRepaint() {
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mWebView.invalidate();
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void dumpDatabaseCallbacks() {
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Log.v(LOGTAG, "dumpDatabaseCallbacks called.");
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mDumpDatabaseCallbacks = true;
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setCanOpenWindows() {
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Log.v(LOGTAG, "setCanOpenWindows called.");
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mCanOpenWindows = true;
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Sets the Geolocation permission state to be used for all future requests.
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setGeolocationPermission(boolean allow) {
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mGeolocationPermissionSet = true;
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mGeolocationPermission = allow;
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final WebViewClient mViewClient = new WebViewClient(){
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        @Override
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        public void onPageFinished(WebView view, String url) {
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            Log.v(LOGTAG, "onPageFinished, url=" + url);
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mTestPageLoaded = true;
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            super.onPageFinished(view, url);
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        @Override
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        public void onPageStarted(WebView view, String url, Bitmap favicon) {
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            Log.v(LOGTAG, "onPageStarted, url=" + url);
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mTestPageLoaded = false;
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            super.onPageStarted(view, url, favicon);
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        @Override
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        public void onReceivedError(WebView view, int errorCode, String description,
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String failingUrl) {
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            Log.v(LOGTAG, "onReceivedError, errorCode=" + errorCode
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    + ", desc=" + description + ", url=" + failingUrl);
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            super.onReceivedError(view, errorCode, description, failingUrl);
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        @Override
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler,
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String host, String realm) {
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            handler.cancel();
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        @Override
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        public void onReceivedSslError(WebView view, SslErrorHandler handler,
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                SslError error) {
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            handler.proceed();
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    };
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final WebChromeClient mChromeClient = new WebChromeClient() {
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        @Override
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        public void onProgressChanged(WebView view, int newProgress) {
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (newProgress == 100) {
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (mReadyForNextTest) {
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // In this case, the test has completed (i.e. called
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // layoutTestController.notifyDone) before the page finished loading. This
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // usually happens if the test is not invoked by an onload handler, rather
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // directly in a script tag. Now that the page has finished loading, it is
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // safe for DRT to go to the next test.
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    finished();
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    return;
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (!mTimedOut && !mWaitUntilDone && !mRequestedWebKitData) {
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    String url = mWebView.getUrl();
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    Log.v(LOGTAG, "Finished: "+ url);
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    mHandler.removeMessages(MSG_TIMEOUT);
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    requestWebKitData();
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                } else {
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    String url = mWebView.getUrl();
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    if (mTimedOut) {
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        Log.v(LOGTAG, "Timed out before finishing: " + url);
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    } else if (mWaitUntilDone) {
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        Log.v(LOGTAG, "Waiting for notifyDone: " + url);
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    } else if (mRequestedWebKitData) {
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        Log.v(LOGTAG, "Requested webkit data ready: " + url);
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    }
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        @Override
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        public void onReceivedTitle(WebView view, String title) {
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (title.length() > 30)
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                title = "..."+title.substring(title.length()-30);
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            setTitle(title);
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (mDumpTitleChanges) {
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                mTitleChanges.append("TITLE CHANGED: ");
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                mTitleChanges.append(title);
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                mTitleChanges.append("\n");
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        @Override
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        public boolean onJsAlert(WebView view, String url, String message,
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                JsResult result) {
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (mDialogStrings == null) {
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                mDialogStrings = new StringBuffer();
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mDialogStrings.append("ALERT: ");
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mDialogStrings.append(message);
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mDialogStrings.append('\n');
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            result.confirm();
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return true;
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        @Override
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        public boolean onJsConfirm(WebView view, String url, String message,
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                JsResult result) {
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (mDialogStrings == null) {
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                mDialogStrings = new StringBuffer();
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mDialogStrings.append("CONFIRM: ");
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mDialogStrings.append(message);
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mDialogStrings.append('\n');
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            result.confirm();
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return true;
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        @Override
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        public boolean onJsPrompt(WebView view, String url, String message,
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String defaultValue, JsPromptResult result) {
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (mDialogStrings == null) {
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                mDialogStrings = new StringBuffer();
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mDialogStrings.append("PROMPT: ");
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mDialogStrings.append(message);
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mDialogStrings.append(", default text: ");
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mDialogStrings.append(defaultValue);
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mDialogStrings.append('\n');
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            result.confirm();
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return true;
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        @Override
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        public boolean onJsTimeout() {
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            Log.v(LOGTAG, "JavaScript timeout");
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return false;
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        @Override
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        public void onExceededDatabaseQuota(String url_str,
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String databaseIdentifier, long currentQuota,
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                long estimatedSize, long totalUsedQuota,
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                WebStorage.QuotaUpdater callback) {
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (mDumpDatabaseCallbacks) {
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (mDatabaseCallbackStrings == null) {
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    mDatabaseCallbackStrings = new StringBuffer();
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String protocol = "";
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String host = "";
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                int port = 0;
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                try {
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    URL url = new URL(url_str);
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    protocol = url.getProtocol();
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    host = url.getHost();
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    if (url.getPort() > -1) {
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        port = url.getPort();
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    }
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                } catch (MalformedURLException e) {}
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String databaseCallbackString =
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        "UI DELEGATE DATABASE CALLBACK: " +
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        "exceededDatabaseQuotaForSecurityOrigin:{" + protocol +
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        ", " + host + ", " + port + "} database:" +
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        databaseIdentifier + "\n";
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                Log.v(LOGTAG, "LOG: "+databaseCallbackString);
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                mDatabaseCallbackStrings.append(databaseCallbackString);
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Give 5MB more quota.
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            callback.updateQuota(currentQuota + 1024 * 1024 * 5);
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        /**
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         * Instructs the client to show a prompt to ask the user to set the
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         * Geolocation permission state for the specified origin.
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         */
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        @Override
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        public void onGeolocationPermissionsShowPrompt(String origin,
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                GeolocationPermissions.Callback callback) {
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (mGeolocationPermissionSet) {
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                callback.invoke(origin, mGeolocationPermission, false);
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        @Override
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        public void addMessageToConsole(String message, int lineNumber,
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String sourceID) {
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (mConsoleMessages == null) {
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                mConsoleMessages = new StringBuffer();
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String consoleMessage = "CONSOLE MESSAGE: line "
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    + lineNumber +": "+ message +"\n";
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mConsoleMessages.append(consoleMessage);
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            Log.v(LOGTAG, "LOG: "+consoleMessage);
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        @Override
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        public boolean onCreateWindow(WebView view, boolean dialog,
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                boolean userGesture, Message resultMsg) {
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (!mCanOpenWindows) {
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return false;
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // We never display the new window, just create the view and
6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // allow it's content to execute and be recorded by the test
6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // runner.
6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            HashMap<String, Object> jsIfaces = new HashMap<String, Object>();
6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            jsIfaces.put("layoutTestController", mCallbackProxy);
6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            jsIfaces.put("eventSender", mCallbackProxy);
6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            WebView newWindowView = new NewWindowWebView(TestShellActivity.this, jsIfaces);
6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            setupWebViewForLayoutTests(newWindowView, mCallbackProxy);
6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            WebView.WebViewTransport transport =
6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    (WebView.WebViewTransport) resultMsg.obj;
6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            transport.setWebView(newWindowView);
6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            resultMsg.sendToTarget();
6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return true;
6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    };
6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private static class NewWindowWebView extends WebView {
6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        public NewWindowWebView(Context context, Map<String, Object> jsIfaces) {
6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            super(context, null, 0, jsIfaces);
6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private void resetTestStatus() {
6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mWaitUntilDone = false;
6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mDumpDataType = mDefaultDumpDataType;
6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mTimedOut = false;
6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mDumpTitleChanges = false;
6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mRequestedWebKitData = false;
6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mDumpDatabaseCallbacks = false;
6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mCanOpenWindows = false;
6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mEventSender.resetMouse();
6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mTestPageLoaded = false;
6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        mReadyForNextTest = false;
6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private void setupWebViewForLayoutTests(WebView webview, CallbackProxy callbackProxy) {
6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (webview == null) {
6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return;
6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        WebSettings settings = webview.getSettings();
6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        settings.setAppCacheEnabled(true);
6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        settings.setAppCachePath(getApplicationContext().getCacheDir().getPath());
6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        settings.setAppCacheMaxSize(Long.MAX_VALUE);
6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        settings.setJavaScriptEnabled(true);
6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        settings.setJavaScriptCanOpenWindowsAutomatically(true);
6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        settings.setSupportMultipleWindows(true);
6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        settings.setDatabaseEnabled(true);
6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        settings.setDatabasePath(getDir("databases",0).getAbsolutePath());
6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        settings.setDomStorageEnabled(true);
6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        settings.setWorkersEnabled(false);
6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        webview.setWebChromeClient(mChromeClient);
7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        webview.setWebViewClient(mViewClient);
7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private WebView mWebView;
7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private WebViewEventSender mEventSender;
7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private AsyncHandler mHandler;
7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private TestShellCallback mCallback;
7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private CallbackProxy mCallbackProxy;
7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private String mTestUrl;
7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private String mResultFile;
7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private int mTimeoutInMillis;
7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private String mUiAutoTestPath;
7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private BufferedReader mTestListReader;
7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // States
7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean mTimedOut;
7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean mRequestedWebKitData;
7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean mFinishedRunning;
7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Layout test controller variables.
7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private DumpDataType mDumpDataType;
7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private DumpDataType mDefaultDumpDataType = DumpDataType.EXT_REPR;
7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean mWaitUntilDone;
7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean mDumpTitleChanges;
7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private StringBuffer mTitleChanges;
7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private StringBuffer mDialogStrings;
7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean mKeepWebHistory;
7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private Vector mWebHistory;
7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean mDumpDatabaseCallbacks;
7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private StringBuffer mDatabaseCallbackStrings;
7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private StringBuffer mConsoleMessages;
7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean mCanOpenWindows;
7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean mTestPageLoaded = false;
7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean mReadyForNextTest = false;
7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final String TIMEOUT_STR = "**Test timeout";
7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final int MSG_TIMEOUT = 0;
7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final int MSG_WEBKIT_DATA = 1;
7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final String LOGTAG="TestShell";
7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final String TEST_URL = "TestUrl";
7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final String RESULT_FILE = "ResultFile";
7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final String TIMEOUT_IN_MILLIS = "TimeoutInMillis";
7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final String UI_AUTO_TEST = "UiAutoTest";
7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean mGeolocationPermissionSet;
7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean mGeolocationPermission;
7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson