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.
5 package org.chromium.content.browser.webcontents;
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;
15 * The WebContentsImpl Java wrapper to allow communicating with the native WebContentsImpl
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 {
23 private long mNativeWebContentsAndroid;
24 private NavigationController mNavigationController;
26 private NavigationTransitionDelegate mNavigationTransitionDelegate = null;
28 private WebContentsImpl(
29 long nativeWebContentsAndroid, NavigationController navigationController) {
30 mNativeWebContentsAndroid = nativeWebContentsAndroid;
31 mNavigationController = navigationController;
35 private static WebContentsImpl create(
36 long nativeWebContentsAndroid, NavigationController navigationController) {
37 return new WebContentsImpl(nativeWebContentsAndroid, navigationController);
41 private void destroy() {
42 mNativeWebContentsAndroid = 0;
43 mNavigationController = null;
47 private long getNativePointer() {
48 return mNativeWebContentsAndroid;
52 public NavigationController getNavigationController() {
53 return mNavigationController;
57 public String getTitle() {
58 return nativeGetTitle(mNativeWebContentsAndroid);
62 public String getVisibleUrl() {
63 return nativeGetVisibleURL(mNativeWebContentsAndroid);
68 nativeStop(mNativeWebContentsAndroid);
72 public void insertCSS(String css) {
73 if (mNativeWebContentsAndroid == 0) return;
74 nativeInsertCSS(mNativeWebContentsAndroid, css);
78 public void onHide() {
79 nativeOnHide(mNativeWebContentsAndroid);
83 public void onShow() {
84 nativeOnShow(mNativeWebContentsAndroid);
88 public void releaseMediaPlayers() {
89 nativeReleaseMediaPlayers(mNativeWebContentsAndroid);
93 public int getBackgroundColor() {
94 return nativeGetBackgroundColor(mNativeWebContentsAndroid);
98 public void addStyleSheetByURL(String url) {
99 nativeAddStyleSheetByURL(mNativeWebContentsAndroid, url);
103 public void showInterstitialPage(
104 String url, long interstitialPageDelegateAndroid) {
105 nativeShowInterstitialPage(mNativeWebContentsAndroid, url, interstitialPageDelegateAndroid);
109 public boolean isShowingInterstitialPage() {
110 return nativeIsShowingInterstitialPage(mNativeWebContentsAndroid);
114 public boolean isReady() {
115 return nativeIsRenderWidgetHostViewReady(mNativeWebContentsAndroid);
119 public void exitFullscreen() {
120 nativeExitFullscreen(mNativeWebContentsAndroid);
124 public void updateTopControlsState(boolean enableHiding, boolean enableShowing,
126 nativeUpdateTopControlsState(mNativeWebContentsAndroid, enableHiding,
127 enableShowing, animate);
131 public void showImeIfNeeded() {
132 nativeShowImeIfNeeded(mNativeWebContentsAndroid);
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);
144 public void selectWordAroundCaret() {
145 nativeSelectWordAroundCaret(mNativeWebContentsAndroid);
149 public String getUrl() {
150 return nativeGetURL(mNativeWebContentsAndroid);
154 public boolean isIncognito() {
155 return nativeIsIncognito(mNativeWebContentsAndroid);
159 public void resumeResponseDeferredAtStart() {
160 nativeResumeResponseDeferredAtStart(mNativeWebContentsAndroid);
164 public void setHasPendingNavigationTransitionForTesting() {
165 nativeSetHasPendingNavigationTransitionForTesting(mNativeWebContentsAndroid);
169 public void setNavigationTransitionDelegate(NavigationTransitionDelegate delegate) {
170 mNavigationTransitionDelegate = delegate;
174 * Inserts the provided markup sandboxed into the frame.
177 public void setupTransitionView(String markup) {
178 nativeSetupTransitionView(mNativeWebContentsAndroid, markup);
182 * Hides transition elements specified by the selector, and activates any
183 * exiting-transition stylesheets.
186 public void beginExitTransition(String cssSelector) {
187 nativeBeginExitTransition(mNativeWebContentsAndroid, cssSelector);
191 private void didDeferAfterResponseStarted(String markup, String cssSelector,
192 String enteringColor) {
193 if (mNavigationTransitionDelegate != null ) {
194 mNavigationTransitionDelegate.didDeferAfterResponseStarted(markup,
195 cssSelector, enteringColor);
200 private boolean willHandleDeferAfterResponseStarted() {
201 if (mNavigationTransitionDelegate == null) return false;
202 return mNavigationTransitionDelegate.willHandleDeferAfterResponseStarted();
206 private void addEnteringStylesheetToTransition(String stylesheet) {
207 if (mNavigationTransitionDelegate != null ) {
208 mNavigationTransitionDelegate.addEnteringStylesheetToTransition(stylesheet);
213 private void didStartNavigationTransitionForFrame(long frameId) {
214 if (mNavigationTransitionDelegate != null ) {
215 mNavigationTransitionDelegate.didStartNavigationTransitionForFrame(frameId);
220 public void evaluateJavaScript(String script, JavaScriptCallback callback,
221 boolean startRenderer) {
222 nativeEvaluateJavaScript(mNativeWebContentsAndroid, script, callback, true);
226 private static void onEvaluateJavaScriptResult(
227 String jsonResult, JavaScriptCallback callback) {
228 callback.handleJavaScriptResult(jsonResult);
231 private native String nativeGetTitle(long nativeWebContentsAndroid);
232 private native String nativeGetVisibleURL(long nativeWebContentsAndroid);
233 private native void nativeStop(long nativeWebContentsAndroid);
234 private native void nativeInsertCSS(long nativeWebContentsAndroid, String css);
235 private native void nativeOnHide(long nativeWebContentsAndroid);
236 private native void nativeOnShow(long nativeWebContentsAndroid);
237 private native void nativeReleaseMediaPlayers(long nativeWebContentsAndroid);
238 private native int nativeGetBackgroundColor(long nativeWebContentsAndroid);
239 private native void nativeAddStyleSheetByURL(long nativeWebContentsAndroid,
241 private native void nativeShowInterstitialPage(long nativeWebContentsAndroid,
242 String url, long nativeInterstitialPageDelegateAndroid);
243 private native boolean nativeIsShowingInterstitialPage(long nativeWebContentsAndroid);
244 private native boolean nativeIsRenderWidgetHostViewReady(long nativeWebContentsAndroid);
245 private native void nativeExitFullscreen(long nativeWebContentsAndroid);
246 private native void nativeUpdateTopControlsState(long nativeWebContentsAndroid,
247 boolean enableHiding, boolean enableShowing, boolean animate);
248 private native void nativeShowImeIfNeeded(long nativeWebContentsAndroid);
249 private native void nativeScrollFocusedEditableNodeIntoView(long nativeWebContentsAndroid);
250 private native void nativeSelectWordAroundCaret(long nativeWebContentsAndroid);
251 private native String nativeGetURL(long nativeWebContentsAndroid);
252 private native boolean nativeIsIncognito(long nativeWebContentsAndroid);
253 private native void nativeResumeResponseDeferredAtStart(long nativeWebContentsAndroid);
254 private native void nativeSetHasPendingNavigationTransitionForTesting(
255 long nativeWebContentsAndroid);
256 private native void nativeSetupTransitionView(long nativeWebContentsAndroid,
258 private native void nativeBeginExitTransition(long nativeWebContentsAndroid,
260 private native void nativeEvaluateJavaScript(long nativeWebContentsAndroid,
261 String script, JavaScriptCallback callback, boolean startRenderer);