WebContentsObserverAndroidTest.java revision 5f1c94371a64b3196d4be9466099bb892df9b88e
1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)package org.chromium.content.browser;
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuimport android.test.suitebuilder.annotation.SmallTest;
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuimport org.chromium.base.ThreadUtils;
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import org.chromium.base.test.util.Feature;
11e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochimport org.chromium.base.test.util.UrlUtils;
125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuimport org.chromium.content.browser.test.util.CallbackHelper;
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import org.chromium.content_public.browser.WebContents;
145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuimport org.chromium.content_shell_apk.ContentShellActivity;
155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuimport org.chromium.content_shell_apk.ContentShellTestBase;
165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuimport java.util.concurrent.Callable;
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/**
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * Tests for the WebContentsObserverAndroid APIs.
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) */
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public class WebContentsObserverAndroidTest extends ContentShellTestBase {
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    private static final String URL = UrlUtils.encodeHtmlDataUri(
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            "<html><head></head><body>didFirstVisuallyNonEmptyPaint test</body></html>");
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    private static class TestWebContentsObserverAndroid extends WebContentsObserverAndroid {
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        private CallbackHelper mDidFirstVisuallyNonEmptyPaintCallbackHelper = new CallbackHelper();
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        public TestWebContentsObserverAndroid(WebContents webContents) {
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            super(webContents);
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        }
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        public CallbackHelper getDidFirstVisuallyNonEmptyPaintCallbackHelper() {
345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            return mDidFirstVisuallyNonEmptyPaintCallbackHelper;
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        }
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        @Override
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        public void didFirstVisuallyNonEmptyPaint() {
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            mDidFirstVisuallyNonEmptyPaintCallbackHelper.notifyCalled();
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        }
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    @Override
445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    protected void setUp() throws Exception {
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        super.setUp();
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        ContentShellActivity activity = launchContentShellWithUrl(null);
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        assertNotNull(activity);
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        waitForActiveShellToBeDoneLoading();
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    @SmallTest
525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    @Feature({"Navigation"})
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    public void testDidFirstVisuallyNonEmptyPaint() throws Throwable {
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        TestWebContentsObserverAndroid observer = ThreadUtils.runOnUiThreadBlocking(
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                new Callable<TestWebContentsObserverAndroid>() {
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                    @Override
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                    public TestWebContentsObserverAndroid call() throws Exception {
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        return new TestWebContentsObserverAndroid(
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                getContentViewCore().getWebContents());
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                    }
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                });
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        int callCount = observer.getDidFirstVisuallyNonEmptyPaintCallbackHelper().getCallCount();
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        getInstrumentation().runOnMainSync(new Runnable() {
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            @Override
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            public void run() {
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                getContentViewCore().loadUrl(new LoadUrlParams(URL));
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            }
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        });
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        observer.getDidFirstVisuallyNonEmptyPaintCallbackHelper().waitForCallback(callCount);
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu