OSDN Git Service

original
[gb-231r1-is01/GB_2.3_IS01.git] / cts / tests / tests / webkit / src / android / webkit / cts / WebViewClientTest.java
diff --git a/cts/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java b/cts/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
new file mode 100644 (file)
index 0000000..49d68c6
--- /dev/null
@@ -0,0 +1,375 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.webkit.cts;
+
+import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
+import dalvik.annotation.TestTargets;
+import dalvik.annotation.ToBeFixed;
+
+import android.graphics.Bitmap;
+import android.os.Message;
+import android.test.ActivityInstrumentationTestCase2;
+import android.view.KeyEvent;
+import android.view.animation.cts.DelayedCheck;
+import android.webkit.HttpAuthHandler;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+
+@TestTargetClass(android.webkit.WebViewClient.class)
+public class WebViewClientTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+    private static final long TEST_TIMEOUT = 5000;
+
+    private WebView mWebView;
+    private CtsTestServer mWebServer;
+
+    public WebViewClientTest() {
+        super("com.android.cts.stub", WebViewStubActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mWebView = getActivity().getWebView();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mWebView.clearHistory();
+        mWebView.clearCache(true);
+        if (mWebServer != null) {
+            mWebServer.shutdown();
+        }
+        super.tearDown();
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "shouldOverrideUrlLoading",
+        args = {WebView.class, String.class}
+    )
+    public void testShouldOverrideUrlLoading() {
+        final MockWebViewClient webViewClient = new MockWebViewClient();
+        assertFalse(webViewClient.shouldOverrideUrlLoading(mWebView, null));
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "onPageStarted",
+            args = {WebView.class, String.class, Bitmap.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "onPageFinished",
+            args = {WebView.class, String.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "onLoadResource",
+            args = {WebView.class, String.class}
+        )
+    })
+    public void testLoadPage() throws Exception {
+        final MockWebViewClient webViewClient = new MockWebViewClient();
+        mWebView.setWebViewClient(webViewClient);
+        mWebServer = new CtsTestServer(getActivity());
+        String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
+
+        assertFalse(webViewClient.hasOnPageStartedCalled());
+        assertFalse(webViewClient.hasOnLoadResourceCalled());
+        assertFalse(webViewClient.hasOnPageFinishedCalled());
+        mWebView.loadUrl(url);
+
+        new DelayedCheck(TEST_TIMEOUT) {
+            protected boolean check() {
+                return webViewClient.hasOnPageStartedCalled();
+            }
+        }.run();
+
+        new DelayedCheck(TEST_TIMEOUT) {
+            protected boolean check() {
+                return webViewClient.hasOnLoadResourceCalled();
+            }
+        }.run();
+
+        new DelayedCheck(TEST_TIMEOUT) {
+            protected boolean check() {
+                return webViewClient.hasOnPageFinishedCalled();
+            }
+        }.run();
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "onReceivedError",
+        args = {WebView.class, int.class, String.class, String.class}
+    )
+    public void testOnReceivedError() throws Exception {
+        final MockWebViewClient webViewClient = new MockWebViewClient();
+        mWebView.setWebViewClient(webViewClient);
+
+        String wrongUri = "invalidscheme://some/resource";
+        assertEquals(0, webViewClient.hasOnReceivedErrorCode());
+        assertLoadUrlSuccessfully(mWebView, wrongUri);
+        assertEquals(WebViewClient.ERROR_UNSUPPORTED_SCHEME,
+                webViewClient.hasOnReceivedErrorCode());
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "onFormResubmission",
+        args = {WebView.class, Message.class, Message.class}
+    )
+    public void testOnFormResubmission() throws Exception {
+        final MockWebViewClient webViewClient = new MockWebViewClient();
+        mWebView.setWebViewClient(webViewClient);
+        final WebSettings settings = mWebView.getSettings();
+        settings.setJavaScriptEnabled(true);
+        mWebServer = new CtsTestServer(getActivity());
+
+        assertFalse(webViewClient.hasOnFormResubmissionCalled());
+        String url = mWebServer.getAssetUrl(TestHtmlConstants.JS_FORM_URL);
+        // this loads a form, which automatically posts itself
+        assertLoadUrlSuccessfully(mWebView, url);
+        Thread.sleep(1000); // allow for javascript to post the form
+        // the URL should have changed when the form was posted
+        assertFalse(url.equals(mWebView.getUrl()));
+        // reloading the current URL should trigger the callback
+        mWebView.reload();
+        new DelayedCheck(TEST_TIMEOUT) {
+            protected boolean check() {
+                return webViewClient.hasOnFormResubmissionCalled();
+            }
+        }.run();
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "doUpdateVisitedHistory",
+        args = {WebView.class, String.class, boolean.class}
+    )
+    public void testDoUpdateVisitedHistory() throws Exception {
+        final MockWebViewClient webViewClient = new MockWebViewClient();
+        mWebView.setWebViewClient(webViewClient);
+        mWebServer = new CtsTestServer(getActivity());
+
+        assertFalse(webViewClient.hasDoUpdateVisitedHistoryCalled());
+        String url1 = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
+        String url2 = mWebServer.getAssetUrl(TestHtmlConstants.BR_TAG_URL);
+        assertLoadUrlSuccessfully(mWebView, url1);
+        assertLoadUrlSuccessfully(mWebView, url2);
+        new DelayedCheck(TEST_TIMEOUT) {
+            protected boolean check() {
+                return webViewClient.hasDoUpdateVisitedHistoryCalled();
+            }
+        }.run();
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "onReceivedHttpAuthRequest",
+        args = {WebView.class, HttpAuthHandler.class, String.class, String.class}
+    )
+    public void testOnReceivedHttpAuthRequest() throws Exception {
+        final MockWebViewClient webViewClient = new MockWebViewClient();
+        mWebView.setWebViewClient(webViewClient);
+        mWebServer = new CtsTestServer(getActivity());
+
+        assertFalse(webViewClient.hasOnReceivedHttpAuthRequestCalled());
+        String url = mWebServer.getAuthAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
+        assertLoadUrlSuccessfully(mWebView, url);
+        assertTrue(webViewClient.hasOnReceivedHttpAuthRequestCalled());
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "shouldOverrideKeyEvent",
+        args = {WebView.class, KeyEvent.class}
+    )
+    public void testShouldOverrideKeyEvent() {
+        final MockWebViewClient webViewClient = new MockWebViewClient();
+        mWebView.setWebViewClient(webViewClient);
+
+        assertFalse(webViewClient.shouldOverrideKeyEvent(mWebView, null));
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "onUnhandledKeyEvent",
+        args = {WebView.class, KeyEvent.class}
+    )
+    public void testOnUnhandledKeyEvent() throws Throwable {
+        final MockWebViewClient webViewClient = new MockWebViewClient();
+        mWebView.setWebViewClient(webViewClient);
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mWebView.requestFocus();
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+
+        assertFalse(webViewClient.hasOnUnhandledKeyEventCalled());
+        sendKeys(KeyEvent.KEYCODE_1);
+
+        new DelayedCheck(TEST_TIMEOUT) {
+            protected boolean check() {
+                return webViewClient.hasOnUnhandledKeyEventCalled();
+            }
+        }.run();
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "onScaleChanged",
+        args = {WebView.class, float.class, float.class}
+    )
+    public void testOnScaleChanged() throws Throwable {
+        final MockWebViewClient webViewClient = new MockWebViewClient();
+        mWebView.setWebViewClient(webViewClient);
+
+        assertFalse(webViewClient.hasOnScaleChangedCalled());
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mWebView.zoomIn();
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+        assertTrue(webViewClient.hasOnScaleChangedCalled());
+    }
+
+    private void assertLoadUrlSuccessfully(final WebView view, String url) {
+        view.loadUrl(url);
+        // wait until load is complete
+        new DelayedCheck(TEST_TIMEOUT) {
+            @Override
+            protected boolean check() {
+                return view.getProgress() == 100;
+            }
+        }.run();
+    }
+
+    private class MockWebViewClient extends WebViewClient {
+        private boolean mOnPageStartedCalled;
+        private boolean mOnPageFinishedCalled;
+        private boolean mOnLoadResourceCalled;
+        private int mOnReceivedErrorCode;
+        private boolean mOnFormResubmissionCalled;
+        private boolean mDoUpdateVisitedHistoryCalled;
+        private boolean mOnReceivedHttpAuthRequestCalled;
+        private boolean mOnUnhandledKeyEventCalled;
+        private boolean mOnScaleChangedCalled;
+
+        public boolean hasOnPageStartedCalled() {
+            return mOnPageStartedCalled;
+        }
+
+        public boolean hasOnPageFinishedCalled() {
+            return mOnPageFinishedCalled;
+        }
+
+        public boolean hasOnLoadResourceCalled() {
+            return mOnLoadResourceCalled;
+        }
+
+        public int hasOnReceivedErrorCode() {
+            return mOnReceivedErrorCode;
+        }
+
+        public boolean hasOnFormResubmissionCalled() {
+            return mOnFormResubmissionCalled;
+        }
+
+        public boolean hasDoUpdateVisitedHistoryCalled() {
+            return mDoUpdateVisitedHistoryCalled;
+        }
+
+        public boolean hasOnReceivedHttpAuthRequestCalled() {
+            return mOnReceivedHttpAuthRequestCalled;
+        }
+
+        public boolean hasOnUnhandledKeyEventCalled() {
+            return mOnUnhandledKeyEventCalled;
+        }
+
+        public boolean hasOnScaleChangedCalled() {
+            return mOnScaleChangedCalled;
+        }
+
+        @Override
+        public void onPageStarted(WebView view, String url, Bitmap favicon) {
+            super.onPageStarted(view, url, favicon);
+            mOnPageStartedCalled = true;
+        }
+
+        @Override
+        public void onPageFinished(WebView view, String url) {
+            super.onPageFinished(view, url);
+            assertTrue(mOnPageStartedCalled);
+            assertTrue(mOnLoadResourceCalled);
+            mOnPageFinishedCalled = true;
+        }
+
+        @Override
+        public void onLoadResource(WebView view, String url) {
+            super.onLoadResource(view, url);
+            assertTrue(mOnPageStartedCalled);
+            mOnLoadResourceCalled = true;
+        }
+
+        @Override
+        public void onReceivedError(WebView view, int errorCode,
+                String description, String failingUrl) {
+            super.onReceivedError(view, errorCode, description, failingUrl);
+            mOnReceivedErrorCode = errorCode;
+        }
+
+        @Override
+        public void onFormResubmission(WebView view, Message dontResend, Message resend) {
+            mOnFormResubmissionCalled = true;
+            dontResend.sendToTarget();
+        }
+
+        @Override
+        public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
+            super.doUpdateVisitedHistory(view, url, isReload);
+            mDoUpdateVisitedHistoryCalled = true;
+        }
+
+        @Override
+        public void onReceivedHttpAuthRequest(WebView view,
+                HttpAuthHandler handler, String host, String realm) {
+            super.onReceivedHttpAuthRequest(view, handler, host, realm);
+            mOnReceivedHttpAuthRequestCalled = true;
+        }
+
+        @Override
+        public void onUnhandledKeyEvent(WebView view, KeyEvent event) {
+            super.onUnhandledKeyEvent(view, event);
+            mOnUnhandledKeyEventCalled = true;
+        }
+
+        @Override
+        public void onScaleChanged(WebView view, float oldScale, float newScale) {
+            super.onScaleChanged(view, oldScale, newScale);
+            mOnScaleChangedCalled = true;
+        }
+    }
+}