PowerTestActivity.java revision 7c6efa13f129dbae5319f0981a430d4662f43354
17c6efa13f129dbae5319f0981a430d4662f43354Xia Wangpackage com.android.browserpowertest;
27c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
37c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.app.Activity;
47c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.app.ActivityThread;
57c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.graphics.Bitmap;
67c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.os.Bundle;
77c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.os.Handler;
87c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.os.Message;
97c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.util.Log;
107c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.view.ViewGroup;
117c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.webkit.WebChromeClient;
127c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.webkit.WebView;
137c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.webkit.WebViewClient;
147c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.webkit.WebSettings.LayoutAlgorithm;
157c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.widget.LinearLayout;
167c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.widget.LinearLayout.LayoutParams;
177c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
187c6efa13f129dbae5319f0981a430d4662f43354Xia Wangpublic class PowerTestActivity extends Activity {
197c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
207c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public static final String LOGTAG = "PowerTestActivity";
217c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public static final String PARAM_URL = "URL";
227c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public static final String PARAM_TIMEOUT = "Timeout";
237c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public static final int RESULT_TIMEOUT = 0xDEAD;
247c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public static final int MSG_TIMEOUT = 0xC001;
257c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public static final int MSG_NAVIGATE = 0xC002;
267c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public static final String MSG_NAV_URL = "url";
277c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public static final String MSG_NAV_LOGTIME = "logtime";
287c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
297c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private WebView webView;
307c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private SimpleWebViewClient webViewClient;
317c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private SimpleChromeClient chromeClient;
327c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private Handler handler;
337c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private boolean timeoutFlag;
347c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private boolean logTime;
357c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private boolean pageDone;
367c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private Object pageDoneLock;
377c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private int pageStartCount;
387c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private int manualDelay;
397c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private long startTime;
407c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private long pageLoadTime;
417c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private PageDoneRunner pageDoneRunner = new PageDoneRunner();
427c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
437c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public PowerTestActivity() {
447c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
457c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
467c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    @Override
477c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    protected void onCreate(Bundle savedInstanceState) {
487c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        super.onCreate(savedInstanceState);
497c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
507c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        Log.v(LOGTAG, "onCreate, inst=" + Integer.toHexString(hashCode()));
517c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
527c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        LinearLayout contentView = new LinearLayout(this);
537c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        contentView.setOrientation(LinearLayout.VERTICAL);
547c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        setContentView(contentView);
557c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        setTitle("Idle");
567c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
577c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView = new WebView(this);
587c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView.getSettings().setJavaScriptEnabled(true);
597c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(false);
607c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.NORMAL);
617c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
627c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webViewClient = new SimpleWebViewClient();
637c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        chromeClient = new SimpleChromeClient();
647c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView.setWebViewClient(webViewClient);
657c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView.setWebChromeClient(chromeClient);
667c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
677c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        contentView.addView(webView, new LayoutParams(
687c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                ViewGroup.LayoutParams.FILL_PARENT,
697c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                ViewGroup.LayoutParams.FILL_PARENT, 0.0f));
707c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
717c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        handler = new Handler() {
727c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            @Override
737c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            public void handleMessage(Message msg) {
747c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                switch (msg.what) {
757c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                    case MSG_TIMEOUT:
767c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                        handleTimeout();
777c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                        return;
787c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                    case MSG_NAVIGATE:
797c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                        manualDelay = msg.arg2;
807c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                        navigate(msg.getData().getString(MSG_NAV_URL), msg.arg1);
817c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                        logTime = msg.getData().getBoolean(MSG_NAV_LOGTIME);
827c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                        return;
837c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                }
847c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            }
857c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        };
867c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
877c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        pageDoneLock = new Object();
887c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
897c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
907c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public void reset() {
917c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        synchronized (pageDoneLock) {
927c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            pageDone = false;
937c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
947c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        timeoutFlag = false;
957c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        pageStartCount = 0;
967c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        chromeClient.resetJsTimeout();
977c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
987c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
997c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private void navigate(String url, int timeout) {
1007c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        if(url == null) {
1017c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            Log.v(LOGTAG, "URL is null, cancelling...");
1027c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            finish();
1037c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
1047c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView.stopLoading();
1057c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        if(logTime) {
1067c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            webView.clearCache(true);
1077c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
1087c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        startTime = System.currentTimeMillis();
1097c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        Log.v(LOGTAG, "Navigating to URL: " + url);
1107c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView.loadUrl(url);
1117c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1127c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        if(timeout != 0) {
1137c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            //set a timer with specified timeout (in ms)
1147c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            handler.sendMessageDelayed(handler.obtainMessage(MSG_TIMEOUT),
1157c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                    timeout);
1167c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
1177c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1187c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1197c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    @Override
1207c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    protected void onDestroy() {
1217c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        super.onDestroy();
1227c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        Log.v(LOGTAG, "onDestroy, inst=" + Integer.toHexString(hashCode()));
1237c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView.clearCache(true);
1247c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView.destroy();
1257c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1267c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1277c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private boolean isPageDone() {
1287c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        synchronized (pageDoneLock) {
1297c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            return pageDone;
1307c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
1317c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1327c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1337c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private void setPageDone(boolean pageDone) {
1347c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        synchronized (pageDoneLock) {
1357c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            this.pageDone = pageDone;
1367c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            pageDoneLock.notifyAll();
1377c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
1387c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1397c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1407c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private void handleTimeout() {
1417c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        int progress = webView.getProgress();
1427c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView.stopLoading();
1437c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        Log.v(LOGTAG, "Page timeout triggered, progress = " + progress);
1447c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        timeoutFlag = true;
1457c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        handler.postDelayed(pageDoneRunner, manualDelay);
1467c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1477c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1487c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public boolean waitUntilDone() {
1497c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        validateNotAppThread();
1507c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        synchronized (pageDoneLock) {
1517c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            while(!isPageDone()) {
1527c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                try {
1537c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                    pageDoneLock.wait();
1547c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                } catch (InterruptedException ie) {
1557c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                    //no-op
1567c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                }
1577c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            }
1587c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
1597c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        return timeoutFlag;
1607c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1617c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1627c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public Handler getHandler() {
1637c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        return handler;
1647c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1657c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1667c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private final void validateNotAppThread() {
1677c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        if (ActivityThread.currentActivityThread() != null) {
1687c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            throw new RuntimeException(
1697c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                "This method can not be called from the main application thread");
1707c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
1717c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1727c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1737c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public long getPageLoadTime() {
1747c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        return pageLoadTime;
1757c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1767c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1777c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public boolean getPageError() {
1787c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        return webViewClient.getPageErrorFlag();
1797c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1807c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1817c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    class SimpleWebViewClient extends WebViewClient {
1827c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1837c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        private boolean pageErrorFlag = false;
1847c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1857c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        @Override
1867c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        public void onReceivedError(WebView view, int errorCode, String description,
1877c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                String failingUrl) {
1887c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            pageErrorFlag = true;
1897c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            Log.v(LOGTAG, "WebCore error: code=" + errorCode
1907c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                    + ", description=" + description
1917c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                    + ", url=" + failingUrl);
1927c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
1937c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1947c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        @Override
1957c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        public void onPageStarted(WebView view, String url, Bitmap favicon) {
1967c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            pageStartCount++;
1977c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            Log.v(LOGTAG, "onPageStarted: " + url);
1987c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
1997c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2007c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        @Override
2017c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        public void onPageFinished(WebView view, String url) {
2027c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            Log.v(LOGTAG, "onPageFinished: " + url);
2037c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            // let handleTimeout take care of finishing the page
2047c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            if(!timeoutFlag)
2057c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                handler.postDelayed(new WebViewStatusChecker(), 500);
2067c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
2077c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2087c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        // return true if the URL is not available or the page is down
2097c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        public boolean getPageErrorFlag() {
2107c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            return pageErrorFlag;
2117c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
2127c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
2137c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2147c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    class SimpleChromeClient extends WebChromeClient {
2157c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2167c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        private int timeoutCounter = 0;
2177c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2187c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        public void resetJsTimeout() {
2197c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            timeoutCounter = 0;
2207c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
2217c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2227c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        @Override
2237c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        public void onReceivedTitle(WebView view, String title) {
2247c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            PowerTestActivity.this.setTitle(title);
2257c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
2267c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
2277c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2287c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    class WebViewStatusChecker implements Runnable {
2297c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2307c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        private int initialStartCount;
2317c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2327c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        public WebViewStatusChecker() {
2337c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            initialStartCount = pageStartCount;
2347c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
2357c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2367c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        public void run() {
2377c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            if (initialStartCount == pageStartCount && !isPageDone()) {
2387c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                handler.removeMessages(MSG_TIMEOUT);
2397c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                webView.stopLoading();
2407c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                handler.postDelayed(pageDoneRunner, manualDelay);
2417c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            }
2427c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
2437c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
2447c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2457c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    class PageDoneRunner implements Runnable {
2467c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2477c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        public void run() {
2487c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            Log.v(LOGTAG, "Finishing URL: " + webView.getUrl());
2497c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            pageLoadTime = System.currentTimeMillis() - startTime;
2507c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            setPageDone(true);
2517c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
2527c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
2537c6efa13f129dbae5319f0981a430d4662f43354Xia Wang}
254