1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5package org.chromium.content.browser.framehost;
6
7import android.graphics.Bitmap;
8
9import org.chromium.base.CalledByNative;
10import org.chromium.base.JNINamespace;
11import org.chromium.base.VisibleForTesting;
12import org.chromium.content_public.browser.LoadUrlParams;
13import org.chromium.content_public.browser.NavigationController;
14import org.chromium.content_public.browser.NavigationEntry;
15import org.chromium.content_public.browser.NavigationHistory;
16
17/**
18 * The NavigationControllerImpl Java wrapper to allow communicating with the native
19 * NavigationControllerImpl object.
20 */
21@JNINamespace("content")
22// TODO(tedchoc): Remove the package restriction once this class moves to a non-public content
23//                package whose visibility will be enforced via DEPS.
24/* package */ class NavigationControllerImpl implements NavigationController {
25
26    private long mNativeNavigationControllerAndroid;
27
28    private NavigationControllerImpl(long nativeNavigationControllerAndroid) {
29        mNativeNavigationControllerAndroid = nativeNavigationControllerAndroid;
30    }
31
32    @CalledByNative
33    private static NavigationControllerImpl create(long nativeNavigationControllerAndroid) {
34        return new NavigationControllerImpl(nativeNavigationControllerAndroid);
35    }
36
37    @CalledByNative
38    private void destroy() {
39        mNativeNavigationControllerAndroid = 0;
40    }
41
42    @Override
43    public boolean canGoBack() {
44        return mNativeNavigationControllerAndroid != 0
45                && nativeCanGoBack(mNativeNavigationControllerAndroid);
46    }
47
48    @Override
49    public boolean canGoForward() {
50        return mNativeNavigationControllerAndroid != 0
51                && nativeCanGoForward(mNativeNavigationControllerAndroid);
52    }
53
54    @Override
55    @VisibleForTesting
56    public boolean canGoToOffset(int offset) {
57        return mNativeNavigationControllerAndroid != 0
58                && nativeCanGoToOffset(mNativeNavigationControllerAndroid, offset);
59    }
60
61    @Override
62    public void goToOffset(int offset) {
63        if (mNativeNavigationControllerAndroid != 0) {
64            nativeGoToOffset(mNativeNavigationControllerAndroid, offset);
65        }
66    }
67
68    @Override
69    public void goToNavigationIndex(int index) {
70        if (mNativeNavigationControllerAndroid != 0) {
71            nativeGoToNavigationIndex(mNativeNavigationControllerAndroid, index);
72        }
73    }
74
75    @Override
76    public void goBack() {
77        if (mNativeNavigationControllerAndroid != 0) {
78            nativeGoBack(mNativeNavigationControllerAndroid);
79        }
80    }
81
82    @Override
83    public void goForward() {
84        if (mNativeNavigationControllerAndroid != 0) {
85            nativeGoForward(mNativeNavigationControllerAndroid);
86        }
87    }
88
89    @Override
90    public void loadIfNecessary() {
91        if (mNativeNavigationControllerAndroid != 0) {
92            nativeLoadIfNecessary(mNativeNavigationControllerAndroid);
93        }
94    }
95
96    @Override
97    public void requestRestoreLoad() {
98        if (mNativeNavigationControllerAndroid != 0) {
99            nativeRequestRestoreLoad(mNativeNavigationControllerAndroid);
100        }
101    }
102
103    @Override
104    public void reload(boolean checkForRepost) {
105        if (mNativeNavigationControllerAndroid != 0) {
106            nativeReload(mNativeNavigationControllerAndroid, checkForRepost);
107        }
108    }
109
110    @Override
111    public void reloadIgnoringCache(boolean checkForRepost) {
112        if (mNativeNavigationControllerAndroid != 0) {
113            nativeReloadIgnoringCache(mNativeNavigationControllerAndroid, checkForRepost);
114        }
115    }
116
117    @Override
118    public void cancelPendingReload() {
119        if (mNativeNavigationControllerAndroid != 0) {
120            nativeCancelPendingReload(mNativeNavigationControllerAndroid);
121        }
122    }
123
124    @Override
125    public void continuePendingReload() {
126        if (mNativeNavigationControllerAndroid != 0) {
127            nativeContinuePendingReload(mNativeNavigationControllerAndroid);
128        }
129    }
130
131    @Override
132    public void loadUrl(LoadUrlParams params) {
133        if (mNativeNavigationControllerAndroid != 0) {
134            nativeLoadUrl(
135                    mNativeNavigationControllerAndroid,
136                    params.getUrl(),
137                    params.getLoadUrlType(), params.getTransitionType(),
138                    params.getReferrer() != null ? params.getReferrer().getUrl() : null,
139                    params.getReferrer() != null ? params.getReferrer().getPolicy() : 0,
140                    params.getUserAgentOverrideOption(),
141                    params.getExtraHeadersString(),
142                    params.getPostData(),
143                    params.getBaseUrl(),
144                    params.getVirtualUrlForDataUrl(),
145                    params.getCanLoadLocalResources(),
146                    params.getIsRendererInitiated());
147        }
148    }
149
150    @Override
151    @VisibleForTesting
152    public void clearHistory() {
153        if (mNativeNavigationControllerAndroid != 0) {
154            nativeClearHistory(mNativeNavigationControllerAndroid);
155        }
156    }
157
158    @Override
159    public NavigationHistory getNavigationHistory() {
160        if (mNativeNavigationControllerAndroid == 0) return null;
161        NavigationHistory history = new NavigationHistory();
162        int currentIndex = nativeGetNavigationHistory(
163                   mNativeNavigationControllerAndroid, history);
164        history.setCurrentEntryIndex(currentIndex);
165        return history;
166    }
167
168    @Override
169    public NavigationHistory getDirectedNavigationHistory(boolean isForward, int itemLimit) {
170        if (mNativeNavigationControllerAndroid == 0) return null;
171        NavigationHistory history = new NavigationHistory();
172        nativeGetDirectedNavigationHistory(mNativeNavigationControllerAndroid,
173                   history, isForward, itemLimit);
174        return history;
175    }
176
177    @Override
178    public String getOriginalUrlForVisibleNavigationEntry() {
179        if (mNativeNavigationControllerAndroid == 0) return null;
180        return nativeGetOriginalUrlForVisibleNavigationEntry(mNativeNavigationControllerAndroid);
181    }
182
183    @Override
184    public void clearSslPreferences() {
185        if (mNativeNavigationControllerAndroid != 0) {
186            nativeClearSslPreferences(mNativeNavigationControllerAndroid);
187        }
188    }
189
190    @Override
191    public boolean getUseDesktopUserAgent() {
192        if (mNativeNavigationControllerAndroid == 0) return false;
193        return nativeGetUseDesktopUserAgent(mNativeNavigationControllerAndroid);
194    }
195
196    @Override
197    public void setUseDesktopUserAgent(boolean override, boolean reloadOnChange) {
198        if (mNativeNavigationControllerAndroid != 0) {
199            nativeSetUseDesktopUserAgent(mNativeNavigationControllerAndroid,
200                     override, reloadOnChange);
201        }
202    }
203
204    @Override
205    public NavigationEntry getPendingEntry() {
206        if (mNativeNavigationControllerAndroid != 0) {
207            return nativeGetPendingEntry(mNativeNavigationControllerAndroid);
208        }
209
210        return null;
211    }
212
213    @CalledByNative
214    private static void addToNavigationHistory(Object history, Object navigationEntry) {
215        ((NavigationHistory) history).addEntry((NavigationEntry) navigationEntry);
216    }
217
218    @CalledByNative
219    private static NavigationEntry createNavigationEntry(int index, String url,
220            String virtualUrl, String originalUrl, String title, Bitmap favicon) {
221        return new NavigationEntry(index, url, virtualUrl, originalUrl, title, favicon);
222    }
223
224    private native boolean nativeCanGoBack(long nativeNavigationControllerAndroid);
225    private native boolean nativeCanGoForward(long nativeNavigationControllerAndroid);
226    private native void nativeLoadIfNecessary(long nativeNavigationControllerAndroid);
227    private native void nativeRequestRestoreLoad(long nativeNavigationControllerAndroid);
228    private native boolean nativeCanGoToOffset(
229            long nativeNavigationControllerAndroid, int offset);
230    private native void nativeGoBack(long nativeNavigationControllerAndroid);
231    private native void nativeGoForward(long nativeNavigationControllerAndroid);
232    private native void nativeGoToOffset(long nativeNavigationControllerAndroid, int offset);
233    private native void nativeGoToNavigationIndex(
234            long nativeNavigationControllerAndroid, int index);
235    private native void nativeCancelPendingReload(long nativeNavigationControllerAndroid);
236    private native void nativeContinuePendingReload(long nativeNavigationControllerAndroid);
237    private native void nativeReload(long nativeNavigationControllerAndroid,
238            boolean checkForRepost);
239    private native void nativeReloadIgnoringCache(long nativeNavigationControllerAndroid,
240            boolean checkForRepost);
241    private native void nativeLoadUrl(
242            long nativeNavigationControllerAndroid,
243            String url,
244            int loadUrlType,
245            int transitionType,
246            String referrerUrl,
247            int referrerPolicy,
248            int uaOverrideOption,
249            String extraHeaders,
250            byte[] postData,
251            String baseUrlForDataUrl,
252            String virtualUrlForDataUrl,
253            boolean canLoadLocalResources,
254            boolean isRendererInitiated);
255    private native void nativeClearHistory(long nativeNavigationControllerAndroid);
256    private native int nativeGetNavigationHistory(long nativeNavigationControllerAndroid,
257            Object history);
258    private native void nativeGetDirectedNavigationHistory(long nativeNavigationControllerAndroid,
259            NavigationHistory history, boolean isForward, int itemLimit);
260    private native String nativeGetOriginalUrlForVisibleNavigationEntry(
261            long nativeNavigationControllerAndroid);
262    private native void nativeClearSslPreferences(long nativeNavigationControllerAndroid);
263    private native boolean nativeGetUseDesktopUserAgent(long nativeNavigationControllerAndroid);
264    private native void nativeSetUseDesktopUserAgent(long nativeNavigationControllerAndroid,
265            boolean override, boolean reloadOnChange);
266    private native NavigationEntry nativeGetPendingEntry(long nativeNavigationControllerAndroid);
267}
268