115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root/*
215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2009 The Android Open Source Project
315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * you may not use this file except in compliance with the License.
615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * You may obtain a copy of the License at
715a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
815a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
915a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
1015a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Unless required by applicable law or agreed to in writing, software
1115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
1215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * See the License for the specific language governing permissions and
1415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * limitations under the License.
1515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root */
1615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root
177c6efa13f129dbae5319f0981a430d4662f43354Xia Wangpackage com.android.browserpowertest;
187c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
197c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.app.Activity;
207c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.app.ActivityThread;
217c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.graphics.Bitmap;
227c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.os.Bundle;
237c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.os.Handler;
247c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.os.Message;
257c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.util.Log;
267c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.view.ViewGroup;
277c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.webkit.WebChromeClient;
287c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.webkit.WebView;
297c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.webkit.WebViewClient;
307c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.webkit.WebSettings.LayoutAlgorithm;
317c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.widget.LinearLayout;
327c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.widget.LinearLayout.LayoutParams;
337c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
347c6efa13f129dbae5319f0981a430d4662f43354Xia Wangpublic class PowerTestActivity extends Activity {
357c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
367c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public static final String LOGTAG = "PowerTestActivity";
377c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public static final String PARAM_URL = "URL";
387c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public static final String PARAM_TIMEOUT = "Timeout";
397c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public static final int RESULT_TIMEOUT = 0xDEAD;
407c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public static final int MSG_TIMEOUT = 0xC001;
417c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public static final int MSG_NAVIGATE = 0xC002;
427c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public static final String MSG_NAV_URL = "url";
437c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public static final String MSG_NAV_LOGTIME = "logtime";
447c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
457c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private WebView webView;
467c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private SimpleWebViewClient webViewClient;
477c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private SimpleChromeClient chromeClient;
487c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private Handler handler;
497c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private boolean timeoutFlag;
507c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private boolean logTime;
517c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private boolean pageDone;
527c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private Object pageDoneLock;
537c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private int pageStartCount;
547c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private int manualDelay;
557c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private long startTime;
567c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private long pageLoadTime;
577c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private PageDoneRunner pageDoneRunner = new PageDoneRunner();
587c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
597c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public PowerTestActivity() {
607c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
617c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
627c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    @Override
637c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    protected void onCreate(Bundle savedInstanceState) {
647c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        super.onCreate(savedInstanceState);
657c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
667c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        Log.v(LOGTAG, "onCreate, inst=" + Integer.toHexString(hashCode()));
677c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
687c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        LinearLayout contentView = new LinearLayout(this);
697c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        contentView.setOrientation(LinearLayout.VERTICAL);
707c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        setContentView(contentView);
717c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        setTitle("Idle");
727c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
737c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView = new WebView(this);
747c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView.getSettings().setJavaScriptEnabled(true);
757c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(false);
767c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.NORMAL);
777c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
787c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webViewClient = new SimpleWebViewClient();
797c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        chromeClient = new SimpleChromeClient();
807c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView.setWebViewClient(webViewClient);
817c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView.setWebChromeClient(chromeClient);
827c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
837c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        contentView.addView(webView, new LayoutParams(
84980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy                ViewGroup.LayoutParams.MATCH_PARENT,
85980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy                ViewGroup.LayoutParams.MATCH_PARENT, 0.0f));
867c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
877c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        handler = new Handler() {
887c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            @Override
897c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            public void handleMessage(Message msg) {
907c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                switch (msg.what) {
917c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                    case MSG_TIMEOUT:
927c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                        handleTimeout();
937c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                        return;
947c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                    case MSG_NAVIGATE:
957c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                        manualDelay = msg.arg2;
967c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                        navigate(msg.getData().getString(MSG_NAV_URL), msg.arg1);
977c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                        logTime = msg.getData().getBoolean(MSG_NAV_LOGTIME);
987c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                        return;
997c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                }
1007c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            }
1017c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        };
1027c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1037c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        pageDoneLock = new Object();
1047c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1057c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1067c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public void reset() {
1077c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        synchronized (pageDoneLock) {
1087c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            pageDone = false;
1097c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
1107c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        timeoutFlag = false;
1117c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        pageStartCount = 0;
1127c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        chromeClient.resetJsTimeout();
1137c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1147c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1157c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private void navigate(String url, int timeout) {
1167c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        if(url == null) {
1177c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            Log.v(LOGTAG, "URL is null, cancelling...");
1187c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            finish();
1197c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
1207c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView.stopLoading();
1217c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        if(logTime) {
1227c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            webView.clearCache(true);
1237c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
1247c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        startTime = System.currentTimeMillis();
1257c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        Log.v(LOGTAG, "Navigating to URL: " + url);
1267c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView.loadUrl(url);
1277c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1287c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        if(timeout != 0) {
1297c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            //set a timer with specified timeout (in ms)
1307c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            handler.sendMessageDelayed(handler.obtainMessage(MSG_TIMEOUT),
1317c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                    timeout);
1327c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
1337c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1347c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1357c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    @Override
1367c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    protected void onDestroy() {
1377c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        super.onDestroy();
1387c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        Log.v(LOGTAG, "onDestroy, inst=" + Integer.toHexString(hashCode()));
1397c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView.clearCache(true);
1407c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView.destroy();
1417c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1427c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1437c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private boolean isPageDone() {
1447c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        synchronized (pageDoneLock) {
1457c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            return pageDone;
1467c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
1477c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1487c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1497c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private void setPageDone(boolean pageDone) {
1507c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        synchronized (pageDoneLock) {
1517c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            this.pageDone = pageDone;
1527c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            pageDoneLock.notifyAll();
1537c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
1547c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1557c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1567c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private void handleTimeout() {
1577c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        int progress = webView.getProgress();
1587c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        webView.stopLoading();
1597c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        Log.v(LOGTAG, "Page timeout triggered, progress = " + progress);
1607c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        timeoutFlag = true;
1617c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        handler.postDelayed(pageDoneRunner, manualDelay);
1627c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1637c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1647c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public boolean waitUntilDone() {
1657c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        validateNotAppThread();
1667c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        synchronized (pageDoneLock) {
1677c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            while(!isPageDone()) {
1687c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                try {
1697c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                    pageDoneLock.wait();
1707c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                } catch (InterruptedException ie) {
1717c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                    //no-op
1727c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                }
1737c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            }
1747c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
1757c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        return timeoutFlag;
1767c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1777c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1787c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public Handler getHandler() {
1797c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        return handler;
1807c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1817c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1827c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    private final void validateNotAppThread() {
1837c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        if (ActivityThread.currentActivityThread() != null) {
1847c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            throw new RuntimeException(
1857c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                "This method can not be called from the main application thread");
1867c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
1877c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1887c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1897c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public long getPageLoadTime() {
1907c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        return pageLoadTime;
1917c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1927c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1937c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    public boolean getPageError() {
1947c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        return webViewClient.getPageErrorFlag();
1957c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
1967c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1977c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    class SimpleWebViewClient extends WebViewClient {
1987c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
1997c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        private boolean pageErrorFlag = false;
2007c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2017c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        @Override
2027c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        public void onReceivedError(WebView view, int errorCode, String description,
2037c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                String failingUrl) {
2047c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            pageErrorFlag = true;
2057c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            Log.v(LOGTAG, "WebCore error: code=" + errorCode
2067c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                    + ", description=" + description
2077c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                    + ", url=" + failingUrl);
2087c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
2097c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2107c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        @Override
2117c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        public void onPageStarted(WebView view, String url, Bitmap favicon) {
2127c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            pageStartCount++;
2137c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            Log.v(LOGTAG, "onPageStarted: " + url);
2147c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
2157c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2167c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        @Override
2177c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        public void onPageFinished(WebView view, String url) {
2187c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            Log.v(LOGTAG, "onPageFinished: " + url);
2197c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            // let handleTimeout take care of finishing the page
2207c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            if(!timeoutFlag)
2217c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                handler.postDelayed(new WebViewStatusChecker(), 500);
2227c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
2237c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2247c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        // return true if the URL is not available or the page is down
2257c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        public boolean getPageErrorFlag() {
2267c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            return pageErrorFlag;
2277c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
2287c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
2297c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2307c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    class SimpleChromeClient extends WebChromeClient {
2317c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2327c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        private int timeoutCounter = 0;
2337c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2347c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        public void resetJsTimeout() {
2357c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            timeoutCounter = 0;
2367c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
2377c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2387c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        @Override
2397c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        public void onReceivedTitle(WebView view, String title) {
2407c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            PowerTestActivity.this.setTitle(title);
2417c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
2427c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
2437c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2447c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    class WebViewStatusChecker implements Runnable {
2457c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2467c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        private int initialStartCount;
2477c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2487c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        public WebViewStatusChecker() {
2497c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            initialStartCount = pageStartCount;
2507c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
2517c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2527c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        public void run() {
2537c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            if (initialStartCount == pageStartCount && !isPageDone()) {
2547c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                handler.removeMessages(MSG_TIMEOUT);
2557c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                webView.stopLoading();
2567c6efa13f129dbae5319f0981a430d4662f43354Xia Wang                handler.postDelayed(pageDoneRunner, manualDelay);
2577c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            }
2587c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
2597c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
2607c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2617c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    class PageDoneRunner implements Runnable {
2627c6efa13f129dbae5319f0981a430d4662f43354Xia Wang
2637c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        public void run() {
2647c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            Log.v(LOGTAG, "Finishing URL: " + webView.getUrl());
2657c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            pageLoadTime = System.currentTimeMillis() - startTime;
2667c6efa13f129dbae5319f0981a430d4662f43354Xia Wang            setPageDone(true);
2677c6efa13f129dbae5319f0981a430d4662f43354Xia Wang        }
2687c6efa13f129dbae5319f0981a430d4662f43354Xia Wang    }
2697c6efa13f129dbae5319f0981a430d4662f43354Xia Wang}
270