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