1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Copyright (c) 2013 Intel Corporation. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
6 package org.xwalk.core.internal;
8 import android.content.pm.ActivityInfo;
9 import android.graphics.Bitmap;
10 import android.graphics.Picture;
11 import android.graphics.Rect;
12 import android.graphics.RectF;
13 import android.net.http.SslError;
14 import android.os.Handler;
15 import android.os.Looper;
16 import android.os.Message;
17 import android.util.Log;
18 import android.view.KeyEvent;
19 import android.view.View;
20 import android.webkit.ConsoleMessage;
21 import android.webkit.ValueCallback;
22 import android.webkit.WebResourceResponse;
24 import org.chromium.content.browser.ContentViewClient;
25 import org.chromium.content.browser.ContentViewCore;
26 import org.chromium.content.browser.WebContentsObserverAndroid;
27 import org.chromium.net.NetError;
30 * Base-class that a XWalkViewContents embedder derives from to receive callbacks.
31 * This extends ContentViewClient, as in many cases we want to pass-thru ContentViewCore
32 * callbacks right to our embedder, and this setup facilities that.
33 * For any other callbacks we need to make transformations of (e.g. adapt parameters
34 * or perform filtering) we can provide final overrides for methods here, and then introduce
35 * new abstract methods that the our own client must implement.
36 * i.e.: all methods in this class should either be final, or abstract.
38 abstract class XWalkContentsClient extends ContentViewClient {
40 private static final String TAG = "XWalkContentsClient";
41 private final XWalkContentsClientCallbackHelper mCallbackHelper =
42 new XWalkContentsClientCallbackHelper(this);
44 private XWalkWebContentsObserver mWebContentsObserver;
46 private double mDIPScale;
48 public class XWalkWebContentsObserver extends WebContentsObserverAndroid {
49 public XWalkWebContentsObserver(ContentViewCore contentViewCore) {
50 super(contentViewCore);
54 public void didStopLoading(String url) {
59 public void didFailLoad(boolean isProvisionalLoad,
60 boolean isMainFrame, int errorCode, String description, String failingUrl) {
61 if (errorCode == NetError.ERR_ABORTED || !isMainFrame) {
62 // This error code is generated for the following reasons:
63 // - XWalkViewInternal.stopLoading is called,
64 // - the navigation is intercepted by the embedder via shouldOverrideNavigation.
66 // The XWalkViewInternal does not notify the embedder of these situations using this
67 // error code with the XWalkClient.onReceivedError callback. What's more,
68 // the XWalkViewInternal does not notify the embedder of sub-frame failures.
71 onReceivedError(ErrorCodeConversionHelper.convertErrorCode(errorCode),
72 description, failingUrl);
76 public void didNavigateAnyFrame(String url, String baseUrl, boolean isReload) {
77 doUpdateVisitedHistory(url, isReload);
81 public void didFinishLoad(long frameId, String validatedUrl, boolean isMainFrame) {
82 // Both didStopLoading and didFinishLoad will be called once a page is finished
83 // to load, but didStopLoading will also be called when user clicks "X" button
84 // on browser UI to stop loading page.
86 // So it is safe for Crosswalk to rely on didStopLoading to ensure onPageFinished
92 final public void onUpdateTitle(String title) {
93 onTitleChanged(title);
97 public boolean shouldOverrideKeyEvent(KeyEvent event) {
98 return super.shouldOverrideKeyEvent(event);
101 void installWebContentsObserver(ContentViewCore contentViewCore) {
102 if (mWebContentsObserver != null) {
103 mWebContentsObserver.detachFromWebContents();
105 mWebContentsObserver = new XWalkWebContentsObserver(contentViewCore);
108 void setDIPScale(double dipScale) {
109 mDIPScale = dipScale;
112 final XWalkContentsClientCallbackHelper getCallbackHelper() {
113 return mCallbackHelper;
116 //--------------------------------------------------------------------------------------------
117 // XWalkViewInternal specific methods that map directly to XWalkViewClient / XWalkWebChromeClient
118 //--------------------------------------------------------------------------------------------
120 public abstract void getVisitedHistory(ValueCallback<String[]> callback);
122 public abstract void doUpdateVisitedHistory(String url, boolean isReload);
124 public abstract void onProgressChanged(int progress);
126 public abstract WebResourceResponse shouldInterceptRequest(String url);
128 public abstract void onResourceLoadStarted(String url);
130 public abstract void onResourceLoadFinished(String url);
132 public abstract void onLoadResource(String url);
134 public abstract boolean shouldOverrideUrlLoading(String url);
136 public abstract void onUnhandledKeyEvent(KeyEvent event);
138 public abstract boolean onConsoleMessage(ConsoleMessage consoleMessage);
140 public abstract void onReceivedHttpAuthRequest(XWalkHttpAuthHandler handler,
141 String host, String realm);
143 public abstract void onReceivedSslError(ValueCallback<Boolean> callback, SslError error);
145 public abstract void onReceivedLoginRequest(String realm, String account, String args);
147 public abstract void onFormResubmission(Message dontResend, Message resend);
149 public abstract void onDownloadStart(String url, String userAgent, String contentDisposition,
150 String mimeType, long contentLength);
152 public abstract void onGeolocationPermissionsShowPrompt(String origin,
153 XWalkGeolocationPermissions.Callback callback);
155 public abstract void onGeolocationPermissionsHidePrompt();
157 public final void onScaleChanged(float oldScale, float newScale) {
158 onScaleChangedScaled((float)(oldScale * mDIPScale), (float)(newScale * mDIPScale));
161 public abstract void onScaleChangedScaled(float oldScale, float newScale);
163 protected abstract boolean onCreateWindow(boolean isDialog, boolean isUserGesture);
165 protected abstract void onCloseWindow();
167 public abstract void onReceivedTouchIconUrl(String url, boolean precomposed);
169 public abstract void onReceivedIcon(Bitmap bitmap);
171 protected abstract void onRequestFocus();
173 protected abstract View getVideoLoadingProgressView();
175 public abstract void onPageStarted(String url);
177 public abstract void onPageFinished(String url);
179 public abstract void onReceivedError(int errorCode, String description, String failingUrl);
181 public abstract void onRendererUnresponsive();
183 public abstract void onRendererResponsive();
185 public abstract void onTitleChanged(String title);
187 public abstract void onToggleFullscreen(boolean enterFullscreen);
189 public abstract boolean hasEnteredFullscreen();
191 public abstract boolean shouldOverrideRunFileChooser(
192 int processId, int renderId, int mode, String acceptTypes, boolean capture);
194 // TODO (michaelbai): Remove this method once the same method remove from
195 // XWalkContentsClientAdapter.
196 public void onShowCustomView(View view,
197 int requestedOrientation, XWalkWebChromeClient.CustomViewCallback callback) {
200 // TODO (michaelbai): This method should be abstract, having empty body here
201 // makes the merge to the Android easy.
202 public void onShowCustomView(View view, XWalkWebChromeClient.CustomViewCallback callback) {
203 onShowCustomView(view, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED, callback);
206 public abstract void onHideCustomView();
208 public abstract Bitmap getDefaultVideoPoster();
210 public abstract void didFinishLoad(String url);
212 //--------------------------------------------------------------------------------------------
213 // Other XWalkViewInternal-specific methods
214 //--------------------------------------------------------------------------------------------
216 public abstract void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches,
217 boolean isDoneCounting);
220 * Called whenever there is a new content picture available.
221 * @param picture New picture.
223 public abstract void onNewPicture(Picture picture);