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 5 package org.chromium.content.browser.framehost; 6 7 import android.graphics.Bitmap; 8 9 import org.chromium.base.CalledByNative; 10 import org.chromium.base.JNINamespace; 11 import org.chromium.base.VisibleForTesting; 12 import org.chromium.content_public.browser.LoadUrlParams; 13 import org.chromium.content_public.browser.NavigationController; 14 import org.chromium.content_public.browser.NavigationEntry; 15 import 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 NavigationControllerImpl(long nativeNavigationControllerAndroid)28 private NavigationControllerImpl(long nativeNavigationControllerAndroid) { 29 mNativeNavigationControllerAndroid = nativeNavigationControllerAndroid; 30 } 31 32 @CalledByNative create(long nativeNavigationControllerAndroid)33 private static NavigationControllerImpl create(long nativeNavigationControllerAndroid) { 34 return new NavigationControllerImpl(nativeNavigationControllerAndroid); 35 } 36 37 @CalledByNative destroy()38 private void destroy() { 39 mNativeNavigationControllerAndroid = 0; 40 } 41 42 @Override canGoBack()43 public boolean canGoBack() { 44 return mNativeNavigationControllerAndroid != 0 45 && nativeCanGoBack(mNativeNavigationControllerAndroid); 46 } 47 48 @Override canGoForward()49 public boolean canGoForward() { 50 return mNativeNavigationControllerAndroid != 0 51 && nativeCanGoForward(mNativeNavigationControllerAndroid); 52 } 53 54 @Override 55 @VisibleForTesting canGoToOffset(int offset)56 public boolean canGoToOffset(int offset) { 57 return mNativeNavigationControllerAndroid != 0 58 && nativeCanGoToOffset(mNativeNavigationControllerAndroid, offset); 59 } 60 61 @Override goToOffset(int offset)62 public void goToOffset(int offset) { 63 if (mNativeNavigationControllerAndroid != 0) { 64 nativeGoToOffset(mNativeNavigationControllerAndroid, offset); 65 } 66 } 67 68 @Override goToNavigationIndex(int index)69 public void goToNavigationIndex(int index) { 70 if (mNativeNavigationControllerAndroid != 0) { 71 nativeGoToNavigationIndex(mNativeNavigationControllerAndroid, index); 72 } 73 } 74 75 @Override goBack()76 public void goBack() { 77 if (mNativeNavigationControllerAndroid != 0) { 78 nativeGoBack(mNativeNavigationControllerAndroid); 79 } 80 } 81 82 @Override goForward()83 public void goForward() { 84 if (mNativeNavigationControllerAndroid != 0) { 85 nativeGoForward(mNativeNavigationControllerAndroid); 86 } 87 } 88 89 @Override loadIfNecessary()90 public void loadIfNecessary() { 91 if (mNativeNavigationControllerAndroid != 0) { 92 nativeLoadIfNecessary(mNativeNavigationControllerAndroid); 93 } 94 } 95 96 @Override requestRestoreLoad()97 public void requestRestoreLoad() { 98 if (mNativeNavigationControllerAndroid != 0) { 99 nativeRequestRestoreLoad(mNativeNavigationControllerAndroid); 100 } 101 } 102 103 @Override reload(boolean checkForRepost)104 public void reload(boolean checkForRepost) { 105 if (mNativeNavigationControllerAndroid != 0) { 106 nativeReload(mNativeNavigationControllerAndroid, checkForRepost); 107 } 108 } 109 110 @Override reloadIgnoringCache(boolean checkForRepost)111 public void reloadIgnoringCache(boolean checkForRepost) { 112 if (mNativeNavigationControllerAndroid != 0) { 113 nativeReloadIgnoringCache(mNativeNavigationControllerAndroid, checkForRepost); 114 } 115 } 116 117 @Override cancelPendingReload()118 public void cancelPendingReload() { 119 if (mNativeNavigationControllerAndroid != 0) { 120 nativeCancelPendingReload(mNativeNavigationControllerAndroid); 121 } 122 } 123 124 @Override continuePendingReload()125 public void continuePendingReload() { 126 if (mNativeNavigationControllerAndroid != 0) { 127 nativeContinuePendingReload(mNativeNavigationControllerAndroid); 128 } 129 } 130 131 @Override loadUrl(LoadUrlParams params)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 clearHistory()152 public void clearHistory() { 153 if (mNativeNavigationControllerAndroid != 0) { 154 nativeClearHistory(mNativeNavigationControllerAndroid); 155 } 156 } 157 158 @Override getNavigationHistory()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 getDirectedNavigationHistory(boolean isForward, int itemLimit)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 getOriginalUrlForVisibleNavigationEntry()178 public String getOriginalUrlForVisibleNavigationEntry() { 179 if (mNativeNavigationControllerAndroid == 0) return null; 180 return nativeGetOriginalUrlForVisibleNavigationEntry(mNativeNavigationControllerAndroid); 181 } 182 183 @Override clearSslPreferences()184 public void clearSslPreferences() { 185 if (mNativeNavigationControllerAndroid != 0) { 186 nativeClearSslPreferences(mNativeNavigationControllerAndroid); 187 } 188 } 189 190 @Override getUseDesktopUserAgent()191 public boolean getUseDesktopUserAgent() { 192 if (mNativeNavigationControllerAndroid == 0) return false; 193 return nativeGetUseDesktopUserAgent(mNativeNavigationControllerAndroid); 194 } 195 196 @Override setUseDesktopUserAgent(boolean override, boolean reloadOnChange)197 public void setUseDesktopUserAgent(boolean override, boolean reloadOnChange) { 198 if (mNativeNavigationControllerAndroid != 0) { 199 nativeSetUseDesktopUserAgent(mNativeNavigationControllerAndroid, 200 override, reloadOnChange); 201 } 202 } 203 204 @Override getPendingEntry()205 public NavigationEntry getPendingEntry() { 206 if (mNativeNavigationControllerAndroid != 0) { 207 return nativeGetPendingEntry(mNativeNavigationControllerAndroid); 208 } 209 210 return null; 211 } 212 213 @CalledByNative addToNavigationHistory(Object history, Object navigationEntry)214 private static void addToNavigationHistory(Object history, Object navigationEntry) { 215 ((NavigationHistory) history).addEntry((NavigationEntry) navigationEntry); 216 } 217 218 @CalledByNative createNavigationEntry(int index, String url, String virtualUrl, String originalUrl, String title, Bitmap favicon)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 nativeCanGoBack(long nativeNavigationControllerAndroid)224 private native boolean nativeCanGoBack(long nativeNavigationControllerAndroid); nativeCanGoForward(long nativeNavigationControllerAndroid)225 private native boolean nativeCanGoForward(long nativeNavigationControllerAndroid); nativeLoadIfNecessary(long nativeNavigationControllerAndroid)226 private native void nativeLoadIfNecessary(long nativeNavigationControllerAndroid); nativeRequestRestoreLoad(long nativeNavigationControllerAndroid)227 private native void nativeRequestRestoreLoad(long nativeNavigationControllerAndroid); nativeCanGoToOffset( long nativeNavigationControllerAndroid, int offset)228 private native boolean nativeCanGoToOffset( 229 long nativeNavigationControllerAndroid, int offset); nativeGoBack(long nativeNavigationControllerAndroid)230 private native void nativeGoBack(long nativeNavigationControllerAndroid); nativeGoForward(long nativeNavigationControllerAndroid)231 private native void nativeGoForward(long nativeNavigationControllerAndroid); nativeGoToOffset(long nativeNavigationControllerAndroid, int offset)232 private native void nativeGoToOffset(long nativeNavigationControllerAndroid, int offset); nativeGoToNavigationIndex( long nativeNavigationControllerAndroid, int index)233 private native void nativeGoToNavigationIndex( 234 long nativeNavigationControllerAndroid, int index); nativeCancelPendingReload(long nativeNavigationControllerAndroid)235 private native void nativeCancelPendingReload(long nativeNavigationControllerAndroid); nativeContinuePendingReload(long nativeNavigationControllerAndroid)236 private native void nativeContinuePendingReload(long nativeNavigationControllerAndroid); nativeReload(long nativeNavigationControllerAndroid, boolean checkForRepost)237 private native void nativeReload(long nativeNavigationControllerAndroid, 238 boolean checkForRepost); nativeReloadIgnoringCache(long nativeNavigationControllerAndroid, boolean checkForRepost)239 private native void nativeReloadIgnoringCache(long nativeNavigationControllerAndroid, 240 boolean checkForRepost); nativeLoadUrl( long nativeNavigationControllerAndroid, String url, int loadUrlType, int transitionType, String referrerUrl, int referrerPolicy, int uaOverrideOption, String extraHeaders, byte[] postData, String baseUrlForDataUrl, String virtualUrlForDataUrl, boolean canLoadLocalResources, boolean isRendererInitiated)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); nativeClearHistory(long nativeNavigationControllerAndroid)255 private native void nativeClearHistory(long nativeNavigationControllerAndroid); nativeGetNavigationHistory(long nativeNavigationControllerAndroid, Object history)256 private native int nativeGetNavigationHistory(long nativeNavigationControllerAndroid, 257 Object history); nativeGetDirectedNavigationHistory(long nativeNavigationControllerAndroid, NavigationHistory history, boolean isForward, int itemLimit)258 private native void nativeGetDirectedNavigationHistory(long nativeNavigationControllerAndroid, 259 NavigationHistory history, boolean isForward, int itemLimit); nativeGetOriginalUrlForVisibleNavigationEntry( long nativeNavigationControllerAndroid)260 private native String nativeGetOriginalUrlForVisibleNavigationEntry( 261 long nativeNavigationControllerAndroid); nativeClearSslPreferences(long nativeNavigationControllerAndroid)262 private native void nativeClearSslPreferences(long nativeNavigationControllerAndroid); nativeGetUseDesktopUserAgent(long nativeNavigationControllerAndroid)263 private native boolean nativeGetUseDesktopUserAgent(long nativeNavigationControllerAndroid); nativeSetUseDesktopUserAgent(long nativeNavigationControllerAndroid, boolean override, boolean reloadOnChange)264 private native void nativeSetUseDesktopUserAgent(long nativeNavigationControllerAndroid, 265 boolean override, boolean reloadOnChange); nativeGetPendingEntry(long nativeNavigationControllerAndroid)266 private native NavigationEntry nativeGetPendingEntry(long nativeNavigationControllerAndroid); 267 } 268