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