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.webcontents; 6 7 import org.chromium.base.CalledByNative; 8 import org.chromium.base.JNINamespace; 9 import org.chromium.content_public.browser.JavaScriptCallback; 10 import org.chromium.content_public.browser.NavigationController; 11 import org.chromium.content_public.browser.NavigationTransitionDelegate; 12 import org.chromium.content_public.browser.WebContents; 13 14 /** 15 * The WebContentsImpl Java wrapper to allow communicating with the native WebContentsImpl 16 * object. 17 */ 18 @JNINamespace("content") 19 //TODO(tedchoc): Remove the package restriction once this class moves to a non-public content 20 // package whose visibility will be enforced via DEPS. 21 /* package */ class WebContentsImpl implements WebContents { 22 23 private long mNativeWebContentsAndroid; 24 private NavigationController mNavigationController; 25 26 private NavigationTransitionDelegate mNavigationTransitionDelegate = null; 27 WebContentsImpl( long nativeWebContentsAndroid, NavigationController navigationController)28 private WebContentsImpl( 29 long nativeWebContentsAndroid, NavigationController navigationController) { 30 mNativeWebContentsAndroid = nativeWebContentsAndroid; 31 mNavigationController = navigationController; 32 } 33 34 @CalledByNative create( long nativeWebContentsAndroid, NavigationController navigationController)35 private static WebContentsImpl create( 36 long nativeWebContentsAndroid, NavigationController navigationController) { 37 return new WebContentsImpl(nativeWebContentsAndroid, navigationController); 38 } 39 40 @CalledByNative destroy()41 private void destroy() { 42 mNativeWebContentsAndroid = 0; 43 mNavigationController = null; 44 } 45 46 @CalledByNative getNativePointer()47 private long getNativePointer() { 48 return mNativeWebContentsAndroid; 49 } 50 51 @Override getNavigationController()52 public NavigationController getNavigationController() { 53 return mNavigationController; 54 } 55 56 @Override getTitle()57 public String getTitle() { 58 return nativeGetTitle(mNativeWebContentsAndroid); 59 } 60 61 @Override getVisibleUrl()62 public String getVisibleUrl() { 63 return nativeGetVisibleURL(mNativeWebContentsAndroid); 64 } 65 66 @Override stop()67 public void stop() { 68 nativeStop(mNativeWebContentsAndroid); 69 } 70 71 @Override insertCSS(String css)72 public void insertCSS(String css) { 73 if (mNativeWebContentsAndroid == 0) return; 74 nativeInsertCSS(mNativeWebContentsAndroid, css); 75 } 76 77 @Override onHide()78 public void onHide() { 79 nativeOnHide(mNativeWebContentsAndroid); 80 } 81 82 @Override onShow()83 public void onShow() { 84 nativeOnShow(mNativeWebContentsAndroid); 85 } 86 87 @Override releaseMediaPlayers()88 public void releaseMediaPlayers() { 89 nativeReleaseMediaPlayers(mNativeWebContentsAndroid); 90 } 91 92 @Override getBackgroundColor()93 public int getBackgroundColor() { 94 return nativeGetBackgroundColor(mNativeWebContentsAndroid); 95 } 96 97 @Override addStyleSheetByURL(String url)98 public void addStyleSheetByURL(String url) { 99 nativeAddStyleSheetByURL(mNativeWebContentsAndroid, url); 100 } 101 102 @Override showInterstitialPage( String url, long interstitialPageDelegateAndroid)103 public void showInterstitialPage( 104 String url, long interstitialPageDelegateAndroid) { 105 nativeShowInterstitialPage(mNativeWebContentsAndroid, url, interstitialPageDelegateAndroid); 106 } 107 108 @Override isShowingInterstitialPage()109 public boolean isShowingInterstitialPage() { 110 return nativeIsShowingInterstitialPage(mNativeWebContentsAndroid); 111 } 112 113 @Override isReady()114 public boolean isReady() { 115 return nativeIsRenderWidgetHostViewReady(mNativeWebContentsAndroid); 116 } 117 118 @Override exitFullscreen()119 public void exitFullscreen() { 120 nativeExitFullscreen(mNativeWebContentsAndroid); 121 } 122 123 @Override updateTopControlsState(boolean enableHiding, boolean enableShowing, boolean animate)124 public void updateTopControlsState(boolean enableHiding, boolean enableShowing, 125 boolean animate) { 126 nativeUpdateTopControlsState(mNativeWebContentsAndroid, enableHiding, 127 enableShowing, animate); 128 } 129 130 @Override showImeIfNeeded()131 public void showImeIfNeeded() { 132 nativeShowImeIfNeeded(mNativeWebContentsAndroid); 133 } 134 135 @Override scrollFocusedEditableNodeIntoView()136 public void scrollFocusedEditableNodeIntoView() { 137 // The native side keeps track of whether the zoom and scroll actually occurred. It is 138 // more efficient to do it this way and sometimes fire an unnecessary message rather 139 // than synchronize with the renderer and always have an additional message. 140 nativeScrollFocusedEditableNodeIntoView(mNativeWebContentsAndroid); 141 } 142 143 @Override selectWordAroundCaret()144 public void selectWordAroundCaret() { 145 nativeSelectWordAroundCaret(mNativeWebContentsAndroid); 146 } 147 148 @Override getUrl()149 public String getUrl() { 150 return nativeGetURL(mNativeWebContentsAndroid); 151 } 152 153 @Override isIncognito()154 public boolean isIncognito() { 155 return nativeIsIncognito(mNativeWebContentsAndroid); 156 } 157 158 @Override resumeResponseDeferredAtStart()159 public void resumeResponseDeferredAtStart() { 160 nativeResumeResponseDeferredAtStart(mNativeWebContentsAndroid); 161 } 162 163 @Override setHasPendingNavigationTransitionForTesting()164 public void setHasPendingNavigationTransitionForTesting() { 165 nativeSetHasPendingNavigationTransitionForTesting(mNativeWebContentsAndroid); 166 } 167 168 @Override setNavigationTransitionDelegate(NavigationTransitionDelegate delegate)169 public void setNavigationTransitionDelegate(NavigationTransitionDelegate delegate) { 170 mNavigationTransitionDelegate = delegate; 171 } 172 173 /** 174 * Inserts the provided markup sandboxed into the frame. 175 */ 176 @Override setupTransitionView(String markup)177 public void setupTransitionView(String markup) { 178 nativeSetupTransitionView(mNativeWebContentsAndroid, markup); 179 } 180 181 /** 182 * Hides transition elements specified by the selector, and activates any 183 * exiting-transition stylesheets. 184 */ 185 @Override beginExitTransition(String cssSelector)186 public void beginExitTransition(String cssSelector) { 187 nativeBeginExitTransition(mNativeWebContentsAndroid, cssSelector); 188 } 189 190 @CalledByNative didDeferAfterResponseStarted(String markup, String cssSelector, String enteringColor)191 private void didDeferAfterResponseStarted(String markup, String cssSelector, 192 String enteringColor) { 193 if (mNavigationTransitionDelegate != null) { 194 mNavigationTransitionDelegate.didDeferAfterResponseStarted(markup, 195 cssSelector, enteringColor); 196 } 197 } 198 199 @CalledByNative willHandleDeferAfterResponseStarted()200 private boolean willHandleDeferAfterResponseStarted() { 201 if (mNavigationTransitionDelegate == null) return false; 202 return mNavigationTransitionDelegate.willHandleDeferAfterResponseStarted(); 203 } 204 205 @CalledByNative addEnteringStylesheetToTransition(String stylesheet)206 private void addEnteringStylesheetToTransition(String stylesheet) { 207 if (mNavigationTransitionDelegate != null) { 208 mNavigationTransitionDelegate.addEnteringStylesheetToTransition(stylesheet); 209 } 210 } 211 212 @CalledByNative didStartNavigationTransitionForFrame(long frameId)213 private void didStartNavigationTransitionForFrame(long frameId) { 214 if (mNavigationTransitionDelegate != null) { 215 mNavigationTransitionDelegate.didStartNavigationTransitionForFrame(frameId); 216 } 217 } 218 219 @Override evaluateJavaScript(String script, JavaScriptCallback callback)220 public void evaluateJavaScript(String script, JavaScriptCallback callback) { 221 nativeEvaluateJavaScript(mNativeWebContentsAndroid, script, callback); 222 } 223 224 @CalledByNative onEvaluateJavaScriptResult( String jsonResult, JavaScriptCallback callback)225 private static void onEvaluateJavaScriptResult( 226 String jsonResult, JavaScriptCallback callback) { 227 callback.handleJavaScriptResult(jsonResult); 228 } 229 nativeGetTitle(long nativeWebContentsAndroid)230 private native String nativeGetTitle(long nativeWebContentsAndroid); nativeGetVisibleURL(long nativeWebContentsAndroid)231 private native String nativeGetVisibleURL(long nativeWebContentsAndroid); nativeStop(long nativeWebContentsAndroid)232 private native void nativeStop(long nativeWebContentsAndroid); nativeInsertCSS(long nativeWebContentsAndroid, String css)233 private native void nativeInsertCSS(long nativeWebContentsAndroid, String css); nativeOnHide(long nativeWebContentsAndroid)234 private native void nativeOnHide(long nativeWebContentsAndroid); nativeOnShow(long nativeWebContentsAndroid)235 private native void nativeOnShow(long nativeWebContentsAndroid); nativeReleaseMediaPlayers(long nativeWebContentsAndroid)236 private native void nativeReleaseMediaPlayers(long nativeWebContentsAndroid); nativeGetBackgroundColor(long nativeWebContentsAndroid)237 private native int nativeGetBackgroundColor(long nativeWebContentsAndroid); nativeAddStyleSheetByURL(long nativeWebContentsAndroid, String url)238 private native void nativeAddStyleSheetByURL(long nativeWebContentsAndroid, 239 String url); nativeShowInterstitialPage(long nativeWebContentsAndroid, String url, long nativeInterstitialPageDelegateAndroid)240 private native void nativeShowInterstitialPage(long nativeWebContentsAndroid, 241 String url, long nativeInterstitialPageDelegateAndroid); nativeIsShowingInterstitialPage(long nativeWebContentsAndroid)242 private native boolean nativeIsShowingInterstitialPage(long nativeWebContentsAndroid); nativeIsRenderWidgetHostViewReady(long nativeWebContentsAndroid)243 private native boolean nativeIsRenderWidgetHostViewReady(long nativeWebContentsAndroid); nativeExitFullscreen(long nativeWebContentsAndroid)244 private native void nativeExitFullscreen(long nativeWebContentsAndroid); nativeUpdateTopControlsState(long nativeWebContentsAndroid, boolean enableHiding, boolean enableShowing, boolean animate)245 private native void nativeUpdateTopControlsState(long nativeWebContentsAndroid, 246 boolean enableHiding, boolean enableShowing, boolean animate); nativeShowImeIfNeeded(long nativeWebContentsAndroid)247 private native void nativeShowImeIfNeeded(long nativeWebContentsAndroid); nativeScrollFocusedEditableNodeIntoView(long nativeWebContentsAndroid)248 private native void nativeScrollFocusedEditableNodeIntoView(long nativeWebContentsAndroid); nativeSelectWordAroundCaret(long nativeWebContentsAndroid)249 private native void nativeSelectWordAroundCaret(long nativeWebContentsAndroid); nativeGetURL(long nativeWebContentsAndroid)250 private native String nativeGetURL(long nativeWebContentsAndroid); nativeIsIncognito(long nativeWebContentsAndroid)251 private native boolean nativeIsIncognito(long nativeWebContentsAndroid); nativeResumeResponseDeferredAtStart(long nativeWebContentsAndroid)252 private native void nativeResumeResponseDeferredAtStart(long nativeWebContentsAndroid); nativeSetHasPendingNavigationTransitionForTesting( long nativeWebContentsAndroid)253 private native void nativeSetHasPendingNavigationTransitionForTesting( 254 long nativeWebContentsAndroid); nativeSetupTransitionView(long nativeWebContentsAndroid, String markup)255 private native void nativeSetupTransitionView(long nativeWebContentsAndroid, 256 String markup); nativeBeginExitTransition(long nativeWebContentsAndroid, String cssSelector)257 private native void nativeBeginExitTransition(long nativeWebContentsAndroid, 258 String cssSelector); nativeEvaluateJavaScript(long nativeWebContentsAndroid, String script, JavaScriptCallback callback)259 private native void nativeEvaluateJavaScript(long nativeWebContentsAndroid, 260 String script, JavaScriptCallback callback); 261 } 262