ShadowWebView.java revision 3892868c17d4ed48ccf77e25c2cef9bf3b1c82dc
19ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultzpackage com.xtremelabs.robolectric.shadows;
29ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultz
39ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultzimport android.content.Context;
49ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultzimport android.util.AttributeSet;
5258aab42887fa7a6d29fe862eb883c62deafde0cGreg Choi & Mike Graftonimport android.webkit.WebChromeClient;
622ae9206e660fd187ff79a529452dbe2bab504fdRich Humphreyimport android.webkit.WebSettings;
79ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultzimport android.webkit.WebView;
8fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphreyimport android.webkit.WebViewClient;
922ae9206e660fd187ff79a529452dbe2bab504fdRich Humphreyimport com.xtremelabs.robolectric.Robolectric;
1022c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation;
1122c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements;
129ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultz
1340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williamsimport java.util.HashMap;
1440c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
159ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultz@SuppressWarnings({"UnusedDeclaration"})
169ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultz@Implements(WebView.class)
179ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultzpublic class ShadowWebView extends ShadowAbsoluteLayout {
189ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultz
196cf9d6f657e61d727afc221dd157ae6ca41714baTyler Schultz    private String lastUrl;
2040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams    private HashMap<String, Object> javascriptInterfaces = new HashMap<String, Object>();
2122ae9206e660fd187ff79a529452dbe2bab504fdRich Humphrey    private WebSettings webSettings = Robolectric.newInstanceOf(WebSettings.class);
22fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey    private WebViewClient webViewClient = null;
2337c667d06608e4bebd0f45ffbf1555ce5bd30493Zoodles    private boolean runFlag = false;
248455cc9031f98a53ad469ebe4b9d92511af8b54fRich Humphrey    private boolean clearCacheCalled = false;
258455cc9031f98a53ad469ebe4b9d92511af8b54fRich Humphrey    private boolean clearCacheIncludeDiskFiles = false;
269677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    private boolean clearFormDataCalled = false;
279677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    private boolean clearHistoryCalled = false;
289677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    private boolean clearViewCalled = false;
299677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    private boolean destroyCalled = false;
30258aab42887fa7a6d29fe862eb883c62deafde0cGreg Choi & Mike Grafton    private WebChromeClient webChromeClient;
313892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz    private boolean canGoBack;
323892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz    private int goBackInvocations = 0;
336cf9d6f657e61d727afc221dd157ae6ca41714baTyler Schultz
343892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz    @Override
353892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz    public void __constructor__(Context context, AttributeSet attributeSet) {
369ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultz        super.__constructor__(context, attributeSet);
379ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultz    }
386cf9d6f657e61d727afc221dd157ae6ca41714baTyler Schultz
396cf9d6f657e61d727afc221dd157ae6ca41714baTyler Schultz    @Implementation
406cf9d6f657e61d727afc221dd157ae6ca41714baTyler Schultz    public void loadUrl(String url) {
416cf9d6f657e61d727afc221dd157ae6ca41714baTyler Schultz        lastUrl = url;
426cf9d6f657e61d727afc221dd157ae6ca41714baTyler Schultz    }
4340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
4431811e1435d6c72ee6c324ca49769159e80fcd93Tyler Schultz    /**
4531811e1435d6c72ee6c324ca49769159e80fcd93Tyler Schultz     * Non-Android accessor.
4631811e1435d6c72ee6c324ca49769159e80fcd93Tyler Schultz     *
4731811e1435d6c72ee6c324ca49769159e80fcd93Tyler Schultz     * @return the last loaded url
4831811e1435d6c72ee6c324ca49769159e80fcd93Tyler Schultz     */
496cf9d6f657e61d727afc221dd157ae6ca41714baTyler Schultz    public String getLastLoadedUrl() {
506cf9d6f657e61d727afc221dd157ae6ca41714baTyler Schultz        return lastUrl;
516cf9d6f657e61d727afc221dd157ae6ca41714baTyler Schultz    }
5240c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
5340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams    @Implementation
54fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey    public WebSettings getSettings() {
5540c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        return webSettings;
56fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey    }
57fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey
58fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey    @Implementation
59fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey    public void setWebViewClient(WebViewClient client) {
6040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        webViewClient = client;
61fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey    }
6240c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
63258aab42887fa7a6d29fe862eb883c62deafde0cGreg Choi & Mike Grafton    @Implementation
64258aab42887fa7a6d29fe862eb883c62deafde0cGreg Choi & Mike Grafton    public void setWebChromeClient(WebChromeClient client) {
65258aab42887fa7a6d29fe862eb883c62deafde0cGreg Choi & Mike Grafton        webChromeClient = client;
66258aab42887fa7a6d29fe862eb883c62deafde0cGreg Choi & Mike Grafton    }
67258aab42887fa7a6d29fe862eb883c62deafde0cGreg Choi & Mike Grafton
68fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey    public WebViewClient getWebViewClient() {
6940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        return webViewClient;
70fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey    }
7140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
72fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey    @Implementation
73fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey    public void addJavascriptInterface(Object obj, String interfaceName) {
7440c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        javascriptInterfaces.put(interfaceName, obj);
75fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey    }
7640c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
77fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey    public Object getJavascriptInterface(String interfaceName) {
7840c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        return javascriptInterfaces.get(interfaceName);
7940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams    }
803892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz
8137c667d06608e4bebd0f45ffbf1555ce5bd30493Zoodles    @Implementation
829677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    public void clearCache(boolean includeDiskFiles) {
833892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz        clearCacheCalled = true;
843892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz        clearCacheIncludeDiskFiles = includeDiskFiles;
858455cc9031f98a53ad469ebe4b9d92511af8b54fRich Humphrey    }
863892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz
878455cc9031f98a53ad469ebe4b9d92511af8b54fRich Humphrey    public boolean wasClearCacheCalled() {
883892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz        return clearCacheCalled;
898455cc9031f98a53ad469ebe4b9d92511af8b54fRich Humphrey    }
903892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz
918455cc9031f98a53ad469ebe4b9d92511af8b54fRich Humphrey    public boolean didClearCacheIncludeDiskFiles() {
923892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz        return clearCacheIncludeDiskFiles;
938455cc9031f98a53ad469ebe4b9d92511af8b54fRich Humphrey    }
943892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz
958455cc9031f98a53ad469ebe4b9d92511af8b54fRich Humphrey    @Implementation
969677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    public void clearFormData() {
973892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz        clearFormDataCalled = true;
989677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    }
993892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz
1009677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    public boolean wasClearFormDataCalled() {
1013892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz        return clearFormDataCalled;
1029677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    }
1033892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz
1049677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    @Implementation
1059677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    public void clearHistory() {
1063892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz        clearHistoryCalled = true;
1079677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    }
1083892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz
1099677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    public boolean wasClearHistoryCalled() {
1103892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz        return clearHistoryCalled;
1119677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    }
1123892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz
1139677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    @Implementation
1149677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    public void clearView() {
1153892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz        clearViewCalled = true;
1169677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    }
1173892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz
1189677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    public boolean wasClearViewCalled() {
1193892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz        return clearViewCalled;
1203892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz    }
1213892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz
1229677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    @Implementation
1239677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    public void destroy() {
1243892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz        destroyCalled = true;
1259677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    }
1263892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz
1279677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey    public boolean wasDestroyCalled() {
1283892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz        return destroyCalled;
1293892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz    }
1303892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz
1313892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz    @Implementation
13237c667d06608e4bebd0f45ffbf1555ce5bd30493Zoodles    public void post(Runnable action) {
1333892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz        action.run();
1343892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz        runFlag = true;
13537c667d06608e4bebd0f45ffbf1555ce5bd30493Zoodles    }
1363892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz
13737c667d06608e4bebd0f45ffbf1555ce5bd30493Zoodles    public boolean getRunFlag() {
1383892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz        return runFlag;
13937c667d06608e4bebd0f45ffbf1555ce5bd30493Zoodles    }
140258aab42887fa7a6d29fe862eb883c62deafde0cGreg Choi & Mike Grafton
1413892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz
1423892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz    /**
1433892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz     * Non-Android accessor.
1443892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz     *
1453892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz     * @return webChromeClient
1463892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz     */
147258aab42887fa7a6d29fe862eb883c62deafde0cGreg Choi & Mike Grafton    public WebChromeClient getWebChromeClient() {
148258aab42887fa7a6d29fe862eb883c62deafde0cGreg Choi & Mike Grafton        return webChromeClient;
149258aab42887fa7a6d29fe862eb883c62deafde0cGreg Choi & Mike Grafton    }
1503892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz
1513892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz    @Implementation
1523892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz    public boolean canGoBack() {
1533892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz        return canGoBack;
1543892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz    }
1553892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz
1563892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz    @Implementation
1573892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz    public void goBack() {
1583892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz        goBackInvocations++;
1593892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz    }
1603892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz
1613892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz
1623892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz    /**
1633892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz     * Non-Android accessor.
1643892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz     *
1653892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz     * @return goBackInvocations the number of times {@code android.webkit.WebView#goBack()}
1663892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz     * was invoked
1673892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz     */
1683892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz    public int getGoBackInvocations() {
1693892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz        return goBackInvocations;
1703892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz    }
1713892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz
1723892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz    /**
1733892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz     * Non-Android setter.
1743892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz     *
1753892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz     * Sets the value to return from {@code android.webkit.WebView#canGoBack()}
1763892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz     *
1773892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz     * @param canGoBack
1783892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz     */
1793892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz    public void setCanGoBack(boolean canGoBack) {
1803892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz        this.canGoBack = canGoBack;
1813892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz    }
1829ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultz}
183